List webhook deliveries
const url = 'https://api.sulpayments.ch/v1/webhook/deliveries';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.sulpayments.ch/v1/webhook/deliveries \ --header 'Authorization: Bearer <token>'Returns the authenticated merchant's notification delivery log, newest
first: every attempt against the merchant's endpoint with its status
(pending, delivered or dead), attempt counter and the last response
or error. The payload of each delivery is the settlement notification the
merchant already receives and is not repeated here.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Filter by status: pending, delivered or dead
Page size (1-200, default 50)
Rows to skip (0-10000, default 0)
Responses
Section titled “Responses”A page of the merchant's deliveries
object
One outbound notification delivery, as the owning merchant sees it. The endpoint, payload event and failure detail all describe the MERCHANT'S own webhook — nothing internal — so the whole row is safe to show. The frozen payload itself is not repeated here: it is exactly the settlement webhook body the merchant already receives.
object
pending (queued or mid-retry), delivered, or dead (retries
exhausted; eligible for redelivery).
The endpoint the delivery targets, frozen at enqueue time — a later config change does not rewrite history.
Examplegenerated
{ "deliveries": [ { "attempts": 1, "created_at": "2026-04-15T12:00:00Z", "delivered_at": "2026-04-15T12:00:00Z", "delivery_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "event_type": "example", "last_error": "example", "next_attempt_at": "2026-04-15T12:00:00Z", "response_status": 1, "settlement_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "status": "example", "url": "example" } ], "limit": 1, "offset": 1, "total": 1}Invalid status or paging
The error envelope every 4xx/5xx response uses. The error.code is
machine-stable across locales; error.message is localized via the
request's Accept-Language (en by default). error.fields is present only
for per-field validation failures.
object
The body of an [ErrorEnvelope].
object
Machine-stable error code (stable across locales).
Per-field validation errors, present only for validation_failed.
One field-level validation failure inside [ApiError::fields].
object
The machine-stable reason code for this field.
The request field the error applies to (e.g. webhook_url).
Human-readable message, localized by Accept-Language.
Example
{ "error": { "code": "invalid_credentials", "fields": [ { "code": "invalid_credentials" } ], "message": "One or more fields are invalid." }}Missing or invalid API key
The error envelope every 4xx/5xx response uses. The error.code is
machine-stable across locales; error.message is localized via the
request's Accept-Language (en by default). error.fields is present only
for per-field validation failures.
object
The body of an [ErrorEnvelope].
object
Machine-stable error code (stable across locales).
Per-field validation errors, present only for validation_failed.
One field-level validation failure inside [ApiError::fields].
object
The machine-stable reason code for this field.
The request field the error applies to (e.g. webhook_url).
Human-readable message, localized by Accept-Language.
Example
{ "error": { "code": "invalid_credentials", "fields": [ { "code": "invalid_credentials" } ], "message": "One or more fields are invalid." }}