<!-- twin of https://specstream.ai/migrate/scrapingbee -->
# ScrapingBee compatible: change the address, keep the client

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

ScrapingBee's Hobby plan is $19 a month for 75,000 credits, a default call with JavaScript costs 5 credits, and credits don't roll over. SpecStream answers the same `GET /api/v1` call at one price: $0.80 per 1,000 pages.

The switch is one line: `https://api.specstream.ai/scrapingbee/api/v1/` in place of `https://app.scrapingbee.com/api/v1/`, and a SpecStream key as the Bearer token. The client and your parser stay.

The SpecStream Extract API scores 0.908 F1 on WCXB. A failed page 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-scrapingbee&utm_source=alternatives-md&utm_campaign=migrate-scrapingbee&returnTo=%2Fworkspace%2Fsearch%3Froute%3Dscrapingbee) New accounts get $10 of credit, no card. It covers 12,500 pages.

## ScrapingBee to SpecStream, parameter by parameter and field by field

| | SpecStream | ScrapingBee |
|---|---|---|
| Address | `GET https://api.specstream.ai/scrapingbee/api/v1/?url=` | `GET https://app.scrapingbee.com/api/v1?url=` |
| The key | A SpecStream key as `Authorization: Bearer`, or as `api_key` in the address | `Authorization: Bearer YOUR-API-KEY`. Passing the key as `api_key` is deprecated |
| Output | The page's HTML, or its main content with `return_page_markdown` or `return_page_text`. `json_response` wraps it, and `add_html` adds the HTML | The page as returned, or JSON with `json_response` |
| Status codes | The site's 404 passes through, and `transparent_status_code` gives the site's own status. A page that cannot be read gets `500` and is not charged | `404` and `410` are billed. `500` is not billed |
| Errors | ScrapingBee's own: `400` with no `url`, `401` for a wrong key or no credit. A busy call gets `429` with `Retry-After` and is not charged | `401` out of credits or an invalid key, `429` too many concurrent requests |
| Price | $0.80 per 1,000 pages, the same for every page. $19 reads 23,750 pages | Hobby $19 a month for 75,000 credits. A call costs 1 to 75 credits, 5 with JavaScript rendering by default |
| Credit | Credit you buy never expires | API credits are valid for one month and don't roll over |
| Free to start | $10 of credit, no card, which covers 12,500 pages | 1,000 free API credits, no credit card required |

## The ScrapingBee reference, on SpecStream

### The call, before and after

```
# Before
curl -G https://app.scrapingbee.com/api/v1/ \
  -H "Authorization: Bearer $SCRAPINGBEE_API_KEY" \
  --data-urlencode "url=https://en.wikipedia.org/wiki/Web_scraping"

# After
curl -G https://api.specstream.ai/scrapingbee/api/v1/ \
  -H "Authorization: Bearer $SPECSTREAM_API_KEY" \
  --data-urlencode "url=https://en.wikipedia.org/wiki/Web_scraping"
```

With ScrapingBee's Python client, `scrapingbee` 2.2.0, the change is one line after the client is built: `client.HTML_API_URL = "https://api.specstream.ai/scrapingbee/api/v1/"`, with a SpecStream key as `api_key`. `client.html_api(url)` then runs as before.

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

Read and applied: `url`, the key as `Authorization: Bearer` or `api_key`, `return_page_markdown`, `return_page_text`, `json_response`, `add_html` and `transparent_status_code`. A page the site does not have passes through as its own `404`.

Refused, in ScrapingBee's own status and body: no `url` gets `400`, `mode=auto` together with `render_js` gets `400`, a wrong key or an empty balance gets `401`, and a host that does not resolve gets `500` and is not charged. Every parameter was measured on production on Nov 10, 2026, and the full [pass table](https://specstream.ai/specstream/dialects/scrapingbee.md) lists each one and its result.

### Every field that comes back

By default the body is the page itself with its `content-type`. With `json_response=true` the reply has `body`, `initial-status-code`, `resolved-url`, `type`, and `html` when you add `add_html`.

The route does not return the `Spb-*` response headers, nor `headers`, `cost`, `cookies`, `xhr`, `screenshot`, `metadata`, `iframes`, `evaluate_results` and `js_scenario_report` in the JSON form.

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

On ScrapingBee a call costs 1 to 75 credits by the options it uses, and the month's credits do not roll over. On SpecStream every page read costs $0.0008, which is $0.80 per 1,000, a page with no main text is not charged, a failed page is not charged, 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-scrapingbee) 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-scrapingbee), searches the web at $5 per 1,000 searches, and runs [Deep Search](https://specstream.ai/deep-search?utm_source=alternatives&utm_campaign=migrate-scrapingbee), which 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 [ScrapingBee alternative](https://specstream.ai/alternatives/scrapingbee?utm_source=alternatives&utm_campaign=migrate-scrapingbee) page.

