CRW — open-source web scraper & crawler (Firecrawl-compatible)

Docs at docs.fastcrw.com. Hosted API at https://api.fastcrw.com. Self-hosted at http://localhost:3000. Five endpoints: /v1/search, /v1/scrape, /v1/crawl, /v1/map, /v1/extract.

Quick: copy this and run

Auth (hosted only): Authorization: Bearer $CRW_API_KEY. Self-hosted (http://localhost:3000) needs no header.

Body: { "query": string, "limit": number (default 5, max 20), "lang"?: "en", "tbs"?: "qdr:d|w|m|y", "sources"?: ["web"|"news"|"images"] }

Python (stdlib only — defaults to hosted, fails loudly if key is missing)

#!/usr/bin/env python3
"""Search CRW and print top results as JSON."""
import json, os, sys, urllib.request

API_KEY = os.environ.get("CRW_API_KEY")
# Default to the hosted API. Self-hosting? Set CRW_API_URL=http://localhost:3000
BASE = os.environ.get("CRW_API_URL", "https://api.fastcrw.com")
URL = f"{BASE}/v1/search"

headers = {"Content-Type": "application/json"}
if API_KEY:
    headers["Authorization"] = f"Bearer {API_KEY}"
elif BASE.startswith("https://api.fastcrw.com"):
    sys.exit("error: CRW_API_KEY is required for the hosted API. "
             "Get one at https://fastcrw.com (1000 free credits) "
             "or set CRW_API_URL=http://localhost:3000 to self-host.")

req = urllib.request.Request(
    URL,
    data=json.dumps({"query": "renewable energy trends 2024", "limit": 3}).encode(),
    headers=headers,
    method="POST",
)
with urllib.request.urlopen(req) as r:
    body = json.loads(r.read())  # body == {"success": true, "data": [...]}

# Results live under body["data"]. Each row has `title`, `url`, `snippet`,
# `description`, `position`, `score`, `category` — print the LLM-ready subset.
print(json.dumps(
    [{"title": x["title"], "url": x["url"], "snippet": x["snippet"]}
     for x in body["data"]],
    indent=2,
))
# Run with: python3 search.py  (file is python3-only — no `python` alias needed)

cURL

curl -X POST https://api.fastcrw.com/v1/search \
  -H "Authorization: Bearer $CRW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"renewable energy trends 2024","limit":3}'

CLI (one-shot LLM-ready output)

The crw CLI projects directly to the title/url/snippet schema with --json --fields — no jq reshape needed:

# Install: brew install us/crw/crw  (or: cargo install crw-cli)
crw search "renewable energy trends 2024" --json --fields title,url,snippet --limit 3

# Available fields: title, url, description, snippet, position, score, category
# --json is shorthand for --format json (also accepts --format text|markdown)
# Self-hosted: no auth. Hosted: export CRW_API_KEY=crw_live_...

Response shape

{
  "success": true,
  "data": [
    {"url": "https://...", "title": "...",
     "description": "...", "snippet": "...",
     "position": 1, "score": 9.5}
  ]
}

Other endpoints

  • POST /v1/scrape {"url":"...","formats":["markdown"]} — one URL → markdown
  • POST /v1/map {"url":"...","limit":50} — discover URLs
  • POST /v1/crawl {"url":"...","maxPages":5} — async multi-page; poll GET /v1/crawl/{id}
  • POST /v1/scrape with formats:["json"] + jsonOptions.schema — structured extract

Install (local setup only)

pip install crw · npx crw-mcp · brew install us/crw/crw · curl -fsSL https://fastcrw.com/install | sh · docker run -p 3000:3000 ghcr.io/us/crw:latest

Resources

  • OpenAPI spec
  • llms.txt
  • Context7
  • MCP Server (npm)
  • Typed Python SDK
  • Agent Skills (SKILL.md)
  • CLI (Homebrew tap)
  • GitHub
CRW CRW fastcrw
us/crw Status Sign Up
On this page
CRW CRW CRW
Ready to scrape?
Sign up and get 1000 free credits instantly. No credit card required.
Get started, 1000 free credits View on GitHub
CRW CRW CRW
The base layer for agentic web intelligence.
Product
Documentation API Reference MCP Server Changelog
Community
GitHub Issues Discord
Legal
License (AGPL-3.0)
© 2026 CRW. All rights reserved.
All systems operational
esc