Index · tokenizer tax

The tokenizer tax

Two models at the same $/Mtok do not cost the same: each tokenizer turns the same text into a different number of tokens. We encode a fixed corpus with every public tokenizer in the catalogue and rank endpoints by$ per million input characters — the number the sticker price hides.

Endpoints by effective input cost

#ModelProvider$ / Mchar inputtok/charvs cheapest

† tokenizer inherited from the model family (no model-specific tokenizer published).

Tokens per character, by tokenizer family

Lower is denser (fewer tokens for the same text). The spread is real money: on French prose the widest gap below means the same prompt costs ~40% more in tokens before prices even enter the picture.

TokenizerEnglish proseFrench prosePython codeJSON dataSource
minimax-m10.19030.21820.27380.3634MiniMaxAI/MiniMax-M1-80k
minimax-m20.19030.21820.27380.3634MiniMaxAI/MiniMax-M2
minimax-m30.19030.21820.27380.3634MiniMaxAI/MiniMax-M3
o200k_base0.19140.23280.26340.3621tiktoken o200k_base
o200k_harmony0.19140.23280.26340.3621tiktoken o200k_harmony
kimi-k20.19140.29090.26220.3621hf-tiktoken moonshotai/Kimi-K2-Instruct/tiktoken.model
kimi-k30.19140.29090.26220.3621hf-tiktoken moonshotai/Kimi-K3/tiktoken.model
llama-40.19200.23180.26400.3621unsloth/Llama-4-Scout-17B-16E-Instruct
glm-40.19360.25340.25970.3621zai-org/GLM-4.5
glm-50.19360.25340.25970.3621zai-org/GLM-5.3
llama-30.19360.26330.25970.3602NousResearch/Meta-Llama-3.1-8B
granite0.19360.26470.25970.3608ibm-granite/granite-4.0-h-small
qwen30.19360.26180.26280.4005Qwen/Qwen3-8B
gemma-30.19590.24030.30950.4511unsloth/gemma-3-27b-it
qwen3.50.19590.23790.28370.4255Qwen/Qwen3.5-9B
qwen3.80.19590.23790.28370.4255Qwen/Qwen3.8-27B
deepseek-v30.19700.26000.28680.3794deepseek-ai/DeepSeek-V3.2-Exp
mistral-tekken0.19700.23090.29050.4127mistralai/Mistral-Nemo-Instruct-2407
nemotron0.19700.23090.29050.4127nvidia/NVIDIA-Nemotron-Nano-9B-v2
mistral-v30.21820.30550.34710.4709mistralai/Mixtral-8x22B-Instruct-v0.1
mistral-large0.21820.30500.34710.4709mistralai/Mistral-Large-Instruct-2411

What's not here — and why

96% of priced endpoints are covered. The rest publish no tokenizer, so no number is shown — an estimate dressed up as a measurement would be worse than a gap: claude-fable-5 (closed — no public tokenizer (Anthropic)); claude-fable-5-1 (closed — no public tokenizer (Anthropic)); claude-opus-5 (closed — no public tokenizer (Anthropic)); claude-sonnet-5 (closed — no public tokenizer (Anthropic)); command-a (gated on Hugging Face (Cohere)); command-r (gated on Hugging Face (Cohere)); gemini-3.5-flash-lite (closed — no public tokenizer (Google)); gemini-3.6-flash (closed — no public tokenizer (Google)); gemini-3.7-flash (closed — no public tokenizer (Google)); gemini-3.8-flash (closed — no public tokenizer (Google)); grok-4.5 (closed — no public tokenizer (xAI)); grok-4.6 (closed — no public tokenizer (xAI)). Closed-model counts will come from real API usage fields when we start making metered calls, not from guesses.

Method

Fixed corpus v1 (four segments, self-authored, immutable — ratios are only comparable at constant corpus; sha256 fingerprints recorded at each run): english prose (1792 chars), french prose (2131 chars), python code (1625 chars), json data (1563 chars). Each family's public tokenizer encodes each segment; tokens ÷ characters gives the ratio; ratio × the endpoint's input $/Mtok gives $ per million input characters. Input side only: output token counts depend on what the model generates, and we don't invent data. Cached-input pricing is a separate lever — see the caching guideand the cost calculator for full bills in $/Mtok. Measured 2026-09-05.