The REST API is what Zapier, Make, n8n and your own code call to read your account's events and to subscribe to them. It speaks JSON over HTTPS and every request carries an API key.
Every endpoint lives under the base URL below, followed by the version, for example /v1/me.
The samples on this page read the base URL from KADENS_API_URL and your key from KADENS_API_KEY, so you can paste them as they are.
Requests and responses are JSON. Send Content-Type: application/json with every request that has a body.
The version is part of the path. Each event also carries the version of its format in its version field, currently 2026-10-01, so your code can tell which shape it received.
Every request needs an API key in the Authorization header as a Bearer token. Each endpoint lists the scope it needs.
API keys and scopesErrors use standard HTTP status codes and a JSON body with the status, a message, the path and a request id you can quote to support.
| Status | Meaning |
|---|---|
400 | The query or body did not pass validation. Check the fields against this reference. |
401 | The key is missing, badly formatted, revoked or expired. |
403 | The key is valid but lacks the scope this endpoint needs. |
429 | Too many requests. Wait for the time in the Retry-After header, then try again. |
{
"statusCode": 401,
"message": "Missing or invalid API key",
"timestamp": "2026-10-01T10:00:00.000Z",
"path": "/api/v1/events",
"requestId": "req_7c1e0b"
}Limits are counted per API key. Going over any of them returns 429 until the window resets.
| Window | Limit |
|---|---|
Per second | 40 requests |
Per 10 seconds | 250 requests |
Per minute | 800 requests |
/v1/meTests the key: returns the account it belongs to and its scopes. Works with any valid key.
curl "$KADENS_API_URL/v1/me" \
-H "Authorization: Bearer $KADENS_API_KEY"{
"entity": {
"id": "6f1c2d3e-4b5a-4c7d-8e9f-0a1b2c3d4e5f",
"name": "Barcelona Salsa Studio"
},
"apiKeyId": "9a8b7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
"scopes": [
"webhooks.read",
"webhooks.write"
]
}/v1/event-typesScope: webhooks.readLists every event type you can subscribe to, with a sample of each and the fields that hold personal data.
curl "$KADENS_API_URL/v1/event-types" \
-H "Authorization: Bearer $KADENS_API_KEY"{
"apiVersion": "2026-10-01",
"data": [
{
"type": "order.paid",
"family": "orders",
"descriptionKey": "Webhooks.events.order_paid",
"sample": {
"order": {
"id": "ord_91ac04",
"status": "paid",
"created_at": "2026-10-01T09:58:02Z",
"paid_at": "2026-10-01T10:00:00Z",
"event": {
"id": "evt_7f3c2a",
"name": "Salsa Congress Barcelona 2026"
},
"totals": {
"gross": {
"amount": 12000,
"currency": "EUR"
},
"fees": {
"amount": 600,
"currency": "EUR"
},
"net": {
"amount": 11400,
"currency": "EUR"
},
"tax": {
"amount": 2083,
"currency": "EUR"
}
},
"buyer": {
"entity_id": "ent_5b21",
"name": "Lucia Martin",
"email": "lucia@example.com"
},
"lines": [
{
"ticket_type_id": "tt_full_pass",
"name": "Full pass",
"quantity": 1,
"unit_price": {
"amount": 12000,
"currency": "EUR"
}
}
]
}
},
"personalDataPaths": [
"order.buyer.name",
"order.buyer.email"
]
}
]
}/v1/eventsScope: webhooks.readLists recent events, newest first, in the same envelope as webhook deliveries. Integrations use it to show sample data.
curl "$KADENS_API_URL/v1/events?type=order.paid&limit=10" \
-H "Authorization: Bearer $KADENS_API_KEY"{
"data": [
{
"id": "msg_2f8a1c7e",
"type": "order.paid",
"version": "2026-10-01",
"occurred_at": "2026-10-01T10:00:00Z",
"account": {
"id": "ent_1a0f",
"name": "Barcelona Salsa Studio"
},
"subject": {
"type": "order",
"id": "ord_91ac04",
"sequence": 2
},
"correlation_id": null,
"livemode": true,
"data": {
"order": {
"id": "ord_91ac04",
"status": "paid",
"created_at": "2026-10-01T09:58:02Z",
"paid_at": "2026-10-01T10:00:00Z",
"event": {
"id": "evt_7f3c2a",
"name": "Salsa Congress Barcelona 2026"
},
"totals": {
"gross": {
"amount": 12000,
"currency": "EUR"
},
"fees": {
"amount": 600,
"currency": "EUR"
},
"net": {
"amount": 11400,
"currency": "EUR"
},
"tax": {
"amount": 2083,
"currency": "EUR"
}
},
"buyer": {
"entity_id": "ent_5b21"
},
"lines": [
{
"ticket_type_id": "tt_full_pass",
"name": "Full pass",
"quantity": 1,
"unit_price": {
"amount": 12000,
"currency": "EUR"
}
}
]
}
}
}
],
"nextCursor": null,
"hasMore": false
}| Parameter | Type | Description |
|---|---|---|
type | string | Only events of this type. |
limit | integer | How many events to return, from 1 to 100. Defaults to 25. |
cursor | string | The nextCursor of the previous page, to read the next one. |
/v1/webhooks/subscriptionsScope: webhooks.writeCreates an endpoint managed by the integration. It appears read-only in the dashboard. Returns 201 when it creates the subscription, and 200 with the existing one when the same subscription already exists.
curl -X POST "$KADENS_API_URL/v1/webhooks/subscriptions" \
-H "Authorization: Bearer $KADENS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"targetUrl":"https://hooks.example.com/kadens","eventTypes":["order.paid","attendee.checked_in"],"integration":"zapier","externalRef":"zap_812734"}'{
"id": "3d9f2b71-8c4e-4a6f-9b1d-5e7a0c2f8d14",
"created": true,
"targetUrl": "https://hooks.example.com/kadens",
"eventTypes": [
"order.paid",
"attendee.checked_in"
],
"integration": "zapier",
"externalRef": "zap_812734",
"apiVersion": "2026-10-01",
"secret": "whsec_Zk3v9QmT1rX8bLp2Wc6yHn4s",
"createdAt": "2026-10-01T10:00:00.000Z"
}| Field | Type | Description |
|---|---|---|
targetUrlRequired | string | The HTTPS address Kadens delivers events to. |
eventTypesRequired | string[] | The event types to deliver, from 1 to 50. Read the list from /v1/event-types. |
integrationRequired | string | Who manages the subscription: zapier, make, n8n or other. |
externalRef | string | Your own id for this subscription, up to 255 characters. |
/v1/webhooks/subscriptions/:idScope: webhooks.writeRemoves an endpoint the integration created. Returns 204 with no body.
curl -X DELETE "$KADENS_API_URL/v1/webhooks/subscriptions/3d9f2b71-8c4e-4a6f-9b1d-5e7a0c2f8d14" \
-H "Authorization: Bearer $KADENS_API_KEY"Automation tools connect to Kadens with the REST hooks pattern: they subscribe when a workflow is turned on and unsubscribe when it is turned off.
Subscriptions created this way appear read-only in your dashboard, marked with the integration that manages them.
How to verify signaturesWas this helpful?