screenshot.tools.town
Live · API v1

Screenshot any URL
via one API call

Send a URL, get back a signed PNG. No headless browser to operate, no infrastructure to maintain. Pay-as-you-go: ₹99 for 100 renders.

$ curl -s -X POST https://screenshot.tools.town/v1/capture \
  -H "X-API-Key: tt_xxxx" \
  -d '{"url":"https://example.com"}' | jq .image_url

Try it live — no login required

3 free captures per IP · No login required · Public HTTPS URLs only

Everything you need. Nothing you don't.

A thin, focused API built on Cloudflare Browser Rendering. Fast cold-start, global edge, no servers.

Full-page screenshots

Capture the entire page or just the viewport. Configurable width and height.

Signed URLs

Every response includes a time-limited signed URL to your PNG — served from Cloudflare R2.

Zero cold-start

Cloudflare Workers + Browser Rendering. Your request executes at the edge nearest your user.

SSRF protection

Private IPs, localhost, link-local, and redirect chains to internal hosts are blocked before browser launch.

waitForSelector

Pass a CSS selector. The browser waits for it to appear before taking the screenshot.

Credit balance in response

Every response includes balance_after. Know when to top up without hitting the dashboard.

Integrate in minutes

One endpoint. Any language. Any runtime.

curl
curl -s -X POST https://screenshot.tools.town/v1/capture \
  -H "X-API-Key: tt_xxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://myapp.com/og-card/123",
    "viewport": { "width": 1200, "height": 630 },
    "fullPage": false
  }'
JavaScript / TypeScript
const res = await fetch('https://screenshot.tools.town/v1/capture', {
  method: 'POST',
  headers: {
    'X-API-Key': process.env.SCREENSHOT_API_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ url: 'https://myapp.com/og-card/123' }),
});
const { image_url, balance_after } = await res.json();
console.log(image_url); // https://media.surror.workers.dev/v1/raw?token=...
Python
import httpx, os

r = httpx.post(
    "https://screenshot.tools.town/v1/capture",
    headers={"X-API-Key": os.environ["SCREENSHOT_API_KEY"]},
    json={"url": "https://myapp.com/og-card/123"},
)
data = r.json()
print(data["image_url"])
200 OK
{
  "media_id": "018f3e1a-...",
  "image_url": "https://media.surror.workers.dev/v1/raw?token=...",
  "expires_at": "2026-04-13T12:00:00Z",
  "content_type": "image/png",
  "byte_size": 42318,
  "balance_after": 99
}

Simple, pay-as-you-go pricing

No subscriptions. Buy a render pack, use it whenever. Credits never expire.

₹99
100 renders
₹0.99/render
₹399
500 renders
₹0.80/render
Most popular
₹1,299
2,000 renders
₹0.65/render
₹4,999
10,000 renders
₹0.50/render
Buy a render pack

Full pricing details →

Common questions

Do credits expire?

No. Credits never expire. Buy a pack and use it whenever you need.

What happens if a capture fails?

Credits are debited only after a successful capture. Auth failures, SSRF blocks, and rate limits never consume a credit.

Can I use this for internal URLs?

No. Private IPs (RFC1918, localhost, link-local) are blocked for security. The URL must be a public HTTPS address.

How long are image URLs valid?

Signed image URLs expire after 24 hours by default. The exact expiry is in the expires_at field of every response.

Is there a rate limit?

Yes: 60 captures per minute per API key. Contact us if you need a higher limit.

Where is the Worker deployed?

Cloudflare Workers — global edge. Your request runs in the region nearest the caller.

Ready to automate screenshots?

Create an account, buy 100 renders for ₹99, and make your first API call in under 5 minutes.

Get started