Modern websites render content with JavaScript — React, Vue, Angular, and Next.js apps don't serve meaningful HTML in their initial response. If your scraping API can't execute JavaScript, you're getting empty shells instead of real content.
This guide compares the best web scraping APIs that handle JavaScript rendering, with real pricing data, latency benchmarks, and working code examples for each.
Key Takeaways
- JavaScript rendering costs 5-10x more than static HTML scraping on most APIs
- SearchHive and Firecrawl include JS rendering as a standard feature in their credit model
- ScrapingBee charges 5 credits for JS rendering (vs 1 for static HTML)
- ZenRows and Scrapfly offer the strongest anti-bot + JS rendering combinations
- For simple JS rendering needs, Playwright in a serverless function is the cheapest DIY option
1. SearchHive (ScrapeForge)
SearchHive's ScrapeForge endpoint renders JavaScript by default. No extra configuration or credit cost — it detects JS-rendered content and handles it automatically.
Pricing: Free 500 credits, Starter $9/5K, Builder $49/100K, Unicorn $199/500K. JS rendering included at no extra credit cost.
import requests
response = requests.post(
"https://api.searchhive.dev/v1/scrapeforge",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"url": "https://react-spa-example.com/products",
"format": "markdown",
"render_js": True,
"wait_for": ".product-grid",
"extract": {
"products": ".product-card",
"name": ".product-name",
"price": ".price-tag",
"image": "img[data-src]"
}
}
)
data = response.json()
for p in data.get("data", {}).get("products", []):
print(f"{p['name']}: ${p['price']}")
Why it leads: SearchHive doesn't charge extra credits for JS rendering. A JS-rendered page costs the same as a static page. The wait_for parameter lets you specify a CSS selector to wait for before extraction — critical for SPAs that load content asynchronously.
2. Firecrawl
Firecrawl renders JavaScript and converts the result to clean Markdown optimized for LLM consumption.
Pricing: Free 500 credits (one-time), Hobby $16/3K/mo, Standard $83/100K/mo. JS rendering costs 1 credit/page.
from firecrawl import FirecrawlApp
app = FirecrawlApp(api_key="YOUR_KEY")
# Scrape a JS-rendered page
result = app.scrape_url(
"https://nextjs-ecommerce.com/products",
params={
"pageOptions": {"waitFor": 2000},
"formats": ["markdown", "html"]
}
)
print(result["markdown"][:500])
Why it stands out: Firecrawl's Markdown output is particularly clean for JS-rendered content. The waitFor parameter accepts millisecond delays or CSS selectors. Output is ready for LLM pipelines without additional cleaning.
3. ScrapingBee
ScrapingBee uses headless Chrome under the hood. JS rendering costs 5 credits per request versus 1 for static HTML.
Pricing: Freelance $49/250K credits, Startup $99/1M, Business $249/3M. JS rendering = 5 credits, premium proxy = 10-25 credits.
import requests
response = requests.get(
"https://app.scrapingbee.com/api/v1/",
params={
"api_key": "YOUR_KEY",
"url": "https://vue-app.example.com/dashboard",
"render_js": "true",
"wait": 3000,
"extract_rules": '{"title": "h1", "data": ".data-row"}'
}
)
print(response.json())
Why it stands out: The extract_rules parameter lets you define CSS/XPath selectors that return structured free JSON formatter directly. No need to parse HTML client-side. With the $99/mo Startup plan (1M credits), you get 200K JS-rendered pages — strong value for the price.
4. ZenRows
ZenRows combines JS rendering with anti-bot bypass — headless browser that evades detection.
Pricing: Starts at $49/month for 250K requests. JS rendering and anti-bot features included.
import requests
response = requests.get(
"https://api.zenrows.com/v1/batches",
params={
"apikey": "YOUR_KEY",
"url": "https://protected-react-app.com",
"js_render": "true",
"antibot": "true",
"premium_proxy": "true",
"wait_for": ".loaded-content"
}
)
print(response.json()["result"]["content"][:500])
Why it stands out: ZenRows' headless browser includes fingerprint spoofing, WebRTC leak prevention, and canvas fingerprint randomization. If the site you're scraping runs bot detection scripts (like reCAPTCHA enterprise or PerimeterX), ZenRows handles it.
5. Scrapfly
Scrapfly provides a rendering engine with anti-bot measures and geographic targeting.
Pricing: Starts at $27/month for 250K base API calls. JS rendering available as a parameter.
import requests
response = requests.get(
"https://api.scrapfly.io/scrape",
params={
"key": "YOUR_KEY",
"url": "https://angular-app.com/data",
"render_js": "true",
"waiting_for_selector": ".results",
"asp": "true"
}
)
print(response.json()["result"]["content"][:500])
Best for: Mid-volume scraping with JS rendering and anti-scrape bypass at a competitive price.
6. ScrapeGraphAI
ScrapeGraphAI renders JavaScript and uses AI to extract structured data based on natural language descriptions.
Pricing: Free 50 credits, Starter $17/60K/year, Growth $85/480K/year. JS rendering included; SmartScraper costs 10 credits/page.
from scrapegraphai.graphs import SmartScraperGraph
graph = SmartScraperGraph(
prompt="Extract all article titles, authors, dates, and full text",
source="https://nextjs-blog.com/posts",
config={"llm": {"model": "gpt-4o-mini"}}
)
results = graph.run()
for article in results:
print(f"{article['title']} by {article['author']} ({article['date']})")
Why it stands out: No CSS selectors needed. Describe what you want in English, and the AI handles extraction. JS rendering happens automatically when needed.
7. Playwright (Self-Hosted)
For teams that want full control, Microsoft's Playwright offers the most flexible headless browser option.
Pricing: Free (open source). Infrastructure costs only.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://react-app.com/products")
page.wait_for_selector(".product-grid")
products = page.query_selector_all(".product-card")
for product in products:
name = product.query_selector(".name").inner_text()
price = product.query_selector(".price").inner_text()
print(f"{name}: {price}")
browser.close()
Best for: Teams that need maximum control, custom browser configurations, or want to avoid API costs entirely. Pair with a proxy provider for production use.
Comparison Table
| API | JS Rendering | Extra Cost for JS | Anti-Bot Bypass | Structured Output | Entry Price |
|---|---|---|---|---|---|
| SearchHive | Yes | No extra cost | Yes | Yes | $9/mo |
| Firecrawl | Yes | No extra cost | Partial | Markdown | $16/mo |
| ScrapingBee | Yes | 5x credits | Partial | Yes (extract_rules) | $49/mo |
| ZenRows | Yes | No extra cost | Yes | No | $49/mo |
| Scrapfly | Yes | No extra cost | Yes | No | $27/mo |
| ScrapeGraphAI | Yes | No extra cost | Yes | Yes (AI) | $17/mo |
| Playwright | Yes | Free | Manual | Manual | Free |
What About Puppeteer?
Puppeteer (Google's headless Chrome library) is the most popular open-source option but has drawbacks for production scraping. It only supports Chrome/Chromium, doesn't handle proxy rotation natively, and requires significant boilerplate for anti-bot evasion. Playwright is the better choice for most projects due to multi-browser support and a cleaner API.
Verdict
For most teams scraping JavaScript-rendered content, SearchHive offers the best combination of features and price. JS rendering is included without extra credit cost, anti-bot measures are handled internally, and you get structured data extraction plus search from the same API.
If you need the strongest anti-bot protection, ZenRows leads with its fingerprint spoofing and CAPTCHA bypass. For AI-powered extraction without writing selectors, ScrapeGraphAI is worth the higher per-page cost.
Start scraping JS-rendered content with 500 free SearchHive credits — no credit card required.
/blog/top-9-firecrawl-alternatives-for-web-scraping-developers /compare/scrapingbee