API reference

Capture screenshots, PDFs, markdown, crawls, video, forensic packs, and structured extracts over a simple HTTPS API. Authenticate with an API key from the dashboard.

Getting started

  1. Create an account and open API keys in the dashboard.
  2. Copy a key that starts with ssk_.
  3. Call the API at https://api.sitescreens.com (replace with your deployment host if self-hosted).
  4. Send Authorization: Bearer ssk_your_api_key (or X-Api-Key: ssk_your_api_key).
  5. Create jobs with POST /v1/…, then poll GET /v1/jobs/:id until status is succeeded or failed.

Most capture endpoints respond with 202 Accepted and a jobId. Artifact download URLs are signed and returned on the job detail payload.

Minimal screenshot

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"}'

Errors

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.

StatusMeaning
400Validation failed — body includes details from schema checks.
401Missing or invalid API key / session.
402Insufficient organization credits.
403Plan feature not available, account blocked, or immutable artifact.
404Resource not found.
429API key daily/weekly/monthly credit limit exceeded (period, limit, spent, requested).
500Unexpected server error.

Common capture options

Overlay cleanup, proxies, and wait conditions are shared across capture endpoints.

  • overlayMode: cut (dismiss/remove), pass (leave as-is), disable (block scripts / hide).
  • Per-category: overlays.cookies, overlays.ads, overlays.modals, optional overlays.timeoutMs.
  • Defaults: cookies/modals = cut, ads = disable.
  • For text, markdown, and crawl, set overlays.ads: "cut" to purge in-content ads from the DOM before extraction.
  • useProxy / proxy require Pro+.
  • Relative href/src values in markdown, crawl packs, and extract JSON are rewritten to absolute URLs against the final page URL.

Meta

GET/v1/health

Health check

Liveness probe for the API.

Auth: None (public)

No required parameters.

Request

curl -X GET 'https://api.sitescreens.com/v1/health'

Response HTTP 200

{
  "ok": true,
  "service": "sitescreens-api"
}
GET/v1/plans

Plan catalog

Public plan definitions, features, and credit allotments.

Auth: None (public)

No required parameters.

Request

curl -X GET 'https://api.sitescreens.com/v1/plans'

Response HTTP 200

{
  "plans": [
    {
      "id": "starter",
      "name": "Starter",
      "creditsPerMonth": 2000,
      "features": {
        "crawl": true,
        "batch": true,
        "video": false
      }
    }
  ]
}

Capture jobs

POST/v1/screenshot

Create screenshot job

Queue 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

Required parameters

NameInTypeDescription
urlrequiredbodystring (url)Page URL to capture.

Optional parameters

