Webhook Examples

What 30 providers actually send — headers, payload and signature — and a webhook URL you can create here to catch a real request and read it.

No webhook URL yet. Creating one needs no account.

Request details
Requests sent to your webhook URL appear here: method, headers and the body exactly as it arrived.

The sample button posts a small generic JSON request to your URL from your browser, so you can see how a delivery is recorded.

Last updated . How this page is checked.

How the webhook URL works. It is a public address that records whatever is sent to it and answers 200. An inbox keeps the 50 most recent requests, accepts bodies up to 256 KB, and is deleted 24 hours after it was created — or sooner if you press Delete URL or our server restarts, because requests are held in memory and never written to disk.

Anyone who has the URL can read what it received. Use sandbox and test-mode accounts, do not route production traffic or customer data through it, and delete it when you are done. Privacy details.

What is a webhook?

A webhook is an HTTP request that one service sends to a URL you give it when something happens: a payment succeeds, a commit is pushed, a message arrives. Instead of your code asking an API again and again whether anything has changed, the provider calls you. In practice that is a POST with a JSON or form-encoded body, a few provider-specific headers, and usually a signature you are expected to check before trusting any of it. Your endpoint answers quickly with a 2xx and does the real work afterwards. The guide to what a webhook is goes through each of those steps, with the signature check and the retry rules in full.

Examples by provider

Stripe Webhook Example

What Stripe actually sends to your endpoint — the event envelope, the Stripe-Signature header and the retry behaviour — with a webhook URL you can create here to catch a real one.

GitHub Webhook Example

The headers and JSON GitHub posts when a repository event fires, how X-Hub-Signature-256 is computed, and what happens when your endpoint is down.

PayPal Webhook Example

The notification PayPal posts when a payment event happens — its envelope, the five PAYPAL- headers, and the certificate-based signature that works differently from everyone else's HMAC.

Shopify Webhook Example

What Shopify posts when a store event fires — the topic and shop headers, the resource JSON, and a base64 HMAC that trips up people expecting hex.

Zapier Webhook Example

Zapier works in both directions.

Slack Webhook Example

The JSON Slack's Events API posts to your Request URL, the one-time url_verification handshake, and the v0 signature that covers a timestamp as well as the body.

Discord Webhook Example

A Discord webhook runs the other way from most: you send the request, and Discord posts it in a channel.

Twilio Webhook Example

Twilio's webhooks are form posts, not JSON, and the signature covers your URL as well as the parameters.

GitLab Webhook Example

The JSON a GitLab project webhook posts on a push, the headers that describe it, and the secret token that is compared rather than computed.

Telegram Webhook Example

The Update object Telegram posts to a bot's webhook, the optional secret-token header, and the trick of answering with an API call in the response body.

SendGrid Webhook Example

SendGrid's Event Webhook posts a batch — a JSON array of email events — and signs it with ECDSA rather than an HMAC.

WooCommerce Webhook Example

What a WooCommerce store posts when an order, product or customer changes — the X-WC-Webhook-* headers, the REST-shaped JSON, and the rule that switches a failing webhook off.

Mailchimp Webhook Example

Mailchimp audience webhooks are form posts with bracketed field names, and they carry no signature at all.

HubSpot Webhook Example

HubSpot delivers CRM events in batches: one request, a JSON array, each element a small notification that names a record without containing it.

Square Webhook Example

Square signs the notification URL together with the body, so a request that is perfectly genuine fails verification when your server disagrees about its own address.

Bitbucket Webhook Example

Bitbucket Cloud webhooks look like GitHub's at first glance and differ in the details that break copied code: the event name header, the signature header's name, and the shape of a push.

Jira Webhook Example

A Jira webhook delivers the whole issue plus a changelog of exactly what was edited.

Mailgun Webhook Example

Mailgun puts its signature inside the JSON body instead of in a header, and that signature covers a timestamp and a token rather than the event itself.

Typeform Webhook Example

