Firecrawl Self-Hosted Rust Crate — Two Paths in 2026
Two ways to scrape from Rust without per-credit cloud pricing: the official firecrawl crate against a self-hosted stack, or fastCRW, a Rust-native alternative.
If you want a Rust client against self-hosted Firecrawl, the official `firecrawl` crate's `FirecrawlApp::new_selfhosted` constructor is the documented path. If you want a Rust-native server you can run as a single binary, fastCRW is the alternative — Firecrawl-compatible on the `/scrape`, `/crawl`, `/map`, `/search` overlap surface.
TL;DR — pick your path before the matrix
This page exists because the query firecrawl self-hosted rust crate mixes two intents:
- Path 1 — you want a Rust client against a self-hosted Firecrawl server. The official
firecrawlcrate is the documented path; the exact constructor (e.g.FirecrawlApp::new_selfhosted) and its arguments shifted between v1 and v2 of the SDK, so pin a version and verify the signature against your stack. You still run the Firecrawl Docker stack (Postgres + Redis + workers). - Path 2 — you want a Rust server without the Firecrawl Docker stack. That's fastCRW — single statically-linked binary, local-first with a low idle footprint and a fast cold start, Firecrawl-compatible on the
/scrape,/crawl,/map,/searchoverlap surface.
The two paths are not mutually exclusive: you can also point the official firecrawl crate at a fastCRW instance via the same new_selfhosted constructor, since fastCRW exposes Firecrawl-compatible endpoints.
Path 1 — official firecrawl crate against self-hosted Firecrawl
The firecrawl crate is published on crates.io. Per docs.firecrawl.dev/sdks/rust, the self-host constructor is:
use firecrawl::FirecrawlApp;
let client = FirecrawlApp::new_selfhosted("http://localhost:3002", Some("your-api-key"))?;
To get a Firecrawl server running locally, follow SELF_HOST.md. The stack uses Docker Compose with these services:
- API workers (TypeScript)
- Postgres (job/state)
- Redis (queue)
- A separate search service (optional, for
/v1/searchself-host)
The Cloud-only Firecrawl features (Fire-engine proprietary anti-bot, /v1/agent Spark models, /v1/deep-research) do not work in the self-host stack — those require Firecrawl Cloud.
Verify the SDK version you pin. The Firecrawl Rust SDK has a v1/v2 split and the constructor surface has shifted between releases — recent v2 endpoints (
/v1/parserolled out April 2026;/v1/agentis Cloud-only) lag the crate. Before you ship, lock the crate version inCargo.toml, check the constructor signature in that version against your stack, and run a CI demo against a self-hosted Firecrawl deployment. If your team can't stand up the Firecrawl Docker stack in CI, Path 2 (fastCRW) is the lower-friction option.
Path 2 — fastCRW: single Rust binary, Firecrawl-compatible
fastCRW is a Rust-native web scraping and search server. It exposes Firecrawl-compatible REST endpoints on the overlap surface so existing Firecrawl client code (including the official firecrawl Rust crate's new_selfhosted constructor) calls fastCRW after a base-URL swap. Most callers need only minor adjustments — response field names and error envelopes have small divergences (see the matrix below). fastCRW supports /v1/extract (multi-URL, up to 50 URLs per request) and /v1/scrape with formats: ["json"] + jsonSchema.
docker compose up
Or as a single container without Compose:
docker run -p 3000:3000 ghcr.io/us/crw
Low idle memory footprint, fast local cold start, small Docker image. No Postgres, no Redis, no separate workers.
You can keep using the official firecrawl crate against fastCRW:
use firecrawl::FirecrawlApp;
let client = FirecrawlApp::new_selfhosted("http://localhost:3002", Some("your-key"))?;
let result = client.scrape_url("https://example.com", None).await?;
…or call fastCRW's HTTP API directly with reqwest:
use reqwest::Client;
use serde_json::json;
let response = Client::new()
.post("http://localhost:3002/v1/scrape")
.bearer_auth("your-key")
.json(&json!({
"url": "https://example.com",
"formats": ["markdown"],
}))
.send()
.await?
.json::<serde_json::Value>()
.await?;
Capability matrix excerpt
The full matrix is in COMPATIBILITY-firecrawl.md. Headline rows:
| Capability | Firecrawl Cloud | Firecrawl self-host | fastCRW |
|---|---|---|---|
/v1/scrape (single URL → markdown/html) | ✅ | ✅ | ✅ |
/v1/crawl (multi-page) | ✅ | ✅ | ✅ |
/v1/map (URL discovery) | ✅ | ✅ | ✅ |
/v1/search | ✅ | ⚠️ (no Fire-engine) | ✅ (own built-in search stack) |
/v1/extract (LLM extraction) | ✅ standalone route, multi-URL | ⚠️ requires LLM key | ✅ urls array up to 50 (/v1/extract, 1 scrape credit per URL + metered managed-LLM cost; or /v1/scrape + formats: ["json"] + jsonSchema) |
| Deep research | ✅ /v1/deep-research | ❌ Cloud-only | ✅ Research API (/v1/search/research/papers), 61.0% recall vs Firecrawl's 53.3% on the public ArXivQA benchmark |
| Anti-bot / block bypass | ✅ Fire-engine | ❌ Cloud-only | ✅ open-core (12-signal block detection, UA rotation, proxy rotation) |
| Single-binary self-host | ❌ (Compose stack) | ❌ | ✅ |
Migration notes:
/v1/extractis matched, including multi-URL. It accepts aurlsarray (up to 50 URLs per request), billed as 1 scrape credit per URL plus the metered managed-LLM cost./v1/scrapewithformats: ["json"]+jsonSchemacovers the single-page case.- Response field-name divergence on a few metadata keys and on error envelope wording — see the matrix for row-level diff.
Where Firecrawl Cloud is still the right call
Neither Path 1 (self-hosted Firecrawl) nor Path 2 (fastCRW) replaces Firecrawl Cloud for this use case:
- Hosted dashboard, billing, and team management. If you don't want to operate any infrastructure, Firecrawl Cloud's managed surface is the lowest-friction path.
How to choose
- You want the official Firecrawl client API surface and don't mind running the Firecrawl Docker stack → Path 1.
- You want a single Rust binary you can drop into a server, with the same client code you'd use against Firecrawl → Path 2.
- You need
/extract, single URL or batched up to 50 → either path; Path 2 (fastCRW) supports/v1/extract(1 scrape credit per URL + metered managed-LLM cost) natively.
Recommended evaluation flow
- Skim the Firecrawl ↔ fastCRW capability matrix — confirm your needs land on the overlap surface.
- Spin up fastCRW:
docker compose upandcurlthe scrape docs. - If you're already on the official
firecrawlcrate, pointFirecrawlApp::new_selfhostedat your fastCRW instance and re-run your tests. Field-name divergences will show up there. - For the broader Firecrawl alternative comparison (not Rust-specific), see Firecrawl alternative.
Related
- Firecrawl alternative — the broader brand-comparison page (not Rust-specific).
- How to self-host a Firecrawl-like API with a single binary — single-binary walkthrough for self-hosting a Firecrawl-compatible API (fastCRW), not the Firecrawl Docker stack.
- fastCRW search docs — what
/v1/searchlooks like on fastCRW.
Continue exploring
More from Alternatives
Tavily vs Serper — AI Search API vs SERP API (2026)
Crawl4AI vs Exa in 2026 — OSS Crawler or Neural Search? (with fastCRW Benchmarks)
Exa vs Tavily — Neural Search vs Agent Web Access (2026)
Exa and Tavily are the two most-compared AI/RAG search APIs. Honest head-to-head on retrieval model, pricing, latency, endpoints, and free tiers — plus where fastCRW fits as the cheaper, self-hostable third option.
Serper Alternative in 2026 — fastCRW [Search + Scrape, Single Binary, Self-Host]
Looking for a Serper alternative that pairs Google SERP search with full-page scrape in one call? fastCRW has a public one-command search benchmark, a single AGPL-3.0 binary self-host, and a built-in MCP server.
DataForSEO vs SerpApi — SERP API Head-to-Head (2026)
DataForSEO is far cheaper (async $0.60/1k) with 24/7 support; SerpApi is premium ($9–25/1k) but real-time with legal indemnification and SOC 2. Honest feature, price, latency, and compliance comparison — plus where fastCRW fits.
Related hubs
