CurlShot (https://curlshot.com) is a hosted screenshot API. It renders a web
page in a real browser and returns an image (PNG, JPEG, WebP), a PDF, or a
video of the page scrolling (MP4, WebM, GIF). One HTTP request does it.
CURLSHOT_API_KEY environment variable.CURLSHOT_API_KEY. If it is not set, ask the user to set it. Check current account eligibility and quotas at https://curlshot.com/register.curl --fail-with-body --max-time 60 -sS -G "https://curlshot.com/api/v1/screenshot" \
-H "X-Access-Key: $CURLSHOT_API_KEY" \
--data-urlencode "url=https://example.com" \
-d format=png \
--output screenshot.png
-G with --data-urlencode keeps the page address correctly encoded. Check response status and content type before treating the saved bytes as an image; an error may still be written to the output file. Use a new non-overwriting output path. Check
the HTTP status: on an error the body is JSON with error_code anderror_message instead of an image.
Add each option as one more -d name=value (GET) or as a field in a POST JSON body.
| Want | Option |
|---|---|
| Whole page, top to bottom | full_page=true |
| Phone or tablet view | viewport_device=<preset> (list: https://curlshot.com/docs/devices.md) |
| Window size | viewport_width=1440, viewport_height=900 |
| Retina sharpness | device_scale_factor=2 |
| Dark theme | dark_mode=true |
| One element only | selector=<css selector> |
| Output format | format=png / jpeg / webp / pdf / mp4 / webm / gif |
| Hide cookie banners and ads | block_cookie_banners=true, block_ads=true |
| Wait for content | wait_until=networkidle, delay=2, wait_for_selector=<css selector> |
| Reuse a stored copy for free | cache=true |
A misspelled option is rejected with invalid_options and a hint, never
ignored. Every option: https://curlshot.com/docs/options.md
POST JSON when the input is long:
curl --fail-with-body --max-time 60 -sS -X POST "https://curlshot.com/api/v1/screenshot" \
-H "X-Access-Key: $CURLSHOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"html": "<h1>Hello</h1>", "format": "png", "viewport_width": 1200, "viewport_height": 630}' \
--output card.png
Use "markdown": "..." instead of html to render Markdown as a styled page,
and "format": "pdf" for a PDF.
curl --fail-with-body --max-time 60 -sS -G "https://curlshot.com/api/v1/screenshot" \
-H "X-Access-Key: $CURLSHOT_API_KEY" \
--data-urlencode "url=https://example.com/pricing" \
-d viewport_device=iphone_15_pro \
-d full_page=true \
-d block_cookie_banners=true \
-d format=webp \
--output pricing-mobile.webp
Check https://curlshot.com/docs/devices.md for the exact preset names.
curl --fail-with-body --max-time 60 -sS -G "https://curlshot.com/api/v1/screenshot" \
-H "X-Access-Key: $CURLSHOT_API_KEY" \
--data-urlencode "url=https://example.com/docs" \
-d format=pdf \
--output docs.pdf
Verify current pricing, per-format charges, rate limits and account quota before use. Do not infer that failures/cache hits are free or that every render costs the same. Agree a batch cost cap and reconcile ambiguous outcomes before retrying.
Agents with MCP support can use the hosted server instead of HTTP calls:https://curlshot.com/api/mcp (streamable HTTP, Authorization: Bearer <key>),
tools take_screenshot and list_devices. Setup per client is in the
curlshot-mcp README.
curlshot.com and a CurlShot account key; it does not run a browser locally.