REST API reference
Webhook subscriptions
REST Hooks for no-code tools (Zapier, n8n, Make): subscribe a URL to events when a trigger is switched on and unsubscribe when it is switched off. Deliveries are signed and retried like any webhook. Owner and admin tokens only (other roles get 403); subscriptions belong to the token (an API key, or the OAuth app's connection), so revoking the key or disconnecting the app removes them. Endpoints added under Settings > Webhooks are not listed here and cannot be changed through the API.
Endpoints
Every request needs a bearer token: an API key or an OAuth access token. See authentication and scopes.
List webhook subscriptions
/api/v1/hooksThe team's API subscriptions, newest first. Secrets are never returned.
- Scope
webhooks:manage- Unscoped key
- Read-only or read-write
Query parameters
per_pageinteger- 1-100, default 25.
cursorstring- meta.next_cursor from the previous page.
curl https://zono.support/api/v1/hooks \
-H "Authorization: Bearer $ZONO_TOKEN" \
-H "Accept: application/json"{
"data": [
{
"object": "webhook_subscription",
"id": "01j9x0a1b2c3d4e5f6g7h8j9k0",
"target_url": "https://zono.support/",
"events": [
"ticket.created"
],
"description": "description",
"integration": "zapier",
"status": "active",
"is_active": true,
"secret": "secret",
"created_at": "2026-01-15T10:24:07Z",
"updated_at": "2026-01-15T10:24:07Z"
}
],
"links": {
"first": null,
"last": null,
"prev": null,
"next": "https://zono.support/api/v1/hooks?cursor=eyJpZCI6IjAxajl4MnAzcTQiLCJfcG9pbnRzVG9OZXh0SXRlbXMiOnRydWV9"
},
"meta": {
"path": "https://zono.support/api/v1/hooks",
"per_page": 25,
"next_cursor": "eyJpZCI6IjAxajl4MnAzcTQiLCJfcG9pbnRzVG9OZXh0SXRlbXMiOnRydWV9",
"prev_cursor": null
}
}Get a webhook subscription
/api/v1/hooks/{hook}One API subscription.
- Scope
webhooks:manage- Unscoped key
- Read-only or read-write
Path parameters
hookstringRequired- Subscription id.
curl https://zono.support/api/v1/hooks/01j9x5h6o7o8k9s0a1b2c3d4e5 \
-H "Authorization: Bearer $ZONO_TOKEN" \
-H "Accept: application/json"{
"object": "webhook_subscription",
"id": "01j9x0a1b2c3d4e5f6g7h8j9k0",
"target_url": "https://zono.support/",
"events": [
"ticket.created"
],
"description": "description",
"integration": "zapier",
"status": "active",
"is_active": true,
"secret": "secret",
"created_at": "2026-01-15T10:24:07Z",
"updated_at": "2026-01-15T10:24:07Z"
}Subscribe to webhook events
/api/v1/hooksSubscribe a URL to one or more events. The response carries the signing secret, once.
- Scope
webhooks:manage- Unscoped key
- Read-write
Body parameters
target_urlstringRequired- Public https URL to POST events to (url is accepted too).
eventstring- One event, e.g. ticket.created. Required unless events is given.
eventsarray- Several events, or ["*"] for all.
descriptionstring- Shown in Settings > Webhooks, e.g. the Zap name.
integrationstring- zapier, n8n, make or other (shown as a badge in Settings).
curl -X POST https://zono.support/api/v1/hooks \
-H "Authorization: Bearer $ZONO_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"target_url":"https://hooks.zapier.com/hooks/standard/123/abc","event":"ticket.created","integration":"zapier"}'{
"object": "webhook_subscription",
"id": "01j9x0a1b2c3d4e5f6g7h8j9k0",
"target_url": "https://zono.support/",
"events": [
"ticket.created"
],
"description": "description",
"integration": "zapier",
"status": "active",
"is_active": true,
"secret": "secret",
"created_at": "2026-01-15T10:24:07Z",
"updated_at": "2026-01-15T10:24:07Z"
}Unsubscribe
/api/v1/hooks/{hook}Unsubscribe. Answers 204, or 404 if the subscription is gone.
- Scope
webhooks:manage- Unscoped key
- Read-write
Path parameters
hookstringRequired- Subscription id.
curl -X DELETE https://zono.support/api/v1/hooks/01j9x5h6o7o8k9s0a1b2c3d4e5 \
-H "Authorization: Bearer $ZONO_TOKEN" \
-H "Accept: application/json" Answers 204 No Content with an empty body.
Get sample event payloads
/api/v1/hooks/samples/{event}Up to 3 sample payloads for an event, exactly as delivered: the team's latest real events, else one built from its latest matching record (data.sample = true), else a static example.
- Scope
webhooks:manage- Unscoped key
- Read-only or read-write
Path parameters
eventstringRequired- A subscribable event, e.g. ticket.created.
curl https://zono.support/api/v1/hooks/samples/ticket.created \
-H "Authorization: Bearer $ZONO_TOKEN" \
-H "Accept: application/json"{
"data": [
{
"id": "evt_01j9x3m4k7d2c8b5a6f0e1g2h3",
"type": "ticket.created",
"api_version": "v1",
"created_at": "2026-01-15T10:24:07Z",
"team": {
"id": "01j9x0a1b2c3d4e5f6g7h8j9k0"
},
"data": {
"object": {
"object": "ticket",
"id": "01j9x2p3q4r5s6t7u8v9w0x1y2",
"number": 1042,
"subject": "Cannot activate my license",
"description": "<p>My key says it is already in use.</p>",
"status": "answered",
"priority": "high",
"close_reason": null,
"close_reason_detail": null,
"customer": {
"id": "01j9x1c2d3e4f5g6h7j8k9m0n1",
"name": "Ada Lovelace",
"email": "[email protected]"
},
"assignee": {
"id": "01j9x0u1v2w3x4y5z6a7b8c9d0",
"name": "Sam Agent",
"email": "[email protected]"
},
"department": {
"id": "01j9x0d1e2p3t4a5b6c7d8e9f0",
"name": "Billing"
},
"product": {
"id": 12,
"name": "Zono Desktop"
},
"channel": null,
"tags": [
{
"id": "01j9x0t1a2g3b4c5d6e7f8g9h0",
"name": "licensing",
"color": "#6366f1"
}
],
"custom_fields": {
"order_number": "A-1042"
},
"sla": null,
"triage": null,
"conversation_id": null,
"spam": null,
"merged_into": null,
"created_at": "2026-01-15T09:58:12Z",
"updated_at": "2026-01-15T10:24:07Z",
"last_reply_at": "2026-01-15T10:24:07Z",
"first_response_at": "2026-01-15T10:24:07Z",
"closed_at": null,
"url": "https://zono.support/tickets/01j9x2p3q4r5s6t7u8v9w0x1y2"
},
"source": "api"
}
}
]
}