<!-- twin of https://specstream.ai/migrate/crawl4ai -->
# Crawl4AI compatible: change the address

Compared on Nov 10, 2026. The page: https://specstream.ai/migrate/crawl4ai

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.

[Get an API key](https://specstream.ai/signup?src=alternatives-migrate-crawl4ai&utm_source=alternatives-md&utm_campaign=migrate-crawl4ai&returnTo=%2Fworkspace%2Fsearch%3Froute%3Dcrawl4ai) 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](https://specstream.ai/specstream/dialects/crawl4ai.md) 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](https://specstream.ai/benchmarks?utm_source=alternatives&utm_campaign=migrate-crawl4ai) 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](https://specstream.ai/extract-api?utm_source=alternatives&utm_campaign=migrate-crawl4ai), 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](https://specstream.ai/deep-search?utm_source=alternatives&utm_campaign=migrate-crawl4ai) 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](https://specstream.ai/alternatives/crawl4ai?utm_source=alternatives&utm_campaign=migrate-crawl4ai) 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 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

### Is there a hosted Crawl4AI compatible API?

Yes. Since Nov 10, 2026 SpecStream answers the Crawl4AI server's `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?

Change one address: `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?

The library is free under Apache 2.0 and you pay for the hosting, and the hosted API has plans from $10 a month. SpecStream costs $0.80 per 1,000 pages with no plan and no server, and its credit never expires.

### Does the Crawl4AI Python client work with SpecStream?

Yes, in two steps. With crawl4ai 0.9.5, build `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?

Up to 100 URLs a call, the same limit as Crawl4AI's server. A call with more gets `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 guide](https://docs.crawl4ai.com/core/self-hosting/), read Nov 10, 2026
- [Crawl4AI docs](https://docs.crawl4ai.com/), read Nov 10, 2026
- [Crawl4AI pricing](https://www.crawl4ai.com/pricing), read Nov 10, 2026
- [Crawl4AI terms](https://www.crawl4ai.com/terms), read Nov 10, 2026
- [Crawl4AI license](https://github.com/unclecode/crawl4ai/blob/main/LICENSE), read Nov 10, 2026
- [SpecStream Crawl4AI pass table](https://specstream.ai/specstream/dialects/crawl4ai.md), read Nov 10, 2026
- [Firecrawl pricing](https://firecrawl.dev/pricing), read Nov 10, 2026
- [Spider pricing](https://spider.cloud/pricing), read Nov 10, 2026
- [Apify pricing](https://apify.com/pricing), 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