NameInTypeDescription
fullPagebodybooleanCapture the full scrollable page. Costs 2 credits instead of 1. Default: false
formatbody"png" | "jpeg" | "webp"Image output format. Default: "png"
devicebody"desktop" | "mobile" | "tablet"Device viewport preset. Default: "desktop"
resolutionbodystring (preset id | "custom")Named viewport preset id, or "custom" with width/height. Availability depends on your plan (larger sizes need higher plans).
ValueDescription
desktop_800x600800 × 600 · desktop · min plan: free
desktop_1024x7681024 × 768 (XGA) · desktop · min plan: free
desktop_1280x7201280 × 720 (HD) · desktop · min plan: free
desktop_1366x7681366 × 768 (laptop) · desktop · min plan: starter
desktop_1440x9001440 × 900 · desktop · min plan: starter
desktop_1536x8641536 × 864 · desktop · min plan: starter
desktop_1920x10801920 × 1080 (Full HD) · desktop · min plan: starter
desktop_2560x14402560 × 1440 (QHD) · desktop · min plan: pro
desktop_3840x21603840 × 2160 (4K) · desktop · min plan: business
mobile_360x640360 × 640 (small Android) · mobile · min plan: free
mobile_375x667375 × 667 (iPhone SE) · mobile · min plan: free
mobile_390x844390 × 844 (iPhone 14/15) · mobile · min plan: starter
mobile_393x873393 × 873 (Pixel 7) · mobile · min plan: starter
mobile_412x915412 × 915 (Pixel 8) · mobile · min plan: starter
mobile_430x932430 × 932 (iPhone 15 Pro Max) · mobile · min plan: starter
tablet_768x1024768 × 1024 (iPad) · tablet · min plan: free
tablet_800x1280800 × 1280 · tablet · min plan: starter
tablet_820x1180820 × 1180 (iPad Air) · tablet · min plan: starter
tablet_834x1194834 × 1194 (iPad Pro 11") · tablet · min plan: starter
tablet_1024x13661024 × 1366 (iPad Pro 12.9") · tablet · min plan: starter
customCustom size — set width and height. Requires Starter+.
widthbodyinteger (320–3840)Viewport width override.
heightbodyinteger (240–2160)Viewport height override.
deviceScaleFactorbodynumber (1–3)Device pixel ratio. Default: 1
darkModebodybooleanEmulate prefers-color-scheme: dark. Default: false
delayMsbodyinteger (0–30000)Extra wait after navigation before capture. Default: 0
selectorbodystringCSS selector to screenshot instead of the full viewport.
useProxybodybooleanRoute the capture through your configured proxy pool. Pro+. Default: false
proxybodystringProxy label or URL (for example "us"). Implies geo/proxy feature (Pro+).
waitUntilbody"load" | "domcontentloaded" | "networkidle"Playwright navigation wait condition. Default: "networkidle"
webhookUrlbodystring (url)Per-job webhook override. Receives job.succeeded / job.failed events.
overlayModebody"cut" | "pass" | "disable"Shorthand overlay policy applied to cookies, ads, and modals.
overlaysbodyobjectPer-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000).

Request

{
  "url": "https://example.com",
  "device": "mobile",
  "resolution": "mobile_390x844",
  "fullPage": false,
  "format": "png",
  "overlayMode": "cut"
}

Response HTTP 202

{
  "jobId": "job_01HXYZ...",
  "reservedCredits": 1,
  "status": "queued"
}
POST/v1/scrape

Create scrape job (PDF / text / markdown)

Queue 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

Required parameters

NameInTypeDescription
urlrequiredbodystring (url)Page URL to scrape.
formatrequiredbody"pdf" | "text" | "markdown"Output format. Maps to job kind pdf, text, or markdown.

Optional parameters

NameInTypeDescription
useProxybodybooleanRoute the capture through your configured proxy pool. Pro+. Default: false
proxybodystringProxy label or URL (for example "us"). Implies geo/proxy feature (Pro+).
waitUntilbody"load" | "domcontentloaded" | "networkidle"Playwright navigation wait condition. Default: "networkidle"
webhookUrlbodystring (url)Per-job webhook override. Receives job.succeeded / job.failed events.
overlayModebody"cut" | "pass" | "disable"Shorthand overlay policy applied to cookies, ads, and modals.
overlaysbodyobjectPer-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000).

Request

{
  "url": "https://example.com",
  "format": "markdown",
  "overlays": {
    "ads": "cut"
  }
}

Response HTTP 202

{
  "jobId": "job_01HXYZ...",
  "reservedCredits": 2,
  "status": "queued"
}
  • For text/markdown, set overlays.ads to "cut" to purge in-content ad units before extraction.
POST/v1/crawl

Create crawl job

Crawl 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

Required parameters

NameInTypeDescription
urlrequiredbodystring (url)Start URL.

Optional parameters

NameInTypeDescription
maxPagesbodyinteger (1–5000)Maximum pages to visit. Credit cost scales with this value. Default: 25
maxDepthbodyinteger (0–10)Link depth from the start URL. Default: 2
sameOriginbodybooleanStay on the same origin as the start URL. Default: true
includeSubdomainsbodybooleanAllow sibling subdomains when crawling. Default: false
respectRobotsTxtbodybooleanHonor robots.txt disallow rules. Default: true
useProxybodybooleanRoute the capture through your configured proxy pool. Pro+. Default: false
proxybodystringProxy label or URL (for example "us"). Implies geo/proxy feature (Pro+).
waitUntilbody"load" | "domcontentloaded" | "networkidle"Playwright navigation wait condition. Default: "networkidle"
webhookUrlbodystring (url)Per-job webhook override. Receives job.succeeded / job.failed events.
overlayModebody"cut" | "pass" | "disable"Shorthand overlay policy applied to cookies, ads, and modals.
overlaysbodyobjectPer-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000).

