HTTP 400 · type invalid_request. The request body or parameters are malformed:
a required field is missing, a value is out of range, or a URL failed the hard wall
(webhook, discover, and extraction targets must be https and resolve to public
unicast hosts — private, loopback, and link-local/metadata ranges are refused).
Nothing ran and nothing was charged.
The shape
param names the offending field. In the batch extraction form, validation is
all-or-nothing: one invalid URL fails the whole POST with param naming it — no
partial batch is created.
Malformed JSON is currently misreported as this error. A request body that fails
to parse — or exceeds the 1 MB body cap — is treated as an empty body, so the
response says the first required field is missing (typically
"query is required") even when your payload contains that field. If you get
“is required” for a field you’re sending: validate that your JSON parses, check your
serializer (a trailing value like "max_spend_usd": } is the classic), and confirm
the body is under 1 MB. A dedicated parse-failure error code is planned.
How to fix
- Read
param and correct that field. Common cases: max_spend_usd missing on a
spending POST (it is always required), cadence_s under the 3600 minimum on a
monitor, a non-https or non-public url / webhook_url.
- Check the field’s exact name and type in the API reference —
request bodies are
snake_case.
Reproduce it
Omit the required max_spend_usd (works on an fn_test_ key, $0):