Claude's Message Batches, explained and translated
Anthropic's batch surface is the Message Batches API: same 50% discount idea, different wire format, and typically fast turnaround. Here is how it works, where it differs from OpenAI-shaped batch APIs, and how to translate jobs onto open models.
Anthropic's batch surface in six rows.
The load-bearing facts: discount, turnaround, formats, limits, and what it takes to get access.
- Discount
- 50% off standard Claude per-token pricing
- Turnaround
- Most batches finish in under an hour; 24h processing bound
- Format
- Native Messages API requests in a requests[] array, not OpenAI JSONL
- Job limits
- Up to 100,000 requests or 256MB per batch
- Results
- Retrievable for 29 days from a results URL
- Models
- Claude models only
As publicly documented by Anthropic, August 2026. Verify current values in Anthropic's docs.
The parts that shape real usage.
Rate cards agree everywhere (50% off is the industry number); these are the differences that decide the bill and the build.
The format is the migration cost
Message Batches submit an array of {custom_id, params} objects where params is a native Messages API call: max_tokens required, system as a top-level field, content blocks in responses. Nothing about that is hard, but none of your OpenAI-batch tooling reads it. Teams running both providers end up maintaining two serializers and two result parsers for what is conceptually one pipeline.
Pricing stacks with caching
The 50% batch discount composes with Anthropic's prompt caching, which matters for jobs with a large shared prefix such as a long rubric or policy. If your records share thousands of prefix tokens, model the combined rate before comparing providers; with mostly-unique records the base per-token rate dominates the math.
Fast turnaround, same deadline discipline
Sub-hour completion is common and pleasant, but the contract is still a processing window, not an SLA. Anything downstream should key off batch status reaching ended, not off a cron job that assumes an hour is enough.
The same request, both shapes.
Moving a Claude batch job to open models means converting Messages-shaped records to chat-completions-shaped JSONL: system moves into the messages array, content blocks flatten to strings, and each record gains method and url fields.
{"custom_id":"row-1","params":{"model":"claude-sonnet-5","max_tokens":1024,"system":"You are a classifier.","messages":[{"role":"user","content":"Classify this ticket: ..."}]}}{"custom_id":"row-1","method":"POST","url":"/v1/chat/completions","body":{"model":"openrelay/gpt-oss-120b","messages":[{"role":"system","content":"You are a classifier."},{"role":"user","content":"Classify this ticket: ..."}]}}Stay on Anthropic when
- The workload needs Claude-specific model behavior
- Your records share long cached prefixes and the caching discount stacks in your favor
- You are already deep in the Anthropic SDK on the realtime side
Run it on OpenRelay when
- You want OpenAI-shaped JSONL as the one format across providers and models
- Open models pass your quality bar and the Claude per-token base rate is the cost driver
- The batch job chains with OCR or other open-model stages on one API key
Anthropic batch, answered.
Does Claude have a batch API?
Yes: the Message Batches API. You submit up to 100,000 Messages-API requests as one batch, poll until it ends, and stream results from a results URL for up to 29 days. Tokens bill at 50% of standard Claude rates.
What does the Anthropic batch API cost?
Half of Claude's standard per-token pricing for the model you pick, and the discount composes with prompt caching. Whether that beats alternatives depends on the base rate: half-price Claude versus half-price open models is usually a large gap on tasks a 20B-120B open model handles.
How long do Claude message batches take?
Most complete within an hour, with processing bounded at 24 hours. As with every batch API, build on the bound rather than the typical case.
Is the Claude batch API compatible with OpenAI batch JSONL?
No. Anthropic batches use native Messages API request objects (params with system, max_tokens, content blocks) rather than {method, url, body} JSONL lines. Converting is mechanical in both directions; the record shapes on this page are the whole difference.
Can I run Claude-style batch workloads on open models?
The workloads, yes: evals, classification, extraction, summarization all run identically. Convert the records to chat-completions JSONL and submit to OpenRelay's batch endpoint for the same 50% discount on open-model rates. Claude the model does not move; the pipeline does.
Other batch surfaces
Run the benchmark batch.
500 rows of your real workload on open models settles the pricing question in an afternoon. Deposit $5 to get $10.