ScrapingBee vs ScraperAPI in 2026
One key answers both calls.
ScrapingBee starts at $19 a month for 75,000 credits and ScraperAPI at $49 for 100,000, and on both a page costs 1 to 75 credits by site and setting. SpecStream answers both calls, on their own paths, with one key.
Change https://app.scrapingbee.com/api/v1/ to https://api.specstream.ai/scrapingbee/api/v1/ and https://api.scraperapi.com to https://api.specstream.ai/scraperapi. Your clients and your parsers stay as they are.
Every page costs $0.80 per 1,000, on any site, from credit that never expires. The SpecStream Extract API scores 0.908 F1 on WCXB, on the benchmarks page.
New accounts get $10 of credit, no card. It covers 12,500 pages.
SpecStream, ScrapingBee and ScraperAPI side by side
| SpecStream | ScrapingBee | ScraperAPI | |
|---|---|---|---|
| The call your code sends | Both, on one key. GET https://api.specstream.ai/scrapingbee/api/v1/?url= with the key as the Bearer token, and GET https://api.specstream.ai/scraperapi?api_key=&url= | GET https://app.scrapingbee.com/api/v1?url= with Authorization: Bearer. Passing the key as api_key is deprecated | GET https://api.scraperapi.com?api_key=&url=, with the key as a mandatory parameter |
| Price of a page | $0.80 per 1,000 pages, the same for every site and every page. $19 reads 23,750 pages and $49 reads 61,250 | Hobby is $19 a month for 75,000 credits. A call costs 1 to 75 credits, and 5 with JavaScript rendering, the default | Hobby is $49 a month for 100,000 credits. A standard page costs 1 credit, Amazon 5, Google and Bing 25, LinkedIn 30 |
| What you get back | The page in each API's own form: HTML, markdown, text or its JSON wrapper. The Extract API also returns the main text of up to 20 pages a call | The page as returned, or JSON with json_response | The page's HTML, or markdown or text with output_format |
| Credit you do not use | Credit you buy never expires. There is no monthly plan | API credits are valid for one month and do not roll over | The credit balance resets when the subscription renews |
| Pages that fail | A page that gives no text is not charged, and a busy call answers 429 with Retry-After and charges nothing | 404 and 410 from the site are billed. A 500 is not billed | 200 and 404 are charged. A request that fails after 70 seconds of retries is not charged |
| Requests at once | Up to 20 pages a call on the Extract API, with no monthly plan setting the volume. A call past the account's calls for the minute answers 429 with Retry-After and charges nothing | 25 concurrent requests on Hobby, up to 900 on Enterprise 120 | 20 concurrent threads on Hobby |
| Free to start | $10 of credit, no card, which covers 12,500 pages or 2,000 searches | 1,000 free API credits, no credit card required | A 7-day trial with 5,000 credits, no card, then 1,000 credits a month with 5 concurrent threads |
| Structured data | Deep Search: a request in plain words returns every match on the live web as rows that meet each condition you wrote, at 5¢, 15¢ or $1 a row. The most a run can cost is quoted before it starts | AI extraction adds 5 credits a call | Autoparse returns JSON or CSV for Amazon, eBay, Google, Redfin and Walmart. The AI Parser's first parser is free, and each further parser costs 30,000 credits |
Why teams choosing between ScrapingBee and ScraperAPI use SpecStream
Keep both calls and change two lines
Your ScrapingBee call and your ScraperAPI call keep their parameters and their parsers. Each one changes its address, and both carry the same key.
# ScrapingBee: was https://app.scrapingbee.com/api/v1/
curl -G https://api.specstream.ai/scrapingbee/api/v1/ \
-H "Authorization: Bearer $SPECSTREAM_KEY" \
--data-urlencode "url=https://en.wikipedia.org/wiki/Web_scraping" \
--data-urlencode "return_page_markdown=true"
# ScraperAPI: was https://api.scraperapi.com
curl -G https://api.specstream.ai/scraperapi \
--data-urlencode "api_key=$SPECSTREAM_KEY" \
--data-urlencode "url=https://en.wikipedia.org/wiki/Web_scraping" \
--data-urlencode "output_format=markdown"A team that has not chosen yet writes to either format and moves nothing later. The parameter by parameter tables are in the ScrapingBee migration guide and the ScraperAPI migration guide.
What each path reads and returns
On /scrapingbee/api/v1/, url, return_page_markdown, return_page_text, json_response, add_html and transparent_status_code work as on ScrapingBee, and the key goes as Authorization: Bearer or api_key. The site's 404 passes through. Errors come in ScrapingBee's own form: 400 with no url, 401 for a wrong key or no credit.
On /scraperapi, api_key, url and output_format for markdown or text work as on ScraperAPI, and ScraperAPI's Python SDK reaches it through its api_endpoint argument. The site's 404 passes through. Errors come in ScraperAPI's own form: 400 with no url, 401 for a wrong key, 403 with no credit left.
$0.80 per 1,000 pages on every site, from credit that does not expire
On ScrapingBee and ScraperAPI the price of a page depends on the site and the settings: 5 credits for JavaScript rendering on ScrapingBee, 25 for a Google page on ScraperAPI. Unused credits end with the month on both. On SpecStream every page is $0.0008, a page that gives no text is not charged, and a top-up stays in the account until you use it.
Scores published on official benchmarks
The SpecStream Extract API scores 0.908 F1 on WCXB. The Search API scores a 97.9 F-score on all 1,000 official SimpleQA Verified questions and 64.0 item F1 on all 200 WideSearch tasks. The scores and the method are at specstream.ai/benchmarks.
Zero retention on any key
Set zero_retention when you create a key, or later. A call made with that key keeps no request text and no answer after the reply. The charge keeps the account, the key, the request ID, the price and the time.
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}'Search, crawls and rows on the same key
A scraper reads the pages you already know. The same key finds them: the Search API at $5 per 1,000 searches, POST /v1/map for a site's links and POST /v1/crawl for a whole site, each page with text at the page price. Deep Search returns every match on the live web as structured rows at 5¢, 15¢ or $1 a row, and a saved request reruns hourly to yearly with each row labeled changed, unchanged or no longer matching.
Other scraping APIs
ZenRows
A scraping API by monthly credits, from $19 for 45,000, where a JavaScript request always costs 5 credits. SpecStream answers ZenRows' call at https://api.specstream.ai/zenrows/v1, at $0.80 per 1,000 pages.
Scrapfly
Discovery is $30 a month for 200,000 credits, and render_js adds 5 credits a call. SpecStream answers Scrapfly's call at https://api.specstream.ai/scrapfly/scrape, at one price for every page.
Firecrawl
Scrape, crawl and search by monthly credits: Hobby is $19 a month for 5,000 credits, and a 403 or 404 page costs 1 credit. SpecStream answers Firecrawl v2 scrape, map and crawl at https://api.specstream.ai/firecrawl, at $0.0008 a page.
Apify
A store of scrapers called Actors, on plans of $0, $19, $199 or $999 a month, where most Actors charge per event at their own price and compute units cost $0.2 on Starter. SpecStream returns the finished rows from a request in plain words, at a price quoted before the run.
How SpecStream scores
The same numbers as the benchmarks page, from the official tasks and scorers.
How to run your ScrapingBee and ScraperAPI calls on SpecStream
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. Point each call at its SpecStream path. The key goes as the Bearer token on the ScrapingBee path and as api_key on the ScraperAPI path. In Python:
import requests
PAGE = "https://en.wikipedia.org/wiki/Web_scraping"
# ScrapingBee's call, was https://app.scrapingbee.com/api/v1/
bee = requests.get(
"https://api.specstream.ai/scrapingbee/api/v1/",
headers={"Authorization": f"Bearer {SPECSTREAM_KEY}"},
params={"url": PAGE, "return_page_markdown": "true"},
timeout=60,
)
bee.raise_for_status()
print(bee.text[:300])
# ScraperAPI's call, was https://api.scraperapi.com
scraper = requests.get(
"https://api.specstream.ai/scraperapi",
params={"api_key": SPECSTREAM_KEY, "url": PAGE, "output_format": "markdown"},
timeout=70,
)
scraper.raise_for_status()
print(scraper.text[:300])3. In JavaScript:
const key = process.env.SPECSTREAM_KEY;
const page = "https://en.wikipedia.org/wiki/Web_scraping";
// ScrapingBee's call, was https://app.scrapingbee.com/api/v1/
const bee = new URL("https://api.specstream.ai/scrapingbee/api/v1/");
bee.search = new URLSearchParams({ url: page, json_response: "true" });
const beeData = await fetch(bee, { headers: { Authorization: `Bearer ${key}` } }).then((r) => r.json());
console.log(beeData["resolved-url"], beeData.body.length);
// ScraperAPI's call, was https://api.scraperapi.com
const scraper = new URL("https://api.specstream.ai/scraperapi");
scraper.search = new URLSearchParams({ api_key: key, url: page });
const html = await fetch(scraper).then((r) => r.text());
console.log(html.length);4. Leave the rest. Each page is billed at $0.0008, and a page that gives no text is not charged. On a 429, wait the seconds in Retry-After and send the call again; nothing was charged.
When you scrape pages to build a list, write the list you want in plain words. SpecStream reads it back as the conditions every row must meet and the facts to bring back, quotes the most it can cost, and delivers the rows after you approve.
Frequently asked questions
Something we didn't answer? Talk to a human
Is ScrapingBee better than ScraperAPI?
ScrapingBee vs ScraperAPI pricing: what does each cost?
Can I use both ScrapingBee and ScraperAPI?
https://api.specstream.ai/scrapingbee/api/v1/ and ScraperAPI's at https://api.specstream.ai/scraperapi, each in its own form. One balance, one request log and one spending limit cover both.Do unused credits roll over?
Which one charges for failed pages?
404 or 410 from the site, and ScraperAPI charges 200 and 404. On SpecStream a page that gives no text is not charged, and a busy call answers 429 and charges nothing.Do their SDKs work with SpecStream?
https://api.specstream.ai/scraperapi as its api_endpoint, and ScrapingBee's call works from any HTTP client with the address changed. The key goes where theirs went.Sources
SpecStream wrote this page. Each figure for ScrapingBee, ScraperAPI and the other APIs comes from that company's own page.
- ScrapingBee pricingscrapingbee.com/pricing/, read Nov 10, 2026
- ScrapingBee documentationscrapingbee.com/documentation/, read Nov 10, 2026
- ScraperAPI pricingscraperapi.com/pricing.md, read Nov 10, 2026
- ScraperAPI first requestdocs.scraperapi.com/getting-started/quick-start/send-your-first-request.md, read Nov 10, 2026
- ScraperAPI status codesdocs.scraperapi.com/responses-and-formats/api-status-codes.md, read Nov 10, 2026
- ScraperAPI output formatsdocs.scraperapi.com/responses-and-formats/output-formats.md, read Nov 10, 2026
- ScraperAPI Autoparsedocs.scraperapi.com/data-pipeline/creating-a-datapipeline-project/results-and-output-formats.md, read Nov 10, 2026
- ScraperAPI AI Parser pricingdocs.scraperapi.com/ai-parser/pricing-and-limits.md, read Nov 10, 2026
- ZenRows pricingdocs.zenrows.com/first-steps/pricing.md, read Nov 10, 2026
- Scrapfly pricingscrapfly.io/pricing, read Nov 10, 2026
- Scrapfly billingscrapfly.io/docs/scrape-api/billing, read Nov 10, 2026
- Firecrawl pricingfirecrawl.dev/pricing, read Nov 10, 2026
- Apify pricingapify.com/pricing.md, read Nov 10, 2026
- SpecStream pricingspecstream.ai/pricing, read Nov 10, 2026
- SpecStream for agentsspecstream.ai/agents.md, read Nov 10, 2026
- SpecStream benchmarksspecstream.ai/benchmarks, read Nov 10, 2026




