Ever needed to capture a screenshot of a website programmatically? Maybe for generating link previews, monitoring pages, or creating PDF reports. Here's how to do it with Python in just a few lines.
The Problem
Taking website screenshots programmatically usually means setting up headless Chrome, installing Playwright or Puppeteer, managing browser instances, handling timeouts, and dealing with all the edge cases. It's a lot of infrastructure for what should be a simple task.
The Simple Way
ScreenshotAPIs is an API that handles all of that for you. Send a URL, get back an image or PDF.
1. Get Your API Key
Sign up at screenshotapis.org — the free plan gives you 100 screenshots per month.
2. Take a Screenshot
import requests
response = requests.post(
"https://screenshotapis.org/v1/screenshot",
headers={"X-API-Key": "your_api_key_here"},
json={"url": "https://github.com"}
)
with open("screenshot.png", "wb") as f:
f.write(response.content)
That's it. Three lines of real code (plus the import and file save).
3. Customize It
You can control the output format, viewport size, and more:
response = requests.post(
"https://screenshotapis.org/v1/screenshot",
headers={"X-API-Key": "your_api_key_here"},
json={
"url": "https://github.com",
"format": "jpeg",
"width": 1280,
"height": 720,
"full_page": True
}
)
Supported options:
-
format—png,jpeg, orwebp -
width/height— viewport dimensions -
full_page— capture the entire scrollable page -
delay_ms— wait before capturing (useful for pages with animations)
Generate PDFs Too
Same API, different endpoint:
response = requests.post(
"https://screenshotapis.org/v1/pdf",
headers={"X-API-Key": "your_api_key_here"},
json={"url": "https://github.com"}
)
with open("page.pdf", "wb") as f:
f.write(response.content)
Render Raw HTML
Don't have a URL? You can pass HTML directly:
response = requests.post(
"https://screenshotapis.org/v1/screenshot",
headers={"X-API-Key": "your_api_key_here"},
json={
"html": "<h1>Hello World</h1><p>Rendered as an image.</p>",
"width": 800,
"height": 400
}
)
This is great for generating OG images, email previews, or dynamic social cards.
Node.js? Same Thing
const response = await fetch("https://screenshotapis.org/v1/screenshot", {
method: "POST",
headers: {
"X-API-Key": "your_api_key_here",
"Content-Type": "application/json"
},
body: JSON.stringify({ url: "https://github.com" })
});
const buffer = await response.arrayBuffer();
require("fs").writeFileSync("screenshot.png", Buffer.from(buffer));
Use Cases
- Link previews — Show a thumbnail of any URL in your app
- PDF reports — Convert dashboards or pages to downloadable PDFs
- OG images — Generate dynamic social media preview images from HTML templates
- Monitoring — Take periodic screenshots to track visual changes on a page
- Archiving — Save snapshots of web pages for compliance or records
Pricing
The free tier gives you 100 captures per month. Paid plans start at $19/month for 2,000 captures. There are also one-time credit packs if you don't need a subscription.
Check it out at screenshotapis.org.
Top comments (0)