crw-migrate

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

crw-migrate — Coming from Firecrawl?

crw-migrate — 从Firecrawl迁移?

Switch in one line. The v2 API is a drop-in for the official
firecrawl-py
v4 SDK and
firecrawl-js
— swap the base URL and keep your code.
只需一行代码即可切换。v2 API可直接替代官方
firecrawl-py
v4 SDK和
firecrawl-js
——只需替换基础URL,代码无需改动。

When to use

使用场景

  • You have existing Firecrawl SDK code or REST calls you want to repoint.
  • You're replacing a
    firecrawl-mcp-server
    entry in your MCP config.
  • You want to know exactly which Firecrawl endpoints are covered vs. which need adaptation.
  • 您已有Firecrawl SDK代码或REST调用,希望将其指向新服务。
  • 您需要替换MCP配置中的
    firecrawl-mcp-server
    条目。
  • 您想明确了解哪些Firecrawl端点可直接兼容,哪些需要适配。

The one-line swap

一行代码替换

firecrawl-py v4 (Python SDK)

firecrawl-py v4(Python SDK)

Managed fastCRW:
python
from firecrawl import FirecrawlApp

app = FirecrawlApp(
    api_url="https://api.fastcrw.com",
    api_key="crw_live_..."
)
Self-hosted fastCRW (default port 3000, no auth):
python
app = FirecrawlApp(
    api_url="http://localhost:3000",
    api_key="any"          # self-host ignores the key when auth is not configured
)
托管版fastCRW:
python
from firecrawl import FirecrawlApp

app = FirecrawlApp(
    api_url="https://api.fastcrw.com",
    api_key="crw_live_..."
)
自托管版fastCRW(默认端口3000,无认证):
python
app = FirecrawlApp(
    api_url="http://localhost:3000",
    api_key="any"          # 未配置认证时,自托管版本会忽略密钥
)

firecrawl-js (TypeScript/Node SDK)

firecrawl-js(TypeScript/Node SDK)

ts
import FirecrawlApp from "@mendable/firecrawl-js";

const app = new FirecrawlApp({
  apiUrl: "https://api.fastcrw.com",   // or "http://localhost:3000"
  apiKey: "crw_live_...",
});
ts
import FirecrawlApp from "@mendable/firecrawl-js";

const app = new FirecrawlApp({
  apiUrl: "https://api.fastcrw.com",   // 或 "http://localhost:3000"
  apiKey: "crw_live_...",
});

REST / curl

REST / curl

Replace
https://api.firecrawl.dev
with
https://api.fastcrw.com
(or your self-hosted
http://localhost:3000
). Auth header stays the same:
Authorization: Bearer <key>
.
bash
undefined
https://api.firecrawl.dev
替换为
https://api.fastcrw.com
(或您的自托管地址
http://localhost:3000
)。认证头保持不变:
Authorization: Bearer <key>
bash
undefined

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"]}'
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"]}'
undefined
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"]}'
undefined

Compatibility matrix

兼容性矩阵

Drop-in endpoints (no code change needed)

可直接兼容的端点(无需修改代码)

EndpointNotes
POST /v1/scrape
Full markdown/html/links/json formats,
onlyMainContent
,
waitFor
,
renderJs
,
includeTags
/
excludeTags
POST /v1/crawl
+
GET /v1/crawl/:id
+
DELETE /v1/crawl/:id
Async BFS crawl, polling shape matches
POST /v1/map
URL discovery
POST /v1/search
Own search backend instead of Fire-engine; same response shape
POST /v2/scrape
v2 surface with
parsers
field for PDFs
POST /v2/crawl
+
GET /v2/crawl/active
v2 crawl
POST /v2/map
v2 map
POST /v2/search
v2 search
POST /v2/batch/scrape
Batch scrape
POST /v2/parse
PDF → markdown (see gaps below)
端点说明
POST /v1/scrape
支持完整的markdown/html/links/json格式,以及
onlyMainContent
waitFor
renderJs
includeTags
/
excludeTags
参数
POST /v1/crawl
+
GET /v1/crawl/:id
+
DELETE /v1/crawl/:id
异步广度优先爬取,轮询格式完全匹配
POST /v1/map
URL发现功能
POST /v1/search
使用独立搜索后端而非Fire-engine;响应格式一致
POST /v2/scrape
带有
parsers
字段的v2接口,支持PDF处理
POST /v2/crawl
+
GET /v2/crawl/active
v2版本爬取功能
POST /v2/map
v2版本URL发现功能
POST /v2/search
v2版本搜索功能
POST /v2/batch/scrape
批量爬取功能
POST /v2/parse
PDF转markdown(详见下方差异点)

