Developer-first screenshot infrastructure
Screenshot API for Developers
Capture website screenshots with a simple API. Powered by cloud Playwright infrastructure.
API key auth
Rate limit + quota
Async jobs
Quick start
curl -X POST "https://api.page-ops.com/api/v1/screenshots" \
-H "Authorization: Bearer $SCREENSHOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'
Code examples
Copy-paste friendly. No SDK required.
API parameters
Endpoint: POST /api/v1/screenshots
Required
url
Common options
fullPage, viewport, format, quality, waitUntil, delayMs, selector
Sync mode constraints
If you request mode=sync, the server will fall back to async unless timeoutMs is provided and 0 < timeoutMs < 10000 and fullPage=false.
curl -X POST "http://api.page-ops.com/api/v1/screenshots" \
-H "Authorization: Bearer $SCREENSHOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'
import fetch from "node-fetch";
const resp = await fetch("http://api.page-ops.com/api/v1/screenshots", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.SCREENSHOT_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({ url: "https://example.com" })
});
console.log(await resp.json());
import os
import requests
resp = requests.post(
"http://api.page-ops.com/api/v1/screenshots",
headers={
"Authorization": f"Bearer {os.environ['SCREENSHOT_API_KEY']}",
"Content-Type": "application/json",
},
json={"url": "https://example.com"},
)
print(resp.json())
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
body := []byte(`{"url":"https://example.com"}`)
req, _ := http.NewRequest("POST", "http://api.page-ops.com/api/v1/screenshots", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SCREENSHOT_API_KEY"))
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)
}
Playground
Watch a full walkthrough of creating an API key and capturing a screenshot in the Console.
Tip: open the Console to try it yourself.
Demo
Features
Everything you need to ship reliable screenshots at scale.
Fast async jobs
Create a job, poll status, download results. Built for throughput.
API key auth
Developer-friendly Bearer tokens. Rotate keys with confidence.
Quota + rate limit
Protect your infra with plan-based usage control.
Playwright-powered
Modern browser rendering for real-world pages.
Multi-tenant workspaces
Separate environments and teams with workspace isolation.
Simple integration
A single HTTP request. Works from CI, cron, or your backend.
Use cases
Website Monitoring
Track broken layouts and outages with scheduled captures.
SEO Screenshot
Audit important pages and keep historical snapshots.
Social Media Preview
Generate preview images and OG assets automatically.
Visual Regression Testing
Diff screenshots in CI to catch UI bugs before release.
How it works
1) API request
POST a URL (and options) to create a screenshot job.
2) Cloud browser
We render it in an isolated browser environment.
3) Screenshot result
Poll status and fetch the final asset when ready.
Pricing
Simple pricing for developers.
🆓 Free
free
$0 / month
✔ 500 screenshots / month
✔ 10 req/min rate limit
✔ 1 workspace
✔ 3 API keys
-
Best for:
• Testing
• Side projects
🚀 Starter ⭐
starter
$9 / month
✔ 3500 screenshots / month
✔ 60 req/min rate limit
✔ 2 workspaces
✔ 6 API keys
≈ $2.57 / 1,000 screenshots
Best for:
• Indie developers
• Automation scripts
📈 Growth
growth
$29 / month
✔ 12000 screenshots / month
✔ 120 req/min rate limit
✔ 4 workspaces
✔ 15 API keys
≈ $2.42 / 1,000 screenshots
Best for:
• SaaS apps
• Monitoring
🏆 Pro
pro
$79 / month
✔ 35000 screenshots / month
✔ 300 req/min rate limit
✔ 10 workspaces
✔ 50 API keys
≈ $2.26 / 1,000 screenshots
Best for:
• Production workloads
• High-scale automation
FAQ
Do you support async jobs?
Yes. Create a job then query status until it completes.
How do rate limits work?
Limits are plan-based. Exceeding them returns HTTP 429.
What about quota?
Quota is enforced per rolling period. Exceeding returns HTTP 402.
Do you charge overage?
No. Usage resets monthly.
What happens if I hit the limit?
Requests are paused until next billing cycle.
Do you support full-page screenshots?
Yes (paid plans).
Can I rotate API keys?
Yes. Create and rotate keys from the Console.
Start capturing screenshots today
Get an API key and ship your first integration in minutes.