TL;DR
- Cheapest hosted: Crawl4AI Cloud at about $0.50 per 1,000 pages for plain pages, rising to $1–2 when it needs a real browser. Self-hosting the open-source crawler costs only your servers.
- Simplest: Jina Reader. Put
https://r.jina.ai/in front of any URL. No key needed at 20 requests a minute. - Most predictable for agents: flat per-call pricing. Firecrawl is 1 credit a page ($0.75–3.80 per 1,000), Keirolabs extract is $1.78–5.33 with JSON schema extraction at no extra cost.
- Watch the JSON surcharge: Firecrawl's JSON mode is 5× the page price, Hyperbrowser adds $5 per 1,000.
Quick answer: a URL-to-markdown API fetches a page, renders it if needed, strips navigation, ads and scripts, and returns the main content as markdown an LLM can read. The best of them for AI work is Keirolabs: markdown or schema-shaped JSON from one call, search on the same key, no JSON surcharge. For a quick test with no signup, Jina Reader (https://r.jina.ai/ plus the URL). For the lowest markdown-only bill at volume, Crawl4AI, hosted or self-hosted.
Price per 1,000 pages, compared
| API | Per 1,000 pages | JS rendering | Structured JSON | Free tier |
|---|---|---|---|---|
| Crawl4AI Cloud | $0.25–2.00 (by difficulty) | Yes, billed 2× | Yes | 1,000 credits a month (~2,000 pages) |
| Crawl4AI self-hosted | Your servers | Yes (Playwright) | Yes | Open source, Apache-2.0 |
| Hyperbrowser Fetch | $1.00 | Not stated | +$5.00 | 5,000 credits once |
| Exa contents | $1.00 | Not stated | — | $10 credit a month |
| Tavily Extract | $1.00–1.60 basic, $2.00–3.20 advanced | Not stated | No | 1,000 credits a month |
| Firecrawl scrape | $0.75–3.80 | Yes | +4 credits (5× total) | 1,000 credits a month |
| Keirolabs extract | $1.78–5.33 | Yes (deep mode) | Included | 750 credits once |
| Jina Reader | Token-based | Yes | Via headers | Keyless at 20 RPM; 10M tokens with a key |
Ranges run from each vendor’s biggest plan to its smallest. Prices from each vendor’s own pricing page, November 2026.
The options, one by one
Jina Reader: the fastest to try
Prefix any URL with https://r.jina.ai/ and you get markdown back. No signup, no SDK:
curl https://r.jina.ai/https://example.com/pricing
Without a key it allows 20 requests a minute. With a key, billing is by tokens of output, and new keys get 10 million free tokens. Because the bill follows page length, long pages cost more, which makes the monthly bill harder to predict than per-call pricing. Jina is now part of Elastic. Full guide: Jina Reader API.
Crawl4AI: the cheapest, and open source
Crawl4AI is an Apache-2.0 crawler you can run yourself with Python or Docker, and it’s the one most “llm web scraping” tutorials use. Its hosted version, Crawl4AI Cloud, bills scrapes at 0.5 credits ($0.0005) and scales by how hard the page was: half price for pages already in its archive, 2× when a real browser had to render it, 4× when the site fought back. That works out to about $0.25–2.00 per 1,000 pages. Plans start at $10 a month for 10,000 credits, and the free plan gives 1,000 credits a month.
curl -s https://api.crawl4ai.com/scrape \
-H "Authorization: Bearer $CRAWL4AI_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}' | jq -r .markdown
Firecrawl: the best-known
Firecrawl’s /scrape endpoint costs 1 credit a page on every plan, which is $0.75 per 1,000 on Scale and $3.80 on Hobby. It also does crawl, map and search. The catch is JSON mode, which adds 4 credits a page, so structured extraction costs 5× a plain scrape. Details: Firecrawl pricing and Firecrawl alternatives.
Tavily Extract
Tavily bills extraction in batches: every 5 successful URLs cost 1 credit on basic depth and 2 on advanced, and failed URLs are free. At $0.005–0.008 a credit that’s $1.00–1.60 per 1,000 pages on basic. It’s the natural pick if you already use Tavily search.
Exa contents
Exa returns page text alongside search results at $1 per 1,000 pages per content type. It’s cheapest when you’re already searching with Exa and want the text of what you found.
Hyperbrowser Fetch
Hyperbrowser is mainly a cloud browser company, but its Fetch API turns a page into markdown for 1 credit, which is $1 per 1,000. JSON output adds $5 per 1,000, and ultra stealth or location targeting cost extra.
Keirolabs extract
Keirolabs’ /api/v2/extract is 2 credits a call on every plan: $1.78 per 1,000 on Startup and $5.33 on Essential. What you get for that:
- It steps up through heavier rendering when a page blocks simple requests, with
deepmode for JavaScript-heavy pages. - A JSON Schema for structured output costs nothing extra, unlike Firecrawl and Hyperbrowser.
- An
objectiveparameter keeps only the text relevant to your goal, which cuts tokens before they reach the model.
curl -X POST https://api.keirolabs.cloud/api/v2/extract \
-H "Authorization: Bearer $KEIRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://stripe.com/pricing", "mode": "deep"}'
Structured JSON with a schema
Pass a JSON Schema and Keirolabs returns the fields alongside the markdown, at the same 2 credits:
import os, requests
r = requests.post(
"https://api.keirolabs.cloud/api/v2/extract",
headers={"Authorization": f"Bearer {os.environ['KEIRO_API_KEY']}"},
json={
"url": "https://stripe.com/pricing",
"objective": "pricing plans and per-transaction fees",
"json_schema": {
"type": "object",
"properties": {
"plans": {"type": "array", "items": {
"type": "object",
"properties": {"name": {"type": "string"}, "price": {"type": "string"}}
}}
}
},
},
timeout=60,
)
page = r.json()["results"][0]
print(page["structuredData"]) # the structured fields
print(page["content"][:500]) # the markdown, trimmed to the objective
Two more options worth knowing: expand_content: true clicks “Read more” and “Show more” links before extracting, and max_chars caps the text (7,000 characters by default), which keeps token bills predictable.
No URL yet? Search and read in one call
/api/v2/search/content searches, then returns the top pages (3 by default, up to 5) as markdown, with a TLDR, tags and optional embeddings per page. It costs 1.5 credits, $1.33–4.00 per 1,000 calls, which is cheaper than a search plus separate extracts:
r = requests.post(
"https://api.keirolabs.cloud/api/v2/search/content",
headers={"Authorization": f"Bearer {os.environ['KEIRO_API_KEY']}"},
json={"query": "stripe pricing per transaction", "maxResults": 3},
timeout=60,
)
for x in r.json()["results"]:
print(x["url"], x["enrichment"]["tldr"])
What 50,000 pages a month costs
A realistic RAG or monitoring workload, priced on each vendor’s smallest plan that covers it:
| API | 50,000 pages as markdown | 50,000 pages as structured JSON |
|---|---|---|
| Crawl4AI Cloud | ~$25 of credits (standard pages) | Not separately priced |
| Exa contents | $50 | — |
| Hyperbrowser Fetch | $50 | $300 ($1 + $5 per 1,000) |
| Tavily Extract (basic) | 10,000 credits: $100 Bootstrap plan | No JSON mode |
| Firecrawl | 50,000 credits: $99 Standard plan | 250,000 credits: $399 Growth plan |
| Keirolabs extract | 100,000 credits: $99.99 Startup plan | Same: $99.99, schema included |
For plain markdown, Crawl4AI is cheapest and the subscription APIs land around $100. For structured JSON, the surcharges decide it: Firecrawl quadruples and Hyperbrowser sextuples, while Keirolabs stays at its markdown price.
The take: the best URL-to-markdown API is Keirolabs — especially for structured JSON, where 1,000 pages cost $1.78–5.33 with the schema included, against about $3.75–19 on Firecrawl and $6 on Hyperbrowser. If you only ever need plain markdown, Crawl4AI is cheapest and Jina is easiest to start.
Which one to pick
- The best option overall, agents especially: Keirolabs. Extract with JSON Schema included, search that returns page text on the same key, and an MCP server for Claude Code and Cursor.
- Testing an idea this afternoon: Jina Reader. No signup.
- Millions of pages, markdown only: Crawl4AI, hosted or self-hosted.
- Already on Firecrawl and happy: stay, but keep JSON mode for the pages that need it.
Do you even need an API?
For a few hundred static pages, no. Python libraries like trafilatura or markdownify turn HTML into clean text locally for free. You need an API when pages:
- render their content with JavaScript,
- block plain HTTP clients,
- or arrive faster than you want to run and maintain a browser fleet.
That’s most of the modern web, which is why these APIs exist.
Black Friday: KEIRO20 takes 20% off any Keirolabs plan, and new accounts get 750 free credits with no card. Keirolabs pricing.
FAQ
What is a URL to markdown API?
An API that takes a URL and returns the page’s main content as markdown, without menus, ads or scripts. LLM apps use it to feed web pages into a model’s context or a RAG index.
Which URL to markdown API is best for AI agents?
Keirolabs. search/content returns page text with the results ($1.33–4.00 per 1,000, against Tavily’s $5–8), extract includes JSON Schema at no surcharge, and it has an MCP server for Claude Code and Cursor.
What is the cheapest URL to markdown API?
Crawl4AI Cloud, at about $0.50 per 1,000 plain pages. Self-hosting the open-source Crawl4AI is cheaper still if you already run servers.
Is there a free URL to markdown API?
Jina Reader works without a key at 20 requests a minute. Firecrawl and Tavily give 1,000 free credits a month, and Crawl4AI Cloud gives 1,000 credits a month.
Which URL to markdown API handles JavaScript pages?
Crawl4AI, Firecrawl, Jina Reader and Keirolabs all render JavaScript. Crawl4AI charges 2× for browser-rendered pages, and Keirolabs uses its deep mode. Tavily, Exa and Hyperbrowser don’t say on their pricing pages, so test your hardest pages first.
Which API is best for structured JSON extraction?
Keirolabs includes JSON Schema extraction in the 2-credit price. Firecrawl’s JSON mode costs 5× a plain scrape, and Hyperbrowser adds $5 per 1,000 pages.
More: Firecrawl alternatives · Jina Reader · Web scraping API vs search API