Screenshot as a Service
Free screenshot API for agents and automations. Powered by Chromium.
Using an AI agent? Send it this link: https://snap.llm.kaveenk.com/SKILL.md — it has everything your agent needs to register and start screenshotting autonomously.
demo
$ curl -X POST https://snap.llm.kaveenk.com/api/screenshot \
  -H "Authorization: Bearer snap_yourkey" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com"}' \
  -o screenshot.png

200 OK | 15KB | 0.5s | remaining: 1/min, 199/day
>_

Agent-native

No captchas. No browser popups. Register with a single POST, get a key, start screenshotting.

$0

Free. Actually free.

200 screenshots/day. No credit card. No "free trial" that expires. No upsell emails.

{}

One endpoint

POST a URL with your key, get a PNG back. That's the whole API. Add options when you need them.

|||

Full control

Viewport, full-page, element selectors, dark mode, custom headers, cookies, ad blocking, retina scale.

API Reference

POST
/api/register — Get an API key (one per IP)
// No auth required. One key per IP address.
{
  "name": "my-agent",           // required, 1-64 chars
  "email": "[email protected]"    // optional
}

// Returns:
{
  "key": "snap_abc123...",     // store securely!
  "limits": { "per_minute": 2, "per_day": 200 }
}

// 409 if this IP already has a key
POST
/api/screenshot — Capture a URL
Authorization: Bearer snap_yourkey

{
  "url": "https://example.com",  // required
  "width": 1280,                 // 320-3840
  "height": 800,                 // 200-2160
  "fullPage": false,             // entire scrollable page
  "format": "png",               // "png" or "jpeg"
  "quality": 80,                 // jpeg quality 1-100
  "selector": "#main",           // CSS element selector
  "darkMode": false,             // prefers-color-scheme: dark
  "deviceScale": 1,              // retina 1-3x
  "delay": 0,                    // ms after load, 0-5000
  "waitFor": "load",             // load | domcontentloaded | networkidle
  "timeout": 15000,              // max wait 1000-30000ms
  "blockAds": false,             // block ad/tracker domains
  "userAgent": "...",            // custom User-Agent
  "cookies": [{...}],            // [{name, value, domain}]
  "headers": {...},              // custom request headers
  "response": "json"             // base64 JSON instead of raw bytes
}

Default: raw image bytes. Use Accept: application/json or "response": "json" for base64.

GET
/api/usage — Check remaining limits
GET
/api/health — Service status (no auth)

Get Your API Key

One API key per IP address. No challenges, no captchas — just pick a name and go.

Quick Start

Full registration + screenshot flow. Pick your language:

# Register (one-time, one key per IP)
KEY=$(curl -s -X POST https://snap.llm.kaveenk.com/api/register \
  -H "Content-Type: application/json" \
  -d '{"name":"my-agent"}' \
  | jq -r .key)

# Screenshot
curl -s -X POST https://snap.llm.kaveenk.com/api/screenshot \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}' \
  -o screenshot.png
import requests

# Register (one-time, one key per IP)
key = requests.post("https://snap.llm.kaveenk.com/api/register",
    json={"name": "my-agent"}).json()["key"]

# Screenshot
img = requests.post("https://snap.llm.kaveenk.com/api/screenshot",
    headers={"Authorization": f"Bearer {key}"},
    json={"url": "https://example.com", "format": "jpeg"})
open("shot.jpg", "wb").write(img.content)
// Register (one-time, one key per IP)
const { key } = await fetch("https://snap.llm.kaveenk.com/api/register", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ name: "my-agent" })
}).then(r => r.json());

// Screenshot
const img = await fetch("https://snap.llm.kaveenk.com/api/screenshot", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${key}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({ url: "https://example.com" })
}).then(r => r.arrayBuffer());

How Registration Works

1

POST your name

POST /api/register with your agent or project name. That's the only required field.

2

Get your API key

Server returns a snap_... key immediately. Store it securely — it can't be recovered.

3

Start screenshotting

Use your key in the Authorization: Bearer header. 2/min, 200/day.

One API key per IP address. No challenges, no captchas, no waiting. Abuse is handled by rate limiting.

Free Tier

API keys per IP1
Screenshots per minute2
Screenshots per day200
Max viewport3840 x 2160
Max timeout30 seconds
Retina scaleUp to 3x
FormatsPNG, JPEG
Response modesRaw bytes, Base64 JSON
Cost$0

Response Headers

When receiving raw image bytes, metadata is in headers:

X-Snap-Title: Example%20Domain    // page title
X-Snap-Duration: 584              // ms
X-Snap-Remaining-Min: 1           // minute quota
X-Snap-Remaining-Day: 199         // daily quota
X-Request-ID: a1b2c3d4e5f6a7b8   // for debugging

Error Codes

400Bad request — invalid URL, parameters, or name
401Missing or invalid API key
409IP already has an API key
429Rate limit exceeded
504Screenshot timed out
500Server error