Outbound API

Read-only programmatic access to your contacts, lists, drafts, and platform events. OpenAPI 3.1 spec: /api-docs/openapi.json

Authentication

Mint API keys at /admin/api-keys. Pass the secret on every request:

curl https://outbound.ustack.ai/api/v1/me \
  -H "Authorization: Bearer obk_live_<your-secret>"

Rate limits

Pagination

List endpoints return cursor-paginated results:

{
  "data": [ ... ],
  "nextCursor": "eyJpZCI6Ii4uLiIsInQiOiIyMDI2LTA1LTIzVDEwOjAwOjAwLjAwMFoifQ"
}

Pass ?cursor=<value> on the next call to fetch the next page. Default page size is 50; max is 200 (override with ?limit=).

Errors

Error responses use RFC 7807 application/problem+json:

{
  "type": "https://outbound.ustack.ai/errors/invalid-api-key",
  "title": "Invalid API key",
  "status": 401,
  "detail": "The presented API key is not valid."
}

Endpoints

MethodPathScopeDescription
GET/api/v1/meanyCurrent API key and organization info.
GET/api/v1/contactscontacts.readList contacts. Cursor-paginated. Filters: listId, qualificationStatus, q.
GET/api/v1/contacts/:idcontacts.readSingle contact.
GET/api/v1/contacts/:id/researchcontacts.readCached L4 research dossier for a contact.
GET/api/v1/listslists.readList contact lists. Cursor-paginated. ?includeArchived=1 to include archived.
GET/api/v1/lists/:idlists.readSingle contact list.
GET/api/v1/draftsdrafts.readList drafts. Cursor-paginated. Filters: status, contactId.
GET/api/v1/drafts/:iddrafts.readSingle draft (includes full body + engagement timeline).
GET/api/v1/eventsevents.readPaginated platform event log. Filter: eventType (single or comma-separated).

Multi-tenancy

Every API key belongs to exactly one organization. Every endpoint scopes all queries by the key's organizationId. There is no cross-tenant access path; a key minted by Org A cannot read Org B's data even if it knows another org's resource ids.

Webhooks (write-only push)

For event-driven integrations, register webhook endpoints at /admin/integrations/webhooks. Deliveries are signed with X-Outbound-Signature; verify with HMAC-SHA256(timestamp + "." + body, signingSecret).