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

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

Scrapfly plans start at $30 a month for 200,000 credits, browser rendering adds 5 credits a request, and failed scrapes are billed once 30% of your traffic is blocked. SpecStream answers the same `GET /scrape` at $0.80 per 1,000 pages.

The switch is one line: `https://api.specstream.ai/scrapfly` in place of `https://api.scrapfly.io`, and a SpecStream key as `key`. In the Python SDK it is the `host` argument.

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-scrapfly&utm_source=alternatives-md&utm_campaign=migrate-scrapfly&returnTo=%2Fworkspace%2Fsearch%3Froute%3Dscrapfly) New accounts get $10 of credit, no card. It covers 12,500 pages.

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

| | SpecStream | Scrapfly |
|---|---|---|
| Address | `GET https://api.specstream.ai/scrapfly/scrape?url=&key=` | `GET https://api.scrapfly.io/scrape?url=&key=` |
| The key | A SpecStream key as `key`, as the SDK sends it | The `key` parameter |
| Output | `result.content` as HTML, markdown or text with `format`, `markdown:no_links` honoured, and the page itself with `proxified_response` | The result JSON, with `result.content` holding the page |
| Errors | Scrapfly's own: a missing page gets `404` `ERR::SCRAPE::BAD_UPSTREAM_RESPONSE`, a host that does not resolve `422`, a wrong key `401`, no credit `429` `ERR::SCRAPE::QUOTA_LIMIT_REACHED`. A busy call gets `429` with `Retry-After` and is not charged | `401` for a missing or invalid key, `422` for a request it cannot handle, `429` Too Many Request |
| Failed requests | Never charged, and a page with no main text is not charged | Failed scrapes are not billed, until 30% or more of your traffic is blocked; then failed scrapes are billed |
| Price | $0.80 per 1,000 pages, the same for every page. $30 reads 37,500 pages | Discovery $30 a month for 200,000 credits, Pro $100 for 1,000,000. Browser rendering adds 5 credits, a residential proxy costs 25 |
| Free to start | $10 of credit, no card, which covers 12,500 pages | 1,000 API credits on signup, no credit card required |

## The Scrapfly reference, on SpecStream

### The call, before and after

```
# Before
curl -G https://api.scrapfly.io/scrape \
  --data-urlencode "key=$SCRAPFLY_KEY" \
  --data-urlencode "url=https://en.wikipedia.org/wiki/Web_scraping"

# After
curl -G https://api.specstream.ai/scrapfly/scrape \
  --data-urlencode "key=$SPECSTREAM_API_KEY" \
  --data-urlencode "url=https://en.wikipedia.org/wiki/Web_scraping"
```

With Scrapfly's Python SDK, `scrapfly-sdk` 0.12.0, the change is the constructor: `client = ScrapflyClient(key=SPECSTREAM_KEY, host="https://api.specstream.ai/scrapfly")`. `client.scrape(ScrapeConfig(url=...))` then runs as before.

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

Read and applied: `url`, `key`, `format` with `markdown` or `text` and its options such as `markdown:no_links`, and `proxified_response`. A page the site does not have comes back as Scrapfly's `404` `ERR::SCRAPE::BAD_UPSTREAM_RESPONSE`, which the SDK raises as `UpstreamHttpClientError`.

Refused, in Scrapfly's own form: a host that does not resolve gets `422` and a wrong key gets `401`, both raised by the SDK as `ApiHttpClientError`. Every parameter was measured on production on Nov 10, 2026, and the full [pass table](https://specstream.ai/specstream/dialects/scrapfly.md) lists each one and its result.

### Every field that comes back

The reply has `uuid`, `config` with `url` and `format`, `context`, and `result` with `status`, `success`, `status_code`, `reason`, `format`, `content`, `content_type`, `url`, `size` and `duration`. `result.log_url` and `result.error` are present and empty on a page that was read.

The route does not return `result.request_headers`, `response_headers`, `cookies`, `screenshots`, `iframes`, `browser_data`, `extracted_data`, `dns`, `ssl` or `content_encoding`.

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

On Scrapfly browser rendering adds 5 credits a request, a residential proxy costs 25, and failed scrapes are billed once 30% of your traffic is blocked. On SpecStream every page read costs $0.0008, which is $0.80 per 1,000, a failed page is never 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-scrapfly) 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-scrapfly), searches the web at $5 per 1,000 searches, and runs [Deep Search](https://specstream.ai/deep-search?utm_source=alternatives&utm_campaign=migrate-scrapfly), 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.

## What else Scrapfly users price

### ScrapingBee

A page API from $19 a month for 75,000 credits, where a default call with JavaScript costs 5 credits and credits don't roll over. SpecStream answers ScrapingBee's call at `https://api.specstream.ai/scrapingbee/api/v1/` too, at $0.80 per 1,000 pages.

### 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/`.

### 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/scrapfly/scrape` where your code has `https://api.scrapfly.io/scrape`, and send the SpecStream key as `key`. In Python:

```
import requests

URL = "https://api.specstream.ai/scrapfly/scrape"  # was https://api.scrapfly.io/scrape

reply = requests.get(
    URL,
    params={"key": SPECSTREAM_KEY, "url": "https://en.wikipedia.org/wiki/Web_scraping", "format": "markdown"},
    timeout=60,
)
reply.raise_for_status()
result = reply.json()["result"]
print(result["status_code"], result["content"][:500])
```

3. In JavaScript:

```
const url = new URL("https://api.specstream.ai/scrapfly/scrape");
url.search = new URLSearchParams({ key: process.env.SPECSTREAM_KEY, url: "https://en.wikipedia.org/wiki/Web_scraping", format: "text" });
const { result } = await (await fetch(url)).json();
console.log(result.status_code, result.content.length);
```

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

## Frequently asked questions

### Is there a Scrapfly compatible API?

Yes. SpecStream answers Scrapfly's `GET /scrape` at `https://api.specstream.ai/scrapfly` with Scrapfly's result JSON and error codes, as measured on production on Nov 10, 2026. A page costs $0.0008.

### How do I migrate from Scrapfly?

Change one address: `https://api.scrapfly.io` becomes `https://api.specstream.ai/scrapfly`, and a SpecStream key goes in `key`. `url`, `format` and `proxified_response` keep their meaning.

### How much does Scrapfly cost?

Plans start at $30 a month for 200,000 credits, and Pro is $100 for 1,000,000. Browser rendering adds 5 credits and a residential proxy costs 25. SpecStream costs $0.80 per 1,000 pages with no plan.

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

Yes. `scrapfly-sdk` 0.12.0 works with `host="https://api.specstream.ai/scrapfly"` and a SpecStream key, as tested on production on Nov 10, 2026. `client.scrape()` runs unchanged.

### Does Scrapfly charge for failed scrapes?

Scrapfly bills failed scrapes once 30% or more of your traffic is blocked. SpecStream never charges a failed page, and a busy call gets `429` with `Retry-After` at no charge.

### Which Scrapfly fields does SpecStream not return?

Ten `result` fields: `request_headers`, `response_headers`, `cookies`, `screenshots`, `iframes`, `browser_data`, `extracted_data`, `dns`, `ssl` and `content_encoding`. `result.content`, `status_code`, `url`, `size` and `duration` come back.

## Sources

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

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