Ironfang · Schema

ScreenshotRequest

Developer ToolsScreenshotswebsite screenshotHTML to PDFPDF APIImage APIOG Image APIQR Code APIWebsite-to-VideoRendering InfrastructureMCPUK-hosted

Properties

Name Type Description
no_cache boolean Force a fresh render instead of serving a cached one. Always billable. Excluded from the cache key, so repeated fresh requests do not collide.
block_ads boolean Drop requests to known ad and tracker networks before they load. Stopped as network requests rather than hidden afterwards, so the page never spends time fetching them.
block_cookie_banners boolean Hide common consent banners, and undo the scroll lock they set - without which a full-page capture is one viewport tall. Hidden, not accepted. Clicking "accept" would be a decision made on the site ow
hide_selectors array CSS selectors to hide before capturing. Applied after load, so elements injected by script are covered.
headers object Extra HTTP headers sent with every request for the page.
cookies array Cookies to set before navigating. Set beforehand because a session cookie that arrives after load has missed the request it was meant to authenticate.
authorization string Sets the `Authorization` header - the common case, spelled once. An explicit `Authorization` in `headers` wins over this.
user_agent string Overrides the user agent, including any set by `device`.
wait_until string When the page counts as ready. `networkidle` waits for traffic to stop and is bounded by the render timeout, because a page with polling never truly idles.
wait_for_selector string Wait for this element before capturing. Fails the render if it never appears, rather than returning a half-drawn page.
timeout_ms integer Per-render timeout. Clamped to the service maximum - it can lower the ceiling but not raise it.
device_scale_factor number Pixel density. 2 is retina: the same CSS size at twice the pixels.
url string Page to capture. Mutually exclusive with `html`.
html string Markup to render. Mutually exclusive with `url`.
width integer Viewport width in pixels.
height integer Viewport height. Ignored when `full_page` is set.
full_page boolean Capture the whole scrollable page.
selector string CSS selector of a single element to capture instead of the viewport.
clip object
omit_background boolean Transparent background instead of the page's own. Ignored for `jpeg`, which has no alpha channel.
full_page_max_height integer Cap a `full_page` capture at this many pixels. An infinite-scroll page has no natural end, so 20000 applies when none is given, and is also the most that can be asked for.
dark_mode boolean Render with `prefers-color-scheme: dark`.
format string PNG is lossless and the default. WebP is typically a fraction of the size for the same picture, which is what matters when the output is served to browsers or social crawlers.
quality integer Quality for the lossy formats, `jpeg` and `webp`. Ignored for PNG.
device string Capture as a phone or tablet rather than a desktop window that happens to be narrow. Sets the viewport, the device pixel ratio, touch, and a matching mobile user agent together - width alone gets medi
delay_ms integer Extra settle time after load. Renderwolf watches the page and captures when it stops changing, so this is rarely needed - use it for content that arrives on a timer, which quiescence cannot anticipate
View JSON Schema on GitHub

JSON Schema

