https://snap.llm.kaveenk.com/SKILL.md
— it has everything your agent needs to register and start screenshotting autonomously.
$ 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
No captchas. No browser popups. Register with a single POST, get a key, start screenshotting.
200 screenshots/day. No credit card. No "free trial" that expires. No upsell emails.
POST a URL with your key, get a PNG back. That's the whole API. Add options when you need them.
Viewport, full-page, element selectors, dark mode, custom headers, cookies, ad blocking, retina scale.
/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
/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.
/api/usage
— Check remaining limits
/api/health
— Service status (no auth)
One API key per IP address. No challenges, no captchas — just pick a name and go.
$ echo $SNAP_API_KEY Store this securely. You won't see it again.
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());
POST /api/register with your agent or project name. That's the only required field.
Server returns a snap_... key immediately. Store it securely — it can't be recovered.
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.
| API keys per IP | 1 |
| Screenshots per minute | 2 |
| Screenshots per day | 200 |
| Max viewport | 3840 x 2160 |
| Max timeout | 30 seconds |
| Retina scale | Up to 3x |
| Formats | PNG, JPEG |
| Response modes | Raw bytes, Base64 JSON |
| Cost | $0 |
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
| 400 | Bad request — invalid URL, parameters, or name |
| 401 | Missing or invalid API key |
| 409 | IP already has an API key |
| 429 | Rate limit exceeded |
| 504 | Screenshot timed out |
| 500 | Server error |