Compare

How do I add a backup to Jina Reader, and when is it cheaper?

Keep Reader for quick reads and retry the pages it couldn't get on UpRock, from the country you need; since Reader still answers HTTP 200 when a site refused it, the check is the httpStatus and warning fields in its JSON. On price, Reader bills by output tokens, so pages under about 10,000 tokens are cheaper on Reader and longer ones are cheaper at UpRock's flat $0.50 per 1,000 pages.

Updated · Read as markdown

What Jina Reader does well

Reader is the shortest path from a URL to markdown: put https://r.jina.ai/ in front of any address and you get the page back as LLM-friendly text, with no SDK and, for light use, no key (20 requests a minute). It reads PDFs and Office files, can caption images, can return HTML, plain text or a screenshot instead, and takes headers for CSS selectors, waiting for an element, cookies and cache control. s.jina.ai does the same for search results, there's an official MCP server, and the code is open source under Apache-2.0.

For short pages it's also very cheap. Keep it.

How a failed read looks

Reader answers HTTP 200 even when the target page didn't. Ask for JSON (Accept: application/json) and look inside data:

{  "code": 200,  "data": {    "url": "https://en.wikipedia.org/wiki/Zzqx_nonexistent_article_9137",    "httpStatus": 404,    "warning": "Target URL returned error 404: Not Found",    "content": "…"  }}

That's a real response from 19 Oct 2026, trimmed. The same warning field carries Reader's other notes, such as a page that may need a CAPTCHA or may not have finished loading. Reader's own errors do use HTTP status codes:

What you see from ReaderWhat it meansRetry on UpRock?
200 with data.httpStatus 401, 403 or 429The target site refused Reader's requestYes
200 with a warning about a CAPTCHA or an unfinished loadThe content is probably a challenge page or a shellYes
403Reader is limiting traffic to that site (it does this for heavy anonymous use)Yes, or use a Reader key
422Reader couldn't process the page (a downstream failure)Yes
429You hit Reader's rate limit (20, 500 or 5,000 requests a minute, by key)Yes, or wait for retryAfter
402 or 409Your token balance or budget ran outYes, or top up
451Reader flagged the content as harmfulNo
200 with data.httpStatus 404 or 410The page is goneNo

Tokens or pages: what 1,000 reads cost

Reader bills the tokens in its output: $50 buys 1 billion tokens ($0.05 per million) and $500 buys 11 billion ($0.045 per million, with the premium key). So the price of a page depends on how long it is. UpRock charges per page, whatever its length.

We read six public pages through Reader with its default settings on 19 Oct 2026 and noted the token count it reported for each:

PageReader tokensReader, per 1,000 such pages ($50 pack)UpRock, per 1,000 pages
example.com341$0.02$0.50
A Cloudflare blog post2,600$0.13$0.50
RFC 9309 (robots.txt)6,637$0.33$0.50
Python json module docs9,342$0.47$0.50
Wikipedia, "Web crawler"20,478$1.02$0.50
Apple MacBook Air product page24,134$1.21$0.50

The break-even is about 10,000 tokens a page on the $50 pack, 11,100 on the $500 pack, and 8,000 if you pay UpRock in UPT ($0.40 per 1,000). Pages shorter than that are cheaper on Reader; longer ones, like the Wikipedia article and the product page above, are cheaper on UpRock. Trimming Reader's output with X-Target-Selector or X-Retain-Images: none moves the line in Reader's favour.

Jina Reader and UpRock side by side

Reader's prices and rate limits come from jina.ai/reader, checked 24 Oct 2026; the rest from the Reader repository, checked 19 Oct 2026.

Jina ReaderUpRock
Price$0.05 per million output tokens ($50 pack), $0.045 on the $500 pack; see the table above$0.50 per 1,000 pages by card or USDC, $0.40 with UPT
Without a key20 requests a minuteA few trial crawls a day over HTTP (10 on 3 Nov 2026), then a key is required
Rate limits with a key500 a minute, 5,000 with a premium keyNot published yet
CountryX-Proxy: <country>, a residential IP, premium key onlyEvery request: 63 countries, or a region
Where pages are fetched fromHeadless Chrome on Google Cloud Run (US and EU regions)Real desktop and mobile devices whose owners opted in
PDFs, image captions, screenshotsYesNot documented
MCP serverOfficial, remoteYes, remote (streamable HTTP)
VideoNo; video embeds become linksSearch public video by moment, $1 per 1,000 searches
Open sourceApache-2.0, self-hostableNo. The device runtime (Fuel Engine) is open source

