Skip to main content
Comparison

CRW vs Firecrawl: A Self-Hostable, Single-Binary Firecrawl Alternative

A head-to-head look at fastCRW as a Firecrawl alternative you can run yourself: one ~8 MB Rust binary vs a five-container stack, plus the numbers from Firecrawl's own scrape-content-dataset-v1 — 63.74% truth-recall of 819 labeled URLs (highest of three) and a 1914 ms p50.

fastcrw
By RecepJuly 7, 202614 min readLast updated: July 12, 2026

The problem, in one sentence

You want a scraping and search API you can drop into existing Firecrawl code, but you don't want to run a five-container stack — or pay per request for content you could pull on your own hardware.

That is the whole reason CRW exists. Firecrawl is a genuinely good product and the engineering behind it is solid — lovely engineering, honestly — but it is built to be run by Firecrawl, and the hosted meter and the self-hosted footprint both reflect that. CRW takes the opposite bet: one small Rust binary you own, an AGPL-3.0 engine you can self-host for the cost of your own server, and a request/response shape close enough to Firecrawl's that most callers change a base URL and nothing else.

This post is a head-to-head, backed by the numbers from Firecrawl's own benchmark: local/open footprint, plus accuracy and median latency.

What you're actually deploying

Start with the thing you have to operate, because that is where the difference is most physical. These are structural facts, not benchmark claims (source: the README §"Structural footprint").

  • CRW ships as a single ~8 MB binary. Firecrawl's stack is roughly 2–3 GB total across its images.
  • CRW runs in one container (plus an optional sidecar). Firecrawl runs five.
  • The default Compose file ships LightPanda as the browser; a heavier Chrome variant is opt-in (~500 MB image, ~1 GB resident when you enable it).

For idle resource use, the engineering write-up cites CRW holding ~50 MB RAM idle on a $5 VPS (source: the how-we-built-fastCRW post's title/description), against a Crawl4AI/Playwright-style baseline it describes as 300 MB+ idle RAM and ~200–300 MB per worker. We're deliberately not quoting other RAM figures here — those are the ones we've verified.

The practical read: CRW fits on the cheapest box you have lying around, and there is exactly one process to babysit. If your reason for looking at a Firecrawl alternative is "I don't want to run a small Kubernetes cluster to scrape some pages," this is the headline.

The API is close to a drop-in

CRW speaks a Firecrawl-compatible API. In most codebases the migration is the base URL and your key:

curl -X POST https://your-crw-host/v1/scrape \
  -H "Authorization: Bearer $CRW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/article",
    "formats": ["markdown", "html"]
  }'
// TypeScript — the only change from a Firecrawl call is usually the base URL
const res = await fetch("https://your-crw-host/v1/scrape", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.CRW_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ url, formats: ["markdown"] }),
});
const { data } = await res.json();

crawl, search, and map follow the same shape. Structured extraction is available by asking for formats: ["json"].

Two things worth knowing before you migrate:

  • There is minor divergence in some response fields and the error envelope versus Firecrawl. Close, not byte-identical — check anything that parses error bodies.
  • Requests are stateless — there's no persistent session and no WebSocket/SSE crawl-progress stream, so long crawls are polled rather than streamed.

For scrape / crawl / search / map / extract / research, it's usually a drop-in.

Accuracy: the benchmark we lead with

Here's the part that matters more than footprint for most people: does it actually get the content?

On Firecrawl's public scrape-content-dataset-v1 (1,000 URLs, 819 labeled), diagnose_3way.py, single run 3,000 requests, 2026-05-08, CRW came out highest on truth-recall:

  • Truth-recall (of 819 labeled URLs): fastCRW 63.74% (522) · Crawl4AI 59.95% (491) · Firecrawl 56.04% (459).

That's +3.79 pp over Crawl4AI and +7.70 pp over Firecrawl on the labeled set — running against a dataset Firecrawl published. Truth-recall is the share of labeled URLs where the run returned the correct content, so this is the closest thing to "did the scraper actually do its job." All three engines threw zero errors across the 3,000 requests in the run.

Latency: median and fast mode

Same benchmark run. We publish the full percentile split rather than a single average — averaging hides exactly the thing you need to see here. On the median request, CRW is the fastest of the three1914 ms, effectively tied with Crawl4AI two milliseconds away, and comfortably ahead of Firecrawl's 2305 ms.

The default mode trades some tail latency for recall: on a hard URL where the cheap renderer comes back thin, CRW falls back to a Chrome-stealth render to recover content the others gave up on, which is a big part of how it wins truth-recall above. For latency-critical workloads, CRW's fast mode skips that escalation and posts a p90 of 4348 ms — the lowest of the three — at 91.8% scrape success of reachable URLs (source: the how-we-built-fastCRW post's FAQ). Pick the mode that matches whether you're optimizing for coverage or for tail latency.

Search is a separate story (and a strong one)

CRW also does web search, and it's worth being precise: this benchmark measures search only, not scrape — different harness, different thing.

Over a 100-query benchmark across 10 categories, benchmarks/triple-bench.ts, single point-in-time run:

  • Average latency: fastCRW 880 ms · Firecrawl 954 ms · Tavily 2,000 ms.
  • Median latency: fastCRW 785 ms · Firecrawl 932 ms · Tavily 1,724 ms.
  • P95 latency: fastCRW 1,433 ms · Firecrawl 1,343 ms · Tavily 3,534 ms.
  • Latency wins: fastCRW 73/100 · Firecrawl 25/100 · Tavily 2/100.
  • Success rate: 100% · 100% · 100%.

The frozen way to cite it: fastCRW search averaged 880 ms over a 100-query benchmark; 73 of 100 latency wins, and all three engines succeeded on every query.

