AlterLab vs Oxylabs in 2026
Both prices, and one price per page.
AlterLab bills $0.0002 to $0.02 a page by the tier that returned it, from a balance with a $10 minimum deposit. Oxylabs sells one subscription from $15 a month and bills a custom domain at $1.00 per 1,000 results, $1.50 with JavaScript.
SpecStream is the live web data engine. Its Extract API reads any page for $0.80 per 1,000, scores 0.908 F1 on WCXB, and charges nothing for a page that is blocked, missing or empty. Search and rows run on the same key.
New accounts get $10 of credit, no card. It covers 12,500 pages.
SpecStream, AlterLab and Oxylabs on Nov 12, 2026
| SpecStream | AlterLab | Oxylabs | |
|---|---|---|---|
| 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 | One subscription for every product: Starter $15 a month, Basic $100, Flexible $500, Enterprise from $2,500. At the plan's limit you top up in the dashboard |
| 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.00 for a custom domain without JavaScript, on the entry tiers |
| 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. $20 on extended browser sessions | $1.50 for a custom domain with JavaScript, on the entry tiers |
| 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 | Its own system errors, with 5xx and 6xx codes. A 2xx or 4xx reply counts as successful and is billed |
| Free to start | $10 of credit, no card: 12,500 pages | Up to 5,000 free requests on a new account | $5 toward any product |
| Search | GET /v1/web-search on the same key: $1 per 1,000 on the fast tier, $5 per 1,000 by default, 97.9 F-score on all 1,000 SimpleQA Verified questions | $0.001 a query, $0.004 on Google or Bing | /search at $1 per 1,000 searches |
| Structured data | Deep Search: a request in plain words returns every match on the live web as rows, at 5¢, 15¢ or $1 a row, with the most a run can cost quoted before it starts | Your JSON schema filled from a page, at $0.001 on top of the tier price | AI parsing at $3.00 per 1,000 parsed pages |
| Many URLs at once | Up to 20 URLs a call on POST /v1/extract | Up to 100 URLs a batch call | Batch queries, included in the API plans without additional fees |
| 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 | The url of a universal job goes to POST /v1/extract as urls |
Why AlterLab and Oxylabs users read pages with SpecStream
Each price from its own vendor
AlterLab's comparison page puts Oxylabs at $3.00 or more per 1,000 basic HTML pages. Oxylabs' own pricing page lists a custom domain at $1.00 per 1,000 results without JavaScript and $1.50 with it, on its entry tiers. 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
AlterLab starts each request at its lightest tier and bills the tier that returned the page, so 1,000 URLs cost $0.20 when a direct fetch reads them all and $20 when each needs an extended browser session. Oxylabs prices by target: Google with JavaScript at $1.35 per 1,000 results, Amazon at $0.50, a custom domain at $1.00 or $1.50 with JavaScript. A 404 counts as a result and is billed.
SpecStream charges $0.0008 for every page that gives text, whatever it took to read it. You know what 1,000 URLs cost before you send them: $0.80.
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
A ranking tests the sites its author chose. This script reads the URLs in urls.txt through all three APIs, one after the other, and prints how many pages each returned and what each run cost. AlterLab reports its cost in billing.total_credits, SpecStream in price_usd, and for Oxylabs the script counts the replies its pricing page bills.
import os
import requests
urls = [line.strip() for line in open("urls.txt") if line.strip()]
# SpecStream: up to 20 URLs a call, and the price of each call in price_usd
spec = {"pages": 0, "cost": 0.0}
for start in range(0, len(urls), 20):
data = requests.post(
"https://api.specstream.ai/v1/extract",
headers={"Authorization": f"Bearer {os.environ['SPECSTREAM_API_KEY']}"},
json={"urls": urls[start:start + 20], "format": "markdown"},
timeout=120,
).json()["data"]
spec["pages"] += sum(page["status"] == "ok" for page in data["results"])
spec["cost"] += data.get("price_usd", 0)
# AlterLab: one URL a call; billing.total_credits counts $0.0002 as 200
alter = {"pages": 0, "cost": 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()
alter["pages"] += bool(reply.get("success"))
alter["cost"] += reply.get("billing", {}).get("total_credits", 0) / 1_000_000
# Oxylabs: one universal job a call; a 2xx or 4xx reply is billed
oxy = {"pages": 0, "billed": 0}
for url in urls:
result = requests.post(
"https://realtime.oxylabs.io/v1/queries",
auth=(os.environ["OXYLABS_USERNAME"], os.environ["OXYLABS_PASSWORD"]),
json={"source": "universal", "url": url},
timeout=180,
).json()["results"][0]
oxy["pages"] += 200 <= result["status_code"] < 300
oxy["billed"] += result["status_code"] < 500
print("SpecStream", spec)
print("AlterLab", alter)
print("Oxylabs", oxy, "at $1.00 per 1,000 results without JavaScript:", oxy["billed"] / 1000)On SpecStream a URL that comes back blocked, empty or not_found is not in the cost line. Send the same list twice and compare the counts, not only the prices.
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 Oxylabs alternatives
Scrapfly
A scrape API sold by monthly plan: Discovery is $30 a month for 200,000 credits. A datacenter page takes 1 credit, a residential proxy 25, and a browser adds 5. SpecStream answers Scrapfly's /scrape at https://api.specstream.ai/scrapfly/scrape for $0.80 per 1,000 pages.
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 AlterLab or Oxylabs 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. Send the URLs you scrape to the Extract API, up to 20 a call. AlterLab's {"url": ...} and an Oxylabs universal job both become {"urls": [...]}. The page comes back in text, as markdown by default, with its status, title and read_from:
import os
import requests
reply = requests.post(
"https://api.specstream.ai/v1/extract", # was https://api.alterlab.io/api/v1/scrape or realtime.oxylabs.io
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])3. Read status: ok is read and charged; blocked, not_found, empty, unsupported and failed are not charged.
4. Read 429 as a call to send again after Retry-After. It is not charged. Each reply carries the price of the call, and every call is listed in your workspace.
Frequently asked questions
Something we didn't answer? Talk to a human
Is AlterLab better than Oxylabs?
AlterLab vs Oxylabs pricing: what does each cost?
Which is cheaper for JavaScript pages?
Do failed requests cost money?
Is there a free trial?
How do I compare them on my own pages?
urls.txt. It sends every URL to all three APIs and prints the pages each returned and what each run cost, from AlterLab's billing.total_credits, SpecStream's price_usd and the replies Oxylabs bills.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 Oxylabs comes from that company's own page, read on the date shown. A price per 1,000 pages is the vendor's price for one page or result, times 1,000.
- 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
- AlterLab pricingalterlab.io/pricing, read Nov 12, 2026
- AlterLab for agents (llms.txt)alterlab.io/llms.txt, read Nov 12, 2026
- AlterLab, your first requestalterlab.io/docs/quickstart/first-request, read Nov 12, 2026
- AlterLab vs Oxylabs, by AlterLabalterlab.io/vs/oxylabs, 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
- Oxylabs Web Scraper API docsdevelopers.oxylabs.io/scraping-solutions/web-scraper-api, read Nov 12, 2026
- Oxylabs realtime integrationdevelopers.oxylabs.io/scraping-solutions/web-scraper-api/integration-methods/realtime, read Nov 12, 2026
- Scrapfly pricingscrapfly.io/pricing, read Nov 12, 2026
- Scrapfly billingscrapfly.io/docs/scrape-api/billing, 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




