Skip to main content
Scrape is the core primitive. Send a single URL and get it back the way a model wants to read it: clean Markdown, the page’s own structured data, extracted JSON, links, or a summary. You describe the formats and how the page should be fetched; Hydrafetch handles the rest.

When to use

  • You have a specific URL and want clean content from it right now.
  • You need more than Markdown — the page’s structured data, its links, or an LLM summary.
  • You want control over how the page is fetched: render JavaScript-heavy pages, wait for content to settle, or fetch as if from another country.
For a whole site, use Crawl. For an explicit list of URLs, use Batch.

Example request

Send a POST to /v1/web/scrape with your key in the X-API-Key header. Omit formats for Markdown only.

Example response

The response is { "data": ... }. Only the formats you requested appear as fields; metadata and usage are always present.

Request options

Content

string
required
The URL to scrape. Must be http(s).
string[]
default:"[\"markdown\"]"
What to return: markdown, html, rawHtml, links, structured, summary, json. structured is the page’s own data (cheapest, no LLM); summary and json are LLM-backed and cost more. When you request json, supply jsonOptions.
object
Schema and/or prompt for the json format. Provide jsonOptions.schema (a JSON Schema describing the shape you want) and/or jsonOptions.prompt (a natural-language instruction). One is required when json is requested.
boolean
default:"false"
Preserve document structure (headings, lists, tables) over prose density. Good for marketing and service pages.

Content filters

boolean
default:"true"
Return only the main content, dropping nav and boilerplate.
string[]
CSS selectors to keep. When set, only matching elements are considered. Up to 50.
string[]
CSS selectors to strip before extraction. Up to 50.
boolean
default:"true"
Strip inline base64 images from the output.
boolean
default:"true"
Remove common ad and tracking elements.

Fetch controls

boolean
Force full page rendering for JavaScript-heavy pages. Left to Hydrafetch when omitted.
number
Extra milliseconds to let the page settle before capture. 0–30000.
number
Overall time budget for the request, in milliseconds. 1000–120000.
object
Fetch the page as if from a given region. location.country is an ISO 3166 alpha-2 code (e.g. "us"); location.languages is a list of preferred content languages, most-preferred first (e.g. ["en-US", "en"]).
object
Extra request headers to send when fetching the page.

Caching

number
Serve from cache if a capture of this URL is younger than this many milliseconds. Omit for the default window; 0 always fetches fresh. Capped at 7 days (604800000).
boolean
default:"false"
Only serve from cache. If there is no fresh cached copy, return 404 instead of fetching.
boolean
default:"true"
Persist the capture for later re-extraction.

Async

boolean
default:"false"
Return a job id immediately instead of waiting for the result. Poll GET /v1/web/scrape/{id}.

Response fields

object

Synchronous vs. async

By default, a scrape waits and returns { "data": ... } with the page. If you set async: true — or if the fetch runs past the synchronous wait — you instead get a job id:
Poll it until it finishes:
The status response carries status (waiting, active, completed, or failed), plus data once completed or error if it failed.
A standard scrape is one credit. LLM-backed formats (summary, json) cost more. Every response reports what it consumed in usage.creditsUsed and your balance in usage.creditsRemaining, and you are only charged on success.

Next steps

Scrape API reference

Full request and response schema with a live playground.

Formats

Markdown, structured data, extracted JSON, and more.

Crawl a whole site

Discover and scrape every page as one job.

Scrape a list of URLs

Provide an explicit set of URLs to scrape together.