Reference
Webhooks
Read your registered endpoints and what happened to each delivery.
The read side of webhooks. Registering an endpoint is done by a business owner in the Nexa portal — see the Webhooks guide for why — but an integrator can read the configuration and the delivery log without waiting on their customer, which is what you want at three in the afternoon when an event did not arrive.
The delivery log is the first place to look. It carries the exact payload we signed and the status code your server answered with, so “we never got it” and “we got it and threw a 500” are one request apart.
The webhook_endpoint object
iduuid- Opaque.
objectstring- Always "webhook_endpoint".
urlstring- Where we POST.
descriptionstring · nullable- The owner's label.
event_typesstring[]- What this endpoint is subscribed to.
enabledboolean- False until the first ping succeeds, and again if we auto-disable it.
disabled_reasonstring · nullable- Why we switched it off.
secret_last4string · nullable- The tail of the signing secret, so you can tell which one is configured. The secret itself is only shown in the portal.
consecutive_failuresinteger- Reset by any success. At 20 we disable the endpoint.
last_success_attimestamp · nullable- ISO 8601, UTC.
last_failure_attimestamp · nullable- ISO 8601, UTC.
{
"id": "c1e935f2-4b8c-4a0e-92d7-f4b8c1e935f2",
"object": "webhook_endpoint",
"url": "https://erp.example.com/hooks/nexa",
"description": "SAP inbound",
"event_types": [
"operation.created",
"operation.completed"
],
"enabled": true,
"disabled_reason": null,
"secret_last4": "1a2b",
"consecutive_failures": 0,
"last_success_at": "2026-09-23T10:04:02.000Z",
"last_failure_at": null,
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-23T10:04:02.000Z"
}Endpoints
List your registered endpoints
/webhookswebhooks:readPaginatedAccepts limit and cursor. See Pagination.
curl https://nexa.com.tn/api/v1/webhooks \
-H "Authorization: Bearer $NEXA_API_KEY"const response = await fetch(
"https://nexa.com.tn/api/v1/webhooks",
{
headers: {
Authorization: `Bearer ${process.env.NEXA_API_KEY}`,
},
},
);
if (!response.ok) {
const { error } = await response.json();
throw new Error(`${error.type}: ${error.message}`);
}
const { data } = await response.json();import os
import requests
headers = {
"Authorization": f"Bearer {os.environ['NEXA_API_KEY']}",
}
response = requests.get(
"https://nexa.com.tn/api/v1/webhooks",
headers=headers,
)
response.raise_for_status()
data = response.json()["data"]Response
{
"data": [
{
"id": "c1e935f2-4b8c-4a0e-92d7-f4b8c1e935f2",
"object": "webhook_endpoint",
"url": "https://erp.example.com/hooks/nexa",
"description": "SAP inbound",
"event_types": [
"operation.created",
"operation.completed"
],
"enabled": true,
"disabled_reason": null,
"secret_last4": "1a2b",
"consecutive_failures": 0,
"last_success_at": "2026-09-23T10:04:02.000Z",
"last_failure_at": null,
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-23T10:04:02.000Z"
}
],
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "eyJvIjo1MH0"
}
}List recent delivery attempts
/webhooks/{endpointId}/deliverieswebhooks:readPaginatedIncludes the exact payload we signed and what your server answered. Statuses are pending, delivering, succeeded, failed (will retry) and dead (gave up).
Path parameters
endpointIduuidrequired- The endpoint.
Accepts limit and cursor. See Pagination.
curl https://nexa.com.tn/api/v1/webhooks/c1e935f2-4b8c-4a0e-92d7-f4b8c1e935f2/deliveries \
-H "Authorization: Bearer $NEXA_API_KEY"const response = await fetch(
"https://nexa.com.tn/api/v1/webhooks/c1e935f2-4b8c-4a0e-92d7-f4b8c1e935f2/deliveries",
{
headers: {
Authorization: `Bearer ${process.env.NEXA_API_KEY}`,
},
},
);
if (!response.ok) {
const { error } = await response.json();
throw new Error(`${error.type}: ${error.message}`);
}
const { data } = await response.json();import os
import requests
headers = {
"Authorization": f"Bearer {os.environ['NEXA_API_KEY']}",
}
response = requests.get(
"https://nexa.com.tn/api/v1/webhooks/c1e935f2-4b8c-4a0e-92d7-f4b8c1e935f2/deliveries",
headers=headers,
)
response.raise_for_status()
data = response.json()["data"]Response
{
"data": [
{
"id": "935f2c1a-7e4c-481a-90e6-2d7f4b8c1e93",
"object": "webhook_delivery",
"endpoint_id": "c1e935f2-4b8c-4a0e-92d7-f4b8c1e935f2",
"event_id": "evt_5f2c1a7e-9b3d-4c81-a0e6-2d7f4b8c1e93",
"event_type": "operation.created",
"status": "succeeded",
"attempt_count": 1,
"response_status": 200,
"error": null,
"next_attempt_at": "2026-09-23T10:04:00.000Z",
"last_attempt_at": "2026-09-23T10:04:02.000Z",
"delivered_at": "2026-09-23T10:04:02.000Z",
"created_at": "2026-09-23T10:04:00.000Z",
"payload": {
"id": "evt_5f2c1a7e-9b3d-4c81-a0e6-2d7f4b8c1e93"
}
}
],
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "eyJvIjo1MH0"
}
}