Firecrawl crawl and map compatible
Change the address.
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.
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 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 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, and searches the web at $5 per 1,000 searches. Deep Search 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 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 SpecStream scores
The same numbers as the benchmarks page, from the official tasks and scorers.
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
Something we didn't answer? Talk to a human
Is there a Firecrawl crawl and map compatible API?
/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?
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?
Which apps and SDKs take the SpecStream address for Firecrawl crawl and map?
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?
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?
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 pricingfirecrawl.dev/pricing, read Nov 10, 2026
- Firecrawl billingdocs.firecrawl.dev/billing.md, read Nov 10, 2026
- Firecrawl errorsdocs.firecrawl.dev/api-reference/errors.md, read Nov 10, 2026
- Firecrawl crawldocs.firecrawl.dev/features/crawl.md, read Nov 10, 2026
- SpecStream Firecrawl map and crawl pass tablespecstream.ai/specstream/dialects/firecrawl_site.md, read Nov 10, 2026
- Spider pricingspider.cloud/pricing, read Nov 10, 2026
- Firecrawl API referencedocs.firecrawl.dev/api-reference/v2-openapi.json, read Nov 10, 2026
- Tavily pricingtavily.com/pricing, read Nov 10, 2026
- Exa pricingexa.ai/docs/admin/pricing.md, read Nov 10, 2026
- SpecStream benchmarksspecstream.ai/benchmarks, read Nov 10, 2026
- SpecStream for agentsspecstream.ai/agents.md, read Nov 10, 2026




