Help
DevelopersReference

Webhooks

Subscriptions your endpoint receives signed events on, with their deliveries.

Base URL https://api.showpilot.com/v1. Every call needs Authorization: Bearer <api key>; see Authentication.

List subscriptions and the event catalog

GET /webhooks

Scope: webhooks:manage. Operation id: listWebhooks.

Example request

curl "https://api.showpilot.com/v1/webhooks" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

Subscriptions (secrets never shown) and every event type you can subscribe to.

FieldTypeAlwaysMeaning
itemsarray of Webhookyes
catalogarray of stringyes

Webhook

FieldTypeAlwaysMeaning
idstring (uuid)yes
urlstring (uri)yes
eventsarray of stringyesEvent types, or ["*"] for all.
descriptionstringyes
statusactive · pausedyes
consecutiveFailuresintegeryes
lastDeliveredAtstring or null (date-time)yes
lastFailedAtstring or null (date-time)yes
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

Errors

StatusWhen
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

Subscribe an endpoint to events

POST /webhooks

Scope: webhooks:manage. Operation id: createWebhook.

The response carries the signing secret once. Verify every delivery: X-ShowPilot-Signature is sha256= HMAC-SHA256 over <X-ShowPilot-Timestamp>.<raw body> with the secret; reject anything older than five minutes. Deliveries retry with backoff over five attempts; twenty failures in a row pause the subscription.

Parameters

NameInTypeMeaning
Idempotency-KeyheaderstringAny unique string, up to 200 characters, chosen by the caller. A retry with the same key and the same request replays the stored response (with the header Idempotent-Replayed set to true); the same key with a different request is refused. Keys are remembered for 24 hours.

Example request

curl "https://api.showpilot.com/v1/webhooks" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

Status 201.

The subscription, with its secret.

Every field of Webhook, plus:

FieldTypeAlwaysMeaning
secretstringyesShown only here.

Webhook

FieldTypeAlwaysMeaning
idstring (uuid)yes
urlstring (uri)yes
eventsarray of stringyesEvent types, or ["*"] for all.
descriptionstringyes
statusactive · pausedyes
consecutiveFailuresintegeryes
lastDeliveredAtstring or null (date-time)yes
lastFailedAtstring or null (date-time)yes
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

Errors

StatusWhen
400A parameter is malformed, such as a cursor this API did not issue, a limit under 1, or an unknown status. Code invalid-request.
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
409The write cannot apply. Code conflict when the object's state refuses it (a follow-up already closed); code idempotency-mismatch when the Idempotency-Key was already used for a different request.
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

One subscription

GET /webhooks/{id}

Scope: webhooks:manage. Operation id: getWebhook.

Parameters

NameInTypeMeaning
idpathstring (uuid)

Example request

curl "https://api.showpilot.com/v1/webhooks/a0000001-0000-4000-8000-000000000000" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

The subscription.

Webhook

FieldTypeAlwaysMeaning
idstring (uuid)yes
urlstring (uri)yes
eventsarray of stringyesEvent types, or ["*"] for all.
descriptionstringyes
statusactive · pausedyes
consecutiveFailuresintegeryes
lastDeliveredAtstring or null (date-time)yes
lastFailedAtstring or null (date-time)yes
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

Errors

StatusWhen
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
404No object with that id in this workspace. Code not-found.
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

Change the url, events, description or status

PATCH /webhooks/{id}

Scope: webhooks:manage. Operation id: updateWebhook.

Setting status to active also resets the failure count after a pause.

Parameters

NameInTypeMeaning
Idempotency-KeyheaderstringAny unique string, up to 200 characters, chosen by the caller. A retry with the same key and the same request replays the stored response (with the header Idempotent-Replayed set to true); the same key with a different request is refused. Keys are remembered for 24 hours.
idpathstring (uuid)

Example request

curl "https://api.showpilot.com/v1/webhooks/a0000001-0000-4000-8000-000000000000" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

The updated subscription.

Webhook