## What else ScrapingBee users price

### ScraperAPI

A page API on monthly plans: Hobby is $49 a month for 100,000 API credits, and the balance resets when the subscription renews. SpecStream answers ScraperAPI's call at `https://api.specstream.ai/scraperapi` too, at $0.80 per 1,000 pages.

### ZenRows

A page API on monthly plans from $19 for 45,000 credits, where a JavaScript-rendered request always costs 5 credits. SpecStream charges one price a page and answers ZenRows' call at `https://api.specstream.ai/zenrows/v1/`.

### Scrapfly

A page API from $30 a month for 200,000 credits, where browser rendering adds 5 credits a request. SpecStream answers Scrapfly's `/scrape` call too, and its credit never expires.

### Firecrawl

Scrape, search and crawl in credits: Hobby is $19 a month for 5,000 credits. SpecStream answers Firecrawl's v2 calls at `https://api.specstream.ai/firecrawl`, and $19 reads 23,750 pages.

## 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/scrapingbee/api/v1/` where your code has `https://app.scrapingbee.com/api/v1/`, and send the SpecStream key as the Bearer token. In Python:

```
import requests

URL = "https://api.specstream.ai/scrapingbee/api/v1/"  # was https://app.scrapingbee.com/api/v1/

reply = requests.get(
    URL,
    headers={"Authorization": f"Bearer {SPECSTREAM_KEY}"},
    params={"url": "https://en.wikipedia.org/wiki/Web_scraping", "return_page_markdown": "true"},
    timeout=60,
)
reply.raise_for_status()
print(reply.text[:500])
```

3. In JavaScript:

```
const url = new URL("https://api.specstream.ai/scrapingbee/api/v1/");
url.search = new URLSearchParams({ url: "https://en.wikipedia.org/wiki/Web_scraping", json_response: "true" });
const reply = await fetch(url, { headers: { Authorization: `Bearer ${process.env.SPECSTREAM_KEY}` } });
const data = await reply.json();
console.log(data["initial-status-code"], data["resolved-url"], data.body.length);
```

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

## Frequently asked questions

### Is there a ScrapingBee compatible API?

Yes. SpecStream answers ScrapingBee's `GET /api/v1` at `https://api.specstream.ai/scrapingbee/api/v1/` with ScrapingBee's reply and status codes, as measured on production on Nov 10, 2026. A page costs $0.0008.

### How do I migrate from ScrapingBee?

Change one address: `https://app.scrapingbee.com/api/v1/` becomes `https://api.specstream.ai/scrapingbee/api/v1/`, and a SpecStream key goes in the Bearer token. `url`, `return_page_markdown`, `return_page_text`, `json_response`, `add_html` and `transparent_status_code` keep their meaning.

### How much does ScrapingBee cost?

Plans start at $19 a month for 75,000 API credits, and a call costs 1 to 75 credits, 5 with JavaScript rendering by default. Credits are valid for one month. SpecStream costs $0.80 per 1,000 pages with no plan, and its credit never expires.

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

Yes. `scrapingbee` 2.2.0 works when you set `client.HTML_API_URL = "https://api.specstream.ai/scrapingbee/api/v1/"` and pass a SpecStream key, as tested on production on Nov 10, 2026. `html_api()` runs unchanged.

### Does SpecStream charge for a failed page?

No. A page that cannot be read gets ScrapingBee's `500` and costs nothing, a page with no main text costs nothing, and a busy call gets `429` with `Retry-After` and costs nothing.

### Which ScrapingBee fields does SpecStream not return?

The `Spb-*` headers, and in the JSON form `headers`, `cost`, `cookies`, `xhr`, `screenshot`, `metadata`, `iframes`, `evaluate_results` and `js_scenario_report`. The JSON keeps `body`, `initial-status-code`, `resolved-url`, `type` and `html`.

## Sources

SpecStream wrote this page. Each ScrapingBee figure comes from ScrapingBee'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.

- [ScrapingBee pricing](https://www.scrapingbee.com/pricing/), read Nov 10, 2026
- [ScrapingBee documentation](https://www.scrapingbee.com/documentation/), read Nov 10, 2026
- [SpecStream ScrapingBee pass table](https://specstream.ai/specstream/dialects/scrapingbee.md), read Nov 10, 2026
- [ScraperAPI pricing](https://www.scraperapi.com/pricing/), read Nov 10, 2026
- [ZenRows pricing](https://docs.zenrows.com/first-steps/pricing.md), read Nov 10, 2026
- [Scrapfly pricing](https://scrapfly.io/pricing), read Nov 10, 2026
- [Scrapfly billing](https://scrapfly.io/docs/scrape-api/billing), read Nov 10, 2026
- [Firecrawl pricing](https://www.firecrawl.dev/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
