Jina Reader (r.jina.ai) compatible
Change the address.
Jina Reader bills tokens by the length of each page, and its Reader page prints no dollar rate. SpecStream answers the same POST to r.jina.ai in Jina's own text and JSON for $0.0008 a page.
The switch is one line: https://api.specstream.ai/jina in place of https://r.jina.ai/, and a SpecStream key as the Bearer token. The page goes in the body as url, as Jina's POST form sends it.
The Extract API behind this route scores 0.908 F1 on WCXB. A page read costs $0.80 per 1,000, and a page that gives no text is not charged.
New accounts get $10 of credit, no card. It covers 2,000 searches.
Jina Reader to SpecStream, call by call and field by field
| SpecStream | Jina Reader | |
|---|---|---|
| Address | POST https://api.specstream.ai/jina with url in a form or JSON body | POST https://r.jina.ai/ with url in the body, or the page address after https://r.jina.ai/ |
| The key | A SpecStream key as Authorization: Bearer | A Jina key as Authorization: Bearer. It raises the rate limit and charges tokens by content length |
| Reply forms | Text with Title:, URL Source:, Published Time: and Markdown Content:. X-Return-Format: text gives the text alone. Accept: application/json gives code, status and data | JSON with the URL, title, content and timestamp when the page has one |
| Fields in `data` | title, url, content (text with X-Return-Format: text) and publishedTime. Not returned: description, links, images, warning, metadata and usage.tokens | The page content, and its links and images when asked. The token count of each response |
| Errors | Jina's own body: 401 AuthenticationFailedError, 400 ParamValidationError, 422 SubmittedDataMalformedError for a page with no text. A busy call gets 429 RateLimitTriggeredError with Retry-After and is not charged | Tokens are not deducted for failed requests |
| Price | $0.0008 a page, $0.80 per 1,000 pages. A page that gives no text is not charged | Tokens by content length, topped up as you go. The Reader page prints no dollar rate |
| Free to start | $10 of credit, no card, which covers 12,500 page reads. Credit never expires | 10M free tokens on every new API key |
The Jina Reader call, on SpecStream
The call, before and after
# Before
curl -X POST https://r.jina.ai/ -H "Authorization: Bearer $JINA_API_KEY" -d "url=$URL"
# After
curl -X POST https://api.specstream.ai/jina -H "Authorization: Bearer $SPECSTREAM_API_KEY" -d "url=$URL"The body, the headers and the parser stay. The reply starts with Title: and URL Source:, then Markdown Content:, as Jina's does. The address form https://r.jina.ai/<url> is not served: send the page as url in the body.
What the route reads, and what it refuses
Read and applied: url in a form body or a JSON body, Accept: application/json for the JSON reply, and X-Return-Format set to markdown or text. With text the JSON reply carries data.text in place of data.content.
Refused in Jina's own form: no Authorization header gets 401 AuthenticationFailedError, no url gets 400 ParamValidationError, and a host that does not resolve gets 422 SubmittedDataMalformedError. Every call was measured on production on Nov 10, 2026, and the full pass table lists each parameter and its result.
Every field that comes back
The JSON reply has code 200, status 20000 and data with title, url, content and publishedTime when the page has a date. The route does not return data.description, links, images, warning, metadata or usage.tokens.
One field is added: specstream, with the call's price_usd and request ID. A parser that reads Jina's fields never sees it.
$0.80 per 1,000 pages, in dollars
Jina charges tokens by the length of each page, so a long page costs more than a short one. On SpecStream every page read costs $0.0008, whatever its length, and a page that gives no text is not charged. A busy call gets 429 with Retry-After and charges nothing, and credit you buy never expires.
0.908 F1 on WCXB, and the search scores on the same key
The Extract API that answers this route scores 0.908 F1 on WCXB. The Search API on the same key scores 97.9 F-score on all 1,000 official SimpleQA Verified questions, 978 of them correct, and 64.0 item F1 and 43.4 row F1 on all 200 official WideSearch tasks. Every score and its method is on the benchmarks page.
You decide what is kept, on each key
Create the key with zero_retention and a page read made with it keeps no request text and no answer after the reply. spend_cap_cents is the most the key can spend.
curl -X POST https://api.specstream.ai/v1/account/keys \
-H "Authorization: Bearer $SPECSTREAM_API_KEY" -H "Content-Type: application/json" \
-d '{"name": "production", "scopes": ["account:read", "finds:spend"], "spend_cap_cents": 500000, "zero_retention": true}'Search, pages and rows on one key
The same key searches the live web with the Search API at $5 per 1,000 searches of up to 10 results. Deep Search returns every match for a request in plain words as structured rows, at 5¢, 15¢ or $1 a row, with a source URL on every value. The most a run can cost is approved before it starts. The full comparison is on the Jina Reader alternative page.
What else Jina Reader users price
Firecrawl
A scrape API at 1 credit per page, with 1,000 free credits a month and the Hobby plan at $19 a month, in its own request and reply. SpecStream reads a page for $0.0008 and answers the Jina call your code already sends.
Exa Contents
Page text from Exa at $1 per 1,000 pages for each content type you ask for, in Exa's request and reply. SpecStream reads 1,000 pages for $0.80 and keeps Jina's reply shape.
Tavily Extract
Every 5 successful URL extractions cost 1 credit, at $0.008 a credit on pay as you go, in Tavily's own reply. SpecStream charges $0.80 per 1,000 pages with no credits and no monthly reset.
How SpecStream scores
The same numbers as the benchmarks page, from the official tasks and scorers.
How to migrate, step by step
1. Create a key under Agents & API in the workspace. A new account gets $10 of credit, no card.
2. Set the address to https://api.specstream.ai/jina where your code has https://r.jina.ai/, send the page as url in the body, and send the SpecStream key as the Bearer token. In Python:
import requests
reply = requests.post(
"https://api.specstream.ai/jina", # was https://r.jina.ai/
headers={"Authorization": f"Bearer {SPECSTREAM_KEY}", "Accept": "application/json"},
json={"url": "https://en.wikipedia.org/wiki/Web_scraping"},
timeout=60,
)
reply.raise_for_status()
data = reply.json()["data"]
print(data["title"], data["url"])
print(data["content"][:500])3. In JavaScript:
const res = await fetch("https://api.specstream.ai/jina", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SPECSTREAM_KEY}`,
Accept: "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://en.wikipedia.org/wiki/Web_scraping" }),
});
const { data } = await res.json();
console.log(data.title, data.content.slice(0, 500));4. Read 429 as a call to send again after Retry-After, and 422 as a page that gave no text. Neither is charged.
Frequently asked questions
Something we didn't answer? Talk to a human
Is there a Jina Reader compatible API?
POST at https://api.specstream.ai/jina in Jina's own text and JSON forms, at $0.80 per 1,000 pages, as measured on production on Nov 10, 2026. The request and the parser stay; the address and the key change.How do I migrate from Jina Reader?
https://r.jina.ai/ becomes https://api.specstream.ai/jina, with a SpecStream key as the Bearer token. Send the page as url in a form or JSON body; the r.jina.ai/<url> address form is not served.How much does Jina Reader cost?
Is there a Jina Reader SDK whose address I can change?
requests, fetch or curl call.Which Jina Reader fields does SpecStream not return?
data: description, links, images, warning, metadata and usage.tokens. It returns title, url, content or text, and publishedTime when the page has a date.What happens when a page cannot be read?
422 SubmittedDataMalformedError in Jina's body, and the call is not charged. A busy call gets 429 with Retry-After, also not charged.Sources
SpecStream wrote this page. Each Jina figure comes from Jina's own pages, and each other provider's figure from that company's own page. The route's behavior comes from its code and the pass table measured on production.
- Jina Readerjina.ai/reader, read Nov 10, 2026
- Jina docs for agentsdocs.jina.ai/llms.txt, read Nov 10, 2026
- SpecStream Jina Reader pass tablespecstream.ai/specstream/dialects/jina.md, read Nov 10, 2026
- Firecrawl pricingfirecrawl.dev/pricing, read Nov 10, 2026
- Exa pricingexa.ai/docs/admin/pricing.md, read Nov 10, 2026
- Tavily API creditsdocs.tavily.com/documentation/api-credits.md, read Nov 10, 2026
- SpecStream benchmarksspecstream.ai/benchmarks, read Nov 10, 2026
- SpecStream pricingspecstream.ai/pricing, read Nov 10, 2026
- SpecStream for agentsspecstream.ai/agents.md, read Nov 10, 2026




