For provider-by-provider contract fields and reconciliation states, see the LLM batch API comparison; this page owns the generic cost lever and adoption boundary.
Batch API: Save 50% on LLM API Costs
Does batch api save money on LLM API costs?
Yes, for the right workload shape: 50% based on Published batch-API discounts across the 6 providers that offer one (providerProfiles.batchDiscountPct) — asynchronous jobs only, not the synchronous API. It does not apply universally — see the applicability and tradeoff sections below before using it.
Batch 40 · server-rendered decision evidence · verified 2026-08-27
Batch API eligibility and realized-savings evidence
Frozen inputs, formulas, provenance, and decision boundaries are visible in the initial HTML. Unsupported evidence fails closed as Unavailable.
Delay-tolerance routing ledger
Formula / scoring rule: Batch eligible = async-safe + deadline met + provider support + payload accepted; online residual remains uncached counterfactual.
Provenance: Frozen classification, extraction, content, summarization, eval, chatbot, and agent fixtures.
| Frozen fixture / run | Visible inputs | Field-level result | Decision boundary | State |
|---|---|---|---|---|
classificationbatch40-batch-api-m1-r1 | 5M labels; deadline 24h; user-blocking=false | Async share 80% scenario; provider completion SLA Unavailable — not guaranteed in fixture | Discount math is blocked if deadline guarantee is absent. | Unavailable — not guaranteed in fixture |
chatbotbatch40-batch-api-m1-r2 | 30K conversations; user-blocking=true; p95 response SLO 2s | Eligible share 0%; online residual 100%. | Never batch user-blocking traffic merely for discount. | ROUTED ONLINE — deadline fails. |
evaluationbatch40-batch-api-m1-r3 | 100K prompts; deadline 72h; no external dependency | Batch candidate; exact discount Unavailable — provider/model-specific rate is not joined | Eligibility and savings are separate fields. | Unavailable — provider/model-specific rate is not joined |
Module citation: OpenAI Batch API documentation.
Batch job atomicity and operations ledger
Formula / scoring rule: Cost/unique accepted = batch invoice + retries + storage/egress / (completed − duplicates); failed rows stay in numerator.
Provenance: 1K, 100K, and 1M JSONL jobs with invalid rows, duplicate IDs, reorder, cancellation, and expiry fixtures.
| Frozen fixture / run | Visible inputs | Field-level result | Decision boundary | State |
|---|---|---|---|---|
1K jobbatch40-batch-api-m2-r1 | 1,000 submitted; 7 invalid; 12 duplicates; 981 accepted | Unique accepted = 981 before model result validation. | Deduplicate and validate JSONL before claiming savings. | CALCULATED — settlement closed. |
100K partialbatch40-batch-api-m2-r2 | 100K submitted; 2,400 failed; 1,100 retry subset; 700 duplicate | Completed unique candidates = 95,900; storage/egress Unavailable — not priced | Do not report effective discount without all job charges. | Unavailable — not priced |
1M expirybatch40-batch-api-m2-r3 | 1M submitted; cancellation at 18h; result ordering changed | Expiry refund/charge Unavailable — provider policy for this fixture is absent | Cancellation is not equivalent to free work. | Unavailable — provider policy for this fixture is absent |
Module citation: OpenAI Batch API reference.
Migration payback and invoice reconciliation
Formula / scoring rule: Payback months = implementation cost / (online bill − batch bill − batch operations); realized delta requires matched invoices.
Provenance: User inputs: 12 engineering hours at $150/h, $80/month monitoring, 40% eligible spend.
| Frozen fixture / run | Visible inputs | Field-level result | Decision boundary | State |
|---|---|---|---|---|
implementationbatch40-batch-api-m3-r1 | 12h × $150; monitoring $80/mo; eligible spend $2,000/mo | One-time $1,800; recurring ops $80; provider savings Unavailable — batch discount not verified | Do not invent payback period from a generic discount. | Unavailable — batch discount not verified |
online residualbatch40-batch-api-m3-r2 | 60% online; 40% candidate batch; retries 3% | Residual bill is calculable from selected model; retry invoice Unavailable — not matched | Counterfactual must use same workload and model. | Unavailable — not matched |
realized invoicebatch40-batch-api-m3-r3 | online invoice INV-40A; batch invoice INV-40B; 30-day window | Attributable delta Unavailable — invoice line-item join is incomplete | Advertised savings never substitute for realized savings. | Unavailable — invoice line-item join is incomplete |
Module citation: All AI Ask pricing registry.
How it works
Providers price a batch job — a file of requests submitted together and collected once the whole job completes — below the price of calling the same model synchronously one request at a time. The discount is a flat percentage off every model in the lineup, published per provider, not negotiated per volume. It applies to the full request (input and output tokens both), stacking on top of any prompt-caching discount already in effect on the same call.
Where it applies
Only jobs that can tolerate asynchronous turnaround — batch jobs typically return within 24 hours, not synchronously. Live chat, agents, and anything user-facing in real time cannot use it.
Batch discount by provider
| Provider | Batch discount |
|---|---|
| OpenAI | 50% off |
| Anthropic | 50% off |
| 50% off | |
| xAI | — |
| DeepSeek | — |
| Mistral | 50% off |
| Groq | 50% off |
| Cerebras | — |
| Qwen | — |
| Amazon | 50% off |
| Z.ai | — |
| Meta | — |
The tradeoff
Batch pricing is a different API shape, not a toggle on the one you are already calling: you submit a file of requests and poll for a completed job, which means retry logic, partial-failure handling, and a result-collation step you did not need on the synchronous endpoint. If your workload already runs on a queue (nightly enrichment, bulk classification, offline eval), that cost is close to free. If it does not, building the batch submission and polling path can take longer to pay for itself than the discount saves in the first month, and a workload that is not truly asynchronous (a user waiting on the other end) cannot use it at any discount.
Worked example
For classification at volume (tiny input in, single-label output out) at 5,000,000 calls/month, GPT-5 Nano runs $165/month at list price and $165/month once verbosity is priced in. See the full ranked table for this workload →
