Skip to content

Webhooks API

Outgoing webhooks belong to a project. The API creates and manages them, sends test events, and lists and redelivers each webhook’s deliveries. For the events and payloads a receiver gets, read Outgoing webhooks for developers. For the behavior in the app, read the Webhooks guide.

  • Reads need the integrations.manage permission (held by owner/admin).
  • Writes need the same permission and a plan that includes webhooks, Pro or Enterprise. On other plans, writes return 403 forbidden.
  • Writes are limited to 120 per hour for each organization. Above the limit, the API returns 429 with too_many_requests.
  • {projectId} is the project code, such as CHK, the same as on the other project routes.
  • Write requests accept the optional Idempotency-Key header. See Idempotency-Key.
  • A project has at most 20 webhooks, so the list is not paged.
MethodPathSuccess
GET/api/v1/projects/{projectId}/webhooks200 list of webhooks
POST/api/v1/projects/{projectId}/webhooks201 webhook and its secret
GET/api/v1/projects/{projectId}/webhooks/{webhookUlid}200 webhook
PATCH/api/v1/projects/{projectId}/webhooks/{webhookUlid}200 webhook
DELETE/api/v1/projects/{projectId}/webhooks/{webhookUlid}204
POST/api/v1/projects/{projectId}/webhooks/{webhookUlid}/rotate-secret200 new secret
POST/api/v1/projects/{projectId}/webhooks/{webhookUlid}/test201 test delivery
GET/api/v1/projects/{projectId}/webhooks/{webhookUlid}/deliveries200 page of deliveries
GET/api/v1/projects/{projectId}/webhooks/{webhookUlid}/deliveries/{deliveryUlid}200 delivery with request and response
POST/api/v1/projects/{projectId}/webhooks/{webhookUlid}/deliveries/{deliveryUlid}/redeliver202 new delivery
GET/api/v1/projects/{projectId}/webhooks

Returns every webhook in the project as { items }. Each item follows the webhook fields.

Terminal window
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://app.probara.net/api/v1/projects/CHK/webhooks"
POST/api/v1/projects/{projectId}/webhooks
FieldRequiredNotes
nameyes1 to 120 characters
urlyesA public https:// URL, with no credentials, IP address or local hostname, up to 2,000 characters. Redirects are not followed.
eventssee noteUnique event names from the catalog. Required unless allEvents is true.
allEventsnotrue subscribes the webhook to every event, including events added later. Defaults to false.
enablednoDefaults to true.
methodnoPOST (default), PUT or PATCH
headersnoUp to 20 objects with name and value. Each name appears once, regardless of case. Names Probara sets itself, and names starting with cf-, are refused. A value is up to 4,096 characters, with no line breaks.
payloadno{"format":"standard"} (default), or {"format":"custom","contentType":"...","template":"..."}. contentType defaults to application/json. A template is 1 to 16,384 characters, and a JSON template must render valid JSON.
secretnoA whsec_ secret that encodes 24 to 64 bytes in base64. Omit it to have Probara generate one.

201 with the webhook fields and a secret field. The secret is returned only here and by rotate. Store it then.

An invalid body returns 422 validation_failed, for example no events without allEvents, a URL the endpoint rules refuse, an invalid template, or a project that already has 20 webhooks.

Terminal window
curl -sS -X POST \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Release alerts","url":"https://hooks.example.com/probara","allEvents":true}' \
"https://app.probara.net/api/v1/projects/CHK/webhooks"
GET/api/v1/projects/{projectId}/webhooks/{webhookUlid}

Returns one webhook. An unknown webhookUlid returns 404 not_found.

Terminal window
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://app.probara.net/api/v1/projects/CHK/webhooks/01JC8Z3N0A1B2C3D4E5F6G7H8J"
PATCH/api/v1/projects/{projectId}/webhooks/{webhookUlid}

Partial update. At least one field is required. To change the secret, use rotate.

FieldRequiredNotes
nameno1 to 120 characters
urlnoThe same rules as on create
eventsnoA non-empty list of event names, unless allEvents is true
allEventsnotrue or false
enablednotrue or false. Enabling a webhook resets its count of failed deliveries.
methodnoPOST, PUT or PATCH
headersnoThe same rules as on create. The list replaces the stored headers: a name left out is removed. A header without value keeps the value already stored under that name.
payloadnoThe same rules as on create
Terminal window
curl -sS -X PATCH \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled":false}' \
"https://app.probara.net/api/v1/projects/CHK/webhooks/01JC8Z3N0A1B2C3D4E5F6G7H8J"
DELETE/api/v1/projects/{projectId}/webhooks/{webhookUlid}

Returns 204 on success, and deletes the webhook’s delivery history with it. An unknown webhookUlid returns 404 not_found.

Terminal window
curl -sS -X DELETE \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://app.probara.net/api/v1/projects/CHK/webhooks/01JC8Z3N0A1B2C3D4E5F6G7H8J"
POST/api/v1/projects/{projectId}/webhooks/{webhookUlid}/rotate-secret

Replaces the signing secret. The response returns the new secret once. The current secret stops verifying requests as soon as you rotate it, so update your receiver with the new secret right away.

200 with { "secret": "whsec_...", "secretHint": "..." }. secretHint holds the last four characters of the new secret.

Terminal window
curl -sS -X POST \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://app.probara.net/api/v1/projects/CHK/webhooks/01JC8Z3N0A1B2C3D4E5F6G7H8J/rotate-secret"
POST/api/v1/projects/{projectId}/webhooks/{webhookUlid}/test

