Receive a ticket event from another helpdesk
Land a ticket event pushed by Zendesk, Freshdesk or Intercom.
/v1/webhooks/{provider}/{integration_id}No credential- Operation id
- receive_webhook
- Access
- Public by design. No credential is required or consulted.
/v1/webhooks/{provider}/{integration_id}Land a ticket event pushed by Zendesk, Freshdesk or Intercom.
Configure this URL in the other helpdesk. provider is zendesk,
freshdesk or intercom, and integration_id is the connection's id from
this workspace. Any other provider name is 404.
The URL itself is a secret, because integration_id is what selects
the workspace. Treat it as a credential and do not put it anywhere public.
Configure a signing secret on the connection as well. When one is set, the provider's signature is verified and a mismatch is refused with 401. When none is set the request is accepted and logged loudly, and a deployment can be configured to refuse unsigned webhooks outright.
The body is the provider's own JSON. The three shapes are read into one internal event, and partial payloads are tolerated on purpose: a missing customer address or an empty message body still lands the record rather than dropping the event.
Two success shapes, both 200. status: "ok" means an event was recorded
and carries the id it was recorded as. status: "ignored" means the
payload was valid but was not a ticket event, so nothing was written.
Neither is an error and neither should be retried.
A 429 means come back later, with Retry-After in seconds. Nothing was
written and the same delivery replayed afterwards is accepted, so a client
that gives up on 429 turns a deferral into a lost ticket.
Access: no credential.
Path Parameters
uuidHeader Parameters
"application/json"Request Body
application/json
The provider's own ticket payload, read as sent. The example is the Zendesk shape.
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
curl -X POST "https://example.com/v1/webhooks/string/497f6eca-6276-4993-bfeb-53cbbbba6f08" \ -H "Content-Type: application/json" \ -d '{ "ticket": { "id": 40218, "subject": "Card declined on renewal", "status": "open", "priority": "high", "requester": { "name": "Sam Okafor", "email": "sam.okafor@northwind.example" }, "latest_comment": { "body": "My card was declined but I was still charged.", "via_channel": "user", "author_role": "end-user" } } }'{ "status": "ok", "transcript_id": "7c4b1f90-2a63-4e85-9d17-3f0a6b2c8e51", "external_ticket_id": "40218"}Hold a stream open and receive each human reply as it is sent
The customer side of a handoff. The widget subscribes here once the handoff has happened and receives every human reply on the ticket without reloading.
Accept an invitation as the signed in user
Cases 2, 3 and 4: join the workspace as the identity that signed in.