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 bodyid -
X-Webhook-Timestamp— Unix seconds -
X-Webhook-Signature—sha256=<hex>HMAC over raw body -
X-API-Version— endpoint pin (v1)
Catalog & wildcards
-
conversation.dispatched|connected|ended|failedorconversation.* -
campaign.started|paused|stopped|completedorcampaign.* -
contact.created|updatedorcontact.* -
webhook.testfrom 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.