Skip to content

POSTapi.pdfpipe.xyz/v1/pdf

HTML goes in.
A finished PDF comes out.

PDFPipe is the rendering layer between your app and the file. Send HTML, a URL or a saved template with JSON; the browsers, queues, retries and fonts are ours to run. Most documents render in under a second on our side (median 0.3 s).

100 documents a month free. No card.

Your request

POST /v1/pdf
Authorization: Bearer pp_live_••••••••
{
  "html": "<article class=\"invoice\">…</article>",
  "options": {
    "format": "A4",
    "margin": "18mm",
    "tabular_nums": true
  }
}
ready

One request, drawn with sample values. The stages are the ones every render goes through and the headers are the ones every response carries. The real renderer is in the next section.

Inside PDFPipe

  1. 01ValidateKey, quota and payload checked
  2. 02QueueAdmitted by plan priority
  3. 03LoadWaits for styles, fonts, images
  4. 04PrintA4, 18 mm margins
  5. 05CheckOutput verified as a PDF
  6. 06DeliverBytes back, or stored with a link

The file210 × 297 mm

waiting for the response…

02 In thirty seconds

Send HTML, a URL or a template. Get the finished PDF back.

One request in, one file out. The same call works from your code or from an AI agent.

Using an AI agent? Install the MCP server npx -y pdfpipe-mcp-server

03 The real renderer

Edit a document. Render it with the live API.

Change the markup, the data, the page size or the margins and watch the layout move. When it looks right, send it: the PDF below then comes from the same renderer your key will use.

04 The hard part

Printing a web page is easy once. Doing it all day is infrastructure.

On a laptop, a headless browser and a print call look like the whole job. In production they turn into a fleet: pinned browser versions, the same fonts on every box, a queue in front, memory limits, timeouts, retries, and somebody on call when month-end invoices stall.

Most teams build that layer by accident, one incident at a time, and then maintain it forever. PDFPipe is that layer, already built. Here is what it does at each stage of a render.

page 1
Hosting and monitoring$480.00
Checkout flow prototype$480.00
Accessibility audit$480.00
Accessibility audit$480.00
Travel, 12 June$480.00
page 2
no print CSS
the row is cut by the page edge
page 1
Hosting and monitoring$480.00
Checkout flow prototype$480.00
Accessibility audit$480.00
Travel, 12 June$480.00
page 2
tr { break-inside: avoid }
the row moves to page 2, whole
  1. 01Validate

    What goes wrongBad options and oversized payloads fail late, after the work was paid for.

    What PDFPipe doesFormats, margins and options are checked before anything renders. HTML up to 5 MB, URLs up to 2,048 characters. Quota is taken atomically, so two requests can never both spend the last document.

    400 invalid_request413 payload_too_large402 quota_exceeded

  2. 02Queue

    What goes wrongMonth-end spikes start a browser per request until memory runs out.

    What PDFPipe doesAn admission queue holds each render until a browser is free. Scale, Business and Enterprise wait in a priority lane. Nobody hangs: past the lane's wait you get a 503 with Retry-After.

    503 renderer_unavailableRetry-After: 5

  3. 03Load

    What goes wrongFonts and images arrive after the print. Untrusted HTML reaches your internal network.

    What PDFPipe doesPrinting waits for stylesheets, then fonts and images, up to a cap, and names whatever failed. Every request the page makes, redirects included, is checked against private address space.

    X-PDFPipe-Warnings400 ssrf_blocked

  4. 04Print

    What goes wrongRows split across pages. Headers, footers and page numbers need their own layout pass.

    What PDFPipe doesPrint CSS is honoured: break-inside, @page sizes with prefer_css_page_size. header_html and footer_html run on every page with .pageNumber and .totalPages, and margins widen to fit them.

    Server-Timing: load, print

  5. 05Check

    What goes wrongA browser that crashes mid-render hands back a blank or broken file, and it still counts.

    What PDFPipe doesTransient browser failures are retried with backoff on every plan, keeping the render's place. The output has to be a PDF before it leaves. A render that fails is refunded to your quota.

    X-PDFPipe-Retried: true

  6. 06Deliver

    What goes wrongFiles that need a server to hold them, links anyone can open, callbacks nobody can verify.

    What PDFPipe doesThe bytes come back in the response. With store: true the file is kept for your plan's retention, behind your key, with signed expiring links to share. Render webhooks are signed to the Standard Webhooks spec.

    X-PDFPipe-Document-Idwebhook-signature

05 Limits you can read

Every response says where you stand.

Plan, usage, limit and what is left ride on every PDF response, so your code can warn before it runs out instead of finding out from a customer.

There is no overage. At the limit, the next request gets a 402 with the upgrade options and the reset date, never a surprise line on an invoice. Failed renders are refunded and do not count.

2,961 / 3,000

Starter plan, 3,000 documents a month. Drag to move through the month.