Cost, and the self-host escape hatch

This is the other reason people go looking for a Firecrawl alternative: the meter.

CRW's engine is AGPL-3.0. Self-host it and scraping costs $0 per 1,000 scrapes — you pay for your server, nothing else. For comparison, Firecrawl's hosted pricing works out to $0.83–5.33 per 1,000 scrapes across its tiers (source: marketing/competitor-prices.lock.md, verified 2026-05-18). On a single ~8 MB binary that idles around 50 MB of RAM, "run it yourself" is a real option, not a theoretical one.

If you'd rather use the hosted CRW plans, credits are deliberately simple:

  • scrape — 1 credit, on any renderer (auto / http / lightpanda / chrome). Chrome no longer costs extra; it's a flat 1 as of 2026-06-24.
  • crawl — 1 per page · search — 1 per query · map — 1 · browse (an MCP session) — 1 per session.
  • Structured extract / any request with formats: ["json"] — 1 scrape credit plus the LLM cost for that page, billed as usage-metered LLM credits.

For the tier prices and included credits, see the live /pricing page — self-hosting the AGPL-3.0 engine remains free regardless of which hosted tier you'd otherwise be on.

On the LLM-backed features (search answer/summarize and JSON extraction): managed LLM usage is metered in credits based on usage. Those features are available on paid plans only — the free tier returns a 402 rather than calling a model. There's no bring-your-own-key path; it's the managed path or self-host the engine and wire your own.

What's different day-to-day

Document handling. CRW auto-detects PDF URLs and extracts text server-side via a built-in parser — point /v1/scrape at a PDF and it comes back as markdown/text like any other page.

Anti-bot and rendering. CRW ships built-in anti-bot in the open core — realistic user agents, header mimicry, cookies, sensible delays, 12-signal block detection, and residential-proxy rotation via the proxy field — alongside an automatic JS-rendering escalation ladder (HTTP → LightPanda → Chrome → proxied Chrome) that recovers thin or blocked pages without extra configuration.

{
  "url": "https://protected.example.com",
  "formats": ["markdown"],
  "proxy": "http://user:pass@your-residential-proxy:port"
}

Statelessness and streaming. No persistent sessions, no WebSocket/SSE crawl-progress stream — you poll crawl status. The LLM features are managed-only on paid plans, with the free tier returning 402. robots.txt is respected by default.

Who should pick which

  • Pick Firecrawl if streamed crawl progress over WebSocket/SSE is a hard requirement, and you're happy to run the five-container stack or pay the hosted meter.
  • Pick CRW if you want to own the thing: one ~8 MB binary, ~50 MB idle RAM, a self-hostable AGPL-3.0 engine at $0 per 1,000 scrapes, a Firecrawl-compatible API for scrape/crawl/search/map/extract/research, built-in anti-bot and PDF parsing, top-of-three truth-recall on Firecrawl's own dataset, and the fastest median request in that run.

Most teams evaluating a Firecrawl alternative aren't choosing on a single axis. They're weighing "how much do I want to operate" against "how good is the content" against "what does it cost at my volume." CRW's answer is: very little to operate, highest recall on the shared benchmark, free if you self-host. Now you can make that call with the actual numbers.

FAQ

Frequently asked questions

Is CRW a drop-in Firecrawl replacement?
For scrape, crawl, search, map, and extract (including research), it's usually a base-URL-and-key change — CRW speaks a Firecrawl-compatible API, with multi-URL extract (up to 50 URLs per request) and a research endpoint built in. There's minor divergence in some response fields and the error envelope, and crawls are polled rather than streamed over WebSocket/SSE.
Is CRW actually more accurate than Firecrawl?
On Firecrawl's public `scrape-content-dataset-v1` (1,000 URLs, 819 labeled), `diagnose_3way.py`, single run 3,000 requests, 2026-05-08, fastCRW led truth-recall at 63.74% of the 819 labeled URLs, versus 56.04% for Firecrawl and 59.95% for Crawl4AI, with 0 thrown errors across all 3,000 requests. CRW returns the correct content more often on the labeled set.
Is CRW faster than Firecrawl?
On the median request in that same run, yes: fastCRW's p50 was 1914 ms vs Firecrawl's 2305 ms (Crawl4AI 1916 ms). In fast mode, CRW's p90 is 4348 ms, the lowest of the three, at 91.8% scrape success of reachable URLs. For search specifically, fastCRW averaged 880 ms over a 100-query benchmark with 73 of 100 latency wins.
Can I self-host CRW, and what does it cost?
Yes. The engine is AGPL-3.0, so self-hosting is free apart from your own server — $0 per 1,000 scrapes, versus $0.83–5.33 per 1,000 scrapes across Firecrawl's hosted tiers (source: `marketing/competitor-prices.lock.md`, verified 2026-05-18). It ships as a single ~8 MB binary in one container (Firecrawl runs five), and the engineering write-up cites ~50 MB RAM idle on a $5 VPS.
Does CRW handle PDFs and aggressively-defended sites?
Yes to both. CRW auto-detects PDF URLs and extracts text server-side via a built-in parser. Anti-bot is built into the open core — 12-signal block detection, user-agent rotation, stealth fingerprints, and residential-proxy rotation via the `proxy` field — backed by an automatic JS-rendering escalation ladder (HTTP → LightPanda → Chrome → proxied Chrome) for heavy client-side apps. LLM features (answer/summarize, JSON extract) are managed-only on paid plans, and crawls are polled rather than streamed.

Get Started

Try fastCRW free

Run a live request in the playground — no signup required. Or grab a free API key with 1000 credits, no credit card.

Continue exploring

More comparison posts

View category archive