Skip to content

Register an endpoint (starts verification challenge)

POST
/v1/webhook-endpoints
curl https://api.pacepayments.ai/v1/webhook-endpoints \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"url": "https://hooks.example.org/pace/v1"
}'
Media typeapplication/json
WebhookEndpointCreate
object
url
required
Url

HTTPS, publicly resolvable, port 443 or 8443. Checked at registration AND before every dispatch.

string
>= 12 characters <= 2048 characters
description
Any of:
string
<= 500 characters
event_types
Any of:
Array<string>
payload_mode
Payload Mode

thin = the envelope with related but WITHOUT data. The client fetches the resource over the API when it needs it.

string
default: full
Allowed values: full thin
api_version
Api Version
string
default: v1
Allowed value: v1

Successful Response

Media typeapplication/json
WebhookEndpointWithSecret
object
id
required
Id
string
url
required
Url
string
description
Any of:
string
event_types
Event Types
Array<string>
payload_mode
Payload Mode
string
default: full
Allowed values: full thin
api_version
Api Version
string
default: v1
status
required
Status
string
Allowed values: pending_verification active disabled
verification
Any of:
Verification
object
state
required
State
string
Allowed values: pending succeeded failed expired
last_attempt_at
Any of:
string format: date-time
expires_at
Any of:
string format: date-time
failure_reason
Any of:
string
health
EndpointHealth
object
consecutive_failures
Consecutive Failures
integer
0
last_success_at
Any of:
string format: date-time
last_failure_at
Any of:
string format: date-time
created_at
required
Created At
string format: date-time
secret
required
Secret

SHOWN ONCE. At creation and on every rotation - never retrievable afterwards. Store it now.

string
Example
{
"payload_mode": "full",
"api_version": "v1",
"status": "pending_verification",
"verification": {
"state": "pending"
},
"health": {
"consecutive_failures": 0
},
"secret": "whsec_9f2c4b7e1dREDACTED"
}

No valid access token. Client action: request a new token from the token endpoint and retry once. Repeated 401 with a fresh token means the client registration is disabled - contact Pace, do not retry in a loop.

Media typeapplication/problem+json
Problem
object
type
required
Type
string
title
required
Title
string
status
required
Status
integer
code
required
Code
string
detail
Any of:
string
instance
Any of:
string
trace_id
Any of:
string
errors
Any of:
Array<object>
FieldError
object
pointer
required
Pointer

RFC 6901 pointer to the offending field in the request body. Errors outside the body carry their source as the first segment (e.g. /query/limit).

string
code
required
Code

Stable field error code (open registry).

string
message
Any of:
string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"code": "example",
"detail": "example",
"instance": "example",
"trace_id": "example",
"errors": [
{
"pointer": "example",
"code": "example",
"message": "example"
}
]
}

Authenticated but not permitted. insufficient_scope names the missing scope in detail; feature_not_enabled means the tenant lacks the feature; ip_not_allowlisted means the source IP is not on the client registration’s allowlist; simulate_not_allowed means a sandbox-only simulate block was sent to the live host. None of these are retryable.

Media typeapplication/problem+json
Problem
object
type
required
Type
string
title
required
Title
string
status
required
Status
integer
code
required
Code
string
detail
Any of:
string
instance
Any of:
string
trace_id
Any of:
string
errors
Any of:
Array<object>
FieldError
object
pointer
required
Pointer

RFC 6901 pointer to the offending field in the request body. Errors outside the body carry their source as the first segment (e.g. /query/limit).

string
code
required
Code

Stable field error code (open registry).

string
message
Any of:
string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"code": "example",
"detail": "example",
"instance": "example",
"trace_id": "example",
"errors": [
{
"pointer": "example",
"code": "example",
"message": "example"
}
]
}

Validation Error

Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationError
object
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
input
Input
ctx
Context
object
Examplegenerated
{
"detail": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example",
"input": "example",
"ctx": {}
}
]
}

HTTP rate limit (rate_limited) or execution capacity refusal (quota_exceeded, backlog_full) - two distinct layers. Wait for Retry-After, then retry the identical request with the same Idempotency-Key. backlog_full will not clear in seconds; back off to minutes.

Media typeapplication/problem+json
Problem
object
type
required
Type
string
title
required
Title
string
status
required
Status
integer
code
required
Code
string
detail
Any of:
string
instance
Any of:
string
trace_id
Any of:
string
errors
Any of:
Array<object>
FieldError
object
pointer
required
Pointer

RFC 6901 pointer to the offending field in the request body. Errors outside the body carry their source as the first segment (e.g. /query/limit).

string
code
required
Code

Stable field error code (open registry).

string
message
Any of:
string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"code": "example",
"detail": "example",
"instance": "example",
"trace_id": "example",
"errors": [
{
"pointer": "example",
"code": "example",
"message": "example"
}
]
}
Retry-After
integer

Seconds until the next attempt is permitted.

RateLimit-Limit
integer
RateLimit-Remaining
integer
RateLimit-Reset
integer

Error (RFC 9457). Branch on code, never on title or detail.

Media typeapplication/problem+json
Problem
object
type
required
Type
string
title
required
Title
string
status
required
Status
integer
code
required
Code
string
detail
Any of:
string
instance
Any of:
string
trace_id
Any of:
string
errors
Any of:
Array<object>
FieldError
object
pointer
required
Pointer

RFC 6901 pointer to the offending field in the request body. Errors outside the body carry their source as the first segment (e.g. /query/limit).

string
code
required
Code

Stable field error code (open registry).

string
message
Any of:
string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"code": "example",
"detail": "example",
"instance": "example",
"trace_id": "example",
"errors": [
{
"pointer": "example",
"code": "example",
"message": "example"
}
]
}