The next POST /v1/pdf200
HTTP/1.1 200 OK
Content-Type: application/pdf
X-PDFPipe-Plan: starter
X-PDFPipe-Usage: 2962
X-PDFPipe-Limit: 3000
X-PDFPipe-Remaining: 38
X-PDFPipe-Cache: miss
Server-Timing: queue;dur=0, load;dur=118, print;dur=164, total;dur=352

Example values. Header names and the 402 body are the API's own.

06 Start

Your first PDF, in the time it takes to read this section.

  1. 1

    Get a key

    Sign up with an email. The key is issued on the spot, 100 documents a month, no card.

  2. 2

    Send one request

    HTML, a URL, or a template id with data. The PDF comes back as the response body.

  3. 3

    Keep it or stream it

    Save the bytes yourself, or add store: true and fetch it later by id or a signed link.

curl https://api.pdfpipe.xyz/v1/pdf \
  -H "Authorization: Bearer $PDFPIPE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"html": "<h1>Invoice #4012</h1>", "options": {"format": "A4"}}' \
  -o invoice.pdf
Any language with an HTTP client works the same way.

SDK source on GitHubEvery render optionFramework guidesOpenAPI spec

07 Rate card

A flat monthly price for a fixed number of documents.

One document is one render, whatever its length. No credits, no multipliers, and no overage: at the limit you get a 402, not a bill.

Prices in USD. Upgrades apply the moment payment clears.

  • Hobby

    Key issued instantly. No card.

    $0 /mo
    Documents / month
    100
    Batch
    none
    Storage
    1 day
    Support target
    72 h, best effort
    Seats
    1
  • Starter

    Password-protected PDFs.

    $19 /mo
    Documents / month
    3,000
    Batch
    10 per call
    Storage
    30 days
    Support target
    48 h
    Seats
    1
  • Growth

    Render webhooks and delivery history.

    $49 /mo
    Documents / month
    15,000
    Batch
    50 per call
    Storage
    1 year
    Support target
    24 h
    Seats
    1
  • Scale

    Priority render lane. 99.9% SLA with credits.

    $149 /mo
    Documents / month
    50,000
    Batch
    100 per call
    Storage
    2 years
    Support target
    8 h
    Seats
    2
  • Business

    Audit log. 99.9% SLA with credits.

    $299 /mo
    Documents / month
    100,000
    Batch
    250 per call
    Storage
    2 years
    Support target
    8 h
    Seats
    5
  • Enterprise

    Invoice billing, custom terms.

    Custom
    Documents / month
    Set in contract
    Batch
    500 per call
    Storage
    Custom
    Support target
    4 h
    Seats
    Unlimited

Every plan: the full API, both SDKs, the MCP server, retries on failed renders, and failed renders refunded.

Scale and Business: a 99.9% monthly uptime SLA with service credits, measured on the status page.

Stored documents need your key to open; share them with signed, expiring links.

Refunds: not happy in the first 14 days, email and get your money back.

08 Questions

Before you wire it in.

Something else? hello@pdfpipe.xyz reaches the person who wrote the renderer.

What do you do with the HTML and PDFs I send?

Renders run in an isolated environment with no stored credentials. Unless you set store: true, a PDF rendered from HTML is held in a short-lived cache scoped to your account for up to 10 minutes, so an identical request is served instantly, then discarded. With store: true it is kept for your plan's retention window and deleted automatically after it. Document content is never read, trained on, or shared. The security page has the detail.

How fast is a render, and what if one fails?

Most documents render in under a second on our side (median 0.3 s); pages that pull remote fonts or images take as long as those take to arrive. Every render returns a valid PDF or a structured error with a code. Transient browser failures are retried automatically on every plan, and a render that still fails is refunded to your quota.

What happens at my monthly limit?

The next request returns HTTP 402 with the upgrade options and the date your allowance resets, so your code can handle it. There are no overage charges on any plan. Upgrade at any time and the new limit applies as soon as payment clears.

Can I store documents and share links?

Yes. Add store: true to a render and you get a document id and URL back. Opening that URL needs your API key; for a link you can hand to someone else, call POST /v1/documents/:id/link for a signed, expiring URL.

Do you have an uptime commitment?

Scale and Business include a 99.9% monthly uptime SLA with service credits, measured on the public status page. Support targets run from 72 hours best effort on Hobby to 4 hours on Enterprise.

Which languages does it work with?

Anything that can send an HTTPS POST. There are first-party SDKs for Node.js (pdfpipe-node) and Python (pdfpipe-python), an n8n node, and an MCP server for AI agents. Everything else uses its own HTTP client.

Is there a refund policy?

Yes. If you are not happy within the first 14 days, email hello@pdfpipe.xyz for a full refund. After that you can cancel at any time and keep access to the end of the billing period.

One request away from your first page.

terminal
curl https://api.pdfpipe.xyz/v1/pdf \
  -H "Authorization: Bearer $PDFPIPE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com"}' -o page.pdf