Crawl4AI compatible
Change the address.
Since November 10, 2026 SpecStream answers the Crawl4AI server's POST /crawl and POST /md in Crawl4AI's own JSON. A page costs $0.0008, $0.80 per 1,000, and there is no Docker container, browser or server to keep running.
The switch is one line: https://api.specstream.ai/crawl4ai in place of http://localhost:11235, and a SpecStream key in place of the server's API token. The request body and your parser stay.
The SpecStream Extract API scores 0.908 F1 on WCXB. A page that gives no text costs nothing, 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.
Crawl4AI to SpecStream, parameter by parameter and field by field
| SpecStream | Crawl4AI server | |
|---|---|---|
| Address | POST https://api.specstream.ai/crawl4ai/crawl and /crawl4ai/md | POST http://localhost:11235/crawl and /md, on your own machine |
| The key | A SpecStream key as Authorization: Bearer | The server's CRAWL4AI_API_TOKEN as Authorization: Bearer |
| /crawl | urls, 1 to 100 a call, applied. Each page answers on its own: a missing page gets success false, the rest still come back | urls with browser_config and crawler_config |
| /md | url and f=raw applied. The reply echoes url, filter, query and cache | url, f as fit, raw, bm25 or llm, q and c |
| Reply | success, results[] with url, html, success, markdown.raw_markdown, links.internal, links.external, metadata, status_code and error_message | The same, plus cleaned_html, fit_markdown, media, screenshot and pdf |
| Errors | Crawl4AI's own {"detail": ...}: 400 for no URLs, more than 100, or a URL with no scheme, 401 for a wrong key. A busy call gets 429 with Retry-After and is not charged | {"detail": ...} from the server |
| Price | $0.80 per 1,000 pages, the same for every page | The library is free under Apache 2.0, and you pay for the hosting |
| Who runs it | SpecStream runs the readers. You send the call | You run the container, its browser and its memory |
| Free to start | $10 of credit, no card, which covers 12,500 pages | Free, on your own hosting |
The Crawl4AI server reference, on SpecStream
The call, before and after
# Before
curl -X POST http://localhost:11235/crawl \
-H "Authorization: Bearer $CRAWL4AI_API_TOKEN" -H "Content-Type: application/json" \
-d '{"urls": ["https://en.wikipedia.org/wiki/Web_scraping"]}'
# After
curl -X POST https://api.specstream.ai/crawl4ai/crawl \
-H "Authorization: Bearer $SPECSTREAM_API_KEY" -H "Content-Type: application/json" \
-d '{"urls": ["https://en.wikipedia.org/wiki/Web_scraping"]}'The reply is Crawl4AI's: {"success": true, "results": [{"url": "...", "success": true, "status_code": 200, "markdown": {"raw_markdown": "# Web scraping ..."}, "links": {"internal": [...], "external": [...]}, ...}], "server_processing_time_s": ...}.
With Crawl4AI's Python client, crawl4ai 0.9.5, the switch is two steps: build Crawl4aiDockerClient(base_url="https://api.specstream.ai"), then call await client.authenticate(KEY) with your SpecStream key (the client names that parameter email). client.crawl([...]) then runs as before. In your own HTTP call it is the address and the key, and the bodies the self-hosting guide documents run unchanged.
What the route reads, and what it refuses
/crawl, applied: urls, 1 to 100 in one call. Each page answers on its own, so of three URLs with one missing, two come back with success true and the third with success false. A page the site answers 404 comes back with status_code 404 and error_message set.
/md, applied: url and f as raw. The reply echoes url, filter, query and cache and gives the page as markdown.
Refused, in Crawl4AI's own {"detail": ...} body: an empty urls or more than 100 gets 400, f that is not a filter gets 400, a URL with no scheme gets 400, an /md of a page with no text gets 500 and is not charged, and a wrong key gets 401. 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
/crawl returns success, server_processing_time_s and results[], each with url, html, success, markdown.raw_markdown, links.internal, links.external, metadata, status_code and error_message. /md returns url, filter, query, cache, markdown and success.
The route does not return cleaned_html, markdown.fit_markdown, media, screenshot or pdf on a result, or server_memory_delta_mb and server_peak_memory_mb on a crawl.
One price a page, and no server
Crawl4AI's library is free and the server runs on your own hosting, with its browser and memory to size and keep up. On SpecStream every page that gives text costs $0.0008, which is $0.80 per 1,000, a page with no text costs nothing, and 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 reads up to 20 pages or documents a call with the Extract API, runs site maps and crawls that follow links at https://api.specstream.ai/firecrawl, 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 Crawl4AI alternative page.
What else Crawl4AI users price
Crawl4AI's hosted API
A different API, with /scrape and /extract, on monthly plans from $10 a month, where the month's credits do not carry over. SpecStream answers the server's own /crawl and /md, so your code stays as it is.
Firecrawl
Scrape, map and crawl in credits: Standard is $99 a month for 100,000 credits. SpecStream answers Firecrawl's v2 calls at https://api.specstream.ai/firecrawl at $0.80 per 1,000 pages.
Spider
A scrape and crawl API billed by bandwidth and CPU time. SpecStream answers Spider's scrape and search at https://api.specstream.ai/spider, and a page costs $0.0008.
Apify
A platform for scrapers, with plans from $19 a month for $19 of usage. SpecStream reads any page at $0.0008 with no plan.
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/crawl4ai where your code has http://localhost:11235, and send the SpecStream key as the Bearer token. In Python:
import requests
BASE = "https://api.specstream.ai/crawl4ai" # was http://localhost:11235
reply = requests.post(
f"{BASE}/crawl",
headers={"Authorization": f"Bearer {SPECSTREAM_KEY}"},
json={"urls": ["https://en.wikipedia.org/wiki/Web_scraping", "https://en.wikipedia.org/wiki/Web_crawler"]},
timeout=120,
)
reply.raise_for_status()
for page in reply.json()["results"]:
print(page["url"], page["status_code"], len(page["markdown"]["raw_markdown"]))3. /md in JavaScript:
const reply = await fetch("https://api.specstream.ai/crawl4ai/md", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.SPECSTREAM_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ url: "https://en.wikipedia.org/wiki/Web_scraping", f: "raw" }),
});
const { markdown } = await reply.json();
console.log(markdown.slice(0, 500));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 hosted Crawl4AI compatible API?
POST /crawl and POST /md at https://api.specstream.ai/crawl4ai with Crawl4AI's reply, as measured on production. A page costs $0.0008.How do I migrate from a self-hosted Crawl4AI server?
http://localhost:11235 becomes https://api.specstream.ai/crawl4ai, and a SpecStream key goes in the Bearer token. urls on /crawl and url and f on /md keep their meaning.How much does Crawl4AI cost?
Does the Crawl4AI Python client work with SpecStream?
Crawl4aiDockerClient(base_url="https://api.specstream.ai"), then call await client.authenticate(KEY) with your SpecStream key in the parameter the client names email. client.crawl() then returned its results on production on Nov 10, 2026.How many URLs can one /crawl take?
400, and each page in the call is charged $0.0008 only when it gives text.Which Crawl4AI fields does SpecStream not return?
cleaned_html, markdown.fit_markdown, media, screenshot and pdf on a result, and the server's memory figures. Every other field a client reads comes back.Sources
SpecStream wrote this page. Each Crawl4AI figure comes from Crawl4AI'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.
- Crawl4AI self-hosting guidedocs.crawl4ai.com/core/self-hosting/, read Nov 10, 2026
- Crawl4AI docsdocs.crawl4ai.com/, read Nov 10, 2026
- Crawl4AI pricingcrawl4ai.com/pricing, read Nov 10, 2026
- Crawl4AI termscrawl4ai.com/terms, read Nov 10, 2026
- Crawl4AI licensegithub.com/unclecode/crawl4ai/blob/main/LICENSE, read Nov 10, 2026
- SpecStream Crawl4AI pass tablespecstream.ai/specstream/dialects/crawl4ai.md, read Nov 10, 2026
- Firecrawl pricingfirecrawl.dev/pricing, read Nov 10, 2026
- Spider pricingspider.cloud/pricing, read Nov 10, 2026
- Apify pricingapify.com/pricing, read Nov 10, 2026
- SpecStream benchmarksspecstream.ai/benchmarks, read Nov 10, 2026
- SpecStream for agentsspecstream.ai/agents.md, read Nov 10, 2026