Request

{
  "url": "https://example.com",
  "maxPages": 10,
  "maxDepth": 2,
  "overlayMode": "cut"
}

Response HTTP 202

{
  "jobId": "job_01HXYZ...",
  "reservedCredits": 10,
  "status": "queued"
}
POST/v1/video

Create scroll video job

Record a short scrolling product-demo video (WebM or MP4). Requires Pro+.

Auth: API key or session required

Required parameters

NameInTypeDescription
urlrequiredbodystring (url)Page URL to record.

Optional parameters

NameInTypeDescription
secondsbodyinteger (3–30)Clip length in seconds (capped by plan). Default: 10
formatbody"webm" | "mp4"Video container format. Default: "webm"
scrollbodybooleanAuto-scroll the page during recording. Default: true
devicebody"desktop" | "mobile" | "tablet"Device viewport preset. Used for default width/height when those fields are omitted. Default: "desktop"
ValueDescription
desktopDefault viewport 1280 × 720
mobileDefault viewport 390 × 844
tabletDefault viewport 834 × 1112
widthbodyinteger (320–1920)Custom viewport width. If omitted, defaults by device: desktop 1280, mobile 390, tablet 834. Default: desktop 1280 · mobile 390 · tablet 834
heightbodyinteger (240–1080)Custom viewport height. If omitted, defaults by device: desktop 720, mobile 844, tablet 1112. Default: desktop 720 · mobile 844 · tablet 1112
useProxybodybooleanRoute the capture through your configured proxy pool. Pro+. Default: false
proxybodystringProxy label or URL (for example "us"). Implies geo/proxy feature (Pro+).
waitUntilbody"load" | "domcontentloaded" | "networkidle"Playwright navigation wait condition. Default: "networkidle"
webhookUrlbodystring (url)Per-job webhook override. Receives job.succeeded / job.failed events.
overlayModebody"cut" | "pass" | "disable"Shorthand overlay policy applied to cookies, ads, and modals.
overlaysbodyobjectPer-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000).

Request

{
  "url": "https://example.com",
  "seconds": 8,
  "format": "webm",
  "scroll": true,
  "device": "desktop"
}

Response HTTP 202

{
  "jobId": "job_01HXYZ...",
  "reservedCredits": 10,
  "status": "queued"
}
POST/v1/forensic

Create forensic evidence pack

Capture 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

Required parameters

NameInTypeDescription
urlrequiredbodystring (url)Page URL to capture as evidence.

Optional parameters