A Typeform webhook sends one form submission: the questions as they were defined and the answers as they were given, in two separate arrays you have to join yourself.

Calendly Webhook Example

Calendly webhooks are created through the API rather than a settings page, and they describe everything by URI.

Linear Webhook Example

A Linear webhook reports a change to one entity — an issue, a comment, a project — and, on updates, tells you the previous values of whatever changed.

Clerk Webhook Example

Clerk delivers its webhooks through Svix, so the three svix- headers and their signing scheme are shared with every other service that uses the same infrastructure.

Paddle Webhook Example

Paddle Billing notifications look a lot like Stripe's until you parse the signature header, which uses different separators and joins the timestamp to the body differently.

Razorpay Webhook Example

Razorpay wraps each event's entities inside payload under their own names, and signs the body with a secret you choose when creating the webhook.

Twitch Webhook Example

Twitch EventSub sends three kinds of message to the same URL, told apart by a header: a challenge to prove you own the endpoint, the notifications themselves, and a revocation when a subscription ends.

Zoom Webhook Example

Zoom will not save a webhook endpoint until it has answered a validation challenge with a hash made from the app's Secret Token, and it repeats that check from time to time.

WhatsApp Webhook Example

WhatsApp Cloud API webhooks come from Meta's shared webhook system: a GET challenge when you register the URL, then deeply nested JSON for every incoming message and every delivery status.

Dropbox Webhook Example

A Dropbox webhook tells you who has changes and nothing about what changed.

Asana Webhook Example

Asana hands you the signing secret instead of asking for one: it arrives once, in a header, during a handshake your endpoint has to answer.

Okta Webhook Example

An Okta event hook delivers System Log events to your endpoint, authenticated by a header and secret you choose rather than by a signature.

How the providers differ

"Verify the signature" is one sentence that means a different procedure for almost every sender. The table below is the short version; each provider's page has the header list, a verification function and the details.

ProviderBodyHow the request is authenticatedHeaderRetries a failed delivery?
StripeJSONHMAC-SHA256, hex, over timestamp + bodyStripe-SignatureYes — backoff over days
GitHubJSON or formHMAC-SHA256, hex, over bodyX-Hub-Signature-256No — redeliver manually
PayPalJSONRSA signature, verified by certificate or APIPAYPAL-TRANSMISSION-SIGYes — over days
ShopifyJSONHMAC-SHA256, base64, over bodyX-Shopify-Hmac-Sha256Yes — over hours
ZapierForm by default, or JSONNone — add your own secret header—Not automatically
SlackJSONHMAC-SHA256, hex, over timestamp + bodyX-Slack-SignatureYes — a few attempts
DiscordJSON (you send it)None — the URL is the secret—You handle 429s
TwilioForm-encodedHMAC-SHA1, base64, over URL + paramsX-Twilio-SignatureFallback URL instead
GitLabJSONPlain secret token, comparedX-Gitlab-TokenDisables failing hooks
TelegramJSONPlain secret token, comparedX-Telegram-Bot-Api-Secret-TokenYes — limited attempts
SendGridJSON array (batched)ECDSA, base64, over timestamp + bodyX-Twilio-Email-Event-Webhook-SignatureYes — about a day
WooCommerceJSONHMAC-SHA256, base64, over bodyX-WC-Webhook-SignatureNo — disables after 5 failures
MailchimpForm-encodedNone — put a secret in the URL—Yes — for about an hour
HubSpotJSON array (batched)HMAC-SHA256, base64, over method + URL + body + timestampX-HubSpot-Signature-v3Yes — over about a day
SquareJSONHMAC-SHA256, base64, over URL + bodyx-square-hmacsha256-signatureYes — over about a day
BitbucketJSONHMAC-SHA256, hex, over bodyX-Hub-SignatureYes — a few attempts
JiraJSONHMAC-SHA256, hex, over body, if a secret is setX-Hub-SignatureYes — a few attempts
MailgunJSONHMAC-SHA256, hex, over timestamp + token, carried in the body—Yes — over hours, unless you answer 406
TypeformJSONHMAC-SHA256, base64, over bodyTypeform-SignatureSome failures; 404 or 410 disables it
CalendlyJSONHMAC-SHA256, hex, over timestamp + bodyCalendly-Webhook-SignatureYes — over about a day
LinearJSONHMAC-SHA256, hex, over bodyLinear-SignatureYes — a few attempts
ClerkJSONHMAC-SHA256, base64, over id + timestamp + bodysvix-signatureYes — over about a day
PaddleJSONHMAC-SHA256, hex, over timestamp + bodyPaddle-SignatureYes — over days
RazorpayJSONHMAC-SHA256, hex, over bodyX-Razorpay-SignatureYes — over about a day
TwitchJSONHMAC-SHA256, hex, over message id + timestamp + bodyTwitch-Eventsub-Message-SignatureYes — then revokes the subscription
ZoomJSONHMAC-SHA256, hex, over timestamp + bodyx-zm-signatureYes — a few attempts
WhatsAppJSONHMAC-SHA256, hex, over bodyX-Hub-Signature-256Yes — over days
DropboxJSON (account ids only)HMAC-SHA256, hex, over bodyX-Dropbox-SignatureYes — then disables the URI
AsanaJSON (compact events)HMAC-SHA256, hex, over body, with a secret Asana issues in the handshakeX-Hook-SignatureYes — then deletes the webhook
OktaJSON (batched events)Plain secret in a header you name, comparedAuthorizationAt most once

