TBBNMerchantDocs
Available

Webhooks

post/v1/webhooks/subscriptions

Subscribe to events. events is an array of event-type strings (e.g. offer.accepted) or ["*"] for every event. See the Events & webhook catalog guide for the full list. The signing secret is returned with the subscription. The url must be a public https address.

curl -X POST https://api.tbbnetwork.com/v1/webhooks/subscriptions \
  -H "Authorization: Bearer sk_sandbox_..." \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "merchantId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "url": "https://example.com/resource",
  "events": [
    "value"
  ]
}'

Parameters

Request body

FieldTypeRequired
merchantIdstring (uuid)yes
namestring—
urlstring (uri)yes
eventsstring[]yes

Response (201)

FieldTypeRequired
idstring (uuid)—
merchantIdstring (uuid)—
namestring—
urlstring—
eventsstring[]—
secretstring—
statusACTIVE | DISABLED—
createdAtstring (date-time)—
updatedAtstring (date-time)—
Example 201 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "merchantId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "url": "https://example.com/resource",
  "events": [
    "value"
  ],
  "secret": "secret",
  "status": "ACTIVE",
  "createdAt": "2026-07-01T12:00:00Z",
  "updatedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
get/v1/webhooks/subscriptions

List a merchant's webhook subscriptions

curl -X GET https://api.tbbnetwork.com/v1/webhooks/subscriptions \
  -H "Authorization: Bearer sk_sandbox_..." \

Parameters

merchantIdqueryrequired

Response (200)

Example 200 response
[
  {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "merchantId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "name": "Acme Co.",
    "url": "https://example.com/resource",
    "events": [
      "value"
    ],
    "secret": "secret",
    "status": "ACTIVE",
    "createdAt": "2026-07-01T12:00:00Z",
    "updatedAt": "2026-07-01T12:00:00Z"
  }
]
patch/v1/webhooks/subscriptions/{id}

Rename a webhook subscription, move it to a new address or change its events. The signing secret is kept, so your receiver needs no change.

curl -X PATCH https://api.tbbnetwork.com/v1/webhooks/subscriptions/{id} \
  -H "Authorization: Bearer sk_sandbox_..." \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Acme Co.",
  "url": "https://example.com/resource",
  "events": [
    "value"
  ]
}'

Parameters

idpathrequired

Request body

FieldTypeRequired
namestring—
urlstring (uri)—
eventsstring[]—

Response (200)

FieldTypeRequired
idstring (uuid)—
merchantIdstring (uuid)—
namestring—
urlstring—
eventsstring[]—
secretstring—
statusACTIVE | DISABLED—
createdAtstring (date-time)—
updatedAtstring (date-time)—
Example 200 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "merchantId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "url": "https://example.com/resource",
  "events": [
    "value"
  ],
  "secret": "secret",
  "status": "ACTIVE",
  "createdAt": "2026-07-01T12:00:00Z",
  "updatedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
post/v1/webhooks/subscriptions/{id}/disable

Disable a webhook subscription — no request body; ownership is derived from the subscription itself plus the calling merchant's own credential, not a body claim.

curl -X POST https://api.tbbnetwork.com/v1/webhooks/subscriptions/{id}/disable \
  -H "Authorization: Bearer sk_sandbox_..." \
  -H "Idempotency-Key: 5f2f...b91" \

Parameters

idpathrequired

Response (201)

FieldTypeRequired
idstring (uuid)—
merchantIdstring (uuid)—
namestring—
urlstring—
eventsstring[]—
secretstring—
statusACTIVE | DISABLED—
createdAtstring (date-time)—
updatedAtstring (date-time)—
Example 201 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "merchantId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "url": "https://example.com/resource",
  "events": [
    "value"
  ],
  "secret": "secret",
  "status": "ACTIVE",
  "createdAt": "2026-07-01T12:00:00Z",
  "updatedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
get/v1/webhooks/deliveries

List webhook deliveries for one of your subscriptions. subscriptionId is required.

