invalid_request_error

HTTP 400 Schema Error Not Retryable

Your request is malformed โ€” wrong parameter type, missing required field, invalid model ID, or bad message structure. The error message usually names the specific problem.

What the error looks like

{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "messages.1.content: field required"
  }
}

The message usually pinpoints the exact field path (e.g., messages.1.content) and the problem (e.g., "field required", "invalid type", "must be one of").

Most common causes

1. Wrong model ID

# WRONG โ€” deprecated, doesn't exist
model="claude-3.5-sonnet"
model="claude-3-sonnet"
model="claude-3-5-sonnet-20241022"   # check if this is still active

# CORRECT (current as of 2026)
model="claude-sonnet-4-6"
model="claude-haiku-4-5-20251001"
model="claude-opus-4-7"

2. Wrong message role sequence

# WRONG โ€” can't have two user messages in a row
messages=[
    {"role": "user", "content": "Hello"},
    {"role": "user", "content": "And another question"},  # error!
]

# CORRECT โ€” alternate user/assistant
messages=[
    {"role": "user", "content": "Hello"},
    {"role": "assistant", "content": "Hi there!"},
    {"role": "user", "content": "And another question"},
]

3. Content must be string or list, not None

# WRONG
{"role": "user", "content": None}
{"role": "user", "content": ""}   # empty string also invalid

# CORRECT
{"role": "user", "content": "Your message here"}

4. max_tokens out of range

# max_tokens must be 1โ€“32768 (varies by model)
# Claude Sonnet: max 64000 output tokens
# WRONG
max_tokens=0     # too low
max_tokens=999999  # too high

# CORRECT
max_tokens=4096   # safe value for most use cases

Valid request structure

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-6",        # valid model ID
    max_tokens=1024,                  # 1โ€“64000
    temperature=1.0,                  # 0.0โ€“1.0 (or omit for default)
    system="You are a helpful AI.",   # optional, string only
    messages=[
        {"role": "user", "content": "Hello"},   # must start with user
        # {"role": "assistant", "content": "..."},  # if continuing
    ]
)

# Content blocks (for multimodal):
messages=[{
    "role": "user",
    "content": [
        {"type": "text", "text": "What's in this image?"},
        {"type": "image", "source": {
            "type": "base64",
            "media_type": "image/jpeg",
            "data": base64_string
        }}
    ]
}]

FAQ

How do I find which field is wrong?
Read the error message carefully โ€” it includes the JSON path like messages.0.content.1.type. Print your full request payload before sending to inspect it.
Can temperature be above 1?
No โ€” Claude's temperature range is 0.0โ€“1.0. Values above 1 return invalid_request_error. (This differs from some other APIs that go up to 2.)
Is system a required field?
No โ€” system is optional. Omit it entirely rather than sending an empty string, which may cause validation errors.