Capture screenshots, PDFs, markdown, crawls, video, forensic packs, and structured extracts over a simple HTTPS API. Authenticate with an API key from the dashboard.
Most capture endpoints respond with 202 Accepted and a jobId. Artifact download URLs are signed and returned on the job detail payload.
curl -X POST 'https://api.sitescreens.com/v1/screenshot' \
-H 'Authorization: Bearer ssk_your_api_key' \
-H 'Content-Type: application/json' \
-d '{"url":"https://example.com","device":"mobile"}'API errors use standard HTTP status codes. Validation responses include details from schema checks.
Check your API key, plan entitlement, organization credit balance, and per-key limits before retrying a failed request.
| Status | Meaning |
|---|---|
400 | Validation failed — body includes details from schema checks. |
401 | Missing or invalid API key / session. |
402 | Insufficient organization credits. |
403 | Plan feature not available, account blocked, or immutable artifact. |
404 | Resource not found. |
429 | API key daily/weekly/monthly credit limit exceeded (period, limit, spent, requested). |
500 | Unexpected server error. |
Overlay cleanup, proxies, and wait conditions are shared across capture endpoints.
/v1/healthLiveness probe for the API.
Auth: None (public)
No required parameters.
curl -X GET 'https://api.sitescreens.com/v1/health'
{
"ok": true,
"service": "sitescreens-api"
}/v1/plansPublic plan definitions, features, and credit allotments.
Auth: None (public)
No required parameters.
curl -X GET 'https://api.sitescreens.com/v1/plans'
{
"plans": [
{
"id": "starter",
"name": "Starter",
"creditsPerMonth": 2000,
"features": {
"crawl": true,
"batch": true,
"video": false
}
}
]
}/v1/screenshotQueue a viewport or full-page screenshot. Free plans may watermark results. Poll GET /v1/jobs/:id for status and signed artifact URLs.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
urlrequired | body | string (url) | Page URL to capture. |
| Name | In | Type | Description | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
fullPage | body | boolean | Capture the full scrollable page. Costs 2 credits instead of 1. Default: false | ||||||||||||||||||||||||||||||||||||||||||||
format | body | "png" | "jpeg" | "webp" | Image output format. Default: "png" | ||||||||||||||||||||||||||||||||||||||||||||
device | body | "desktop" | "mobile" | "tablet" | Device viewport preset. Default: "desktop" | ||||||||||||||||||||||||||||||||||||||||||||
resolution | body | string (preset id | "custom") | Named viewport preset id, or "custom" with width/height. Availability depends on your plan (larger sizes need higher plans).
| ||||||||||||||||||||||||||||||||||||||||||||
width | body | integer (320–3840) | Viewport width override. | ||||||||||||||||||||||||||||||||||||||||||||
height | body | integer (240–2160) | Viewport height override. | ||||||||||||||||||||||||||||||||||||||||||||
deviceScaleFactor | body | number (1–3) | Device pixel ratio. Default: 1 | ||||||||||||||||||||||||||||||||||||||||||||
darkMode | body | boolean | Emulate prefers-color-scheme: dark. Default: false | ||||||||||||||||||||||||||||||||||||||||||||
delayMs | body | integer (0–30000) | Extra wait after navigation before capture. Default: 0 | ||||||||||||||||||||||||||||||||||||||||||||
selector | body | string | CSS selector to screenshot instead of the full viewport. | ||||||||||||||||||||||||||||||||||||||||||||
useProxy | body | boolean | Route the capture through your configured proxy pool. Pro+. Default: false | ||||||||||||||||||||||||||||||||||||||||||||
proxy | body | string | Proxy label or URL (for example "us"). Implies geo/proxy feature (Pro+). | ||||||||||||||||||||||||||||||||||||||||||||
waitUntil | body | "load" | "domcontentloaded" | "networkidle" | Playwright navigation wait condition. Default: "networkidle" | ||||||||||||||||||||||||||||||||||||||||||||
webhookUrl | body | string (url) | Per-job webhook override. Receives job.succeeded / job.failed events. | ||||||||||||||||||||||||||||||||||||||||||||
overlayMode | body | "cut" | "pass" | "disable" | Shorthand overlay policy applied to cookies, ads, and modals. | ||||||||||||||||||||||||||||||||||||||||||||
overlays | body | object | Per-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000). |
{
"url": "https://example.com",
"device": "mobile",
"resolution": "mobile_390x844",
"fullPage": false,
"format": "png",
"overlayMode": "cut"
}{
"jobId": "job_01HXYZ...",
"reservedCredits": 1,
"status": "queued"
}/v1/scrapeQueue a PDF export or text/markdown extraction. Relative links in markdown/text are rewritten to absolute URLs. Requires Starter+.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
urlrequired | body | string (url) | Page URL to scrape. |
formatrequired | body | "pdf" | "text" | "markdown" | Output format. Maps to job kind pdf, text, or markdown. |
| Name | In | Type | Description |
|---|---|---|---|
useProxy | body | boolean | Route the capture through your configured proxy pool. Pro+. Default: false |
proxy | body | string | Proxy label or URL (for example "us"). Implies geo/proxy feature (Pro+). |
waitUntil | body | "load" | "domcontentloaded" | "networkidle" | Playwright navigation wait condition. Default: "networkidle" |
webhookUrl | body | string (url) | Per-job webhook override. Receives job.succeeded / job.failed events. |
overlayMode | body | "cut" | "pass" | "disable" | Shorthand overlay policy applied to cookies, ads, and modals. |
overlays | body | object | Per-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000). |
{
"url": "https://example.com",
"format": "markdown",
"overlays": {
"ads": "cut"
}
}{
"jobId": "job_01HXYZ...",
"reservedCredits": 2,
"status": "queued"
}/v1/crawlCrawl a site into a multi-page markdown pack plus JSONL for agents and RAG. Requires Starter+. maxPages is capped by your plan.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
urlrequired | body | string (url) | Start URL. |
| Name | In | Type | Description |
|---|---|---|---|
maxPages | body | integer (1–5000) | Maximum pages to visit. Credit cost scales with this value. Default: 25 |
maxDepth | body | integer (0–10) | Link depth from the start URL. Default: 2 |
sameOrigin | body | boolean | Stay on the same origin as the start URL. Default: true |
includeSubdomains | body | boolean | Allow sibling subdomains when crawling. Default: false |
respectRobotsTxt | body | boolean | Honor robots.txt disallow rules. Default: true |
useProxy | body | boolean | Route the capture through your configured proxy pool. Pro+. Default: false |
proxy | body | string | Proxy label or URL (for example "us"). Implies geo/proxy feature (Pro+). |
waitUntil | body | "load" | "domcontentloaded" | "networkidle" | Playwright navigation wait condition. Default: "networkidle" |
webhookUrl | body | string (url) | Per-job webhook override. Receives job.succeeded / job.failed events. |
overlayMode | body | "cut" | "pass" | "disable" | Shorthand overlay policy applied to cookies, ads, and modals. |
overlays | body | object | Per-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000). |
{
"url": "https://example.com",
"maxPages": 10,
"maxDepth": 2,
"overlayMode": "cut"
}{
"jobId": "job_01HXYZ...",
"reservedCredits": 10,
"status": "queued"
}/v1/videoRecord a short scrolling product-demo video (WebM or MP4). Requires Pro+.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
urlrequired | body | string (url) | Page URL to record. |
| Name | In | Type | Description | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
seconds | body | integer (3–30) | Clip length in seconds (capped by plan). Default: 10 | ||||||||
format | body | "webm" | "mp4" | Video container format. Default: "webm" | ||||||||
scroll | body | boolean | Auto-scroll the page during recording. Default: true | ||||||||
device | body | "desktop" | "mobile" | "tablet" | Device viewport preset. Used for default width/height when those fields are omitted. Default: "desktop"
| ||||||||
width | body | integer (320–1920) | Custom viewport width. If omitted, defaults by device: desktop 1280, mobile 390, tablet 834. Default: desktop 1280 · mobile 390 · tablet 834 | ||||||||
height | body | integer (240–1080) | Custom viewport height. If omitted, defaults by device: desktop 720, mobile 844, tablet 1112. Default: desktop 720 · mobile 844 · tablet 1112 | ||||||||
useProxy | body | boolean | Route the capture through your configured proxy pool. Pro+. Default: false | ||||||||
proxy | body | string | Proxy label or URL (for example "us"). Implies geo/proxy feature (Pro+). | ||||||||
waitUntil | body | "load" | "domcontentloaded" | "networkidle" | Playwright navigation wait condition. Default: "networkidle" | ||||||||
webhookUrl | body | string (url) | Per-job webhook override. Receives job.succeeded / job.failed events. | ||||||||
overlayMode | body | "cut" | "pass" | "disable" | Shorthand overlay policy applied to cookies, ads, and modals. | ||||||||
overlays | body | object | Per-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000). |
{
"url": "https://example.com",
"seconds": 8,
"format": "webm",
"scroll": true,
"device": "desktop"
}{
"jobId": "job_01HXYZ...",
"reservedCredits": 10,
"status": "queued"
}/v1/forensicCapture a timestamped evidence pack: screenshot, content hash, and manifest. Optionally mark artifacts immutable so they cannot be deleted. Requires Starter+.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
urlrequired | body | string (url) | Page URL to capture as evidence. |
| Name | In | Type | Description | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
immutable | body | boolean | Prevent deletion of resulting artifacts via DELETE /v1/artifacts/:id. Default: false | ||||||||||||||||||||||||||||||||||||||||||||
includeMarkdown | body | boolean | Also include a markdown snapshot in the pack. Default: true | ||||||||||||||||||||||||||||||||||||||||||||
fullPage | body | boolean | Full-page screenshot in the pack. Default: false | ||||||||||||||||||||||||||||||||||||||||||||
format | body | "png" | "jpeg" | "webp" | Screenshot image format. Default: "png" | ||||||||||||||||||||||||||||||||||||||||||||
device | body | "desktop" | "mobile" | "tablet" | Device viewport preset. Default: "desktop" | ||||||||||||||||||||||||||||||||||||||||||||
resolution | body | string (preset id | "custom") | Named viewport preset id, or "custom" with width/height. Availability depends on your plan (larger sizes need higher plans).
| ||||||||||||||||||||||||||||||||||||||||||||
width | body | integer (320–3840) | Viewport width override. | ||||||||||||||||||||||||||||||||||||||||||||
height | body | integer (240–2160) | Viewport height override. | ||||||||||||||||||||||||||||||||||||||||||||
useProxy | body | boolean | Route the capture through your configured proxy pool. Pro+. Default: false | ||||||||||||||||||||||||||||||||||||||||||||
proxy | body | string | Proxy label or URL (for example "us"). Implies geo/proxy feature (Pro+). | ||||||||||||||||||||||||||||||||||||||||||||
waitUntil | body | "load" | "domcontentloaded" | "networkidle" | Playwright navigation wait condition. Default: "networkidle" | ||||||||||||||||||||||||||||||||||||||||||||
webhookUrl | body | string (url) | Per-job webhook override. Receives job.succeeded / job.failed events. | ||||||||||||||||||||||||||||||||||||||||||||
overlayMode | body | "cut" | "pass" | "disable" | Shorthand overlay policy applied to cookies, ads, and modals. | ||||||||||||||||||||||||||||||||||||||||||||
overlays | body | object | Per-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000). |
{
"url": "https://example.com",
"immutable": true,
"includeMarkdown": true,
"fullPage": true
}{
"jobId": "job_01HXYZ...",
"reservedCredits": 3,
"status": "queued"
}/v1/extractExtract structured JSON from a page according to your schema. Relative URL strings in the result are rewritten to absolute URLs. Requires Pro+.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
urlrequired | body | string (url) | Page URL to extract from. |
schemarequired | body | object | JSON Schema-like object describing the fields to extract. |
| Name | In | Type | Description |
|---|---|---|---|
prompt | body | string (≤4000) | Optional extraction instructions appended to the operator prompt. |
useProxy | body | boolean | Route the capture through your configured proxy pool. Pro+. Default: false |
proxy | body | string | Proxy label or URL (for example "us"). Implies geo/proxy feature (Pro+). |
waitUntil | body | "load" | "domcontentloaded" | "networkidle" | Playwright navigation wait condition. Default: "networkidle" |
webhookUrl | body | string (url) | Per-job webhook override. Receives job.succeeded / job.failed events. |
overlayMode | body | "cut" | "pass" | "disable" | Shorthand overlay policy applied to cookies, ads, and modals. |
overlays | body | object | Per-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000). |
{
"url": "https://example.com",
"schema": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"price": {
"type": "string"
}
},
"required": [
"title"
]
}
}{
"jobId": "job_01HXYZ...",
"reservedCredits": 7,
"status": "queued"
}/v1/summaryScrape a single URL, an explicit URL list, or crawl a site, then produce per-page summaries plus an overall rollup. Requires Pro+ and a configured LLM endpoint on the worker. Credits: 5 per page summarized (+ proxy).
Auth: API key or session required
No required parameters.
| Name | In | Type | Description |
|---|---|---|---|
url | body | string (url) | Start/page URL. Required for single and crawl modes. |
urls | body | string[] (urls) | Explicit list of 2–50 URLs (exclusive with crawl). |
crawl | body | boolean | When true with url, BFS-crawl up to maxPages/maxDepth. Default: false |
maxPages | body | integer | Crawl page budget (plan-capped). Default: 25 |
maxDepth | body | integer | Crawl link depth. Default: 2 |
sameOrigin | body | boolean | Restrict crawl to the same origin. Default: true |
includeSubdomains | body | boolean | Allow subdomains when sameOrigin is true. Default: false |
respectRobotsTxt | body | boolean | Honor robots.txt Disallow rules during crawl. Default: true |
focus | body | string (≤2000) | Optional emphasis hint for the summarizer. |
length | body | "short" | "medium" | "long" | Summary length preset. Default: "medium" |
useProxy | body | boolean | Route the capture through your configured proxy pool. Pro+. Default: false |
proxy | body | string | Proxy label or URL (for example "us"). Implies geo/proxy feature (Pro+). |
waitUntil | body | "load" | "domcontentloaded" | "networkidle" | Playwright navigation wait condition. Default: "networkidle" |
webhookUrl | body | string (url) | Per-job webhook override. Receives job.succeeded / job.failed events. |
overlayMode | body | "cut" | "pass" | "disable" | Shorthand overlay policy applied to cookies, ads, and modals. |
overlays | body | object | Per-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000). |
{
"url": "https://example.com",
"crawl": true,
"maxPages": 10,
"maxDepth": 2,
"length": "medium"
}{
"jobId": "job_01HXYZ...",
"reservedCredits": 50,
"status": "queued"
}/v1/jobsList jobs for your organization with optional filters and pagination.
Auth: API key or session required
No required parameters.
| Name | In | Type | Description |
|---|---|---|---|
status | query | "queued" | "running" | "succeeded" | "failed" | Filter by job status. Invalid values are ignored. |
kind | query | string | Exact job kind filter (screenshot, markdown, crawl, …). |
q | query | string | Case-insensitive search against job URL or job id. |
from | query | string (ISO datetime) | Inclusive lower bound on createdAt. |
to | query | string (ISO datetime) | Inclusive upper bound on createdAt. |
limit | query | integer (≥1, ≤100) | Page size. Default: 25 |
offset | query | integer (≥0) | Number of jobs to skip. Default: 0 |
curl -X GET 'https://api.sitescreens.com/v1/jobs?status=succeeded&limit=25&offset=0' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"jobs": [
{
"id": "job_01HXYZ...",
"kind": "screenshot",
"status": "succeeded",
"url": "https://example.com",
"reservedCredits": 1,
"settledCredits": 1,
"createdAt": "2026-08-11T10:00:00.000Z",
"faviconUrl": "https://api.sitescreens.com/v1/files?key=...&sig=..."
}
],
"total": 1,
"limit": 25,
"offset": 0
}/v1/jobs/:idFetch a single job including signed artifact download URLs (typically valid ~1 hour).
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Job id returned from a create call. |
curl -X GET 'https://api.sitescreens.com/v1/jobs/job_01HXYZ...' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"job": {
"id": "job_01HXYZ...",
"kind": "screenshot",
"status": "succeeded",
"url": "https://example.com",
"reservedCredits": 1,
"settledCredits": 1,
"error": null,
"meta": {
"overlaysDetected": []
},
"createdAt": "2026-08-11T10:00:00.000Z",
"finishedAt": "2026-08-11T10:00:08.000Z",
"artifacts": [
{
"id": "art_01...",
"contentType": "image/png",
"byteSize": 184220,
"contentHash": "sha256:…",
"watermarked": false,
"immutable": false,
"url": "https://api.sitescreens.com/v1/artifacts/art_01...?exp=...&sig=..."
}
]
}
}/v1/artifacts/:idSoft-delete an artifact you own. Immutable forensic artifacts cannot be deleted.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Artifact id. |
curl -X DELETE 'https://api.sitescreens.com/v1/artifacts/art_01...' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"ok": true
}/v1/artifacts/:idBinary download for an artifact. Requires a valid exp and sig query signature from a job response — not an API key.
Auth: None (public)
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Artifact id. |
exprequired | query | string | Signature expiry timestamp. |
sigrequired | query | string | HMAC signature from the job artifact URL. |
curl -X GET 'https://api.sitescreens.com/v1/artifacts/art_01...?exp=1723370000&sig=%E2%80%A6'
{
"note": "Binary response body with Content-Type from the artifact (image/png, application/pdf, text/markdown, …)."
}/v1/batchEnqueue many URLs in one request. Per-URL failures are returned in results without failing the whole batch. Requires Starter+. URL count is limited by plan maxBatchSize.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
kindrequired | body | "screenshot" | "markdown" | "text" | "pdf" | Job kind applied to every URL. |
urlsrequired | body | string[] (urls) | List of URLs (1–500, capped by plan). |
| Name | In | Type | Description |
|---|---|---|---|
options | body | object | Shared options: fullPage, device, width, height, resolution (screenshot), useProxy, proxy, overlayMode, overlays, webhookUrl. |
{
"kind": "screenshot",
"urls": [
"https://example.com",
"https://example.org"
],
"options": {
"device": "desktop",
"fullPage": false,
"overlayMode": "cut"
}
}{
"batchSize": 2,
"queued": 2,
"failed": 0,
"results": [
{
"url": "https://example.com",
"jobId": "job_01...",
"reservedCredits": 1
},
{
"url": "https://example.org",
"jobId": "job_02...",
"reservedCredits": 1
}
]
}/v1/monitorsList change monitors for your organization.
Auth: API key or session required
No required parameters.
curl -X GET 'https://api.sitescreens.com/v1/monitors' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"monitors": [
{
"id": "mon_01...",
"name": "example.com",
"url": "https://example.com",
"intervalMinutes": 60,
"thresholdPercent": 2,
"enabled": true,
"lastCheckedAt": "2026-08-11T09:00:00.000Z",
"nextRunAt": "2026-08-11T10:00:00.000Z"
}
]
}/v1/monitorsSchedule recurring visual/content checks. Requires Starter+. Count limited by plan.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
urlrequired | body | string (url) | URL to monitor. |
| Name | In | Type | Description |
|---|---|---|---|
name | body | string (1–80) | Display name. Defaults to the hostname. |
intervalMinutes | body | integer (5–10080) | Check interval in minutes. Default: 60 |
thresholdPercent | body | number (0–100) | Visual diff threshold that counts as a change. Default: 2 |
fullPage | body | boolean | Capture full-page screenshots for comparisons. Default: false |
device | body | "desktop" | "mobile" | "tablet" | Viewport preset. Default: "desktop" |
webhookUrl | body | string (url) | Per-monitor webhook for monitor.changed / monitor.unchanged. |
enabled | body | boolean | Whether the monitor is active. Default: true |
forensicOnChange | body | boolean | Queue a forensic pack when a change is detected. Default: false |
overlayMode | body | "cut" | "pass" | "disable" | Overlay shorthand for monitor captures. |
overlays | body | object | Per-category overlay settings. |
{
"url": "https://example.com",
"intervalMinutes": 60,
"thresholdPercent": 2,
"overlayMode": "cut"
}{
"monitor": {
"id": "mon_01...",
"name": "example.com",
"url": "https://example.com",
"intervalMinutes": 60,
"thresholdPercent": 2,
"enabled": true
}
}/v1/monitors/:idFetch a single monitor by id.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Monitor id. |
curl -X GET 'https://api.sitescreens.com/v1/monitors/mon_01...' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"monitor": {
"id": "mon_01...",
"name": "example.com",
"url": "https://example.com",
"intervalMinutes": 60,
"enabled": true
}
}/v1/monitors/:idPartial update of monitor settings. Body fields match create (all optional).
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Monitor id. |
| Name | In | Type | Description |
|---|---|---|---|
enabled | body | boolean | Pause or resume the monitor. |
intervalMinutes | body | integer | New check interval. |
thresholdPercent | body | number | New visual change threshold. |
name | body | string | Display name. |
webhookUrl | body | string (url) | Webhook URL override. |
{
"enabled": false,
"intervalMinutes": 120
}{
"monitor": {
"id": "mon_01...",
"enabled": false,
"intervalMinutes": 120
}
}/v1/monitors/:idRemove a monitor.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Monitor id. |
curl -X DELETE 'https://api.sitescreens.com/v1/monitors/mon_01...' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"ok": true
}/v1/monitors/:id/historyRecent monitor runs with change flags and screenshot URLs.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Monitor id. |
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer (1–100) | Max runs to return. Default: 50 |
curl -X GET 'https://api.sitescreens.com/v1/monitors/mon_01.../history?limit=20' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"monitor": {
"id": "mon_01...",
"url": "https://example.com"
},
"runs": [
{
"id": "run_01...",
"jobId": "job_01...",
"changed": true,
"contentChanged": true,
"visualChanged": true,
"diffPercent": 4.2,
"createdAt": "2026-08-11T09:00:00.000Z",
"screenshotUrl": "https://api.sitescreens.com/v1/artifacts/...?exp=...&sig=..."
}
]
}/v1/monitors/:id/compareSide-by-side comparison of two monitor runs.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Monitor id. |
leftrequired | query | string | Left run id. |
rightrequired | query | string | Right run id. |
curl -X GET 'https://api.sitescreens.com/v1/monitors/mon_01.../compare?left=run_01...&right=run_02...' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"monitor": {
"id": "mon_01..."
},
"left": {
"id": "run_01...",
"screenshot": {
"url": "…"
}
},
"right": {
"id": "run_02...",
"screenshot": {
"url": "…"
}
}
}/v1/rag/sourcesList allowlisted RAG sync sources. Requires Pro+ to create/sync.
Auth: API key or session required
No required parameters.
curl -X GET 'https://api.sitescreens.com/v1/rag/sources' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"sources": [
{
"id": "rag_01...",
"name": "example.com",
"startUrl": "https://example.com",
"allowlistHosts": [
"example.com"
],
"maxPages": 25,
"enabled": true
}
]
}/v1/rag/sourcesAdd an allowlisted site for recurring knowledge-pack sync. Requires Pro+.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
startUrlrequired | body | string (url) | Crawl start URL. |
allowlistHostsrequired | body | string[] (1–50) | Hosts the crawler may visit. |
| Name | In | Type | Description |
|---|---|---|---|
name | body | string (1–80) | Display name. |
maxPages | body | integer (1–5000) | Pages per sync. Default: 25 |
maxDepth | body | integer (0–10) | Crawl depth. Default: 2 |
intervalMinutes | body | integer (15–10080) | Automatic sync interval. Default: 1440 |
respectRobotsTxt | body | boolean | Honor robots.txt. Default: true |
enabled | body | boolean | Whether scheduled sync is active. Default: true |
webhookUrl | body | string (url) | Receives rag.synced events. |
overlayMode | body | "cut" | "pass" | "disable" | Overlay shorthand for sync crawls. |
overlays | body | object | Per-category overlay settings. |
{
"startUrl": "https://example.com/docs",
"allowlistHosts": [
"example.com"
],
"maxPages": 25,
"intervalMinutes": 1440
}{
"source": {
"id": "rag_01...",
"startUrl": "https://example.com/docs",
"allowlistHosts": [
"example.com"
]
}
}/v1/rag/sources/:idFetch one RAG source.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Source id. |
curl -X GET 'https://api.sitescreens.com/v1/rag/sources/rag_01...' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"source": {
"id": "rag_01...",
"startUrl": "https://example.com"
}
}/v1/rag/sources/:idPartial update. Body fields match create (all optional).
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Source id. |
| Name | In | Type | Description |
|---|---|---|---|
enabled | body | boolean | Enable or disable scheduled sync. |
maxPages | body | integer | Pages per sync. |
intervalMinutes | body | integer | Sync cadence. |
{
"enabled": true,
"maxPages": 40
}{
"source": {
"id": "rag_01...",
"maxPages": 40,
"enabled": true
}
}/v1/rag/sources/:idRemove a RAG source.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Source id. |
curl -X DELETE 'https://api.sitescreens.com/v1/rag/sources/rag_01...' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"ok": true
}/v1/rag/sources/:id/syncEnqueue an immediate rag_sync job for the source. Requires Pro+.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Source id. |
curl -X POST 'https://api.sitescreens.com/v1/rag/sources/rag_01.../sync' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"jobId": "job_01HXYZ...",
"reservedCredits": 1,
"status": "queued"
}/v1/rag/packsList versioned knowledge packs produced by RAG sync.
Auth: API key or session required
No required parameters.
| Name | In | Type | Description |
|---|---|---|---|
ragSourceId | query | string | Filter packs to one source. |
curl -X GET 'https://api.sitescreens.com/v1/rag/packs?ragSourceId=rag_01...' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"packs": [
{
"id": "pack_01...",
"ragSourceId": "rag_01...",
"version": 3,
"createdAt": "2026-08-11T08:00:00.000Z"
}
]
}/v1/rag/packs/:idFetch a pack and its signed artifact URLs (markdown/JSONL).
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Pack id. |
curl -X GET 'https://api.sitescreens.com/v1/rag/packs/pack_01...' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"pack": {
"id": "pack_01...",
"version": 3,
"artifacts": [
{
"id": "art_01...",
"contentType": "text/markdown",
"url": "https://api.sitescreens.com/v1/artifacts/art_01...?exp=...&sig=..."
}
]
}
}/v1/keysList active API keys and period spend summaries. Secrets are never returned here.
Auth: API key or session required
No required parameters.
curl -X GET 'https://api.sitescreens.com/v1/keys' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"keys": [
{
"id": "key_01...",
"name": "Production",
"keyPrefix": "ssk_live_ab12",
"dailyCreditLimit": 1000,
"weeklyCreditLimit": null,
"monthlyCreditLimit": null,
"spentToday": 42,
"spentThisWeek": 210,
"spentThisMonth": 880,
"createdAt": "2026-07-01T00:00:00.000Z"
}
]
}/v1/keysCreate a new API key. The full secret is returned once — store it securely.
Auth: API key or session required
No required parameters.
| Name | In | Type | Description |
|---|---|---|---|
name | body | string (1–60) | Label for the key. Default: "Default" |
{
"name": "CI"
}{
"key": {
"id": "key_01...",
"name": "CI",
"keyPrefix": "ssk_live_zz99",
"dailyCreditLimit": null,
"weeklyCreditLimit": null,
"monthlyCreditLimit": null,
"secret": "ssk_live_zz99…full_secret_once"
}
}/v1/keys/:idRename a key or set daily/weekly/monthly credit limits. null clears a limit (unlimited).
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Key id. |
| Name | In | Type | Description |
|---|---|---|---|
name | body | string (1–60) | New label. |
dailyCreditLimit | body | integer | null | UTC daily spend cap. null = unlimited. |
weeklyCreditLimit | body | integer | null | UTC week (Mon–Sun) spend cap. null = unlimited. |
monthlyCreditLimit | body | integer | null | UTC calendar-month spend cap. null = unlimited. |
{
"dailyCreditLimit": 500,
"weeklyCreditLimit": 2000
}{
"key": {
"id": "key_01...",
"name": "CI",
"dailyCreditLimit": 500,
"weeklyCreditLimit": 2000,
"monthlyCreditLimit": null,
"spentToday": 42
}
}/v1/keys/:idImmediately revoke an API key.
Auth: API key or session required
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Key id. |
curl -X DELETE 'https://api.sitescreens.com/v1/keys/key_01...' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"ok": true
}/v1/settings/webhookRead the organization webhook URL and whether an HMAC secret is configured.
Auth: API key or session required
No required parameters.
curl -X GET 'https://api.sitescreens.com/v1/settings/webhook' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"webhookUrl": "https://hooks.example.com/sitescreens",
"hasSecret": true
}/v1/settings/webhookSet or clear the organization webhook URL and optionally rotate the HMAC signing secret.
Auth: API key or session required
No required parameters.
| Name | In | Type | Description |
|---|---|---|---|
webhookUrl | body | string (url) | null | Destination URL, or null to clear. |
rotateSecret | body | boolean | When true, generates a new secret and returns it once. |
{
"webhookUrl": "https://hooks.example.com/sitescreens",
"rotateSecret": true
}{
"ok": true,
"webhookSecret": "a1b2c3…"
}/v1/usageRecent credit ledger entries for your organization (latest 50).
Auth: API key or session required
No required parameters.
curl -X GET 'https://api.sitescreens.com/v1/usage' \ -H 'Authorization: Bearer ssk_your_api_key'
{
"ledger": [
{
"id": "led_01...",
"jobId": "job_01...",
"delta": -1,
"balanceAfter": 999,
"reason": "reserve",
"createdAt": "2026-08-11T10:00:00.000Z"
}
]
}