Skip to content
Stripe webhook tester

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. 1. Configure

    Create an endpoint, then add its Webhook URL in Stripe Workbench as a sandbox Snapshot destination for payment_intent.succeeded.

  2. 2. Send

    Complete a synthetic sandbox payment that produces payment_intent.succeeded, then open Stripe's delivery record.

  3. 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. 4. Diagnose

    If no request appears, compare the receiving URL, sandbox environment, selected event and Stripe delivery result.

Explore the inspectorSample data

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.

Requests1 sample
POST

/

200
200 OK3 msapplication/json478 B

Payload 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
Request captured

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.

Ready to inspect a request?