curl -X GET https://api.tbbnetwork.com/v1/webhooks/deliveries \
  -H "Authorization: Bearer sk_sandbox_..." \

Parameters

subscriptionIdqueryrequired

Response (200)

Example 200 response
[
  {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "subscriptionId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "eventType": "eventType",
    "payload": null,
    "status": "PENDING",
    "attempts": 1,
    "lastAttemptedAt": "2026-07-01T12:00:00Z",
    "nextAttemptAt": "2026-07-01T12:00:00Z",
    "createdAt": "2026-07-01T12:00:00Z"
  }
]
post/v1/webhooks/deliveries/{id}/replay

Replay a delivery — must be idempotent on the merchant's receiving end, since the original attempt(s) may also have succeeded after all retries appeared exhausted.

curl -X POST https://api.tbbnetwork.com/v1/webhooks/deliveries/{id}/replay \
  -H "Authorization: Bearer sk_sandbox_..." \
  -H "Idempotency-Key: 5f2f...b91" \

Parameters

idpathrequired

Response (201)

FieldTypeRequired
idstring (uuid)—
subscriptionIdstring (uuid)—
eventTypestring—
payloadobject—
statusPENDING | DELIVERED | FAILED | DEAD_LETTER—
attemptsinteger—
lastAttemptedAtstring,null (date-time)—
nextAttemptAtstring,null (date-time)—
createdAtstring (date-time)—
Example 201 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "subscriptionId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "eventType": "eventType",
  "payload": null,
  "status": "PENDING",
  "attempts": 1,
  "lastAttemptedAt": "2026-07-01T12:00:00Z",
  "nextAttemptAt": "2026-07-01T12:00:00Z",
  "createdAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
post/v1/webhooks/business-subscriptions

Register a Business webhook — fires on Space booking lifecycle events (space_booking.created/consent_required/consented/paid/cancelled/completed/no_show) and, with includeMerchantEvents, on the trade, offer, listing and checkout events of every Merchant the Business runs. Requires the Owner, an Admin or a Developer on the Business. The url must be a public https address.

curl -X POST https://api.tbbnetwork.com/v1/webhooks/business-subscriptions \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "url": "https://example.com/resource",
  "events": [
    "value"
  ],
  "includeMerchantEvents": false
}'

Request body

FieldTypeRequired
businessIdstring (uuid)yes
namestring—
urlstringyes
eventsstring[]yes
includeMerchantEventsboolean—

Response (201)

FieldTypeRequired
idstring (uuid)—
businessIdstring (uuid)—
namestring—
urlstring—
eventsstring[]—
includeMerchantEventsboolean—
secretstring—
statusACTIVE | DISABLED—
createdAtstring (date-time)—
updatedAtstring (date-time)—
Example 201 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "url": "https://example.com/resource",
  "events": [
    "value"
  ],
  "includeMerchantEvents": false,
  "secret": "secret",
  "status": "ACTIVE",
  "createdAt": "2026-07-01T12:00:00Z",
  "updatedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
get/v1/webhooks/business-subscriptions

List a Business's webhook subscriptions

curl -X GET https://api.tbbnetwork.com/v1/webhooks/business-subscriptions \
  -H "Authorization: Bearer <session access token>" \

Parameters

businessIdqueryrequired

Response (200)

Example 200 response
[
  {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "name": "Acme Co.",
    "url": "https://example.com/resource",
    "events": [
      "value"
    ],
    "includeMerchantEvents": false,
    "secret": "secret",
    "status": "ACTIVE",
    "createdAt": "2026-07-01T12:00:00Z",
    "updatedAt": "2026-07-01T12:00:00Z"
  }
]
patch/v1/webhooks/business-subscriptions/{id}

Rename a Business webhook, move it to a new address, change its events or whether it carries your Merchants' events. The signing secret is kept.

