Models for batch processing: when the bill is the requirement

Classify 100,000 documents and the same job runs $7.60 on Gemini 3 Flash, $56 on Claude Haiku 4.5 Stable and $84 on Grok Composer 2.5 Fast. The multiplier is not the price.

One job, seven prices

Take a concrete batch: 100,000 documents, 800 input tokens and 120 output tokens each. That is 80 million input tokens and 12 million output tokens — a job whose cost is entirely a function of two per-token rates.

At consumer rates (official price × multiplier): Gemini 3 Flash, 0.1× of $0.50/$3, costs $4.00 + $3.60 = $7.60. GPT 5.6 Luna, 0.3× of $0.2/$1.2, costs $4.80 + $4.32 = $9.12. Gemini 3.7 Flash, 0.1× of $0.75/$3.75, costs $6.00 + $4.50 = $10.50. GPT 5.4 Mini, 0.1× of $0.75/$4.5, costs $6.00 + $5.40 = $11.40.

Further up: Claude Sonnet 5, 0.1× of $3/$15, costs $24.00 + $18.00 = $42.00. Claude Haiku 4.5 Stable, 0.4× of $1/$5, costs $32.00 + $24.00 = $56.00. Grok Composer 2.5 Fast, 0.2× of $3/$15, costs $48.00 + $36.00 = $84.00. Same work, an 11.1× spread from cheapest to dearest.

Price a batch from its shape before running it, then check against a real sample.
export TOKEN_SHARE_KEY="<your-pool-api-key>"

# Estimate: docs x tokens x (consumer rate per million).
# gemini-3-flash consumer rates: 0.1x of $0.50/M in and $3/M out.
awk 'BEGIN {
  docs = 100000; in_tok = 800; out_tok = 120
  printf "input  $%.2f\n", docs * in_tok  / 1000000 * 0.050
  printf "output $%.2f\n", docs * out_tok / 1000000 * 0.300
  printf "total  $%.2f\n", docs * in_tok / 1000000 * 0.050 + docs * out_tok / 1000000 * 0.300
}'

# Verify the shape on one real document before multiplying by 100,000.
curl -sS https://token-share.app/v1/chat/completions \
  -H "Authorization: Bearer $TOKEN_SHARE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3-flash",
    "messages": [
      {"role": "system", "content": "Classify the document. Reply with one label and one sentence."},
      {"role": "user", "content": "<one real document here>"}
    ]
  }' | jq '.usage'

The lowest multiplier is not the lowest price

0.1× is the floor of the catalog's multipliers, and GPT 5.6 Sol sits on it — yet on the batch above, 0.1× of $5/$30 comes to $40.00 + $36.00 = $76.00. Grok 4.6, at twice the multiplier (0.2× of $2/$6), costs $32.00 + $14.40 = $46.40. Grok Composer 2.5 Fast carries that same 0.2× and costs $84.00, because the multiplier is a discount on the official rate, and Composer's official rate is $3/$15 against Grok 4.6's $2/$6.

The same trap runs the other way. Claude Haiku 4.5 Stable is the smallest Claude in the catalog, and at 0.4× on a $1/$5 official rate it comes to $0.40/M input — more than Claude Sonnet 5's $0.30/M at 0.1×. On this batch the "small" model costs $56 and the larger one $42.

So the number to compare is never the multiplier and never the official rate on its own. It is the product: official rate × multiplier, applied to input and output separately, then weighted by your job's actual ratio between the two.

Your input/output ratio changes the ranking

The batch above is roughly 87% input by token count, so input rates dominate. Invert it — a generation job that reads 100 tokens and writes 1,500 — and output rates take over. For 100,000 items that is 10 million input and 150 million output tokens.

On that inverted shape Gemini 3 Flash costs $0.50 + $45.00 = $45.50, GPT 5.6 Luna costs $0.60 + $54.00 = $54.60 and Gemini 3.7 Flash costs $0.75 + $56.25 = $57.00. Luna keeps a narrower gap to Flash here than on the classification batch, because its official output rate is 6× its input rate while the ranking on an output-dominated job turns on the output side alone.

Work out your own ratio before reading any ranking, including this one. Two numbers — average input tokens and average output tokens per item — turn every model in the catalog into a single comparable figure, and they are the only two numbers a price table cannot guess for you.

Cost is not the only thing that scales

A batch has a fixed per-item prompt, and that prefix is sent 100,000 times. Where it genuinely repeats, prompt caching bills it as a cache read on later requests rather than as fresh input, which is a change to the largest term in the classification example.

Quality failures scale too, and they scale worse than money. A model that mislabels 3% of items produces 3,000 wrong rows, and finding them costs more than the difference between $7.60 and $42. Run 200 items through two candidates against a labelled sample, count errors, and only then compare totals.

Route shape matters at volume only in that it decides what your worker code looks like: Gemini and Grok ids on /v1/chat/completions, OpenAI ids on /v1/responses, Claude ids on /v1/messages. Within one shape, testing another id is a model-field change, so the comparison above costs a few dollars to reproduce on your own data.

Common questions

Which model is cheapest per token in this catalog?
By consumer input rate it is Gemini 3 Flash at $0.050 per million — 0.1× of a $0.50 official rate — with the lowest consumer output rate too, $0.30 per million. That is a statement about per-token price, not about whether it does your job well; those are separate questions and only the second one needs your data to answer.
Should I use a small model for a big batch?
Model size and price are not the same axis here. Claude Haiku 4.5 Stable is the smallest Claude in the catalog and costs $0.40/M input on its 0.4× lane, against $0.30/M for Claude Sonnet 5 at 0.1×. Compare the product of official rate and multiplier, not the model's reputation for size.
Is there a discount for running a batch instead of live traffic?
Pricing here is the model's own multiplier applied to the official per-token rate, and it does not vary by how you submit the work — 100,000 requests are priced like 100,000 requests. The levers that do move a batch bill are the model you pick, the tokens you send, and caching a prefix that genuinely repeats.