Website Scraper API Capture Page API
Capture one public webpage or content URL and return clean, reader-ready Markdown for HTML (title, headings, text, links, images and tables), plus exact content for PDF, DOCX, XLSX, CSV, JSON, XML and feeds. Blocked, empty and unavailable pages fail with a specific reason instead of a false success.
- 1 credit per call
- Failed calls are free
- Updated
- web.page.capture
What you send
The input
object of the request, with every field the endpoint accepts.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| url | string | yes | Public http(s) webpage or content URL to capture. Supported content parsers include text, Markdown, JSON, JSONL, CSV, TSV, XML, RSS, Atom, XLSX, and native-text PDF. | https://example.com/ |
| accept_statuses | array<integer> | no | Their parser quality remains failed. | |
| allow_browser_fallback | boolean | no | Render a detected bot wall, empty JavaScript shell or hard block (403/429/5xx) in a real browser before failing. Defaults to true; set false to return the honest blocked failure without a browser. Default: true. |
|
| allow_truncated | boolean | no | Default: false. |
|
| archive | object | no | Optional offline HTML or ZIP artifacts created from the same capture. Scripts default off. | |
| detail | string | no | How much of the artifact graph to return. standard (default) returns the clean content: main-content Markdown, text, title, links, images and tables. summary keeps only identity, trace, status, counts and compact text. full returns the complete captured and parsed graph, including raw HTML and the per-element dump. Allowed values: summary, standard, full. Default: standard. |
summary · standard · full |
| document | object | no | Optional document processing controls. Ignored for ordinary HTML pages. | |
| exclude_selectors | array<string> | no | Drop elements matching any selector from the Markdown. Simple CSS only: a tag, ".class" or "#id". | |
| headers | object | no | Extra request headers for this capture only. | |
| include_selectors | array<string> | no | Restrict the Markdown to the first element matching any selector. Simple CSS only: a tag, ".class" or "#id". | |
| main_content_only | boolean | no | Keep the reader-ready Markdown to the page's main content, dropping navigation, banners, footers and sidebars. Set false to return the whole rendered body. Default: true. |
|
| max_body_bytes | integer | no | Decoded response-body ceiling. HTML is capped at 8,000,000 bytes; file captures at 104,857,600 bytes. From 1 to 104857600. | |
| max_total_bytes | integer | no | Aggregate bytes across redirect responses and the final response. From 1 to 104857600. |
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "web.page.capture", "input": { "url": "https://example.com/" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "web.page.capture", "input": { "url": "https://example.com/" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "web.page.capture", "input": { "url": "https://example.com/" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
With Upscrape, get the Website Scraper API capture page for https://example.com/. Tell me what it costs before you run it, then show the results as a table.
The other website tools
Website Scraper API Capture Page API FAQ
The short answers. The docs have the long ones.
How much does the Website Scraper API Capture Page API cost?
1 credit per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send url. The input fields below list every option with its type and limits.
Which sites does it work on?
Any public page a visitor can open without logging in. A page that is blocked or gone fails with its reason.
Can my AI agent call it?
Yes, over MCP: the agent finds web.page.capture, checks its price and runs it with the same credits as the REST API.
Your first page is free.
Up to 100 free credits to start, no card needed.