us/crw
๐๏ธ ๐ฆ ๐ โ๏ธ ๐ ๐ช ๐ง - fastCRW โ open-source (AGPL-3.0), self-hostable Rust web crawler & search API for AI agents. Tools: scrape, crawl, map, and SearXNG-backed search. Single 6MB static binary; reproducible 1K-URL benchmarks faster than hosted alternatives. Hosted MCP at fastcrw.com/mcp (Streamable HTTP, OAuth) or self-host.
Quick Install
{
"mcpServers": {
"us-crw": {
"command": "npx",
"args": [
"-y",
"us-crw"
]
}
}
}Using an AI coding agent (Claude Code, Cursor, etc.)? Copy a ready-made prompt that tells it to fetch the setup instructions and install this server for you.
Documentation Overview
fastCRW
The web data API for AI agents โ search, scrape, map, and crawl any site into clean markdown or JSON.
Use the managed cloud for zero infra, or self-host the same open-source engine. Start with Python, TypeScript, cURL, or MCP โ you never touch Rust.
Beats Firecrawl and Crawl4AI on truth-recall โ measured on Firecrawl's own public dataset.
Quickstart ยท Docs ยท Pricing
Works with Claude Code ยท Cursor ยท Windsurf ยท Cline ยท Codex ยท Gemini CLI
Quickstart โ your first scrape in 30 seconds
Get a free API key โ fastcrw.com/register โ 500 free credits (1 credit โ 1 page), no card.
export CRW_API_KEY="crw_live_..."
# cURL โ works anywhere, no SDK
curl -X POST https://api.fastcrw.com/v1/scrape \
-H "Authorization: Bearer $CRW_API_KEY" -H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["markdown"]}'
| Python | Node.js |
|---|---|
|
|
In both SDKs page is a plain object (markdown, metadata, contentType, โฆ), so page["markdown"] / page.markdown is clean content:
# Example Domain
This domain is for use in documentation examples without needing permission. Avoid use in operations.
[Learn more](https://iana.org/domains/example)
Over cURL you get the same fields wrapped in {"success": true, "data": { โฆ }}.
Prefer no SDK? Every example works over plain HTTP against https://api.fastcrw.com.
That first scrape spent 1 of your 500 free credits โ see plans โ when you need more.
Got one page? Crawl the whole site: crw.crawl("https://docs.example.com") returns every page โ then search, map, and extract in Core operations. Full docs: Quickstart โ ยท API reference โ
Firecrawl's own public 1,000-URL dataset, with all three tools run through the same
matcher (diagnose_3way.py): a fairness control, not a looser number. The panel is
generated from the run of record, not drawn by hand: scripts/bench-radar.py.
Full table and one-command repro โ
Why fastCRW?
- Most accurate โ the highest truth-recall (how much of the real page content it captures): 63.7% on 819 labeled URLs in Firecrawl's public dataset, vs Firecrawl 56.0% and Crawl4AI 60.0% โ and it recovers 34 pages both miss.
- Fast median, tunable latency โ the fastest median latency (p50 1914 ms โ a statistical tie with Crawl4AI's 1916 ms, ahead of Firecrawl's 2305 ms). Recall mode maximizes accuracy; fast mode trades the recall tail for lower latency. One config toggle โ pick accuracy or latency.
- Lighter โ one static binary, ~50 MB RAM idle. No Redis, no Node, no Chromium heap in the request path โ it runs on a $5 VPS.
Search, map, and crawl run on the same engine โ built-in web search (a free self-hostable search backend), so there's no separate search vendor and no per-query search-API bill. See the full benchmark โ
Open source (AGPL-3.0), passing OpenSSF Best Practices, and published on PyPI ยท npm ยท crates.io ยท Homebrew ยท APT โ with a benchmark you can rerun yourself, not marketing math.
What you get
- Any URL โ LLM-ready output. Clean markdown, HTML, links, or schema-validated JSON โ no HTML soup, no boilerplate.
- One API, six operations.
searchthe web andscrapea page, ormap/crawl/extract/monitora whole site โ see below. - Drop-in Firecrawl compatibility. Migrate existing Firecrawl code by changing one base URL.
- Managed or self-hosted, same API. No exit cost โ develop against the free open-source binary, ship to the cloud, or the reverse. Nothing changes but the base URL.
Use it in your AI agent (MCP)
fastCRW ships a built-in MCP server, so any MCP host can search/scrape/crawl with no glue code.
# Claude Code โ managed
claude mcp add crw \
-e CRW_API_URL=https://api.fastcrw.com -e CRW_API_KEY=$CRW_API_KEY \
-- npx -y crw-mcp
# Claude Code โ embedded (no server, no key โ runs the engine locally, on your machine)
claude mcp add crw -- npx -y crw-mcp
Per-client recipes (Cursor, Windsurf, Cline, Continue.dev, Codex, Gemini CLI): docs.fastcrw.com/mcp-clients/
Agent Skills
Reusable instruction packs that teach coding agents when and how to use each verb. Install all 13 into every detected agent with one command:
npx skills add us/crw # all skills, every detected agent
npx skills add us/crw@crw-scrape # just one
npx skills add -g us/crw # global (user-level)
crw (hub) ยท crw-search ยท crw-scrape ยท crw-map ยท crw-crawl ยท crw-parse ยท
crw-extract ยท crw-watch ยท crw-research ยท crw-dynamic-search (biggest token-saver) ยท
crw-best-practices ยท crw-migrate ยท crw-self-host. Full catalog: skills/.
Core operations
| Verb | Endpoint | Does |
|---|---|---|
| Search | POST /v1/search | Web search (own search backend), optionally scrape each result |
| Scrape | POST /v1/scrape | One URL โ markdown / HTML / links / schema JSON |
| Map | POST /v1/map | Discover every URL on a site, fast |
| Crawl | POST /v1/crawl | Async crawl of a whole site (returns a job id you poll) |
| Extract | POST /v1/extract (async, multi-URL) or POST /v1/scrape formats:["json"] (inline, one URL) | Structured fields from a JSON Schema |
| Monitor | POST /v1/change-tracking/diff | Diff a page vs a snapshot โ the change-tracking building block behind scheduled monitoring |
SDK return shapes: scrape / extract โ one object ยท map โ list of URLs ยท crawl โ list of result objects ยท search โ list, or a dict grouped by source when sources=[...] is set.
Full reference: docs.fastcrw.com/#rest-api.
SDKs & integrations
pip install crw # Python package: crw
npm install crw-sdk # Node / TypeScript package: crw-sdk (not crw)
from crw import CrwClient
client = CrwClient() # reads CRW_API_KEY; set CRW_LOCAL=1 for local embedded mode
client.scrape("https://example.com", formats=["markdown", "links"])
# .search() .map() .crawl() .extract() โ one method per operation in the table above
import { CrwClient } from "crw-sdk";
const crw = new CrwClient(); // reads CRW_API_KEY; new CrwClient({ apiUrl }) for self-host
await crw.scrape("https://example.com", { formats: ["markdown", "links"] });
// .search() .map() .crawl() .extract() โ same methods, all typed
The TypeScript client is typed and zero-dependency; its cloud path is pure fetch, so it runs
on Node 18+, Bun, Deno, and edge runtimes. The Python client is synchronous โ wrap long calls
like crawl() / extract() in asyncio.to_thread inside async code. Both client SDKs (crw,
crw-sdk) are MIT-licensed โ installing them imposes nothing on your code; AGPL-3.0 covers only the engine.
LangChain and CrewAI integrations ship in the package:
from crw.integrations.langchain import CrwLoader # pip install crw[langchain]
from crw.integrations.crewai import CrwScrapeWebsiteTool # pip install crw[crewai]
All integrations โ ยท SDK examples โ
Managed cloud vs self-host
Same binary, same API in both modes โ switch anytime by changing the base URL. Most teams run on the managed cloud: it scales with your traffic, rotates proxies, and stays patched, so you ship features instead of operating a scraper.
Managed โ api.fastcrw.com ย ยทย recommended for most teams | Self-host | |
|---|---|---|
| Best for | Shipping fast at any scale, with zero infrastructure to run | Data-residency, air-gapped, or compliance-bound deployments |
| Scale | Grows with you โ 500 free credits to millions of pages/month, higher concurrency per tier, no capacity planning | You size, scale, and monitor the machines yourself |
| Proxies & rendering | Managed global proxy network + rendering, rotated for you to get through blocked pages | Bring your own proxy pool and browser tier |
| Ops & reliability | Fully managed โ dashboard, usage metering, API keys, monitored infra; nothing to patch or babysit | You run, patch, upgrade, and monitor it |
| Start | Sign up โ 500 free credits, no card | docker run -p 3000:3000 ghcr.io/us/crw |
| Cost | Free tier, then plans from $11/mo โ pricing | $0 license โ you pay for the infra and your team's time |
| License | You call an API โ no copyleft on your code | AGPL-3.0 โ copyleft if you bundle the engine or run a modified public service |
Air-gapped note: the crw engine itself makes no telemetry calls. The default Docker Compose stack disables the LightPanda renderer's third-party telemetry (
LIGHTPANDA_DISABLE_TELEMETRY=true). If you run a fully air-gapped deployment, verify egress for any renderer sidecars you enable and pin their images to a digest. See self-hosting hardening.
Self-host in one command
docker run -p 3000:3000 ghcr.io/us/crw
curl http://localhost:3000/v1/scrape \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'
Or install the CLI and scrape straight from your shell:
brew install us/crw/crw # macOS & Linux
curl -fsSL https://apt.fastcrw.com/setup.sh | sudo sh # Debian & Ubuntu
curl -fsSL https://fastcrw.com/install | sh # any platform, no package manager
crw scrape https://example.com
Prefer Cargo, Docker Compose with a stealth tier, or building from source? All install paths and production hardening: docs.fastcrw.com/installation/ ยท self-hosting guide โ
Skip the setup โ 500 free credits on the managed cloud, no card.
Why it's fast (built in Rust)
You don't need Rust to use fastCRW โ it's why the numbers below are what they are. The engine is a single static binary: no Redis, no Node runtime, no Python venv, no headless-browser sidecar parked in the request path. Cold start is sub-second and idle RAM sits around ~50 MB, so one process saturates a $5 VPS instead of a multi-container stack. An agent that fires N scrapes per task pays the network floor N times โ fastCRW strips process-spawn, JIT-warmup, and browser-navigation overhead out of every one.
Benchmark
The numbers above come from Firecrawl's own public 1,000-URL dataset, run identically across all three tools with the same matcher โ a fairness control, not a looser number. Reproducible, not marketing math. Full table, methodology, and the repro harness: BENCHMARKS.md ยท fastcrw.com/benchmarks.
Migrating from Firecrawl
New projects use native /v1. Existing Firecrawl v2 SDK code works against the
/firecrawl/v2/* compatibility layer โ often just a base-URL swap (point your existing
Firecrawl client at api.fastcrw.com, the address it sends requests to):
from firecrawl import FirecrawlApp
app = FirecrawlApp(api_url="https://api.fastcrw.com", api_key="YOUR_CRW_API_KEY")
Compatibility reduces migration work, not every behavioral difference โ check request
bodies, response fields, and unsupported features before moving production traffic.
Field-by-field diff: COMPATIBILITY-firecrawl.md.
Security
SSRF protection (blocks loopback, private IPs, cloud metadata, non-HTTP schemes), optional constant-time Bearer auth, RFC 9309 robots.txt, token-bucket rate limiting, and resource caps (1 MB body, depth 10, 1,000 pages). Hardening guide โ
Contributing
Issues and PRs welcome. make hooks installs the pre-commit hook; make check runs the same
checks as CI. Setup, architecture, and crate layout: CONTRIBUTING.md.
Contributors
Everyone who has landed a commit, refreshed weekly from the contributor graph.
License
Open source under AGPL-3.0. Calling the API over the network โ managed or self-hosted โ imposes nothing on your own code. AGPL only applies if you bundle the engine's code directly inside your own app (not just call its API) or run a modified copy as a public service; for those cases the managed offering at fastcrw.com includes a commercial carve-out, and standalone commercial licenses are available โ hello@fastcrw.com.
Links
Docs ยท API reference ยท MCP setup ยท Benchmarks ยท Pricing ยท Changelog ยท Discord ยท X
Star History
It is the sole responsibility of end users to respect websites' policies when
scraping. By default, fastCRW respects robots.txt directives.