Webhooks
Other systems told of events (deal won, invoice posted, payment received ...): the endpoints, signed messages (Standard Webhooks), retries and the delivery log.
| Operation | Summary | Scope | Idempotency-Key |
|---|---|---|---|
POST /v1/webhook-deliveries/{delivery_id}/send-again |
Send a delivery again | admin |
|
GET /v1/webhooks |
List webhooks | admin |
|
POST /v1/webhooks |
Add a webhook | admin |
|
GET /v1/webhooks/event-types |
List the events webhooks send | read |
|
GET /v1/webhooks/{endpoint_id} |
Get a webhook | admin |
|
PATCH /v1/webhooks/{endpoint_id} |
Change a webhook | admin |
|
DELETE /v1/webhooks/{endpoint_id} |
Delete a webhook | admin |
|
GET /v1/webhooks/{endpoint_id}/deliveries |
List a webhook's deliveries | admin |
|
POST /v1/webhooks/{endpoint_id}/rotate-secret |
Give a webhook a new secret | admin |
|
POST /v1/webhooks/{endpoint_id}/test |
Send a test event | admin |
POST /v1/webhook-deliveries/{delivery_id}/send-again
Send a delivery again
Send a delivery (failed, delivered or waiting) again now, with the full round of retries;
the receiver sees the same event id. 409 webhook_endpoint_disabled while its endpoint is
stopped. Audited.
| Required scope | admin (admin implies every scope) |
| Idempotency-Key | not used |
| Operation id | send_delivery_again_v1_webhook_deliveries__delivery_id__send_again_post |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| path | delivery_id |
string (uuid) | yes | The delivery's id (from the delivery log). |
Example request
curl -X POST "$ERP_URL/v1/webhook-deliveries/{delivery_id}/send-again" \
-H "Authorization: Bearer $ERP_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | DeliveryOut |
| 401 | Missing or invalid API key (unauthorized). |
ErrorEnvelope |
| 403 | The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). |
ErrorEnvelope |
| 404 | The resource does not exist, or belongs to another organization (not_found). |
ErrorEnvelope |
| 409 | The request conflicts with the data: an Idempotency-Key reused with a different request, a closed period, or an integrity rule of the database (conflict, integrity_violation). |
ErrorEnvelope |
| 422 | Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. |
HTTPValidationError |
Example response (shape)
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"endpoint_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"event_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"event_type": "string",
"status": "failed",
"attempts": 1,
"next_attempt_at": "2026-09-21T09:30:00Z",
"last_attempt_at": "2026-09-21T09:30:00Z",
"response_status": 1,
"last_error": "string",
"created_at": "2026-09-21T09:30:00Z",
"delivered_at": "2026-09-21T09:30:00Z",
"log": [
{
"at": "2026-09-21T09:30:00Z",
"status": 1,
"error": "string",
"ms": 1
}
],
"payload": {}
}
GET /v1/webhooks
List webhooks
The organization's webhook endpoints, the oldest first, with how many deliveries wait. Never the secret.
| Required scope | admin (admin implies every scope) |
| Operation id | list_webhooks_v1_webhooks_get |
Example request
curl "$ERP_URL/v1/webhooks" \
-H "Authorization: Bearer $ERP_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | array of EndpointOut |
| 401 | Missing or invalid API key (unauthorized). |
ErrorEnvelope |
| 403 | The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). |
ErrorEnvelope |
| 422 | Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. |
HTTPValidationError |
Example response (shape)
[
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"url": "string",
"description": "string",
"event_types": [
"string"
],
"status": "active",
"disabled_reason": "by_person",
"failures_in_row": 1,
"last_success_at": "2026-09-21T09:30:00Z",
"last_failure_at": "2026-09-21T09:30:00Z",
"waiting": 1,
"created_by": {},
"created_at": "2026-09-21T09:30:00Z",
"secret": "string"
}
]
POST /v1/webhooks
Add a webhook
Tell another system of events: from now on each event it subscribed to is sent to url
(a POST of JSON), signed with the secret in this answer (secret, shown only here: keep it in
the receiving system). Any 2xx answer within 10 seconds delivers it; anything else is tried
again after 1, 5 and 30 minutes, then 2, 5, 10 and 24 hours, and then waits in the log to be
sent again. A receiver may get an event twice (same id) and in any order. Needs the admin
scope and a person (403 webhook_person_only for an agent); 422 webhook_url_refused for a
URL that is not https:// or not a public address; 409 webhook_limit beyond 20 endpoints.
Audited without the secret.
| Required scope | admin (admin implies every scope) |
| Idempotency-Key | not used |
| Operation id | create_webhook_v1_webhooks_post |
Request body
application/json (required): EndpointInput
| Field | Type | Required | Description |
|---|---|---|---|
url |
string | yes | Where events are sent (https://; a public address, never a private, loopback or link-local one). (min length 9; max length 500) |
description |
string or null | What the receiving system is, for people. (max length 200) | |
event_types |
array of "bill.posted" | "case.closed" | "case.created" | "credit_note.posted" | "deal.created" | "deal.lost" | "deal.won" | "invoice.posted" | "lead.converted" | "lead.created" | "payment.received" | "payment.sent" | "quote.accepted" | "quote.declined" | "subscription.activated" | "subscription.cancelled" | "task.completed" | "task.created" | "vendor_credit.posted" | "*" |
yes | The events to send; * for every event, also those added later. (min items 1) |
Example request
curl -X POST "$ERP_URL/v1/webhooks" \
-H "Authorization: Bearer $ERP_KEY" \
-H "Content-Type: application/json" \
-d '{
"description": "Order system",
"event_types": [
"invoice.posted",
"payment.received"
],
"url": "https://hooks.example.com/stabiso"
}'
Responses
| Status | Meaning | Body |
|---|---|---|
| 201 | Created | EndpointOut |
| 401 | Missing or invalid API key (unauthorized). |
ErrorEnvelope |
| 403 | The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). |
ErrorEnvelope |
| 409 | The request conflicts with the data: an Idempotency-Key reused with a different request, a closed period, or an integrity rule of the database (conflict, integrity_violation). |
ErrorEnvelope |
| 422 | Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. |
HTTPValidationError |
Example response (shape)
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"url": "string",
"description": "string",
"event_types": [
"string"
],
"status": "active",
"disabled_reason": "by_person",
"failures_in_row": 1,
"last_success_at": "2026-09-21T09:30:00Z",
"last_failure_at": "2026-09-21T09:30:00Z",
"waiting": 1,
"created_by": {},
"created_at": "2026-09-21T09:30:00Z",
"secret": "string"
}
GET /v1/webhooks/event-types
List the events webhooks send
Every event an endpoint can subscribe to. Each message is a JSON object: id (the
event's id, also the webhook-id header), type, timestamp, organization, entity (the
company's code), test_copy and data (the record's identifiers and figures; amounts as
strings). It is signed as Standard Webhooks specifies (webhook-id, webhook-timestamp,
webhook-signature: v1, and the base64 HMAC-SHA256 of id.timestamp.body with the bytes of
the secret after whsec_).
| Required scope | read (admin implies every scope) |
| Operation id | list_event_types_v1_webhooks_event_types_get |
Example request
curl "$ERP_URL/v1/webhooks/event-types" \
-H "Authorization: Bearer $ERP_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | array of EventTypeOut |
| 401 | Missing or invalid API key (unauthorized). |
ErrorEnvelope |
| 403 | The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). |
ErrorEnvelope |
Example response (shape)
[
{
"type": "string",
"description": "string"
}
]
GET /v1/webhooks/{endpoint_id}
Get a webhook
One endpoint, as the list shows it: its events, state, failures in a row and how many deliveries wait. Never the secret.
| Required scope | admin (admin implies every scope) |
| Operation id | get_webhook_v1_webhooks__endpoint_id__get |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| path | endpoint_id |
string (uuid) | yes | The endpoint's id (GET /v1/webhooks). |
Example request
curl "$ERP_URL/v1/webhooks/{endpoint_id}" \
-H "Authorization: Bearer $ERP_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | EndpointOut |
| 401 | Missing or invalid API key (unauthorized). |
ErrorEnvelope |
| 403 | The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). |
ErrorEnvelope |
| 404 | The resource does not exist, or belongs to another organization (not_found). |
ErrorEnvelope |
| 422 | Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. |
HTTPValidationError |
Example response (shape)
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"url": "string",
"description": "string",
"event_types": [
"string"
],
"status": "active",
"disabled_reason": "by_person",
"failures_in_row": 1,
"last_success_at": "2026-09-21T09:30:00Z",
"last_failure_at": "2026-09-21T09:30:00Z",
"waiting": 1,
"created_by": {},
"created_at": "2026-09-21T09:30:00Z",
"secret": "string"
}
PATCH /v1/webhooks/{endpoint_id}
Change a webhook
Change the URL, description or events, or stop (disabled) and start (active) it.
Started again, what waited goes out at once. Audited.
| Required scope | admin (admin implies every scope) |
| Idempotency-Key | not used |
| Operation id | update_webhook_v1_webhooks__endpoint_id__patch |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| path | endpoint_id |
string (uuid) | yes | The endpoint's id (GET /v1/webhooks). |
Request body
application/json (required): EndpointUpdate
| Field | Type | Required | Description |
|---|---|---|---|
url |
string or null | A new address (as on create). (min length 9; max length 500) | |
description |
string or null | A new description. (max length 200) | |
event_types |
array of "bill.posted" | "case.closed" | "case.created" | "credit_note.posted" | "deal.created" | "deal.lost" | "deal.won" | "invoice.posted" | "lead.converted" | "lead.created" | "payment.received" | "payment.sent" | "quote.accepted" | "quote.declined" | "subscription.activated" | "subscription.cancelled" | "task.completed" | "task.created" | "vendor_credit.posted" | "*" or null |
The new list of events; * for every event. (min items 1) |
|
status |
"active" | "disabled" or null |
disabled stops sending (what waits is kept); active starts again and sends what waited. |
Example request
curl -X PATCH "$ERP_URL/v1/webhooks/{endpoint_id}" \
-H "Authorization: Bearer $ERP_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "disabled"
}'
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | EndpointOut |
| 401 | Missing or invalid API key (unauthorized). |
ErrorEnvelope |
| 403 | The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). |
ErrorEnvelope |
| 404 | The resource does not exist, or belongs to another organization (not_found). |
ErrorEnvelope |
| 409 | The request conflicts with the data: an Idempotency-Key reused with a different request, a closed period, or an integrity rule of the database (conflict, integrity_violation). |
ErrorEnvelope |
| 422 | Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. |
HTTPValidationError |
Example response (shape)
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"url": "string",
"description": "string",
"event_types": [
"string"
],
"status": "active",
"disabled_reason": "by_person",
"failures_in_row": 1,
"last_success_at": "2026-09-21T09:30:00Z",
"last_failure_at": "2026-09-21T09:30:00Z",
"waiting": 1,
"created_by": {},
"created_at": "2026-09-21T09:30:00Z",
"secret": "string"
}
DELETE /v1/webhooks/{endpoint_id}
Delete a webhook
Delete the endpoint with its delivery log; what waited is not sent. Audited.
| Required scope | admin (admin implies every scope) |
| Idempotency-Key | not used |
| Operation id | delete_webhook_v1_webhooks__endpoint_id__delete |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| path | endpoint_id |
string (uuid) | yes | The endpoint's id (GET /v1/webhooks). |
Example request
curl -X DELETE "$ERP_URL/v1/webhooks/{endpoint_id}" \
-H "Authorization: Bearer $ERP_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 204 | No content | |
| 401 | Missing or invalid API key (unauthorized). |
ErrorEnvelope |
| 403 | The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). |
ErrorEnvelope |
| 404 | The resource does not exist, or belongs to another organization (not_found). |
ErrorEnvelope |
| 409 | The request conflicts with the data: an Idempotency-Key reused with a different request, a closed period, or an integrity rule of the database (conflict, integrity_violation). |
ErrorEnvelope |
| 422 | Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. |
HTTPValidationError |
GET /v1/webhooks/{endpoint_id}/deliveries
List a webhook's deliveries
The delivery log: each event sent to the endpoint, the newest first, with its state, every attempt (when, the HTTP status or the error, how long) and the message.
| Required scope | admin (admin implies every scope) |
| Operation id | list_deliveries_v1_webhooks__endpoint_id__deliveries_get |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| path | endpoint_id |
string (uuid) | yes | The endpoint's id (GET /v1/webhooks). |
| query | status |
"failed" | "pending" | "succeeded" or null |
Only those in this state. | |
| query | limit |
integer | Most returned, the newest first. (min 1; max 200; default 50) |
Example request
curl "$ERP_URL/v1/webhooks/{endpoint_id}/deliveries" \
-H "Authorization: Bearer $ERP_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | array of DeliveryOut |
| 401 | Missing or invalid API key (unauthorized). |
ErrorEnvelope |
| 403 | The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). |
ErrorEnvelope |
| 404 | The resource does not exist, or belongs to another organization (not_found). |
ErrorEnvelope |
| 422 | Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. |
HTTPValidationError |
Example response (shape)
[
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"endpoint_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"event_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"event_type": "string",
"status": "failed",
"attempts": 1,
"next_attempt_at": "2026-09-21T09:30:00Z",
"last_attempt_at": "2026-09-21T09:30:00Z",
"response_status": 1,
"last_error": "string",
"created_at": "2026-09-21T09:30:00Z",
"delivered_at": "2026-09-21T09:30:00Z",
"log": [
{
"at": "2026-09-21T09:30:00Z",
"status": null,
"error": null,
"ms": 1
}
],
"payload": {}
}
]
POST /v1/webhooks/{endpoint_id}/rotate-secret
Give a webhook a new secret
A new signing secret (in this answer only); every attempt from now on is signed with it, the old one no longer. Audited.
| Required scope | admin (admin implies every scope) |
| Idempotency-Key | not used |
| Operation id | rotate_webhook_secret_v1_webhooks__endpoint_id__rotate_secret_post |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| path | endpoint_id |
string (uuid) | yes | The endpoint's id (GET /v1/webhooks). |
Example request
curl -X POST "$ERP_URL/v1/webhooks/{endpoint_id}/rotate-secret" \
-H "Authorization: Bearer $ERP_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | EndpointOut |
| 401 | Missing or invalid API key (unauthorized). |
ErrorEnvelope |
| 403 | The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). |
ErrorEnvelope |
| 404 | The resource does not exist, or belongs to another organization (not_found). |
ErrorEnvelope |
| 409 | The request conflicts with the data: an Idempotency-Key reused with a different request, a closed period, or an integrity rule of the database (conflict, integrity_violation). |
ErrorEnvelope |
| 422 | Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. |
HTTPValidationError |
Example response (shape)
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"url": "string",
"description": "string",
"event_types": [
"string"
],
"status": "active",
"disabled_reason": "by_person",
"failures_in_row": 1,
"last_success_at": "2026-09-21T09:30:00Z",
"last_failure_at": "2026-09-21T09:30:00Z",
"waiting": 1,
"created_by": {},
"created_at": "2026-09-21T09:30:00Z",
"secret": "string"
}
POST /v1/webhooks/{endpoint_id}/test
Send a test event
Send a webhook.test event now and return what the endpoint answered (one attempt, kept
in the log; never tried again). Also to a stopped endpoint, to check it before starting it.
| Required scope | admin (admin implies every scope) |
| Idempotency-Key | not used |
| Operation id | test_webhook_v1_webhooks__endpoint_id__test_post |
Parameters
| In | Name | Type | Required | Description |
|---|---|---|---|---|
| path | endpoint_id |
string (uuid) | yes | The endpoint's id (GET /v1/webhooks). |
Example request
curl -X POST "$ERP_URL/v1/webhooks/{endpoint_id}/test" \
-H "Authorization: Bearer $ERP_KEY"
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | OK | DeliveryOut |
| 401 | Missing or invalid API key (unauthorized). |
ErrorEnvelope |
| 403 | The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). |
ErrorEnvelope |
| 404 | The resource does not exist, or belongs to another organization (not_found). |
ErrorEnvelope |
| 409 | The request conflicts with the data: an Idempotency-Key reused with a different request, a closed period, or an integrity rule of the database (conflict, integrity_violation). |
ErrorEnvelope |
| 422 | Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. |
HTTPValidationError |
Example response (shape)
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"endpoint_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"event_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"event_type": "string",
"status": "failed",
"attempts": 1,
"next_attempt_at": "2026-09-21T09:30:00Z",
"last_attempt_at": "2026-09-21T09:30:00Z",
"response_status": 1,
"last_error": "string",
"created_at": "2026-09-21T09:30:00Z",
"delivered_at": "2026-09-21T09:30:00Z",
"log": [
{
"at": "2026-09-21T09:30:00Z",
"status": 1,
"error": "string",
"ms": 1
}
],
"payload": {}
}
Schemas
AttemptOut
| Field | Type | Required | Description |
|---|---|---|---|
at |
string (date-time) | yes | When the attempt was made. |
status |
integer or null | yes | The HTTP status the endpoint answered. |
error |
string or null | yes | Why it failed, when it did not answer 2xx. |
ms |
integer | yes | How long it took, in milliseconds. |
DeliveryOut
| Field | Type | Required | Description |
|---|---|---|---|
id |
string (uuid) | yes | The delivery's id (send-again takes it). |
endpoint_id |
string (uuid) | yes | The endpoint it goes to. |
event_id |
string (uuid) | yes | The event's id: webhook-id of every attempt. |
event_type |
string | yes | The event, e.g. invoice.posted. |
status |
"failed" | "pending" | "succeeded" |
yes | pending (to go out or to try again), succeeded (delivered), failed (every attempt failed; send it again). |
attempts |
integer | yes | Attempts made so far. |
next_attempt_at |
string (date-time) or null | yes | When it is tried next; null if not. |
last_attempt_at |
string (date-time) or null | yes | When it was last tried. |
response_status |
integer or null | yes | The HTTP status of the last attempt. |
last_error |
string or null | yes | Why the last attempt failed. |
created_at |
string (date-time) | yes | When the event happened. |
delivered_at |
string (date-time) or null | yes | When it was delivered. |
log |
array of AttemptOut |
yes | The attempts, the latest last (at most 20). |
payload |
object | yes | The message body sent. |
EndpointInput
| Field | Type | Required | Description |
|---|---|---|---|
url |
string | yes | Where events are sent (https://; a public address, never a private, loopback or link-local one). (min length 9; max length 500) |
description |
string or null | What the receiving system is, for people. (max length 200) | |
event_types |
array of "bill.posted" | "case.closed" | "case.created" | "credit_note.posted" | "deal.created" | "deal.lost" | "deal.won" | "invoice.posted" | "lead.converted" | "lead.created" | "payment.received" | "payment.sent" | "quote.accepted" | "quote.declined" | "subscription.activated" | "subscription.cancelled" | "task.completed" | "task.created" | "vendor_credit.posted" | "*" |
yes | The events to send; * for every event, also those added later. (min items 1) |
EndpointOut
| Field | Type | Required | Description |
|---|---|---|---|
id |
string (uuid) | yes | The endpoint's id. |
url |
string | yes | Where events are sent. |
description |
string or null | yes | What the receiving system is. |
event_types |
array of string | yes | The events it gets; * for every event. |
status |
"active" | "disabled" |
yes | active sends; disabled keeps what waits and sends nothing. |
disabled_reason |
"by_person" | "failing" or null |
yes | failing: the system stopped it after it kept failing for a day. |
failures_in_row |
integer | yes | Attempts that failed since the last success. |
last_success_at |
string (date-time) or null | yes | The last delivered attempt. |
last_failure_at |
string (date-time) or null | yes | The last failed attempt. |
waiting |
integer | yes | Deliveries still to go out (or to try again). |
created_by |
object | yes | Who added it. |
created_at |
string (date-time) | yes | When it was added. |
secret |
string or null | The signing secret (whsec_...): only in the answer that made or rotated it, never again. |
EndpointUpdate
| Field | Type | Required | Description |
|---|---|---|---|
url |
string or null | A new address (as on create). (min length 9; max length 500) | |
description |
string or null | A new description. (max length 200) | |
event_types |
array of "bill.posted" | "case.closed" | "case.created" | "credit_note.posted" | "deal.created" | "deal.lost" | "deal.won" | "invoice.posted" | "lead.converted" | "lead.created" | "payment.received" | "payment.sent" | "quote.accepted" | "quote.declined" | "subscription.activated" | "subscription.cancelled" | "task.completed" | "task.created" | "vendor_credit.posted" | "*" or null |
The new list of events; * for every event. (min items 1) |
|
status |
"active" | "disabled" or null |
disabled stops sending (what waits is kept); active starts again and sends what waited. |
EventTypeOut
| Field | Type | Required | Description |
|---|---|---|---|
type |
string | yes | The event's name, e.g. deal.won. |
description |
string | yes | When it is sent and what its data holds. |