CurlShot
Screenshot MCP server: take_screenshot renders a URL, HTML or Markdown to PNG, JPEG, WebP, PDF or video; list_devices lists device presets. Free plan: 100 a month.
Documentation
CurlShot documentation
Take a screenshot with one request:
curl "https://curlshot.com/api/v1/screenshot?access_key=YOUR_ACCESS_KEY&url=https://example.com" --output example.png
Start here
- Getting started: Take your first screenshot in about a minute. Send one request with a page address and get an image back.
- Authentication and API keys: How to send your access key, what the secret key and signatures are for, and how to rotate, revoke and protect your keys.
- The screenshot URL: How a screenshot request is built, when to use GET or POST, how to encode the page address, and what the response contains.
- Options reference: Every option of the screenshot API on one page, with its default, its limits and an example value.
Capture
- Devices: Capture a page as a phone, tablet, laptop or desktop would show it, using one option and a list of ready-made presets.
- Full-page screenshots: Capture a page from top to bottom, load lazy images on the way, and keep very tall pages under control.
- Capturing an element: Capture one element with a CSS selector, or a rectangle you choose, with an optional transparent background.
- PDF rendering: Turn any page into a PDF, choose the paper size, orientation and margins, or put the whole page on one long sheet.
- Scrolling videos: Record a video of a page scrolling from top to bottom, as MP4, WebM or GIF, and set its length, smoothness and size.
- HTML and Markdown input: Send your own HTML or Markdown and get it back as an image or PDF. Good for social cards, invoices and reports.
Control the page
- Blocking ads, cookie banners, trackers and chats: Remove ads, consent pop-ups, tracking scripts and chat widgets before the capture, and block any other request by type or pattern.
- Dark mode and emulation: Ask a site for its dark theme, stop animations, switch to print styles, and set the time zone, user agent and mobile mode.
- Waiting and timing: Decide the moment the capture is taken, with wait_until, delay, wait_for_selector and timeout, and what to do when a page times out.
- Custom CSS, JavaScript and clicks: Hide elements, add your own CSS, run JavaScript and click a button on the page before the capture is taken.
Deliver the result
- Caching: Store a screenshot once and reuse it for free. How cache, cache_ttl and cache_key work, and how to force a fresh render.
- Signed links: Put screenshot links in a web page without handing out a usable key. Signing steps, expiring links, signed status and bulk calls, six languages.
- Async and webhooks: Start a render in the background, then poll the job or let a webhook tell you when it is done. Includes signature checks in six languages.
- Bulk screenshots: Start up to 100 screenshots with one call, then follow the whole batch with one status request or receive each result by webhook.
Account and limits
- Usage and limits: How your monthly quota is counted, how to check what is left, and what the rate limit and concurrency headers on every answer mean.
- Errors: What a failed request looks like, which errors are safe to retry, and the cause and fix for every error code.
- The renderer as a bot: Who runs the screenshot renderer, why it visits a site, how it signs its requests (Web Bot Auth), where its key directory is, and how a site owner can block it.
Code examples
- cURL examples: Copy-and-paste cURL commands and shell scripts for screenshots, HTML input, JSON answers, retries, signed links and background jobs.
- Node.js examples: Runnable Node.js samples for screenshots, HTML input, JSON answers, retries, signed links and background jobs, with no packages to install.
- Python examples: Runnable Python samples for screenshots, HTML input, JSON answers, retries, signed links and background jobs, using requests and the standard library.
- PHP examples: Runnable PHP samples for screenshots, HTML input, JSON answers, retries, signed links and background jobs, using the curl extension and hash_hmac.
- Go examples: Runnable Go samples for screenshots, HTML input, JSON answers, retries, signed links and background jobs, using only the standard library.
- Ruby examples: Runnable Ruby samples for screenshots, HTML input, JSON answers, retries, signed links and background jobs, using net/http and openssl.
Integrations
- n8n screenshot node: Take website screenshots, PDFs and scrolling videos in n8n workflows with the community node, or with the built-in HTTP Request node.
Guides
- How to screenshot a page behind a login: Capture a page that needs a signed-in user by sending a session cookie, a header or HTTP credentials, and keep those secrets safe.
- How to add website previews to your app: Show a small thumbnail next to every link in your app, with small files, caching, signed links and a fallback image.
- How to generate Open Graph images from HTML: Design a 1200 by 630 share card in HTML and CSS, render it to an image with one POST request, and use it as your og:image.
- How to archive pages as PDF: Save web pages as clean PDF files, one at a time or in batches with webhooks, and keep your own copy of every file.
- Using the API from AI agents: Let an AI agent take screenshots through the MCP endpoint, and point it at the machine-readable docs, with advice on image size, caching and limits.
- Fix curl: (3) URL using bad/illegal format: Why curl stops with error 3, URL using bad/illegal format or missing URL, and how to fix each cause in bash, zsh, cmd and PowerShell.