Web Scraping API
Headless Chromium
Markdown Output
SSRF-Guarded

Any page. Clean Markdown.

Render JavaScript-heavy pages with headless Chromium and extract Markdown, HTML, links, images, or screenshots. Batch up to 100 URLs or crawl whole sites asynchronously.

6 · output formats100 · URLs per batch50 · browser actions maxReadability · main-content mode

Scrape a page right now.

This runs the live Web Scraping API against a set of sample pages: headless Chromium renders the page, then Readability extraction returns clean content.

Request builder
A URL and a format is all it takes.
POST /scrape

The demo is limited to these sample pages. Production scrapes any public https URL.

Production also supports rawHtml, images, and screenshot formats.

Main content only
Applies Readability extraction to strip navigation, ads, and boilerplate.
Live rendering takes a moment
Each request spins a real browser page, so expect a few seconds. Add maxAge to cache repeat scrapes in Redis.
Output preview
Live response from the API, plus the exact request to reproduce it.
title:...
Rendering page in headless Chromium...

Why Web Scraping API

Extraction without the infrastructure.

Real browser rendering

Headless Chromium executes JavaScript before extraction, so SPAs and dynamic pages return their actual content, not empty shells.

Six output formats

markdown, html, rawHtml, links, images, and screenshot, selectable per request via the formats array.

Main-content extraction

Readability mode strips navigation, ads, and boilerplate by default. Fine-tune with includeTags and excludeTags CSS selectors.

Batch and crawl jobs

Scrape up to 100 URLs per async batch, crawl entire sites with depth and path filters, or map a site's URLs synchronously.

Browser actions

Chain up to 50 pre-extraction actions like clicks, scrolls, and waits to reach content behind interaction.

SSRF-guarded by design

DNS-validated guards block private, link-local, CGNAT, and cloud-metadata hosts on the entry URL, redirects, and subresources.

/api/v1/scrape

Endpoints, at a glance.

Synchronous scraping and mapping for single pages, async jobs for batches and full-site crawls.
POST/api/v1/scrape

Synchronous scrape

Single-URL scrape returning content in the requested formats. 35-second route timeout.

PRIMARY
POST/api/v1/batch/scrape

Start batch job

Async scrape of 1 to 100 URLs. Returns 202 with a job id to poll.

GET/api/v1/batch/scrape/:id

Poll batch job

Job status with completed and failed counts plus per-URL results. Paginate with ?skip=N.

POST/api/v1/crawl

Start site crawl

Async crawl from a seed URL with limit, maxDepth, includePaths, and excludePaths.

GET/api/v1/crawl/:id

Poll crawl job

Crawl progress and page results. DELETE the same path to cancel a running crawl.

POST/api/v1/map

URL discovery

Synchronous site map: returns the links reachable from a URL. 60-second timeout.

ParameterTypeRequiredDescription
urlstringyesPublic https URL to scrape. SSRF-guarded on entry and redirects.
formatsarraynoOutput formats, default ["markdown"]: markdown, html, rawHtml, links, images, screenshot.
onlyMainContentbooleannoApply Readability extraction. Default true.
waitUntil / waitForstring / integernoNavigation wait strategy (load, domcontentloaded, networkidle0/2) plus up to 10,000 ms of extra wait.
includeTags / excludeTagsarraynoCSS selectors to keep or remove before extraction.
actionsarraynoUp to 50 browser actions (click, scroll, wait) executed before extraction.
maxAgeintegernoRedis cache TTL in ms for repeat scrapes. 0 (default) bypasses the cache.
urlsarraybatch only1 to 100 URLs for POST /batch/scrape.

Parameters shown are for POST /scrape; batch, crawl, and map accept the same scrape options where applicable.

Error reference

Built for unreliable pages.

Scraping fails in predictable ways. Every error includes a correlationId and enough detail to decide between retrying and rerouting.

400Validation / SSRF Block

Malformed request body, or the URL resolves to a private, link-local, CGNAT, or cloud-metadata host.

401Authentication Error

Missing or invalid API key. Send x-api-key or api_key with every request.

404Not Found

Unknown endpoint, or a batch/crawl job id that does not exist or has expired.

422Content Not Extractable

The page loaded but no extractable content was found. Try rawHtml or adjust tag filters.

429Rate Limit / Pool Saturated

Request limit exceeded or the browser pool is at capacity. Retry with backoff.

504Route Timeout

The page exceeded the route budget: 35 s for /scrape, 60 s for /map. Use batch jobs for slow sites.

Example error response

{
  "success": false,
  "error": "URL blocked by SSRF guard",
  "correlationId": "req_abc123"
}

FAQ

API questions developers ask first.

Can the API scrape JavaScript-rendered pages?

Yes. Every request renders the page in headless Chromium before extraction, so single-page apps and dynamically loaded content return their real markup. Control timing with waitUntil and waitFor, and interact first using the actions pipeline.

What output formats are supported?

Six: markdown (default), html, rawHtml, links, images, and screenshot. Request several at once with the formats array, e.g. ["markdown", "links"].

How do I scrape many URLs or a whole site?

POST /batch/scrape accepts up to 100 URLs and returns a job id to poll. POST /crawl walks a site from a seed URL with limit, maxDepth, and path filters. POST /map returns a site's URLs synchronously.

Is the scraper safe to expose to user-supplied URLs?

The service enforces a DNS-validated SSRF guard: private ranges, link-local, CGNAT (100.64.0.0/10), and cloud-metadata hosts are blocked on the entry URL, every redirect, and page subresources. Only public https URLs are accepted.

How fast is a scrape, and can I cache results?

A typical scrape completes in a few seconds; the route budget is 35 seconds. Set maxAge in milliseconds to serve repeat scrapes from Redis instead of re-rendering.

Turn the web into clean input.

Markdown for LLMs, links for crawlers, screenshots for archives. One API handles rendering, extraction, batching, and the security guardrails.