snaplab-dev · Schema

RenderOptions

Exactly one of `url` or `html`/`template` must be given.

CompanyScreenshotPDFOpenGraphAPI

Properties

Name Type Description
url string Absolute http(s) URL to capture. Private, loopback, link-local and metadata addresses are refused.
html string Raw HTML rendered instead of navigating. Subresources are still SSRF-filtered.
template string HTML with `{{ path.to.value }}` placeholders, substituted from `data` and HTML-escaped.
data object Values for `template` (or for `html`, when no template is given).
css string Stylesheet injected into `` before load. html/template mode only.
googleFonts string Comma-separated Google Fonts families, e.g. `Inter,Playfair Display` (max 6).
format string
viewport string Preset size. `width`/`height`/`deviceScaleFactor` override individual axes.
width integer
height integer
deviceScaleFactor number Pixel ratio. 2 = retina.
mobile boolean Sugar for `viewport: "mobile"` (390x844 @3x, touch emulation).
fullPage boolean Capture the whole scrollable document. Ignored when `selector` is set.
selector string Capture just this element. PDFs stay vector/selectable.
quality integer jpeg/webp/avif only.
waitUntil string "auto" waits for load, then for the network to be quiet for 150ms, capped at 400ms. "networkidle" is the full Playwright wait and costs ~0.5s more.
waitForSelector string Wait (up to 10s) for this selector before capturing.
delayMs integer
scrollY integer Scroll down this many pixels first (triggers lazy loading).
hideSelectors array Elements to hide before capturing. Comma-separated in a query string.
darkMode object `true` (= `"force"`) emulates `prefers-color-scheme: dark` AND turns on Chromium's auto dark mode, so a page with no dark theme comes back dark; a page that has one is left alone. `"prefers"` is the m
dismissBanners boolean Hide known cookie/consent/chat banners with a curated stylesheet.
blockAds boolean Abort requests to known ad, analytics and session-replay hosts.
customCss string CSS injected after load.
customJs string JavaScript evaluated after load.
cookies array Per-request cookies. Renders with cookies are never cached or shared.
headers object Extra request headers.
basicAuth object
pdf object PDF-only geometry. Ignored unless `format` is `pdf`.
filename string Suggested download name, sanitised. Sets `content-disposition: inline; filename="…"` on the returned bytes and on the hosted `/i/c/{id}` file (`?download=1` there makes it an `attachment`). Include th
cache boolean Set false to force a fresh render.
responseType string `binary` streams the bytes; `json` stores the render and answers with a hosted URL.
View JSON Schema on GitHub

JSON Schema

