Fix “Webhook request failed — 400 Bad Request” in Zapier
A 400 on a Zapier webhook means the request that reached Zapier (or the app your Zap sends data to) was malformed — an invalid or empty JSON body, a missing or wrong Content-Type header, a bad hook URL, or a required field the receiving app rejected. Read the exact error body in Zap History, check the request the sender actually made, and fix the payload or headers to match.
A 400 is not a Zapier outage — it is the receiving side saying "the thing you sent me doesn't parse". That makes it one of the friendliest errors once you know how to read it: the fix is almost always in the payload, the headers, or the URL, and Zap History keeps the evidence. This page walks you through the six causes in the order they actually happen, with the checks that separate them in minutes.
What causes it — in the order they happen
The JSON body is invalid or empty
You'll know it's this if: Zapier's Catch Hook trigger never fires, or the history entry shows "body could not be parsed" / an empty payload.
The fix: Print the exact request the sender makes and run it through a JSON validator. Common killers: unquoted keys, trailing commas, single quotes instead of double quotes, and smart quotes pasted from a document. If a template literal in your sending code was never filled in, the body may literally contain {{field}} — fix the template.
Wrong or missing Content-Type header
You'll know it's this if: The request returns 400 even though the JSON looks perfect when you paste it into a validator.
The fix: The header must be application/json (or application/x-www-form-urlencoded for form fields). Senders that post raw strings without the header — some default HTTP libraries and form handlers — get a 400 before the body is ever read. Set the header explicitly in your sending code.
The hook URL is wrong or was deleted
You'll know it's this if: 400 or 404 with a message about the hook, often after you rebuilt, renamed or turned the Zap off and on again.
The fix: Copy the Catch Hook URL fresh from the trigger step in the Zap editor — don't reuse a link from an old email, doc or previous Zap version. Custom webhook URLs change when the underlying catch hook is regenerated, and every sender pointing at the old URL starts failing.
A required field is missing or blank
You'll know it's this if: The webhook itself succeeds, but the action step after it fails with 400 and a message naming the field, e.g. "email is invalid" or "required property missing".
The fix: This 400 comes from the destination app, not Zapier. Open Zap History, expand the failed action, and read the error body — it names the field. Then check the mapped value: an empty variable from an earlier step, a test record with blank fields, or a filter that passes records with missing data.
The data type doesn't match what the app expects
You'll know it's this if: 400 with wording like "expected number", "invalid format" or "malformed value" for a specific field.
The fix: Destination apps are strict: prices as text with a currency symbol, dates in the wrong format, booleans as "yes"/"no" strings, or an email with a stray space all fail. Insert a Formatter by Zapier step (Spreadsheet-Style Formula, Text, or Number) to convert the value before the action, and trim whitespace on strings.
The Zap was built against fake sample data
You'll know it's this if: The Zap tests green in the editor, then 400s on the first real run — or only fails for some records.
The fix: If you skipped pulling a real sample in the trigger, the mapped fields are guesses that don't match real payloads. Re-run Test trigger with a genuine record, re-map the failing fields, and send a real test through from the source app before turning the Zap back on.
Fix it step by step
- 1
Open Zap History and read the full error
Go to Zap History, click the failed run, and expand the failed step. Don't stop at the status code — expand the error body. It usually names the field, the expected format, or says the body couldn't be parsed. This one sentence tells you which of the causes below you're dealing with.
- 2
Work out which side sent the 400
A 400 on the trigger (Catch Hook) step means the sender's request to Zapier is malformed — payload, headers or hook URL. A 400 on the action step means Zapier delivered fine and the destination app rejected the data. The fix lives on whichever side rejected it.
- 3
Reproduce the exact request
For trigger-side errors, send one real test from the source app and compare what arrives against what you expect — use the trigger's recent requests view in the Zap editor. For action-side errors, look at the Data In section of the failed task to see exactly what Zapier sent.
- 4
Fix the payload, headers or URL
Validate the JSON, set Content-Type to application/json, re-copy the hook URL from the live trigger step, and make sure every required field has a real value. Fix one thing at a time and re-test so you know which change resolved it.
- 5
Re-map against real data and test end to end
Re-run Test trigger with a genuine record, re-map any fields that were built on guesses, add a Formatter step for anything the app wants in a different format, then send a real end-to-end test and confirm the record lands correctly in the destination app — not just a green tick in Zapier.
- 6
Guard against the next bad record
Add a Filter step (or a Path with rules like "email is not empty") so records with missing data stop before the action, and check Zap History after the next real burst. One bad record failing quietly is normal; a silent run of failures burns tasks and hides the problem.
Stop it coming back
- Always pull a real sample in the trigger before mapping fields — never build against Zapier's mock data.
- Set Content-Type: application/json explicitly in every sender, and validate generated JSON before shipping it.
- Keep the Catch Hook URL in one place (a doc or note) and update it there when the hook is regenerated — senders should reference that single copy.
- Add a Filter step so empty or malformed records stop before the paid action step.
- Check Zap History after any change — the first real run tells you the truth the editor test can't.
Still stuck on the exact screen?
Paste a screenshot of the error into AI Online Office and it tells you what to click next — on your screen, in seconds.
Fix it with AI Online OfficeZapier error FAQ
What does a 400 Bad Request mean in Zapier?
It means the request was malformed and was rejected before it could be processed — invalid JSON, wrong headers, a bad hook URL, or data the destination app considers invalid (a missing required field, or a value in the wrong format). It is a problem with the request, not with Zapier being down.
Why does my Zap work in the editor but fail with 400 on real runs?
Almost always because the Zap was built against sample data that doesn't match real records — a field that's sometimes empty, a different format, or a mapped value that doesn't exist in real payloads. Pull a real sample in the trigger, re-map the failing fields, and add a filter for records with missing data.
How do I find the exact 400 error message?
Open Zap History, click the failed run, expand the failed step, and read the error body — not just the status code. The body names the field or the parsing problem. For trigger errors, the trigger step's recent-requests view shows the exact request the sender made.
Is a 400 error my fault or Zapier's?
Nearly always the request. Zapier is passing data between apps; a 400 means one side received something it couldn't accept. The rare Zapier-side case is a regenerated hook URL — re-copy the URL from the live trigger step and update every sender.
Can I retry a Zap run that failed with 400?
Retrying the same run repeats the same bad request and fails again. Fix the cause first, then use Replay from Zap History on the failed task to confirm the fix with the original data.
Other errors we fix
New to the tool rather than the error? Start with the plain-English guides, or read what an AI Online Office is.