Web scraping API

Web scraping that doesn't get blocked.

Real Chromium browsers on residential IPs. Submit a URL, get back clean HTML and structured data. No proxy fleet to manage, no headless Chrome to babysit.

Built for developers who'd rather ship features than maintain scrapers.

Submit a job in 3 lines
# Submit a job
curl -X POST https://api.scrappy.hu/v1/jobs \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'

# Response
{"job_id":"01HZ4...","status":"queued"}

What you get

Sites can't tell you're a bot

Workers live on residential ISPs in mini-PCs across the country. Your requests look like a person browsing — because they are.

Modern SPAs scrape correctly

Each job runs in a fresh Playwright context with stealth patches. React, Next.js, Vue — fully hydrated before extraction.

Async-first, sync when you need it

Push results to your webhook with an HMAC signature, or poll the API. Both work — pick what fits your stack.

Add to your stack in 3 lines

Bearer-token auth, OpenAPI spec, official Laravel SDK. Per-key rate limits and quotas you can rotate without ops support.

How it works

01

Generate a key

Sign up, create an API key from the dashboard. No credit card, no integration call.

→ sk_live_3NwH...
02

Submit a URL

POST a URL with optional wait_until, headers, extract fields. Get a job_id back in milliseconds.

POST /v1/jobs
→ { "job_id": "550e...", "status": "queued" }
03

Receive results

We POST the result to your webhook (with HMAC), or you poll. Title, meta, text, tables, full HTML — all extracted.

POST your-app/webhook
→ { "title": "...", "html": "..." }

Pricing

Start free — no credit card needed. Click any plan for full details.

Frequently asked

How is Scrappy different from ScrapingBee, Bright Data, ScraperAPI?+
Three things. (1) Every request runs through real Chromium with stealth — most competitors charge extra for "browser mode"; here it's the default. (2) Residential IPs come from our own mini-PC fleet, not a third-party residential pool — fewer overlapping IPs with abuse history, fewer blocks per dollar. (3) EU-based and GDPR-native, single-region pricing, no surprise overage fees, official Laravel SDK on day one. We're smaller and we like it that way — you reach the people running the service when you have a problem.
Why residential IPs?+
Most modern anti-bot systems flag traffic from data-center IPs (AWS, GCP, Hetzner, etc.) within milliseconds. Our worker fleet runs on consumer ISPs in real homes — the same IP space your visitors come from. That alone clears the majority of bot detection.
Do you execute JavaScript?+
Yes. Every fetch goes through a real Chromium browser via Playwright with the stealth plugin. SPAs (React, Next.js, Vue) render the same way they would in a user's browser, including hydration and lazy-loaded content. Pure-HTTP scrapers can't do that.
What are the rate limits?+
Limits are per account, set by your plan. The Free tier is 10 requests/minute and 100 jobs/month. Paid plans go higher; see /pricing for the exact numbers. You can also tighten a specific API key below the plan's cap.
Can I get a screenshot back?+
Yes — pass `"screenshot": true` in the job options. The image is captured at viewport size, stored privately, and rendered on the dashboard's job detail page. Free tier doesn't include screenshots; paid plans do.
Can the result be pushed to me instead of polling?+
Set `callback_url` and `callback_secret` on the job and we POST the same payload as `GET /v1/jobs/:id` once the job finishes, with an HMAC-SHA256 signature so you can verify the bytes weren't tampered with. Retries are 1s, 5s, 25s, 125s, 625s on any non-2xx.
Can I cancel any time?+
Yes. Click Manage subscription in /dashboard/billing — Stripe's customer portal handles cancel, payment-method update, and invoice download. You keep the paid features until the end of the billing cycle, then you're back on the Free plan automatically.