Skip to main content
A webhook subscription belongs to one agent identity, names one HTTPS destination URL, and selects a non-empty list of notification types from the webhook catalog. When a matching event fires, Inkbox POSTs the payload to the subscription’s URL. You can mix email, SMS/MMS, iMessage, call-lifecycle, Agent2Agent, and Slack events in one subscription. All 44 notification types are available even before their channels are enabled or attached. Selecting events does not provision resources, enable channels, change billing, or replay past events. Selected events begin arriving when their channel becomes active; disabling one channel preserves the subscription and its other selections. You can attach up to 60 active subscriptions per identity. Each URL receives its own POST per event, independently — one slow receiver doesn’t block delivery to the others. A request that would create a 61st active subscription on the same identity returns 409; delete an existing subscription first.
phone.incoming_call is not subscribable. That event is a synchronous control-plane callback — the response body decides whether Inkbox answers the call — so it can’t fan out. Configure the identity’s incoming-call action instead.

Auth

Unclaimed agent-scoped API keys are rejected.

Create subscription

Create a subscription on an agent identity. You can configure several destination URLs, or combine event families at one URL.

Request body

Request example

JSON

Create subscription response

A successful create returns 201 with the created subscription: the shared Subscription object plus a one-time signing_key field that no other endpoint returns.
JSON
Signing keys are per owning identity, so the secret returned here belongs to this subscription’s owning identity (owner_identity_id) and verifies every webhook for that identity. All other fields are the shared Subscription object.

Reuse a mixed subscription

A create can reuse one existing mixed subscription at the exact same URL when its requested events belong to a single supported family. Use mailbox_id for email-only requests, phone_number_id for text-only requests, or agent_identity_id for iMessage-only, call-only, Agent2Agent-only, or Slack-only requests. Omit auth_token and context_config. Exactly one active subscription for that identity and exact URL must overlap the requested events, and it must already select events from more than one family. The 201 response returns that existing subscription’s ID. The request adds only missing events and preserves its settings and other events. Receiving that ID does not authorize an update or deletion without scope=identity. This does not merge subscriptions or make all creates idempotent. Ambiguous matches, an existing single-family subscription, multi-family requests, or requests that specify authentication or context still return 409 on overlap. Keep separately managed destinations separate unless they intentionally share a receiver.

Validation errors

Code examples


List subscriptions

List active subscriptions visible to the caller, newest first. Returns an object with a subscriptions array — not a bare array.

Query parameters

Identity-wide scope requires supports_identity_subscriptions: true in GET /webhooks/catalog. SDK/CLI version 0.7.8 or later checks this capability before an explicit identity-wide list. For a complete identity list, use GET /webhooks/subscriptions?agent_identity_id=IDENTITY_ID&scope=identity. Legacy filtered lists exclude mixed subscriptions so older integrations cannot accidentally replace another event family’s configuration. An unfiltered list still returns all visible subscriptions. Updates and deletion of a mixed subscription require an explicit scope=identity query parameter. Without it, the server returns 409 without changing the subscription. SDK/CLI 0.7.8 exposes this opt-in but does not add it automatically; upgrading an existing caller preserves its defaults. Filters AND-combine. Foreign-organization rows are filtered out, so they never appear in results.

Response (200)

JSON

Error responses

Code examples


Get subscription

Path parameters

Response (200)

Returns the subscription object. See Subscription object.

Error responses

Code examples


Update subscription

Update a subscription’s destination URL and/or event list in place. The identity owner is immutable. To move a subscription to another identity, delete it and create a new one. Changing a URL, token, or event list affects the whole subscription, including every selected channel.

Path parameters

Request body

Supply only the fields you want to change. If multiple clients update the same field, the last successful update wins.

Request example

JSON

Response (200)

Returns the updated subscription object. See Subscription object.

Validation errors

Code examples


Delete subscription

Remove the complete subscription, stopping all its selected notifications. To stop only one event family, update the event list instead. Subsequent reads on the same sub_id return 404.

Path parameters

Response (204)

No body.

Error responses

Code examples


Subscription object

Event types

event_types is a non-empty list drawn from the same catalog the webhook payload pages document: All event types above belong to the agent identity and may share one subscription. Separate identity subscriptions may use the same URL when their event lists are disjoint; requesting the same event on two active rows at that URL returns 409. phone.incoming_call is not in this list. Configure it through the identity’s incoming-call action.

Conversation context (context_config)

Set context_config to request conversation context on received notifications. A mixed subscription may store this configuration; other event types ignore it. On received events — message.received, text.received, and imessage.received — the delivered payload then carries a data.context object with recent history, so your handler can act with context without a follow-up API call. Delivery-status events never carry context. context_config holds up to three independent class keys: Omit a class to leave it unconfigured. Each configured class picks one of two modes: The object is validated strictly: an unknown class key, an unknown mode, a count/hours out of range, or any unexpected field returns 422. An all-empty object is stored as no context (null).
JSON
On update, context_config is tri-state: an object replaces the stored config, null clears it, and omitting the field leaves it unchanged. Other selected event types, including Slack events, do not gain context. The delivered data.context block — its scopes, per-class items, transcript abridgment, skip reasons, and the 256 KB size cap — is documented alongside the payloads on the Mail, Phone, and iMessage webhook pages.