Gaps — what needs adaptation

差异点 — 需要适配的功能

Firecrawl featurefastCRW equivalentAction
POST /v1/extract
(standalone LLM extraction route)
Supported. Async: returns a job id, poll
GET /v1/extract/{id}
.
POST /v1/scrape
with
formats: ["json"]
+
jsonSchema
also works inline for a single URL.
None, but switch to polling if you port the route as-is.
POST /v1/extract
multi-URL batch
Supported. Pass
urls: [...]
; the cap is
limits.maxExtractUrls
on
GET /v1/capabilities
(default 50).
None.
POST /v1/deep-research
Not implemented — cloud-only Firecrawl feature.No equivalent.
POST /v1/agent
(Spark models)
Not implemented.No equivalent.
/v2/parse
— DOCX/XLSX/RTF/ODT
PDF only. fastCRW uses
pdf-inspector
(no OCR).
Keep Firecrawl for non-PDF docs, or convert to PDF first.
parsers: [{mode: "ocr"}]
Accepted for wire-compat; degrades to text-layer extraction with a
pdf_ocr_unsupported
warning (no OCR engine).
If OCR is required, keep Firecrawl.
MCP tool names
firecrawl_*
fastCRW MCP uses
crw_*
(see below).
Update MCP config.
Fire-engine anti-botNot available. fastCRW uses LightPanda → Chrome stealth ladder.For heavy Cloudflare sites, test coverage; consider proxy pool.
Firecrawl功能fastCRW等效方案操作建议
POST /v1/extract
(独立LLM提取接口)
已支持。异步模式:返回任务ID,需轮询
GET /v1/extract/{id}
。使用
POST /v1/scrape
并设置
formats: ["json"]
+
jsonSchema
也可实现单URL的内联提取。
无需修改,但如果直接迁移该接口,需切换为轮询模式。
POST /v1/extract
多URL批量提取
已支持。传入
urls: [...]
;上限为
GET /v1/capabilities
中的
limits.maxExtractUrls
(默认50)。
无需修改。
POST /v1/deep-research
未实现 — Firecrawl专属云功能。无等效方案。
POST /v1/agent
(Spark模型)
未实现。无等效方案。
/v2/parse
— DOCX/XLSX/RTF/ODT格式支持
仅支持PDF。fastCRW使用
pdf-inspector
(无OCR功能)。
非PDF文档需继续使用Firecrawl,或先转换为PDF格式。
parsers: [{mode: "ocr"}]
为兼容保留参数;会降级为文本层提取,并返回
pdf_ocr_unsupported
警告(无OCR引擎)。
若需要OCR功能,需继续使用Firecrawl。
MCP工具名称
firecrawl_*
fastCRW MCP使用
crw_*
(详见下方)。
更新MCP配置。
Fire-engine反爬机制不可用。fastCRW使用LightPanda → Chrome隐身阶梯方案。针对受Cloudflare严格保护的站点,需测试覆盖情况;可考虑使用代理池。

jsonSchema
alias

jsonSchema
别名

Firecrawl's
/v1/extract
uses
extract.schema
. fastCRW's
/v1/scrape
accepts both the
jsonSchema
top-level field and the
extract.schema
alias for closer Firecrawl parity:
json
{
  "url": "https://example.com",
  "formats": ["json"],
  "jsonSchema": {
    "type": "object",
    "properties": { "title": { "type": "string" } }
  }
}
Requires
[extraction.llm]
configured in
config.toml
(or
CRW_EXTRACTION__LLM__API_KEY
env var). See crw-self-host.
Firecrawl的
/v1/extract
使用
extract.schema
。fastCRW的
/v1/scrape
同时支持顶层字段
jsonSchema
和别名
extract.schema
,以实现与Firecrawl更高的兼容性:
json
{
  "url": "https://example.com",
  "formats": ["json"],
  "jsonSchema": {
    "type": "object",
    "properties": { "title": { "type": "string" } }
  }
}
需在
config.toml
中配置
[extraction.llm]
(或设置环境变量
CRW_EXTRACTION__LLM__API_KEY
)。详见crw-self-host

Switching your MCP config