curl -X PATCH https://api.tbbnetwork.com/v1/webhooks/business-subscriptions/{id} \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Acme Co.",
  "url": "https://example.com/resource",
  "events": [
    "value"
  ],
  "includeMerchantEvents": false
}'

Parameters

idpathrequired

Request body

FieldTypeRequired
namestring—
urlstring—
eventsstring[]—
includeMerchantEventsboolean—

Response (200)

FieldTypeRequired
idstring (uuid)—
businessIdstring (uuid)—
namestring—
urlstring—
eventsstring[]—
includeMerchantEventsboolean—
secretstring—
statusACTIVE | DISABLED—
createdAtstring (date-time)—
updatedAtstring (date-time)—
Example 200 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "url": "https://example.com/resource",
  "events": [
    "value"
  ],
  "includeMerchantEvents": false,
  "secret": "secret",
  "status": "ACTIVE",
  "createdAt": "2026-07-01T12:00:00Z",
  "updatedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
post/v1/webhooks/business-subscriptions/{id}/disable

Disable a Business webhook subscription — no request body; ownership is derived from the subscription itself plus the caller's own session, not a body claim.

curl -X POST https://api.tbbnetwork.com/v1/webhooks/business-subscriptions/{id}/disable \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \

Parameters

idpathrequired

Response (201)

FieldTypeRequired
idstring (uuid)—
businessIdstring (uuid)—
namestring—
urlstring—
eventsstring[]—
includeMerchantEventsboolean—
secretstring—
statusACTIVE | DISABLED—
createdAtstring (date-time)—
updatedAtstring (date-time)—
Example 201 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "businessId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "name": "Acme Co.",
  "url": "https://example.com/resource",
  "events": [
    "value"
  ],
  "includeMerchantEvents": false,
  "secret": "secret",
  "status": "ACTIVE",
  "createdAt": "2026-07-01T12:00:00Z",
  "updatedAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}
get/v1/webhooks/business-deliveries

List Business webhook deliveries for one of your subscriptions. subscriptionId is required.

curl -X GET https://api.tbbnetwork.com/v1/webhooks/business-deliveries \
  -H "Authorization: Bearer <session access token>" \

Parameters

subscriptionIdqueryrequired

Response (200)

Example 200 response
[
  {
    "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "subscriptionId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "eventType": "eventType",
    "payload": null,
    "status": "PENDING",
    "attempts": 1,
    "lastAttemptedAt": "2026-07-01T12:00:00Z",
    "nextAttemptAt": "2026-07-01T12:00:00Z",
    "createdAt": "2026-07-01T12:00:00Z"
  }
]
post/v1/webhooks/business-deliveries/{id}/replay

Replay a Business webhook delivery

curl -X POST https://api.tbbnetwork.com/v1/webhooks/business-deliveries/{id}/replay \
  -H "Authorization: Bearer <session access token>" \
  -H "Idempotency-Key: 5f2f...b91" \

Parameters

idpathrequired

Response (201)

FieldTypeRequired
idstring (uuid)—
subscriptionIdstring (uuid)—
eventTypestring—
payloadobject—
statusPENDING | DELIVERED | FAILED | DEAD_LETTER—
attemptsinteger—
lastAttemptedAtstring,null (date-time)—
nextAttemptAtstring,null (date-time)—
createdAtstring (date-time)—
Example 201 response
{
  "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "subscriptionId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "eventType": "eventType",
  "payload": null,
  "status": "PENDING",
  "attempts": 1,
  "lastAttemptedAt": "2026-07-01T12:00:00Z",
  "nextAttemptAt": "2026-07-01T12:00:00Z",
  "createdAt": "2026-07-01T12:00:00Z"
}

Possible errors

Any other failure (validation, auth, rate limiting, a resource that doesn't exist) returns this same envelope with a non-2xx status — error.code is stable and safe to branch on; error.requestId is worth logging and including in a support request.

Example error response
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "A human-readable description of what went wrong.",
    "requestId": "req_01hxyz..."
  }
}