---
title: "Free HTML/URL → PDF"
method: POST
path: "/api/tools/pdf"
tags: ["Free tools"]
---

# Free HTML/URL → PDF

`POST /api/tools/pdf`

## Request

- Base URL: `https://snaplab.dev`
- URL: `https://snaplab.dev/api/tools/pdf`
- Auth: none required

Public and key-less: 20 renders per day per IP, viewports capped at 1600px, and always answered with a hosted URL.

## Request body

- object
  - `url` string, uri
  - `html` string
  - `format` 'Letter' | 'Legal' | 'Tabloid' | 'A3' | 'A4' | 'A5'
  - `landscape` boolean
  - `darkMode` boolean
  - `dismissBanners` boolean
  - `blockAds` boolean

## Response `200`

A hosted render plus the caller's remaining daily budget.

- ToolResult: 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
  - `kind` 'screenshot' | 'pdf' | 'image'
  - `remainingToday` integer
  - `dailyLimit` integer

## Other responses

- `400`: Invalid options, or a blocked target.
- `429`: The free daily limit for this IP is spent (`tool_limit_reached`).
- `503`: Renderer busy.

---

[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)
