OpenAI Batch API: 50% Off the Wrong Half of My Bill
Every major model vendor now sells the same tokens twice: once at list price, and once at half price in a slower lane. OpenAI calls it the Batch API. Anthropic calls it Message Batches. Google calls it Batch. All three take exactly 50% off input and output. It is the least controversial discount in the industry and almost nobody who runs a WordPress chatbot has worked out whether it applies to them.
I spent this morning measuring my own install rather than guessing. The short version: the OpenAI Batch API cannot touch the part of my bill that costs the most, it saves about four hundredths of a cent on the part it can touch, and the one place it genuinely pays has nothing to do with the chatbot at all. Every figure below comes either from a vendor’s own rate card, read today, or from a database query against this site.
What the four vendors actually offer
Start with the landscape, because the coverage tends to flatten it into “everyone gives you 50% off” and that is not quite true.
| Vendor | Lane | Discount | Turnaround | Can a live chatbot use it? |
|---|---|---|---|---|
| OpenAI | Batch API | 50% off input and output | Fixed 24-hour window | No |
| OpenAI | Flex | 50% off input and output | Synchronous, queued at busy times | Yes, with a latency risk |
| OpenAI | Fast mode | None — charges 2× list | Faster than standard | Yes, at double the price |
| Anthropic | Message Batches | 50% off input and output | Under 24h, usually under 1h | No |
| Batch | 50% off input and output | Target ~24h | No | |
| Flex | 50% off input and output | Synchronous, queued | Yes, with a latency risk | |
| Priority | None — charges 1.8× list | Predictable latency | Yes, at 1.8× the price | |
| DeepSeek | Off-peak hours | Clock-based, not a multiplier | Immediate | Yes, if your traffic cooperates |
| xAI | Batch | 20%, four legacy models only | Not published | No — and Grok 4.6 gets nothing |
Two things stand out. xAI is the outlier twice over: 20% rather than 50%, and its flagship Grok 4.6 carries no batch discount at all. And DeepSeek’s discount is a different animal entirely — it is a clock, not a multiplier, which I worked through in detail yesterday. Off-peak rates arrive immediately, so unlike a batch lane they are usable by a live chatbot; the catch is that you do not choose when your visitors turn up.
Here is the same information as a single number per lane.
The rule that decides everything
A batch API is asynchronous. You submit a file of requests, the vendor works through them when it has spare capacity, and you collect the results within a window. OpenAI’s window is a fixed 24 hours. Anthropic’s is “under 24 hours, typically under an hour”. Google targets roughly a day.
Your chatbot visitor is not going to wait an hour. They are going to wait about four seconds. So the rule is short enough to fit on one line: a batch lane can never price a request that a human is currently waiting on.
That single sentence eliminates the entire reply path, which for most WordPress chatbot installs is the whole bill. But it does not eliminate everything, and the interesting question is what is left.
What a reply on this site actually costs
Before working out what batch saves, I need to know what a reply costs. Rather than assume, I queried the install. The chat model is gpt-5.6-luna. The retrieval limit is six sources. The system prompt is 3,478 characters. Six stored replies carry a retrieval context averaging 11,426 characters, and the tightness of that range — 11,266 to 11,542 — is what you would expect from a fixed six-source limit. Ten stored bot messages average 681 characters, and fourteen user messages average 135.
At roughly four characters per token, that is 3,760 input tokens and 170 output tokens per reply.
| Component | Measured | Characters | Approx. tokens |
|---|---|---|---|
| System prompt | mxchat_options | 3,478 | 870 |
| Retrieval context | 6 stored replies | 11,426 | 2,857 |
| Visitor message | 14 stored messages | 135 | 34 |
| Input total | 15,039 | 3,760 | |
| Bot reply | 10 stored messages | 681 | 170 |
GPT-5.6 Luna is $0.20 per million input tokens and $1.20 per million output. That works out at $0.956 per 1,000 replies at standard rates.
Which means the figure I published three days ago was 39% too high
On 30 August I put this number at $1.58 per 1,000 replies, built from a 7,000-input / 150-output profile taken from the plugin’s configuration. The measured profile is 3,760 in and 170 out. The configuration describes what the retrieval system is allowed to pull; the transcripts record what it actually pulled, and six sources of this site’s documentation come in well under the ceiling.
So the real figure is $0.956, not $1.58 — the published estimate was 39.5% high. The correction runs in the direction that flatters us, which is exactly why it is worth stating plainly rather than quietly revising. If you priced your own chatbot off a configured context limit, do the same check: your ceiling is not your average.
The batchable half, measured
The one workload in a retrieval chatbot that genuinely is asynchronous is embedding the knowledge base. Nobody is waiting while you index your documentation, so a 24-hour window costs you nothing.
This site’s knowledge base is 85 entries totalling 152,290 characters — roughly 38,000 tokens. The embedding model is text-embedding-3-small at $0.02 per million tokens. Embedding the entire knowledge base from scratch therefore costs:
| Workload | Volume | Rate | Cost at standard | Cost with batch | Saved |
|---|---|---|---|---|---|
| Full knowledge-base embed | 38,072 tokens | $0.02 / M | $0.000761 | $0.000381 | $0.00038 |
| One chatbot reply | 3,760 in / 170 out | $0.20 / $1.20 per M | $0.000956 | not eligible | $0.00 |
Read the two rows against each other, because the ratio is the finding: embedding this site’s entire knowledge base costs less than one chatbot reply. Precisely, it costs 0.80 of a reply. Re-index the whole thing every single month for a year and you have spent nine tenths of a cent.
Halving that saves four hundredths of a cent. The 50% batch discount, applied to the only part of a WordPress chatbot that can legally use it, is worth $0.0004.
One detail worth flagging for anyone planning to use it anyway: on OpenAI’s published pricing table the embedding models carry a Standard column only. GPT-5.6 shows Standard, Batch, Flex and Fast mode side by side; text-embedding-3-small and its siblings show one rate. Google’s position is clearer — it announced embedding support for the Gemini Batch API explicitly. If a batch discount on embeddings is load-bearing in your budget, confirm it against the vendor’s batch guide rather than the pricing table.
Where the discount actually lands
So far this reads as an argument that batch APIs are useless for WordPress. They are not — but the money is somewhere most people are not looking.
This site also runs an AI content generator, and it is configured to claude-sonnet-4-6 at $3 per million input and $15 per million output. A generated post is a genuinely asynchronous job: nobody is watching a progress bar at 3am. Model it at 4,000 input and 2,667 output tokens and a post costs about 5.2 cents at standard rates, or 2.6 cents through Message Batches.
Put all three workloads on one axis, over one year, at this site’s measured volumes.
| Workload | Model | Annual cost | Batch-eligible? | Annual saving at 50% |
|---|---|---|---|---|
| Chatbot replies (1,256/yr) | gpt-5.6-luna | $1.20 | No — visitor is waiting | $0.00 |
| Knowledge-base re-embed (monthly) | text-embedding-3-small | $0.0091 | Yes | $0.005 |
| Generated posts (365/yr) | claude-sonnet-4-6 | $18.98 | Yes | $9.49 |
| Total | $20.19 | 94.1% eligible | $9.50 |
The batch lane saves this site $9.50 a year, and 99.95% of that saving comes from the content generator rather than the chatbot. If you run a WordPress chatbot and nothing else, the number that matters is the top row: zero.
Scale it up and the shape does not change, it just gets more expensive. Multiply the traffic by a hundred and the reply bill is $120 a year with a batch saving of exactly nothing, while Flex — which is synchronous — would halve it to $60. On a chatbot, Flex is the lane worth investigating and Batch is not, and the two are frequently written about as if they were the same discount.
Choosing a lane for a chatbot
| If your workload is… | Use | Why |
|---|---|---|
| A visitor waiting for a reply | Standard, or Flex if you can absorb a slow request | Batch’s 24h window is disqualifying; Flex is the same 50% without it |
| Indexing or re-indexing a knowledge base | Batch | Fully asynchronous — but the absolute saving is tiny |
| Bulk content or bulk summarisation | Batch | This is where the 50% is actually worth collecting |
| Translating or re-processing an archive | Batch | Same shape as content generation |
| A support queue with an SLA in minutes | Standard | Flex’s queueing is unpredictable under load |
| Anything where you were tempted by Fast mode | Standard | 2× list is a latency purchase, not a capability one |
What I could not measure, and why
I wanted a real hour-of-day traffic census for this site, because that is what decides whether DeepSeek’s off-peak clock is usable here. The sessions table looked promising: 3,300 rows.
It is not 3,300 rows of traffic. 3,214 of them are dated 8 August and share just 17 distinct timestamps — the signature of a bulk insert, not of visitors. Strip the backfill and the genuine record is 86 sessions across 25 days, about 3.4 a day, spread one to eight per hour across all 24 hours. That is far too thin to characterise a traffic pattern, so the off-peak question stays open rather than getting a made-up answer.
It is the second time in two days that this particular angle has died on contact with the data, and the failure mode moved: yesterday the transcripts table was nearly empty, today the sessions table was full of the wrong thing. A row count is not a measurement until you have looked at how the rows are distributed.
The 1,256-replies-per-year figure in the table above inherits that weakness. It assumes one reply per session, which is a floor rather than an estimate, and it is built on 86 observations. It is enough to establish that the reply bill is single-digit dollars; it is not enough to forecast anything.
The practical takeaways
- Batch APIs cannot price a live chatbot reply. Not on OpenAI, Anthropic or Google. The turnaround window is the whole story.
- Flex is the lane people mean when they say batch. Same 50%, synchronous delivery, queued under load. On OpenAI and Google it is priced identically to batch.
- Check your measured context, not your configured limit. Ours was 46% below the ceiling, which made a published cost estimate 39.5% too high.
- Embedding is cheap to the point of irrelevance. An entire 85-entry knowledge base cost less to index than one reply costs to generate.
- The 50% is real, but it lives in your content pipeline. If you generate posts, summaries or translations in bulk, that is the workload to move.
- Fast mode and Priority are the mirror image. 2× and 1.8× list respectively. They buy latency, and they are easy to enable by accident.
If you are trying to size a chatbot budget from scratch rather than trim one, our breakdown of what a website chatbot costs covers the plugin-and-platform side, and the comparison of per-resolution pricing against per-token pricing covers the case where a vendor bills you by outcome instead. For the vendor-by-vendor rate movements behind these numbers, see the notes on GPT-5.6 Sol’s rate card, Gemini 3.7 Flash’s expiring introductory pricing and the Claude Sonnet 5 increase that was called off.
FAQ
Does the OpenAI Batch API work with embeddings? OpenAI’s Batch API accepts embedding requests, but its published pricing table lists a Standard rate only for the embedding models, with no Batch column of the kind GPT-5.6 carries. Confirm against the batch guide before budgeting on it. Google states embedding support for the Gemini Batch API explicitly.
Can I use batch for a chatbot if I queue the replies? Only if the visitor gets the answer somewhere other than the chat window — by email, say. The moment the widget is open and waiting, a 24-hour window is unusable.
Is Flex safe for production chat? It is a trade, not a free lunch. You get the batch price with synchronous delivery, and in exchange your request may be queued when the vendor is busy. For a support chatbot on a small site it is usually worth testing; for anything with a response-time SLA, it is not.
Do batch and prompt caching stack? On Anthropic, yes — the documentation states the multipliers combine. That matters more than the batch discount alone for any workload with a large repeated prefix.
What does MxChat use? Standard rates on gpt-5.6-luna for replies and text-embedding-3-small for the knowledge base. You can point it at OpenAI, Anthropic, Google, DeepSeek, xAI or OpenRouter and pay whichever rate card suits you — the model selector is in the plugin settings, and the documentation walks through configuring it. Licences are in the shop, and the extensions that hang off the core plugin are in add-ons.
All rate-card figures were read from OpenAI, Anthropic, Google and xAI’s own pricing pages on 2 September 2026. All first-party figures were measured against this install the same day via WP-CLI. Where a number is modelled rather than measured — the content-generation token profile — it is labelled as such in the table it appears in.