ironfang-screenshot-request-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/ironfang/main/json-schema/ironfang-screenshot-request-schema.json",
  "title": "ScreenshotRequest",
  "x-generated": "2026-09-28",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/ironfang-render-api-openapi.yml#/components/schemas/ScreenshotRequest",
  "allOf": [
    {
      "$ref": "#/$defs/RenderCommon"
    },
    {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "format": "uri",
          "description": "Page to capture. Mutually exclusive with `html`."
        },
        "html": {
          "type": "string",
          "description": "Markup to render. Mutually exclusive with `url`."
        },
        "width": {
          "type": "integer",
          "default": 1280,
          "maximum": 4096,
          "description": "Viewport width in pixels."
        },
        "height": {
          "type": "integer",
          "default": 800,
          "maximum": 4096,
          "description": "Viewport height. Ignored when `full_page` is set."
        },
        "full_page": {
          "type": "boolean",
          "default": false,
          "description": "Capture the whole scrollable page."
        },
        "selector": {
          "type": "string",
          "description": "CSS selector of a single element to capture instead of the\nviewport.\n"
        },
        "clip": {
          "$ref": "#/$defs/Clip"
        },
        "omit_background": {
          "type": "boolean",
          "default": false,
          "description": "Transparent background instead of the page's own. Ignored for\n`jpeg`, which has no alpha channel.\n"
        },
        "full_page_max_height": {
          "type": "integer",
          "default": 20000,
          "maximum": 20000,
          "description": "Cap a `full_page` capture at this many pixels. An\ninfinite-scroll page has no natural end, so 20000 applies when\nnone is given, and is also the most that can be asked for.\n"
        },
        "dark_mode": {
          "type": "boolean",
          "default": false,
          "description": "Render with `prefers-color-scheme: dark`."
        },
        "format": {
          "type": "string",
          "enum": [
            "png",
            "jpeg",
            "webp"
          ],
          "default": "png",
          "description": "PNG is lossless and the default. WebP is typically a fraction of\nthe size for the same picture, which is what matters when the\noutput is served to browsers or social crawlers.\n"
        },
        "quality": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 85,
          "description": "Quality for the lossy formats, `jpeg` and `webp`. Ignored for PNG."
        },
        "device": {
          "type": "string",
          "enum": [
            "desktop",
            "tablet",
            "mobile"
          ],
          "description": "Capture as a phone or tablet rather than a desktop window that\nhappens to be narrow. Sets the viewport, the device pixel ratio,\ntouch, and a matching mobile user agent together - width alone\ngets media queries right and everything else wrong.\n\nAn explicit `width` or `height` still wins, so a preset can be\nused for the density and user agent while overriding the size.\n"
        },
        "delay_ms": {
          "type": "integer",
          "minimum": 0,
          "maximum": 10000,
          "description": "Extra settle time after load. Renderwolf watches the page and\ncaptures when it stops changing, so this is rarely needed - use\nit for content that arrives on a timer, which quiescence cannot\nanticipate. Capped at ten seconds.\n"
        }
      }
    }
  ],
  "$defs": {
    "Clip": {
      "type": "object",
      "description": "A rectangle in CSS pixels from the top left of the page.",
      "required": [
        "width",
        "height"
      ],
      "properties": {
        "x": {
          "type": "number",
          "default": 0
        },
        "y": {
          "type": "number",
          "default": 0
        },
        "width": {
          "type": "number",
          "maximum": 4096
        },
        "height": {
          "type": "number",
          "maximum": 4096
        }
      }
    },
    "Cookie": {
      "type": "object",
      "required": [
        "name",
        "domain"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "value": {
          "type": "string"
        },
        "domain": {
          "type": "string",
          "description": "Required. Chromium silently drops a domainless cookie set before\nnavigation, so the render would quietly come back logged out.\n"
        },
        "path": {
          "type": "string",
          "default": "/"
        }
      }
    },
    "RenderCommon": {
      "type": "object",
      "properties": {
        "no_cache": {
          "type": "boolean",
          "default": false,
          "description": "Force a fresh render instead of serving a cached one. Always\nbillable. Excluded from the cache key, so repeated fresh requests\ndo not collide.\n"
        },
        "block_ads": {
          "type": "boolean",
          "default": false,
          "description": "Drop requests to known ad and tracker networks before they load.\nStopped as network requests rather than hidden afterwards, so the\npage never spends time fetching them.\n"
        },
        "block_cookie_banners": {
          "type": "boolean",
          "default": false,
          "description": "Hide common consent banners, and undo the scroll lock they set -\nwithout which a full-page capture is one viewport tall.\n\nHidden, not accepted. Clicking \"accept\" would be a decision made\non the site owner's behalf and recorded as theirs.\n"
        },
        "hide_selectors": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "CSS selectors to hide before capturing. Applied after load, so\nelements injected by script are covered.\n"
        },
        "headers": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "Extra HTTP headers sent with every request for the page."
        },
        "cookies": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Cookie"
          },
          "description": "Cookies to set before navigating. Set beforehand because a session\ncookie that arrives after load has missed the request it was meant\nto authenticate.\n"
        },
        "authorization": {
          "type": "string",
          "description": "Sets the `Authorization` header - the common case, spelled once.\nAn explicit `Authorization` in `headers` wins over this.\n"
        },
        "user_agent": {
          "type": "string",
          "description": "Overrides the user agent, including any set by `device`.\n"
        },
        "wait_until": {
          "type": "string",
          "enum": [
            "load",
            "domcontentloaded",
            "networkidle"
          ],
          "default": "load",
          "description": "When the page counts as ready. `networkidle` waits for traffic to\nstop and is bounded by the render timeout, because a page with\npolling never truly idles.\n"
        },
        "wait_for_selector": {
          "type": "string",
          "description": "Wait for this element before capturing. Fails the render if it\nnever appears, rather than returning a half-drawn page.\n"
        },
        "timeout_ms": {
          "type": "integer",
          "description": "Per-render timeout. Clamped to the service maximum - it can lower\nthe ceiling but not raise it.\n"
        },
        "device_scale_factor": {
          "type": "number",
          "minimum": 1,
          "maximum": 3,
          "description": "Pixel density. 2 is retina: the same CSS size at twice the pixels.\n"
        }
      }
    }
  }
}

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/ironfang-screenshot-request"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

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.