Mock a Stripe webhook payload
A GET mock that returns a Stripe-shaped payment_intent.succeeded event, ready to feed into your webhook handler.
This template gives you a live URL that returns a Stripe-shaped payment_intent.succeeded event, so you can build and debug a webhook handler without triggering real payments. Point your handler at the URL, or copy the payload straight into a test fixture. It reproduces the event's shape, not Stripe's signature — so it is the right tool for parsing logic and the wrong one for verifying Stripe-Signature.
Returns a ready-made event — feed it straight into your own handler.
Response payload
{
"id": "evt_1QsErTLl2dK9Nqi7",
"object": "event",
"type": "payment_intent.succeeded",
"created": {{now.unix}},
"data": {
"object": {
"id": "pi_3QsErTLl2dK9Nqi71m2XvBnR",
"object": "payment_intent",
"amount": 4999,
"currency": "usd",
"status": "succeeded"
}
}
}
Fields worth knowing
| Field | What it means |
|---|---|
| id | A synthetic event ID — Stripe's real IDs follow the same evt_... shape but are never reused. |
| type | The event type your handler switches on; change it to trigger a different code path. |
| created | Unix timestamp of the event, generated fresh on every call via {{now.unix}}. |
| data.object.amount | The charge amount in minor units (cents) — 4999 means $49.99. |
| data.object.status | The payment_intent status; edit the response body to test other states like requires_action. |
Create the mock
curl -X POST https://quickmock.dev/api/mocks \
-H 'Content-Type: application/json' \
-d '{
"method": "GET",
"response_status": 200,
"content_type": "application/json",
"response_body": "{\"id\":\"evt_1QsErTLl2dK9Nqi7\",\"object\":\"event\",\"type\":\"payment_intent.succeeded\",\"created\":{{now.unix}},\"data\":{\"object\":{\"id\":\"pi_3QsErTLl2dK9Nqi71m2XvBnR\",\"object\":\"payment_intent\",\"amount\":4999,\"currency\":\"usd\",\"status\":\"succeeded\"}}}"
}'
Call it
curl https://quickmock.dev/m/<slug>
What you get
GET /m/<slug> -> 200 a Stripe-style payment_intent.succeeded event
data.object.amount is in minor units (cents)
How this differs from the real thing
This is a static event trimmed down from a real Stripe payload — no Stripe-Signature header, no live objects behind the IDs. Use it to shape your handler's parsing logic, not to test signature verification.
Sources
- Stripe: the payment_intent.succeeded event
- Stripe: webhook endpoints and delivery
- Stripe: verifying webhook signatures
FAQ
- Is this the real Stripe API?
- No. It is a static event trimmed from a real Stripe payload and served from your own mock URL. The IDs are synthetic and nothing exists behind them — no charge, no customer, no live object to fetch.
- Can I test signature verification with it?
- No, and that is deliberate. There is no Stripe-Signature header, because producing one would need Stripe's signing secret. Test verification against Stripe's own CLI; use this for everything after the signature check passes.
- How do I test a different event type?
- Edit the response body and change the type field, plus whatever the new event carries under data.object. That is the fastest way to exercise a branch of your handler you cannot easily trigger in Stripe's test mode.
Ready to use it?
Pairs well with this guide: Test a webhook receiver
Related templates
Last updated: 2026-10-17