relayted API

Service

shots

Screenshots of a public URL in real browser engines: Chrome, Edge, Firefox, WebKit (Safari), Brave, Opera and Vivaldi in their current and previous versions, plus mobile profiles (iPhone, iPad, Android). One job can combine browsers, versions, viewports and colour schemes.

POST/v1/shots/jobs[?wait=seconds]
POST/v1/shots/quote same body, free: lists every screenshot and the price
GET/v1/services/shots browsers and versions available right now, no key needed

Request

FieldTypeDescription
urlstring, requiredhttp:// or https://, public host. It is probed before anything is charged.
browsersarray, requiredBrowser ids from /v1/services/shots. Either a string ("firefox" = newest version) or {"id":"firefox","versions":["133","132"]}.
viewportsarrayFor desktop browsers, at most 3: "1920x1080", a preset id (fhd, qhd, laptop, hd, tablet, phone) or {"w":1280,"h":800}. Width 320 to 3840, height 320 to 2400. Default 1920x1080. Mobile profiles use their device screen.
schemesarray"light", "dark" or both. Default ["light"].
options.fullPagebooleanCapture the whole page instead of the viewport.
options.retinabooleanDevice pixel ratio 2.
options.hideCookieBannerbooleanTry to hide common consent banners.
options.delay0, 2 or 5Seconds to wait after load.

The number of screenshots is browser versions x viewports x schemes (mobile profiles: versions x schemes), at most 200 per job.

curl -s "https://api.relayted.de/v1/shots/jobs" \
  -H "Authorization: Bearer $RELAYTED_KEY" -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com",
    "browsers": ["chrome", "firefox", {"id": "safari", "versions": ["18.2"]}],
    "viewports": ["1920x1080", "phone"],
    "schemes": ["light", "dark"],
    "options": {"fullPage": true, "hideCookieBanner": true}
  }'
# 3 browser versions x 2 viewports x 2 schemes = 12 screenshots

Price

The volume price applies inside one job. The quote lists the price of every single screenshot.

Response

{
  "job": {
    "id": "Kp9...", "service": "shots", "target": "example.com", "status": "processing",
    "cost": 780, "refunded": 0, "charged": 780, "etaSeconds": 42, "zipName": "shots_example.com_2026-10-06.zip",
    "results": [
      { "key": "example.com_chrome-131_1920x1080_light_full.png", "status": "done", "price": 65,
        "browser": "Google Chrome", "browserId": "chrome", "version": "131.0.6778.86",
        "width": 1920, "height": 1080, "scheme": "light",
        "contentType": "image/png", "url": ".../results/example.com_chrome-131_1920x1080_light_full.png" },
      { "key": "example.com_firefox-133_390x844_dark_full.png", "status": "pending", "price": 65, ... }
    ]
  },
  "balance": 49220
}
GET/v1/jobs/<id>/results/<key> the PNG
GET/v1/jobs/<id>/results/<key>?thumb=1 a small WebP thumbnail, free
GET/v1/jobs/<id>/zip all finished screenshots, once the job is completed

URL-encode the key when you build the address yourself; the url field already is.

Error codes of this service

CodeWhen
unknown_browser, unknown_version, no_browserThe id or version is not in the current catalogue, or browsers is empty.
bad_viewport, no_viewport, too_many_viewportsViewport outside the limits, missing for a desktop browser, or more than 3.
no_scheme, bad_selection, too_many_shotsNo valid scheme, nothing to capture, or more than 200 screenshots.
bad_url, blocked_address, unreachableThe URL is invalid, private, or the site did not answer the probe.
service_unavailable, busyThe screenshot machine is offline or its queue is full (503).
A screenshot that fails (results[].status = "failed", with a short reason in error) is refunded. The ZIP contains the finished ones.

Notes