Managing Endpoints
Create, update, test, and delete registered webhook endpoints, inspect the account-wide delivery log, resend failures, and rotate your signing secret
Registered endpoints are account-level webhook destinations: each one has a URL, an optional event filter, and its own whsec_… signing secret. Everything on this page can also be done from the dashboard under Account → Webhooks.
All endpoints require your API key in the X-API-Key header.
- Up to 10 registered endpoints per account.
- An empty (or omitted)
eventsfilter subscribes to all events — see the event taxonomy. - URLs: HTTPS strongly recommended (
httpallowed), max 2048 characters, private/internal addresses rejected.
Manage endpoints
https://api.anakin.io/v1/webhooksCreate a registered endpoint.
Request Body
{
"url": "https://your-app.com/hooks/anakin",
"description": "Production receiver",
"events": ["job.completed", "job.failed"]
}| Parameter | Type | Description |
|---|---|---|
url required | string | The URL we POST deliveries to. |
description | string | A label shown in the dashboard and API listings. |
events | string[] | Event filter. Empty or omitted = all events. |
Response
201 Created{
"id": "9b1c22e4-…",
"url": "https://your-app.com/hooks/anakin",
"description": "Production receiver",
"events": ["job.completed", "job.failed"],
"isActive": true,
"secret": "whsec_…",
"createdAt": "2026-07-13T10:00:00Z"
}The response includes the endpoint's signing secret (whsec_…) — copy it into your receiver to verify deliveries. Creating an endpoint beyond the limit of 10, or with an invalid URL, returns 400.
https://api.anakin.io/v1/webhooksList your registered endpoints.
200 OK{
"endpoints": [
{
"id": "9b1c22e4-…",
"url": "https://your-app.com/hooks/anakin",
"description": "Production receiver",
"events": ["job.completed", "job.failed"],
"isActive": true,
"createdAt": "2026-07-13T10:00:00Z"
}
]
}https://api.anakin.io/v1/webhooks/{id}Update an endpoint. All fields are optional — only the fields you send change.
Request Body
{
"events": ["job.completed", "job.failed", "monitor.change"],
"isActive": true
}| Parameter | Type | Description |
|---|---|---|
url | string | New destination URL. |
description | string | New label. |
events | string[] | Replaces the event filter. Empty = all events. |
isActive | boolean | false pauses deliveries to this endpoint without deleting it. |
Response
200 OKReturns the updated endpoint. A missing or non-owned endpoint returns 404.
https://api.anakin.io/v1/webhooks/{id}Delete an endpoint. Deliveries to it stop immediately.
200 OK{ "success": true }https://api.anakin.io/v1/webhooks/{id}/testSend a webhook.test event to the endpoint so you can verify reachability and signature handling before real traffic — same as the dashboard's Test button.
{
"deliveryId": "d_7c0f31…",
"httpStatus": 200,
"success": true
}httpStatus is the status your endpoint returned.
Delivery log
Every delivery attempt — to registered endpoints, to per-request webhook_urls, and for monitor alerts — is recorded in one account-wide log, retained for 30 days.
https://api.anakin.io/v1/webhooks/deliveriesList recent deliveries across your account, newest first.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
endpointId | string | Only deliveries to one registered endpoint. |
event | string | Filter by event type (e.g. job.failed). |
status | string | pending, success, failed, or exhausted. |
jobId | string | Deliveries produced by one job. |
limit | number | Maximum rows to return. |
Response
200 OK{
"deliveries": [
{
"id": "d_7c0f31…",
"endpointId": "9b1c22e4-…",
"event": "job.completed",
"jobId": "job_abc123xyz",
"url": "https://your-app.com/hooks/anakin",
"status": "success",
"httpStatus": 200,
"attempts": 1,
"createdAt": "2026-07-13T10:00:06Z"
}
]
}| Field | Type | Description |
|---|---|---|
id | string | Delivery ID — equals the X-Anakin-Delivery-Id header. |
endpointId | string | null | The registered endpoint, or null for per-request webhook_url deliveries. |
event | string | The event type delivered. |
jobId | string | null | The job that produced the event, when applicable. |
status | string | pending, success, failed, or exhausted (retries used up). |
httpStatus | number | null | HTTP status your endpoint returned. |
attempts | number | Delivery attempts so far. |
error | string | null | Failure reason, when failed. |
nextAttemptAt | string | null | When the next retry is scheduled (while pending). |
https://api.anakin.io/v1/webhooks/{id}/deliveriesSame response shape, scoped to one registered endpoint.
https://api.anakin.io/v1/webhooks/deliveries/{id}/resendRe-send a failed or exhausted delivery. The body and signature are byte-identical to the original (only X-Anakin-Timestamp is fresh), and X-Anakin-Delivery-Id is unchanged — so your de-duplication keeps working. Also available from the dashboard.
{ "success": true }Signing secret
Your account's default signing secret signs per-request webhook_url deliveries. (Registered endpoints each have their own secret, returned at creation.)
https://api.anakin.io/v1/webhooks/signing-secret{ "secret": "whsec_…" }https://api.anakin.io/v1/webhooks/signing-secret/rotateGenerate a new default signing secret. Subsequent per-request deliveries are signed with the new secret — update your receiver with the returned value immediately.
200 OK{ "secret": "whsec_…" }Event list
https://api.anakin.io/v1/webhooks/eventsThe machine-readable event taxonomy — useful for building event pickers.
200 OK{
"events": [
"job.completed",
"job.failed",
"batch.completed",
"batch.failed",
"wire.job.completed",
"wire.job.failed",
"monitor.change",
"ai.search.completed",
"ai.search.failed",
"webhook.test"
]
}Code Examples
# Create an endpoint (the response includes its whsec_… secret)
curl -X POST https://api.anakin.io/v1/webhooks \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/hooks/anakin",
"description": "Production receiver",
"events": ["job.completed", "job.failed"]
}'
# Fire a test delivery
curl -X POST https://api.anakin.io/v1/webhooks/9b1c22e4-.../test -H "X-API-Key: your_api_key"
# Inspect recent failures
curl "https://api.anakin.io/v1/webhooks/deliveries?status=failed&limit=20" -H "X-API-Key: your_api_key"
# Resend one
curl -X POST https://api.anakin.io/v1/webhooks/deliveries/d_7c0f31.../resend -H "X-API-Key: your_api_key"
# Rotate the default signing secret (per-request webhook_url deliveries)
curl -X POST https://api.anakin.io/v1/webhooks/signing-secret/rotate -H "X-API-Key: your_api_key"import requests
headers = {"X-API-Key": "your_api_key"}
base = "https://api.anakin.io/v1/webhooks"
# Create an endpoint
endpoint = requests.post(base, headers=headers, json={
"url": "https://your-app.com/hooks/anakin",
"description": "Production receiver",
"events": ["job.completed", "job.failed"],
}).json()
print(endpoint["id"], endpoint["secret"]) # store the whsec_… secret
# Fire a test delivery
print(requests.post(f"{base}/{endpoint['id']}/test", headers=headers).json())
# Resend anything that failed
deliveries = requests.get(f"{base}/deliveries", headers=headers,
params={"status": "failed", "limit": 20}).json()["deliveries"]
for d in deliveries:
requests.post(f"{base}/deliveries/{d['id']}/resend", headers=headers)const headers = { 'X-API-Key': 'your_api_key', 'Content-Type': 'application/json' };
const base = 'https://api.anakin.io/v1/webhooks';
// Create an endpoint
const endpoint = await fetch(base, {
method: 'POST',
headers,
body: JSON.stringify({
url: 'https://your-app.com/hooks/anakin',
description: 'Production receiver',
events: ['job.completed', 'job.failed']
})
}).then(r => r.json());
console.log(endpoint.id, endpoint.secret); // store the whsec_… secret
// Fire a test delivery
const test = await fetch(`${base}/${endpoint.id}/test`, { method: 'POST', headers }).then(r => r.json());
console.log(test.httpStatus, test.success);
// Resend anything that failed
const { deliveries } = await fetch(`${base}/deliveries?status=failed&limit=20`, { headers }).then(r => r.json());
for (const d of deliveries) {
await fetch(`${base}/deliveries/${d.id}/resend`, { method: 'POST', headers });
}