Webhook Management
Configure webhook endpoints and their event subscriptions.
Every live endpoint this business holds, across all event families.
successUnauthorized
Internal Server Error
GET /api/v2/webhooks HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "success",
"data": [
{
"id": "018f3c1e-6b2a-7d48-9f3c-1e6b2a7d4f80",
"business_id": "018e2b0d-5a19-7c37-8e2b-0d5a197c3760",
"event_type": "travel_rule",
"webhook_url": "https://partner.example.com/ospree/webhooks",
"event_names": [
"INCOMING_TRANSFER",
"TRANSFER_COMPLETED"
],
"ip_allowlist": [
"203.0.113.7"
],
"modified_by": "ops@partner.example.com",
"last_modified": "2026-08-31T11:02:05Z",
"webhook_desc": "Travel rule events"
},
{
"id": "018f3c1e-6b2a-7d48-9f3c-1e6b2a7d4f81",
"business_id": "018e2b0d-5a19-7c37-8e2b-0d5a197c3760",
"event_type": "address_verification",
"webhook_url": "https://partner.example.com/ospree/address-verification",
"webhook_desc": "Address verification events"
}
]
}Upsert this business's webhook endpoint for one event family.
An upsert with no id, and deliberately not a create: it updates the family's endpoint, or creates one when the family has none. A family may hold several endpoints, up to a maximum of 5, but this call never adds the second one — it answers 409 rather than overwriting an arbitrary one of them.
Configure this business's webhook endpoint for one event family. The call is an upsert and carries no endpoint id: it updates the endpoint the family already has, and creates one when it has none. A business may hold up to 5 endpoints per event family, but this route never creates a second one — when the family already holds more than one endpoint it answers 409 rather than guessing which to overwrite. Use GET /webhooks to list them and DELETE /webhooks/{id} to address one by id.
The endpoint was created or updated.
successUnauthorized
The event family holds more than one endpoint, so there is no single endpoint to update; or it already holds the maximum of 5
Unprocessable Entity - Validation Error
Internal Server Error
POST /api/v2/webhooks HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 164
{
"event_type": 1,
"webhook_url": "https://partner.example.com/ospree/webhooks",
"event_names": [
"INCOMING_TRANSFER",
"TRANSFER_COMPLETED"
],
"ip_allowlist": [
"203.0.113.7"
]
}{
"status": "success",
"data": {
"id": "018f3c1e-6b2a-7d48-9f3c-1e6b2a7d4f80",
"event_type": 1,
"business_id": "018e2b0d-5a19-7c37-8e2b-0d5a197c3760",
"webhook_url": "https://partner.example.com/ospree/webhooks",
"event_names": [
"INCOMING_TRANSFER",
"TRANSFER_COMPLETED"
],
"ip_allowlist": [
"203.0.113.7"
],
"created_by": "018d1a9c-4908-7b26-9d1a-9c49087b2650",
"created": "2026-08-31T09:14:22Z",
"webhook_secret": "the plaintext signing secret, returned by this call only"
}
}Mint a replacement signing secret and hold it pending — phase one of two.
The response is the only time this secret is ever disclosed. Ospree keeps signing deliveries with the current secret until the activate call below, so nothing breaks while the new value is deployed to the tenant's verifier.
A replacement secret was minted and is pending activation.
successUnauthorized
Not Found
Internal Server Error
POST /api/v2/webhooks/{id}/secret/rotate HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "success",
"data": {
"id": "018f3c1e-6b2a-7d48-9f3c-1e6b2a7d4f80",
"webhook_secret": "the replacement signing secret, returned by this call only",
"expires": "2026-09-30T09:00:00Z"
}
}Promote the pending signing secret to active — phase two, the cutover.
Carries no secret material: the pending value was disclosed by the rotate that minted it and by nothing else.
The pending secret is now the active signing secret.
successUnauthorized
No endpoint with this id, or it has no pending secret
Internal Server Error
POST /api/v2/webhooks/{id}/secret/activate HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "success",
"data": {
"id": "018f3c1e-6b2a-7d48-9f3c-1e6b2a7d4f80",
"event_type": 1,
"business_id": "018e2b0d-5a19-7c37-8e2b-0d5a197c3760",
"webhook_url": "https://partner.example.com/ospree/webhooks",
"event_names": [
"INCOMING_TRANSFER",
"TRANSFER_COMPLETED"
],
"ip_allowlist": [
"203.0.113.7"
],
"created_by": "018d1a9c-4908-7b26-9d1a-9c49087b2650",
"created": "2026-08-31T09:14:22Z",
"modified_by": "018d1a9c-4908-7b26-9d1a-9c49087b2650",
"last_modified": "2026-08-31T12:40:11Z"
}
}The event families a webhook can be registered for.
successUnauthorized
Internal Server Error
GET /api/v2/webhooks/event_types HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "success",
"data": [
{
"event_type_name": "travel_rule",
"event_type_id": "1"
},
{
"event_type_name": "address_verification",
"event_type_id": "3"
}
]
}The endpoint was deleted. data is the outcome flag.
successUnauthorized
Not Found
Internal Server Error
DELETE /api/v2/webhooks/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "success",
"data": true
}Last updated