NameInTypeDescription
immutablebodybooleanPrevent deletion of resulting artifacts via DELETE /v1/artifacts/:id. Default: false
includeMarkdownbodybooleanAlso include a markdown snapshot in the pack. Default: true
fullPagebodybooleanFull-page screenshot in the pack. Default: false
formatbody"png" | "jpeg" | "webp"Screenshot image format. Default: "png"
devicebody"desktop" | "mobile" | "tablet"Device viewport preset. Default: "desktop"
resolutionbodystring (preset id | "custom")Named viewport preset id, or "custom" with width/height. Availability depends on your plan (larger sizes need higher plans).
ValueDescription
desktop_800x600800 × 600 · desktop · min plan: free
desktop_1024x7681024 × 768 (XGA) · desktop · min plan: free
desktop_1280x7201280 × 720 (HD) · desktop · min plan: free
desktop_1366x7681366 × 768 (laptop) · desktop · min plan: starter
desktop_1440x9001440 × 900 · desktop · min plan: starter
desktop_1536x8641536 × 864 · desktop · min plan: starter
desktop_1920x10801920 × 1080 (Full HD) · desktop · min plan: starter
desktop_2560x14402560 × 1440 (QHD) · desktop · min plan: pro
desktop_3840x21603840 × 2160 (4K) · desktop · min plan: business
mobile_360x640360 × 640 (small Android) · mobile · min plan: free
mobile_375x667375 × 667 (iPhone SE) · mobile · min plan: free
mobile_390x844390 × 844 (iPhone 14/15) · mobile · min plan: starter
mobile_393x873393 × 873 (Pixel 7) · mobile · min plan: starter
mobile_412x915412 × 915 (Pixel 8) · mobile · min plan: starter
mobile_430x932430 × 932 (iPhone 15 Pro Max) · mobile · min plan: starter
tablet_768x1024768 × 1024 (iPad) · tablet · min plan: free
tablet_800x1280800 × 1280 · tablet · min plan: starter
tablet_820x1180820 × 1180 (iPad Air) · tablet · min plan: starter
tablet_834x1194834 × 1194 (iPad Pro 11") · tablet · min plan: starter
tablet_1024x13661024 × 1366 (iPad Pro 12.9") · tablet · min plan: starter
customCustom size — set width and height. Requires Starter+.
widthbodyinteger (320–3840)Viewport width override.
heightbodyinteger (240–2160)Viewport height override.
useProxybodybooleanRoute the capture through your configured proxy pool. Pro+. Default: false
proxybodystringProxy label or URL (for example "us"). Implies geo/proxy feature (Pro+).
waitUntilbody"load" | "domcontentloaded" | "networkidle"Playwright navigation wait condition. Default: "networkidle"
webhookUrlbodystring (url)Per-job webhook override. Receives job.succeeded / job.failed events.
overlayModebody"cut" | "pass" | "disable"Shorthand overlay policy applied to cookies, ads, and modals.
overlaysbodyobjectPer-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000).

Request

{
  "url": "https://example.com",
  "immutable": true,
  "includeMarkdown": true,
  "fullPage": true
}

Response HTTP 202

{
  "jobId": "job_01HXYZ...",
  "reservedCredits": 3,
  "status": "queued"
}
POST/v1/extract

Create structured extract job

Extract 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

Required parameters

NameInTypeDescription
urlrequiredbodystring (url)Page URL to extract from.
schemarequiredbodyobjectJSON Schema-like object describing the fields to extract.

Optional parameters

NameInTypeDescription
promptbodystring (≤4000)Optional extraction instructions appended to the operator prompt.
useProxybodybooleanRoute the capture through your configured proxy pool. Pro+. Default: false
proxybodystringProxy label or URL (for example "us"). Implies geo/proxy feature (Pro+).
waitUntilbody"load" | "domcontentloaded" | "networkidle"Playwright navigation wait condition. Default: "networkidle"
webhookUrlbodystring (url)Per-job webhook override. Receives job.succeeded / job.failed events.
overlayModebody"cut" | "pass" | "disable"Shorthand overlay policy applied to cookies, ads, and modals.
overlaysbodyobjectPer-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000).

Request

{
  "url": "https://example.com",
  "schema": {
    "type": "object",
    "properties": {
      "title": {
        "type": "string"
      },
      "price": {
        "type": "string"
      }
    },
    "required": [
      "title"
    ]
  }
}

Response HTTP 202

{
  "jobId": "job_01HXYZ...",
  "reservedCredits": 7,
  "status": "queued"
}
POST/v1/summary

Create page/site summary job

Scrape 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.

Optional parameters

