Screenshot API
Take a JPEG screenshot of a page, the visible window or the full page, with your own viewport and wait.
- 1 credit per call
- Failed calls are free
- Updated
- web.screenshot
{ "captured_at": "2026-10-16T14:03:23.651658Z", "content_type": "image/jpeg", "final_url": "https://www.wikipedia.org/", "height": 900, "rendered": true, "status_code": 200, "width": 1440, "image": { "bytes": 60650, "content_type": "image/jpeg", "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUA…", "encoding": "base64" }, "warnings": []}
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 | The page to screenshot. | https://www.wikipedia.org/ |
| format | string | no | The image format: jpeg. | jpeg |
| full_page | boolean | no | Capture the whole page, not just the visible window. | false |
| viewport_height | integer | no | The browser window height, in pixels. | 900 |
| viewport_width | integer | no | The browser window width, in pixels. | 1440 |
| wait_for_selector | string | no | Wait until an element matching this CSS selector appears. | |
| wait_ms | integer | no | Wait this many milliseconds before the screenshot. |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| captured_at | string | When the screenshot was taken. | 2026-10-16T14:03:23.651658Z |
| content_type | string | The image's format. | image/jpeg |
| final_url | string | The address the browser ended on, after any redirects. | https://www.wikipedia.org/ |
| height | integer | The image's height in pixels. | 900 |
| image | object | The screenshot. | 4 fields |
| image.bytes | integer | The image's size in bytes. | 60,650 |
| image.content_type | string | The image's format, image/jpeg. | image/jpeg |
| image.data | string | The image itself, base64-encoded. Decode it and save it as a .jpg file. | /9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUA… |
| image.encoding | string | How data is encoded: base64. | base64 |
| rendered | boolean | Whether the page was drawn in a real browser. | true |
| status_code | integer | The site's HTTP status for the page, such as 200. | 200 |
| warnings | array | Anything that limited the screenshot; empty when all went well. | empty in this sample |
| width | integer | The image's width in pixels. | 1440 |
What this endpoint covers
- The browser window is 1440 by 900 pixels unless you set viewport_width and viewport_height.
- full_page captures the whole page, top to bottom, in one image.
- For a page that fills in after it loads, wait for it with wait_for_selector or wait_ms.
- The image comes inside the JSON as base64, so there is no link to expire.
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.screenshot", "input": { "format": "jpeg", "full_page": false, "url": "https://www.wikipedia.org/", "viewport_height": 900, "viewport_width": 1440 }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "web.screenshot", "input": { "format": "jpeg", "full_page": false, "url": "https://www.wikipedia.org/", "viewport_height": 900, "viewport_width": 1440 }}''')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.screenshot", "input": { "format": "jpeg", "full_page": false, "url": "https://www.wikipedia.org/", "viewport_height": 900, "viewport_width": 1440 }}),});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, take a full-page screenshot of wikipedia.org at 1440 pixels wide.
The other website tools
Screenshot API FAQ
The short answers. The docs have the long ones.
How much does the Screenshot 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.screenshot, 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.