Zapier webhooks: Catch Hook, POST actions, payload types and plan limits

Webhooks by Zapier receives data with Catch Hook (up to 10MB) or Catch Raw Hook (2MB, headers included) and sends it with GET, POST, PUT or Custom Request actions (up to 5MB). To see exactly what a Zap sends, point the action at a free webhooks.sh bin: no signup, 48 hours, 100 requests a day.

Webhooks by Zapier gives a Zap a Catch Hook URL to receive data, and GET, POST, PUT or Custom Request actions to send it. Below we cover which trigger to pick, how to see what a Zapier action actually sends using a free bin, how payload types and unflatten work, the limits, and which plan includes webhooks.

Which Zapier webhook trigger to use

Catch Hook fits most cases: it accepts GET, PUT or POST requests, parses the body for you, and lets you set Pick Off A Child Key to keep only part of the payload. If you need the request headers or the raw, unparsed body (up to 2MB), use a Zapier Catch Raw Hook instead, and if the other system can't push webhooks at all, pick Retrieve Poll so Zapier checks a URL with GET requests and deduplicates on id or a Deduplication Key you pick.

A few behaviors are worth knowing before you point production traffic at a trigger URL like https://hooks.zapier.com/hooks/catch/123456/zbB61:

  • Zapier always answers with a fixed 200 response, or an empty body if you add silent/ to the URL.
  • Sending a JSON array of objects runs the Zap once for each object in that array.
  • A turned-off or deleted Zap keeps returning 200 for up to several hours before its URL finally switches to 404.
TriggerHow data arrivesBody in the ZapMax size
Catch HookYour app sends GET, PUT or POST to a Zapier URLParsed into fields10MB
Catch Raw HookYour app sends GET, PUT or POST to a Zapier URLUnparsed, with headers2MB
Retrieve PollZapier sends GET requests to your URLJSON array of objects, newest firstNot stated

See exactly what a Zapier webhook action sends

  1. Create a free bin in your browser at view.webhooks.page or run curl -X POST https://webhooks.sh/v1/bins to get an ingest_url and a view_url.
  2. Add a Webhooks by Zapier action to your Zap (POST is the usual choice) and paste the bin's ingest URL into the URL field, such as https://<bin>.webhooks.page/zapier.
  3. Pick a Payload Type, fill in Data and Headers, then test the step in Zapier.
  4. Open the bin's view_url to see the exact HTTP method, Content-Type, headers and body that Zapier sent over the wire.

If you fill in the Basic Auth field with a username and password (or API key), it arrives at the bin as an Authorization header, which the viewer shows as redacted along with any header name containing cookie, key, token or secret. Also keep in mind that the bin replies to every request with a fixed 200 and a small JSON body like {"ok":true,"delivery_id":"..."}, so that's what becomes the step's output in Zapier; a free bin can't stand in for an API whose response values your later steps depend on.

# Create a free bin, then paste its ingest_url into the
# URL field of a Webhooks by Zapier POST action
curl -X POST https://webhooks.sh/v1/bins

Payload types, nesting and unflatten

The Payload Type dropdown sets how Zapier formats the body (Form for URL-encoded, JSON, XML or Raw to send data as-is without parsing fields), and only POST and PUT can send files. The API you're calling decides which format it expects, and pointing the action at a webhooks.sh bin shows you the exact Content-Type header and body format each option produces.

In the Data fields, a double underscore builds a nested object, so item__price and item__sku turn into {"item": {"price": ..., "sku": ...}}. When Payload Type is JSON, setting Unflatten to yes turns a key like parent__child with value hello into {"parent": {"child": "hello"}}, while setting Unflatten to no sends it flat as {"parent__child": "hello"}. Leave the Data section completely blank and Zapier sends every field from the previous step as the payload, which is why extra fields sometimes show up at the receiving end.

When you need nested JSON arrays, empty values, PATCH or DELETE methods, or heavily customized headers, switch to a Zapier Custom Request action. It sends the Data field exactly as you type it without parsing, though it can't send file objects.

# Data: parent__child = hello, Payload Type: JSON

# Unflatten: yes
{"parent": {"child": "hello"}}

# Unflatten: no
{"parent__child": "hello"}

Limits, rate limits and status codes

During high activity Zapier can return 200 and still delay processing your webhook by several minutes, so treat 200 as accepted rather than finished. For anything that doesn't return 200 (such as a 429 when you hit the rate limit of 20,000 requests per 5 minutes per user, or 1,000 per 5 minutes per Zap on legacy routes without a user ID), senders should retry with exponential backoff, as Zapier recommends; see the webhook not received guide for help debugging dropped requests.

LimitValue
Trigger payload10MB
Catch Raw Hook payload2MB
Action payload5MB
Requests per user20,000 every 5 minutes
Requests per Zap on legacy routes1,000 every 5 minutes
Over a rate limit429
Zap turned off or deleted404, after a delay of up to several hours

Which Zapier plan includes webhooks

Zapier's own pages disagree on this. The pricing page lists Webhooks under the Professional plan (from $19.99/month) and marks Connections via webhooks as not included on Free ($0, 100 tasks a month, two-step Zaps), and the app directory labels Webhooks by Zapier a premium app, but Zapier's webhook help articles list the feature as available on Free, Professional, Team and Enterprise. Either way, new accounts start with a free 14-day Professional trial with no credit card required, so you can build and test your Zaps right away.

Keep a test URL for longer

A free bin lasts 48 hours and accepts 100 requests a day (with bodies up to 100KB), which is plenty for testing a few Zap runs. If you want to keep the same webhooks.page URL past 48 hours, claim the bin from the bin page with a free Google sign-in before it expires and it'll keep new requests on a rolling 30-day window.

For ongoing work, Solo ($12 a month on our pricing page) gives you persistent, named endpoints on webhooks.host with 250,000 requests per billing period, payloads up to 5MB, 90 days of history, local replay with the wsh CLI, and forwarding to up to 3 verified HTTPS URLs.

FAQ

Is Webhooks by Zapier free?

Zapier's pricing page puts Webhooks on the Professional plan (from $19.99/month) and calls Webhooks by Zapier a premium app, while its webhook help articles also list the Free plan. New accounts get a 14-day Professional trial with no credit card.

What is the difference between Catch Hook and Catch Raw Hook?

Catch Hook parses the request body into individual fields and accepts payloads up to 10MB. Catch Raw Hook leaves the body unparsed, includes the request headers, and caps payloads at 2MB.

How do I see what a Zapier webhook action sends?

Paste a free bin's ingest URL into the action's URL field and test the step in Zapier. The bin shows the HTTP method, headers and body that Zapier sent.

Why does my Zapier webhook return 200 when the Zap didn't run?

Zapier returns 200 even when high load delays processing by several minutes. A turned-off or deleted Zap also keeps answering 200 for up to several hours before its URL changes to 404.

How do I send nested JSON from Zapier?

Use double underscore keys like item__price in Data with Payload Type set to JSON and Unflatten set to yes, or write the raw JSON yourself in a Custom Request action.

What is the Zapier webhook payload size limit?

The limit is 10MB for triggers, 2MB for Catch Raw Hook, and 5MB for actions.

Last updated

Try it in 10 seconds.

Create a free bin at view.webhooks.page — no signup, no install. Point your sender at the URL and watch requests land live. Bins expire after 48 hours.