# Zapier Webhooks: Catch Hook Setup, Payloads and Testing

> Set up Webhooks by Zapier Catch Hook to receive data from another system, send JSON or form payloads, test with curl, handle nested data and stay within rate limits.

Source: https://www.epifive.com/blog/zapier-webhooks-catch-hook-guide · Published 2026-10-25 · EpiFive

## Key takeaways

- Webhooks by Zapier Catch Hook gives your Zap a unique URL that another system can send requests to, and it requires a Professional, Team or Enterprise plan.
- Catch Hook parses the body, while Catch Raw Hook keeps the body unparsed with headers and a 2 MB limit.
- A JSON array of objects triggers one Zap run per object, while the same array wrapped in a single object triggers one run.
- Send a real test request first, then use the Test trigger step so that Zapier can load sample data for mapping.
- The limit is 20,000 requests per 5 minutes per user, and a 429 means you should retry with exponential backoff.

To receive data from another system in Zapier, start a Zap with the Webhooks by Zapier trigger, choose the Catch Hook event, copy the unique URL it gives you, and configure the other system to send a POST request to that URL. Then send a test request and use Test trigger so Zapier can load the sample fields for the rest of the Zap.

## Who this is for and what you will have

This guide is for people who need to connect an application that has no Zapier integration, such as an internal tool, a form service or a custom script, to the apps in Zapier. By the end you will have a working Catch Hook trigger, a tested payload, an understanding of how nested data appears, and a plan for rate limits and failures.

## Prerequisites

- A Zapier plan that includes Webhooks by Zapier. Zapier's help pages list it for Professional, Team and Enterprise, and mark the Free plan as not eligible.
- The ability to configure the sending system to make an HTTP request, or a terminal with `curl` for testing.
- A decision on the payload format. The examples below use JSON and form-encoded bodies, and you should confirm any other format by sending a test request.

## Choose the trigger event

Webhooks by Zapier has three events relevant to receiving data. Zapier's help article describes them as follows:

| Event | What it does | Use when |
| --- | --- | --- |
| Catch Hook | Parses the request body and gives you a unique URL for requests | The sender posts data you want to map into later steps |
| Catch Raw Hook | Does not parse the body, includes headers, and the unparsed body has a 2 MB maximum | You need headers or the original body, for example to process it in code |
| Retrieve Poll | Zapier makes a GET request to an external URL to check for new entries | The other system cannot call you, but exposes a URL Zapier can poll |

This guide covers Catch Hook. The maximum webhook payload size is 10 MB for triggers and 2 MB for Catch Raw Hook, according to the same page.

## Set up a Catch Hook trigger

1. In the Zap editor, select the trigger step and search for **Webhooks by Zapier**.
2. For **Event**, choose **Catch Hook**, then select **Continue**.
3. Optionally set **Pick Off A Child Key** to receive only a subset of the incoming data, for example one key from a larger object. Select **Continue**.
4. On the **Test** tab, select **Copy** to copy the webhook URL.
5. In the sending application, add a new webhook, paste the URL, choose the options it offers and save.
6. Trigger an event in the sending application.
7. Return to the Zap's **Test** tab and select **Test trigger**.

The trigger needs real data to test against, so create the event in the sending application before you test. If nothing arrives, repeat the event and recheck the URL you pasted.

### Treat the URL as a secret

Each webhook URL is unique, and Zapier notes that it contains the owner's Zapier ID. It changes only if the Zap is transferred to another user, and after a transfer you must update the URL in the sending application or the Zap will not trigger. The help pages used for this article do not describe authentication or signature checks on incoming requests, so assume that anyone who has the URL can send data to your Zap. Do not publish it in code repositories or public pages, and add your own validation, such as a shared token field that a Filter step checks, if the data is sensitive.

## Send a test request

For a quick test, send a POST with a JSON body. Zapier's own example uses this shape, with the URL replaced by yours:

```bash
curl -v -H "Content-Type: application/json" -X POST \
  -d '{"first_name":"Alex","last_name":"Riley","age":27}' \
  https://hooks.zapier.com/hooks/catch/123456/abcdef/
```

The URL above is a placeholder. Use the exact URL you copied from the Test tab. Always include data in the body so that the test has fields to load.

Zapier suggests this order for building a Zap: create the Zap and set up the URL without turning it on, send a test webhook, and then select **Load Samples** to see the data. After the sample loads, map its fields in later steps.

### Form-encoded payloads

A form-encoded payload looks like `first_name=Alex&last_name=Riley&age=27`. Send it as `application/x-www-form-urlencoded`:

```bash
curl -v -X POST \
  -d "first_name=Alex&last_name=Riley&age=27" \
  https://hooks.zapier.com/hooks/catch/123456/abcdef/
```

## Understand nested data and arrays

### Nested JSON

The Zapier help pages used for this article do not describe how nested objects appear in the field picker, so check it yourself. Send a nested sample such as the one below, select **Load Samples**, and note the field names Zapier shows before you map them. The **Pick Off A Child Key** option in the trigger setup can narrow the data to one nested key.

