# LLM API cost per office task: 1,000 emails priced at six vendors

> Sorting 1,000 work emails costs about 5 cents to $1.62 at list prices, by our count. Thinking tokens, repeated instructions and quoted replies change it too.

- Published: 2026-11-02
- Author: 28creation Desk
- Format: Analysis
- URL: https://28creation.com/articles/llm-api-cost-office-emails/

## The short read

**In our sorting test, the instructions sent with each email added up to more tokens than the 1,000 emails themselves.**

- We counted tokens on 1,000 generated office emails and priced two tasks at six vendors' list prices, read on October 28, 2026.
- By our estimate, sorting them costs about 5 cents on the cheapest models and up to $1.62 on Claude Sonnet 5.5, before hidden thinking tokens.

### What you can do with this

> Set reasoning effort to the lowest level your task allows, cut quoted replies and footers, and send several emails per request. Grouping cut our estimate by 34%, stripping by about a quarter.

---

Sorting 1,000 work emails with a language model costs about 5 cents on the cheapest OpenAI, Anthropic and Google models, and up to $1.62 on Claude Sonnet 5.5. That is our count at list prices read on October 28, 2026. The model you pick moves the bill up to 36 times.

Three settings you control move it too: reasoning effort, how many emails go in one request, and what you cut from each email first.

If you plan to put an AI step into an inbox, a help desk or a Zapier flow, this tells you what it will cost before you open an account. We generated 1,000 office emails and counted their tokens with each vendor's open tokenizer where one exists. Then we priced a sorting task and a summary task at 13 model prices from six vendors. The script and its limits are below.

## Vendors bill per token, and a token is not the same size everywhere

Every vendor here charges per million tokens, with a separate price for what you send (input) and what the model writes (output). A token is a piece of a word, and each vendor cuts text differently. So the same email is a different number of tokens at each one.

We measured that on our sample of 864,527 characters. OpenAI's published `o200k_base` tokenizer, which the [tiktoken library](https://github.com/openai/tiktoken) maps to GPT-4o and GPT-5 models, cut them into 193,505 tokens. OpenAI's pricing and caching pages do not say which tokenizer the GPT-6 models use, so that count is our stand-in.