Sends one sample event to the webhook, with test set to true. The request is attempted once, synchronously, with no retries. A test never counts toward the failure count.

FieldRequiredNotes
eventTypenoAn event name from the catalog. The sample event has this type. Defaults to the webhook’s first subscribed event, or test_case.created when allEvents is true.

201 with a delivery detail. 409 conflict when the webhook is disabled, or when the sample body is over 256 KiB.

Terminal window
curl -sS -X POST \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"eventType":"test_run.closed"}' \
"https://app.probara.net/api/v1/projects/CHK/webhooks/01JC8Z3N0A1B2C3D4E5F6G7H8J/test"
GET/api/v1/projects/{projectId}/webhooks/{webhookUlid}/deliveries

Page-based pagination.

ParameterNotes
pagePage number (1-based, default 1)
pageSizeItems per page (default 50, max 200)
statuspending, succeeded or failed

200 with { items, page, pageSize, total }. Each item follows the delivery fields.

Terminal window
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://app.probara.net/api/v1/projects/CHK/webhooks/01JC8Z3N0A1B2C3D4E5F6G7H8J/deliveries?status=failed"
GET/api/v1/projects/{projectId}/webhooks/{webhookUlid}/deliveries/{deliveryUlid}

Returns the delivery fields plus the request Probara sent and the response it received. Custom header values in request.headers appear as [redacted].

Terminal window
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://app.probara.net/api/v1/projects/CHK/webhooks/01JC8Z3N0A1B2C3D4E5F6G7H8J/deliveries/01JC8Z3P9Q8R7S6T5V4W3X2Y1Z"
POST/api/v1/projects/{projectId}/webhooks/{webhookUlid}/deliveries/{deliveryUlid}/redeliver

Sends the same event again as a new delivery, with the same event ID and body, to the webhook’s current URL, method and headers. The new delivery’s redeliveryOf holds the ULID of the delivery it resends. Redeliveries count toward the failure count.

202 with the new delivery fields. 409 conflict when the webhook is disabled, or when the delivery’s body was never sent because it was over 256 KiB.

Terminal window
curl -sS -X POST \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://app.probara.net/api/v1/projects/CHK/webhooks/01JC8Z3N0A1B2C3D4E5F6G7H8J/deliveries/01JC8Z3P9Q8R7S6T5V4W3X2Y1Z/redeliver"

Create, get, list and update responses return these fields. Times are Unix epoch milliseconds.

FieldTypeNotes
ulidstring (ULID)Server-assigned identifier
projectUlidstring (ULID)The project this webhook belongs to
namestringDisplay name
urlstringEndpoint URL
enabledbooleanWhether events are sent
disabledReasonmanual, failures or nullWhy the webhook is off: manual when a person turned it off, failures when Probara switched it off after failed deliveries
disabledAtnumber or nullWhen it was switched off
eventsstring[]Subscribed event names
allEventsbooleantrue when the webhook receives every event
methodstringPOST, PUT or PATCH
headers{ name }[]Header names only. Values are write-only.
payloadobjectThe payload settings, as sent on create
secretHintstringThe last four characters of the signing secret
consecutiveFailuresnumberFailed deliveries in a row
lastDeliveryAtnumber or nullWhen the most recent delivery was made
lastDeliveryStatuspending, succeeded, failed or nullStatus of the most recent delivery
lastSuccessAtnumber or nullWhen the last successful delivery was made
createdAtnumberWhen the webhook was created
updatedAtnumberWhen the webhook was last changed

Delivery responses return these fields. Times are Unix epoch milliseconds.

FieldTypeNotes
ulidstring (ULID)Delivery identifier
webhookUlidstring (ULID)The webhook
eventIdstring (ULID)The event. Equal to the webhook-id header.
eventTypestringThe event name
testbooleantrue for a test delivery
redeliveryOfstring (ULID) or nullThe delivery this one resends
statuspending, succeeded or failedCurrent status
attemptsnumberAttempts made so far
createdAtnumberWhen the delivery was created
lastAttemptAtnumber or nullWhen the last attempt was made
nextAttemptAtnumber or nullWhen the next retry is due
responseStatusnumber or nullHTTP status of the last attempt
durationMsnumber or nullHow long the last attempt took
errorstring or nullWhy the delivery failed without a 2xx response, such as a timeout, a DNS or TLS error, a redirect, or a body over 256 KiB

A delivery detail adds two objects:

FieldTypeNotes
requestobjectmethod, url, headers and body that Probara sent. Custom header values appear as [redacted].
responseobject or nullstatus, headers and body the endpoint returned. The body is kept up to 4,096 bytes, and bodyTruncated says whether it was cut.
StatusCodeWhen
401unauthorizedThe token is missing, invalid or revoked
403forbiddenThe token lacks integrations.manage, or a write is made on a plan without webhooks
404not_foundThe webhook or delivery is unknown
409conflictA test or a redelivery is requested for a disabled webhook, a redelivery is requested for a delivery whose body was never sent, or a test body is over 256 KiB
422validation_failedThe body or a query parameter is invalid, including a URL the endpoint rules refuse, or a project already has 20 webhooks
429too_many_requestsThe write rate limit was exceeded

Creating, updating and deleting a webhook, rotating its secret, and switching it off automatically emit webhook.created, webhook.updated, webhook.deleted, webhook.secret_rotated and webhook.auto_disabled on the organization activity feed. See Audit events.