Browser Tools
One-shot endpoints for scraping pages, capturing screenshots, and generating PDFs without managing a session yourself.
Overview
Browser Tools are stateless, single-call endpoints that spin up a managed browser, perform one action against a URL, and return the result. They are the fastest way to pull content off a page when you do not need to drive a long-running session.
| Endpoint | What it does |
|---|---|
POST /v1/scrape | Loads a URL and returns HTML, cleaned HTML, Markdown, or Readability. |
POST /v1/screenshot | Loads a URL and returns a hosted PNG of the page. |
POST /v1/pdf | Loads a URL and returns a hosted PDF of the page. |
Each call counts as 1 credit and is rate limited to 20 requests per minute per organization. Reach for Sessions instead when you need cookies, multi-step navigation, or extension state.
Scrape
POST /v1/scrape extracts the contents of a single page. The response always includes content, metadata, and links; pass format to control which content variants come back.
1import Steel from "steel-sdk";23const client = new Steel();45const result = await client.scrape({6url: "https://docs.steel.dev",7format: ["markdown", "readability"],8});910console.log(result.content.markdown);11console.log(result.metadata.title);
The supported formats map to fields on content:
| Format | Field | Use when |
|---|---|---|
html | content.html | You want the raw DOM after JS execution. Default if format is omitted. |
cleaned_html | content.cleaned_html | You want stripped-down HTML without scripts, styles, ads. |
markdown | content.markdown | You're feeding the page into an LLM. |
readability | content.readability | You want Mozilla Readability's article extraction object. |
metadata carries the usual SEO fields (title, description, canonical, Open Graph tags, JSON-LD, statusCode, etc.) and links is a flat array of every anchor on the page.
Bundle a screenshot or PDF
Set screenshot: true or pdf: true on a scrape call to capture both content and a hosted file in a single request. The screenshot and PDF come back as hosted URLs alongside the scraped content.
1const result = await client.scrape({2url: "https://docs.steel.dev",3format: ["markdown"],4screenshot: true,5pdf: true,6});78console.log(result.screenshot?.url);9console.log(result.pdf?.url);
Screenshot
POST /v1/screenshot returns a hosted PNG. Use fullPage: true to capture the entire scrollable page instead of just the viewport.
1const result = await client.screenshot({2url: "https://docs.steel.dev",3fullPage: true,4});56console.log(result.url); // https://files.steel.dev/v1/static/<id>.png
The hosted URL is public and durable. Download it like any other PNG:
POST /v1/pdf renders the page and returns a hosted PDF URL. Same shape as screenshot: one URL in, one URL out.
1const result = await client.pdf({2url: "https://docs.steel.dev",3});45console.log(result.url); // https://files.steel.dev/v1/static/<id>.pdf
Shared options
All three endpoints accept the same handful of options for controlling how the page is loaded.
| Option | Type | What it does |
|---|---|---|
useProxy | boolean | Route the request through a Steel-managed residential proxy. Paid plans only. |
delay | number | Milliseconds to wait after navigation before capturing. Useful for hydrated sites. |
A common pattern for client-rendered pages is to combine delay with a residential proxy:
1const result = await client.scrape({2url: "https://example.com/pricing",3format: ["markdown"],4delay: 5000,5useProxy: true,6});
useProxy: true returns 402 Payment Required on the hobby plan. Upgrade, or pass your own proxy by opening a Session and scraping through it.
Errors
| Status | Meaning |
|---|---|
| 402 | useProxy: true requested on a plan that does not allow it. |
| 408 | The browser timed out before completing the action. |
| 429 | Concurrent session limit for your plan reached, or 20 RPM hit. |
| 503 | No browser capacity available right now. Safe to retry. |
When to use Sessions instead
Browser Tools are stateless. Each call opens a fresh browser, performs the action, and tears down. Reach for a Session when you need to:
- Persist cookies or local storage across navigations
- Submit forms, click through flows, or interact with the page
- Pin a proxy to a specific country (
useProxy: { geolocation: { country } }) - Reuse an authenticated profile or extension
You can still scrape, screenshot, or generate a PDF from inside a session. The Browser Tools endpoints are just the shortcut when you don't need the rest.
Reach out to us on the #help channel on Discord under the ⭐ community section.