# PDF API (/experiments/pdf-api)



Generate a PDF from any URL using Browser Rendering and Puppeteer's `page.pdf()` API.

## API Endpoint [#api-endpoint]

### GET /pdf [#get-pdf]

Renders the specified URL in a headless browser and returns a PDF document.

**`url`** `string` (required)

The website URL to render (must be http or https)

#### Example Request [#example-request]

```bash
curl "https://your-worker.workers.dev/pdf?url=https://www.cloudflare.com" \
  --output page.pdf
```

#### Success Response [#success-response]

Returns a PDF file with the following headers:

```http
Content-Type: application/pdf
Cache-Control: public, max-age=60
```

#### Error Response [#error-response]

```json
{
  "error": "Missing or invalid query parameter: url",
  "code": "INVALID_URL"
}
```

#### Error Codes [#error-codes]

* `400` - Missing or invalid `url` parameter (not http/https)
* `502` - PDF generation failed (`PDF_ERROR`)

## Use Cases [#use-cases]

* Convert web pages to printable PDF documents
* Archive rendered page content with styles
* Generate invoices or reports from HTML pages
* Learn Browser Rendering PDF generation with Workers bindings

## Deployment [#deployment]

<Steps>
  <Step>
    ### Click the deploy button [#click-the-deploy-button]

    [![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/shrinathsnayak/cloudflare-experiments/tree/main/apps/experiments/pdf-api)
  </Step>

  <Step>
    ### Enable Browser Rendering [#enable-browser-rendering]

    This experiment requires Browser Rendering on your Cloudflare account. See the [Browser Rendering docs](https://developers.cloudflare.com/browser-rendering/).
  </Step>

  <Step>
    ### Test your deployment [#test-your-deployment]

    ```bash
    curl "https://your-worker.workers.dev/pdf?url=https://www.cloudflare.com" \
      --output page.pdf
    ```
  </Step>
</Steps>

## Local Development [#local-development]

```bash
cd apps/experiments/pdf-api
npm install
npm run dev
```

<Callout>
  `npm run dev` uses `wrangler dev --remote` so a real browser instance is available. Local dev without `--remote` will not work.
</Callout>

Test locally:

```bash
curl "http://localhost:8787/pdf?url=https://www.cloudflare.com" --output test.pdf
```

## Cloudflare Features Used [#cloudflare-features-used]

* **[Workers](https://developers.cloudflare.com/workers/)** - Edge compute runtime
* **[Browser Rendering](https://developers.cloudflare.com/browser-rendering/)** - Headless Chromium via `@cloudflare/puppeteer`
* **Puppeteer `page.pdf()`** - PDF generation from rendered pages
