<!-- twin of https://specstream.ai/migrate/firecrawl-crawl -->
# Firecrawl crawl and map compatible: change the address

Compared on Nov 10, 2026. The page: https://specstream.ai/migrate/firecrawl-crawl

Since November 10, 2026 SpecStream answers Firecrawl's `POST /v2/map`, `POST /v2/crawl` and `GET` and `DELETE /v2/crawl/{id}` in Firecrawl's own JSON. A crawled page costs $0.0008, and a page that gives no text costs nothing.

The switch is one line: `Firecrawl(api_key=KEY, api_url="https://api.specstream.ai/firecrawl")` in place of `Firecrawl(api_key="fc-...")`. The crawl waiter, `next` and your parser stay.

The SpecStream Extract API scores 0.908 F1 on WCXB. A map costs $0.0008, credit you buy never expires, and a new account gets $10 of credit, no card.

[Get an API key](https://specstream.ai/signup?src=alternatives-migrate-firecrawl-crawl&utm_source=alternatives-md&utm_campaign=migrate-firecrawl-crawl&returnTo=%2Fworkspace%2Fsearch%3Froute%3Dfirecrawl_site) New accounts get $10 of credit, no card. It covers 12,500 pages.

## Firecrawl crawl and map to SpecStream, parameter by parameter and field by field

| | SpecStream | Firecrawl |
|---|---|---|
| Address | `https://api.specstream.ai/firecrawl`, then `/v2/map`, `/v2/crawl` and `/v2/crawl/{id}` | `https://api.firecrawl.dev/v2`, then `/map`, `/crawl` and `/crawl/{id}` |
| The key | A SpecStream key as `Authorization: Bearer` | A Firecrawl key as `Authorization: Bearer fc-...` |
| Map | `url`, `limit`, `search`, `ignoreQueryParameters`, `sitemap` and `includeSubdomains` applied. Up to 5,000 links a map | The same parameters. 1 credit a call |
| Crawl | `url`, `limit`, `includePaths`, `excludePaths`, `maxDiscoveryDepth`, `crawlEntireDomain` and `scrapeOptions.formats` applied. Up to 500 pages a job | The same parameters, `limit` defaults to 10,000. 1 credit a page |
| Crawl status | `status`, `total`, `completed`, `creditsUsed`, `expiresAt`, `next` and `data[]` with `markdown`, `html`, `rawHtml`, `links` and `metadata` | The same, plus `createdAt`, `completedAt` and `duration` |
| Errors | Firecrawl's own: `404` for an unknown crawl id, `401` for a wrong key, `409` for a cancel of a finished job. A busy call gets `429` with `Retry-After` and is not charged | `401` for a missing or revoked key, `402` when credits run out, `429` rate limit exceeded |
| Price | $0.80 per 1,000 pages. A map is one page read, $0.0008. $19 reads 23,750 pages | Hobby $19 a month for 5,000 credits. Standard $99 a month for 100,000 |
| Failed page | A page that gives no text is not charged | A page that returns a document is billed, including a `404`. No document is 0 credits |
| Free to start | $10 of credit, no card, which covers 12,500 pages | 1,000 free credits a month, no card |

## The Firecrawl crawl and map reference, on SpecStream

### The call, before and after

```
# Before
curl https://api.firecrawl.dev/v2/crawl \
  -H "Authorization: Bearer $FIRECRAWL_API_KEY" -H "Content-Type: application/json" \
  -d '{"url": "https://quotes.toscrape.com/", "limit": 10}'

# After
curl https://api.specstream.ai/firecrawl/v2/crawl \
  -H "Authorization: Bearer $SPECSTREAM_API_KEY" -H "Content-Type: application/json" \
  -d '{"url": "https://quotes.toscrape.com/", "limit": 10}'
```

The reply is Firecrawl's: `{"success": true, "id": "...", "url": "https://api.specstream.ai/firecrawl/v2/crawl/<id>"}`. Read that `url` until `status` is `completed`, and follow `next` while it is set.

With firecrawl-py 4.55.0 the change is one line: `Firecrawl(api_key=KEY, api_url="https://api.specstream.ai/firecrawl")`. `map`, `crawl` with its waiter, `start_crawl`, `get_crawl_status` and `cancel_crawl` run as before. With @mendable/firecrawl-js 4.52.0 it is `new Firecrawl({ apiKey: KEY, apiUrl: "https://api.specstream.ai/firecrawl" })`, which passed 6 of 6 checks.

### Apps and SDKs that take the address as a setting

Each line was run on production on November 10, 2026 through that client's own request and reply code. Put your SpecStream key wherever the client takes its key.

LlamaIndex, `llama-index-readers-web` 0.7.0: pass `api_url="https://api.specstream.ai/firecrawl"` to `FireCrawlWebReader`, with your SpecStream key as `api_key`. Its `crawl` and `map` modes run through this route.

LangChain, `langchain-firecrawl` 0.1.0: pass `api_url="https://api.specstream.ai/firecrawl"` to `FirecrawlLoader`. Its `crawl` and `map` modes run through this route.

Dify: in the Firecrawl data source credential, set the base URL to `https://api.specstream.ai/firecrawl`. Its website crawl then runs on SpecStream.

### What the route reads, and what it refuses

Map, applied: `url`, `limit`, `search` (matching links first), `ignoreQueryParameters` (on by default, as on Firecrawl), `sitemap` as `include`, `skip` or `only`, and `includeSubdomains`. A map gives up to 5,000 links.

Crawl, applied: `url`, `limit`, `includePaths`, `excludePaths`, `maxDiscoveryDepth`, `crawlEntireDomain` and `scrapeOptions.formats` with `markdown`, `html`, `rawHtml` and `links`. A crawl job reads up to 500 pages. `start_crawl`, the status read and `DELETE` to cancel work as Firecrawl's do.

Refused, in Firecrawl's own status and body: an unknown crawl id gets `404`, a wrong key gets `401`, a cancel of a finished job gets `409`, and a call with no `url` gets `400`. Every parameter was measured on production on Nov 10, 2026, and the full [pass table](https://specstream.ai/specstream/dialects/firecrawl_site.md) lists each one and its result.

### Every field that comes back

A map returns `success` and `links[]` with `url`. A crawl start returns `success`, `id` and `url`. A status read returns `success`, `status`, `total`, `completed`, `creditsUsed`, `expiresAt`, `next` and `data[]`, each page with `markdown`, `html`, `rawHtml` and `links` as asked, and `metadata` with `title`, `sourceURL`, `url`, `statusCode` and `error`.

The route does not return `links[].title` and `links[].description` on a map, `createdAt`, `completedAt` and `duration` on a status read, or `screenshot`, `metadata.description` and `metadata.language` on a page.

### One price a page, and a failed page is free

On Firecrawl a crawled page is 1 credit and a map is 1 credit, from a monthly plan: Hobby is $19 for 5,000 credits. On SpecStream every crawled page that gives text costs $0.0008, which is $0.80 per 1,000, and a map that gives links costs one page read, $0.0008. `creditsUsed` counts the pages charged. A busy call gets `429` with `Retry-After` and charges nothing. Credit you buy never expires.

### Scored on the official benchmarks

The SpecStream Extract API scores 0.908 F1 on WCXB. The Search API scores 97.9 F-score on all 1,000 SimpleQA Verified questions, 978 of them correct, and 64.0 item F1 and 43.4 row F1 on all 200 WideSearch tasks. Every score and its method is on the [benchmarks](https://specstream.ai/benchmarks?utm_source=alternatives&utm_campaign=migrate-firecrawl-crawl) page.

### You decide what is kept, on each key

Create the key with `zero_retention` and a call made with it keeps no request text and no answer after the reply. `spend_cap_cents` is the most the key can spend.

```
curl -X POST https://api.specstream.ai/v1/account/keys \
  -H "Authorization: Bearer $SPECSTREAM_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "production", "scopes": ["account:read", "finds:spend"], "spend_cap_cents": 500000, "zero_retention": true}'
```

### Pages, search and rows on one key

The same key answers Firecrawl's `/v2/search` and `/v2/scrape` at the same address, reads up to 20 pages or documents a call with the [Extract API](https://specstream.ai/extract-api?utm_source=alternatives&utm_campaign=migrate-firecrawl-crawl), and searches the web at $5 per 1,000 searches. [Deep Search](https://specstream.ai/deep-search?utm_source=alternatives&utm_campaign=migrate-firecrawl-crawl) returns every match for a request in plain words as structured rows, at 5¢, 15¢ or $1 a row, with a source URL on every value. The full comparison is on the [Firecrawl migration](https://specstream.ai/migrate/firecrawl?utm_source=alternatives&utm_campaign=migrate-firecrawl-crawl) page.

## What else Firecrawl users price

### Tavily map and crawl

Site maps and crawls billed in Tavily credits at $0.008 a credit on pay as you go. SpecStream answers Tavily's `/map` and `/crawl` at `https://api.specstream.ai/tavily` at $0.0008 a page.

### Spider

A scrape and crawl API billed by bandwidth, from $1 per GB, plus CPU time. SpecStream answers Spider's scrape and search at `https://api.specstream.ai/spider` at $0.80 per 1,000 pages.

### Crawl4AI

An open-source crawler you host and run yourself. SpecStream answers the Crawl4AI server's `/crawl` and `/md` at `https://api.specstream.ai/crawl4ai`, with no server to keep up.

### Exa

A search API with page contents at $1 per 1,000 pages. SpecStream reads pages at $0.80 per 1,000 and answers Exa's own call at `https://api.specstream.ai/exa`.

## How to migrate, step by step

1. Create a key under Agents & API in the workspace. A new account gets $10 of credit, no card, which covers 12,500 pages.

2. Set the address to `https://api.specstream.ai/firecrawl` where your code has `https://api.firecrawl.dev`, and send the SpecStream key as the Bearer token. In Python:

```
import time
import requests

BASE = "https://api.specstream.ai/firecrawl"  # was https://api.firecrawl.dev
HEADERS = {"Authorization": f"Bearer {SPECSTREAM_KEY}"}

job = requests.post(f"{BASE}/v2/crawl", headers=HEADERS,
                    json={"url": "https://quotes.toscrape.com/", "limit": 10}, timeout=60).json()
while True:
    state = requests.get(job["url"], headers=HEADERS, timeout=60).json()
    if state["status"] in ("completed", "failed", "cancelled"):
        break
    time.sleep(2)
for page in state["data"]:
    print(page["metadata"]["url"], len(page["markdown"]))
```

3. A map in JavaScript:

```
const reply = await fetch("https://api.specstream.ai/firecrawl/v2/map", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.SPECSTREAM_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ url: "https://quotes.toscrape.com/", search: "einstein", limit: 20 }),
});
const { links } = await reply.json();
console.log(links.map((link) => link.url));
```

4. Read `429` as a call to send again after `Retry-After`. It is not charged.

## Frequently asked questions

### Is there a Firecrawl crawl and map compatible API?

Yes. Since Nov 10, 2026 SpecStream answers Firecrawl's `/v2/map`, `/v2/crawl` and `/v2/crawl/{id}` at `https://api.specstream.ai/firecrawl` in Firecrawl's JSON, as measured on production. A crawled page costs $0.0008.

### How do I migrate from Firecrawl crawl?

Change one address: `https://api.firecrawl.dev` becomes `https://api.specstream.ai/firecrawl`, and a SpecStream key goes in the Bearer token. `url`, `limit`, `includePaths`, `excludePaths`, `maxDiscoveryDepth`, `crawlEntireDomain` and `scrapeOptions.formats` keep their meaning.

### How much does Firecrawl crawl cost?

A crawled page is 1 credit and a map is 1 credit, and Hobby is $19 a month for 5,000 credits. SpecStream costs $0.80 per 1,000 pages with no plan, a map costs $0.0008, and its credit never expires.

### Which apps and SDKs take the SpecStream address for Firecrawl crawl and map?

LlamaIndex, `llama-index-readers-web` 0.7.0: pass `api_url="https://api.specstream.ai/firecrawl"` to `FireCrawlWebReader`, with your SpecStream key as `api_key`. Its `crawl` and `map` modes run through this route. LangChain, `langchain-firecrawl` 0.1.0: pass `api_url="https://api.specstream.ai/firecrawl"` to `FirecrawlLoader`. Its `crawl` and `map` modes run through this route. Dify: in the Firecrawl data source credential, set the base URL to `https://api.specstream.ai/firecrawl`. Its website crawl then runs on SpecStream.

### Does the Firecrawl Python SDK work with SpecStream?

Yes. firecrawl-py 4.55.0 works with `api_url="https://api.specstream.ai/firecrawl"`, as tested on production on Nov 10, 2026: `map`, `crawl` with its waiter, `start_crawl`, `get_crawl_status` and `cancel_crawl`. The JavaScript SDK 4.52.0 passed 6 of 6 checks with `apiUrl`.

### How many pages can one crawl read?

Up to 500 pages a crawl job, and up to 5,000 links a map. A larger `limit` reads to that ceiling, and the status read pages through `next` as Firecrawl's does.

### Which Firecrawl fields does SpecStream not return?

`links[].title` and `links[].description` on a map, `createdAt`, `completedAt` and `duration` on a status read, and `screenshot`, `metadata.description` and `metadata.language` on a page. Every other field a client reads comes back.

## Sources

SpecStream wrote this page. Each Firecrawl figure comes from Firecrawl's own pages, and each other provider's figure from that company's own page. The route's behavior comes from its code and the pass table measured on production.

- [Firecrawl pricing](https://www.firecrawl.dev/pricing), read Nov 10, 2026
- [Firecrawl billing](https://docs.firecrawl.dev/billing.md), read Nov 10, 2026
- [Firecrawl errors](https://docs.firecrawl.dev/api-reference/errors.md), read Nov 10, 2026
- [Firecrawl crawl](https://docs.firecrawl.dev/features/crawl.md), read Nov 10, 2026
- [SpecStream Firecrawl map and crawl pass table](https://specstream.ai/specstream/dialects/firecrawl_site.md), read Nov 10, 2026
- [Spider pricing](https://spider.cloud/pricing), read Nov 10, 2026
- [Firecrawl API reference](https://docs.firecrawl.dev/api-reference/v2-openapi.json), read Nov 10, 2026
- [Tavily pricing](https://tavily.com/pricing), read Nov 10, 2026
- [Exa pricing](https://exa.ai/docs/admin/pricing.md), read Nov 10, 2026
- [SpecStream benchmarks](https://specstream.ai/benchmarks), read Nov 10, 2026
- [SpecStream for agents](https://specstream.ai/agents.md), read Nov 10, 2026