```json
{
  "order_id": "A-1001",
  "contract_winner": {
    "first_name": "Alex",
    "last_name": "Riley"
  }
}
```

### One request, many Zap runs

A webhook trigger can receive an array of objects. Zapier then runs the later steps once for each object. The help article states that wrapping the same array in a single object results in only one run. Each object that runs successful action steps uses tasks, so a large array can use many tasks. For how tasks are counted, see [Zapier vs Power Automate: Pricing and Fit for a Small Business](https://www.epifive.com/blog/zapier-vs-power-automate-small-business).

## Responses, silent mode and what the sender sees

For a live webhook URL, Zapier returns a success response by default, and it cannot be customised. The trigger article says that with Catch Raw Hook you can remove the response body by adding `silent/` to the URL, and the general webhook guide says that adding `/silent` to the end of a catch URL helps when the sending app needs an empty response body. If a Zap is turned off or deleted, the URL returns a 404, though because of an update delay of up to several hours it may keep returning 200 for a while.

Zapier also notes that webhooks may delay passing data to later steps when many requests arrive at once. A 200 therefore means the request was accepted, not that your Zap has finished.

## Rate limits and retries

Zapier's webhook rate limit article states:

| Limit | Value |
| --- | --- |
| Per user | 20,000 requests in a 5-minute window |
| Legacy routes without a Zapier user ID in the URL | 1,000 requests per 5 minutes per Zap |
| Over the limit | A 429 status code |

During high webhook activity, Zapier may return a 200 and delay processing by several minutes. Its recommendations are to retry delivery for any request that does not return a 200, and to use an exponential backoff interval between retries. If a step in the Zap hits another app's limit, you can replay the Zap run, add a Delay After Queue step to spread out the work, or adjust the flood protection limit for the Zap, which needs a paid plan. A sender written as a script should follow this logic:

```bash
# Retry with exponential backoff until Zapier returns HTTP 200
for delay in 1 2 4 8 16; do
  code=$(curl -s -o /dev/null -w "%{http_code}" -X POST \
    -H "Content-Type: application/json" \
    -d '{"order_id":"A-1001"}' \
    https://hooks.zapier.com/hooks/catch/123456/abcdef/)
  [ "$code" = "200" ] && break
  sleep "$delay"
done
```

## Troubleshooting

| Symptom | Likely cause | Fix |
| --- | --- | --- |
| Test trigger finds no data | No real request has arrived | Send a test request or create an event in the sender, then test again |
| Request accepted but no Zap run | Zap is off, body is empty, or processing is delayed | Turn the Zap on, include a body and check Zap history after a few minutes |
| 404 from the URL | The Zap is off or deleted, or the owner changed | Turn the Zap on, or paste the current URL into the sender |
| 429 response | Rate limit exceeded | Retry with exponential backoff and spread out requests |
| Fields missing in the picker | The sample data lacked those fields | Send a complete sample and select Load Samples again |
| Nested values hard to find | Field names differ from the payload structure | Load a nested sample and use the names the field picker shows, or set Pick Off A Child Key |
| Webhooks unavailable in the editor | Free plan | Upgrade to a plan that includes Webhooks by Zapier |

## Checklist

- The plan includes Webhooks by Zapier.
- Catch Hook chosen unless you need headers, in which case Catch Raw Hook.
- Webhook URL treated as a secret and added to the sender.
- A real sample request sent and loaded before mapping fields.
- Nested field names checked in the field picker after loading a sample.
- Sender retries with exponential backoff on anything other than 200.
- Task usage estimated for arrays that trigger many runs.

If you are weighing Zapier against other tools for self-hosted webhooks, see [Self-Host n8n with Docker: Setup, Persistence and Updates](https://www.epifive.com/blog/n8n-self-host-docker-setup-guide).

## References

- Trigger Zaps from webhooks (Catch Hook and Catch Raw Hook): https://help.zapier.com/hc/en-us/articles/8496288690317-Trigger-Zaps-from-webhooks
- How to get started with Webhooks by Zapier: https://help.zapier.com/hc/en-us/articles/8496083355661
- Webhooks by Zapier rate limits: https://help.zapier.com/hc/en-us/articles/29972220283789

## Frequently asked questions

### Do I need a paid Zapier plan for webhooks?

Yes. Zapier's help pages list Webhooks by Zapier as available on the Professional, Team and Enterprise plans and not on the Free plan. Confirm your plan before you design a Zap around a webhook trigger.

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

Catch Hook parses the request body into fields you can map. Catch Raw Hook does not parse the body, includes the headers, and limits the unparsed body to 2 MB. Use Catch Raw Hook when you need headers or the exact original body.

### Why does my webhook return 200 but the Zap does not run?

Zapier returns a 200 for a live webhook URL even when processing is delayed. During high webhook activity it may return 200 and delay processing by several minutes. Also check that the Zap is turned on, that the request body is not empty and that you used the correct URL.

### What happens if I send an array of objects to a Catch Hook?

Zapier runs the later steps once for each object in the array. If you wrap the same array inside a single object, the Zap runs only once. Each object that completes successful action steps uses tasks.