NameInTypeDescription
urlbodystring (url)Start/page URL. Required for single and crawl modes.
urlsbodystring[] (urls)Explicit list of 2–50 URLs (exclusive with crawl).
crawlbodybooleanWhen true with url, BFS-crawl up to maxPages/maxDepth. Default: false
maxPagesbodyintegerCrawl page budget (plan-capped). Default: 25
maxDepthbodyintegerCrawl link depth. Default: 2
sameOriginbodybooleanRestrict crawl to the same origin. Default: true
includeSubdomainsbodybooleanAllow subdomains when sameOrigin is true. Default: false
respectRobotsTxtbodybooleanHonor robots.txt Disallow rules during crawl. Default: true
focusbodystring (≤2000)Optional emphasis hint for the summarizer.
lengthbody"short" | "medium" | "long"Summary length preset. Default: "medium"
useProxybodybooleanRoute the capture through your configured proxy pool. Pro+. Default: false
proxybodystringProxy label or URL (for example "us"). Implies geo/proxy feature (Pro+).
waitUntilbody"load" | "domcontentloaded" | "networkidle"Playwright navigation wait condition. Default: "networkidle"
webhookUrlbodystring (url)Per-job webhook override. Receives job.succeeded / job.failed events.
overlayModebody"cut" | "pass" | "disable"Shorthand overlay policy applied to cookies, ads, and modals.
overlaysbodyobjectPer-category overlay control: cookies, ads, modals (cut|pass|disable) and timeoutMs (0–15000).

Request

{
  "url": "https://example.com",
  "crawl": true,
  "maxPages": 10,
  "maxDepth": 2,
  "length": "medium"
}

Response HTTP 202

{
  "jobId": "job_01HXYZ...",
  "reservedCredits": 50,
  "status": "queued"
}
  • Artifacts: summary.json (structured), summary.md (human-readable), pages.jsonl (per-page rows).
  • Settled credits scale with pages actually summarized (minimum 1 page).

Jobs & artifacts

GET/v1/jobs

List jobs

List jobs for your organization with optional filters and pagination.

Auth: API key or session required

No required parameters.

Optional parameters

NameInTypeDescription
statusquery"queued" | "running" | "succeeded" | "failed"Filter by job status. Invalid values are ignored.
kindquerystringExact job kind filter (screenshot, markdown, crawl, …).
qquerystringCase-insensitive search against job URL or job id.
fromquerystring (ISO datetime)Inclusive lower bound on createdAt.
toquerystring (ISO datetime)Inclusive upper bound on createdAt.
limitqueryinteger (≥1, ≤100)Page size. Default: 25
offsetqueryinteger (≥0)Number of jobs to skip. Default: 0

Request

curl -X GET 'https://api.sitescreens.com/v1/jobs?status=succeeded&limit=25&offset=0' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "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
}
GET/v1/jobs/:id

Get job

Fetch a single job including signed artifact download URLs (typically valid ~1 hour).

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringJob id returned from a create call.

Request

curl -X GET 'https://api.sitescreens.com/v1/jobs/job_01HXYZ...' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "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=..."
      }
    ]
  }
}
DELETE/v1/artifacts/:id

Delete artifact

Soft-delete an artifact you own. Immutable forensic artifacts cannot be deleted.

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringArtifact id.

Request

curl -X DELETE 'https://api.sitescreens.com/v1/artifacts/art_01...' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "ok": true
}
  • Returns 403 if the artifact is marked immutable.
GET/v1/artifacts/:id

Download artifact (signed URL)

Binary download for an artifact. Requires a valid exp and sig query signature from a job response — not an API key.

Auth: None (public)

Required parameters

NameInTypeDescription
idrequiredpathstringArtifact id.
exprequiredquerystringSignature expiry timestamp.
sigrequiredquerystringHMAC signature from the job artifact URL.

Request

curl -X GET 'https://api.sitescreens.com/v1/artifacts/art_01...?exp=1723370000&sig=%E2%80%A6'

Response HTTP 200

{
  "note": "Binary response body with Content-Type from the artifact (image/png, application/pdf, text/markdown, …)."
}
  • Use the full signed URL from GET /v1/jobs/:id rather than reconstructing signatures.

Batch

POST/v1/batch

Queue a batch of URLs

Enqueue 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

Required parameters

NameInTypeDescription
kindrequiredbody"screenshot" | "markdown" | "text" | "pdf"Job kind applied to every URL.
urlsrequiredbodystring[] (urls)List of URLs (1–500, capped by plan).

Optional parameters

NameInTypeDescription
optionsbodyobjectShared options: fullPage, device, width, height, resolution (screenshot), useProxy, proxy, overlayMode, overlays, webhookUrl.

Request

{
  "kind": "screenshot",
  "urls": [
    "https://example.com",
    "https://example.org"
  ],
  "options": {
    "device": "desktop",
    "fullPage": false,
    "overlayMode": "cut"
  }
}

