---
title: "Render a URL or HTML (query form)"
method: GET
path: "/api/render"
tags: ["Rendering"]
---

# Render a URL or HTML (query form)

`GET /api/render`

## Request

- Base URL: `https://snaplab.dev`
- URL: `https://snaplab.dev/api/render`
- Auth: one of:
  - HTTP bearer
  - API key in query parameter `keyId` and API key in query parameter `sig`

Every option as a query parameter, so a render can sit in an `<img src>`. Accepts a bearer key or a signed URL (`keyId` + `sig`).

## Query parameters

- `url` string
- `html` string
- `template` string
- `data` string
- `css` string
- `googleFonts` string
- `format` 'png' | 'jpeg' | 'webp' | 'avif' | 'pdf'
- `viewport` 'desktop' | 'laptop' | 'tablet' | 'mobile' | 'wide'
- `width` integer
- `height` integer
- `deviceScaleFactor` number
- `mobile` 'true' | 'false' | '1' | '0'
- `fullPage` 'true' | 'false' | '1' | '0'
- `selector` string
- `quality` integer
- `waitUntil` 'auto' | 'load' | 'domcontentloaded' | 'networkidle'
- `waitForSelector` string
- `delayMs` integer
- `scrollY` integer
- `hideSelectors` string
- `darkMode` 'true' | 'false' | '1' | '0' | 'prefers' | 'force'
- `dismissBanners` 'true' | 'false' | '1' | '0'
- `blockAds` 'true' | 'false' | '1' | '0'
- `customCss` string
- `customJs` string
- `cache` 'true' | 'false' | '1' | '0'
- `responseType` 'binary' | 'json'
- `pdf.format` string
- `pdf.landscape` 'true' | 'false' | '1' | '0'
- `pdf.printBackground` 'true' | 'false' | '1' | '0'
- `pdf.scale` number
- `pdf.preferCSSPageSize` 'true' | 'false' | '1' | '0'
- `pdf.margin` string
- `pdf.headerTemplate` string
- `pdf.footerTemplate` string
- `pdf.displayHeaderFooter` 'true' | 'false' | '1' | '0'
- `pdf.pageRanges` string
- `pdf.media` 'print' | 'screen'
- `pdf.tagged` 'true' | 'false' | '1' | '0'
- `pdf.outline` 'true' | 'false' | '1' | '0'
- `pdf.width` string
- `pdf.height` string
- `pdf.omitBackground` 'true' | 'false' | '1' | '0'
- `filename` string
- `keyId` string
- `sig` string
- `expires` integer

## Response `200`

The rendered bytes.

- HostedRender: Answer for `responseType: "json"` — the render is stored and served from a public, immutable URL.
  - `url` string, uri, required
  - `id` string, required
  - `format` string, required
  - `width` integer
  - `height` integer
  - `bytes` integer, required
  - `cacheHit` boolean
  - `durationMs` integer

## Other responses

- `400`: Invalid options, or a target that resolves to a private/blocked address.
- `401`: Missing or invalid API key / signature.
- `402`: Subscription past due (`payment_required`).
- `422`: The render can never succeed as written (`selector_not_found`).
- `429`: Rate limit or monthly quota exceeded (`quota_exceeded`).
- `502`: The target site was unreachable (`upstream`).
- `503`: Queue saturated or browsers not ready. Retry after `Retry-After` seconds.
- `504`: The page did not finish in time (`timeout`).

---

[API](https://skmtc.dev/snaplab/apis/snaplab-api.md) · [All operations](https://skmtc.dev/snaplab/apis/snaplab-api/llms.txt) · [OpenAPI document](https://skmtc.dev/snaplab/apis/snaplab-api/revisions/4dbfbd8cd118?raw)
