API reference
Webhook subscriptions
Manage webhook subscriptions from code: the same subscriptions as in Settings → Developers → Webhooks, with their deliveries. The events themselves — catalog, payloads and signatures — are on Webhooks.
- Scopes
webhooks:read·webhooks:write- Plan
- Every plan
- Guide
- Receiving webhooks
A subscription sends the events you choose to one URL, signed with its own secret.
Attributes
Unique identifier of the subscription.
- namestring
A name for your own reference.
- urlstring
Where Nextora sends events. Must be
https://and may not contain a username or password. - eventsstring[]
The event types to send.
- is_activeboolean
Whether events are sent. Nextora sets it to
falsewhen it pauses a subscription whose deliveries have failed for three days; set it back totrueto resume. When Nextora paused the subscription;
nullwhen it is not paused. Changingis_activeyourself clears it.failingwhen Nextora paused the subscription because its deliveries kept failing;nullotherwise.One of
failingWhen the current run of failed attempts began. Cleared by a successful delivery, by resuming, and by a new
url. Three days of it pause the subscription.When a delivery last succeeded.
When a delivery attempt last failed.
When the subscription was created (UTC).
When the subscription last changed (UTC).
The signing secret,
whsec_…. Returned only when the subscription is created and when the secret is rotated — store it then.
{
"id": "f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60",
"name": "Deal sync to billing",
"url": "https://hooks.example.com/nextora",
"events": [
"deal.stage_changed",
"deal.won",
"deal.lost"
],
"is_active": true,
"paused_at": null,
"paused_reason": null,
"failing_since": "2026-10-10T09:15:03Z",
"last_success_at": "2026-10-10T08:47:31Z",
"last_failure_at": "2026-10-10T09:16:04Z",
"created_at": "2026-10-02T10:30:00Z",
"updated_at": "2026-10-02T10:30:00Z"
}One event on its way to one subscription, with the result of its latest attempt. Nextora makes up to six attempts on its own — see retries — and each manual retry adds one more.
Attributes
Unique identifier of the delivery.
- eventstring
The event type delivered.
- statusenum
successafter a 2xx;retryingwhile automatic attempts remain;failedafter the sixth.One of
pendingretryingsuccessfailed - attemptsinteger
The number of the latest attempt, as sent in
Nextora-Attempt. Automatic retries stop at 6; each manual retry adds one, so it can go past 6. The HTTP status your endpoint returned on the last attempt;
nullwhen it did not answer within 10 seconds.When the next attempt is due, while
statusisretrying.When the event was queued for this subscription (UTC).
{
"id": "d8e0f2a4-6b8c-4d1e-9f3a-7c9e1b3d5f82",
"event": "deal.stage_changed",
"status": "retrying",
"attempts": 2,
"response_code": 502,
"next_retry_at": "2026-10-10T09:21:04Z",
"created_at": "2026-10-10T09:15:02Z"
}GET/api/v1/webhooks
Requires webhooks:read
Returns the workspace’s webhook subscriptions. Secrets are never included.
Query parameters
Returns
A list of subscription objects.
curl https://acme.nextora.co/api/v1/webhooks \
-H "Authorization: Bearer $NEXTORA_API_KEY"{
"data": [
{
"id": "f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60",
"name": "Deal sync to billing",
"url": "https://hooks.example.com/nextora",
"events": [
"deal.stage_changed",
"deal.won",
"deal.lost"
],
"is_active": true,
"paused_at": null,
"paused_reason": null,
"failing_since": "2026-10-10T09:15:03Z",
"last_success_at": "2026-10-10T08:47:31Z",
"last_failure_at": "2026-10-10T09:16:04Z",
"created_at": "2026-10-02T10:30:00Z",
"updated_at": "2026-10-02T10:30:00Z"
}
],
"meta": {
"limit": 50,
"has_more": false,
"next_cursor": null
}
}POST/api/v1/webhooks
Requires webhooks:write
Creates a subscription and returns its signing secret — the only time you see it, apart from rotation. Store it with your endpoint’s configuration.
Body parameters
A name for your own reference.
Where to send events: an
https://URL without a username or password, on a public host. Addresses that are or resolve to private, loopback, link-local or cloud-metadata ranges are refused with400 validation_failed.Event types to send, from the event catalog — 20 in all.
- is_activeboolean
falsestops deliveries without deleting the subscription.Default
true
Returns
The new subscription with secret, and 201 Created.
curl -X POST https://acme.nextora.co/api/v1/webhooks \
-H "Authorization: Bearer $NEXTORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Deal sync to billing",
"url": "https://hooks.example.com/nextora",
"events": [
"deal.stage_changed",
"deal.won",
"deal.lost"
]
}'{
"data": {
"id": "f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60",
"name": "Deal sync to billing",
"url": "https://hooks.example.com/nextora",
"events": [
"deal.stage_changed",
"deal.won",
"deal.lost"
],
"is_active": true,
"paused_at": null,
"paused_reason": null,
"failing_since": null,
"last_success_at": null,
"last_failure_at": null,
"created_at": "2026-10-10T09:00:00Z",
"updated_at": "2026-10-10T09:00:00Z",
"secret": "whsec_9f3b7c1e5a2d8f4b6c0e3a7d1f5b9c2e8a4d6f0b3c7e1a5d"
}
}GET/api/v1/webhooks/{id}
Requires webhooks:read
Returns one subscription, without its secret.
Path parameters
The subscription’s ID.
Returns
The subscription.
curl https://acme.nextora.co/api/v1/webhooks/f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60 \
-H "Authorization: Bearer $NEXTORA_API_KEY"{
"data": {
"id": "f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60",
"name": "Deal sync to billing",
"url": "https://hooks.example.com/nextora",
"events": [
"deal.stage_changed",
"deal.won",
"deal.lost"
],
"is_active": true,
"paused_at": null,
"paused_reason": null,
"failing_since": "2026-10-10T09:15:03Z",
"last_success_at": "2026-10-10T08:47:31Z",
"last_failure_at": "2026-10-10T09:16:04Z",
"created_at": "2026-10-02T10:30:00Z",
"updated_at": "2026-10-02T10:30:00Z"
}
}PATCH/api/v1/webhooks/{id}
Requires webhooks:write
Changes the fields you send. To resume a subscription Nextora paused after three days of failures, send is_active: true: that clears paused_at, paused_reason and failing_since. A new url clears failing_since too. PUT does the same as PATCH.
Path parameters
The subscription’s ID.
Body parameters
- namestring
A name for your own reference.
- urlstring
Where to send events: an
https://URL without a username or password, on a public host. Addresses that are or resolve to private, loopback, link-local or cloud-metadata ranges are refused with400 validation_failed. - eventsstring[]
Event types to send, from the event catalog — 20 in all.
- is_activeboolean
falsestops deliveries without deleting the subscription.
Returns
The updated subscription.
curl -X PATCH https://acme.nextora.co/api/v1/webhooks/f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60 \
-H "Authorization: Bearer $NEXTORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"events": [
"deal.stage_changed",
"deal.won",
"deal.lost",
"deal.created"
]
}'{
"data": {
"id": "f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60",
"name": "Deal sync to billing",
"url": "https://hooks.example.com/nextora",
"events": [
"deal.stage_changed",
"deal.won",
"deal.lost",
"deal.created"
],
"is_active": true,
"paused_at": null,
"paused_reason": null,
"failing_since": "2026-10-10T09:15:03Z",
"last_success_at": "2026-10-10T08:47:31Z",
"last_failure_at": "2026-10-10T09:16:04Z",
"created_at": "2026-10-02T10:30:00Z",
"updated_at": "2026-10-10T10:02:44Z"
}
}DELETE/api/v1/webhooks/{id}
Requires webhooks:write
Deletes the subscription. Nextora stops sending its events.
Path parameters
The subscription’s ID.
Returns
{ "data": { "id": "…", "deleted": true } }.
curl -X DELETE https://acme.nextora.co/api/v1/webhooks/f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60 \
-H "Authorization: Bearer $NEXTORA_API_KEY"{
"data": {
"id": "f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60",
"deleted": true
}
}POST/api/v1/webhooks/{id}/rotate-secret
Requires webhooks:write
Replaces the signing secret and returns the new one, once. The old secret stops working at once — there is no overlap window: every later delivery carries a single v1 signature made with the new secret. Deploy it to your endpoint straight away; deliveries your endpoint rejects meanwhile are retried.
Path parameters
The subscription’s ID.
Returns
The subscription with its new secret.
curl -X POST https://acme.nextora.co/api/v1/webhooks/f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60/rotate-secret \
-H "Authorization: Bearer $NEXTORA_API_KEY"{
"data": {
"id": "f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60",
"name": "Deal sync to billing",
"url": "https://hooks.example.com/nextora",
"events": [
"deal.stage_changed",
"deal.won",
"deal.lost"
],
"is_active": true,
"paused_at": null,
"paused_reason": null,
"failing_since": "2026-10-10T09:15:03Z",
"last_success_at": "2026-10-10T08:47:31Z",
"last_failure_at": "2026-10-10T09:16:04Z",
"created_at": "2026-10-02T10:30:00Z",
"updated_at": "2026-10-10T10:05:18Z",
"secret": "whsec_2e8a4d6f0b3c7e1a5d9f3b7c1e5a2d8f4b6c0e3a7d1f5b9c"
}
}POST/api/v1/webhooks/{id}/test
Requires webhooks:write
Sends a webhook.test event to the subscription’s URL now — signed, with the same headers as a real event — and returns the delivery, so you can check your endpoint end to end.
Path parameters
The subscription’s ID.
Returns
The delivery of the test event.
curl -X POST https://acme.nextora.co/api/v1/webhooks/f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60/test \
-H "Authorization: Bearer $NEXTORA_API_KEY"{
"data": {
"id": "a4c6e8f0-2b4d-4f6a-8c0e-2d4f6b8a0c19",
"event": "webhook.test",
"status": "success",
"attempts": 1,
"response_code": 200,
"next_retry_at": null,
"created_at": "2026-10-10T09:02:11Z"
}
}GET/api/v1/webhooks/{id}/deliveries
Requires webhooks:read
Returns a subscription’s deliveries, newest first: what was sent, whether it arrived, and when the next retry is due.
Path parameters
The subscription’s ID.
Query parameters
Returns
A list of delivery objects.
curl https://acme.nextora.co/api/v1/webhooks/f3a5c7e9-2b4d-4f6a-8c1e-5d7f9b1a3c60/deliveries \
-H "Authorization: Bearer $NEXTORA_API_KEY"{
"data": [
{
"id": "d8e0f2a4-6b8c-4d1e-9f3a-7c9e1b3d5f82",
"event": "deal.stage_changed",
"status": "retrying",
"attempts": 2,
"response_code": 502,
"next_retry_at": "2026-10-10T09:21:04Z",
"created_at": "2026-10-10T09:15:02Z"
},
{
"id": "c6e8a0b2-4d6f-4a8c-9e2b-6f8a0c2e4b31",
"event": "deal.won",
"status": "failed",
"attempts": 6,
"response_code": 500,
"next_retry_at": null,
"created_at": "2026-10-08T17:30:45Z"
}
],
"meta": {
"limit": 50,
"has_more": false,
"next_cursor": null
}
}POST/api/v1/webhooks/deliveries/{id}/retry
Requires webhooks:write
Sends a delivery again now — a failed one after you fixed your endpoint, or a retrying one without waiting for its next attempt. The retry is the delivery’s next attempt: attempts and Nextora-Attempt go up by one, so a delivery that failed after six attempts is retried as attempt 7.
Path parameters
The delivery’s ID.
Returns
The delivery, with the result of this attempt.
curl -X POST https://acme.nextora.co/api/v1/webhooks/deliveries/c6e8a0b2-4d6f-4a8c-9e2b-6f8a0c2e4b31/retry \
-H "Authorization: Bearer $NEXTORA_API_KEY"{
"data": {
"id": "c6e8a0b2-4d6f-4a8c-9e2b-6f8a0c2e4b31",
"event": "deal.won",
"status": "success",
"attempts": 7,
"response_code": 200,
"next_retry_at": null,
"created_at": "2026-10-08T17:30:45Z"
}
}