Response HTTP 202

{
  "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
    }
  ]
}

Monitors

GET/v1/monitors

List monitors

List change monitors for your organization.

Auth: API key or session required

No required parameters.

Request

curl -X GET 'https://api.sitescreens.com/v1/monitors' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "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"
    }
  ]
}
POST/v1/monitors

Create monitor

Schedule recurring visual/content checks. Requires Starter+. Count limited by plan.

Auth: API key or session required

Required parameters

NameInTypeDescription
urlrequiredbodystring (url)URL to monitor.

Optional parameters

NameInTypeDescription
namebodystring (1–80)Display name. Defaults to the hostname.
intervalMinutesbodyinteger (5–10080)Check interval in minutes. Default: 60
thresholdPercentbodynumber (0–100)Visual diff threshold that counts as a change. Default: 2
fullPagebodybooleanCapture full-page screenshots for comparisons. Default: false
devicebody"desktop" | "mobile" | "tablet"Viewport preset. Default: "desktop"
webhookUrlbodystring (url)Per-monitor webhook for monitor.changed / monitor.unchanged.
enabledbodybooleanWhether the monitor is active. Default: true
forensicOnChangebodybooleanQueue a forensic pack when a change is detected. Default: false
overlayModebody"cut" | "pass" | "disable"Overlay shorthand for monitor captures.
overlaysbodyobjectPer-category overlay settings.

Request

{
  "url": "https://example.com",
  "intervalMinutes": 60,
  "thresholdPercent": 2,
  "overlayMode": "cut"
}

Response HTTP 201

{
  "monitor": {
    "id": "mon_01...",
    "name": "example.com",
    "url": "https://example.com",
    "intervalMinutes": 60,
    "thresholdPercent": 2,
    "enabled": true
  }
}
GET/v1/monitors/:id

Get monitor

Fetch a single monitor by id.

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringMonitor id.

Request

curl -X GET 'https://api.sitescreens.com/v1/monitors/mon_01...' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "monitor": {
    "id": "mon_01...",
    "name": "example.com",
    "url": "https://example.com",
    "intervalMinutes": 60,
    "enabled": true
  }
}
PATCH/v1/monitors/:id

Update monitor

Partial update of monitor settings. Body fields match create (all optional).

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringMonitor id.

Optional parameters

NameInTypeDescription
enabledbodybooleanPause or resume the monitor.
intervalMinutesbodyintegerNew check interval.
thresholdPercentbodynumberNew visual change threshold.
namebodystringDisplay name.
webhookUrlbodystring (url)Webhook URL override.

Request

{
  "enabled": false,
  "intervalMinutes": 120
}

Response HTTP 200

{
  "monitor": {
    "id": "mon_01...",
    "enabled": false,
    "intervalMinutes": 120
  }
}
DELETE/v1/monitors/:id

Delete monitor

Remove a monitor.

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringMonitor id.

Request

curl -X DELETE 'https://api.sitescreens.com/v1/monitors/mon_01...' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "ok": true
}
GET/v1/monitors/:id/history

Monitor history

Recent monitor runs with change flags and screenshot URLs.

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringMonitor id.

Optional parameters

NameInTypeDescription
limitqueryinteger (1–100)Max runs to return. Default: 50

Request

curl -X GET 'https://api.sitescreens.com/v1/monitors/mon_01.../history?limit=20' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "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=..."
    }
  ]
}
GET/v1/monitors/:id/compare

Compare monitor runs

Side-by-side comparison of two monitor runs.

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringMonitor id.
leftrequiredquerystringLeft run id.
rightrequiredquerystringRight run id.

Request

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'

Response HTTP 200

{
  "monitor": {
    "id": "mon_01..."
  },
  "left": {
    "id": "run_01...",
    "screenshot": {
      "url": "…"
    }
  },
  "right": {
    "id": "run_02...",
    "screenshot": {
      "url": "…"
    }
  }
}

RAG sync

GET/v1/rag/sources

List RAG sources