FieldTypeAlwaysMeaning
idstring (uuid)yes
urlstring (uri)yes
eventsarray of stringyesEvent types, or ["*"] for all.
descriptionstringyes
statusactive · pausedyes
consecutiveFailuresintegeryes
lastDeliveredAtstring or null (date-time)yes
lastFailedAtstring or null (date-time)yes
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

Errors

StatusWhen
400A parameter is malformed, such as a cursor this API did not issue, a limit under 1, or an unknown status. Code invalid-request.
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
404No object with that id in this workspace. Code not-found.
409The write cannot apply. Code conflict when the object's state refuses it (a follow-up already closed); code idempotency-mismatch when the Idempotency-Key was already used for a different request.
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

Remove a subscription

DELETE /webhooks/{id}

Scope: webhooks:manage. Operation id: deleteWebhook.

Parameters

NameInTypeMeaning
Idempotency-KeyheaderstringAny unique string, up to 200 characters, chosen by the caller. A retry with the same key and the same request replays the stored response (with the header Idempotent-Replayed set to true); the same key with a different request is refused. Keys are remembered for 24 hours.
idpathstring (uuid)

Example request

curl "https://api.showpilot.com/v1/webhooks/a0000001-0000-4000-8000-000000000000" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

Status 204. Removed.

Errors

StatusWhen
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
404No object with that id in this workspace. Code not-found.
409The write cannot apply. Code conflict when the object's state refuses it (a follow-up already closed); code idempotency-mismatch when the Idempotency-Key was already used for a different request.
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

Delivery log for a subscription, newest first

GET /webhooks/{id}/deliveries

Scope: webhooks:manage. Operation id: listWebhookDeliveries.

Parameters

NameInTypeMeaning
idpathstring (uuid)
limitqueryintegerPage size, 1 to 200. Default 50.
cursorquerystringThe nextCursor from the previous page. Opaque; never build one.

Example request

curl "https://api.showpilot.com/v1/webhooks/a0000001-0000-4000-8000-000000000000/deliveries?limit=50" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

One page of deliveries.

FieldTypeAlwaysMeaning
itemsarray of WebhookDeliveryyes
nextCursorNextCursoryes

WebhookDelivery

FieldTypeAlwaysMeaning
idstring (uuid)yes
eventIdstringyes
statuspending · delivered · failedyes
attemptsintegeryes
responseStatusinteger or nullyes
errorstring or nullyes
deliveredAtstring or null (date-time)yes
createdAtstring (date-time)yes

NextCursor

Pass as cursor for the next page; null on the last page.

Errors

StatusWhen
400A parameter is malformed, such as a cursor this API did not issue, a limit under 1, or an unknown status. Code invalid-request.
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
404No object with that id in this workspace. Code not-found.
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

Send an event again

POST /webhooks/{id}/deliveries/{deliveryId}/replay

Scope: webhooks:manage. Operation id: replayWebhookDelivery.

Queues a fresh delivery of the same event to the same endpoint.

Parameters

NameInTypeMeaning
Idempotency-KeyheaderstringAny unique string, up to 200 characters, chosen by the caller. A retry with the same key and the same request replays the stored response (with the header Idempotent-Replayed set to true); the same key with a different request is refused. Keys are remembered for 24 hours.
idpathstring (uuid)
deliveryIdpathstring (uuid)

Example request

curl "https://api.showpilot.com/v1/webhooks/a0000001-0000-4000-8000-000000000000/deliveries/b0000001-0000-4000-8000-000000000000/replay" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

Status 202.

The new delivery, queued.

WebhookDelivery

FieldTypeAlwaysMeaning
idstring (uuid)yes
eventIdstringyes
statuspending · delivered · failedyes
attemptsintegeryes
responseStatusinteger or nullyes
errorstring or nullyes
deliveredAtstring or null (date-time)yes
createdAtstring (date-time)yes

Errors

StatusWhen
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
404No object with that id in this workspace. Code not-found.
409The write cannot apply. Code conflict when the object's state refuses it (a follow-up already closed); code idempotency-mismatch when the Idempotency-Key was already used for a different request.
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

On this page