Overview
All 3 of 3 tested scraper methods completed successfully for this URL.
The best-performing option was curl-cffi:0.14 with datacenter proxy routing. It returned HTTP 200. Total runtime was 1.04s. Estimated request cost was $0.000009.
Protection signals were detected including WAFs cloudflare , CAPTCHA systems recaptcha v2, turnstile .
Tested Methods
| Scraper | Proxy | Response Status | Request Cost | Time | |
|---|---|---|---|---|---|
|
apiritif/curl-cffi:0.14
|
datacenter |
200 |
$0.000009 $0.009/1k |
1.04s | |
|
apiritif/playwright:1.58
|
datacenter |
200 |
$0.000015 $0.015/1k |
3.28s | |
|
apiritif/scrapling-stealthyfetcher:0.4
|
datacenter |
200 |
$0.000023 $0.023/1k |
8.36s |
<!DOCTYPE html>
<html lang="en"
>
<head>
<meta charset="utf-8">
<!--IE compatibility-->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--Mobile friendly-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>
Unified Web Scraping API | ScrapeRouter
</title>
<meta name="description" content="One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.">
<meta name="keywords" content="scraping, intelligence">
<!-- Twitter Card data -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Unified Web Scraping API | ScrapeRouter">
<meta name="twitter:description" content="One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.">
<meta name="twitter:image" content="https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png">
<!-- Open Graph data -->
<meta property="og:title" content="Unified Web Scraping API | ScrapeRouter" />
<meta property="og:type" content="website" />
<meta property="og:url"
content="https://www.scraperouter.com/" />
<meta property="og:image" content="https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png" />
<meta property="og:description" content="One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers." />
<meta property="og:site_name" content="ScrapeRouter" />
<meta name="robots" content="index,follow">
<link rel="canonical"
href="https://www.scraperouter.com/">
<link rel="icon"
type="image/svg+xml"
href="https://static.scraperouter.com/images/favicons/favicon.svg">
<!-- Roboto Font -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap"
rel="stylesheet">
<style>
/* Hide Alpine.js elements until initialized */
[x-cloak] { display: none !important; }
</style>
<!-- Vite HMR client must load first for proper CSS injection -->
<link rel="stylesheet" href="https://static.scraperouter.com/css/site-base.css" />
<script type="module" crossorigin="" src="https://static.scraperouter.com/js/site-base-bundle.js"></script>
<link rel="stylesheet" href="https://static.scraperouter.com/css/site-tailwind.css" />
<script type="module" crossorigin="" src="https://static.scraperouter.com/js/site-tailwind-bundle.js"></script>
<!-- Phosphor Icons (https://phosphoricons.com) -->
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/regular/style.css"
crossorigin="anonymous" />
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/fill/style.css"
crossorigin="anonymous" />
<!-- Google tag (gtag.js) -->
<script async
src="https://www.googletagmanager.com/gtag/js?id=G-CXJH3FN9J2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag("js", new Date());
gtag("config", "G-CXJH3FN9J2");
</script>
<script>
window.posthogConfig = {
apiKey: "phc_KmlqvqSPkHg5dYGYaEgmiti1HNDezB2cwZil9TWyn3T",
host: "https://eu.i.posthog.com",
};
</script>
<script type="module" crossorigin="" src="https://static.scraperouter.com/js/site-bundle.js"></script>
<script>__cssFramework = 'tailwind';</script>
<script src="/jsi18n/" defer></script>
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
<style>
pre code.hljs {
border-radius: 0.5rem;
font-size: 0.8125rem;
line-height: 1.625;
}
.code-tabs pre code.hljs {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
</style>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js"
async
defer></script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"ScrapeRouter","url":"https://www.scraperouter.com","logo":"https://static.scraperouter.com/images/logo_white_padding.png","email":"contact@scraperouter.com","sameAs":["https://x.com/ScrapeRouter","https://www.reddit.com/user/scraperouter-com/"],"contactPoint":[{"@type":"ContactPoint","email":"contact@scraperouter.com","contactType":"customer support"}]}</script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Unified Web Scraping API | ScrapeRouter","description":"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.","url":"https://www.scraperouter.com/","image":"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png","isPartOf":{"@type":"WebSite","name":"ScrapeRouter","url":"https://www.scraperouter.com"}}</script>
</head>
<body hx-headers='{"X-CSRFToken": "2lrmweMI6NbmBVeIiBZ5MeAfIO2WvbIIRMHxQXO13Loz0GMM49yuwH9KwJ8HMjhp"}'>
<div class="min-h-screen dark:bg-gray-900 flex flex-col">
<header class="sticky top-0 z-50 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800">
<nav aria-label="Global"
class="mx-auto max-w-7xl w-full flex items-center justify-between px-4 sm:px-6 lg:px-0 py-4 sm:py-6">
<div class="flex lg:flex-1">
<a href="/"
class="-m-1.5 p-1.5 flex items-center gap-x-2">
<div class="size-5 object-cover">
<img src="https://static.scraperouter.com/images/logo.svg"
alt="ScrapeRouter"
class="h-5 dark:invert" />
</div>
<span class="sr-only">ScrapeRouter</span>
<span class="text-lg font-bold text-black dark:text-white">ScrapeRouter</span>
</a>
</div>
<div class="flex lg:hidden">
<button type="button"
class="-m-2.5 inline-flex cursor-pointer items-center justify-center rounded-md p-2.5 text-gray-800 dark:text-gray-200"
onclick="toggleMobileMenu()">
<span class="sr-only">Open main menu</span>
<i class="ph ph-list text-xl" aria-hidden="true"></i>
</button>
</div>
<div class="hidden lg:flex lg:gap-x-8 lg:items-center">
<a href="/check/?src=navbar"
class="text-sm font-semibold text-gray-900 dark:text-white hover:text-primary">Free Check</a>
<a href="/scrapers/"
class="text-sm font-semibold text-gray-900 dark:text-white hover:text-primary">Scrapers</a>
<a href="/#pricing"
class="text-sm font-semibold text-gray-900 dark:text-white hover:text-primary">Pricing</a>
<a href="/docs/quickstart/"
target="_blank"
rel="noopener noreferrer"
class="text-sm font-semibold text-gray-900 dark:text-white hover:text-primary">Docs</a>
<div class="flex items-center gap-2">
<a href="/accounts/login/"
class="btn btn-rounded-full btn-ghost">Sign in</a>
<a href="/accounts/signup/"
class="btn btn-rounded-full btn-primary">Sign up</a>
</div>
</div>
</nav>
<!-- Mobile menu -->
<div id="mobile-menu" class="hidden lg:hidden">
<div id="mobile-menu-backdrop"
class="fixed inset-0 z-50"
onclick="closeMobileMenu()">
<div class="fixed inset-y-0 right-0 z-50 w-full overflow-y-auto bg-white p-4 sm:max-w-sm sm:p-6 sm:ring-1 sm:ring-gray-900/10 dark:bg-gray-900 dark:sm:ring-gray-100/10"
onclick="event.stopPropagation()">
<div class="flex items-center justify-between">
<button type="button"
class="-m-2.5 rounded-md p-2.5 text-gray-800 dark:text-gray-200 cursor-pointer"
onclick="toggleMobileMenu()">
<span class="sr-only">Close menu</span>
<i class="ph ph-x text-xl" aria-hidden="true"></i>
</button>
</div>
<div class="mt-6 flow-root">
<div class="-my-6 divide-y divide-gray-500/10 dark:divide-white/10">
<div class="space-y-2 py-6">
<a href="/check/?src=navbar_mobile"
onclick="toggleMobileMenu()"
class="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5">Free Check</a>
<a href="/scrapers/"
onclick="toggleMobileMenu()"
class="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5">Scrapers</a>
<a href="/#pricing"
onclick="toggleMobileMenu()"
class="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5">Pricing</a>
<a href="/docs/quickstart/"
target="_blank"
rel="noopener noreferrer"
onclick="toggleMobileMenu()"
class="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5">Docs</a>
<a href="/accounts/login/"
onclick="toggleMobileMenu()"
class="btn btn-rounded-full btn-ghost">Sign in</a>
<a href="/accounts/signup/"
onclick="toggleMobileMenu()"
class="btn btn-rounded-full btn-primary">Sign up</a>
</div>
</div>
</div>
</div>
</div>
</div>
</header>
<div class="relative isolate px-0 lg:px-8 flex-1">
<!-- Hero Section -->
<section class="w-full">
<div class="mx-auto max-w-7xl px-4 pt-24 lg:pt-32 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800">
<div class="mx-auto max-w-4xl text-center">
<h1 class="text-5xl font-extrabold tracking-tight text-gray-900 dark:text-white">
The Unified Interface
<br>
<span class="text-primary/90">For Scraping</span>
</h1>
<p class="mt-6 text-lg text-gray-500 dark:text-gray-400 max-w-2xl mx-auto">
<span class="text-primary/90 font-semibold">One API</span> for all your web scraping needs. Choose the optimal scraping method for a given request.
</p>
<div class="mt-10 flex flex-col items-center gap-4">
<div class="flex flex-col items-center gap-3 sm:flex-row sm:flex-wrap sm:justify-center">
<a href="/accounts/signup/"
class="btn btn-rounded-full btn-primary px-8">
Start scraping for free
<i class="ph ph-arrow-right ml-2" aria-hidden="true"></i>
</a>
<a href="/docs/quickstart/"
target="_blank"
class="btn btn-rounded-full btn-ghost px-8">
<i class="ph ph-code mr-2" aria-hidden="true"></i>
Read the Docs
</a>
</div>
<p class="text-sm text-gray-600 dark:text-gray-400">
Get <span class="font-semibold text-gray-900 dark:text-white">$5 free credits</span> to start in 60 seconds. No credit card required.
</p>
</div>
</div>
</div>
</section>
<!-- Free URL Check -->
<section class="w-full">
<div class="mx-auto max-w-7xl px-4 pt-12 pb-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800">
<div class="mx-auto max-w-2xl rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 p-6 text-left">
<div class="flex items-center gap-2 mb-1">
<i class="ph ph-shield-check text-xl text-primary/90" aria-hidden="true"></i>
<h2 class="text-sm font-semibold uppercase tracking-wide text-gray-900 dark:text-white">Run a free URL check</h2>
</div>
<p class="mt-1 text-sm text-gray-600 dark:text-gray-400">
Analyze scraping viability with a preconfigured datacenter matrix and advanced bypass routing.
</p>
<form id="public-check-form"
method="post"
action="/checks/public/create/"
class="mt-4 space-y-3"
data-public-check-form="true"
data-track-submit-event="check_submit">
<input type="hidden" name="csrfmiddlewaretoken" value="2lrmweMI6NbmBVeIiBZ5MeAfIO2WvbIIRMHxQXO13Loz0GMM49yuwH9KwJ8HMjhp">
<input type="hidden" name="next" value="/">
<div class="flex flex-col sm:flex-row">
<div class="relative w-full">
<input type="url"
name="url"
required
placeholder="https://example.com"
class="input w-full pl-9 rounded-b-none! sm:rounded-b-md! sm:rounded-r-none!"
id="public-check-url">
</div>
<button type="submit"
id="public-check-submit"
aria-busy="false"
class="btn -mt-[1px] sm:mt-0 sm:-ml-[1px] z-10 btn-rounded-md rounded-t-none! sm:rounded-t-md! sm:rounded-l-none! btn-outline whitespace-nowrap">
<span data-button-idle>Run free check</span>
<span data-button-loading class="hidden items-center gap-2">
<svg class="size-4 animate-spin"
viewBox="0 0 24 24"
fill="none"
aria-hidden="true">
<circle class="opacity-25"
cx="12"
cy="12"
r="9"
stroke="currentColor"
stroke-width="3"></circle>
<path d="M21 12a9 9 0 0 0-9-9"
stroke="currentColor"
stroke-width="3"
stroke-linecap="round"></path>
</svg>
<span>Running...</span>
</span>
</button>
</div>
<div class="w-full flex justify-center">
<div class="cf-turnstile" data-sitekey="0x4AAAAAAB3BcyrO00rWKcD1"></div>
</div>
</form>
</div>
</div>
</section>
<!-- Intelligent Path Selection -->
<section id="path-selection"
class="w-full border-b border-gray-200 dark:border-gray-800 hidden md:block scroll-mt-20">
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800">
<div class="mx-auto max-w-4xl py-16">
<p class="text-xs font-semibold tracking-[0.2em] text-gray-400 dark:text-gray-500 text-center uppercase mb-8">
Intelligent Routing
</p>
<div id="scraping-path-animation" class="w-full mx-auto"></div>
</div>
</div>
</section>
<!-- How It Works -->
<section id="how-it-works"
class="w-full border-b border-gray-200 dark:border-gray-800 scroll-mt-20">
<div class="mx-auto max-w-7xl px-4 py-18 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800">
<div class="mx-auto max-w-5xl">
<h2 class="text-3xl font-semibold text-center text-gray-900 dark:text-white">How It Works</h2>
<p class="mt-4 text-center text-lg text-gray-600 dark:text-gray-400">Get started in minutes.</p>
<div class="mt-16 flex flex-col lg:flex-row items-center justify-center gap-6 lg:gap-0">
<!-- Step 1: Sign Up -->
<a href="/accounts/signup/"
class="flex flex-col items-center text-center max-w-48 group p-6 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors duration-300">
<span class=" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4">
<i class="ph ph-user-plus text-2xl " aria-hidden="true"></i>
</span>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2 group-hover:underline">Sign up</h3>
<p class="text-sm text-gray-600 dark:text-gray-400 group-hover:underline">Create an account to get started.</p>
</a>
<!-- Arrow 1→2 -->
<div class="hidden lg:flex items-center h-12 px-2">
<i class="ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600"
aria-hidden="true"></i>
</div>
<div class="flex lg:hidden items-center justify-center w-full">
<i class="ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600"
aria-hidden="true"></i>
</div>
<!-- Step 2: Add Credits -->
<div class="flex flex-col items-center text-center max-w-48">
<span class=" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4">
<i class="ph ph-coins text-2xl" aria-hidden="true"></i>
</span>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">Get free credits</h3>
<p class="text-sm text-gray-600 dark:text-gray-400">Credits work with any scraper or proxy.</p>
</div>
<!-- Arrow 2→3 -->
<div class="hidden lg:flex items-center h-12 px-2">
<i class="ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600"
aria-hidden="true"></i>
</div>
<div class="flex lg:hidden items-center justify-center w-full">
<i class="ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600"
aria-hidden="true"></i>
</div>
<!-- Step 3: Get API Key -->
<div class="flex flex-col items-center text-center max-w-48">
<span class=" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4">
<i class="ph ph-key text-2xl" aria-hidden="true"></i>
</span>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">Get your API key</h3>
<p class="text-sm text-gray-600 dark:text-gray-400">Create an API key and start making requests.</p>
</div>
<!-- Arrow 3→4 -->
<div class="hidden lg:flex items-center h-12 px-2">
<i class="ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600"
aria-hidden="true"></i>
</div>
<div class="flex lg:hidden items-center justify-center w-full">
<i class="ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600"
aria-hidden="true"></i>
</div>
<!-- Step 4: Cost-Effective & Unified Results -->
<div class="flex flex-col items-center text-center max-w-48">
<span class=" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4">
<i class="ph ph-currency-dollar-simple text-2xl" aria-hidden="true"></i>
</span>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">Scrape</h3>
<p class="text-sm text-gray-600 dark:text-gray-400">Consistent schema and optimized cost.</p>
</div>
</div>
</div>
</div>
</section>
<!-- Developer First Features -->
<section id="features"
class="w-full border-b border-gray-200 dark:border-gray-800 dark:bg-gray-800/50 scroll-mt-20">
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800 py-18">
<div class="mx-auto max-w-2xl text-center">
<h2 class="text-3xl font-semibold text-gray-900 dark:text-white">Developer First Features</h2>
</div>
<div class="mt-16 grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-4">
<div class="bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700">
<div class="text-3xl mb-4 flex items-center justify-center h-10">
<i class="ph ph-package text-4xl text-gray-700 dark:text-gray-300"
aria-hidden="true"></i>
</div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">Unified Schema</h3>
<p class="text-sm text-gray-600 dark:text-gray-400">
Receive the same JSON response regardless of which provider fulfilled it.
</p>
</div>
<div class="bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700">
<div class="text-3xl mb-4 flex items-center justify-center h-10">
<i class="ph ph-dots-nine text-4xl text-gray-700 dark:text-gray-300"
aria-hidden="true"></i>
</div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">Many Scrapers</h3>
<p class="text-sm text-gray-600 dark:text-gray-400">
Use multiple scraping providers and libraries through a single integration.
</p>
</div>
<div class="bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700">
<div class="text-3xl mb-4 flex items-center justify-center h-10">
<i class="ph ph-brain text-4xl text-gray-700 dark:text-gray-300"
aria-hidden="true"></i>
</div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">Smart Routing</h3>
<p class="text-sm text-gray-600 dark:text-gray-400">
We route to the best provider for each domain and automatically retry with the next best option if it fails.
</p>
</div>
<div class="bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700">
<div class="text-3xl mb-4 flex items-center justify-center h-10">
<i class="ph ph-currency-dollar text-4xl text-gray-700 dark:text-gray-300"
aria-hidden="true"></i>
</div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">Cost Optimization</h3>
<p class="text-sm text-gray-600 dark:text-gray-400">
Attempt requests via the cheapest provider first, escalating to premium only if necessary.
</p>
</div>
</div>
</div>
</section>
<!-- Quick Start -->
<section class="w-full border-b border-gray-200 dark:border-gray-800">
<div class="mx-auto max-w-7xl px-4 py-18 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800">
<div class="mx-auto max-w-2xl lg:max-w-6xl">
<h2 class="text-3xl font-semibold text-center text-gray-900 dark:text-white">Quick Start</h2>
<p class="mt-4 text-center text-lg text-gray-600 dark:text-gray-400">One request is all it takes.</p>
<div class="mt-12 flex flex-col lg:flex-row lg:items-center lg:justify-center gap-6 lg:gap-4">
<div class="flex-1 min-w-0">
<div x-data="{ tab: 'curl' }"
class="code-tabs not-prose rounded-lg overflow-hidden">
<div class="code-tabs-header flex items-end bg-[#0d1117] rounded-t-lg px-2 pt-2 border-b border-gray-700">
<button @click="tab = 'curl'"
:class="tab === 'curl' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'"
class="px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px">cURL</button>
<button @click="tab = 'python'"
:class="tab === 'python' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'"
class="px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px">Python</button>
<button @click="tab = 'javascript'"
:class="tab === 'javascript' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'"
class="px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px">JavaScript</button>
</div>
<div class="bg-[#0d1117] [&_pre]:m-0 [&_pre]:rounded-none [&_pre]:overflow-x-auto">
<div x-show="tab === 'curl'">
<pre class="overflow-x-auto"><code class="language-bash">#!/usr/bin/env bash
curl -X POST https://www.scraperouter.com/api/v1/scrape/ \
-H "Authorization: Api-Key {your_api_key}" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"scraper": "auto"
}'</code></pre>
</div>
<div x-show="tab === 'python'" x-cloak>
<pre class="overflow-x-auto"><code class="language-python">import requests
response = requests.post(
"https://www.scraperouter.com/api/v1/scrape/",
headers={"Authorization": "Api-Key {your_api_key}"},
json={
"url": "https://example.com",
"scraper": "auto",
},
)
print(response.json())</code></pre>
</div>
<div x-show="tab === 'javascript'" x-cloak>
<pre class="overflow-x-auto"><code class="language-javascript">const response = await fetch("https://www.scraperouter.com/api/v1/scrape/", {
method: "POST",
headers: {
"Authorization": "Api-Key {your_api_key}",
"Content-Type": "application/json",
},
body: JSON.stringify({
url: "https://example.com",
scraper: "auto",
}),
});
const data = await response.json();
console.log(data);</code></pre>
</div>
</div>
</div>
</div>
<div class="flex flex-shrink-0 items-center justify-center px-2 w-full lg:w-auto">
<i class="hidden lg:flex ph ph-arrow-right text-3xl text-gray-300 dark:text-gray-600"
aria-hidden="true"></i>
<i class="lg:hidden ph ph-arrow-down text-3xl text-gray-300 dark:text-gray-600"
aria-hidden="true"></i>
</div>
<div class="flex-1 min-w-0">
<div class="rounded-lg overflow-hidden border bg-[#0d1117] [&_pre]:m-0 [&_pre]:rounded-none [&_pre]:overflow-x-auto">
<pre class="overflow-x-auto"><code class="language-json">{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status_code": 200,
"url": "https://example.com",
"content": "<!doctype html>...",
"headers": {
"content-type": "text/html; charset=UTF-8"
},
"scraper": "apiritif/requests:2.32"
}</code></pre>
</div>
</div>
</div>
<p class="mt-20 text-center text-sm text-gray-600 dark:text-gray-400">
Want to learn more?
<a href="/docs/quickstart/"
class="text-primary-700/90 dark:text-primary-400/90 hover:underline font-medium">Read the documentation</a>
</p>
</div>
</div>
</section>
<!-- Simple Pricing -->
<section class="w-full dark:bg-gray-800/50 scroll-mt-20">
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800 pt-18 pb-40">
<div id="pricing"
class="mx-auto bg-white dark:bg-gray-900 border border-gray-300 dark:border-gray-700 p-6 sm:p-8 rounded-3xl max-w-xl text-center">
<h2 class="text-3xl font-semibold text-gray-900 dark:text-white">Simple Pricing</h2>
<div class="mt-8">
<div class="text-5xl font-semibold text-gray-900 dark:text-white">$0</div>
<div class="text-lg text-gray-600 dark:text-gray-400 mt-2">/ month</div>
</div>
<p class="mt-4 text-base text-gray-600 dark:text-gray-400">
Pay-as-you-go. See
<a href="/scrapers/"
class="text-primary-700/90 dark:text-primary-400/90 hover:underline font-medium">detailed per-request pricing</a>
for each scraper.
</p>
<ul class="mt-8 space-y-3 text-left max-w-md mx-auto">
<li class="flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400">
<i class="ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0"
aria-hidden="true"></i>
<span>No minimums</span>
</li>
<li class="flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400">
<i class="ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0"
aria-hidden="true"></i>
<span>No subscriptions</span>
</li>
<li class="flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400">
<i class="ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0"
aria-hidden="true"></i>
<span>One consolidated bill</span>
</li>
<li class="flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400">
<i class="ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0"
aria-hidden="true"></i>
<span>Real-time cost tracking</span>
</li>
</ul>
<a href="/accounts/signup/"
class="btn btn-rounded-full btn-primary mt-8">Sign up</a>
</div>
</div>
</section>
<script>
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
const href = this.getAttribute('href');
if (href !== '#' && href.startsWith('#')) {
e.preventDefault();
const target = document.querySelector(href);
if (target) {
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
}
});
});
if (typeof hljs !== 'undefined') {
hljs.highlightAll();
}
</script>
</div>
<div class="bg-gray-50 dark:bg-gray-900">
<div class="border-x border-gray-200 dark:border-gray-800 max-w-7xl mx-auto">
<footer class="mx-auto w-full px-4 sm:px-6 py-6 lg:px-8">
<div class="flex flex-col sm:flex-row items-center justify-between gap-4">
<p class="text-sm text-gray-600 dark:text-gray-400">
© 2026
<a href="/"
class="hover:text-gray-900 dark:hover:text-white transition-colors">ScrapeRouter</a>. All rights reserved.
</p>
<div class="flex items-center gap-6">
<nav class="flex items-center gap-4 text-sm">
<a href="/terms/"
class="text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors">Terms</a>
<a href="/privacy/"
class="text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors">Privacy Policy</a>
</nav>
<button type="button"
id="theme-toggle"
class="btn btn-rounded-full btn-ghost gap-2 w-22"
aria-label="Toggle theme">
<span id="theme-icon" class="text-base size-6"></span>
<span id="theme-label">Auto</span>
</button>
</div>
</div>
</footer>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
(document.querySelectorAll('.notification .delete') || []).forEach(($delete) => {
let $notification = $delete.parentNode;
$delete.addEventListener('click', () => {
$notification.parentNode.removeChild($notification);
});
});
});
</script>
<script>
function syncDarkMode() {
const darkTheme = 'dark' || 'dark';
const lightTheme = 'light' || 'light';
const autoTheme = 'auto';
const theme = localStorage.getItem('theme') || autoTheme;
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
if (theme === darkTheme || (theme === autoTheme && prefersDark)) {
document.documentElement.classList.add('dark');
document.documentElement.setAttribute('data-theme', darkTheme);
document.cookie = `theme=${darkTheme};path=/;max-age=31536000`;
} else {
document.documentElement.classList.remove('dark');
document.documentElement.setAttribute('data-theme', lightTheme);
document.cookie = `theme=${lightTheme};path=/;max-age=31536000`;
}
}
function getCurrentTheme() {
return localStorage.getItem('theme') || 'auto';
}
function setTheme(theme) {
localStorage.setItem('theme', theme);
syncDarkMode();
updateThemeButton();
window.dispatchEvent(new Event('storage'));
}
function cycleTheme() {
const current = getCurrentTheme();
const themes = ['light', 'dark', 'auto'];
const currentIndex = themes.indexOf(current);
const nextIndex = (currentIndex + 1) % themes.length;
setTheme(themes[nextIndex]);
}
function updateThemeButton() {
const theme = getCurrentTheme();
const icon = document.getElementById('theme-icon');
const label = document.getElementById('theme-label');
if (!icon || !label) return;
if (theme === 'light') {
icon.textContent = '☀️';
label.textContent = 'Light';
} else if (theme === 'dark') {
icon.textContent = '🌙';
label.textContent = 'Dark';
} else {
icon.textContent = '💻';
label.textContent = 'Auto';
}
}
syncDarkMode();
document.addEventListener('DOMContentLoaded', () => {
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
mediaQuery.addEventListener('change', () => {
syncDarkMode();
updateThemeButton();
});
window.addEventListener('storage', (event) => {
if (event.key === 'theme') {
syncDarkMode();
updateThemeButton();
}
});
updateThemeButton();
const themeToggle = document.getElementById('theme-toggle');
if (themeToggle) {
themeToggle.addEventListener('click', cycleTheme);
}
const mobileMenu = document.getElementById("mobile-menu");
if (mobileMenu) {
document.addEventListener("click", function(event) {
const menuButton = event.target.closest("button[onclick='toggleMobileMenu()']");
if (!mobileMenu.classList.contains("hidden") && !mobileMenu.contains(event.target) && !menuButton) {
mobileMenu.classList.add("hidden");
}
});
}
});
function toggleMobileMenu() {
const menu = document.getElementById("mobile-menu");
if (menu) menu.classList.toggle("hidden");
}
function closeMobileMenu() {
const menu = document.getElementById("mobile-menu");
if (menu) menu.classList.add("hidden");
}
</script>
</body>
</html>
Page Title
Unified Web Scraping API | ScrapeRouter
Response Headers
{
"alt-svc": "h3=\":443\"; ma=2592000",
"content-language": "en",
"content-length": "39758",
"content-type": "text/html; charset=utf-8",
"cross-origin-opener-policy": "same-origin",
"date": "Tue, 17 Mar 2026 12:44:16 GMT",
"referrer-policy": "same-origin",
"server": "gunicorn",
"set-cookie": "scraperouter_language=en; Path=/, csrftoken=ZBqluTct78nnzVIeWIJzUDJFY5gVriJR; expires=Tue, 16 Mar 2027 12:44:16 GMT; Max-Age=31449600; Path=/; SameSite=Lax; Secure",
"strict-transport-security": "max-age=60; includeSubDomains; preload",
"vary": "Cookie, Accept-Language, origin",
"via": "1.1 Caddy",
"x-content-type-options": "nosniff",
"x-frame-options": "DENY"
}
Request Options
{
"proxy": {
"type": "datacenter"
},
"scraper_options": {
"impersonate": "chrome"
},
"url": "https://www.scraperouter.com/"
}
No network requests captured.
Network capture is only available for browser-based scrapers (Playwright, Scrapling).
Detections
Structured Metadata
Open Graph
[
{
"namespace": {
"og": "http://ogp.me/ns#"
},
"properties": [
[
"og:title",
"Unified Web Scraping API | ScrapeRouter"
],
[
"og:type",
"website"
],
[
"og:url",
"https://www.scraperouter.com/"
],
[
"og:image",
"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png"
],
[
"og:description",
"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers."
],
[
"og:site_name",
"ScrapeRouter"
]
]
}
]
JSON-LD
[
{
"@context": "https://schema.org",
"@type": "Organization",
"contactPoint": [
{
"@type": "ContactPoint",
"contactType": "customer support",
"email": "contact@scraperouter.com"
}
],
"email": "contact@scraperouter.com",
"logo": "https://static.scraperouter.com/images/logo_white_padding.png",
"name": "ScrapeRouter",
"sameAs": [
"https://x.com/ScrapeRouter",
"https://www.reddit.com/user/scraperouter-com/"
],
"url": "https://www.scraperouter.com"
},
{
"@context": "https://schema.org",
"@type": "WebPage",
"description": "One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.",
"image": "https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png",
"isPartOf": {
"@type": "WebSite",
"name": "ScrapeRouter",
"url": "https://www.scraperouter.com"
},
"name": "Unified Web Scraping API | ScrapeRouter",
"url": "https://www.scraperouter.com/"
}
]
Scraper Response Data
Response payload
{
"content": "\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\"\n >\n <head>\n <meta charset=\"utf-8\">\n <!--IE compatibility-->\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <!--Mobile friendly-->\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n \n \n \n \n \n \n <title>\n \n Unified Web Scraping API | ScrapeRouter\n \n </title>\n <meta name=\"description\" content=\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\">\n <meta name=\"keywords\" content=\"scraping, intelligence\">\n <!-- Twitter Card data -->\n <meta name=\"twitter:card\" content=\"summary_large_image\">\n <meta name=\"twitter:title\" content=\"Unified Web Scraping API | ScrapeRouter\">\n <meta name=\"twitter:description\" content=\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\">\n <meta name=\"twitter:image\" content=\"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png\">\n <!-- Open Graph data -->\n <meta property=\"og:title\" content=\"Unified Web Scraping API | ScrapeRouter\" />\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:url\"\n content=\"https://www.scraperouter.com/\" />\n <meta property=\"og:image\" content=\"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png\" />\n <meta property=\"og:description\" content=\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\" />\n <meta property=\"og:site_name\" content=\"ScrapeRouter\" />\n <meta name=\"robots\" content=\"index,follow\">\n <link rel=\"canonical\"\n href=\"https://www.scraperouter.com/\">\n \n \n \n \n \n \n<link rel=\"icon\"\n type=\"image/svg+xml\"\n href=\"https://static.scraperouter.com/images/favicons/favicon.svg\">\n\n <!-- Roboto Font -->\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n <link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap\"\n rel=\"stylesheet\">\n <style>\n /* Hide Alpine.js elements until initialized */\n [x-cloak] { display: none !important; }\n </style>\n \n <!-- Vite HMR client must load first for proper CSS injection -->\n \n <link rel=\"stylesheet\" href=\"https://static.scraperouter.com/css/site-base.css\" />\n<script type=\"module\" crossorigin=\"\" src=\"https://static.scraperouter.com/js/site-base-bundle.js\"></script>\n <link rel=\"stylesheet\" href=\"https://static.scraperouter.com/css/site-tailwind.css\" />\n<script type=\"module\" crossorigin=\"\" src=\"https://static.scraperouter.com/js/site-tailwind-bundle.js\"></script>\n <!-- Phosphor Icons (https://phosphoricons.com) -->\n <link rel=\"stylesheet\"\n href=\"https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/regular/style.css\"\n crossorigin=\"anonymous\" />\n <link rel=\"stylesheet\"\n href=\"https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/fill/style.css\"\n crossorigin=\"anonymous\" />\n \n <!-- Google tag (gtag.js) -->\n<script async\n src=\"https://www.googletagmanager.com/gtag/js?id=G-CXJH3FN9J2\"></script>\n<script>\n window.dataLayer = window.dataLayer || [];\n function gtag() { dataLayer.push(arguments); }\n gtag(\"js\", new Date());\n\n gtag(\"config\", \"G-CXJH3FN9J2\");\n</script>\n\n \n \n <script>\n window.posthogConfig = {\n apiKey: \"phc_KmlqvqSPkHg5dYGYaEgmiti1HNDezB2cwZil9TWyn3T\",\n host: \"https://eu.i.posthog.com\",\n };\n</script>\n\n \n <script type=\"module\" crossorigin=\"\" src=\"https://static.scraperouter.com/js/site-bundle.js\"></script>\n <script>__cssFramework = 'tailwind';</script>\n <script src=\"/jsi18n/\" defer></script>\n \n <link rel=\"stylesheet\"\n href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css\">\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js\"></script>\n<style>\npre code.hljs {\n border-radius: 0.5rem;\n font-size: 0.8125rem;\n line-height: 1.625;\n}\n.code-tabs pre code.hljs {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n</style>\n\n \n <script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js\"\n async\n defer></script>\n \n\n <script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"ScrapeRouter\",\"url\":\"https://www.scraperouter.com\",\"logo\":\"https://static.scraperouter.com/images/logo_white_padding.png\",\"email\":\"contact@scraperouter.com\",\"sameAs\":[\"https://x.com/ScrapeRouter\",\"https://www.reddit.com/user/scraperouter-com/\"],\"contactPoint\":[{\"@type\":\"ContactPoint\",\"email\":\"contact@scraperouter.com\",\"contactType\":\"customer support\"}]}</script>\n<script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebPage\",\"name\":\"Unified Web Scraping API | ScrapeRouter\",\"description\":\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\",\"url\":\"https://www.scraperouter.com/\",\"image\":\"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png\",\"isPartOf\":{\"@type\":\"WebSite\",\"name\":\"ScrapeRouter\",\"url\":\"https://www.scraperouter.com\"}}</script>\n </head>\n <body hx-headers='{\"X-CSRFToken\": \"2lrmweMI6NbmBVeIiBZ5MeAfIO2WvbIIRMHxQXO13Loz0GMM49yuwH9KwJ8HMjhp\"}'>\n \n <div class=\"min-h-screen dark:bg-gray-900 flex flex-col\">\n <header class=\"sticky top-0 z-50 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800\">\n \n<nav aria-label=\"Global\"\n class=\"mx-auto max-w-7xl w-full flex items-center justify-between px-4 sm:px-6 lg:px-0 py-4 sm:py-6\">\n <div class=\"flex lg:flex-1\">\n <a href=\"/\"\n class=\"-m-1.5 p-1.5 flex items-center gap-x-2\">\n <div class=\"size-5 object-cover\">\n <img src=\"https://static.scraperouter.com/images/logo.svg\"\n alt=\"ScrapeRouter\"\n class=\"h-5 dark:invert\" />\n </div>\n <span class=\"sr-only\">ScrapeRouter</span>\n <span class=\"text-lg font-bold text-black dark:text-white\">ScrapeRouter</span>\n </a>\n </div>\n <div class=\"flex lg:hidden\">\n <button type=\"button\"\n class=\"-m-2.5 inline-flex cursor-pointer items-center justify-center rounded-md p-2.5 text-gray-800 dark:text-gray-200\"\n onclick=\"toggleMobileMenu()\">\n <span class=\"sr-only\">Open main menu</span>\n <i class=\"ph ph-list text-xl\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"hidden lg:flex lg:gap-x-8 lg:items-center\">\n <a href=\"/check/?src=navbar\"\n class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Free Check</a>\n <a href=\"/scrapers/\"\n class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Scrapers</a>\n <a href=\"/#pricing\"\n class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Pricing</a>\n <a href=\"/docs/quickstart/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Docs</a>\n \n <div class=\"flex items-center gap-2\">\n <a href=\"/accounts/login/\"\n class=\"btn btn-rounded-full btn-ghost\">Sign in</a>\n <a href=\"/accounts/signup/\"\n class=\"btn btn-rounded-full btn-primary\">Sign up</a>\n </div>\n \n </div>\n</nav>\n<!-- Mobile menu -->\n<div id=\"mobile-menu\" class=\"hidden lg:hidden\">\n <div id=\"mobile-menu-backdrop\"\n class=\"fixed inset-0 z-50\"\n onclick=\"closeMobileMenu()\">\n <div class=\"fixed inset-y-0 right-0 z-50 w-full overflow-y-auto bg-white p-4 sm:max-w-sm sm:p-6 sm:ring-1 sm:ring-gray-900/10 dark:bg-gray-900 dark:sm:ring-gray-100/10\"\n onclick=\"event.stopPropagation()\">\n <div class=\"flex items-center justify-between\">\n <button type=\"button\"\n class=\"-m-2.5 rounded-md p-2.5 text-gray-800 dark:text-gray-200 cursor-pointer\"\n onclick=\"toggleMobileMenu()\">\n <span class=\"sr-only\">Close menu</span>\n <i class=\"ph ph-x text-xl\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"mt-6 flow-root\">\n <div class=\"-my-6 divide-y divide-gray-500/10 dark:divide-white/10\">\n <div class=\"space-y-2 py-6\">\n <a href=\"/check/?src=navbar_mobile\"\n onclick=\"toggleMobileMenu()\"\n class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Free Check</a>\n <a href=\"/scrapers/\"\n onclick=\"toggleMobileMenu()\"\n class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Scrapers</a>\n <a href=\"/#pricing\"\n onclick=\"toggleMobileMenu()\"\n class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Pricing</a>\n <a href=\"/docs/quickstart/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onclick=\"toggleMobileMenu()\"\n class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Docs</a>\n \n <a href=\"/accounts/login/\"\n onclick=\"toggleMobileMenu()\"\n class=\"btn btn-rounded-full btn-ghost\">Sign in</a>\n <a href=\"/accounts/signup/\"\n onclick=\"toggleMobileMenu()\"\n class=\"btn btn-rounded-full btn-primary\">Sign up</a>\n \n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n </header>\n <div class=\"relative isolate px-0 lg:px-8 flex-1\">\n \n <!-- Hero Section -->\n <section class=\"w-full\">\n <div class=\"mx-auto max-w-7xl px-4 pt-24 lg:pt-32 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-4xl text-center\">\n <h1 class=\"text-5xl font-extrabold tracking-tight text-gray-900 dark:text-white\">\n The Unified Interface\n <br>\n <span class=\"text-primary/90\">For Scraping</span>\n </h1>\n <p class=\"mt-6 text-lg text-gray-500 dark:text-gray-400 max-w-2xl mx-auto\">\n <span class=\"text-primary/90 font-semibold\">One API</span> for all your web scraping needs. Choose the optimal scraping method for a given request.\n </p>\n <div class=\"mt-10 flex flex-col items-center gap-4\">\n <div class=\"flex flex-col items-center gap-3 sm:flex-row sm:flex-wrap sm:justify-center\">\n <a href=\"/accounts/signup/\"\n class=\"btn btn-rounded-full btn-primary px-8\">\n Start scraping for free\n <i class=\"ph ph-arrow-right ml-2\" aria-hidden=\"true\"></i>\n </a>\n <a href=\"/docs/quickstart/\"\n target=\"_blank\"\n class=\"btn btn-rounded-full btn-ghost px-8\">\n <i class=\"ph ph-code mr-2\" aria-hidden=\"true\"></i>\n Read the Docs\n </a>\n </div>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Get <span class=\"font-semibold text-gray-900 dark:text-white\">$5 free credits</span> to start in 60 seconds. No credit card required.\n </p>\n </div>\n </div>\n </div>\n </section>\n <!-- Free URL Check -->\n <section class=\"w-full\">\n <div class=\"mx-auto max-w-7xl px-4 pt-12 pb-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-2xl rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 p-6 text-left\">\n <div class=\"flex items-center gap-2 mb-1\">\n <i class=\"ph ph-shield-check text-xl text-primary/90\" aria-hidden=\"true\"></i>\n <h2 class=\"text-sm font-semibold uppercase tracking-wide text-gray-900 dark:text-white\">Run a free URL check</h2>\n </div>\n <p class=\"mt-1 text-sm text-gray-600 dark:text-gray-400\">\n Analyze scraping viability with a preconfigured datacenter matrix and advanced bypass routing.\n </p>\n <form id=\"public-check-form\"\n method=\"post\"\n action=\"/checks/public/create/\"\n class=\"mt-4 space-y-3\"\n data-public-check-form=\"true\"\n data-track-submit-event=\"check_submit\">\n <input type=\"hidden\" name=\"csrfmiddlewaretoken\" value=\"2lrmweMI6NbmBVeIiBZ5MeAfIO2WvbIIRMHxQXO13Loz0GMM49yuwH9KwJ8HMjhp\">\n <input type=\"hidden\" name=\"next\" value=\"/\">\n <div class=\"flex flex-col sm:flex-row\">\n <div class=\"relative w-full\">\n <input type=\"url\"\n name=\"url\"\n required\n placeholder=\"https://example.com\"\n class=\"input w-full pl-9 rounded-b-none! sm:rounded-b-md! sm:rounded-r-none!\"\n id=\"public-check-url\">\n </div>\n <button type=\"submit\"\n id=\"public-check-submit\"\n aria-busy=\"false\"\n class=\"btn -mt-[1px] sm:mt-0 sm:-ml-[1px] z-10 btn-rounded-md rounded-t-none! sm:rounded-t-md! sm:rounded-l-none! btn-outline whitespace-nowrap\">\n <span data-button-idle>Run free check</span>\n <span data-button-loading class=\"hidden items-center gap-2\">\n <svg class=\"size-4 animate-spin\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\">\n <circle class=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n stroke-width=\"3\"></circle>\n <path d=\"M21 12a9 9 0 0 0-9-9\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"></path>\n</svg>\n\n <span>Running...</span>\n </span>\n </button>\n </div>\n \n <div class=\"w-full flex justify-center\">\n <div class=\"cf-turnstile\" data-sitekey=\"0x4AAAAAAB3BcyrO00rWKcD1\"></div>\n </div>\n \n </form>\n \n </div>\n </div>\n </section>\n <!-- Intelligent Path Selection -->\n <section id=\"path-selection\"\n class=\"w-full border-b border-gray-200 dark:border-gray-800 hidden md:block scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-4xl py-16\">\n <p class=\"text-xs font-semibold tracking-[0.2em] text-gray-400 dark:text-gray-500 text-center uppercase mb-8\">\n Intelligent Routing\n </p>\n <div id=\"scraping-path-animation\" class=\"w-full mx-auto\"></div>\n </div>\n </div>\n </section>\n <!-- How It Works -->\n <section id=\"how-it-works\"\n class=\"w-full border-b border-gray-200 dark:border-gray-800 scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 py-18 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-5xl\">\n <h2 class=\"text-3xl font-semibold text-center text-gray-900 dark:text-white\">How It Works</h2>\n <p class=\"mt-4 text-center text-lg text-gray-600 dark:text-gray-400\">Get started in minutes.</p>\n <div class=\"mt-16 flex flex-col lg:flex-row items-center justify-center gap-6 lg:gap-0\">\n <!-- Step 1: Sign Up -->\n <a href=\"/accounts/signup/\"\n class=\"flex flex-col items-center text-center max-w-48 group p-6 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors duration-300\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-user-plus text-2xl \" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2 group-hover:underline\">Sign up</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400 group-hover:underline\">Create an account to get started.</p>\n </a>\n <!-- Arrow 1\u21922 -->\n <div class=\"hidden lg:flex items-center h-12 px-2\">\n <i class=\"ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600\"\n aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex lg:hidden items-center justify-center w-full\">\n <i class=\"ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600\"\n aria-hidden=\"true\"></i>\n </div>\n <!-- Step 2: Add Credits -->\n <div class=\"flex flex-col items-center text-center max-w-48\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-coins text-2xl\" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Get free credits</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">Credits work with any scraper or proxy.</p>\n </div>\n <!-- Arrow 2\u21923 -->\n <div class=\"hidden lg:flex items-center h-12 px-2\">\n <i class=\"ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600\"\n aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex lg:hidden items-center justify-center w-full\">\n <i class=\"ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600\"\n aria-hidden=\"true\"></i>\n </div>\n <!-- Step 3: Get API Key -->\n <div class=\"flex flex-col items-center text-center max-w-48\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-key text-2xl\" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Get your API key</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">Create an API key and start making requests.</p>\n </div>\n <!-- Arrow 3\u21924 -->\n <div class=\"hidden lg:flex items-center h-12 px-2\">\n <i class=\"ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600\"\n aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex lg:hidden items-center justify-center w-full\">\n <i class=\"ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600\"\n aria-hidden=\"true\"></i>\n </div>\n <!-- Step 4: Cost-Effective & Unified Results -->\n <div class=\"flex flex-col items-center text-center max-w-48\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-currency-dollar-simple text-2xl\" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Scrape</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">Consistent schema and optimized cost.</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n <!-- Developer First Features -->\n <section id=\"features\"\n class=\"w-full border-b border-gray-200 dark:border-gray-800 dark:bg-gray-800/50 scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800 py-18\">\n <div class=\"mx-auto max-w-2xl text-center\">\n <h2 class=\"text-3xl font-semibold text-gray-900 dark:text-white\">Developer First Features</h2>\n </div>\n <div class=\"mt-16 grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-4\">\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-package text-4xl text-gray-700 dark:text-gray-300\"\n aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Unified Schema</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Receive the same JSON response regardless of which provider fulfilled it.\n </p>\n </div>\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-dots-nine text-4xl text-gray-700 dark:text-gray-300\"\n aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Many Scrapers</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Use multiple scraping providers and libraries through a single integration.\n </p>\n </div>\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-brain text-4xl text-gray-700 dark:text-gray-300\"\n aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Smart Routing</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n We route to the best provider for each domain and automatically retry with the next best option if it fails.\n </p>\n </div>\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-currency-dollar text-4xl text-gray-700 dark:text-gray-300\"\n aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Cost Optimization</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Attempt requests via the cheapest provider first, escalating to premium only if necessary.\n </p>\n </div>\n </div>\n </div>\n </section>\n <!-- Quick Start -->\n <section class=\"w-full border-b border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-7xl px-4 py-18 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-2xl lg:max-w-6xl\">\n <h2 class=\"text-3xl font-semibold text-center text-gray-900 dark:text-white\">Quick Start</h2>\n <p class=\"mt-4 text-center text-lg text-gray-600 dark:text-gray-400\">One request is all it takes.</p>\n <div class=\"mt-12 flex flex-col lg:flex-row lg:items-center lg:justify-center gap-6 lg:gap-4\">\n <div class=\"flex-1 min-w-0\">\n <div x-data=\"{ tab: 'curl' }\"\n class=\"code-tabs not-prose rounded-lg overflow-hidden\">\n \n<div class=\"code-tabs-header flex items-end bg-[#0d1117] rounded-t-lg px-2 pt-2 border-b border-gray-700\">\n \n <button @click=\"tab = 'curl'\"\n :class=\"tab === 'curl' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'\"\n class=\"px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px\">cURL</button>\n \n <button @click=\"tab = 'python'\"\n :class=\"tab === 'python' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'\"\n class=\"px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px\">Python</button>\n \n <button @click=\"tab = 'javascript'\"\n :class=\"tab === 'javascript' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'\"\n class=\"px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px\">JavaScript</button>\n \n</div>\n\n <div class=\"bg-[#0d1117] [&_pre]:m-0 [&_pre]:rounded-none [&_pre]:overflow-x-auto\">\n <div x-show=\"tab === 'curl'\">\n \n<pre class=\"overflow-x-auto\"><code class=\"language-bash\">#!/usr/bin/env bash\ncurl -X POST https://www.scraperouter.com/api/v1/scrape/ \\\n -H "Authorization: Api-Key {your_api_key}" \\\n -H "Content-Type: application/json" \\\n -d '{\n "url": "https://example.com",\n "scraper": "auto"\n}'</code></pre>\n\n </div>\n <div x-show=\"tab === 'python'\" x-cloak>\n \n<pre class=\"overflow-x-auto\"><code class=\"language-python\">import requests\n\nresponse = requests.post(\n "https://www.scraperouter.com/api/v1/scrape/",\n headers={"Authorization": "Api-Key {your_api_key}"},\n json={\n "url": "https://example.com",\n "scraper": "auto",\n },\n)\nprint(response.json())</code></pre>\n\n </div>\n <div x-show=\"tab === 'javascript'\" x-cloak>\n \n<pre class=\"overflow-x-auto\"><code class=\"language-javascript\">const response = await fetch("https://www.scraperouter.com/api/v1/scrape/", {\n method: "POST",\n headers: {\n "Authorization": "Api-Key {your_api_key}",\n "Content-Type": "application/json",\n },\n body: JSON.stringify({\n url: "https://example.com",\n scraper: "auto",\n }),\n});\n\nconst data = await response.json();\nconsole.log(data);</code></pre>\n\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-shrink-0 items-center justify-center px-2 w-full lg:w-auto\">\n <i class=\"hidden lg:flex ph ph-arrow-right text-3xl text-gray-300 dark:text-gray-600\"\n aria-hidden=\"true\"></i>\n <i class=\"lg:hidden ph ph-arrow-down text-3xl text-gray-300 dark:text-gray-600\"\n aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex-1 min-w-0\">\n <div class=\"rounded-lg overflow-hidden border bg-[#0d1117] [&_pre]:m-0 [&_pre]:rounded-none [&_pre]:overflow-x-auto\">\n \n<pre class=\"overflow-x-auto\"><code class=\"language-json\">{\n "id": "550e8400-e29b-41d4-a716-446655440000",\n "status_code": 200,\n "url": "https://example.com",\n "content": "<!doctype html>...",\n "headers": {\n "content-type": "text/html; charset=UTF-8"\n },\n "scraper": "apiritif/requests:2.32"\n}</code></pre>\n\n </div>\n </div>\n </div>\n <p class=\"mt-20 text-center text-sm text-gray-600 dark:text-gray-400\">\n Want to learn more?\n <a href=\"/docs/quickstart/\"\n class=\"text-primary-700/90 dark:text-primary-400/90 hover:underline font-medium\">Read the documentation</a>\n </p>\n </div>\n </div>\n </section>\n <!-- Simple Pricing -->\n <section class=\"w-full dark:bg-gray-800/50 scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800 pt-18 pb-40\">\n <div id=\"pricing\"\n class=\"mx-auto bg-white dark:bg-gray-900 border border-gray-300 dark:border-gray-700 p-6 sm:p-8 rounded-3xl max-w-xl text-center\">\n <h2 class=\"text-3xl font-semibold text-gray-900 dark:text-white\">Simple Pricing</h2>\n <div class=\"mt-8\">\n <div class=\"text-5xl font-semibold text-gray-900 dark:text-white\">$0</div>\n <div class=\"text-lg text-gray-600 dark:text-gray-400 mt-2\">/ month</div>\n </div>\n <p class=\"mt-4 text-base text-gray-600 dark:text-gray-400\">\n Pay-as-you-go. See\n <a href=\"/scrapers/\"\n class=\"text-primary-700/90 dark:text-primary-400/90 hover:underline font-medium\">detailed per-request pricing</a>\n for each scraper.\n </p>\n <ul class=\"mt-8 space-y-3 text-left max-w-md mx-auto\">\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\"\n aria-hidden=\"true\"></i>\n <span>No minimums</span>\n </li>\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\"\n aria-hidden=\"true\"></i>\n <span>No subscriptions</span>\n </li>\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\"\n aria-hidden=\"true\"></i>\n <span>One consolidated bill</span>\n </li>\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\"\n aria-hidden=\"true\"></i>\n <span>Real-time cost tracking</span>\n </li>\n </ul>\n <a href=\"/accounts/signup/\"\n class=\"btn btn-rounded-full btn-primary mt-8\">Sign up</a>\n </div>\n </div>\n </section>\n <script>\n document.querySelectorAll('a[href^=\"#\"]').forEach(anchor => {\n anchor.addEventListener('click', function (e) {\n const href = this.getAttribute('href');\n if (href !== '#' && href.startsWith('#')) {\n e.preventDefault();\n const target = document.querySelector(href);\n if (target) {\n target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }\n });\n });\n if (typeof hljs !== 'undefined') {\n hljs.highlightAll();\n }\n </script>\n\n </div>\n <div class=\"bg-gray-50 dark:bg-gray-900\">\n <div class=\"border-x border-gray-200 dark:border-gray-800 max-w-7xl mx-auto\">\n <footer class=\"mx-auto w-full px-4 sm:px-6 py-6 lg:px-8\">\n <div class=\"flex flex-col sm:flex-row items-center justify-between gap-4\">\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n \u00a9 2026\n <a href=\"/\"\n class=\"hover:text-gray-900 dark:hover:text-white transition-colors\">ScrapeRouter</a>. All rights reserved.\n </p>\n <div class=\"flex items-center gap-6\">\n <nav class=\"flex items-center gap-4 text-sm\">\n <a href=\"/terms/\"\n class=\"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors\">Terms</a>\n <a href=\"/privacy/\"\n class=\"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors\">Privacy Policy</a>\n </nav>\n <button type=\"button\"\n id=\"theme-toggle\"\n class=\"btn btn-rounded-full btn-ghost gap-2 w-22\"\n aria-label=\"Toggle theme\">\n <span id=\"theme-icon\" class=\"text-base size-6\"></span>\n <span id=\"theme-label\">Auto</span>\n </button>\n </div>\n </div>\n</footer>\n\n </div>\n </div>\n </div>\n\n <script>\n document.addEventListener('DOMContentLoaded', () => {\n (document.querySelectorAll('.notification .delete') || []).forEach(($delete) => {\n let $notification = $delete.parentNode;\n $delete.addEventListener('click', () => {\n $notification.parentNode.removeChild($notification);\n });\n });\n });\n</script>\n\n <script>\n function syncDarkMode() {\n const darkTheme = 'dark' || 'dark';\n const lightTheme = 'light' || 'light';\n const autoTheme = 'auto';\n\n const theme = localStorage.getItem('theme') || autoTheme;\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n if (theme === darkTheme || (theme === autoTheme && prefersDark)) {\n document.documentElement.classList.add('dark');\n document.documentElement.setAttribute('data-theme', darkTheme);\n document.cookie = `theme=${darkTheme};path=/;max-age=31536000`;\n } else {\n document.documentElement.classList.remove('dark');\n document.documentElement.setAttribute('data-theme', lightTheme);\n document.cookie = `theme=${lightTheme};path=/;max-age=31536000`;\n }\n }\n\n function getCurrentTheme() {\n return localStorage.getItem('theme') || 'auto';\n }\n\n function setTheme(theme) {\n localStorage.setItem('theme', theme);\n syncDarkMode();\n updateThemeButton();\n window.dispatchEvent(new Event('storage'));\n }\n\n function cycleTheme() {\n const current = getCurrentTheme();\n const themes = ['light', 'dark', 'auto'];\n const currentIndex = themes.indexOf(current);\n const nextIndex = (currentIndex + 1) % themes.length;\n setTheme(themes[nextIndex]);\n }\n\n function updateThemeButton() {\n const theme = getCurrentTheme();\n const icon = document.getElementById('theme-icon');\n const label = document.getElementById('theme-label');\n\n if (!icon || !label) return;\n\n if (theme === 'light') {\n icon.textContent = '\u2600\ufe0f';\n label.textContent = 'Light';\n } else if (theme === 'dark') {\n icon.textContent = '\ud83c\udf19';\n label.textContent = 'Dark';\n } else {\n icon.textContent = '\ud83d\udcbb';\n label.textContent = 'Auto';\n }\n }\n\n syncDarkMode();\n\n document.addEventListener('DOMContentLoaded', () => {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', () => {\n syncDarkMode();\n updateThemeButton();\n });\n\n window.addEventListener('storage', (event) => {\n if (event.key === 'theme') {\n syncDarkMode();\n updateThemeButton();\n }\n });\n\n updateThemeButton();\n\n const themeToggle = document.getElementById('theme-toggle');\n if (themeToggle) {\n themeToggle.addEventListener('click', cycleTheme);\n }\n\n const mobileMenu = document.getElementById(\"mobile-menu\");\n if (mobileMenu) {\n document.addEventListener(\"click\", function(event) {\n const menuButton = event.target.closest(\"button[onclick='toggleMobileMenu()']\");\n if (!mobileMenu.classList.contains(\"hidden\") && !mobileMenu.contains(event.target) && !menuButton) {\n mobileMenu.classList.add(\"hidden\");\n }\n });\n }\n });\n\n function toggleMobileMenu() {\n const menu = document.getElementById(\"mobile-menu\");\n if (menu) menu.classList.toggle(\"hidden\");\n }\n\n function closeMobileMenu() {\n const menu = document.getElementById(\"mobile-menu\");\n if (menu) menu.classList.add(\"hidden\");\n }\n </script>\n \n \n </body>\n</html>\n",
"cookies": null,
"errors": null,
"final_url": "https://www.scraperouter.com/",
"headers": {
"alt-svc": "h3=\":443\"; ma=2592000",
"content-language": "en",
"content-length": "39758",
"content-type": "text/html; charset=utf-8",
"cross-origin-opener-policy": "same-origin",
"date": "Tue, 17 Mar 2026 12:44:16 GMT",
"referrer-policy": "same-origin",
"server": "gunicorn",
"set-cookie": "scraperouter_language=en; Path=/, csrftoken=ZBqluTct78nnzVIeWIJzUDJFY5gVriJR; expires=Tue, 16 Mar 2027 12:44:16 GMT; Max-Age=31449600; Path=/; SameSite=Lax; Secure",
"strict-transport-security": "max-age=60; includeSubDomains; preload",
"vary": "Cookie, Accept-Language, origin",
"via": "1.1 Caddy",
"x-content-type-options": "nosniff",
"x-frame-options": "DENY"
},
"id": null,
"scraper_data": null,
"scraperouter": null,
"screenshot_url": null,
"status_code": 200
}
Page Title
Unified Web Scraping API | ScrapeRouter
[ ScrapeRouter ScrapeRouter ](/)
Open main menu __
[Free Check](/check/?src=navbar) [Scrapers](/scrapers/) [Pricing](/#pricing)
[Docs](/docs/quickstart/)
[Sign in](/accounts/login/) [Sign up](/accounts/signup/)
Close menu __
[Free Check](/check/?src=navbar_mobile) [Scrapers](/scrapers/)
[Pricing](/#pricing) [Docs](/docs/quickstart/) [Sign in](/accounts/login/)
[Sign up](/accounts/signup/)
# The Unified Interface
For Scraping
One API for all your web scraping needs. Choose the optimal scraping method
for a given request.
[ Start scraping for free __](/accounts/signup/) [ __Read the
Docs](/docs/quickstart/)
Get $5 free credits to start in 60 seconds. No credit card required.
__
## Run a free URL check
Analyze scraping viability with a preconfigured datacenter matrix and advanced
bypass routing.
Run free check Running...
Intelligent Routing
## How It Works
Get started in minutes.
[ __ Sign up Create an account to get started. ](/accounts/signup/)
__
__
__
### Get free credits
Credits work with any scraper or proxy.
__
__
__
### Get your API key
Create an API key and start making requests.
__
__
__
### Scrape
Consistent schema and optimized cost.
## Developer First Features
__
### Unified Schema
Receive the same JSON response regardless of which provider fulfilled it.
__
### Many Scrapers
Use multiple scraping providers and libraries through a single integration.
__
### Smart Routing
We route to the best provider for each domain and automatically retry with the
next best option if it fails.
__
### Cost Optimization
Attempt requests via the cheapest provider first, escalating to premium only
if necessary.
## Quick Start
One request is all it takes.
cURL Python JavaScript
#!/usr/bin/env bash
curl -X POST https://www.scraperouter.com/api/v1/scrape/ \
-H "Authorization: Api-Key {your_api_key}" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"scraper": "auto"
}'
import requests
response = requests.post(
"https://www.scraperouter.com/api/v1/scrape/",
headers={"Authorization": "Api-Key {your_api_key}"},
json={
"url": "https://example.com",
"scraper": "auto",
},
)
print(response.json())
const response = await fetch("https://www.scraperouter.com/api/v1/scrape/", {
method: "POST",
headers: {
"Authorization": "Api-Key {you
Response Headers
{
"alt-svc": "h3=\":443\"; ma=2592000",
"content-language": "en",
"content-length": "39758",
"content-type": "text/html; charset=utf-8",
"cross-origin-opener-policy": "same-origin",
"date": "Tue, 17 Mar 2026 12:44:17 GMT",
"referrer-policy": "same-origin",
"server": "gunicorn",
"set-cookie": "scraperouter_language=en; Path=/\ncsrftoken=1YTEo8TTR32lUeEQWCzhpyHiQZ402c6J; expires=Tue, 16 Mar 2027 12:44:17 GMT; Max-Age=31449600; Path=/; SameSite=Lax; Secure",
"strict-transport-security": "max-age=60; includeSubDomains; preload",
"vary": "Cookie, Accept-Language, origin",
"via": "1.1 Caddy",
"x-content-type-options": "nosniff",
"x-frame-options": "DENY"
}
Request Options
{
"proxy": {
"type": "datacenter"
},
"scraper_options": {
"network_requests": true
},
"screenshot": true,
"url": "https://www.scraperouter.com/"
}
27 requests captured
| Method | URL | Status | Type | Time |
|---|---|---|---|---|
| GET |
https://www.scraperouter.com/
|
200 | document | 1.35s |
| GET |
https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap
3rd-party
|
200 | css | 0.60s |
| GET |
https://static.scraperouter.com/css/site-base.css
3rd-party
|
200 | css | 0.64s |
| GET |
https://static.scraperouter.com/js/site-base-bundle.js
3rd-party
|
200 | script | 0.65s |
| GET |
https://static.scraperouter.com/css/site-tailwind.css
3rd-party
|
200 | css | 0.29s |
| GET |
https://static.scraperouter.com/js/site-tailwind-bundle.js
3rd-party
|
200 | script | 0.18s |
| GET |
https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/regular/style.css
3rd-party
|
200 | css | 0.68s |
| GET |
https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/fill/style.css
3rd-party
|
200 | css | 0.24s |
| GET |
https://static.scraperouter.com/js/site-bundle.js
3rd-party
|
200 | script | 0.41s |
| GET |
https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css
3rd-party
|
200 | css | 0.69s |
| GET |
https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js
3rd-party
|
200 | script | 0.23s |
| GET |
https://static.scraperouter.com/images/logo.svg
3rd-party
|
200 | image | 0.18s |
| GET |
https://www.googletagmanager.com/gtag/js?id=G-CXJH3FN9J2
3rd-party
|
200 | script | 1.58s |
| GET |
https://www.scraperouter.com/jsi18n/
|
200 | script | 0.86s |
| GET |
https://challenges.cloudflare.com/turnstile/v0/g/ea2d291c0fdc/api.js
3rd-party
|
302 | script | 1.22s |
| GET |
https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2
3rd-party
|
— | font | 0.84s |
| GET |
https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/regular/Phosphor.woff2
3rd-party
|
— | font | 0.38s |
| GET |
https://eu-assets.i.posthog.com/array/phc_KmlqvqSPkHg5dYGYaEgmiti1HNDezB2cwZil9TWyn3T/config.js
3rd-party
|
200 | script | 0.76s |
| GET |
https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2
3rd-party
|
— | font | 0.23s |
| GET |
https://challenges.cloudflare.com/turnstile/v0/g/ea2d291c0fdc/api.js
3rd-party
|
200 | script | 0.23s |
| GET |
https://challenges.cloudflare.com/cdn-cgi/challenge-platform/h/g/turnstile/f/ov2/av0/rch/4m35b/0x4AAAAAAB3BcyrO00rWKcD1/auto/fbE/new/normal?lang=auto
3rd-party
|
200 | document | 0.24s |
| GET |
https://eu-assets.i.posthog.com/static/posthog-recorder.js?v=1.360.2
3rd-party
|
— | other | 0.00s |
| GET |
https://eu-assets.i.posthog.com/static/surveys.js?v=1.360.2
3rd-party
|
— | other | 0.00s |
| GET |
https://eu-assets.i.posthog.com/static/dead-clicks-autocapture.js?v=1.360.2
3rd-party
|
— | other | 0.00s |
| GET |
https://eu-assets.i.posthog.com/static/web-vitals.js?v=1.360.2
3rd-party
|
— | other | 0.00s |
| GET |
https://challenges.cloudflare.com/cdn-cgi/challenge-platform/h/g/cmg/1
3rd-party
|
— | other | 0.00s |
| POST |
https://www.google-analytics.com/g/collect?v=2&tid=G-CXJH3FN9J2>m=45je63d1v9246474823za200zd9246474823&_p=1773751458130&gcd=13l3l3l3l1l1&npa=0&dma=0&cid=987841389.1773751459&ul=en-us&sr=1280x720&uaa=x86&uab=64&uafvl=Not%253AA-Brand%3B99.0.0.0%7CHeadlessChrome%3B145.0.7632.6%7CChromium%3B145.0.7632.6&uamb=0&uam=&uap=Linux&uapv=&uaw=0&are=1&frm=0&pscdl=noapi&_s=1&tag_exp=103116026~103200004~115938465~115938468~116024733~117484252&sid=1773751458&sct=1&seg=0&dl=https%3A%2F%2Fwww.scraperouter.com%2F&dt=Unified%20Web%20Scraping%20API%20%7C%20ScrapeRouter&en=page_view&_fv=1&_nsi=1&_ss=1&_ee=1&tfd=2502
3rd-party
|
— | other | 0.00s |
Detections
Structured Metadata
Open Graph
[
{
"namespace": {
"og": "http://ogp.me/ns#"
},
"properties": [
[
"og:title",
"Unified Web Scraping API | ScrapeRouter"
],
[
"og:type",
"website"
],
[
"og:url",
"https://www.scraperouter.com/"
],
[
"og:image",
"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png"
],
[
"og:description",
"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers."
],
[
"og:site_name",
"ScrapeRouter"
]
]
}
]
JSON-LD
[
{
"@context": "https://schema.org",
"@type": "Organization",
"contactPoint": [
{
"@type": "ContactPoint",
"contactType": "customer support",
"email": "contact@scraperouter.com"
}
],
"email": "contact@scraperouter.com",
"logo": "https://static.scraperouter.com/images/logo_white_padding.png",
"name": "ScrapeRouter",
"sameAs": [
"https://x.com/ScrapeRouter",
"https://www.reddit.com/user/scraperouter-com/"
],
"url": "https://www.scraperouter.com"
},
{
"@context": "https://schema.org",
"@type": "WebPage",
"description": "One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.",
"image": "https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png",
"isPartOf": {
"@type": "WebSite",
"name": "ScrapeRouter",
"url": "https://www.scraperouter.com"
},
"name": "Unified Web Scraping API | ScrapeRouter",
"url": "https://www.scraperouter.com/"
}
]
Microformat
[
{
"lang": "en",
"properties": {
"name": [
"SCRAPERS PROXIES Request Playwright cURL & more Datacenter Residential & more Scrape API provider Success"
]
},
"type": [
"h-auto"
]
}
]
Scraper Response Data
Response payload
{
"content": "<!DOCTYPE html><html lang=\"en\" data-theme=\"light\"><head>\n <meta charset=\"utf-8\">\n <!--IE compatibility-->\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <!--Mobile friendly-->\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n \n \n \n \n \n \n <title>\n \n Unified Web Scraping API | ScrapeRouter\n \n </title>\n <meta name=\"description\" content=\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\">\n <meta name=\"keywords\" content=\"scraping, intelligence\">\n <!-- Twitter Card data -->\n <meta name=\"twitter:card\" content=\"summary_large_image\">\n <meta name=\"twitter:title\" content=\"Unified Web Scraping API | ScrapeRouter\">\n <meta name=\"twitter:description\" content=\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\">\n <meta name=\"twitter:image\" content=\"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png\">\n <!-- Open Graph data -->\n <meta property=\"og:title\" content=\"Unified Web Scraping API | ScrapeRouter\">\n <meta property=\"og:type\" content=\"website\">\n <meta property=\"og:url\" content=\"https://www.scraperouter.com/\">\n <meta property=\"og:image\" content=\"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png\">\n <meta property=\"og:description\" content=\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\">\n <meta property=\"og:site_name\" content=\"ScrapeRouter\">\n <meta name=\"robots\" content=\"index,follow\">\n <link rel=\"canonical\" href=\"https://www.scraperouter.com/\">\n \n \n \n \n \n \n<link rel=\"icon\" type=\"image/svg+xml\" href=\"https://static.scraperouter.com/images/favicons/favicon.svg\">\n\n <!-- Roboto Font -->\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin=\"\">\n <link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap\" rel=\"stylesheet\">\n <style>\n /* Hide Alpine.js elements until initialized */\n [x-cloak] { display: none !important; }\n </style>\n \n <!-- Vite HMR client must load first for proper CSS injection -->\n \n <link rel=\"stylesheet\" href=\"https://static.scraperouter.com/css/site-base.css\">\n<script type=\"module\" crossorigin=\"\" src=\"https://static.scraperouter.com/js/site-base-bundle.js\"></script>\n <link rel=\"stylesheet\" href=\"https://static.scraperouter.com/css/site-tailwind.css\">\n<script type=\"module\" crossorigin=\"\" src=\"https://static.scraperouter.com/js/site-tailwind-bundle.js\"></script>\n <!-- Phosphor Icons (https://phosphoricons.com) -->\n <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/regular/style.css\" crossorigin=\"anonymous\">\n <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/fill/style.css\" crossorigin=\"anonymous\">\n \n <!-- Google tag (gtag.js) -->\n<script async=\"\" src=\"https://www.googletagmanager.com/gtag/js?id=G-CXJH3FN9J2\"></script>\n<script>\n window.dataLayer = window.dataLayer || [];\n function gtag() { dataLayer.push(arguments); }\n gtag(\"js\", new Date());\n\n gtag(\"config\", \"G-CXJH3FN9J2\");\n</script>\n\n \n \n <script>\n window.posthogConfig = {\n apiKey: \"phc_KmlqvqSPkHg5dYGYaEgmiti1HNDezB2cwZil9TWyn3T\",\n host: \"https://eu.i.posthog.com\",\n };\n</script>\n\n \n <script type=\"module\" crossorigin=\"\" src=\"https://static.scraperouter.com/js/site-bundle.js\"></script>\n <script>__cssFramework = 'tailwind';</script>\n <script src=\"/jsi18n/\" defer=\"\"></script>\n \n <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css\">\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js\"></script>\n<style>\npre code.hljs {\n border-radius: 0.5rem;\n font-size: 0.8125rem;\n line-height: 1.625;\n}\n.code-tabs pre code.hljs {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n</style>\n\n \n <script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js\" async=\"\" defer=\"\"></script>\n \n\n <script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"ScrapeRouter\",\"url\":\"https://www.scraperouter.com\",\"logo\":\"https://static.scraperouter.com/images/logo_white_padding.png\",\"email\":\"contact@scraperouter.com\",\"sameAs\":[\"https://x.com/ScrapeRouter\",\"https://www.reddit.com/user/scraperouter-com/\"],\"contactPoint\":[{\"@type\":\"ContactPoint\",\"email\":\"contact@scraperouter.com\",\"contactType\":\"customer support\"}]}</script>\n<script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebPage\",\"name\":\"Unified Web Scraping API | ScrapeRouter\",\"description\":\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\",\"url\":\"https://www.scraperouter.com/\",\"image\":\"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png\",\"isPartOf\":{\"@type\":\"WebSite\",\"name\":\"ScrapeRouter\",\"url\":\"https://www.scraperouter.com\"}}</script>\n </head>\n <body hx-headers=\"{"X-CSRFToken": "aJsXjwuNYxMJtyqV23UN6e4A1HU9o1sv1xbrxudwFqEUdCUBOvjUlCBIHwOZg3o4"}\" class=\"vite-loaded\">\n \n <div class=\"min-h-screen dark:bg-gray-900 flex flex-col\">\n <header class=\"sticky top-0 z-50 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800\">\n \n<nav aria-label=\"Global\" class=\"mx-auto max-w-7xl w-full flex items-center justify-between px-4 sm:px-6 lg:px-0 py-4 sm:py-6\">\n <div class=\"flex lg:flex-1\">\n <a href=\"/\" class=\"-m-1.5 p-1.5 flex items-center gap-x-2\">\n <div class=\"size-5 object-cover\">\n <img src=\"https://static.scraperouter.com/images/logo.svg\" alt=\"ScrapeRouter\" class=\"h-5 dark:invert\">\n </div>\n <span class=\"sr-only\">ScrapeRouter</span>\n <span class=\"text-lg font-bold text-black dark:text-white\">ScrapeRouter</span>\n </a>\n </div>\n <div class=\"flex lg:hidden\">\n <button type=\"button\" class=\"-m-2.5 inline-flex cursor-pointer items-center justify-center rounded-md p-2.5 text-gray-800 dark:text-gray-200\" onclick=\"toggleMobileMenu()\">\n <span class=\"sr-only\">Open main menu</span>\n <i class=\"ph ph-list text-xl\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"hidden lg:flex lg:gap-x-8 lg:items-center\">\n <a href=\"/check/?src=navbar\" class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Free Check</a>\n <a href=\"/scrapers/\" class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Scrapers</a>\n <a href=\"/#pricing\" class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Pricing</a>\n <a href=\"/docs/quickstart/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Docs</a>\n \n <div class=\"flex items-center gap-2\">\n <a href=\"/accounts/login/\" class=\"btn btn-rounded-full btn-ghost\">Sign in</a>\n <a href=\"/accounts/signup/\" class=\"btn btn-rounded-full btn-primary\">Sign up</a>\n </div>\n \n </div>\n</nav>\n<!-- Mobile menu -->\n<div id=\"mobile-menu\" class=\"hidden lg:hidden\">\n <div id=\"mobile-menu-backdrop\" class=\"fixed inset-0 z-50\" onclick=\"closeMobileMenu()\">\n <div class=\"fixed inset-y-0 right-0 z-50 w-full overflow-y-auto bg-white p-4 sm:max-w-sm sm:p-6 sm:ring-1 sm:ring-gray-900/10 dark:bg-gray-900 dark:sm:ring-gray-100/10\" onclick=\"event.stopPropagation()\">\n <div class=\"flex items-center justify-between\">\n <button type=\"button\" class=\"-m-2.5 rounded-md p-2.5 text-gray-800 dark:text-gray-200 cursor-pointer\" onclick=\"toggleMobileMenu()\">\n <span class=\"sr-only\">Close menu</span>\n <i class=\"ph ph-x text-xl\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"mt-6 flow-root\">\n <div class=\"-my-6 divide-y divide-gray-500/10 dark:divide-white/10\">\n <div class=\"space-y-2 py-6\">\n <a href=\"/check/?src=navbar_mobile\" onclick=\"toggleMobileMenu()\" class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Free Check</a>\n <a href=\"/scrapers/\" onclick=\"toggleMobileMenu()\" class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Scrapers</a>\n <a href=\"/#pricing\" onclick=\"toggleMobileMenu()\" class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Pricing</a>\n <a href=\"/docs/quickstart/\" target=\"_blank\" rel=\"noopener noreferrer\" onclick=\"toggleMobileMenu()\" class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Docs</a>\n \n <a href=\"/accounts/login/\" onclick=\"toggleMobileMenu()\" class=\"btn btn-rounded-full btn-ghost\">Sign in</a>\n <a href=\"/accounts/signup/\" onclick=\"toggleMobileMenu()\" class=\"btn btn-rounded-full btn-primary\">Sign up</a>\n \n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n </header>\n <div class=\"relative isolate px-0 lg:px-8 flex-1\">\n \n <!-- Hero Section -->\n <section class=\"w-full\">\n <div class=\"mx-auto max-w-7xl px-4 pt-24 lg:pt-32 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-4xl text-center\">\n <h1 class=\"text-5xl font-extrabold tracking-tight text-gray-900 dark:text-white\">\n The Unified Interface\n <br>\n <span class=\"text-primary/90\">For Scraping</span>\n </h1>\n <p class=\"mt-6 text-lg text-gray-500 dark:text-gray-400 max-w-2xl mx-auto\">\n <span class=\"text-primary/90 font-semibold\">One API</span> for all your web scraping needs. Choose the optimal scraping method for a given request.\n </p>\n <div class=\"mt-10 flex flex-col items-center gap-4\">\n <div class=\"flex flex-col items-center gap-3 sm:flex-row sm:flex-wrap sm:justify-center\">\n <a href=\"/accounts/signup/\" class=\"btn btn-rounded-full btn-primary px-8\">\n Start scraping for free\n <i class=\"ph ph-arrow-right ml-2\" aria-hidden=\"true\"></i>\n </a>\n <a href=\"/docs/quickstart/\" target=\"_blank\" class=\"btn btn-rounded-full btn-ghost px-8\">\n <i class=\"ph ph-code mr-2\" aria-hidden=\"true\"></i>\n Read the Docs\n </a>\n </div>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Get <span class=\"font-semibold text-gray-900 dark:text-white\">$5 free credits</span> to start in 60 seconds. No credit card required.\n </p>\n </div>\n </div>\n </div>\n </section>\n <!-- Free URL Check -->\n <section class=\"w-full\">\n <div class=\"mx-auto max-w-7xl px-4 pt-12 pb-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-2xl rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 p-6 text-left\">\n <div class=\"flex items-center gap-2 mb-1\">\n <i class=\"ph ph-shield-check text-xl text-primary/90\" aria-hidden=\"true\"></i>\n <h2 class=\"text-sm font-semibold uppercase tracking-wide text-gray-900 dark:text-white\">Run a free URL check</h2>\n </div>\n <p class=\"mt-1 text-sm text-gray-600 dark:text-gray-400\">\n Analyze scraping viability with a preconfigured datacenter matrix and advanced bypass routing.\n </p>\n <form id=\"public-check-form\" method=\"post\" action=\"/checks/public/create/\" class=\"mt-4 space-y-3\" data-public-check-form=\"true\" data-track-submit-event=\"check_submit\" data-public-check-bound=\"true\" data-public-check-submitting=\"false\">\n <input type=\"hidden\" name=\"csrfmiddlewaretoken\" value=\"aJsXjwuNYxMJtyqV23UN6e4A1HU9o1sv1xbrxudwFqEUdCUBOvjUlCBIHwOZg3o4\" style=\"\">\n <input type=\"hidden\" name=\"next\" value=\"/\" style=\"\">\n <div class=\"flex flex-col sm:flex-row\">\n <div class=\"relative w-full\">\n <input type=\"url\" name=\"url\" required=\"\" placeholder=\"https://example.com\" class=\"input w-full pl-9 rounded-b-none! sm:rounded-b-md! sm:rounded-r-none!\" id=\"public-check-url\" style=\"\">\n </div>\n <button type=\"submit\" id=\"public-check-submit\" aria-busy=\"false\" class=\"btn -mt-[1px] sm:mt-0 sm:-ml-[1px] z-10 btn-rounded-md rounded-t-none! sm:rounded-t-md! sm:rounded-l-none! btn-outline whitespace-nowrap\">\n <span data-button-idle=\"\">Run free check</span>\n <span data-button-loading=\"\" class=\"hidden items-center gap-2\">\n <svg class=\"size-4 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"3\"></circle>\n <path d=\"M21 12a9 9 0 0 0-9-9\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\"></path>\n</svg>\n\n <span>Running...</span>\n </span>\n </button>\n </div>\n \n <div class=\"w-full flex justify-center\">\n <div class=\"cf-turnstile\" data-sitekey=\"0x4AAAAAAB3BcyrO00rWKcD1\"><div><input type=\"hidden\" name=\"cf-turnstile-response\" id=\"cf-chl-widget-4m35b_response\"></div></div>\n </div>\n \n </form>\n \n </div>\n </div>\n </section>\n <!-- Intelligent Path Selection -->\n <section id=\"path-selection\" class=\"w-full border-b border-gray-200 dark:border-gray-800 hidden md:block scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-4xl py-16\">\n <p class=\"text-xs font-semibold tracking-[0.2em] text-gray-400 dark:text-gray-500 text-center uppercase mb-8\">\n Intelligent Routing\n </p>\n <div id=\"scraping-path-animation\" class=\"w-full mx-auto\"><svg viewBox=\"12 23 1006 439\" class=\"w-full h-auto\" preserveAspectRatio=\"xMidYMid meet\" role=\"img\" aria-label=\"Intelligent routing visualization showing request flowing through scraper and proxy selection to success\">\n <defs>\n <filter id=\"sr-glow\">\n <feGaussianBlur stdDeviation=\"3\" result=\"b\"></feGaussianBlur>\n <feMerge><feMergeNode in=\"b\"></feMergeNode><feMergeNode in=\"SourceGraphic\"></feMergeNode></feMerge>\n </filter>\n </defs>\n\n <g class=\"sr-scene\">\n <!-- Column labels -->\n <text x=\"370\" y=\"62\" text-anchor=\"middle\" class=\"fill-gray-400 dark:fill-gray-600\" style=\"font-size:10px;font-weight:600;letter-spacing:0.15em\">SCRAPERS</text>\n <text x=\"660\" y=\"62\" text-anchor=\"middle\" class=\"fill-gray-400 dark:fill-gray-600\" style=\"font-size:10px;font-weight:600;letter-spacing:0.15em\">PROXIES</text>\n\n <!-- Inactive paths (dashed) -->\n <g class=\"sr-inactive\" opacity=\"0\">\n <path d=\"M 108,200 C 230,200 270,200 348,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 108,200 C 230,200 270,300 348,300\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 392,100 C 500,100 560,100 638,100\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,100 C 500,100 560,200 638,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,100 C 500,100 560,300 638,300\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,200 C 500,200 560,100 638,100\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,200 C 500,200 560,200 638,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,200 C 500,200 560,300 638,300\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,300 C 500,300 560,100 638,100\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,300 C 500,300 560,200 638,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,300 C 500,300 560,300 638,300\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 682,100 C 780,100 880,200 922,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 682,300 C 780,300 880,200 922,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 108,200 C 260,220 380,390 493,390\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 537,390 C 700,390 870,200 922,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n </g>\n\n <!-- Optimal paths (solid, animated) -->\n <path class=\"sr-opt\" d=\"M 108,200 C 230,200 270,100 348,100\" fill=\"none\" stroke=\"var(--color-primary)\" stroke-width=\"2.5\" stroke-opacity=\"0.7\" opacity=\"0\"></path>\n <path class=\"sr-opt\" d=\"M 392,100 C 500,100 560,200 638,200\" fill=\"none\" stroke=\"var(--color-primary)\" stroke-width=\"2.5\" stroke-opacity=\"0.7\" opacity=\"0\"></path>\n <path class=\"sr-opt\" d=\"M 682,200 C 780,200 880,200 922,200\" fill=\"none\" stroke=\"var(--color-primary)\" stroke-width=\"2.5\" stroke-opacity=\"0.7\" opacity=\"0\"></path>\n\n <!-- Request node -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"80\" cy=\"200\" r=\"28\" class=\"fill-white dark:fill-gray-900\" stroke=\"var(--color-primary)\" stroke-width=\"2\" stroke-opacity=\"0.7\"></circle>\n <g transform=\"translate(80,200)\" stroke=\"var(--color-primary)\" stroke-width=\"1.5\" stroke-opacity=\"0.7\" fill=\"none\">\n <circle r=\"10\"></circle>\n <line x1=\"-10\" y1=\"0\" x2=\"10\" y2=\"0\"></line>\n <path d=\"M 0,-10 Q 5,0 0,10\"></path>\n <path d=\"M 0,-10 Q -5,0 0,10\"></path>\n </g>\n <text x=\"80\" y=\"244\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:13px;font-weight:500\">Request</text>\n </g>\n\n <!-- Playwright node (optimal) -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"370\" cy=\"100\" r=\"22\" fill=\"var(--color-primary)\" fill-opacity=\"0.7\"></circle>\n <g transform=\"translate(370,100)\" stroke=\"#fff\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"-8\" y=\"-6\" width=\"16\" height=\"12\" rx=\"2\"></rect>\n <line x1=\"-8\" y1=\"-2\" x2=\"8\" y2=\"-2\"></line>\n <circle cx=\"-5.5\" cy=\"-4\" r=\"0.7\" fill=\"#fff\" stroke=\"none\"></circle>\n <circle cx=\"-3.2\" cy=\"-4\" r=\"0.7\" fill=\"#fff\" stroke=\"none\"></circle>\n <line x1=\"-4\" y1=\"2\" x2=\"4\" y2=\"2\"></line>\n </g>\n <text x=\"370\" y=\"138\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:12px;font-weight:600\">Playwright</text>\n </g>\n\n <!-- cURL node -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"370\" cy=\"200\" r=\"22\" class=\"fill-gray-400 dark:fill-gray-600\"></circle>\n <g transform=\"translate(370,200)\" stroke=\"#fff\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M -5,-6 L -8,0 L -5,6\"></path>\n <path d=\"M 5,-6 L 8,0 L 5,6\"></path>\n </g>\n <text x=\"370\" y=\"238\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:12px\">cURL</text>\n </g>\n\n <!-- More scrapers placeholder -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"370\" cy=\"300\" r=\"22\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"4 3\"></circle>\n <g transform=\"translate(370,300)\" class=\"stroke-gray-400 dark:stroke-gray-500\" stroke-width=\"2\" stroke-linecap=\"round\">\n <line x1=\"0\" y1=\"-6\" x2=\"0\" y2=\"6\"></line>\n <line x1=\"-6\" y1=\"0\" x2=\"6\" y2=\"0\"></line>\n </g>\n <text x=\"370\" y=\"338\" text-anchor=\"middle\" class=\"fill-gray-400 dark:fill-gray-500\" style=\"font-size:11px\">& more</text>\n </g>\n\n <!-- Datacenter proxy node -->\n <g class=\"sr-node\" opacity=\"0\">\n <circle cx=\"660\" cy=\"100\" r=\"22\" class=\"fill-gray-400 dark:fill-gray-600\"></circle>\n <g transform=\"translate(660,100)\" fill=\"none\">\n <rect x=\"-7\" y=\"-7\" width=\"14\" height=\"5\" rx=\"1.5\" stroke=\"#fff\" stroke-width=\"1.5\"></rect>\n <rect x=\"-7\" y=\"1\" width=\"14\" height=\"5\" rx=\"1.5\" stroke=\"#fff\" stroke-width=\"1.5\"></rect>\n <circle cx=\"4\" cy=\"-4.5\" r=\"1\" fill=\"#fff\"></circle>\n <circle cx=\"4\" cy=\"3.5\" r=\"1\" fill=\"#fff\"></circle>\n </g>\n <text x=\"660\" y=\"138\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:12px\">Datacenter</text>\n </g>\n\n <!-- Residential proxy node (optimal) -->\n <g class=\"sr-node\" opacity=\"0\">\n <circle cx=\"660\" cy=\"200\" r=\"22\" fill=\"var(--color-primary)\" fill-opacity=\"0.7\"></circle>\n <g transform=\"translate(660,200)\" stroke=\"#fff\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M 0,-7 L 7,1 L -7,1 Z\"></path>\n <rect x=\"-5\" y=\"1\" width=\"10\" height=\"6\"></rect>\n </g>\n <text x=\"660\" y=\"238\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:12px;font-weight:600\">Residential</text>\n </g>\n\n <!-- More proxies placeholder -->\n <g class=\"sr-node\" opacity=\"0\">\n <circle cx=\"660\" cy=\"300\" r=\"22\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"4 3\"></circle>\n <g transform=\"translate(660,300)\" class=\"stroke-gray-400 dark:stroke-gray-500\" stroke-width=\"2\" stroke-linecap=\"round\">\n <line x1=\"0\" y1=\"-6\" x2=\"0\" y2=\"6\"></line>\n <line x1=\"-6\" y1=\"0\" x2=\"6\" y2=\"0\"></line>\n </g>\n <text x=\"660\" y=\"338\" text-anchor=\"middle\" class=\"fill-gray-400 dark:fill-gray-500\" style=\"font-size:11px\">& more</text>\n </g>\n\n <!-- 3rd Party provider node -->\n <g class=\"sr-node\" opacity=\"0\">\n <circle cx=\"515\" cy=\"390\" r=\"22\" class=\"fill-gray-400 dark:fill-gray-600\"></circle>\n <g transform=\"translate(515,390)\" stroke=\"#fff\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M -1,-1 L -6,-1 L -6,6 L 1,6 L 1,1\"></path>\n <line x1=\"1\" y1=\"-1\" x2=\"6\" y2=\"-6\"></line>\n <polyline points=\"2,-6 6,-6 6,-2\"></polyline>\n </g>\n <text x=\"515\" y=\"428\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:12px\">Scrape API provider</text>\n </g>\n\n <!-- Success node -->\n <g class=\"sr-node\" opacity=\"0\">\n <circle cx=\"950\" cy=\"200\" r=\"28\" class=\"fill-white dark:fill-gray-900\" stroke=\"var(--color-green-700)\" stroke-width=\"2.5\" stroke-opacity=\"0.7\"></circle>\n <g transform=\"translate(950,200)\" stroke=\"var(--color-green-700)\" stroke-width=\"2.5\" stroke-opacity=\"0.7\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M -7,0 L -2,5 L 8,-5\"></path>\n </g>\n <text x=\"950\" y=\"244\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:13px;font-weight:500\">Success</text>\n </g>\n\n </g>\n\n <!-- Traveling dot along optimal path -->\n <circle class=\"sr-dot\" r=\"4\" fill=\"var(--color-primary-400)\" fill-opacity=\"0.7\" opacity=\"0\">\n <animateMotion dur=\"4s\" repeatCount=\"indefinite\" begin=\"indefinite\" path=\"M 80,200 C 230,200 270,100 370,100 C 500,100 560,200 660,200 C 800,200 900,200 950,200\"></animateMotion>\n <animate attributeName=\"r\" values=\"3;5;3\" dur=\"1.5s\" repeatCount=\"indefinite\"></animate>\n </circle>\n </svg></div>\n </div>\n </div>\n </section>\n <!-- How It Works -->\n <section id=\"how-it-works\" class=\"w-full border-b border-gray-200 dark:border-gray-800 scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 py-18 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-5xl\">\n <h2 class=\"text-3xl font-semibold text-center text-gray-900 dark:text-white\">How It Works</h2>\n <p class=\"mt-4 text-center text-lg text-gray-600 dark:text-gray-400\">Get started in minutes.</p>\n <div class=\"mt-16 flex flex-col lg:flex-row items-center justify-center gap-6 lg:gap-0\">\n <!-- Step 1: Sign Up -->\n <a href=\"/accounts/signup/\" class=\"flex flex-col items-center text-center max-w-48 group p-6 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors duration-300\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-user-plus text-2xl \" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2 group-hover:underline\">Sign up</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400 group-hover:underline\">Create an account to get started.</p>\n </a>\n <!-- Arrow 1\u21922 -->\n <div class=\"hidden lg:flex items-center h-12 px-2\">\n <i class=\"ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex lg:hidden items-center justify-center w-full\">\n <i class=\"ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <!-- Step 2: Add Credits -->\n <div class=\"flex flex-col items-center text-center max-w-48\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-coins text-2xl\" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Get free credits</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">Credits work with any scraper or proxy.</p>\n </div>\n <!-- Arrow 2\u21923 -->\n <div class=\"hidden lg:flex items-center h-12 px-2\">\n <i class=\"ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex lg:hidden items-center justify-center w-full\">\n <i class=\"ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <!-- Step 3: Get API Key -->\n <div class=\"flex flex-col items-center text-center max-w-48\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-key text-2xl\" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Get your API key</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">Create an API key and start making requests.</p>\n </div>\n <!-- Arrow 3\u21924 -->\n <div class=\"hidden lg:flex items-center h-12 px-2\">\n <i class=\"ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex lg:hidden items-center justify-center w-full\">\n <i class=\"ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <!-- Step 4: Cost-Effective & Unified Results -->\n <div class=\"flex flex-col items-center text-center max-w-48\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-currency-dollar-simple text-2xl\" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Scrape</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">Consistent schema and optimized cost.</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n <!-- Developer First Features -->\n <section id=\"features\" class=\"w-full border-b border-gray-200 dark:border-gray-800 dark:bg-gray-800/50 scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800 py-18\">\n <div class=\"mx-auto max-w-2xl text-center\">\n <h2 class=\"text-3xl font-semibold text-gray-900 dark:text-white\">Developer First Features</h2>\n </div>\n <div class=\"mt-16 grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-4\">\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-package text-4xl text-gray-700 dark:text-gray-300\" aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Unified Schema</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Receive the same JSON response regardless of which provider fulfilled it.\n </p>\n </div>\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-dots-nine text-4xl text-gray-700 dark:text-gray-300\" aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Many Scrapers</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Use multiple scraping providers and libraries through a single integration.\n </p>\n </div>\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-brain text-4xl text-gray-700 dark:text-gray-300\" aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Smart Routing</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n We route to the best provider for each domain and automatically retry with the next best option if it fails.\n </p>\n </div>\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-currency-dollar text-4xl text-gray-700 dark:text-gray-300\" aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Cost Optimization</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Attempt requests via the cheapest provider first, escalating to premium only if necessary.\n </p>\n </div>\n </div>\n </div>\n </section>\n <!-- Quick Start -->\n <section class=\"w-full border-b border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-7xl px-4 py-18 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-2xl lg:max-w-6xl\">\n <h2 class=\"text-3xl font-semibold text-center text-gray-900 dark:text-white\">Quick Start</h2>\n <p class=\"mt-4 text-center text-lg text-gray-600 dark:text-gray-400\">One request is all it takes.</p>\n <div class=\"mt-12 flex flex-col lg:flex-row lg:items-center lg:justify-center gap-6 lg:gap-4\">\n <div class=\"flex-1 min-w-0\">\n <div x-data=\"{ tab: 'curl' }\" class=\"code-tabs not-prose rounded-lg overflow-hidden\" data-copy-button-added=\"true\">\n \n<div class=\"code-tabs-header flex items-end bg-[#0d1117] rounded-t-lg px-2 pt-2 border-b border-gray-700\">\n \n <button @click=\"tab = 'curl'\" :class=\"tab === 'curl' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'\" class=\"px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px border-b-2 border-blue-400 text-gray-100\">cURL</button>\n \n <button @click=\"tab = 'python'\" :class=\"tab === 'python' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'\" class=\"px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px border-b-2 border-transparent text-gray-500 hover:text-gray-300\">Python</button>\n \n <button @click=\"tab = 'javascript'\" :class=\"tab === 'javascript' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'\" class=\"px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px border-b-2 border-transparent text-gray-500 hover:text-gray-300\">JavaScript</button>\n \n<button type=\"button\" class=\"code-snippet-copy-button code-snippet-copy-button-inline\" title=\"Copy code\" aria-label=\"Copy code\"><i class=\"ph ph-copy\" aria-hidden=\"true\"></i></button></div>\n\n <div class=\"bg-[#0d1117] [&_pre]:m-0 [&_pre]:rounded-none [&_pre]:overflow-x-auto\">\n <div x-show=\"tab === 'curl'\">\n \n<pre class=\"overflow-x-auto\"><code class=\"language-bash hljs\" data-highlighted=\"yes\"><span class=\"hljs-meta\">#!/usr/bin/env bash</span>\ncurl -X POST https://www.scraperouter.com/api/v1/scrape/ \\\n -H <span class=\"hljs-string\">\"Authorization: Api-Key {your_api_key}\"</span> \\\n -H <span class=\"hljs-string\">\"Content-Type: application/json\"</span> \\\n -d <span class=\"hljs-string\">'{\n \"url\": \"https://example.com\",\n \"scraper\": \"auto\"\n}'</span></code></pre>\n\n </div>\n <div x-show=\"tab === 'python'\" style=\"display: none;\">\n \n<pre class=\"overflow-x-auto\"><code class=\"language-python hljs\" data-highlighted=\"yes\"><span class=\"hljs-keyword\">import</span> requests\n\nresponse = requests.post(\n <span class=\"hljs-string\">\"https://www.scraperouter.com/api/v1/scrape/\"</span>,\n headers={<span class=\"hljs-string\">\"Authorization\"</span>: <span class=\"hljs-string\">\"Api-Key {your_api_key}\"</span>},\n json={\n <span class=\"hljs-string\">\"url\"</span>: <span class=\"hljs-string\">\"https://example.com\"</span>,\n <span class=\"hljs-string\">\"scraper\"</span>: <span class=\"hljs-string\">\"auto\"</span>,\n },\n)\n<span class=\"hljs-built_in\">print</span>(response.json())</code></pre>\n\n </div>\n <div x-show=\"tab === 'javascript'\" style=\"display: none;\">\n \n<pre class=\"overflow-x-auto\"><code class=\"language-javascript hljs\" data-highlighted=\"yes\"><span class=\"hljs-keyword\">const</span> response = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-title function_\">fetch</span>(<span class=\"hljs-string\">\"https://www.scraperouter.com/api/v1/scrape/\"</span>, {\n <span class=\"hljs-attr\">method</span>: <span class=\"hljs-string\">\"POST\"</span>,\n <span class=\"hljs-attr\">headers</span>: {\n <span class=\"hljs-string\">\"Authorization\"</span>: <span class=\"hljs-string\">\"Api-Key {your_api_key}\"</span>,\n <span class=\"hljs-string\">\"Content-Type\"</span>: <span class=\"hljs-string\">\"application/json\"</span>,\n },\n <span class=\"hljs-attr\">body</span>: <span class=\"hljs-title class_\">JSON</span>.<span class=\"hljs-title function_\">stringify</span>({\n <span class=\"hljs-attr\">url</span>: <span class=\"hljs-string\">\"https://example.com\"</span>,\n <span class=\"hljs-attr\">scraper</span>: <span class=\"hljs-string\">\"auto\"</span>,\n }),\n});\n\n<span class=\"hljs-keyword\">const</span> data = <span class=\"hljs-keyword\">await</span> response.<span class=\"hljs-title function_\">json</span>();\n<span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">log</span>(data);</code></pre>\n\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-shrink-0 items-center justify-center px-2 w-full lg:w-auto\">\n <i class=\"hidden lg:flex ph ph-arrow-right text-3xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n <i class=\"lg:hidden ph ph-arrow-down text-3xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex-1 min-w-0\">\n <div class=\"rounded-lg overflow-hidden border bg-[#0d1117] [&_pre]:m-0 [&_pre]:rounded-none [&_pre]:overflow-x-auto\">\n \n<pre class=\"overflow-x-auto code-snippet-copy-ready\" data-copy-button-added=\"true\"><code class=\"language-json hljs\" data-highlighted=\"yes\"><span class=\"hljs-punctuation\">{</span>\n <span class=\"hljs-attr\">\"id\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">\"550e8400-e29b-41d4-a716-446655440000\"</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">\"status_code\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-number\">200</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">\"url\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">\"https://example.com\"</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">\"content\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">\"<!doctype html>...\"</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">\"headers\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n <span class=\"hljs-attr\">\"content-type\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">\"text/html; charset=UTF-8\"</span>\n <span class=\"hljs-punctuation\">}</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">\"scraper\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">\"apiritif/requests:2.32\"</span>\n<span class=\"hljs-punctuation\">}</span></code><button type=\"button\" class=\"code-snippet-copy-button\" title=\"Copy code\" aria-label=\"Copy code\"><i class=\"ph ph-copy\" aria-hidden=\"true\"></i></button></pre>\n\n </div>\n </div>\n </div>\n <p class=\"mt-20 text-center text-sm text-gray-600 dark:text-gray-400\">\n Want to learn more?\n <a href=\"/docs/quickstart/\" class=\"text-primary-700/90 dark:text-primary-400/90 hover:underline font-medium\">Read the documentation</a>\n </p>\n </div>\n </div>\n </section>\n <!-- Simple Pricing -->\n <section class=\"w-full dark:bg-gray-800/50 scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800 pt-18 pb-40\">\n <div id=\"pricing\" class=\"mx-auto bg-white dark:bg-gray-900 border border-gray-300 dark:border-gray-700 p-6 sm:p-8 rounded-3xl max-w-xl text-center\">\n <h2 class=\"text-3xl font-semibold text-gray-900 dark:text-white\">Simple Pricing</h2>\n <div class=\"mt-8\">\n <div class=\"text-5xl font-semibold text-gray-900 dark:text-white\">$0</div>\n <div class=\"text-lg text-gray-600 dark:text-gray-400 mt-2\">/ month</div>\n </div>\n <p class=\"mt-4 text-base text-gray-600 dark:text-gray-400\">\n Pay-as-you-go. See\n <a href=\"/scrapers/\" class=\"text-primary-700/90 dark:text-primary-400/90 hover:underline font-medium\">detailed per-request pricing</a>\n for each scraper.\n </p>\n <ul class=\"mt-8 space-y-3 text-left max-w-md mx-auto\">\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\" aria-hidden=\"true\"></i>\n <span>No minimums</span>\n </li>\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\" aria-hidden=\"true\"></i>\n <span>No subscriptions</span>\n </li>\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\" aria-hidden=\"true\"></i>\n <span>One consolidated bill</span>\n </li>\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\" aria-hidden=\"true\"></i>\n <span>Real-time cost tracking</span>\n </li>\n </ul>\n <a href=\"/accounts/signup/\" class=\"btn btn-rounded-full btn-primary mt-8\">Sign up</a>\n </div>\n </div>\n </section>\n <script>\n document.querySelectorAll('a[href^=\"#\"]').forEach(anchor => {\n anchor.addEventListener('click', function (e) {\n const href = this.getAttribute('href');\n if (href !== '#' && href.startsWith('#')) {\n e.preventDefault();\n const target = document.querySelector(href);\n if (target) {\n target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }\n });\n });\n if (typeof hljs !== 'undefined') {\n hljs.highlightAll();\n }\n </script>\n\n </div>\n <div class=\"bg-gray-50 dark:bg-gray-900\">\n <div class=\"border-x border-gray-200 dark:border-gray-800 max-w-7xl mx-auto\">\n <footer class=\"mx-auto w-full px-4 sm:px-6 py-6 lg:px-8\">\n <div class=\"flex flex-col sm:flex-row items-center justify-between gap-4\">\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n \u00a9 2026\n <a href=\"/\" class=\"hover:text-gray-900 dark:hover:text-white transition-colors\">ScrapeRouter</a>. All rights reserved.\n </p>\n <div class=\"flex items-center gap-6\">\n <nav class=\"flex items-center gap-4 text-sm\">\n <a href=\"/terms/\" class=\"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors\">Terms</a>\n <a href=\"/privacy/\" class=\"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors\">Privacy Policy</a>\n </nav>\n <button type=\"button\" id=\"theme-toggle\" class=\"btn btn-rounded-full btn-ghost gap-2 w-22\" aria-label=\"Toggle theme\">\n <span id=\"theme-icon\" class=\"text-base size-6\">\ud83d\udcbb</span>\n <span id=\"theme-label\">Auto</span>\n </button>\n </div>\n </div>\n</footer>\n\n </div>\n </div>\n </div>\n\n <script type=\"text/javascript\" crossorigin=\"anonymous\" src=\"https://eu-assets.i.posthog.com/static/web-vitals.js?v=1.360.2\"></script><script type=\"text/javascript\" crossorigin=\"anonymous\" src=\"https://eu-assets.i.posthog.com/static/dead-clicks-autocapture.js?v=1.360.2\"></script><script type=\"text/javascript\" crossorigin=\"anonymous\" src=\"https://eu-assets.i.posthog.com/static/surveys.js?v=1.360.2\"></script><script type=\"text/javascript\" crossorigin=\"anonymous\" src=\"https://eu-assets.i.posthog.com/static/posthog-recorder.js?v=1.360.2\"></script><script type=\"text/javascript\" crossorigin=\"anonymous\" src=\"https://eu-assets.i.posthog.com/array/phc_KmlqvqSPkHg5dYGYaEgmiti1HNDezB2cwZil9TWyn3T/config.js\"></script><script>\n document.addEventListener('DOMContentLoaded', () => {\n (document.querySelectorAll('.notification .delete') || []).forEach(($delete) => {\n let $notification = $delete.parentNode;\n $delete.addEventListener('click', () => {\n $notification.parentNode.removeChild($notification);\n });\n });\n });\n</script>\n\n <script>\n function syncDarkMode() {\n const darkTheme = 'dark' || 'dark';\n const lightTheme = 'light' || 'light';\n const autoTheme = 'auto';\n\n const theme = localStorage.getItem('theme') || autoTheme;\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n if (theme === darkTheme || (theme === autoTheme && prefersDark)) {\n document.documentElement.classList.add('dark');\n document.documentElement.setAttribute('data-theme', darkTheme);\n document.cookie = `theme=${darkTheme};path=/;max-age=31536000`;\n } else {\n document.documentElement.classList.remove('dark');\n document.documentElement.setAttribute('data-theme', lightTheme);\n document.cookie = `theme=${lightTheme};path=/;max-age=31536000`;\n }\n }\n\n function getCurrentTheme() {\n return localStorage.getItem('theme') || 'auto';\n }\n\n function setTheme(theme) {\n localStorage.setItem('theme', theme);\n syncDarkMode();\n updateThemeButton();\n window.dispatchEvent(new Event('storage'));\n }\n\n function cycleTheme() {\n const current = getCurrentTheme();\n const themes = ['light', 'dark', 'auto'];\n const currentIndex = themes.indexOf(current);\n const nextIndex = (currentIndex + 1) % themes.length;\n setTheme(themes[nextIndex]);\n }\n\n function updateThemeButton() {\n const theme = getCurrentTheme();\n const icon = document.getElementById('theme-icon');\n const label = document.getElementById('theme-label');\n\n if (!icon || !label) return;\n\n if (theme === 'light') {\n icon.textContent = '\u2600\ufe0f';\n label.textContent = 'Light';\n } else if (theme === 'dark') {\n icon.textContent = '\ud83c\udf19';\n label.textContent = 'Dark';\n } else {\n icon.textContent = '\ud83d\udcbb';\n label.textContent = 'Auto';\n }\n }\n\n syncDarkMode();\n\n document.addEventListener('DOMContentLoaded', () => {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', () => {\n syncDarkMode();\n updateThemeButton();\n });\n\n window.addEventListener('storage', (event) => {\n if (event.key === 'theme') {\n syncDarkMode();\n updateThemeButton();\n }\n });\n\n updateThemeButton();\n\n const themeToggle = document.getElementById('theme-toggle');\n if (themeToggle) {\n themeToggle.addEventListener('click', cycleTheme);\n }\n\n const mobileMenu = document.getElementById(\"mobile-menu\");\n if (mobileMenu) {\n document.addEventListener(\"click\", function(event) {\n const menuButton = event.target.closest(\"button[onclick='toggleMobileMenu()']\");\n if (!mobileMenu.classList.contains(\"hidden\") && !mobileMenu.contains(event.target) && !menuButton) {\n mobileMenu.classList.add(\"hidden\");\n }\n });\n }\n });\n\n function toggleMobileMenu() {\n const menu = document.getElementById(\"mobile-menu\");\n if (menu) menu.classList.toggle(\"hidden\");\n }\n\n function closeMobileMenu() {\n const menu = document.getElementById(\"mobile-menu\");\n if (menu) menu.classList.add(\"hidden\");\n }\n </script>\n \n \n \n\n</body></html>",
"cookies": null,
"errors": null,
"final_url": "https://www.scraperouter.com/",
"headers": {
"alt-svc": "h3=\":443\"; ma=2592000",
"content-language": "en",
"content-length": "39758",
"content-type": "text/html; charset=utf-8",
"cross-origin-opener-policy": "same-origin",
"date": "Tue, 17 Mar 2026 12:44:17 GMT",
"referrer-policy": "same-origin",
"server": "gunicorn",
"set-cookie": "scraperouter_language=en; Path=/\ncsrftoken=1YTEo8TTR32lUeEQWCzhpyHiQZ402c6J; expires=Tue, 16 Mar 2027 12:44:17 GMT; Max-Age=31449600; Path=/; SameSite=Lax; Secure",
"strict-transport-security": "max-age=60; includeSubDomains; preload",
"vary": "Cookie, Accept-Language, origin",
"via": "1.1 Caddy",
"x-content-type-options": "nosniff",
"x-frame-options": "DENY"
},
"id": null,
"scraper_data": null,
"scraperouter": null,
"screenshot_url": null,
"status_code": 200
}
Page Title
Unified Web Scraping API | ScrapeRouter
[ ScrapeRouter ScrapeRouter ](/)
Open main menu __
[Free Check](/check/?src=navbar) [Scrapers](/scrapers/) [Pricing](/#pricing)
[Docs](/docs/quickstart/)
[Sign in](/accounts/login/) [Sign up](/accounts/signup/)
Close menu __
[Free Check](/check/?src=navbar_mobile) [Scrapers](/scrapers/)
[Pricing](/#pricing) [Docs](/docs/quickstart/) [Sign in](/accounts/login/)
[Sign up](/accounts/signup/)
# The Unified Interface
For Scraping
One API for all your web scraping needs. Choose the optimal scraping method
for a given request.
[ Start scraping for free __](/accounts/signup/) [ __Read the
Docs](/docs/quickstart/)
Get $5 free credits to start in 60 seconds. No credit card required.
__
## Run a free URL check
Analyze scraping viability with a preconfigured datacenter matrix and advanced
bypass routing.
Run free check Running...
Intelligent Routing
SCRAPERS PROXIES Request Playwright cURL & more Datacenter Residential & more
Scrape API provider Success
## How It Works
Get started in minutes.
[ __ Sign up Create an account to get started. ](/accounts/signup/)
__
__
__
### Get free credits
Credits work with any scraper or proxy.
__
__
__
### Get your API key
Create an API key and start making requests.
__
__
__
### Scrape
Consistent schema and optimized cost.
## Developer First Features
__
### Unified Schema
Receive the same JSON response regardless of which provider fulfilled it.
__
### Many Scrapers
Use multiple scraping providers and libraries through a single integration.
__
### Smart Routing
We route to the best provider for each domain and automatically retry with the
next best option if it fails.
__
### Cost Optimization
Attempt requests via the cheapest provider first, escalating to premium only
if necessary.
## Quick Start
One request is all it takes.
cURL Python JavaScript __
#!/usr/bin/env bash
curl -X POST https://www.scraperouter.com/api/v1/scrape/ \
-H "Authorization: Api-Key {your_api_key}" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"scraper": "auto"
}'
import requests
response = requests.post(
"https://www.scraperouter.com/api/v1/scrape/",
headers={"Authorization": "Api-Key {your_api_key}"},
json={
"url": "https://example.com",
"scraper": "auto",
},
)
print(response.json())
const response = await fetch("https://www.scr
Response Headers
{
"alt-svc": "h3=\":443\"; ma=2592000",
"content-language": "en",
"content-length": "39758",
"content-type": "text/html; charset=utf-8",
"cross-origin-opener-policy": "same-origin",
"date": "Tue, 17 Mar 2026 12:44:17 GMT",
"referrer-policy": "same-origin",
"server": "gunicorn",
"strict-transport-security": "max-age=60; includeSubDomains; preload",
"vary": "Cookie, Accept-Language, origin",
"via": "1.1 Caddy",
"x-content-type-options": "nosniff",
"x-frame-options": "DENY"
}
Request Options
{
"proxy": {
"type": "datacenter"
},
"scraper_options": {
"network_requests": true
},
"screenshot": true,
"url": "https://www.scraperouter.com/"
}
26 requests captured
| Method | URL | Status | Type | Time |
|---|---|---|---|---|
| GET |
https://static.scraperouter.com/images/favicons/favicon.svg
3rd-party
|
200 | image | 0.30s |
| GET |
https://www.scraperouter.com/
|
200 | document | 0.35s |
| GET |
https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap
3rd-party
|
200 | css | 0.47s |
| GET |
https://static.scraperouter.com/css/site-base.css
3rd-party
|
200 | css | 0.57s |
| GET |
https://static.scraperouter.com/js/site-base-bundle.js
3rd-party
|
200 | script | 0.47s |
| GET |
https://static.scraperouter.com/css/site-tailwind.css
3rd-party
|
200 | css | 0.46s |
| GET |
https://static.scraperouter.com/js/site-tailwind-bundle.js
3rd-party
|
200 | script | 0.47s |
| GET |
https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/regular/style.css
3rd-party
|
200 | css | 0.46s |
| GET |
https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/fill/style.css
3rd-party
|
200 | css | 0.56s |
| GET |
https://www.googletagmanager.com/gtag/js?id=G-CXJH3FN9J2
3rd-party
|
200 | script | 0.49s |
| GET |
https://static.scraperouter.com/js/site-bundle.js
3rd-party
|
200 | script | 0.47s |
| GET |
https://www.scraperouter.com/jsi18n/
|
200 | script | 0.22s |
| GET |
https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css
3rd-party
|
200 | css | 0.46s |
| GET |
https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js
3rd-party
|
200 | script | 0.49s |
| GET |
https://challenges.cloudflare.com/turnstile/v0/api.js
3rd-party
|
200 | script | 0.12s |
| GET |
https://static.scraperouter.com/images/logo.svg
3rd-party
|
200 | image | 0.46s |
| GET |
https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2
3rd-party
|
200 | font | 0.13s |
| GET |
https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2
3rd-party
|
200 | font | 0.11s |
| GET |
https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/regular/Phosphor.woff2
3rd-party
|
200 | font | 0.12s |
| GET |
https://eu-assets.i.posthog.com/static/web-vitals.js?v=1.360.2
3rd-party
|
200 | script | 0.30s |
| GET |
https://eu-assets.i.posthog.com/static/posthog-recorder.js?v=1.360.2
3rd-party
|
200 | script | 0.41s |
| GET |
https://eu-assets.i.posthog.com/static/dead-clicks-autocapture.js?v=1.360.2
3rd-party
|
200 | script | 0.22s |
| GET |
https://eu-assets.i.posthog.com/array/phc_KmlqvqSPkHg5dYGYaEgmiti1HNDezB2cwZil9TWyn3T/config.js
3rd-party
|
200 | script | 0.46s |
| GET |
https://eu-assets.i.posthog.com/static/surveys.js?v=1.360.2
3rd-party
|
200 | script | 0.19s |
| POST |
https://eu.i.posthog.com/i/v0/e/?ip=0&_=1773751460576&ver=1.360.2&compression=gzip-js
3rd-party
|
200 | json | 0.24s |
| GET |
https://challenges.cloudflare.com/cdn-cgi/challenge-platform/h/g/turnstile/f/ov2/av0/rch/9y9lq/0x4AAAAAAB3BcyrO00rWKcD1/auto/fbE/new/normal?lang=auto
3rd-party
|
200 | document | 0.13s |
Detections
Structured Metadata
Open Graph
[
{
"namespace": {
"og": "http://ogp.me/ns#"
},
"properties": [
[
"og:title",
"Unified Web Scraping API | ScrapeRouter"
],
[
"og:type",
"website"
],
[
"og:url",
"https://www.scraperouter.com/"
],
[
"og:image",
"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png"
],
[
"og:description",
"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers."
],
[
"og:site_name",
"ScrapeRouter"
]
]
}
]
JSON-LD
[
{
"@context": "https://schema.org",
"@type": "Organization",
"contactPoint": [
{
"@type": "ContactPoint",
"contactType": "customer support",
"email": "contact@scraperouter.com"
}
],
"email": "contact@scraperouter.com",
"logo": "https://static.scraperouter.com/images/logo_white_padding.png",
"name": "ScrapeRouter",
"sameAs": [
"https://x.com/ScrapeRouter",
"https://www.reddit.com/user/scraperouter-com/"
],
"url": "https://www.scraperouter.com"
},
{
"@context": "https://schema.org",
"@type": "WebPage",
"description": "One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.",
"image": "https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png",
"isPartOf": {
"@type": "WebSite",
"name": "ScrapeRouter",
"url": "https://www.scraperouter.com"
},
"name": "Unified Web Scraping API | ScrapeRouter",
"url": "https://www.scraperouter.com/"
}
]
Microformat
[
{
"lang": "en",
"properties": {
"name": [
"SCRAPERS PROXIES Request Playwright cURL & more Datacenter Residential & more Scrape API provider Success"
]
},
"type": [
"h-auto"
]
}
]
Scraper Response Data
Response payload
{
"content": "<!DOCTYPE html><html lang=\"en\" class=\"dark\" data-theme=\"dark\"><head>\n <meta charset=\"utf-8\">\n <!--IE compatibility-->\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <!--Mobile friendly-->\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n \n \n \n \n \n \n <title>\n \n Unified Web Scraping API | ScrapeRouter\n \n </title>\n <meta name=\"description\" content=\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\">\n <meta name=\"keywords\" content=\"scraping, intelligence\">\n <!-- Twitter Card data -->\n <meta name=\"twitter:card\" content=\"summary_large_image\">\n <meta name=\"twitter:title\" content=\"Unified Web Scraping API | ScrapeRouter\">\n <meta name=\"twitter:description\" content=\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\">\n <meta name=\"twitter:image\" content=\"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png\">\n <!-- Open Graph data -->\n <meta property=\"og:title\" content=\"Unified Web Scraping API | ScrapeRouter\">\n <meta property=\"og:type\" content=\"website\">\n <meta property=\"og:url\" content=\"https://www.scraperouter.com/\">\n <meta property=\"og:image\" content=\"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png\">\n <meta property=\"og:description\" content=\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\">\n <meta property=\"og:site_name\" content=\"ScrapeRouter\">\n <meta name=\"robots\" content=\"index,follow\">\n <link rel=\"canonical\" href=\"https://www.scraperouter.com/\">\n \n \n \n \n \n \n<link rel=\"icon\" type=\"image/svg+xml\" href=\"https://static.scraperouter.com/images/favicons/favicon.svg\">\n\n <!-- Roboto Font -->\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin=\"\">\n <link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap\" rel=\"stylesheet\">\n <style>\n /* Hide Alpine.js elements until initialized */\n [x-cloak] { display: none !important; }\n </style>\n \n <!-- Vite HMR client must load first for proper CSS injection -->\n \n <link rel=\"stylesheet\" href=\"https://static.scraperouter.com/css/site-base.css\">\n<script class=\"40f63b60a245e3c888e445380c1e1336ffa635a1\" id=\"184949c90e78883f4665dc8c22e26de0e8891bd3d020\" type=\"text/javascript\">document.getElementById(\"184949c90e78883f4665dc8c22e26de0e8891bd3d020\")?.remove();(() => { // Create a function that looks like a native getter\nconst nativeGetter = function get webdriver() {\n return false;\n};\n\n// Copy over native function properties\nObject.defineProperties(nativeGetter, {\n name: { value: 'get webdriver', configurable: true },\n length: { value: 0, configurable: true },\n toString: {\n value: function() {\n return `function get webdriver() { [native code] }`;\n },\n configurable: true\n }\n});\n\n// Make it look native\nObject.setPrototypeOf(nativeGetter, Function.prototype);\n\n// Apply the modified descriptor\nObject.defineProperty(Navigator.prototype, 'webdriver', {\n get: nativeGetter,\n set: undefined,\n enumerable: true,\n configurable: true\n}); })();</script><script type=\"module\" crossorigin=\"\" src=\"https://static.scraperouter.com/js/site-base-bundle.js\"></script>\n <link rel=\"stylesheet\" href=\"https://static.scraperouter.com/css/site-tailwind.css\">\n<script type=\"module\" crossorigin=\"\" src=\"https://static.scraperouter.com/js/site-tailwind-bundle.js\"></script>\n <!-- Phosphor Icons (https://phosphoricons.com) -->\n <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/regular/style.css\" crossorigin=\"anonymous\">\n <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/fill/style.css\" crossorigin=\"anonymous\">\n \n <!-- Google tag (gtag.js) -->\n<script async=\"\" src=\"https://www.googletagmanager.com/gtag/js?id=G-CXJH3FN9J2\"></script>\n<script>\n window.dataLayer = window.dataLayer || [];\n function gtag() { dataLayer.push(arguments); }\n gtag(\"js\", new Date());\n\n gtag(\"config\", \"G-CXJH3FN9J2\");\n</script>\n\n \n \n <script>\n window.posthogConfig = {\n apiKey: \"phc_KmlqvqSPkHg5dYGYaEgmiti1HNDezB2cwZil9TWyn3T\",\n host: \"https://eu.i.posthog.com\",\n };\n</script>\n\n \n <script type=\"module\" crossorigin=\"\" src=\"https://static.scraperouter.com/js/site-bundle.js\"></script>\n <script>__cssFramework = 'tailwind';</script>\n <script src=\"/jsi18n/\" defer=\"\"></script>\n \n <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css\">\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js\"></script>\n<style>\npre code.hljs {\n border-radius: 0.5rem;\n font-size: 0.8125rem;\n line-height: 1.625;\n}\n.code-tabs pre code.hljs {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n</style>\n\n \n <script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js\" async=\"\" defer=\"\"></script>\n \n\n <script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"ScrapeRouter\",\"url\":\"https://www.scraperouter.com\",\"logo\":\"https://static.scraperouter.com/images/logo_white_padding.png\",\"email\":\"contact@scraperouter.com\",\"sameAs\":[\"https://x.com/ScrapeRouter\",\"https://www.reddit.com/user/scraperouter-com/\"],\"contactPoint\":[{\"@type\":\"ContactPoint\",\"email\":\"contact@scraperouter.com\",\"contactType\":\"customer support\"}]}</script>\n<script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebPage\",\"name\":\"Unified Web Scraping API | ScrapeRouter\",\"description\":\"One API for web scraping with smart routing across HTTP, browser automation, and proxy tiers.\",\"url\":\"https://www.scraperouter.com/\",\"image\":\"https://www.scraperouter.comhttps://static.scraperouter.com/images/logo_white_padding.png\",\"isPartOf\":{\"@type\":\"WebSite\",\"name\":\"ScrapeRouter\",\"url\":\"https://www.scraperouter.com\"}}</script>\n </head>\n <body hx-headers=\"{"X-CSRFToken": "rk2IVLy1KhRI7p6oJR7N4C1ElSceDfr2auUmvn2gCxPev8r3DFzmkdoyS7uomyiI"}\" class=\"vite-loaded\">\n \n <div class=\"min-h-screen dark:bg-gray-900 flex flex-col\">\n <header class=\"sticky top-0 z-50 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800\">\n \n<nav aria-label=\"Global\" class=\"mx-auto max-w-7xl w-full flex items-center justify-between px-4 sm:px-6 lg:px-0 py-4 sm:py-6\">\n <div class=\"flex lg:flex-1\">\n <a href=\"/\" class=\"-m-1.5 p-1.5 flex items-center gap-x-2\">\n <div class=\"size-5 object-cover\">\n <img src=\"https://static.scraperouter.com/images/logo.svg\" alt=\"ScrapeRouter\" class=\"h-5 dark:invert\">\n </div>\n <span class=\"sr-only\">ScrapeRouter</span>\n <span class=\"text-lg font-bold text-black dark:text-white\">ScrapeRouter</span>\n </a>\n </div>\n <div class=\"flex lg:hidden\">\n <button type=\"button\" class=\"-m-2.5 inline-flex cursor-pointer items-center justify-center rounded-md p-2.5 text-gray-800 dark:text-gray-200\" onclick=\"toggleMobileMenu()\">\n <span class=\"sr-only\">Open main menu</span>\n <i class=\"ph ph-list text-xl\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"hidden lg:flex lg:gap-x-8 lg:items-center\">\n <a href=\"/check/?src=navbar\" class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Free Check</a>\n <a href=\"/scrapers/\" class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Scrapers</a>\n <a href=\"/#pricing\" class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Pricing</a>\n <a href=\"/docs/quickstart/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-sm font-semibold text-gray-900 dark:text-white hover:text-primary\">Docs</a>\n \n <div class=\"flex items-center gap-2\">\n <a href=\"/accounts/login/\" class=\"btn btn-rounded-full btn-ghost\">Sign in</a>\n <a href=\"/accounts/signup/\" class=\"btn btn-rounded-full btn-primary\">Sign up</a>\n </div>\n \n </div>\n</nav>\n<!-- Mobile menu -->\n<div id=\"mobile-menu\" class=\"hidden lg:hidden\">\n <div id=\"mobile-menu-backdrop\" class=\"fixed inset-0 z-50\" onclick=\"closeMobileMenu()\">\n <div class=\"fixed inset-y-0 right-0 z-50 w-full overflow-y-auto bg-white p-4 sm:max-w-sm sm:p-6 sm:ring-1 sm:ring-gray-900/10 dark:bg-gray-900 dark:sm:ring-gray-100/10\" onclick=\"event.stopPropagation()\">\n <div class=\"flex items-center justify-between\">\n <button type=\"button\" class=\"-m-2.5 rounded-md p-2.5 text-gray-800 dark:text-gray-200 cursor-pointer\" onclick=\"toggleMobileMenu()\">\n <span class=\"sr-only\">Close menu</span>\n <i class=\"ph ph-x text-xl\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"mt-6 flow-root\">\n <div class=\"-my-6 divide-y divide-gray-500/10 dark:divide-white/10\">\n <div class=\"space-y-2 py-6\">\n <a href=\"/check/?src=navbar_mobile\" onclick=\"toggleMobileMenu()\" class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Free Check</a>\n <a href=\"/scrapers/\" onclick=\"toggleMobileMenu()\" class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Scrapers</a>\n <a href=\"/#pricing\" onclick=\"toggleMobileMenu()\" class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Pricing</a>\n <a href=\"/docs/quickstart/\" target=\"_blank\" rel=\"noopener noreferrer\" onclick=\"toggleMobileMenu()\" class=\"-mx-3 block rounded-lg px-3 py-2 text-base font-semibold text-gray-900 hover:bg-gray-50 dark:text-white dark:hover:bg-white/5\">Docs</a>\n \n <a href=\"/accounts/login/\" onclick=\"toggleMobileMenu()\" class=\"btn btn-rounded-full btn-ghost\">Sign in</a>\n <a href=\"/accounts/signup/\" onclick=\"toggleMobileMenu()\" class=\"btn btn-rounded-full btn-primary\">Sign up</a>\n \n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n </header>\n <div class=\"relative isolate px-0 lg:px-8 flex-1\">\n \n <!-- Hero Section -->\n <section class=\"w-full\">\n <div class=\"mx-auto max-w-7xl px-4 pt-24 lg:pt-32 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-4xl text-center\">\n <h1 class=\"text-5xl font-extrabold tracking-tight text-gray-900 dark:text-white\">\n The Unified Interface\n <br>\n <span class=\"text-primary/90\">For Scraping</span>\n </h1>\n <p class=\"mt-6 text-lg text-gray-500 dark:text-gray-400 max-w-2xl mx-auto\">\n <span class=\"text-primary/90 font-semibold\">One API</span> for all your web scraping needs. Choose the optimal scraping method for a given request.\n </p>\n <div class=\"mt-10 flex flex-col items-center gap-4\">\n <div class=\"flex flex-col items-center gap-3 sm:flex-row sm:flex-wrap sm:justify-center\">\n <a href=\"/accounts/signup/\" class=\"btn btn-rounded-full btn-primary px-8\">\n Start scraping for free\n <i class=\"ph ph-arrow-right ml-2\" aria-hidden=\"true\"></i>\n </a>\n <a href=\"/docs/quickstart/\" target=\"_blank\" class=\"btn btn-rounded-full btn-ghost px-8\">\n <i class=\"ph ph-code mr-2\" aria-hidden=\"true\"></i>\n Read the Docs\n </a>\n </div>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Get <span class=\"font-semibold text-gray-900 dark:text-white\">$5 free credits</span> to start in 60 seconds. No credit card required.\n </p>\n </div>\n </div>\n </div>\n </section>\n <!-- Free URL Check -->\n <section class=\"w-full\">\n <div class=\"mx-auto max-w-7xl px-4 pt-12 pb-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-2xl rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 p-6 text-left\">\n <div class=\"flex items-center gap-2 mb-1\">\n <i class=\"ph ph-shield-check text-xl text-primary/90\" aria-hidden=\"true\"></i>\n <h2 class=\"text-sm font-semibold uppercase tracking-wide text-gray-900 dark:text-white\">Run a free URL check</h2>\n </div>\n <p class=\"mt-1 text-sm text-gray-600 dark:text-gray-400\">\n Analyze scraping viability with a preconfigured datacenter matrix and advanced bypass routing.\n </p>\n <form id=\"public-check-form\" method=\"post\" action=\"/checks/public/create/\" class=\"mt-4 space-y-3\" data-public-check-form=\"true\" data-track-submit-event=\"check_submit\" data-public-check-bound=\"true\" data-public-check-submitting=\"false\">\n <input type=\"hidden\" name=\"csrfmiddlewaretoken\" value=\"rk2IVLy1KhRI7p6oJR7N4C1ElSceDfr2auUmvn2gCxPev8r3DFzmkdoyS7uomyiI\">\n <input type=\"hidden\" name=\"next\" value=\"/\">\n <div class=\"flex flex-col sm:flex-row\">\n <div class=\"relative w-full\">\n <input type=\"url\" name=\"url\" required=\"\" placeholder=\"https://example.com\" class=\"input w-full pl-9 rounded-b-none! sm:rounded-b-md! sm:rounded-r-none!\" id=\"public-check-url\">\n </div>\n <button type=\"submit\" id=\"public-check-submit\" aria-busy=\"false\" class=\"btn -mt-[1px] sm:mt-0 sm:-ml-[1px] z-10 btn-rounded-md rounded-t-none! sm:rounded-t-md! sm:rounded-l-none! btn-outline whitespace-nowrap\">\n <span data-button-idle=\"\">Run free check</span>\n <span data-button-loading=\"\" class=\"hidden items-center gap-2\">\n <svg class=\"size-4 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"3\"></circle>\n <path d=\"M21 12a9 9 0 0 0-9-9\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\"></path>\n</svg>\n\n <span>Running...</span>\n </span>\n </button>\n </div>\n \n <div class=\"w-full flex justify-center\">\n <div class=\"cf-turnstile\" data-sitekey=\"0x4AAAAAAB3BcyrO00rWKcD1\"><div><input type=\"hidden\" name=\"cf-turnstile-response\" id=\"cf-chl-widget-9y9lq_response\"></div></div>\n </div>\n \n </form>\n \n </div>\n </div>\n </section>\n <!-- Intelligent Path Selection -->\n <section id=\"path-selection\" class=\"w-full border-b border-gray-200 dark:border-gray-800 hidden md:block scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-4xl py-16\">\n <p class=\"text-xs font-semibold tracking-[0.2em] text-gray-400 dark:text-gray-500 text-center uppercase mb-8\">\n Intelligent Routing\n </p>\n <div id=\"scraping-path-animation\" class=\"w-full mx-auto\"><svg viewBox=\"12 23 1006 439\" class=\"w-full h-auto\" preserveAspectRatio=\"xMidYMid meet\" role=\"img\" aria-label=\"Intelligent routing visualization showing request flowing through scraper and proxy selection to success\">\n <defs>\n <filter id=\"sr-glow\">\n <feGaussianBlur stdDeviation=\"3\" result=\"b\"></feGaussianBlur>\n <feMerge><feMergeNode in=\"b\"></feMergeNode><feMergeNode in=\"SourceGraphic\"></feMergeNode></feMerge>\n </filter>\n </defs>\n\n <g class=\"sr-scene\">\n <!-- Column labels -->\n <text x=\"370\" y=\"62\" text-anchor=\"middle\" class=\"fill-gray-400 dark:fill-gray-600\" style=\"font-size:10px;font-weight:600;letter-spacing:0.15em\">SCRAPERS</text>\n <text x=\"660\" y=\"62\" text-anchor=\"middle\" class=\"fill-gray-400 dark:fill-gray-600\" style=\"font-size:10px;font-weight:600;letter-spacing:0.15em\">PROXIES</text>\n\n <!-- Inactive paths (dashed) -->\n <g class=\"sr-inactive\" opacity=\"1\" style=\"transition: opacity 1s ease-out;\">\n <path d=\"M 108,200 C 230,200 270,200 348,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 108,200 C 230,200 270,300 348,300\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 392,100 C 500,100 560,100 638,100\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,100 C 500,100 560,200 638,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,100 C 500,100 560,300 638,300\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,200 C 500,200 560,100 638,100\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,200 C 500,200 560,200 638,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,200 C 500,200 560,300 638,300\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,300 C 500,300 560,100 638,100\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,300 C 500,300 560,200 638,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path><path d=\"M 392,300 C 500,300 560,300 638,300\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 682,100 C 780,100 880,200 922,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 682,300 C 780,300 880,200 922,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 108,200 C 260,220 380,390 493,390\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n <path d=\"M 537,390 C 700,390 870,200 922,200\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\" stroke-opacity=\"0.7\"></path>\n </g>\n\n <!-- Optimal paths (solid, animated) -->\n <path class=\"sr-opt\" d=\"M 108,200 C 230,200 270,100 348,100\" fill=\"none\" stroke=\"var(--color-primary)\" stroke-width=\"2.5\" stroke-opacity=\"0.7\" opacity=\"1\" style=\"stroke-dasharray: 265.154; stroke-dashoffset: 0; transition: stroke-dashoffset 1.2s ease-in-out;\"></path>\n <path class=\"sr-opt\" d=\"M 392,100 C 500,100 560,200 638,200\" fill=\"none\" stroke=\"var(--color-primary)\" stroke-width=\"2.5\" stroke-opacity=\"0.7\" opacity=\"1\" style=\"stroke-dasharray: 269.76; stroke-dashoffset: 0; transition: stroke-dashoffset 1.2s ease-in-out;\"></path>\n <path class=\"sr-opt\" d=\"M 682,200 C 780,200 880,200 922,200\" fill=\"none\" stroke=\"var(--color-primary)\" stroke-width=\"2.5\" stroke-opacity=\"0.7\" opacity=\"1\" style=\"stroke-dasharray: 240; stroke-dashoffset: 0; transition: stroke-dashoffset 1.2s ease-in-out;\"></path>\n\n <!-- Request node -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"80\" cy=\"200\" r=\"28\" class=\"fill-white dark:fill-gray-900\" stroke=\"var(--color-primary)\" stroke-width=\"2\" stroke-opacity=\"0.7\"></circle>\n <g transform=\"translate(80,200)\" stroke=\"var(--color-primary)\" stroke-width=\"1.5\" stroke-opacity=\"0.7\" fill=\"none\">\n <circle r=\"10\"></circle>\n <line x1=\"-10\" y1=\"0\" x2=\"10\" y2=\"0\"></line>\n <path d=\"M 0,-10 Q 5,0 0,10\"></path>\n <path d=\"M 0,-10 Q -5,0 0,10\"></path>\n </g>\n <text x=\"80\" y=\"244\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:13px;font-weight:500\">Request</text>\n </g>\n\n <!-- Playwright node (optimal) -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"370\" cy=\"100\" r=\"22\" fill=\"var(--color-primary)\" fill-opacity=\"0.7\"></circle>\n <g transform=\"translate(370,100)\" stroke=\"#fff\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"-8\" y=\"-6\" width=\"16\" height=\"12\" rx=\"2\"></rect>\n <line x1=\"-8\" y1=\"-2\" x2=\"8\" y2=\"-2\"></line>\n <circle cx=\"-5.5\" cy=\"-4\" r=\"0.7\" fill=\"#fff\" stroke=\"none\"></circle>\n <circle cx=\"-3.2\" cy=\"-4\" r=\"0.7\" fill=\"#fff\" stroke=\"none\"></circle>\n <line x1=\"-4\" y1=\"2\" x2=\"4\" y2=\"2\"></line>\n </g>\n <text x=\"370\" y=\"138\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:12px;font-weight:600\">Playwright</text>\n </g>\n\n <!-- cURL node -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"370\" cy=\"200\" r=\"22\" class=\"fill-gray-400 dark:fill-gray-600\"></circle>\n <g transform=\"translate(370,200)\" stroke=\"#fff\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M -5,-6 L -8,0 L -5,6\"></path>\n <path d=\"M 5,-6 L 8,0 L 5,6\"></path>\n </g>\n <text x=\"370\" y=\"238\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:12px\">cURL</text>\n </g>\n\n <!-- More scrapers placeholder -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"370\" cy=\"300\" r=\"22\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"4 3\"></circle>\n <g transform=\"translate(370,300)\" class=\"stroke-gray-400 dark:stroke-gray-500\" stroke-width=\"2\" stroke-linecap=\"round\">\n <line x1=\"0\" y1=\"-6\" x2=\"0\" y2=\"6\"></line>\n <line x1=\"-6\" y1=\"0\" x2=\"6\" y2=\"0\"></line>\n </g>\n <text x=\"370\" y=\"338\" text-anchor=\"middle\" class=\"fill-gray-400 dark:fill-gray-500\" style=\"font-size:11px\">& more</text>\n </g>\n\n <!-- Datacenter proxy node -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"660\" cy=\"100\" r=\"22\" class=\"fill-gray-400 dark:fill-gray-600\"></circle>\n <g transform=\"translate(660,100)\" fill=\"none\">\n <rect x=\"-7\" y=\"-7\" width=\"14\" height=\"5\" rx=\"1.5\" stroke=\"#fff\" stroke-width=\"1.5\"></rect>\n <rect x=\"-7\" y=\"1\" width=\"14\" height=\"5\" rx=\"1.5\" stroke=\"#fff\" stroke-width=\"1.5\"></rect>\n <circle cx=\"4\" cy=\"-4.5\" r=\"1\" fill=\"#fff\"></circle>\n <circle cx=\"4\" cy=\"3.5\" r=\"1\" fill=\"#fff\"></circle>\n </g>\n <text x=\"660\" y=\"138\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:12px\">Datacenter</text>\n </g>\n\n <!-- Residential proxy node (optimal) -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"660\" cy=\"200\" r=\"22\" fill=\"var(--color-primary)\" fill-opacity=\"0.7\"></circle>\n <g transform=\"translate(660,200)\" stroke=\"#fff\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M 0,-7 L 7,1 L -7,1 Z\"></path>\n <rect x=\"-5\" y=\"1\" width=\"10\" height=\"6\"></rect>\n </g>\n <text x=\"660\" y=\"238\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:12px;font-weight:600\">Residential</text>\n </g>\n\n <!-- More proxies placeholder -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"660\" cy=\"300\" r=\"22\" fill=\"none\" class=\"stroke-gray-300 dark:stroke-gray-700\" stroke-width=\"1.5\" stroke-dasharray=\"4 3\"></circle>\n <g transform=\"translate(660,300)\" class=\"stroke-gray-400 dark:stroke-gray-500\" stroke-width=\"2\" stroke-linecap=\"round\">\n <line x1=\"0\" y1=\"-6\" x2=\"0\" y2=\"6\"></line>\n <line x1=\"-6\" y1=\"0\" x2=\"6\" y2=\"0\"></line>\n </g>\n <text x=\"660\" y=\"338\" text-anchor=\"middle\" class=\"fill-gray-400 dark:fill-gray-500\" style=\"font-size:11px\">& more</text>\n </g>\n\n <!-- 3rd Party provider node -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"515\" cy=\"390\" r=\"22\" class=\"fill-gray-400 dark:fill-gray-600\"></circle>\n <g transform=\"translate(515,390)\" stroke=\"#fff\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M -1,-1 L -6,-1 L -6,6 L 1,6 L 1,1\"></path>\n <line x1=\"1\" y1=\"-1\" x2=\"6\" y2=\"-6\"></line>\n <polyline points=\"2,-6 6,-6 6,-2\"></polyline>\n </g>\n <text x=\"515\" y=\"428\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:12px\">Scrape API provider</text>\n </g>\n\n <!-- Success node -->\n <g class=\"sr-node\" opacity=\"1\" style=\"transition: opacity 0.8s ease-out;\">\n <circle cx=\"950\" cy=\"200\" r=\"28\" class=\"fill-white dark:fill-gray-900\" stroke=\"var(--color-green-700)\" stroke-width=\"2.5\" stroke-opacity=\"0.7\"></circle>\n <g transform=\"translate(950,200)\" stroke=\"var(--color-green-700)\" stroke-width=\"2.5\" stroke-opacity=\"0.7\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M -7,0 L -2,5 L 8,-5\"></path>\n </g>\n <text x=\"950\" y=\"244\" text-anchor=\"middle\" class=\"fill-gray-700 dark:fill-gray-300\" style=\"font-size:13px;font-weight:500\">Success</text>\n </g>\n\n </g>\n\n <!-- Traveling dot along optimal path -->\n <circle class=\"sr-dot\" r=\"4\" fill=\"var(--color-primary-400)\" fill-opacity=\"0.7\" opacity=\"0\">\n <animateMotion dur=\"4s\" repeatCount=\"indefinite\" begin=\"indefinite\" path=\"M 80,200 C 230,200 270,100 370,100 C 500,100 560,200 660,200 C 800,200 900,200 950,200\"></animateMotion>\n <animate attributeName=\"r\" values=\"3;5;3\" dur=\"1.5s\" repeatCount=\"indefinite\"></animate>\n </circle>\n </svg></div>\n </div>\n </div>\n </section>\n <!-- How It Works -->\n <section id=\"how-it-works\" class=\"w-full border-b border-gray-200 dark:border-gray-800 scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 py-18 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-5xl\">\n <h2 class=\"text-3xl font-semibold text-center text-gray-900 dark:text-white\">How It Works</h2>\n <p class=\"mt-4 text-center text-lg text-gray-600 dark:text-gray-400\">Get started in minutes.</p>\n <div class=\"mt-16 flex flex-col lg:flex-row items-center justify-center gap-6 lg:gap-0\">\n <!-- Step 1: Sign Up -->\n <a href=\"/accounts/signup/\" class=\"flex flex-col items-center text-center max-w-48 group p-6 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors duration-300\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-user-plus text-2xl \" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2 group-hover:underline\">Sign up</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400 group-hover:underline\">Create an account to get started.</p>\n </a>\n <!-- Arrow 1\u21922 -->\n <div class=\"hidden lg:flex items-center h-12 px-2\">\n <i class=\"ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex lg:hidden items-center justify-center w-full\">\n <i class=\"ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <!-- Step 2: Add Credits -->\n <div class=\"flex flex-col items-center text-center max-w-48\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-coins text-2xl\" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Get free credits</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">Credits work with any scraper or proxy.</p>\n </div>\n <!-- Arrow 2\u21923 -->\n <div class=\"hidden lg:flex items-center h-12 px-2\">\n <i class=\"ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex lg:hidden items-center justify-center w-full\">\n <i class=\"ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <!-- Step 3: Get API Key -->\n <div class=\"flex flex-col items-center text-center max-w-48\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-key text-2xl\" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Get your API key</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">Create an API key and start making requests.</p>\n </div>\n <!-- Arrow 3\u21924 -->\n <div class=\"hidden lg:flex items-center h-12 px-2\">\n <i class=\"ph ph-arrow-right text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex lg:hidden items-center justify-center w-full\">\n <i class=\"ph ph-arrow-down text-2xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <!-- Step 4: Cost-Effective & Unified Results -->\n <div class=\"flex flex-col items-center text-center max-w-48\">\n <span class=\" flex items-center justify-center w-12 h-12 rounded-lg bg-primary-100/80 dark:bg-primary-900/40 text-primary-700/90 dark:text-primary-400/90 mb-4\">\n <i class=\"ph ph-currency-dollar-simple text-2xl\" aria-hidden=\"true\"></i>\n </span>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Scrape</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">Consistent schema and optimized cost.</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n <!-- Developer First Features -->\n <section id=\"features\" class=\"w-full border-b border-gray-200 dark:border-gray-800 dark:bg-gray-800/50 scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800 py-18\">\n <div class=\"mx-auto max-w-2xl text-center\">\n <h2 class=\"text-3xl font-semibold text-gray-900 dark:text-white\">Developer First Features</h2>\n </div>\n <div class=\"mt-16 grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-4\">\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-package text-4xl text-gray-700 dark:text-gray-300\" aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Unified Schema</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Receive the same JSON response regardless of which provider fulfilled it.\n </p>\n </div>\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-dots-nine text-4xl text-gray-700 dark:text-gray-300\" aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Many Scrapers</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Use multiple scraping providers and libraries through a single integration.\n </p>\n </div>\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-brain text-4xl text-gray-700 dark:text-gray-300\" aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Smart Routing</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n We route to the best provider for each domain and automatically retry with the next best option if it fails.\n </p>\n </div>\n <div class=\"bg-white dark:bg-gray-900 rounded-lg p-6 border border-gray-200 dark:border-gray-700\">\n <div class=\"text-3xl mb-4 flex items-center justify-center h-10\">\n <i class=\"ph ph-currency-dollar text-4xl text-gray-700 dark:text-gray-300\" aria-hidden=\"true\"></i>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">Cost Optimization</h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n Attempt requests via the cheapest provider first, escalating to premium only if necessary.\n </p>\n </div>\n </div>\n </div>\n </section>\n <!-- Quick Start -->\n <section class=\"w-full border-b border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-7xl px-4 py-18 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800\">\n <div class=\"mx-auto max-w-2xl lg:max-w-6xl\">\n <h2 class=\"text-3xl font-semibold text-center text-gray-900 dark:text-white\">Quick Start</h2>\n <p class=\"mt-4 text-center text-lg text-gray-600 dark:text-gray-400\">One request is all it takes.</p>\n <div class=\"mt-12 flex flex-col lg:flex-row lg:items-center lg:justify-center gap-6 lg:gap-4\">\n <div class=\"flex-1 min-w-0\">\n <div x-data=\"{ tab: 'curl' }\" class=\"code-tabs not-prose rounded-lg overflow-hidden\" data-copy-button-added=\"true\">\n \n<div class=\"code-tabs-header flex items-end bg-[#0d1117] rounded-t-lg px-2 pt-2 border-b border-gray-700\">\n \n <button @click=\"tab = 'curl'\" :class=\"tab === 'curl' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'\" class=\"px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px border-b-2 border-blue-400 text-gray-100\">cURL</button>\n \n <button @click=\"tab = 'python'\" :class=\"tab === 'python' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'\" class=\"px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px border-b-2 border-transparent text-gray-500 hover:text-gray-300\">Python</button>\n \n <button @click=\"tab = 'javascript'\" :class=\"tab === 'javascript' ? 'border-b-2 border-blue-400 text-gray-100' : 'border-b-2 border-transparent text-gray-500 hover:text-gray-300'\" class=\"px-3 pb-1.5 pt-1 text-xs font-medium cursor-pointer -mb-px border-b-2 border-transparent text-gray-500 hover:text-gray-300\">JavaScript</button>\n \n<button type=\"button\" class=\"code-snippet-copy-button code-snippet-copy-button-inline\" title=\"Copy code\" aria-label=\"Copy code\"><i class=\"ph ph-copy\" aria-hidden=\"true\"></i></button></div>\n\n <div class=\"bg-[#0d1117] [&_pre]:m-0 [&_pre]:rounded-none [&_pre]:overflow-x-auto\">\n <div x-show=\"tab === 'curl'\">\n \n<pre class=\"overflow-x-auto\"><code class=\"language-bash hljs\" data-highlighted=\"yes\"><span class=\"hljs-meta\">#!/usr/bin/env bash</span>\ncurl -X POST https://www.scraperouter.com/api/v1/scrape/ \\\n -H <span class=\"hljs-string\">\"Authorization: Api-Key {your_api_key}\"</span> \\\n -H <span class=\"hljs-string\">\"Content-Type: application/json\"</span> \\\n -d <span class=\"hljs-string\">'{\n \"url\": \"https://example.com\",\n \"scraper\": \"auto\"\n}'</span></code></pre>\n\n </div>\n <div x-show=\"tab === 'python'\" style=\"display: none;\">\n \n<pre class=\"overflow-x-auto\"><code class=\"language-python hljs\" data-highlighted=\"yes\"><span class=\"hljs-keyword\">import</span> requests\n\nresponse = requests.post(\n <span class=\"hljs-string\">\"https://www.scraperouter.com/api/v1/scrape/\"</span>,\n headers={<span class=\"hljs-string\">\"Authorization\"</span>: <span class=\"hljs-string\">\"Api-Key {your_api_key}\"</span>},\n json={\n <span class=\"hljs-string\">\"url\"</span>: <span class=\"hljs-string\">\"https://example.com\"</span>,\n <span class=\"hljs-string\">\"scraper\"</span>: <span class=\"hljs-string\">\"auto\"</span>,\n },\n)\n<span class=\"hljs-built_in\">print</span>(response.json())</code></pre>\n\n </div>\n <div x-show=\"tab === 'javascript'\" style=\"display: none;\">\n \n<pre class=\"overflow-x-auto\"><code class=\"language-javascript hljs\" data-highlighted=\"yes\"><span class=\"hljs-keyword\">const</span> response = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-title function_\">fetch</span>(<span class=\"hljs-string\">\"https://www.scraperouter.com/api/v1/scrape/\"</span>, {\n <span class=\"hljs-attr\">method</span>: <span class=\"hljs-string\">\"POST\"</span>,\n <span class=\"hljs-attr\">headers</span>: {\n <span class=\"hljs-string\">\"Authorization\"</span>: <span class=\"hljs-string\">\"Api-Key {your_api_key}\"</span>,\n <span class=\"hljs-string\">\"Content-Type\"</span>: <span class=\"hljs-string\">\"application/json\"</span>,\n },\n <span class=\"hljs-attr\">body</span>: <span class=\"hljs-title class_\">JSON</span>.<span class=\"hljs-title function_\">stringify</span>({\n <span class=\"hljs-attr\">url</span>: <span class=\"hljs-string\">\"https://example.com\"</span>,\n <span class=\"hljs-attr\">scraper</span>: <span class=\"hljs-string\">\"auto\"</span>,\n }),\n});\n\n<span class=\"hljs-keyword\">const</span> data = <span class=\"hljs-keyword\">await</span> response.<span class=\"hljs-title function_\">json</span>();\n<span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">log</span>(data);</code></pre>\n\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-shrink-0 items-center justify-center px-2 w-full lg:w-auto\">\n <i class=\"hidden lg:flex ph ph-arrow-right text-3xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n <i class=\"lg:hidden ph ph-arrow-down text-3xl text-gray-300 dark:text-gray-600\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"flex-1 min-w-0\">\n <div class=\"rounded-lg overflow-hidden border bg-[#0d1117] [&_pre]:m-0 [&_pre]:rounded-none [&_pre]:overflow-x-auto\">\n \n<pre class=\"overflow-x-auto code-snippet-copy-ready\" data-copy-button-added=\"true\"><code class=\"language-json hljs\" data-highlighted=\"yes\"><span class=\"hljs-punctuation\">{</span>\n <span class=\"hljs-attr\">\"id\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">\"550e8400-e29b-41d4-a716-446655440000\"</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">\"status_code\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-number\">200</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">\"url\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">\"https://example.com\"</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">\"content\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">\"<!doctype html>...\"</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">\"headers\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n <span class=\"hljs-attr\">\"content-type\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">\"text/html; charset=UTF-8\"</span>\n <span class=\"hljs-punctuation\">}</span><span class=\"hljs-punctuation\">,</span>\n <span class=\"hljs-attr\">\"scraper\"</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">\"apiritif/requests:2.32\"</span>\n<span class=\"hljs-punctuation\">}</span></code><button type=\"button\" class=\"code-snippet-copy-button\" title=\"Copy code\" aria-label=\"Copy code\"><i class=\"ph ph-copy\" aria-hidden=\"true\"></i></button></pre>\n\n </div>\n </div>\n </div>\n <p class=\"mt-20 text-center text-sm text-gray-600 dark:text-gray-400\">\n Want to learn more?\n <a href=\"/docs/quickstart/\" class=\"text-primary-700/90 dark:text-primary-400/90 hover:underline font-medium\">Read the documentation</a>\n </p>\n </div>\n </div>\n </section>\n <!-- Simple Pricing -->\n <section class=\"w-full dark:bg-gray-800/50 scroll-mt-20\">\n <div class=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 border-x border-gray-200 dark:border-gray-800 pt-18 pb-40\">\n <div id=\"pricing\" class=\"mx-auto bg-white dark:bg-gray-900 border border-gray-300 dark:border-gray-700 p-6 sm:p-8 rounded-3xl max-w-xl text-center\">\n <h2 class=\"text-3xl font-semibold text-gray-900 dark:text-white\">Simple Pricing</h2>\n <div class=\"mt-8\">\n <div class=\"text-5xl font-semibold text-gray-900 dark:text-white\">$0</div>\n <div class=\"text-lg text-gray-600 dark:text-gray-400 mt-2\">/ month</div>\n </div>\n <p class=\"mt-4 text-base text-gray-600 dark:text-gray-400\">\n Pay-as-you-go. See\n <a href=\"/scrapers/\" class=\"text-primary-700/90 dark:text-primary-400/90 hover:underline font-medium\">detailed per-request pricing</a>\n for each scraper.\n </p>\n <ul class=\"mt-8 space-y-3 text-left max-w-md mx-auto\">\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\" aria-hidden=\"true\"></i>\n <span>No minimums</span>\n </li>\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\" aria-hidden=\"true\"></i>\n <span>No subscriptions</span>\n </li>\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\" aria-hidden=\"true\"></i>\n <span>One consolidated bill</span>\n </li>\n <li class=\"flex items-center gap-3 text-sm text-gray-600 dark:text-gray-400\">\n <i class=\"ph ph-check-circle text-xl text-green-600/90 dark:text-green-400/90 flex-shrink-0\" aria-hidden=\"true\"></i>\n <span>Real-time cost tracking</span>\n </li>\n </ul>\n <a href=\"/accounts/signup/\" class=\"btn btn-rounded-full btn-primary mt-8\">Sign up</a>\n </div>\n </div>\n </section>\n <script>\n document.querySelectorAll('a[href^=\"#\"]').forEach(anchor => {\n anchor.addEventListener('click', function (e) {\n const href = this.getAttribute('href');\n if (href !== '#' && href.startsWith('#')) {\n e.preventDefault();\n const target = document.querySelector(href);\n if (target) {\n target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }\n });\n });\n if (typeof hljs !== 'undefined') {\n hljs.highlightAll();\n }\n </script>\n\n </div>\n <div class=\"bg-gray-50 dark:bg-gray-900\">\n <div class=\"border-x border-gray-200 dark:border-gray-800 max-w-7xl mx-auto\">\n <footer class=\"mx-auto w-full px-4 sm:px-6 py-6 lg:px-8\">\n <div class=\"flex flex-col sm:flex-row items-center justify-between gap-4\">\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n \u00a9 2026\n <a href=\"/\" class=\"hover:text-gray-900 dark:hover:text-white transition-colors\">ScrapeRouter</a>. All rights reserved.\n </p>\n <div class=\"flex items-center gap-6\">\n <nav class=\"flex items-center gap-4 text-sm\">\n <a href=\"/terms/\" class=\"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors\">Terms</a>\n <a href=\"/privacy/\" class=\"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors\">Privacy Policy</a>\n </nav>\n <button type=\"button\" id=\"theme-toggle\" class=\"btn btn-rounded-full btn-ghost gap-2 w-22\" aria-label=\"Toggle theme\">\n <span id=\"theme-icon\" class=\"text-base size-6\">\ud83d\udcbb</span>\n <span id=\"theme-label\">Auto</span>\n </button>\n </div>\n </div>\n</footer>\n\n </div>\n </div>\n </div>\n\n <script type=\"text/javascript\" crossorigin=\"anonymous\" src=\"https://eu-assets.i.posthog.com/static/surveys.js?v=1.360.2\"></script><script type=\"text/javascript\" crossorigin=\"anonymous\" src=\"https://eu-assets.i.posthog.com/array/phc_KmlqvqSPkHg5dYGYaEgmiti1HNDezB2cwZil9TWyn3T/config.js\"></script><script type=\"text/javascript\" crossorigin=\"anonymous\" src=\"https://eu-assets.i.posthog.com/static/dead-clicks-autocapture.js?v=1.360.2\"></script><script type=\"text/javascript\" crossorigin=\"anonymous\" src=\"https://eu-assets.i.posthog.com/static/posthog-recorder.js?v=1.360.2\"></script><script type=\"text/javascript\" crossorigin=\"anonymous\" src=\"https://eu-assets.i.posthog.com/static/web-vitals.js?v=1.360.2\"></script><script>\n document.addEventListener('DOMContentLoaded', () => {\n (document.querySelectorAll('.notification .delete') || []).forEach(($delete) => {\n let $notification = $delete.parentNode;\n $delete.addEventListener('click', () => {\n $notification.parentNode.removeChild($notification);\n });\n });\n });\n</script>\n\n <script>\n function syncDarkMode() {\n const darkTheme = 'dark' || 'dark';\n const lightTheme = 'light' || 'light';\n const autoTheme = 'auto';\n\n const theme = localStorage.getItem('theme') || autoTheme;\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n\n if (theme === darkTheme || (theme === autoTheme && prefersDark)) {\n document.documentElement.classList.add('dark');\n document.documentElement.setAttribute('data-theme', darkTheme);\n document.cookie = `theme=${darkTheme};path=/;max-age=31536000`;\n } else {\n document.documentElement.classList.remove('dark');\n document.documentElement.setAttribute('data-theme', lightTheme);\n document.cookie = `theme=${lightTheme};path=/;max-age=31536000`;\n }\n }\n\n function getCurrentTheme() {\n return localStorage.getItem('theme') || 'auto';\n }\n\n function setTheme(theme) {\n localStorage.setItem('theme', theme);\n syncDarkMode();\n updateThemeButton();\n window.dispatchEvent(new Event('storage'));\n }\n\n function cycleTheme() {\n const current = getCurrentTheme();\n const themes = ['light', 'dark', 'auto'];\n const currentIndex = themes.indexOf(current);\n const nextIndex = (currentIndex + 1) % themes.length;\n setTheme(themes[nextIndex]);\n }\n\n function updateThemeButton() {\n const theme = getCurrentTheme();\n const icon = document.getElementById('theme-icon');\n const label = document.getElementById('theme-label');\n\n if (!icon || !label) return;\n\n if (theme === 'light') {\n icon.textContent = '\u2600\ufe0f';\n label.textContent = 'Light';\n } else if (theme === 'dark') {\n icon.textContent = '\ud83c\udf19';\n label.textContent = 'Dark';\n } else {\n icon.textContent = '\ud83d\udcbb';\n label.textContent = 'Auto';\n }\n }\n\n syncDarkMode();\n\n document.addEventListener('DOMContentLoaded', () => {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', () => {\n syncDarkMode();\n updateThemeButton();\n });\n\n window.addEventListener('storage', (event) => {\n if (event.key === 'theme') {\n syncDarkMode();\n updateThemeButton();\n }\n });\n\n updateThemeButton();\n\n const themeToggle = document.getElementById('theme-toggle');\n if (themeToggle) {\n themeToggle.addEventListener('click', cycleTheme);\n }\n\n const mobileMenu = document.getElementById(\"mobile-menu\");\n if (mobileMenu) {\n document.addEventListener(\"click\", function(event) {\n const menuButton = event.target.closest(\"button[onclick='toggleMobileMenu()']\");\n if (!mobileMenu.classList.contains(\"hidden\") && !mobileMenu.contains(event.target) && !menuButton) {\n mobileMenu.classList.add(\"hidden\");\n }\n });\n }\n });\n\n function toggleMobileMenu() {\n const menu = document.getElementById(\"mobile-menu\");\n if (menu) menu.classList.toggle(\"hidden\");\n }\n\n function closeMobileMenu() {\n const menu = document.getElementById(\"mobile-menu\");\n if (menu) menu.classList.add(\"hidden\");\n }\n </script>\n \n \n \n\n</body></html>",
"cookies": [
{
"domain": "www.scraperouter.com",
"expires": -1,
"httpOnly": false,
"name": "scraperouter_language",
"path": "/",
"sameSite": "Lax",
"secure": false,
"value": "en"
},
{
"domain": "www.scraperouter.com",
"expires": 1805201060.290615,
"httpOnly": false,
"name": "csrftoken",
"path": "/",
"sameSite": "Lax",
"secure": true,
"value": "Tk2OKMEp2q8GyTvP4YCJqLx4HpskTt1Q"
},
{
"domain": "www.scraperouter.com",
"expires": 1805287460.441946,
"httpOnly": false,
"name": "theme",
"path": "/",
"sameSite": "Lax",
"secure": false,
"value": "dark"
},
{
"domain": ".scraperouter.com",
"expires": 1808311460.500258,
"httpOnly": false,
"name": "_ga",
"path": "/",
"sameSite": "Lax",
"secure": false,
"value": "GA1.1.1521737888.1773751459"
},
{
"domain": ".scraperouter.com",
"expires": 1808311460.50005,
"httpOnly": false,
"name": "_ga_CXJH3FN9J2",
"path": "/",
"sameSite": "Lax",
"secure": false,
"value": "GS2.1.s1773751459$o1$g1$t1773751460$j59$l0$h0"
},
{
"domain": ".scraperouter.com",
"expires": 1805287463,
"httpOnly": false,
"name": "ph_phc_KmlqvqSPkHg5dYGYaEgmiti1HNDezB2cwZil9TWyn3T_posthog",
"path": "/",
"sameSite": "Lax",
"secure": true,
"value": "%7B%22%24device_id%22%3A%22019cfbd3-5bad-797d-8f34-0fdecfbb914e%22%2C%22distinct_id%22%3A%22019cfbd3-5bad-797d-8f34-0fdecfbb914e%22%2C%22%24sesid%22%3A%5B1773751463406%2C%22019cfbd3-5bc5-7606-8e50-c394cc897722%22%2C1773751458748%5D%2C%22%24initial_person_info%22%3A%7B%22r%22%3A%22https%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3Dscraperouter%22%2C%22u%22%3A%22https%3A%2F%2Fwww.scraperouter.com%2F%22%7D%2C%22%24user_state%22%3A%22anonymous%22%7D"
}
],
"errors": null,
"final_url": "https://www.scraperouter.com/",
"headers": {
"alt-svc": "h3=\":443\"; ma=2592000",
"content-language": "en",
"content-length": "39758",
"content-type": "text/html; charset=utf-8",
"cross-origin-opener-policy": "same-origin",
"date": "Tue, 17 Mar 2026 12:44:17 GMT",
"referrer-policy": "same-origin",
"server": "gunicorn",
"strict-transport-security": "max-age=60; includeSubDomains; preload",
"vary": "Cookie, Accept-Language, origin",
"via": "1.1 Caddy",
"x-content-type-options": "nosniff",
"x-frame-options": "DENY"
},
"id": null,
"scraper_data": null,
"scraperouter": null,
"screenshot_url": null,
"status_code": 200
}
Page Title
Unified Web Scraping API | ScrapeRouter
[ ScrapeRouter ScrapeRouter ](/)
Open main menu __
[Free Check](/check/?src=navbar) [Scrapers](/scrapers/) [Pricing](/#pricing)
[Docs](/docs/quickstart/)
[Sign in](/accounts/login/) [Sign up](/accounts/signup/)
Close menu __
[Free Check](/check/?src=navbar_mobile) [Scrapers](/scrapers/)
[Pricing](/#pricing) [Docs](/docs/quickstart/) [Sign in](/accounts/login/)
[Sign up](/accounts/signup/)
# The Unified Interface
For Scraping
One API for all your web scraping needs. Choose the optimal scraping method
for a given request.
[ Start scraping for free __](/accounts/signup/) [ __Read the
Docs](/docs/quickstart/)
Get $5 free credits to start in 60 seconds. No credit card required.
__
## Run a free URL check
Analyze scraping viability with a preconfigured datacenter matrix and advanced
bypass routing.
Run free check Running...
Intelligent Routing
SCRAPERS PROXIES Request Playwright cURL & more Datacenter Residential & more
Scrape API provider Success
## How It Works
Get started in minutes.
[ __ Sign up Create an account to get started. ](/accounts/signup/)
__
__
__
### Get free credits
Credits work with any scraper or proxy.
__
__
__
### Get your API key
Create an API key and start making requests.
__
__
__
### Scrape
Consistent schema and optimized cost.
## Developer First Features
__
### Unified Schema
Receive the same JSON response regardless of which provider fulfilled it.
__
### Many Scrapers
Use multiple scraping providers and libraries through a single integration.
__
### Smart Routing
We route to the best provider for each domain and automatically retry with the
next best option if it fails.
__
### Cost Optimization
Attempt requests via the cheapest provider first, escalating to premium only
if necessary.
## Quick Start
One request is all it takes.
cURL Python JavaScript __
#!/usr/bin/env bash
curl -X POST https://www.scraperouter.com/api/v1/scrape/ \
-H "Authorization: Api-Key {your_api_key}" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"scraper": "auto"
}'
import requests
response = requests.post(
"https://www.scraperouter.com/api/v1/scrape/",
headers={"Authorization": "Api-Key {your_api_key}"},
json={
"url": "https://example.com",
"scraper": "auto",
},
)
print(response.json())
const response = await fetch("https://www.scr