List allowlisted RAG sync sources. Requires Pro+ to create/sync.

Auth: API key or session required

No required parameters.

Request

curl -X GET 'https://api.sitescreens.com/v1/rag/sources' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "sources": [
    {
      "id": "rag_01...",
      "name": "example.com",
      "startUrl": "https://example.com",
      "allowlistHosts": [
        "example.com"
      ],
      "maxPages": 25,
      "enabled": true
    }
  ]
}
POST/v1/rag/sources

Create RAG source

Add an allowlisted site for recurring knowledge-pack sync. Requires Pro+.

Auth: API key or session required

Required parameters

NameInTypeDescription
startUrlrequiredbodystring (url)Crawl start URL.
allowlistHostsrequiredbodystring[] (1–50)Hosts the crawler may visit.

Optional parameters

NameInTypeDescription
namebodystring (1–80)Display name.
maxPagesbodyinteger (1–5000)Pages per sync. Default: 25
maxDepthbodyinteger (0–10)Crawl depth. Default: 2
intervalMinutesbodyinteger (15–10080)Automatic sync interval. Default: 1440
respectRobotsTxtbodybooleanHonor robots.txt. Default: true
enabledbodybooleanWhether scheduled sync is active. Default: true
webhookUrlbodystring (url)Receives rag.synced events.
overlayModebody"cut" | "pass" | "disable"Overlay shorthand for sync crawls.
overlaysbodyobjectPer-category overlay settings.

Request

{
  "startUrl": "https://example.com/docs",
  "allowlistHosts": [
    "example.com"
  ],
  "maxPages": 25,
  "intervalMinutes": 1440
}

Response HTTP 201

{
  "source": {
    "id": "rag_01...",
    "startUrl": "https://example.com/docs",
    "allowlistHosts": [
      "example.com"
    ]
  }
}
GET/v1/rag/sources/:id

Get RAG source

Fetch one RAG source.

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringSource id.

Request

curl -X GET 'https://api.sitescreens.com/v1/rag/sources/rag_01...' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "source": {
    "id": "rag_01...",
    "startUrl": "https://example.com"
  }
}
PATCH/v1/rag/sources/:id

Update RAG source

Partial update. Body fields match create (all optional).

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringSource id.

Optional parameters

NameInTypeDescription
enabledbodybooleanEnable or disable scheduled sync.
maxPagesbodyintegerPages per sync.
intervalMinutesbodyintegerSync cadence.

Request

{
  "enabled": true,
  "maxPages": 40
}

Response HTTP 200

{
  "source": {
    "id": "rag_01...",
    "maxPages": 40,
    "enabled": true
  }
}
DELETE/v1/rag/sources/:id

Delete RAG source

Remove a RAG source.

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringSource id.

Request

curl -X DELETE 'https://api.sitescreens.com/v1/rag/sources/rag_01...' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "ok": true
}
POST/v1/rag/sources/:id/sync

Trigger RAG sync

Enqueue an immediate rag_sync job for the source. Requires Pro+.

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringSource id.

Request

curl -X POST 'https://api.sitescreens.com/v1/rag/sources/rag_01.../sync' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 202

{
  "jobId": "job_01HXYZ...",
  "reservedCredits": 1,
  "status": "queued"
}
  • Webhook event on completion: rag.synced.
GET/v1/rag/packs

List knowledge packs

List versioned knowledge packs produced by RAG sync.

Auth: API key or session required

No required parameters.

Optional parameters

NameInTypeDescription
ragSourceIdquerystringFilter packs to one source.

Request

curl -X GET 'https://api.sitescreens.com/v1/rag/packs?ragSourceId=rag_01...' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "packs": [
    {
      "id": "pack_01...",
      "ragSourceId": "rag_01...",
      "version": 3,
      "createdAt": "2026-08-11T08:00:00.000Z"
    }
  ]
}
GET/v1/rag/packs/:id

Get knowledge pack

Fetch a pack and its signed artifact URLs (markdown/JSONL).

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringPack id.

Request