切换MCP配置

Firecrawl MCP uses
firecrawl-mcp-server
; fastCRW's MCP server is
crw-mcp
. Tool names change from
firecrawl_*
to
crw_*
:
Firecrawl MCP toolfastCRW MCP tool
firecrawl_scrape
crw_scrape
firecrawl_crawl
crw_crawl
firecrawl_check_crawl_status
crw_check_crawl_status
firecrawl_map
crw_map
firecrawl_search
crw_search
firecrawl_extract
crw_scrape
with
formats=["json"]
+
jsonSchema
crw_parse_file
(PDF upload; no Firecrawl MCP equivalent)
Firecrawl MCP使用
firecrawl-mcp-server
;fastCRW的MCP服务器为
crw-mcp
。工具名称从
firecrawl_*
改为
crw_*
Firecrawl MCP工具fastCRW MCP工具
firecrawl_scrape
crw_scrape
firecrawl_crawl
crw_crawl
firecrawl_check_crawl_status
crw_check_crawl_status
firecrawl_map
crw_map
firecrawl_search
crw_search
firecrawl_extract
crw_scrape
(搭配
formats=["json"]
+
jsonSchema
crw_parse_file
(PDF上传;Firecrawl MCP无等效功能)

Claude Code — replace in
~/.claude/claude_desktop_config.json
(or settings)

Claude Code — 在
~/.claude/claude_desktop_config.json
(或设置界面)中替换

json
{
  "mcpServers": {
    "crw": {
      "command": "npx",
      "args": ["crw-mcp"],
      "env": {
        "CRW_API_URL": "https://api.fastcrw.com",
        "CRW_API_KEY": "crw_live_..."
      }
    }
  }
}
For self-hosted (no auth, no env needed):
json
{
  "mcpServers": {
    "crw": {
      "command": "npx",
      "args": ["crw-mcp"]
    }
  }
}
Embedded mode (
npx crw-mcp
with no
CRW_API_URL
) runs the engine in-process — zero server to stand up, ~6 MB RAM.
json
{
  "mcpServers": {
    "crw": {
      "command": "npx",
      "args": ["crw-mcp"],
      "env": {
        "CRW_API_URL": "https://api.fastcrw.com",
        "CRW_API_KEY": "crw_live_..."
      }
    }
  }
}
自托管版(无认证,无需设置环境变量):
json
{
  "mcpServers": {
    "crw": {
      "command": "npx",
      "args": ["crw-mcp"]
    }
  }
}
嵌入模式(执行
npx crw-mcp
且不设置
CRW_API_URL
)会在进程内运行引擎——无需启动独立服务器,仅占用约6MB内存。

Verify the swap — checklist

验证切换完成 — 检查清单

Run these after pointing at fastCRW. Each should return
"success": true
:
bash
undefined
指向fastCRW后运行以下命令,每个命令应返回
"success": true
bash
undefined

1. Health check (no auth)

1. 健康检查(无需认证)

→ {"status":"ok",...}

→ {"status":"ok",...}

2. Basic scrape

2. 基础爬取

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
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

→ true

3. Map (URL discovery)

3. URL发现

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'
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)

→ N(应大于0)

4. Search (requires a search backend — managed always works; self-host needs sidecar)

4. 搜索(需搜索后端支持——托管版始终可用;自托管版需要配套服务)

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
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

→ true

5. Structured extraction (requires [extraction.llm] configured)

5. 结构化提取(需配置[extraction.llm])

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'

Compare the `data.markdown` / `data.metadata` shape from your existing
Firecrawl responses — the field names on the overlap surface (`title`,
`description`, `sourceURL`, `statusCode`) match. A few metadata sub-fields
diverge; inspect with `jq .data.metadata` if your code reads specific keys.
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'

对比现有Firecrawl响应中的`data.markdown` / `data.metadata`格式——重叠字段(`title`、`description`、`sourceURL`、`statusCode`)的名称一致。部分元数据子字段存在差异;如果您的代码读取特定键值,请使用`jq .data.metadata`检查。

See also

扩展阅读

  • crw-self-host — stand up your own crw server + search backend
  • crw-best-practices — SDK patterns, error handling, batching
  • crw — hub skill, full verb ladder
  • crw-self-host — 搭建自己的crw服务器+搜索后端
  • crw-best-practices — SDK使用模式、错误处理、批量操作
  • crw — 核心技能汇总、完整功能说明