The [DeepSeek V4.1 Flash 1017 tokenizer](https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash-1017), the model DeepSeek now [serves under `deepseek-flash`](https://api-docs.deepseek.com/quick_start/pricing/), gave 196,267; the DeepSeek V4 Pro download has the same vocabulary. Mistral's tokenizer, from the [Mistral Small 4](https://huggingface.co/mistralai/Mistral-Small-4-119B-2603) and [Medium 3.5](https://huggingface.co/mistralai/Mistral-Medium-3.5-128B) downloads, gave 207,387, about 7% more; the two files hold the same 131,072-token vocabulary.

Anthropic, Google and xAI publish no tokenizer we could run. Anthropic's [model overview](https://platform.claude.com/docs/en/about-claude/models/overview) says 1 million tokens is "roughly 555k words or 2.5M Unicode characters" on the tokenizer it introduced with Claude Opus 4.7. Its [pricing page](https://platform.claude.com/docs/en/about-claude/pricing) says that tokenizer "produces approximately 30% more tokens for the same text" than the previous one.

Applied to our sample, 2.5 characters per token gives 345,811 tokens, 79% more than OpenAI's count. Google's [token guide](https://ai.google.dev/gemini-api/docs/tokens) says a Gemini token "is equivalent to about 4 characters", which gives 216,132.

Those two are vendor rules of thumb, not counts. So we price Claude as a range: OpenAI's count at the low end, Anthropic's ratio at the high end. For Gemini we use Google's ratio, and for xAI we use OpenAI's count as a stand-in. Once you have an account, Anthropic's [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) endpoint, which it says is "free to use", and Gemini's `count_tokens` give figures for your own text.

## What 1,000 emails cost at list price

The sorting task sends one email per request with a 204-token instruction (by OpenAI's count) and gets back a line like `{"category": "invoice", "urgent": true}`. The summary task sends a 55-token instruction and gets back one or two sentences, 23.5 words on average. Prices are standard tier, per million tokens, from each vendor's pricing page on October 28, 2026:

| Model | Input / output price | Sort 1,000 emails | Summarize 1,000 emails |
|---|---|---|---|
| OpenAI gpt-6-luna | $0.10 / $0.50 | $0.045 | $0.040 |
| Anthropic Claude Haiku 5.5 | $0.10 / $0.50 | $0.045 to $0.081 | $0.040 to $0.071 |
| Google Gemini 2.5 Flash-Lite | $0.10 / $0.40 | $0.050 | $0.041 |
| Mistral Small 4 | $0.15 / $0.60 | $0.071 | $0.060 |
| DeepSeek deepseek-flash, off-peak | $0.15 / $0.60 | $0.069 | $0.056 |
| Google Gemini 3.1 Flash-Lite | $0.25 / $1.50 | $0.13 | $0.12 |
| DeepSeek deepseek-flash, peak | $0.30 / $1.20 | $0.14 | $0.11 |
| Google Gemini 3.8 Flash | $0.75 / $3.75 | $0.38 | $0.33 |
| OpenAI gpt-6.1-terra | $1.00 / $5.00 | $0.45 | $0.40 |
| xAI grok-4.3 | $1.25 / $2.50 | $0.53 | $0.39 |
| DeepSeek deepseek-v4-pro, peak | $1.32 / $3.96 | $0.59 | $0.45 |
| Mistral Medium 3.5 | $1.50 / $7.50 | $0.73 | $0.65 |
| Anthropic Claude Sonnet 5.5 | $2.00 / $10.00 | $0.91 to $1.62 | $0.79 to $1.42 |

Sources for the prices: [OpenAI](https://developers.openai.com/api/docs/pricing), [Anthropic](https://platform.claude.com/docs/en/about-claude/pricing), [Google](https://ai.google.dev/gemini-api/docs/pricing), [Mistral](https://docs.mistral.ai/inference/pricing), [DeepSeek](https://api-docs.deepseek.com/quick_start/pricing/) and [xAI](https://docs.x.ai/docs/models).

Multiply by 1,000 for a million emails: $45 to sort them on gpt-6-luna, up to $1,623 on Claude Sonnet 5.5. For most small offices, the bill for this kind of task is small at any vendor. The choice between models is about accuracy and data terms more than price.

Some of these prices are already moving. Google's pricing page lists Gemini 3.8 Flash at $1.50 in and $7.50 out from January 1, 2027, which doubles that row to $0.76 and $0.67. DeepSeek charges its peak price from 01:00 to 04:00 and 06:00 to 10:00 UTC on weekdays, Chinese public holidays aside, and half that at other times. OpenAI adds 10% for its regional data-residency endpoints on models released on or after March 5, 2026.

## Hidden thinking tokens can cost more than the job

The table assumes the model answers without thinking first. The cheapest OpenAI and Anthropic models think by default, and you pay for it. OpenAI's [reasoning guide](https://developers.openai.com/api/docs/guides/reasoning) says reasoning tokens are "billed as output tokens" even though the API does not show them. Its [gpt-6-luna page](https://developers.openai.com/api/docs/models/gpt-6-luna) lists a default effort of `medium`.

Anthropic's [thinking docs](https://platform.claude.com/docs/en/build-with-claude/thinking) say thinking tokens "are billed as output tokens, even when the thinking text isn't returned to you." Its model overview lists Claude Haiku 5.5 with adaptive thinking at default effort `medium`. Google's pricing page labels the Gemini 3.8 Flash output price "including thinking tokens".

Without accounts, we could not measure how many thinking tokens each model spends on a sorting task. The size of the risk is plain arithmetic. Every 100 thinking tokens per email add $0.05 per 1,000 emails on gpt-6-luna or Claude Haiku 5.5. On gpt-6-luna that is more than the whole sorting job; on Claude Sonnet 5.5 it adds $1.00.

The fix is a setting. gpt-6-luna accepts `reasoning.effort: "none"`. Anthropic's Models API reports for each model whether it accepts `thinking: {type: "disabled"}`; for Claude Sonnet 5.5 it does not, the overview says. In our view a sorting task with eight fixed labels is a good candidate for no thinking, but check accuracy on a sample before you switch it off.

## The instructions cost more than the emails

Here is the result we did not expect. Guess what share of the sorting job's input was the emails. It was 49%. The 204-token instruction, sent again with each of the 1,000 emails, came to 204,000 tokens, more than the 193,505 tokens of email text.

Prompt caching would normally help with a repeated instruction, but ours is too short for it.

OpenAI's [caching guide](https://developers.openai.com/api/docs/guides/prompt-caching) sets a minimum of 1,024 tokens for GPT-5.6 and later. Anthropic's [caching docs](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) set 512 tokens for Haiku 5.5 and Sonnet 5.5 and need a `cache_control` field. Google's [caching page](https://ai.google.dev/gemini-api/docs/caching) sets 4,096 for implicit caching on Gemini 3.8 Flash. Below the minimum, Anthropic says, requests "are processed without caching, and no error is returned."

So we tried grouping. Sending 20 emails per request, with a 251-token instruction that asks for a JSON array back, cut input from 397,505 tokens to 211,251. Output rose from 11,314 to 17,364 tokens, because each answer now carries an ID. The net saving was 34% on both OpenAI models we priced this way.

Grouping has a cost of its own. A model that skips or merges an item in a list of 20 leaves an email that looks answered but is not. So your code must check that every ID comes back exactly once.

Claude Haiku 5.5 also has a price step. Any request with a prompt over 100,000 tokens pays $0.50 in and $2.50 out, five times the base rate. Keep groups small.

## Quoted replies and footers are half the text

Of our 1,000 emails, 345 carried an earlier message quoted below the reply and 404 a confidentiality footer, shares we chose for the test, not measured from a real inbox. Cutting both before sending, and keeping only the headers and the new text, removed 49% of the email tokens by OpenAI's count, and 51% by Mistral's.

The bill fell less than that, because the instruction and the answers stay the same size. For the summary task the saving was 23% to 31% across the 13 prices, highest on xAI grok-4.3, where input is the larger share of the bill.

The trade-off is context. A reply that says "yes, go ahead" means nothing without the quoted message above it. Strip quoted history for sorting and urgency checks, and keep the latest quoted message for summaries.

## What this means for you

The decision is less "which vendor" than "which settings". In our sample, the cheapest model at five of the six vendors cost about 5 to 14 cents to sort 1,000 emails; xAI's cheapest listed model cost 53 cents. A mid-tier model cost up to 36 times more than the cheapest, before any thinking tokens.

1. **Price your own text first.** Run a week of real emails through `o200k_base` or the vendor's count endpoint. Our emails averaged 194 tokens; yours may be several times that if they carry long threads.
2. **Set reasoning effort explicitly.** Use the lowest level the task allows, then compare accuracy on 100 emails you have labeled by hand.
3. **Use the Batch API when answers can wait.** OpenAI, Anthropic and Google list batch prices at half the standard rate. Mistral's pricing page says batch "reduces the price by 50%". xAI's models page says only that "not every model accepts Batch API requests" and lists no batch discount.
4. **Group and strip,** with code that checks every ID comes back and keeps a log of what was cut.
5. **Recheck the date.** The Gemini 3.8 Flash and Gemini 4 Argon prices on Google's page change on January 1, 2027 and December 1, 2026.

The core of our cost function, which you can point at your own emails:

```python
import tiktoken
from tokenizers import Tokenizer

o200k = tiktoken.get_encoding("o200k_base")
deepseek = Tokenizer.from_file("DeepSeek-V4.1-Flash-1017/tokenizer.json")

def count_o200k(text):
    return len(o200k.encode(text))

def count_deepseek(text):
    return len(deepseek.encode(text, add_special_tokens=False).ids)

def job_cost(emails, system, answers, count, price_in, price_out):
    """Dollars for one request per email; prices are per million tokens."""
    tokens_in = sum(count(e) for e in emails) + len(emails) * count(system)
    tokens_out = sum(count(a) for a in answers)
    return tokens_in * price_in / 1_000_000 + tokens_out * price_out / 1_000_000
```

It ignores any tokens an API adds around each message, and it counts no thinking tokens.

If the job is only sorting or pulling fields, a model that does not write text at all may be cheaper again. We covered two of those: [OpenAI's Decisions API](/articles/openai-decisions-api-generally-available/), which charges no output fee, and [Cloudflare's Clairic](/articles/cloudflare-clairic-invoice-extraction/), which reads invoices for $0.10 per million input tokens. For the mid-tier price cut that put gpt-6.1-terra at $1 and $5, see [our launch report](/articles/gpt-6-1-terra-price-cut/).

## How we made this

We read the six vendors' pricing pages and the OpenAI, Anthropic and Google docs on reasoning, caching and tokens on October 28, 2026. Our Python script generated 1,000 office emails from templates, with made-up names and companies in eight categories, seeded so a re-run gives the same emails. It counted them with tiktoken 0.14.0 and the tokenizer files we downloaded from Hugging Face that day, then priced each task; the answers and summaries it counted are template text of the expected length, not model output. We did not call any vendor's API, so thinking tokens, accuracy and the exact Claude, Gemini and Grok counts are not measured.

## Sources

- OpenAI, [API pricing](https://developers.openai.com/api/docs/pricing), [reasoning guide](https://developers.openai.com/api/docs/guides/reasoning), [prompt caching guide](https://developers.openai.com/api/docs/guides/prompt-caching) and [gpt-6-luna model page](https://developers.openai.com/api/docs/models/gpt-6-luna)
- OpenAI, [tiktoken](https://github.com/openai/tiktoken) (o200k_base encoding)
- Anthropic, [pricing](https://platform.claude.com/docs/en/about-claude/pricing), [models overview](https://platform.claude.com/docs/en/about-claude/models/overview), [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) and [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting)
- Google, [Gemini API pricing](https://ai.google.dev/gemini-api/docs/pricing), [tokens](https://ai.google.dev/gemini-api/docs/tokens) and [context caching](https://ai.google.dev/gemini-api/docs/caching)
- Mistral AI, [pricing](https://docs.mistral.ai/inference/pricing), [Mistral Small 4 model page](https://docs.mistral.ai/models/mistral-small-4-0-26-03) and [pricing overview](https://mistral.ai/pricing)
- DeepSeek, [models and pricing](https://api-docs.deepseek.com/quick_start/pricing/)
- xAI, [models and pricing](https://docs.x.ai/docs/models)
- Hugging Face model repositories for the tokenizers: [DeepSeek V4.1 Flash 1017](https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash-1017), [Mistral Small 4](https://huggingface.co/mistralai/Mistral-Small-4-119B-2603), [Mistral Medium 3.5](https://huggingface.co/mistralai/Mistral-Medium-3.5-128B)
