URL-to-Markdown APIs for LLMs: Firecrawl vs Jina vs Webfetch

Firecrawl, Jina Reader and Webfetch each take a URL and return the page as Markdown for a language model. They differ in what they bill for, whether they serve a cached copy, what a blocked page costs, and what they cover beyond a single page. This post compares the three on those points, using each vendor's published pricing and documentation as checked on October 20, 2026. Webfetch is our product, and the sections below list the jobs where Firecrawl or Jina Reader fits better.

The same page through each API

Firecrawl takes a JSON POST:

curl -X POST https://api.firecrawl.dev/v2/scrape \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $FIRECRAWL_KEY" \
  -d '{"url": "https://example.com/post", "formats": ["markdown"]}'

Jina Reader takes the target URL after r.jina.ai/, with options as headers:

curl https://r.jina.ai/https://example.com/post \
  -H "Authorization: Bearer $JINA_KEY"

Webfetch takes a GET with ScrapingBee's parameter names:

curl "https://api.webfetch.io/v1/?url=https%3A%2F%2Fexample.com%2Fpost&return_page_markdown=true" \
  -H "Authorization: Bearer $WEBFETCH_KEY"

Where they differ

WebfetchFirecrawlJina Reader
Billing unitThe page: 1 credit, or 5 rendered in a browserThe page: 1 credit, plus 4 for the JSON, question or highlights formatsOutput tokens, from a prepaid balance
Free allowance1,000 credits at signup, then 250 a month, banking up to 1,0001,000 credits a month10 million tokens per new API key; 20 requests a minute without a key
Concurrency, entry plan5 free; 25 on Starter ($11.99)2 free; 5 on Hobby ($19)Rate-limited: 500 requests a minute with a key
Fresh or cachedEvery request fetches the page liveA cached copy up to 2 days old by default, at the same price; maxAge: 0 fetches liveCached for a time by default; X-No-Cache fetches live
Blocked or failedNot billed: a 403, an anti-bot challenge, a CAPTCHA page, a timeoutA 403 or 404 page costs 1 credit; no document, no chargeFailed requests are not charged
robots.txtHonored on every request; a refusal is not billedNot stated on its pricing or scrape pagesChecked when the request names a bot in X-Robots-Txt

For a retrieval pipeline, two rows decide most of the cost. Token billing makes Jina Reader's price follow page length, so a long documentation page costs more than a short news item, while Firecrawl and Webfetch charge the same for either. Caching decides freshness: Firecrawl and Jina Reader serve a recent copy unless the request opts out, and Webfetch fetches the page on every call.

Price by monthly volume

The cheapest monthly plan that covers each volume. Firecrawl charges 1 credit a page. Webfetch charges 5 credits for a page rendered in a browser, the default, and 1 with render_js=false for pages whose content is already in the HTML. Jina Reader bills output tokens, so its cost per page depends on the page and is left out of this table.

Pages a monthFirecrawlWebfetch, renderedWebfetch, without rendering
5,000$19 Hobby$11.99 Starter$11.99 Starter
15,000$99 Standard$11.99 Starter$11.99 Starter
50,000$99 Standard$29.99 Pro$11.99 Starter
100,000$99 Standard$59.99 Scale$29.99 Pro
200,000$399 Growth$59.99 Scale$29.99 Pro
500,000$399 Growth$149.99 Business$59.99 Scale
1,000,000$749 Scale$359.99 Business+$59.99 Scale

Firecrawl's prices are from firecrawl.dev/pricing. Annual billing lowers them by 16.7%, or 20% on Scale, and Firecrawl sells extra credits between plans at $5 per 1,000 on Hobby down to $5 per 5,000 on Scale. Firecrawl's 1 credit also covers its enhanced proxy; on Webfetch, premium and stealth proxies cost 10 to 75 credits a page, so a pipeline that mostly hits protected sites narrows the gap.

When Firecrawl fits better

  • Whole sites. Firecrawl crawls a site from one URL and maps its links with /crawl and /map. Webfetch fetches one URL per request, so a crawl means building the queue yourself.
  • PDFs, at 1 extra credit a PDF page. Webfetch converts HTML pages.
  • Model-written extraction into JSON. Webfetch's extract_rules uses CSS and XPath selectors.
  • Protected sites at a flat price, since the enhanced proxy is inside the 1 credit.

When Jina Reader fits better

  • Occasional use with no account: 20 requests a minute without a key.
  • Short pages, where output tokens cost little.
  • PDFs and image-heavy documents, with an optional OCR model at 40 times the tokens.
  • Embeddings and reranking on the same key as the reader. See jina.ai/reader.

When Webfetch fits better

  • Volume of live HTML pages. At 100,000 rendered pages a month, Webfetch Scale is $59.99 against Firecrawl Standard at $99, and at 1,000,000 pages without rendering it is $59.99 against $749.
  • Content that changes, such as prices, docs and news, where a cached copy goes stale. Every request is a live fetch.
  • Lists with dead or protected URLs. A 403, an anti-bot challenge, a CAPTCHA page and a timeout are not billed. A 404 or 410 is billed, because the target answered.
  • Long pages, which cost the same credits as short ones.

What the Markdown looks like

Webfetch's converter is deterministic code that maps HTML elements to Markdown, so every sentence in the output comes from the page and the same HTML always produces the same Markdown. It removes scripts, styles, navigation, the site header and footer, sidebars, forms, dialogs and the common cookie consent banners, and when the page marks its content with main or article, it converts only that element. Heading levels, nested lists, tables and language-tagged code blocks are kept, so a splitter that chunks on headings works on the output as it is. Links and images are made absolute against the final URL after redirects.

Across eight measured pages, from the WordPress news index to Effective Go, 1,301,564 bytes of HTML became 198,276 bytes of Markdown, 15.2% of the original. Index pages shrank the most, to 1.7% of their HTML, and long documentation the least, to 71.6%. The URL to Markdown page lists each page and its sizes.

Moving an existing call

FirecrawlWebfetch
"formats": ["markdown"]return_page_markdown=true
"waitFor": 2000wait=2000
"location": {"country": "DE"}country_code=de
"actions": [...]js_scenario
"includeTags": [...]extract_rules with "output": "markdown_relevant"
Jina ReaderWebfetch
r.jina.ai/{url}?url={url}&return_page_markdown=true
X-Wait-For-Selectorwait_for
X-Target-Selectorextract_rules with "output": "markdown_relevant"
X-Proxy: decountry_code=de
X-Timeout (seconds)timeout (milliseconds)
Accept: application/jsonjson_response=true

Firecrawl's maxAge: 0 and Jina's X-No-Cache have no Webfetch equivalent because every request is already live. With json_response=true, the response carries the Markdown with the final URL after redirects, the initial status code and the page's JSON-LD and microdata, which gives a retrieval index the source to cite.

The JavaScript, Python and PHP SDKs have a markdown() method, and the MCP server's fetch_page tool returns Markdown by default. The full comparison and the API reference cover the rest, and the free plan starts with 1,000 credits at webfetch.io/signup, enough to run the pages you convert today through all three and compare the output.

All posts