Test Stripe webhooks without setting up a local server.
See what Stripe sends before wiring it into your application. Capture a test delivery, open its JSON body and compare the headers with your expectations.
No account required. Your new endpoint opens in the workspace.
From URL to captured request
1. Configure
Create an endpoint, then add its Webhook URL in Stripe Workbench as a sandbox Snapshot destination for payment_intent.succeeded.
2. Send
Complete a synthetic sandbox payment that produces payment_intent.succeeded, then open Stripe's delivery record.
3. Expected result
One POST appears in history with the Snapshot JSON and Stripe-Signature header; a new endpoint returns HTTP 200 by default.
4. Diagnose
If no request appears, compare the receiving URL, sandbox environment, selected event and Stripe delivery result.
Select a request, then explore its body, headers and query. These synthetic samples stay in your browser; this demo creates no endpoint and sends no webhook.
/
200Payload preview
{ "id": "evt_synthetic_001", "object": "event", "api_version": "2026-09-30.preview", "type": "payment_intent.succeeded", "created": 1767271333, "livemode": false, "pending_webhooks": 1, "request": { "id": "req_synthetic_001", "idempotency_key": "synthetic-payment-001" }, "data": { "object": { "id": "pi_synthetic_001", "object": "payment_intent", "amount": 4900, "currency": "usd", "status": "succeeded" } }}Transport details
- Request URL
- https://receiver.example/e/sample/
- Received at (UTC)
- 01/01/2026, 12:42:13
- Source IP
- 192.0.2.10
- Content type
- application/json
- Payload size
- 478 B
- Request ID
- 00000000-0000-4000-8000-000000000001
- Response
- 200 OK
- Processing time
- 3 ms
Understand the synthetic example
Reduced synthetic Snapshot event. id identifies the event; type names payment_intent.succeeded; created is its Unix timestamp; livemode=false marks sandbox data; api_version records the version used to render data.object. The nested PaymentIntent has its own id, succeeded status, amount and currency. pending_webhooks counts outstanding destinations, while request identifies the API request when available. Stripe-Signature contains t (timestamp) and v1 (signature); this demonstrative placeholder is cryptographically invalid. Your handler must verify the original request bytes with its signing secret. Capture alone does not verify authenticity.
Reduced example · headers and JSON body
content-type: application/json
stripe-signature: t=1767271333,v1=ILLUSTRATIVE_NOT_VALID
{
"id": "evt_synthetic_001",
"object": "event",
"api_version": "2026-09-30.preview",
"type": "payment_intent.succeeded",
"created": 1767271333,
"livemode": false,
"pending_webhooks": 1,
"request": {
"id": "req_synthetic_001",
"idempotency_key": "synthetic-payment-001"
},
"data": {
"object": {
"id": "pi_synthetic_001",
"object": "payment_intent",
"amount": 4900,
"currency": "usd",
"status": "succeeded"
}
}
}Illustrative signatures do not validate. No production data or signing secret is included.
Missing from request history?
If the request is missing from history, confirm that Stripe used the receiving URL rather than the workspace URL, the endpoint is active, and payment_intent.succeeded is selected in the same sandbox.
Follow the complete Stripe webhook guide for setup, expected fields and troubleshooting.
Read the delivery before writing the handler
Compare the event type and data in Body, inspect the captured headers and check when the request arrived. Use Configure response to return a different status, headers or body when exploring sender behavior.
Stripe webhook documentation · WebhookKit quickstart
Capture scope and limits
WebhookKit captures the request but does not validate Stripe signatures or your application logic.
Endpoints expire, and captured requests have a separate retention period. Check your workspace’s expiry and current usage limits. Use test data for debugging.