Loading...
Loading...
Coming from Firecrawl? Switch to fastCRW in one line. Use when the user has existing Firecrawl SDK code (firecrawl-py, firecrawl-js, REST calls, or an MCP config) and wants to point it at fastCRW — managed or self-hosted. Covers the exact base_url swap, which endpoints are drop-in, which have gaps, and how to verify the switch worked.
npx skill4agent add us/crw crw-migratefirecrawl-pyfirecrawl-jsfirecrawl-mcp-serverfrom firecrawl import FirecrawlApp
app = FirecrawlApp(
api_url="https://api.fastcrw.com",
api_key="crw_live_..."
)app = FirecrawlApp(
api_url="http://localhost:3000",
api_key="any" # self-host ignores the key when auth is not configured
)import FirecrawlApp from "@mendable/firecrawl-js";
const app = new FirecrawlApp({
apiUrl: "https://api.fastcrw.com", // or "http://localhost:3000"
apiKey: "crw_live_...",
});https://api.firecrawl.devhttps://api.fastcrw.comhttp://localhost:3000Authorization: Bearer <key># Before
curl -X POST https://api.firecrawl.dev/v1/scrape \
-H "Authorization: Bearer crw_live_..." \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["markdown"]}'
# After — change exactly two things: host + key
curl -X POST https://api.fastcrw.com/v1/scrape \
-H "Authorization: Bearer crw_live_..." \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["markdown"]}'| Endpoint | Notes |
|---|---|
| Full markdown/html/links/json formats, |
| Async BFS crawl, polling shape matches |
| URL discovery |
| Own search backend instead of Fire-engine; same response shape |
| v2 surface with |
| v2 crawl |
| v2 map |
| v2 search |
| Batch scrape |
| PDF → markdown (see gaps below) |
| Firecrawl feature | fastCRW equivalent | Action |
|---|---|---|
| Supported. Async: returns a job id, poll | None, but switch to polling if you port the route as-is. |
| Supported. Pass | None. |
| Not implemented — cloud-only Firecrawl feature. | No equivalent. |
| Not implemented. | No equivalent. |
| PDF only. fastCRW uses | Keep Firecrawl for non-PDF docs, or convert to PDF first. |
| Accepted for wire-compat; degrades to text-layer extraction with a | If OCR is required, keep Firecrawl. |
MCP tool names | fastCRW MCP uses | Update MCP config. |
| Fire-engine anti-bot | Not available. fastCRW uses LightPanda → Chrome stealth ladder. | For heavy Cloudflare sites, test coverage; consider proxy pool. |
jsonSchema/v1/extractextract.schema/v1/scrapejsonSchemaextract.schema{
"url": "https://example.com",
"formats": ["json"],
"jsonSchema": {
"type": "object",
"properties": { "title": { "type": "string" } }
}
}[extraction.llm]config.tomlCRW_EXTRACTION__LLM__API_KEYfirecrawl-mcp-servercrw-mcpfirecrawl_*crw_*| Firecrawl MCP tool | fastCRW MCP tool |
|---|---|
| |
| |
| |
| |
| |
| |
| — | |
~/.claude/claude_desktop_config.json{
"mcpServers": {
"crw": {
"command": "npx",
"args": ["crw-mcp"],
"env": {
"CRW_API_URL": "https://api.fastcrw.com",
"CRW_API_KEY": "crw_live_..."
}
}
}
}{
"mcpServers": {
"crw": {
"command": "npx",
"args": ["crw-mcp"]
}
}
}npx crw-mcpCRW_API_URL"success": true# 1. Health check (no auth)
curl http://localhost:3000/health
# → {"status":"ok",...}
# 2. Basic scrape
curl -X POST "$CRW_API_URL/v1/scrape" \
-H "Authorization: Bearer $CRW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["markdown"]}' | jq .success
# → true
# 3. Map (URL discovery)
curl -X POST "$CRW_API_URL/v1/map" \
-H "Authorization: Bearer $CRW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}' | jq '.data | length'
# → N (should be > 0)
# 4. Search (requires a search backend — managed always works; self-host needs sidecar)
curl -X POST "$CRW_API_URL/v1/search" \
-H "Authorization: Bearer $CRW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"fastCRW scraper","limit":3}' | jq .success
# → true
# 5. Structured extraction (requires [extraction.llm] configured)
curl -X POST "$CRW_API_URL/v1/scrape" \
-H "Authorization: Bearer $CRW_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url":"https://example.com",
"formats":["json"],
"jsonSchema":{"type":"object","properties":{"title":{"type":"string"}}}
}' | jq '.data.json'data.markdowndata.metadatatitledescriptionsourceURLstatusCodejq .data.metadata