curl -X GET 'https://api.sitescreens.com/v1/rag/packs/pack_01...' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "pack": {
    "id": "pack_01...",
    "version": 3,
    "artifacts": [
      {
        "id": "art_01...",
        "contentType": "text/markdown",
        "url": "https://api.sitescreens.com/v1/artifacts/art_01...?exp=...&sig=..."
      }
    ]
  }
}

API keys

GET/v1/keys

List API keys

List active API keys and period spend summaries. Secrets are never returned here.

Auth: API key or session required

No required parameters.

Request

curl -X GET 'https://api.sitescreens.com/v1/keys' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "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"
    }
  ]
}
POST/v1/keys

Create API key

Create a new API key. The full secret is returned once — store it securely.

Auth: API key or session required

No required parameters.

Optional parameters

NameInTypeDescription
namebodystring (1–60)Label for the key. Default: "Default"

Request

{
  "name": "CI"
}

Response HTTP 200

{
  "key": {
    "id": "key_01...",
    "name": "CI",
    "keyPrefix": "ssk_live_zz99",
    "dailyCreditLimit": null,
    "weeklyCreditLimit": null,
    "monthlyCreditLimit": null,
    "secret": "ssk_live_zz99…full_secret_once"
  }
}
PATCH/v1/keys/:id

Update API key

Rename a key or set daily/weekly/monthly credit limits. null clears a limit (unlimited).

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringKey id.

Optional parameters

NameInTypeDescription
namebodystring (1–60)New label.
dailyCreditLimitbodyinteger | nullUTC daily spend cap. null = unlimited.
weeklyCreditLimitbodyinteger | nullUTC week (Mon–Sun) spend cap. null = unlimited.
monthlyCreditLimitbodyinteger | nullUTC calendar-month spend cap. null = unlimited.

Request

{
  "dailyCreditLimit": 500,
  "weeklyCreditLimit": 2000
}

Response HTTP 200

{
  "key": {
    "id": "key_01...",
    "name": "CI",
    "dailyCreditLimit": 500,
    "weeklyCreditLimit": 2000,
    "monthlyCreditLimit": null,
    "spentToday": 42
  }
}
DELETE/v1/keys/:id

Revoke API key

Immediately revoke an API key.

Auth: API key or session required

Required parameters

NameInTypeDescription
idrequiredpathstringKey id.

Request

curl -X DELETE 'https://api.sitescreens.com/v1/keys/key_01...' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "ok": true
}

Webhooks & usage

GET/v1/settings/webhook

Get org webhook settings

Read the organization webhook URL and whether an HMAC secret is configured.

Auth: API key or session required

No required parameters.

Request

curl -X GET 'https://api.sitescreens.com/v1/settings/webhook' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "webhookUrl": "https://hooks.example.com/sitescreens",
  "hasSecret": true
}
PUT/v1/settings/webhook

Update org webhook settings

Set or clear the organization webhook URL and optionally rotate the HMAC signing secret.

Auth: API key or session required

No required parameters.

Optional parameters

NameInTypeDescription
webhookUrlbodystring (url) | nullDestination URL, or null to clear.
rotateSecretbodybooleanWhen true, generates a new secret and returns it once.

Request

{
  "webhookUrl": "https://hooks.example.com/sitescreens",
  "rotateSecret": true
}

Response HTTP 200

{
  "ok": true,
  "webhookSecret": "a1b2c3…"
}
  • Events: job.succeeded, job.failed, monitor.changed, monitor.unchanged, rag.synced.
  • Signature header: X-Sitescreens-Signature: sha256=<hmac>.
GET/v1/usage

Credit ledger

Recent credit ledger entries for your organization (latest 50).

Auth: API key or session required

No required parameters.

Request

curl -X GET 'https://api.sitescreens.com/v1/usage' \
  -H 'Authorization: Bearer ssk_your_api_key'

Response HTTP 200

{
  "ledger": [
    {
      "id": "led_01...",
      "jobId": "job_01...",
      "delta": -1,
      "balanceAfter": 999,
      "reason": "reserve",
      "createdAt": "2026-08-11T10:00:00.000Z"
    }
  ]
}
API reference · Sitescreens