{"openapi": "3.1.0", "info": {"title": "Site-Shot Capture API", "version": "1.0.0", "description": "Capture any public web page as a PNG or JPEG. One GET request with query parameters; the API key travels as `userkey`. Renders in real Chromium, full page or viewport, optionally through a proxy in a chosen country, with ad and cookie-banner removal. Account, plan and billing operations are a separate document at /openapi.json."}, "servers": [{"url": "https://api.site-shot.com"}], "paths": {"/": {"get": {"operationId": "captureScreenshot", "summary": "Capture a web page as an image", "parameters": [{"name": "url", "in": "query", "required": true, "description": "Absolute URL of the page to capture. Percent-encode it.", "schema": {"type": "string"}}, {"name": "userkey", "in": "query", "required": true, "description": "Your screenshot API key. The legacy spelling `user_key` is also accepted.", "schema": {"type": "string"}}, {"name": "width", "in": "query", "required": false, "description": "Viewport width in pixels.", "schema": {"type": "integer", "default": 1024, "minimum": 100, "maximum": 8000}}, {"name": "height", "in": "query", "required": false, "description": "Viewport height in pixels.", "schema": {"type": "integer", "default": 768, "minimum": 100, "maximum": 20000}}, {"name": "zoom", "in": "query", "required": false, "description": "Page zoom as a percentage.", "schema": {"type": "integer", "default": 100, "minimum": 5, "maximum": 1000}}, {"name": "full_size", "in": "query", "required": false, "description": "Capture the whole document canvas instead of the viewport. Bounded by max_height.", "schema": {"type": "integer", "enum": [0, 1], "default": 0}}, {"name": "max_height", "in": "query", "required": false, "description": "Ceiling on the captured height in pixels. Only consulted when full_size=1.", "schema": {"type": "integer", "default": 20000, "minimum": 100, "maximum": 20000}}, {"name": "scaled_width", "in": "query", "required": false, "description": "Scale the result image to this width. Defaults to the viewport width.", "schema": {"type": "integer", "minimum": 50, "maximum": 10000}}, {"name": "format", "in": "query", "required": false, "description": "Image format.", "schema": {"type": "string", "enum": ["png", "jpeg"], "default": "png"}}, {"name": "response_type", "in": "query", "required": false, "description": "image returns the bytes; json returns a base64 image plus status code, response headers and any error.", "schema": {"type": "string", "enum": ["image", "json"], "default": "image"}}, {"name": "delay_time", "in": "query", "required": false, "description": "Milliseconds to wait after load before capturing. Supplying this parameter at all -- with any value -- keeps your value fixed through the target_error retry instead of the automatic 3000 ms bump a slow host gets when delay_time is omitted.", "schema": {"type": "integer", "default": 500, "minimum": 0, "maximum": 60000}}, {"name": "timeout", "in": "query", "required": false, "description": "Milliseconds allowed for the whole capture before a timeout error is returned.", "schema": {"type": "integer", "default": 60000, "minimum": 0, "maximum": 120000}}, {"name": "user_agent", "in": "query", "required": false, "description": "Custom User-Agent string for the render.", "schema": {"type": "string"}}, {"name": "request_header", "in": "query", "required": false, "description": "A raw request header as \"Name:value\". May be supplied more than once.", "schema": {"type": "array", "items": {"type": "string"}}, "style": "form", "explode": true}, {"name": "http_proxy", "in": "query", "required": false, "description": "Route the render through this proxy. No default: Site-Shot picks the route.", "schema": {"type": "string"}}, {"name": "proxy_username", "in": "query", "required": false, "description": "Username for the proxy given in http_proxy.", "schema": {"type": "string"}}, {"name": "proxy_password", "in": "query", "required": false, "description": "Password for the proxy given in http_proxy.", "schema": {"type": "string"}}, {"name": "proxy_rotation", "in": "query", "required": false, "description": "1 routes every attempt through a rotating proxy; 0 makes a single attempt without rotation. Omit it and Site-Shot chooses, which is recommended.", "schema": {"type": "integer", "enum": [0, 1]}}, {"name": "source_code", "in": "query", "required": false, "description": "Return the rendered HTML alongside the image. Applies only with response_type=json.", "schema": {"type": "integer", "enum": [0, 1], "default": 0}}, {"name": "javascript_code", "in": "query", "required": false, "description": "JavaScript injected into the page before the capture.", "schema": {"type": "string"}}, {"name": "no_cookie_popup", "in": "query", "required": false, "description": "Block cookie-consent banners.", "schema": {"type": "integer", "enum": [0, 1], "default": 0}}, {"name": "no_ads", "in": "query", "required": false, "description": "Block ads from the common ad networks.", "schema": {"type": "integer", "enum": [0, 1], "default": 0}}, {"name": "webgl", "in": "query", "required": false, "description": "Give the page a working (software) WebGL context. Detectable by bot protection, so off unless the page needs it.", "schema": {"type": "integer", "enum": [0, 1], "default": 0}}, {"name": "handle_challenges", "in": "query", "required": false, "description": "Let the renderer wait through interstitial challenge pages instead of capturing them. Supplying this parameter at all -- with either value -- disables the adaptive retry ladder that retries hard hosts through escalating proxy and challenge-handling policy; omit it entirely to keep the ladder on.", "schema": {"type": "integer", "enum": [0, 1]}}, {"name": "country", "in": "query", "required": false, "description": "Two-letter ISO 3166-1 alpha-2 code. Routes the render through an IP in that country and sets matching language, time zone and geolocation unless those are given explicitly.", "schema": {"type": "string"}}, {"name": "strict_country", "in": "query", "required": false, "description": "Fail with \"error\": \"country_unavailable\" instead of falling back to a US proxy when the requested country has no capacity. Only applies with country.", "schema": {"type": "integer", "enum": [0, 1], "default": 0}}, {"name": "language", "in": "query", "required": false, "description": "Browser language. Taken from country when country is set and this is not.", "schema": {"type": "string", "default": "en"}}, {"name": "time_zone", "in": "query", "required": false, "description": "Browser time zone. Taken from country when country is set and this is not.", "schema": {"type": "string", "default": "America/New_York"}}, {"name": "geolocation", "in": "query", "required": false, "description": "Simulated GPS position as \"lat,lng\". When omitted, it follows country's defaults; with no country given either, it resolves to the US row's coordinates, 40.7128,-74.0060.", "schema": {"type": "string"}}], "responses": {"200": {"description": "The captured image, or -- with response_type=json -- a JSON envelope carrying the base64 image, the upstream status code and response headers, the echoed request parameters, and any error.", "content": {"image/png": {"schema": {"type": "string", "format": "binary"}}, "image/jpeg": {"schema": {"type": "string", "format": "binary"}}, "application/json": {"schema": {"type": "object"}}}}, "401": {"description": "Missing or unrecognised userkey."}, "403": {"description": "The key has no quota or no free worker."}}}}}}