Skip to content

List webhook deliveries

GET
/v1/webhook/deliveries
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.

status
string

Filter by status: pending, delivered or dead

limit
integer format: int64

Page size (1-200, default 50)

offset
integer format: int64

Rows to skip (0-10000, default 0)

A page of the merchant's deliveries

Media typeapplication/json
object
deliveries
required
Array<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
attempts
required
integer format: int32
created_at
required
string format: date-time
delivered_at
string | null format: date-time
delivery_id
required
string format: uuid
event_type
required
string
last_error
string | null
next_attempt_at
required
string format: date-time
response_status
integer | null format: int32
settlement_id
required
string format: uuid
status
required

pending (queued or mid-retry), delivered, or dead (retries exhausted; eligible for redelivery).

string
url
required

The endpoint the delivery targets, frozen at enqueue time — a later config change does not rewrite history.

string
limit
required
integer format: int64
offset
required
integer format: int64
total
required
integer format: int64
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

Media typeapplication/json

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
error
required

The body of an [ErrorEnvelope].

object
code
required

Machine-stable error code (stable across locales).

string
Allowed values: invalid_credentials unauthenticated origin_not_allowed challenge_failed locked invalid_link invalid_code otp_enforced no_merchant no_partner not_found invalid_body internal_error provider_unavailable provider_call_failed quote_refused conversion_refused payout_refused payout_wallet_out_of_gas unexpected_failure provider_still_processing database_grant_missing rail_inactive fx_accounts_missing sender_not_registered payout_outcome_unknown conversion_outcome_unknown validation_failed webhook_endpoint_not_configured access_token_missing access_token_malformed access_token_invalid access_verification_unavailable conflict admin_validation_failed forbidden issuance_not_enabled merchant_identity_incomplete issuance_quota_exceeded issuance_rate_limited end_user_reference_exists currency_not_enabled currency_not_supported required invalid_url unsafe_url unresolvable_host
fields

Per-field validation errors, present only for validation_failed.

Array<object> | null

One field-level validation failure inside [ApiError::fields].

object
code
required

The machine-stable reason code for this field.

string
Allowed values: invalid_credentials unauthenticated origin_not_allowed challenge_failed locked invalid_link invalid_code otp_enforced no_merchant no_partner not_found invalid_body internal_error provider_unavailable provider_call_failed quote_refused conversion_refused payout_refused payout_wallet_out_of_gas unexpected_failure provider_still_processing database_grant_missing rail_inactive fx_accounts_missing sender_not_registered payout_outcome_unknown conversion_outcome_unknown validation_failed webhook_endpoint_not_configured access_token_missing access_token_malformed access_token_invalid access_verification_unavailable conflict admin_validation_failed forbidden issuance_not_enabled merchant_identity_incomplete issuance_quota_exceeded issuance_rate_limited end_user_reference_exists currency_not_enabled currency_not_supported required invalid_url unsafe_url unresolvable_host
field
required

The request field the error applies to (e.g. webhook_url).

string
message
required

Human-readable message, localized by Accept-Language.

string
Example
{
"error": {
"code": "invalid_credentials",
"fields": [
{
"code": "invalid_credentials"
}
],
"message": "One or more fields are invalid."
}
}

Missing or invalid API key

Media typeapplication/json

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
error
required

The body of an [ErrorEnvelope].

object
code
required

Machine-stable error code (stable across locales).

string
Allowed values: invalid_credentials unauthenticated origin_not_allowed challenge_failed locked invalid_link invalid_code otp_enforced no_merchant no_partner not_found invalid_body internal_error provider_unavailable provider_call_failed quote_refused conversion_refused payout_refused payout_wallet_out_of_gas unexpected_failure provider_still_processing database_grant_missing rail_inactive fx_accounts_missing sender_not_registered payout_outcome_unknown conversion_outcome_unknown validation_failed webhook_endpoint_not_configured access_token_missing access_token_malformed access_token_invalid access_verification_unavailable conflict admin_validation_failed forbidden issuance_not_enabled merchant_identity_incomplete issuance_quota_exceeded issuance_rate_limited end_user_reference_exists currency_not_enabled currency_not_supported required invalid_url unsafe_url unresolvable_host
fields

Per-field validation errors, present only for validation_failed.

Array<object> | null

One field-level validation failure inside [ApiError::fields].

object
code
required

The machine-stable reason code for this field.

string
Allowed values: invalid_credentials unauthenticated origin_not_allowed challenge_failed locked invalid_link invalid_code otp_enforced no_merchant no_partner not_found invalid_body internal_error provider_unavailable provider_call_failed quote_refused conversion_refused payout_refused payout_wallet_out_of_gas unexpected_failure provider_still_processing database_grant_missing rail_inactive fx_accounts_missing sender_not_registered payout_outcome_unknown conversion_outcome_unknown validation_failed webhook_endpoint_not_configured access_token_missing access_token_malformed access_token_invalid access_verification_unavailable conflict admin_validation_failed forbidden issuance_not_enabled merchant_identity_incomplete issuance_quota_exceeded issuance_rate_limited end_user_reference_exists currency_not_enabled currency_not_supported required invalid_url unsafe_url unresolvable_host
field
required

The request field the error applies to (e.g. webhook_url).

string
message
required

Human-readable message, localized by Accept-Language.

string
Example
{
"error": {
"code": "invalid_credentials",
"fields": [
{
"code": "invalid_credentials"
}
],
"message": "One or more fields are invalid."
}
}