A URL in the query string, an image in the response body. Nothing to install, no SDK, no second round trip to fetch the file.
# PNG at a custom viewport
curl -o out.png "https://api.screenshotline.com/take?url=https%3A%2F%2Fexample.com&viewport_width=1440&access_key=KEY"
# JPEG at 70% quality
curl -o out.jpg "https://api.screenshotline.com/take?url=https%3A%2F%2Fexample.com&format=jpeg&quality=70&access_key=KEY"
# Just one element
curl -o card.png "https://api.screenshotline.com/take?url=https%3A%2F%2Fexample.com&selector=%23pricing&access_key=KEY"
A queue of URLs in, a folder of images out. Failed renders are not billed.
device_scale_factor=2 for displays that deserve it.
Pass a CSS selector and get just that component.
HMAC over the query, so a key never appears in a page anyone can view-source.
Most screenshot failures are not crashes. They are a 200 with the wrong picture — a consent wall, a half-loaded page, a blank frame your pipeline records as a success. These are the ones a 202-page benchmark of the real web actually found:
18 news front pages — consent walls, lazy images, heavy embeds — captured through three APIs on the same day at the same viewport.
| 18 news pages | Screenshotline | ScreenshotOne | ApiFlash |
|---|---|---|---|
| Captured | 18/18 | 17/18 | 18/18 |
| timesofindia.com | 414 KB | 261 KB | 358 KB |
Free: 500 renders a month, no credit card. Then $17 for 2,000, $79 for 10,000, $259 for 50,000 — with overage priced below the plan rate, so a spiky month costs less per render rather than more.
Failed renders and cache hits are never billed. Most APIs promise that; blank detection is what lets this one mean it literally.
The renderer is AGPL-3.0 and self-hostable — the same code that runs here, with nothing held back for the hosted version. Read it before you trust it, or run it yourself. The paid product is the hosted API: a warm browser pool, a cache, and someone else's pager.