Where Reader is better: zero setup, a keyless tier, PDFs and images, short pages for fractions of a cent, and self-hosting. Where UpRock fits: the reads that come back with a refusal in data.httpStatus, a country on any key, long pages at a flat price, and video.

The fallback, in Bash, TypeScript and Python

Each version asks Reader for JSON, checks data.httpStatus and data.warning, and only calls UpRock when the read failed in a way a second try can fix. UpRock gets one POST /v1/crawl request with your key in an Authorization: Bearer header; the CLI and MCP tabs do the same through the UpRock CLI (npm i -g uprock) or its MCP server.

#!/usr/bin/env bash# read.sh <url> [country]   needs curl and jq# env: UPROCK_API_KEY; JINA_API_KEY is optional (Reader works without one at 20 requests a minute)set -o pipefailurl=$1; country=${2:-US}​auth=(); [ -n "$JINA_API_KEY" ] && auth=(-H "Authorization: Bearer $JINA_API_KEY")resp=$(curl -s -w '\n%{http_code}' -H 'Accept: application/json' "${auth[@]}" "https://r.jina.ai/$url")code=${resp##*$'\n'}; body=${resp%$'\n'*}target=$(jq -r '.data.httpStatus // empty' <<<"$body" 2>/dev/null)warning=$(jq -r '.data.warning // empty' <<<"$body" 2>/dev/null)​case "$code:$target" in  200:404 | 200:410) echo "The page is gone ($target)" >&2; exit 1 ;;  200:401 | 200:403 | 200:429 | 200:5??) ;;   # the site refused Reader: try UpRock  200:*)    if ! grep -qiE 'captcha|not yet fully loaded' <<<"$warning"; then      jq -r .data.content <<<"$body"; exit 0    fi ;;  400:* | 401:* | 451:*) echo "Reader said $code: $(jq -r '.readableMessage // .message' <<<"$body")" >&2; exit 1 ;;esac​echo "Reader: HTTP $code, target ${target:-none} ${warning}. Trying UpRock from $country" >&2curl -s --max-time 90 https://edge.uprock.com/v1/crawl \  -H "Authorization: Bearer $UPROCK_API_KEY" -H 'Content-Type: application/json' \  -d "$(jq -n --arg url "$url" --arg country "$country" '{url: $url, country: $country}')" |  jq -r 'if .markdown then .markdown else "UpRock: \(.code): \(.error)\n" | halt_error end'

Tested 19 Oct 2026 on Reader's keyless tier with the live UpRock API: example.com stayed on Reader, a test URL that always answers 403 went to UpRock, and a missing Wikipedia page stopped as gone. The Bash version runs on the bash 3.2 that ships with macOS. On 6 Nov 2026 we ran the HTTP and MCP versions again with an UpRock API key in an Authorization header: the 403 test URL went from Reader to UpRock.

FAQ

Does Jina Reader return an error when the target page fails?

Not as an HTTP error. When we asked Reader for a Wikipedia page that doesn't exist, the response was HTTP 200 with data.httpStatus set to 404 and data.warning saying "Target URL returned error 404". Check those two fields, not just the response code.

How many Reader tokens does a web page use?

It depends on the page. With Reader's default settings we measured 341 tokens for example.com, 2,600 for a blog post, 9,342 for a Python docs page and 24,134 for a product page (19 Oct 2026). Selectors such as X-Target-Selector, or dropping images, cut that down.

Can Jina Reader fetch from a specific country?

Yes. The X-Proxy header takes a country code and, per Reader's cookbook, exits through a residential IP in that country. It needs a premium key, which comes with the $500 token pack. UpRock takes a country on every request.

Is there an UpRock URL prefix like r.jina.ai?

Not today. UpRock takes one `POST /v1/crawl` request per page, which the fallback on this page leads with, or runs through its MCP server or CLI. Without a key you get a few trial crawls a day over HTTP (10 on 3 Nov 2026); after that it needs an API key.

When should I not bother with a fallback?

When the page is gone (404 or 410) or behind a login. Reader and UpRock both fetch public pages only, so a second try won't help there.

Other use cases to explore

References

Get started

Add UpRock in one paste.

Paste this into Claude Code, Codex, Cursor or any agent with a terminal. It reads our docs, sets up the MCP server or CLI, and tells you the cost before it spends anything.

Set up UpRock for me: read https://uprock.ai/agents.md, connect the UpRock MCP server, and run one test crawl. Tell me what it costs before you spend anything.

How do I add a backup to Jina Reader, and when is it cheaper? | UpRock AI