Scrape

Turn any URL into clean, agent-ready content — markdown, HTML, links or structured fields.

POST/api/v1/scrape

Request body

FieldTypeDescription
urlrequiredstringAbsolute URL to fetch (http:// or https://).
formats(string | object)[]Any combination of "markdown", "html", "rawHtml", "links", "screenshot", "summary", "branding", "changeTracking", or LLM formats { type: "question", question }, { type: "highlights", query }, { type: "json", schema | prompt }, { type: "changeTracking", modes?, schema? }.
Default: ["markdown"]
onlyMainContentbooleanStrip navigation, footers and boilerplate.
Default: true
waitFornumberMilliseconds to wait after navigation (for JS-heavy pages).
Default: 0
timeoutnumberHard request timeout in ms.
Default: 30000
maxAgenumberUpstream cache freshness in ms. If the page was scraped within this window, return the cached version instantly (no upstream credits, near-zero latency). Set 0 to force a fresh fetch.
storeInCachebooleanWhen false, the result of this scrape is not stored in the upstream cache.
Default: true
actionsAction[]Interact with the page before scraping: click, type, scroll, wait, press, screenshot, executeJavascript, scrape. See below.
mobilebooleanRender with a mobile viewport.
Default: false
blockAdsbooleanBlock ad and tracker requests.
Default: true
locationobjectGeo-target the request: { country: "US", languages: ["en"] }.
headersobjectCustom request headers.
proxystring"basic", "stealth", or "auto" — upgrade for bot-protected pages.

Change tracking new

Add "changeTracking" to formats to detect what changed on a page since the last time you scraped it — perfect for monitoring pricing pages, docs, terms-of-service, competitor sites, or anything you want to watch over time. Free: no extra credits beyond the base scrape.

json
{
"url": "https://example.com/pricing",
"formats": [
"markdown",
{ "type": "changeTracking", "modes": ["git-diff", "json"] }
]
}

Response includes changeTracking.changeStatusnew, same, changed, or removed — plus a diff when git-diff mode is requested.

Upstream caching with maxAge new

Pass maxAge (in milliseconds) to reuse a previously scraped version of the URL if it's still fresh. When a cache hit happens you get the response back in <100 ms and pay no upstream credits — only the standard scrape charge applies.

json
{
"url": "https://news.ycombinator.com",
"formats": ["markdown"],
"maxAge": 300000
}

Interact with the page (actions)

Run a sequence of browser actions before the page is captured. Useful for content behind clicks, search boxes, infinite scroll, or login walls.

json
{
"url": "https://example.com/search",
"formats": ["markdown"],
"actions": [
{ "type": "wait", "milliseconds": 1000 },
{ "type": "click", "selector": "#cookie-accept" },
{ "type": "write", "selector": "input[name=q]", "text": "firecrawl" },
{ "type": "press", "key": "Enter" },
{ "type": "wait", "milliseconds": 2000 },
{ "type": "scroll", "direction": "down" },
{ "type": "screenshot", "fullPage": true }
]
}

Action types: wait, click, write, press, scroll, screenshot, scrape, executeJavascript, pdf.

Example request

bash
curl https://neuroapi.me/api/v1/scrape \
-H "Authorization: Bearer $NEUROAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"formats": ["markdown", "links"],
"onlyMainContent": true
}'

Example response

json
{
"success": true,
"data": {
"markdown": "# Example Domain\n\nThis domain is for use...",
"links": ["https://www.iana.org/domains/example"],
"metadata": {
"title": "Example Domain",
"description": "",
"sourceURL": "https://example.com",
"statusCode": 200
}
},
"creditsCharged": 1
}