AlterLab vs Scrapfly in 2026
Both prices, and Scrapfly's call kept.
AlterLab bills $0.0002 to $0.02 a page by the tier that returned it, from a balance with a $10 minimum deposit. Scrapfly starts at $30 a month for 200,000 credits: 1 credit a datacenter page, 25 on residential proxies, 5 more for a browser.
SpecStream is the live web data engine. It answers Scrapfly's own /scrape call at https://api.specstream.ai/scrapfly, reads any page for $0.80 per 1,000, scores 0.908 F1 on WCXB, and never bills a blocked page.
New accounts get $10 of credit, no card. It covers 12,500 pages.
SpecStream, AlterLab and Scrapfly on Nov 12, 2026
| SpecStream | AlterLab | Scrapfly | |
|---|---|---|---|
| How you pay | A balance, with no plan. Credit you buy never expires | A balance with a $10 minimum deposit and no subscription. The balance never expires | A monthly plan: Discovery $30 for 200,000 credits, with no pay as you go. Pro $100 for 1,000,000 |
| A plain page, per 1,000 | $0.80 | $0.20 on a direct fetch, $0.30 on the full HTTP client, $2 with managed sessions | 1 credit on datacenter proxies: $0.15 on Discovery |
| A page in a browser, per 1,000 | $0.80. A real browser is one of the steps a refused page goes through, at the same price | $4 on full browser rendering, or $0.50 when the browser reads the page straight from AlterLab's servers | 6 credits with render_js: $0.90 on Discovery |
| A protected page, per 1,000 | $0.80. There is no proxy tier to choose | $20 on extended browser sessions, used only when no lighter tier returns the page | 30 credits with residential proxies and a browser: $4.50 on Discovery. The Unblocker may move a call to a dearer proxy pool |
| What is not charged | A blocked page, a 404, a page with no text, and a busy call that gets 429 with Retry-After | Failed requests. A cache hit bills at half the tier price | Failed scrapes, until 30% or more of a day's scrapes are blocked without the Unblocker. Then failed scrapes are billed |
| Free to start | $10 of credit, no card: 12,500 pages | Up to 5,000 free requests on a new account | 1,000 credits on signup, no card, no time limit |
| The cost of a call | price_usd in each reply, and the balance after the call in X-Balance-Cents | billing.total_credits, where $0.0002 is 200 | Credits in the X-Scrapfly-API-Cost header and in context.cost |
| Your code on SpecStream | POST /v1/extract, or read_pages over MCP at https://api.specstream.ai/mcp | The url you post to /api/v1/scrape goes to POST /v1/extract as urls | Runs as written: https://api.specstream.ai/scrapfly/scrape in place of https://api.scrapfly.io/scrape, a SpecStream key as key |
Why AlterLab and Scrapfly users read pages with SpecStream
Scrapfly code runs as written
SpecStream answers Scrapfly's GET /scrape with Scrapfly's result JSON and error codes. The address changes, and the key. url, format and proxified_response keep their meaning, and with scrapfly-sdk the change is the host argument of ScrapflyClient. Every parameter and field is in the Scrapfly guide.
Each price from its own vendor
AlterLab's comparison page puts Scrapfly at $1.40 or more per 1,000 basic HTML pages. Scrapfly's own pricing page sells Discovery credits at $0.15 per 1,000, and a datacenter page takes 1 credit. Every number on this page was copied from the vendor's own page on Nov 12, 2026, and each one is listed under Sources.
One price, whatever the page needs
Both price the page by what it takes. On AlterLab 1,000 URLs cost $0.20 when a direct fetch reads them all and $20 when each needs an extended browser session. On Scrapfly the same 1,000 take 1,000 credits on datacenter proxies and 30,000 with residential proxies and a browser, and the Unblocker may change the pool.
SpecStream charges $0.0008 for every page that gives text, whatever it took to read it. 1,000 URLs cost $0.80, and there is no plan to renew.
Blocked pages are tried again, and never billed
The Extract API tries a page that refuses a plain read again as a browser would ask, then in a real browser, then from the site's own feed, then from its newest public archive capture. Each result says where it was read: read_from is live, site or archive, with captured_at for an archive copy.
A site that still refuses, or answers with a bot check, comes back as blocked and is not charged. A bot check's page is never returned as text, so a challenge page never lands in your data as content. A 404 and a page with no text are not charged either.
Test all three on your own URLs
This script sends the URLs in urls.txt to Scrapfly and to SpecStream with the same Scrapfly call, then to AlterLab, and prints how many pages each returned and what each run cost.
import os
import requests
urls = [line.strip() for line in open("urls.txt") if line.strip()]
def scrapfly_call(base, key):
"""The same Scrapfly call, sent to the address you name."""
pages = credits = 0
for url in urls:
reply = requests.get(f"{base}/scrape", params={"key": key, "url": url, "format": "markdown"}, timeout=120)
pages += reply.ok and reply.json()["result"]["success"]
credits += int(reply.headers.get("X-Scrapfly-API-Cost", 0))
return pages, credits
pages, credits = scrapfly_call("https://api.scrapfly.io", os.environ["SCRAPFLY_KEY"])
print(f"Scrapfly: {pages} pages, {credits} credits, ${credits * 0.15 / 1000:.4f} at the Discovery rate")
pages, _ = scrapfly_call("https://api.specstream.ai/scrapfly", os.environ["SPECSTREAM_API_KEY"])
print(f"SpecStream: {pages} pages, at most ${pages * 0.0008:.4f}")
pages, cost = 0, 0.0
for url in urls:
reply = requests.post(
"https://api.alterlab.io/api/v1/scrape",
headers={"X-API-Key": os.environ["ALTERLAB_API_KEY"]},
json={"url": url},
timeout=120,
).json()
pages += bool(reply.get("success"))
cost += reply.get("billing", {}).get("total_credits", 0) / 1_000_000 # $0.0002 is 200
print(f"AlterLab: {pages} pages, ${cost:.4f}")Scrapfly's credits are priced at the Discovery rate of $0.15 per 1,000. On SpecStream only a page that was read is charged, at $0.0008, so the script prices the pages that came back. A page with no text is not charged, so the real cost can be lower.
Search and rows on the same key
The same key runs the Search API, the most accurate web search API in the world: 97.9 F-score on all 1,000 SimpleQA Verified questions and 64.0 item F1 on all 200 WideSearch tasks (benchmarks). When you need records, not pages, Deep Search returns structured rows that meet every condition you wrote, at 5¢, 15¢ or $1 a delivered row.
Other AlterLab and Scrapfly alternatives
Oxylabs
One subscription for proxies and scrapers, from $15 a month. A custom domain costs $1.00 per 1,000 results without JavaScript and $1.50 with it, and a 2xx or 4xx reply counts as a result. SpecStream reads the same pages at $0.80 per 1,000 (Oxylabs alternatives).
Zyte API
Zyte puts each site in a price tier: $0.13 to $1.27 per 1,000 plain responses and $1.01 to $16.08 per 1,000 in a browser, pay as you go. On SpecStream every page is $0.80 per 1,000, whatever the site (Zyte alternatives).
Firecrawl
Scrape and crawl at 1 credit a page, with Hobby at $19 a month for 5,000 credits. SpecStream answers Firecrawl's v2 calls at https://api.specstream.ai/firecrawl, with pages at $0.80 per 1,000 and search from $1 per 1,000.
ScrapingBee
Hobby is $19 a month for 75,000 credits, valid for one month. JavaScript rendering is the default at 5 credits a call. SpecStream answers its HTML API at https://api.specstream.ai/scrapingbee/api/v1 for $0.80 per 1,000 pages.
How SpecStream scores
The same numbers as the benchmarks page, from the official tasks and scorers.
How to move Scrapfly or AlterLab code to 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. From Scrapfly, change the address to https://api.specstream.ai/scrapfly/scrape and send the SpecStream key as key:
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. From AlterLab, send the URLs to the Extract API, up to 20 a call. {"url": ...} becomes {"urls": [...]}, and the page comes back in text, as markdown by default:
import os
import requests
reply = requests.post(
"https://api.specstream.ai/v1/extract", # was https://api.alterlab.io/api/v1/scrape
headers={"Authorization": f"Bearer {os.environ['SPECSTREAM_API_KEY']}"},
json={"urls": ["https://en.wikipedia.org/wiki/Web_scraping"], "format": "markdown"},
timeout=120,
)
reply.raise_for_status()
for page in reply.json()["data"]["results"]:
print(page["url"], page["status"], page.get("title"), (page.get("text") or "")[:300])4. Read 429 as a call to send again after Retry-After. It is not charged. Every call is listed in your workspace with its price.
Frequently asked questions
Something we didn't answer? Talk to a human
Is AlterLab better than Scrapfly?
AlterLab vs Scrapfly pricing: what does each cost?
Which is cheaper for protected sites?
Can I keep my Scrapfly code?
https://api.scrapfly.io to https://api.specstream.ai/scrapfly and send a SpecStream key as key. scrapfly-sdk works with host set to that address, and each page costs $0.0008.Do failed requests cost money?
Is there a free trial?
Does SpecStream have an MCP server?
https://api.specstream.ai/mcp over Streamable HTTP, with OAuth or an API key. An agent gets read_pages and search_web on the same balance, inside the limits you set on its key.Sources
SpecStream wrote this page. Each figure about AlterLab or Scrapfly comes from that company's own page, read on the date shown. Scrapfly prices per 1,000 pages are the Discovery plan's price per 1,000 credits times the credits a page takes.
- SpecStream pricingspecstream.ai/pricing, read Nov 12, 2026
- SpecStream for agentsspecstream.ai/agents.md, read Nov 12, 2026
- SpecStream benchmarksspecstream.ai/benchmarks, read Nov 12, 2026
- SpecStream Scrapfly guidespecstream.ai/migrate/scrapfly, read Nov 12, 2026
- AlterLab pricingalterlab.io/pricing, read Nov 12, 2026
- AlterLab, your first requestalterlab.io/docs/quickstart/first-request, read Nov 12, 2026
- AlterLab vs Scrapfly, by AlterLabalterlab.io/vs/scrapfly, read Nov 12, 2026
- Scrapfly pricingscrapfly.io/pricing, read Nov 12, 2026
- Scrapfly billingscrapfly.io/docs/scrape-api/billing, read Nov 12, 2026
- Oxylabs pricingoxylabs.io/pricing, read Nov 12, 2026
- Oxylabs Web Scraper API pricingoxylabs.io/products/web-api/scrape/targets/pricing, read Nov 12, 2026
- Zyte pricingzyte.com/pricing/, read Nov 12, 2026
- Firecrawl pricingfirecrawl.dev/pricing, read Nov 12, 2026
- ScrapingBee pricingscrapingbee.com/pricing/, read Nov 12, 2026
- ScrapingBee documentationscrapingbee.com/documentation/, read Nov 12, 2026




