Webhook endpoints
List and read your workspace's webhook endpoints, and send test events, with the AbuseZero REST API.
A webhook endpoint is an HTTPS URL that receives your workspace's webhook events. The workspace owner and admins add and change endpoints in Developers → Webhooks. The AbuseZero REST API reads them and sends test events.
Examples on this page use a server client:
import { AbuseZero } from "abusezero/server";
const abusezero = new AbuseZero({ key: process.env.ABUSEZERO_SECRET_KEY!, outage: "throw" });The webhook endpoint object
{
"object": "webhook_endpoint",
"id": "whe_7d2e9a40-3c1b-4f65-8e27-b9a0c4d61f53",
"url": "https://example.com/webhooks/abusezero",
"description": "Fraud review queue",
"events": ["evaluation.completed", "outcome.updated"],
"benefits": [],
"denied_only": false,
"status": "active",
"paused_reason": null,
"last_success_at": "2026-10-29T12:00:01.000Z",
"revision": 1,
"created_at": "2026-10-01T09:00:00.000Z",
"updated_at": "2026-10-01T09:00:00.000Z"
}| Field | Type | Description |
|---|---|---|
object | "webhook_endpoint" | The object type. |
id | string | The endpoint ID, starting with whe_. |
url | string | Where events are sent. It can't be changed. |
description | string or null | What the endpoint is for. |
events | array of strings | The event types the endpoint receives. |
benefits | array of strings | ben_ IDs the endpoint is limited to. Empty means every benefit. |
denied_only | boolean | Whether evaluation.completed is sent only when result is deny. |
status | active or paused | A paused endpoint receives no events except test events. |
paused_reason | manual, failures or null | manual when someone paused it. failures when AbuseZero paused it after 3 days of failed deliveries. null while active. |
last_success_at | string or null | When the endpoint last replied 2xx. |
revision | integer | Increases with every change to the endpoint. |
created_at | string | When the endpoint was added. |
updated_at | string | When the endpoint last changed. |
The signing secret is never returned. It's shown once in the dashboard, when the endpoint is added and after each rotation.
Add and change endpoints
Adding, editing, pausing, resuming, rotating the signing secret and deleting happen only in Developers → Webhooks, for the workspace owner and admins. No API key, OAuth token or machine client can add or change an endpoint, so a credential can never send your workspace's events to a new destination. See Exclusions.
List webhook endpoints
Returns the workspace's endpoints, most recent first.
| Method | Path | Scope | Idempotency-Key |
|---|---|---|---|
GET | /v1/webhook-endpoints | webhooks:read | Not used |
Also available as abusezero webhook-endpoints list in the AbuseZero CLI, abusezero_list_webhook_endpoints on the AbuseZero MCP server and call() in the AbuseZero Node.js SDK.
Query parameters
| Parameter | Type | Required | Limits | Description |
|---|---|---|---|---|
limit | integer | No | 1 to 100, default 50 | How many endpoints to return. |
cursor | string | No | The next_cursor from the previous page, unchanged. |
Example
const page = await abusezero.call("/v1/webhook-endpoints");Response
Returns 200 with a list of webhook endpoint objects.
{
"object": "list",
"data": [
{
"object": "webhook_endpoint",
"id": "whe_7d2e9a40-3c1b-4f65-8e27-b9a0c4d61f53",
"url": "https://example.com/webhooks/abusezero",
"description": "Fraud review queue",
"events": ["evaluation.completed", "outcome.updated"],
"benefits": [],
"denied_only": false,
"status": "active",
"paused_reason": null,
"last_success_at": "2026-10-29T12:00:01.000Z",
"revision": 1,
"created_at": "2026-10-01T09:00:00.000Z",
"updated_at": "2026-10-01T09:00:00.000Z"
}
],
"next_cursor": null
}Retrieve a webhook endpoint
| Method | Path | Scope | Idempotency-Key |
|---|---|---|---|
GET | /v1/webhook-endpoints/{id} | webhooks:read | Not used |
Also available as abusezero webhook-endpoints get in the AbuseZero CLI, abusezero_get_webhook_endpoint on the AbuseZero MCP server and call() in the AbuseZero Node.js SDK.
Path parameters
| Parameter | Type | Description |
|---|---|---|
id | string | The endpoint ID, starting with whe_. |
Example
const endpoint = await abusezero.call("/v1/webhook-endpoints/whe_7d2e9a40-3c1b-4f65-8e27-b9a0c4d61f53");Response
Returns 200 with a webhook endpoint object.
Errors
| Code | Status | Meaning |
|---|---|---|
WEBHOOK_ENDPOINT_NOT_FOUND | 404 | No endpoint with this ID exists in the workspace. |
INVALID_FIELD | 422 | The ID doesn't start with whe_. |
Send a test event
Sends a webhook.test event to the endpoint, right away, and returns its delivery.
| Method | Path | Scope | Idempotency-Key |
|---|---|---|---|
POST | /v1/webhook-endpoints/{id}/test | webhooks:write | Required |
Also available as abusezero webhook-endpoints test in the AbuseZero CLI, abusezero_send_webhook_test on the AbuseZero MCP server and call() in the AbuseZero Node.js SDK.
- Test events are free: they never count as deliveries.
- They're sent even to a paused endpoint, so you can confirm a fix before you resume it.
- Each test event is attempted once.
- Each endpoint accepts 10 test events an hour.
- With an OAuth token, the signed-in member must be the workspace owner or an admin, as in the dashboard.
Path parameters
| Parameter | Type | Description |
|---|---|---|
id | string | The endpoint ID, starting with whe_. |
Example
const delivery = await abusezero.call("/v1/webhook-endpoints/whe_7d2e9a40-3c1b-4f65-8e27-b9a0c4d61f53/test", {
method: "POST",
idempotencyKey: "webhook-test-2026-10-31",
});Response
Returns 201 with the new webhook delivery. Read it again with GET /v1/webhook-deliveries/{id} to see the attempt.
{
"object": "webhook_delivery",
"id": "whd_1f6b3d84-7a2c-4e95-8b10-6d4e2a9c7f35",
"endpoint": "whe_7d2e9a40-3c1b-4f65-8e27-b9a0c4d61f53",
"event": { "id": "evt_0c7e2b59-8d4a-4f13-9e6b-3a1d5c8f2e70", "type": "webhook.test" },
"kind": "test",
"status": "pending",
"attempts": 0,
"last_status_code": null,
"last_error": null,
"next_attempt_at": "2026-10-31T09:00:00.000Z",
"created_at": "2026-10-31T09:00:00.000Z",
"completed_at": null
}Errors
| Code | Status | Meaning |
|---|---|---|
WEBHOOK_ENDPOINT_NOT_FOUND | 404 | No endpoint with this ID exists in the workspace. |
RATE_LIMITED | 429 | The endpoint had 10 test events in the last hour. Wait for the Retry-After time, then send again. |
PERMISSION_REQUIRED | 403 | With an OAuth token, the signed-in member isn't the workspace owner or an admin. |
For every other code, see REST API errors.
Related
How is this guide?
Last updated on