Three patterns cover most of it. A body HMAC (GitHub, Shopify, WooCommerce) proves who sent the request and that it was not altered, but not when it was sent. A timestamped HMAC (Stripe, Slack) adds freshness, so a captured request cannot be replayed later. A plain token (GitLab, Telegram) only proves the sender knows the secret, which makes HTTPS mandatory. The webhook tester guide goes through verification, retries and idempotent handlers in depth.

Using a webhook URL to debug an integration

  1. Create a webhook URL above and copy it.
  2. Register it as the endpoint in the provider's sandbox or test mode.
  3. Trigger an event — a test payment, a push, a message.
  4. Read the request: which headers arrived, what the content type is, how the body is shaped.
  5. Replay it against your own server with Open in API Tester or Copy as cURL.

That replaces the usual first hour of an integration — deploying a handler just to log what the provider sends. It does not replace a tunnel when you need to step through your own code on a real delivery with a live signature; a replayed request is only as fresh as its timestamp.

Specifications and references

  • RFC 2104: HMAC — The keyed-hash construction behind most webhook signatures.
  • Standard Webhooks — An open specification for webhook headers, signatures and retries that several providers follow.
  • CloudEvents — A CNCF specification for describing event data in a common way.
  • Node.js: crypto.timingSafeEqual() — The constant-time comparison the verification functions on these pages use.

These links leave api-tester.com, which is independent of the companies and projects they point to.

Webhook examples FAQ

What is a webhook example?

A captured or representative HTTP request from a provider: the method, the headers it sets, and the body it sends. Reading one tells you what your endpoint has to parse and verify before you write any code.

Are these real payloads?

They follow each provider's documented format, but every id, token and signature is a placeholder. A sample signature will not verify. To see a genuine delivery, create a webhook URL and register it with the provider's sandbox.

How do I get a URL to receive webhooks?

Press Create webhook URL on any page in this section. You get a public HTTPS address that records the requests sent to it for 24 hours, with no account.

Why do signature checks fail on a payload that looks correct?

Because the signature covers the exact bytes that were sent. Parsing the JSON and serialising it again changes whitespace or key order, so verify against the raw request body.

Do all providers sign webhooks the same way?

No. Most use an HMAC-SHA256 of the body with a shared secret, but the encoding differs between hex and base64, some include a timestamp, Twilio signs the URL and parameters with HMAC-SHA1, PayPal and SendGrid use public-key signatures, and GitLab and Telegram send a plain secret token.