Invalid Request Body
invalid_request_body422
The request body is missing, empty, or not valid JSON. Check the content and Content-Type header.
What this means
The endpoint expected a request body, and what we received either wasn't there, was empty, or couldn't be parsed as JSON. This check runs before field-level validation — if the body can't be parsed at all, we can't tell you which fields are wrong because there are no fields yet. Fix the body first; then field validation can run.
When you'll see this
- A POST or PUT request was sent without a body at all.
- The request body was empty (an empty string or whitespace).
- The body is JSON-shaped but has a syntax error (missing comma, unmatched bracket).
- The Content-Type header wasn't
application/jsonand the body was sent as form data instead. - A typo in the JSON serialization produced invalid output (e.g.
"key":}instead of"key": "value").
Learn more about how this works
We require Content-Type: application/json and a syntactically valid JSON body on endpoints that take a body. If either condition fails, the request is rejected at the parsing layer before any schema-level validation. The details[] field in the response may contain hints about which part of the body failed to parse, when those hints are available.
The most common gotcha: this error often masquerades as a field validation error because devs assume "the field is missing." But the difference matters — a missing field returns validation_error, while a body that can't be parsed at all returns invalid_request_body. If you're seeing this, the issue is one level lower than fields.
Example response
{
"success": false,
"error": "invalid_request_body",
"message": "Request body is missing or malformed.",
"details": [],
"retry_after": null,
"doc_url": "https://docs.asterwise.com/reference/errors/invalid_request_body",
"request_id": "req_01HXYZABCDEFGH",
"timestamp": "2026-05-25T12:34:56Z"
}
- Verify the request body is non-empty and valid JSON. Test it in any JSON validator if unsure.
- Verify the
Content-Typeheader is set toapplication/json. - If you're constructing the body string manually, switch to
JSON.stringify()or equivalent — manual JSON construction is the leading cause of this error.
This is almost always a client-side bug. Surface during integration testing, not in steady-state production code.
Python:
Production handler
- Python
- TypeScript
import httpx
import json
def call_asterwise(url, headers, payload):
# httpx handles JSON serialization and Content-Type automatically
response = httpx.post(url, headers=headers, json=payload, timeout=30)
if response.status_code == 422:
body = response.json()
if body.get("error") == "invalid_request_body":
raise ValueError(
"Request body couldn't be parsed. "
"Check JSON validity and Content-Type."
)
response.raise_for_status()
return response.json()
async function callAsterwise(url: string, headers: HeadersInit, payload: unknown) {
const response = await fetch(url, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
if (response.status === 422) {
const body = await response.json();
if (body.error === "invalid_request_body") {
throw new Error(
"Request body couldn't be parsed. " +
"Check JSON validity and Content-Type.",
);
}
}
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json();
}
Avoid this error by
- Always use your language's standard JSON serializer (
JSON.stringify,json.dumps, etc.) rather than constructing JSON strings manually. - Always send
Content-Type: application/jsonexplicitly. Don't rely on defaults — some HTTP clients fall back to form-encoded bodies in surprising cases. - For form-driven UIs, never pass form data directly to the API. Build a JSON payload from form values first.
- In integration tests, include a "what if the body is empty" case so this error class is caught before production.