snaplab-dev-render-options-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/snaplab-dev/json-schema/snaplab-dev-render-options-schema.json",
  "title": "RenderOptions",
  "description": "Exactly one of `url` or `html`/`template` must be given.",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/snaplab-dev-openapi.json#/components/schemas/RenderOptions",
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "format": "uri",
      "description": "Absolute http(s) URL to capture. Private, loopback, link-local and metadata addresses are refused."
    },
    "html": {
      "type": "string",
      "maxLength": 2000000,
      "description": "Raw HTML rendered instead of navigating. Subresources are still SSRF-filtered."
    },
    "template": {
      "type": "string",
      "maxLength": 2000000,
      "description": "HTML with `{{ path.to.value }}` placeholders, substituted from `data` and HTML-escaped."
    },
    "data": {
      "type": "object",
      "additionalProperties": true,
      "description": "Values for `template` (or for `html`, when no template is given)."
    },
    "css": {
      "type": "string",
      "maxLength": 500000,
      "description": "Stylesheet injected into `<head>` before load. html/template mode only."
    },
    "googleFonts": {
      "type": "string",
      "maxLength": 300,
      "description": "Comma-separated Google Fonts families, e.g. `Inter,Playfair Display` (max 6)."
    },
    "format": {
      "type": "string",
      "enum": [
        "png",
        "jpeg",
        "webp",
        "avif",
        "pdf"
      ],
      "default": "png"
    },
    "viewport": {
      "type": "string",
      "enum": [
        "desktop",
        "laptop",
        "tablet",
        "mobile",
        "wide"
      ],
      "default": "desktop",
      "description": "Preset size. `width`/`height`/`deviceScaleFactor` override individual axes."
    },
    "width": {
      "type": "integer",
      "minimum": 120,
      "maximum": 3840
    },
    "height": {
      "type": "integer",
      "minimum": 120,
      "maximum": 4320
    },
    "deviceScaleFactor": {
      "type": "number",
      "minimum": 0.5,
      "maximum": 3,
      "description": "Pixel ratio. 2 = retina."
    },
    "mobile": {
      "type": "boolean",
      "description": "Sugar for `viewport: \"mobile\"` (390x844 @3x, touch emulation)."
    },
    "fullPage": {
      "type": "boolean",
      "default": true,
      "description": "Capture the whole scrollable document. Ignored when `selector` is set."
    },
    "selector": {
      "type": "string",
      "maxLength": 512,
      "description": "Capture just this element. PDFs stay vector/selectable."
    },
    "quality": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "description": "jpeg/webp/avif only."
    },
    "waitUntil": {
      "type": "string",
      "enum": [
        "auto",
        "load",
        "domcontentloaded",
        "networkidle"
      ],
      "default": "auto",
      "description": "\"auto\" waits for load, then for the network to be quiet for 150ms, capped at 400ms. \"networkidle\" is the full Playwright wait and costs ~0.5s more."
    },
    "waitForSelector": {
      "type": "string",
      "maxLength": 512,
      "description": "Wait (up to 10s) for this selector before capturing."
    },
    "delayMs": {
      "type": "integer",
      "minimum": 0,
      "maximum": 30000
    },
    "scrollY": {
      "type": "integer",
      "minimum": 0,
      "maximum": 50000,
      "description": "Scroll down this many pixels first (triggers lazy loading)."
    },
    "hideSelectors": {
      "type": "array",
      "maxItems": 20,
      "items": {
        "type": "string",
        "maxLength": 512
      },
      "description": "Elements to hide before capturing. Comma-separated in a query string."
    },
    "darkMode": {
      "oneOf": [
        {
          "type": "boolean"
        },
        {
          "type": "string",
          "enum": [
            "prefers",
            "force"
          ]
        }
      ],
      "description": "`true` (= `\"force\"`) emulates `prefers-color-scheme: dark` AND turns on Chromium's auto dark mode, so a page with no dark theme comes back dark; a page that has one is left alone. `\"prefers\"` is the media query only."
    },
    "dismissBanners": {
      "type": "boolean",
      "default": true,
      "description": "Hide known cookie/consent/chat banners with a curated stylesheet."
    },
    "blockAds": {
      "type": "boolean",
      "default": false,
      "description": "Abort requests to known ad, analytics and session-replay hosts."
    },
    "customCss": {
      "type": "string",
      "maxLength": 20000,
      "description": "CSS injected after load."
    },
    "customJs": {
      "type": "string",
      "maxLength": 20000,
      "description": "JavaScript evaluated after load."
    },
    "cookies": {
      "type": "array",
      "maxItems": 40,
      "items": {
        "type": "object",
        "required": [
          "name",
          "value"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 256
          },
          "value": {
            "type": "string",
            "maxLength": 4096
          },
          "domain": {
            "type": "string",
            "maxLength": 256,
            "description": "Defaults to the target host."
          },
          "path": {
            "type": "string",
            "maxLength": 256,
            "default": "/"
          },
          "secure": {
            "type": "boolean"
          },
          "httpOnly": {
            "type": "boolean"
          },
          "sameSite": {
            "type": "string",
            "enum": [
              "Strict",
              "Lax",
              "None"
            ]
          },
          "expires": {
            "type": "integer",
            "description": "Unix seconds. Omit for a session cookie."
          }
        },
        "additionalProperties": false
      },
      "description": "Per-request cookies. Renders with cookies are never cached or shared."
    },
    "headers": {
      "type": "object",
      "additionalProperties": {
        "type": "string",
        "maxLength": 8192
      },
      "description": "Extra request headers."
    },
    "basicAuth": {
      "type": "object",
      "required": [
        "username",
        "password"
      ],
      "properties": {
        "username": {
          "type": "string"
        },
        "password": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "pdf": {
      "type": "object",
      "description": "PDF-only geometry. Ignored unless `format` is `pdf`.",
      "properties": {
        "format": {
          "type": "string",
          "enum": [
            "Letter",
            "Legal",
            "Tabloid",
            "Ledger",
            "A0",
            "A1",
            "A2",
            "A3",
            "A4",
            "A5",
            "A6"
          ],
          "default": "A4"
        },
        "landscape": {
          "type": "boolean",
          "default": false
        },
        "printBackground": {
          "type": "boolean",
          "default": true
        },
        "scale": {
          "type": "number",
          "minimum": 0.1,
          "maximum": 2,
          "default": 1
        },
        "preferCSSPageSize": {
          "type": "boolean",
          "default": false,
          "description": "Honour the page's own `@page size` rule instead of `format`."
        },
        "margin": {
          "type": "object",
          "description": "CSS lengths (`0.4in`, `1cm`, `12mm`…).",
          "properties": {
            "top": {
              "type": "string",
              "default": "0.4in"
            },
            "right": {
              "type": "string",
              "default": "0.4in"
            },
            "bottom": {
              "type": "string",
              "default": "0.4in"
            },
            "left": {
              "type": "string",
              "default": "0.4in"
            }
          },
          "additionalProperties": false
        },
        "headerTemplate": {
          "type": "string",
          "maxLength": 20000,
          "description": "HTML drawn at the top of every page, inside the top margin. It inherits none of the document's CSS, so set `font-size` explicitly and add your own side padding. Any element carrying the classes `pageNumber`, `totalPages`, `date`, `title` or `url` is filled in by Chromium."
        },
        "footerTemplate": {
          "type": "string",
          "maxLength": 20000,
          "description": "Same as `headerTemplate`, at the bottom of every page. Also accepts a built-in preset name: `@pageNumbers` (centred “Page N of M”) or `@pageNumbersUrl` (page numbers left, document URL right)."
        },
        "displayHeaderFooter": {
          "type": "boolean",
          "description": "Draw the running header and footer. Defaults to `true` as soon as either template is set; pass `false` to suppress both."
        },
        "pageRanges": {
          "type": "string",
          "maxLength": 200,
          "description": "Sheets to keep, in print-dialog syntax — `1-3`, `1,4,7-9`. Default: every page."
        },
        "media": {
          "type": "string",
          "enum": [
            "screen",
            "print"
          ],
          "default": "screen",
          "description": "Which stylesheet the paper is printed under. `print` honours the document's own print CSS (`@media print` rules, page breaks, hidden nav); `screen` keeps the on-screen look. Screenshots are always screen media."
        },
        "tagged": {
          "type": "boolean",
          "default": false,
          "description": "Emit a tagged (accessible) PDF with structure tags for screen readers."
        },
        "outline": {
          "type": "boolean",
          "default": false,
          "description": "Embed a document outline (PDF bookmarks) built from the page's headings."
        },
        "width": {
          "type": "string",
          "maxLength": 40,
          "description": "Exact paper width as a CSS length. Replaces `format`; ignored unless `height` is set too."
        },
        "height": {
          "type": "string",
          "maxLength": 40,
          "description": "Exact paper height as a CSS length."
        },
        "omitBackground": {
          "type": "boolean",
          "default": false,
          "description": "Drop background colours and images. The same knob as `printBackground: false`, and it wins over it."
        }
      },
      "additionalProperties": false
    },
    "filename": {
      "type": "string",
      "maxLength": 120,
      "description": "Suggested download name, sanitised. Sets `content-disposition: inline; filename=\"…\"` on the returned bytes and on the hosted `/i/c/{id}` file (`?download=1` there makes it an `attachment`). Include the extension you want — it is used verbatim."
    },
    "cache": {
      "type": "boolean",
      "default": true,
      "description": "Set false to force a fresh render."
    },
    "responseType": {
      "type": "string",
      "enum": [
        "binary",
        "json"
      ],
      "default": "binary",
      "description": "`binary` streams the bytes; `json` stores the render and answers with a hosted URL."
    }
  },
  "additionalProperties": false
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/snaplab-dev-render-options"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.