Live quality
Voice 98.2% WhatsApp 99.1% Email 97.8% SMS 99.4%
Docs

Receive Webhooks

Register an HTTPS URL in Govern → Partner API . Core POSTs a public signed JSON envelope when events occur — not the internal JetStream / outbox shape. Optional: description, api_version (v1), event wildcards, and filters on agent.id.

Public envelope (v1)

{
  "id": "evt_…",
  "type": "conversation.ended",
  "created_at": "2026-08-01T05:10:26Z",
  "api_version": "v1",
  "data": {
    "customer": { "id": "cust_…" },
    "agent": { "id": "agt_…" },
    "conversation": { "id": "conv_…", "status": "completed" },
    "call": { "id": "ac_…", "phone_number": null }
  }
}

Playground / browser sessions may send phone_number: null (internal phone was N/A).

Headers

  • X-Webhook-Id — same as body id
  • X-Webhook-Timestamp — Unix seconds
  • X-Webhook-Signaturesha256=<hex> HMAC over raw body
  • X-API-Version — endpoint pin (v1)

Catalog & wildcards

  • conversation.dispatched|connected|ended|failed or conversation.*
  • campaign.started|paused|stopped|completed or campaign.*
  • contact.created|updated or contact.*
  • webhook.test from Send Test

Filters

Endpoints are owned by the customer (tenant). In Govern → Partner API the Filters editor (Attribute / Operator / Values) builds the same filters[] body used by this API — admins see Agent / In, not field paths.

"filters": [
  { "field": "agent.id", "operator": "in", "values": ["agt_sales", "agt_support"] }
]

Operators: eq, neq, in, not_in. Catalog for UI labels and enabled attributes: GET /webhook-filter-metadata. Unknown fields → 400 invalid_filter_field. See Status codes.

After each attempt, open Recent Deliveries in Govern → Partner API. Your server must return 2xx.

Next: Verify HMAC.

Try it live