Webhooks
Your endpoints. The signing secret is never returned here, only once at creation. Cursor-paginated, newest first. limit accepts 1 to 100 and defaults to 20. To walk further, set starting_after to the id of the last record on the page you just read. has_more tells you another page exists and next_cursor is the value to pass back; on the last page has_more is false and next_cursor is null. An unknown cursor is ignored and you get the first page. Requires the webhook:manage permission on the calling key.
Authorization
secretKey Secret API key, server-side only. Example: Bearer TWK_...
In: header
Query Parameters
How many records to return. 1 to 100, defaults to 20.
1 <= value <= 10020A webhook endpoint id; returns the page after it.
^whe_Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/webhooks"{ "object": "list", "data": [ { "id": "string", "object": "webhook_endpoint", "url": "http://example.com", "events": [ "string" ], "status": "active", "api_key_ids": [ "46d53060-1858-4fe7-9116-50b66c33fdea" ], "description": "string", "created_at": "2019-08-24T14:15:22Z" } ], "has_more": true, "next_cursor": "string"}Register a URL to receive events. The response carries signing_secret exactly once: store it now, because it is not recoverable afterwards and no later call will return it. Use it to verify the signature on every delivery.
By default the endpoint serves every API key on the account. Pass api_key_ids to narrow it to named keys, which is how one account routes each product to its own backend. Minting a key later never adds it to an endpoint.
Requires the webhook:manage permission on the calling key.
Authorization
secretKey Secret API key, server-side only. Example: Bearer TWK_...
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/webhooks" \ -H "Content-Type: application/json" \ -d '{ "url": "http://example.com", "events": [ "verification.created" ] }'{ "id": "string", "object": "webhook_endpoint", "url": "http://example.com", "events": [ "string" ], "status": "active", "api_key_ids": [ "46d53060-1858-4fe7-9116-50b66c33fdea" ], "description": "string", "created_at": "2019-08-24T14:15:22Z", "signing_secret": "string"}Issues a new signing_secret for this endpoint and returns it exactly once. The endpoint keeps its id and its delivery history.
THE CUTOVER IS IMMEDIATE and there is no overlap window: the previous secret stops signing as soon as this responds, so any delivery that arrives before you deploy the new one will fail signature verification on your side. Treat it as a coordinated change.
Requires the webhook:manage permission on the calling key.
Authorization
secretKey Secret API key, server-side only. Example: Bearer TWK_...
In: header
Path Parameters
^whe_Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/webhooks/string/rotate_secret"{ "id": "string", "object": "webhook_endpoint", "url": "http://example.com", "events": [ "string" ], "status": "active", "api_key_ids": [ "46d53060-1858-4fe7-9116-50b66c33fdea" ], "description": "string", "created_at": "2019-08-24T14:15:22Z", "signing_secret": "string"}Delivers one sample event to this endpoint, through the real delivery path. It is signed with the endpoint's own secret, recorded in your delivery log, and retried on failure exactly like a real event, so a handler that accepts this is a handler that will accept production traffic.
THE EVENT DOES NOT HAVE TO BE ONE THE ENDPOINT SUBSCRIBES TO. Testing a handler before subscribing to the event is the point: you should not have to put production on verification.rejected to find out whether your branch for it works. The endpoint does have to be active.
The payload is easy to tell apart from a real one. The envelope carries test: true, which real events never do, and every resource id inside data is a clearly fake placeholder such as vs_test000000000000000000, so nothing in it resolves to a real person and a test can never be mistaken for a decision about one.
Responds 202 as soon as the delivery is queued. Whether your server accepted it is answered by the delivery log, not by this response.
Requires the webhook:manage permission on the calling key.
Authorization
secretKey Secret API key, server-side only. Example: Bearer TWK_...
In: header
Path Parameters
^whe_Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/webhooks/string/test" \ -H "Content-Type: application/json" \ -d '{}'{ "id": "string", "object": "webhook_delivery", "endpoint_id": "string", "event": "string", "test": true, "status": "pending", "created_at": "2019-08-24T14:15:22Z"}Change where deliveries go, which events they carry, which keys they cover, or whether the endpoint is active. Send only the fields you are changing.
The endpoint keeps its id and its delivery history, which is the reason to prefer this over delete-and-recreate. The environment cannot be changed, because every delivery already recorded is labelled with it.
Watch api_key_ids in particular: omitting it leaves the routing untouched, while sending [] clears the filter and puts the endpoint back on every key.
Requires the webhook:manage permission on the calling key.
Authorization
secretKey Secret API key, server-side only. Example: Bearer TWK_...
In: header
Path Parameters
^whe_Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Every field is optional; send only what changes. At least one is required. The environment is fixed when an endpoint is registered and cannot be changed, because every delivery already recorded carries it.
OMITTING A FIELD IS NOT THE SAME AS SENDING AN EMPTY VALUE FOR IT. Omitting api_key_ids leaves this endpoint's routing exactly as it is; sending [] CLEARS the filter and returns the endpoint to receiving every key's traffic. Build the body from the fields you are actually changing rather than spreading a partial object with ?? [] defaults, or you will unfilter an endpoint you only meant to rename.
1 <= propertiesResponse Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PATCH "https://example.com/v1/webhooks/string" \ -H "Content-Type: application/json" \ -d '{}'{ "id": "string", "object": "webhook_endpoint", "url": "http://example.com", "events": [ "string" ], "status": "active", "api_key_ids": [ "46d53060-1858-4fe7-9116-50b66c33fdea" ], "description": "string", "created_at": "2019-08-24T14:15:22Z"}Permanently removes the endpoint and stops future deliveries to it. Requires the webhook:manage permission on the calling key.
Authorization
secretKey Secret API key, server-side only. Example: Bearer TWK_...
In: header
Path Parameters
^whe_Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X DELETE "https://example.com/v1/webhooks/string"{ "id": "string", "object": "webhook_endpoint", "deleted": true}verification.created. A verification session was created.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.createdverification.pending. The session is waiting on the applicant.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.pendingverification.awaiting_service. Submissions are in and the checks are queued.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.awaiting_serviceverification.completed. The session reached a terminal state. Fires for every outcome.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.completedverification.approved. The verdict is approve.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.approvedverification.rejected. The verdict is reject.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.rejectedverification.review. The verdict is review and a human needs to look at it.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.reviewverification.expired. The applicant never completed the session in time.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.expiredverification.corrected. An outcome we already sent for this session was wrong, and has been corrected.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.correctedverification.data_updated. Someone on your team edited this verification's applicant data. Fetch it again for the new values.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.data_updatedverification.already_verified. A new verification was attempted for someone this merchant has already approved, and was refused.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.already_verifiedcheck.completed. An individual check inside a verification finished.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/check.completedfraud_network.created. A cross-merchant fraud signal was raised.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/fraud_network.createdfraud_network.modified. An existing fraud signal changed.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/fraud_network.modifiedaction.reviewed. A reviewer reached a decision.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/action.reviewedaction.on_hold. A case was put on hold.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/action.on_holdaction.pending. A case is waiting on a reviewer.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/action.pendingverification.tag_added. One of your own labels was put on a verification.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.tag_addedverification.tag_removed. One of your own labels was taken off a verification.
Return any 2xx promptly. Anything else, including a timeout, is a failed delivery and is retried with exponential backoff.
Two answers mean "not now" rather than "this failed". Reply 429 or 503 and the delivery is deferred WITHOUT consuming an attempt, honoring Retry-After up to 6 hours per deferral and 24 hours overall, after which it fails on the normal ladder. Use them when you are throttling or briefly down, and keep your retry budget for real failures.
Verify the signature on every request before acting on it, and treat the event id as an idempotency key: a delivery you have already processed can arrive again.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
Example Requests
/verification.tag_removed