Skip to main content
Alternatives/Alternative / Firecrawl self-hosted (Rust)

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.

Published
May 11, 2026
Updated
May 27, 2026
Category
alternatives
Verdict

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.

Path 1: official `firecrawl` crate (`FirecrawlApp::new_selfhosted(api_url, api_key)`) against a self-hosted Firecrawl Docker stackPath 2: fastCRW — single Rust binary, Firecrawl-compatible on overlap surface, no Postgres/Redis/workersAnti-bot and JS-render escalation matched in the open core; `/v1/extract` is supported (multi-URL, up to 50 URLs); Research API matches deep-research recall

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 firecrawl crate 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, /search overlap 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/search self-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/parse rolled out April 2026; /v1/agent is Cloud-only) lag the crate. Before you ship, lock the crate version in Cargo.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:

CapabilityFirecrawl CloudFirecrawl self-hostfastCRW
/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 keyurls 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/extract is matched, including multi-URL. It accepts a urls array (up to 50 URLs per request), billed as 1 scrape credit per URL plus the metered managed-LLM cost. /v1/scrape with formats: ["json"] + jsonSchema covers 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.
  1. Skim the Firecrawl ↔ fastCRW capability matrix — confirm your needs land on the overlap surface.
  2. Spin up fastCRW: docker compose up and curl the scrape docs.
  3. If you're already on the official firecrawl crate, point FirecrawlApp::new_selfhosted at your fastCRW instance and re-run your tests. Field-name divergences will show up there.
  4. For the broader Firecrawl alternative comparison (not Rust-specific), see Firecrawl alternative.

Continue exploring

More from Alternatives

View all alternatives

Related hubs

Keep the crawl path moving