Specialty-API unit economics: embeddings, rerank, OCR
Specialty APIs do not share a billing unit. Embeddings bill by the million tokens. Rerank bills by the search. OCR and classification bill by the page. Speech bills by the second, voices by the character, image routes by the image. A rate means nothing until you know the meter behind it. The pages ranking today compare rates inside one lane. None compares the meters across lanes. This page maps every unit this platform's specialty routes meter. It converts each shape into the others. It prints every competitor rate as a dated relation against the fenced rates below, never as a bare figure. Every read happened on 28 October 2026.
Each fact below carries its owner and its date. OCR rows: AWS Textract, Google Document AI, Azure Document Intelligence, a Mistral announcement, Mathpix. Classification rows: Google Natural Language, Amazon Comprehend. Speech rows: OpenAI pricing, the OpenAI embeddings guide, Deepgram, AssemblyAI, Gemini, ElevenLabs. Rerank rows: Cohere, Voyage. All were read 28 October 2026. Where a rate could not be read, the row prints a dash. Competitor figures never print here. Each row is a direction against a fenced rate, with the party, the source and the date named.
Last verified: 2026-10-28
The meter map: six units, every specialty row
The table below is the artifact this page owns. It lists the unit each lane meters, what one unit holds here, and the display shape the card prints. Platform rules come from the platform's model data and route contracts, read 2026-10-28.
| Lane | Meter | What one unit holds here | Display shape |
|---|---|---|---|
| Text embeddings | tokens | text input tokens | per 1M tokens |
| Multimodal embeddings | tokens | text and image input tokens | per 1M tokens |
| Rerank | searches | one request, any document count | per 1,000 searches |
| Zero-shot extraction | searches | one input: a batched array of N bills N | per 1,000 searches |
| Print OCR | pages | one page, per file part or card report | per 1,000 pages |
| Archival OCR | pages | one page, hard-scan lane | per 1,000 pages |
| Content classification | pages | one page, up to 2,000 tokens, rounded up | per 1,000 pages |
| Speech to text | audio-seconds | one second of audio | per 3,600, one hour |
| Japanese speech to text | audio-seconds | one second of Japanese audio | per 3,600, one hour |
| Text to speech | characters | one character of input text | per 1M characters |
| Image generation | images | one generated image | per image |
Three properties of this map matter more than any single rate. First, the meters do not convert: each lane bills its own count. Second, the display shape differs from the meter: the speech rows meter per second but print per hour, and the image row has no divisor. Third, two lanes share a meter name with different scope. Rerank counts requests. Extraction counts inputs. The same word, search, bills two different things.
What one unit holds on this platform
These are the platform's route contracts. A classification page is up to 2,000 tokens of input, rounded up. The count the lane card reports is what meters when it arrives whole. A fractional or absurd report falls back to the input count, and the basis is auditable per request. A rerank search is one request over any number of documents. An extraction search is one input, so a batched array of N items bills N. The divergence is deliberate. Rerank work arrives as one query against a corpus. Extraction work arrives as a list of items.
OCR counts pages the same way. A multipart request carries one page per file part. The card-reported count meters when whole, with the file-part count as fallback. Long documents go through a jobs route that meters once, at done. A re-poll cannot bill twice. The OCR decision guide, the classification guide and the extraction guide walk those lanes.
| Model | Context | $/1M in | $/1M out | $/1M cached |
|---|---|---|---|---|
| Qwen | ||||
| qwen3.8-27b | 262K | $0.35 | $2.55 | $0.105 |
| qwen3.6-35b | 131K | $0.11 | $0.8 | $0.044 |
| Minimax | ||||
| minimax-m2.7 | 197K | $0.24 | $0.95 | $0.072 |
| Muse | ||||
| muse-glimmer-30b | 131K | $0.28 | $1.2 | $0.084 |
| Ornith | ||||
| ornith-1.5-35b | 100K | $0.35 | $2.55 | $0.105 |
| ornith-1.5-9b | 100K | $0.1 | $0.3 | $0.03 |
| Glm | ||||
| glm-5.3-flash | 1049K | $0.11 | $0.35 | $0.033 |
| Deepseek | ||||
| deepseek-v4-flash-0731 | 1311K | $0.15 | $0.42 | $0.045 |
| Gemma | ||||
| gemma-4-31b-it | 262K | $0.22 | $0.49 | $0.066 |
| Deepseek | ||||
| deepseek-v4-pro | 1000K | $1.13 | $2.21 | $0.339 |
| deepseek-v4.1-flash | 1000K | $0.19 | $0.71 | $0.06 |
| deepseek-v4.1-flash-1017 | 1049K | $0.16 | $0.65 | $0.003 |
| Glm | ||||
| glm-5.3 | 1000K | $1.32 | $4.25 | $0.4 |
| Flux | ||||
| flux-1-schnell | — | $0.003/image | ||
| flux-pro-1.1 | — | $0.04/image | ||
| Chatterbox | ||||
| chatterbox-tts | — | $25/1M chars | ||
| Kokoro | ||||
| kokoro-tts | — | $15/1M chars | ||
| pocket-tts | — | $16/1M chars | ||
| Audio | ||||
| audio8-tts | — | $8/1M chars | ||
| Hayamimi | ||||
| hayamimi-stt | — | $0.6/audio-hr | ||
| Bge | ||||
| bge-m3 | — | $0.05/1M tokens | ||
| bge-reranker-v2-m3 | — | $1.5/1k searches | ||
| Ocr | ||||
| ocr-print | — | $1/1k pages | ||
| ocr-archival | — | $3/1k pages | ||
| Whisper | ||||
| whisper | — | $0.12/audio-hr | ||
| Iab | ||||
| iab-2x | — | $0.7/1k pages | ||
| iab-3x | — | $0.7/1k pages | ||
| Gliner | ||||
| gliner-extract | — | $0.9/1k searches | ||
| Jev | ||||
| jev-fast | 1K | $0.03 | $0 | — |
| jev-causal | 1K | $0.03 | $0 | — |
| jev-batch | 1K | $0.03 | $0 | — |
| Wemm | ||||
| wemm-embed | — | $0.09/1M tokens | ||
| Molmo | ||||
| molmo2-er | 8K | $1 | $5 | $0.5 |
| Cosmos | ||||
| cosmos-reason2-2b | 4K | $0.1 | $0.4 | $0.05 |
| Sam | ||||
| sam2.1-base | — | $0.02/image | ||
| Da | ||||
| da3-small | — | $0.05/image | ||
| Smolvla | ||||
| smolvla | — | $0.001/call | ||
| Openvla | ||||
| openvla-oft | — | $0.006/call | ||
| Act | ||||
| act | — | $0.001/call | ||
The wallet is prepaid and shared across every lane above. One balance, many meters. A refused request bills nothing. The balance itself is the spend ceiling, so a runaway loop drains the wallet and stops rather than billing onward. That failure mode is covered in the bill shock guide. Current rendered rates from the same model data sit on the pricing guide. The embeddings pricing guide, the reranker pricing guide and the image cost guide carry those lanes in depth.
The rates, as relations
Competitor figures never print here. Each row names the party, its unit, a direction against a fenced rate, and the dated source. Failed reads are dashed.
OCR and document lanes
| Party | Unit | Relation to the fenced rows | Source, read date |
|---|---|---|---|
| AWS Textract | page, volume-tiered | above the print row at list, below it at the top tier | Textract pricing, 2026-10-28 |
| Google Document AI | page, volume-tiered | above the print row at list, below it at the top tier | Document AI pricing, 2026-10-28 |
| Azure Document Intelligence | page, volume-tiered | above the print row at list, below it at the top tier; its extraction and prebuilt tiers sit far above the archival row | Azure pricing, 2026-10-28 |
| Mistral OCR | page | at the same level as the print row; its batch mode doubles the pages per unit of spend | Mistral announcement and FAQ, 2026-10-28 |
| Mathpix | page, image boundary rule | above the print row; images with more than 12 rows of text can bill at the page rate | Mathpix pricing, 2026-10-28 |
| Groq | unread | dashed: three fetch methods failed on the writing date | attempts logged, 2026-10-28 |
That crossing is the trap in flat comparison tables. The list rate and the volume rate belong to one row. A page quoting one of them answers half the question. Mistral prints its rate inverted, pages per unit of spend rather than spend per page. Casual side-by-side reads go wrong until you invert the cell.
Classification lanes
| Party | Unit | Relation or shape | Source, read date |
|---|---|---|---|
| Azure custom classification | page | above the fenced classification rows, same meter | Azure pricing page, 2026-10-28 |
| Google Natural Language | 1,000 characters, rounded to the nearest | no rate relation prints: the meters do not convert without a characters-per-token bridge | NL pricing page, 2026-10-28 |
| Amazon Comprehend | 100 characters, 3-unit minimum | no rate relation prints: same bridge problem, plus a minimum charge | Comprehend pricing page, 2026-10-28 |
The classification lane is where meters diverge hardest. Google rounds each request to the nearest 1,000 characters. It counts whitespace and markup inside the request. Comprehend rounds to 100 characters and bills a 300-character minimum. Azure moved its custom classifier to the page. This platform meters the page directly, with the 2,000-token rule defining what a page holds. Three vendors, one job, three different units: the whole reason this page exists.
Speech lanes
| Party | Unit | Relation to the fenced speech rows | Source, read date |
|---|---|---|---|
| OpenAI transcription | minute | above the base speech row at its printed minute rate | OpenAI pricing, 2026-10-28 |
| AssemblyAI | hour, two rows, stacked add-ons | both published hour rates sit above the base speech row | AssemblyAI pricing page, 2026-10-28 |
| Deepgram | minute, hour figure beside it | entry row converts below the base speech row, one row matches it, the premium rows above it | Deepgram pricing page, 2026-10-28 |
| Gemini | audio as tokens, 25 per second | far above the base speech row at the vendor's own printed minute figure | Gemini pricing page, 2026-10-28 |
| ElevenLabs | credits from one shared pool | no rate relation prints: the unit is a credit, not a currency amount | ElevenLabs pricing page, 2026-10-28 |
The Japanese speech row sits above both American hour rates and below the Gemini figure. The Whisper cost per hour guide works that lane in full, and the Japanese speech guide covers the Japanese lane.
Embedding and rerank lanes
| Party | Unit | Relation or shape | Source, read date |
|---|---|---|---|
| OpenAI embeddings | input token; guide prints pages per dollar | its small model sits below the fenced text embedding row, its large and legacy models above it | OpenAI guide and pricing page, 2026-10-28 |
| Gemini embeddings | input token, per modality | the image rate differs from the text rate on one card; no single figure describes the lane | Gemini pricing page, 2026-10-28 |
| Cohere rerank | search unit: one query, up to 100 documents; documents past 500 tokens split and count again | a unit-scope fact, not a rate: this platform's search carries any document count | Cohere pricing page, 2026-10-28 |
| Voyage rerank | tokens: query tokens times documents, plus document tokens; card prints its own per-request estimate | at the vendor's stated 100-document, 500-token shape, its estimate sits above the per-search figure here | Voyage pricing page, 2026-10-28 |
| Together rerank | unread | dashed: the docs render no billing text on the writing date | attempts logged, 2026-10-28 |
Two vendors use the word search for rerank. One caps a search at 100 documents and counts long documents more than once past 500 tokens. This platform bills one search per request with no document cap: 400 documents per query is one search here, four search units there.
The conversion arithmetic
Every row here is derived, and the arithmetic is the content. R is a fenced rate above; the counts are yours.
per search = R per 1,000 searches / 1,000
per page = R per 1,000 pages / 1,000
per hour = R per 3,600 seconds (the speech rows already print the hour form)
per minute = R per 3,600 seconds / 60
per page of embeddings
= R per 1M tokens x 800 / 1,000,000
per 1,000 characters of speech input
= R per 1M characters / 1,000
per image = R per image (no divisor; the meter is the unit)
The 800 in the embeddings row is not this platform's number. It is OpenAI's own stated assumption, about 800 tokens per page of text, printed in its embeddings guide, read 2026-10-28. Use your own page length when you have it. The fence prints the hour form, but the meter ticks per second. A 90-second clip bills 90 seconds, not a rounded minute or hour. Vendors that print per-minute cards vary in how they count partial units, so check the increment rule before you price short clips. A search meter and a token meter meet inside a rerank lane. Fix the corpus shape on both sides, per Voyage's formula, and the two meters agree.
One pipeline, five meters
A document pipeline exercises five fence rows at once. Take a monthly intake of 1,000 scanned pages, each about 800 tokens once read. The pipeline runs print OCR. It classifies each page. It embeds the text. It answers 4,000 rerank searches against the index, and it transcribes 2 hours of voice memos.
month = 1,000 pages / 1,000 x R_print
+ 1,000 pages / 1,000 x R_iab
+ 800,000 tokens / 1,000,000 x R_embed
+ 4,000 searches / 1,000 x R_rerank
+ 7,200 seconds / 3,600 x R_stt
Put the five fenced rates in, in fence order, and the month prices out in one pencil pass. Two observations survive any rate you plug in. First, no single unit normalizes this bill: tokens do not price the pages, and pages do not price the searches. Any per-call normalization quoted ahead of a signed scope is a fiction. Second, the biggest term is not always the one you compared first: the counts, not the rates, decide which term wins. The same pipeline at the cloud list rates above runs above this platform's total.
The fine print that changes the bill
Minimums. Comprehend bills a 300-character minimum per request. A batch of one-line requests pays triple or worse what the per-unit rate suggests. Google rounds each request to the nearest 1,000 characters and counts whitespace and markup. A padded HTML payload bills as content.
Scope creep inside a unit. Cohere splits any rerank document past 500 tokens, and each piece counts against the 100-document cap. Mathpix can bill an image with more than 12 rows of text at the page rate. This platform rounds a classification page up at 2,000 tokens, so a 2,001-token page is two pages.
Idle time. Comprehend's synchronous classification runs on a provisioned endpoint billed per second, with a 60-second minimum. It bills while nothing arrives. Batch runs the other way. Mistral's batch mode doubles the pages per unit of spend, and the trade is the wait.
Add-ons. AssemblyAI prices extras per hour on top of the base hour, and they stack. Azure prices an add-on tier per 1,000 pages on top of feature tiers. Read the second row of any card before trusting the first.
Credits. ElevenLabs meters everything in credits from one shared pool: one credit per output character for speech, 330 per minute for transcription. The dollar cost depends on the credit pack. A rate card in a private unit is not comparable until you price the unit.
Make the first call
The specialty lanes take their own request forms. Sign up, create a key, and read two pages through the print OCR lane:
curl -X POST "https://api.ironstratum.com/v1/ocr" \
-H "Authorization: Bearer $KEY" \
-F "model=ocr-print" \
-F "mode=print" \
-F "file=@page-01.png" \
-F "file=@page-02.png"
Two file parts, two pages, billed at the print row. The response carries the text and the page count that metered. That count is the number your bill will match. The pricing guide carries the current rates for every lane, rendered from the same model data the metering reads. The Whisper model page, the Kokoro model page and the flux model page hold the request contracts for the speech, voice and image lanes.
Common questions
Is OCR billed per page or per request?
Per page here, per page at the three clouds, per page at Mistral and Mathpix. The boundary rules decide the real bill: file parts here, 12 rows of text at Mathpix, volume tiers at the clouds.
What does a rerank search include?
Here, one search is one request over any number of documents. At Cohere, one search unit is one query with up to 100 documents, and any document past 500 tokens splits into pieces that each count. At Voyage there is no search unit: the lane meters tokens through a formula. Three definitions of one word.
Is speech to text billed per minute or per second?
This platform meters seconds and prints the hour form. OpenAI prints minutes. AssemblyAI prints hours. Deepgram prints a minute rate with the hour figure beside it. Gemini converts audio to tokens at a fixed 25 per second. Divide everything to the second before comparing, and check each vendor's increment rule before you price short clips.
Why is classification priced per page here and per character at Google?
Different meters for the same job. The platform page holds up to 2,000 tokens. The Google unit is 1,000 characters, rounded to the nearest 1,000, whitespace and markup counted. There is no honest conversion without a characters-per-token assumption, so this page prints the meters and the rules and leaves the ratio to your corpus. Azure moved its custom classifier to pages.
Are credits the same as dollars?
No. A credit is a private unit priced by the plan that sold it. ElevenLabs draws speech, transcription, music and effects from one credit pool with different credit costs per product. Until you price the credit itself, the credit costs are not rates, and no comparison that mixes credits with currency amounts is sound.
The short version
Specialty lanes bill six units. The million tokens. The search, in two scopes. The page, in two lanes. The second of audio, the character of speech, the image. Read the meter first. Then read the boundary rules. Then read the rate. Every competitor row here is a dated relation against a fenced platform rate, read 28 October 2026, figures in the receipts. The worked pipeline prices the month as five independent products of count and rate, with no shared denominator. When you are ready, sign up, load the wallet, and price the pipeline on your real counts.
Last verified: 2026-10-28