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
Request body
Request example
JSON
Create subscription response
A successful create returns201 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. Usemailbox_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
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
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
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
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.
Related
- Webhooks guide — payload verification, typed receiver examples
-
Mail webhooks reference —
message.*payload shapes -
Phone webhooks reference —
text.*,call.ended, andphone.incoming_callpayload shapes -
iMessage webhooks reference —
imessage.*payload shapes - Signing keys — per-identity keys used to verify webhook bodies
- Slack webhooks reference — Slack event selection and payloads

