Setting up webhooks
Forward ticket events from initdesk to your own HTTPS endpoint—how delivery, retries, events, and payloads work.
Forward ticket events from initdesk to your own HTTPS endpoint—how delivery, retries, events, and payloads work.
Forward ticket events from initdesk to your own HTTPS endpoint—how delivery, retries, events, and payloads work.
Webhooks send ticket events from your organization to a URL you control. When something happens in initdesk—a new ticket, a reply, a status change—initdesk POSTs a JSON payload to your endpoint so you can log it, sync another system, or run automation.
This is separate from Slack (see Connecting Slack notifications), email/web push alerts, and the public API. Use webhooks when you want initdesk to push events to your server.
You need:
POST with a JSON bodyRespond with an HTTP 2xx status as soon as you have accepted the payload. initdesk waits up to 15 seconds for your response.
Then trigger a real action in initdesk (for example create a test ticket if you subscribed to ticket.created) and confirm your server received the POST.
For every matching webhook, initdesk:
POST to your endpoint_url with Content-Type: application/json.You do not need to ask initdesk to retry. Make your handler idempotent: the same event may be delivered more than once if an earlier attempt timed out or returned an error after you already processed it.
Your endpoint must respond within 15 seconds. Do heavy work asynchronously after you return 2xx.
initdesk keeps short-lived delivery logs (status code and response body) for about 24 hours for troubleshooting. They are not a long-term audit trail—store what you need on your side.
Subscribe only to the events you need. Available events:
| Event | When it fires |
|---|---|
ticket.created |
A new ticket is created |
ticket.changed_status |
The ticket status changes |
ticket.changed_assignee |
The assignee changes (including unassign) |
ticket.changed_requester |
The requester (customer) on the ticket changes |
ticket.customer_replied |
A customer or CC sends a customer-visible message |
ticket.associate_replied |
An associate sends a customer-visible reply |
ticket.system_replied |
A system message is posted that is visible to the customer |
ticket.internal_note_created |
An internal note is created (not visible to the customer) |
ticket.resolved |
The ticket is resolved |
ticket.snoozed |
The ticket is snoozed |
ticket.unsnoozed |
The ticket wakes from snooze |
Message events fire when a new message is saved (not for imported historical messages).
With the Default (integration) template, the body looks like:
{
"event": "ticket.created",
"data": {
"id": 12345,
"public_id": "42",
"subject": "Cannot reset my password",
"status": "created",
"waiting_on": "associate",
"tags": ["billing"],
"customer": {
"name": "Alex Example",
"email": "alex@example.com"
},
"assignee": null,
"inbox": {
"id": 1,
"name": "Main Inbox"
}
}
}
event is the event name you subscribed to.data is the full ticket detail snapshot at send time (same shape as the ticket detail API: subject, status, customer, assignee, tags, inbox, channel, timestamps, and related fields).Always read event first, then inspect data. Field contents can grow over time; ignore unknown fields safely.
The Slack template sends Slack blocks instead of this { "event", "data" } envelope. Use Default for custom code.
initdesk currently sends webhooks without a cryptographic signature header. Treat your endpoint as a public ingress and harden it yourself:
https://hooks.example.com/initdesk/a8f3…) and reject requests that omit it.Do not put secrets in ticket fields that will be echoed back in the payload.
ticket.internal_note_created if the receiver should not see private notes.Does initdesk retry failed deliveries?
Yes. Timeouts, network errors, and non-2xx responses are retried with backoff (up to 10 retries after the first attempt).
Should my server also implement retries toward initdesk?
No. Return 2xx when you accept the event, and make handling idempotent so duplicate deliveries are safe.
Is there a signing secret in Settings?
No. There is no webhook signing key today. Authenticate with a secret URL token or other controls on your side.
Will I get one request per event per webhook?
Yes. Each webhook you configure that includes the event receives its own POST.
Can I delay delivery?
Not from Settings. Events are queued as soon as the ticket change is committed.
Does this replace the API or MCP?
No. Webhooks push events to you. Use the API or MCP Server when you need to read or write data on demand.
If a webhook is not arriving, note your organization, endpoint URL (redact secrets), the event you expected, and the HTTP status your server returned, then contact us via Open a ticket at the bottom of this page.