PaperType

Generate a PDF in Zapier or Make

Neither Zapier nor Make renders PDFs on its own, but both can call an HTTPS API from a built-in step: Webhooks by Zapier and Make's HTTP app. The two platforms hand files to later steps differently, so the API offers both shapes: the PDF as the response body (Make) or a JSON response with a 24-hour download link (Zapier). Every request body on this page was run against the live API before it was published.

Which response shape to use

Both platforms send the same JSON request; only the output field differs.

  • Make: leave output out. The response body is the PDF, and Make's HTTP module exposes it as binary Data that any file field can map (email attachment, Drive upload, Slack file).
  • Zapier: send "output": "url". The response is JSON with a url that is valid for 24 hours. Zapier's own documentation says a file field accepts either a file object or a publicly accessible direct-download link; Webhooks by Zapier parses responses as JSON or text rather than as a file, so the link is the shape that works. Map url into the attachment field of the next step.

With output: "url" the finished PDF (never your source) is kept at an unguessable link for 24 hours and then deleted; see the privacy policy. Without it, nothing is stored.

Zapier: Markdown to PDF with Webhooks by Zapier

Create a free API key at /signup. In your Zap add the action Webhooks by Zapier → Custom Request (listed as available on the Free plan in Zapier's help centre as of October 2026) and fill it in:

  • Method POST, URL https://papertype.dev/v1/pdf.
  • Data: the JSON below, with fields from earlier steps inserted where the placeholders are.
  • Headers: Authorization = Bearer dp_your_key and Content-Type = application/json.
{
  "markdown": "{{markdown_from_previous_step}}",
  "title": "{{title_from_previous_step}}",
  "theme": "clean",
  "toc": true,
  "page_numbers": true,
  "filename": "report.pdf",
  "output": "url"
}

Test the step. The response Zapier shows is:

{
  "url": "https://papertype.dev/v1/files/XXXXXXXXXXXXXXXX.pdf",
  "filename": "report.pdf",
  "pages": 2,
  "bytes": 23150,
  "expires_at": "2026-10-23T03:14:00Z"
}

In the next step (Gmail Send Email, Google Drive Upload File, Slack Send Channel Message with a file) map url into the file or attachment field; Zapier downloads it when the Zap runs. Multi-line Markdown with quotes is the usual snag: Zapier inserts the field value as-is, so a double quote or a literal newline inside it breaks the JSON. Either keep the Markdown in a single-line field, or use the POST event instead of Custom Request with Payload Type JSON and one Data row per field (markdown, title, output = url), which lets Zapier do the escaping. Boolean options like toc cannot be sent as true booleans from the POST event's key-value form; the API accepts "true" and "false" strings for them.

Make: Markdown or HTML to PDF with the HTTP module

Add the module HTTP → Make a request (HTTP app version 4). Make's documentation recommends keeping credentials in a keychain rather than typing them into a header, so choose Authentication type API key and create a keychain with Header, key Authorization, value Bearer dp_your_key. Then:

  • URL https://papertype.dev/v1/pdf, Method POST.
  • Body content type application/JSON, Body input method Data structure (Make escapes quotes and newlines in mapped values for you). Fields: markdown (or html), title, theme, toc, page_numbers, filename.
  • Parse response No. The PDF arrives as the module's binary Data output, ready to map into any file field.

If you prefer the JSON string input method, this is the body (the same one the live check used):

{
  "markdown": "{{1.markdown}}",
  "title": "{{1.title}}",
  "theme": "clean",
  "toc": true,
  "page_numbers": true,
  "filename": "report.pdf"
}

Connect the next module and map the file: Email → Send an email → Attachments → File name report.pdf, Data = the HTTP module's Data; Google Drive → Upload a file → same two fields; Slack → Upload a file likewise. Make a request also accepts "output": "url" with Parse response Yes if a later step wants a link rather than bytes, for example a chat message with a download link.

Invoice PDF from form or sheet data

Both platforms can fill the hosted invoice template from a form submission, a spreadsheet row or a CRM deal. The body is the same in either tool; in Make use the Data structure input and map each field, in Zapier paste it into Custom Request → Data with your fields in the placeholders:

{
  "template": "invoice",
  "data": {
    "number": "INV-1042", "date": "2026-10-22", "due_date": "2026-11-21", "currency": "USD",
    "from": {"name": "Northwind Studio", "address_lines": ["12 Example Road", "Springfield"]},
    "to": {"name": "Acme Client Ltd", "address_lines": ["1 Sample Street", "Shelbyville"]},
    "items": [{"description": "Design, October", "quantity": 10, "unit_price": 120}],
    "tax_rate": 8.25, "tax_label": "Sales tax"
  },
  "page_size": "Letter",
  "filename": "INV-1042.pdf",
  "output": "url"
}

Drop output in Make to receive the bytes. Line items from a spreadsheet arrive as an array in Make's Iterator/Array aggregator and as a line-item field in Zapier; either way items must be a JSON array of objects with description, quantity and unit_price. A missing required field (for example date) returns a 422 whose message names the field. The certificate and report templates take the same route with their own fields.

Limits that matter in automations

  • Images. The renderer has no network access. Images, fonts and stylesheets at external URLs are never fetched; inline them as data: URIs. A request that references an external URL fails with a 422 that names the URL, rather than silently dropping the asset. Put the logo in the request as a data:image/png;base64,… URI (Make has a base64() function; in Zapier store the finished data: URI in a text field or a Storage value and insert it).
  • 2 MB of source per request, 300 pages per document, 2 concurrent renders per account. Larger inputs return 413.
  • Quota. Free-plan output carries a small papertype.dev footer mark. Paid plans (from $9/month) do not. A Zap or scenario that fires on every form submission can use the free plan's 50 documents quickly; watch X-Quota-Used in the response headers, and the API returns 429 at the limit rather than billing overage.
  • Links expire. A url response is valid for 24 hours; attach or upload it within the same run rather than storing the link.
  • Errors. A 401, 413, 422 or 429 comes back as JSON with a detail message. In Make set Return error if HTTP request fails to Yes so a 4xx stops the scenario (or add an error handler route); in Zapier the step errors and the Zap run stops, so check the quota before high-volume Zaps. Failed renders are not counted against the quota.
  • No JavaScript is executed. Send the final HTML; anything a script would have drawn or filled in will not appear.

Questions

Is there a native PaperType app in Zapier or Make?

Not yet. Both platforms publish partner apps through a review process in the vendor's name; until that exists, the built-in webhook and HTTP steps above do the same job and will keep working afterwards.

Is the download link private?

It is public but unguessable (96 random bits in the id) and it expires 24 hours after the render. Anyone who has the exact link can download the file until then, which is also what lets Zapier fetch it. Do not post the link somewhere public if the document is confidential; use Make's binary path or the API directly instead.

Do I need a paid Zapier plan for Webhooks by Zapier?

Zapier's help centre lists Webhooks by Zapier as available on the Free, Professional, Team and Enterprise plans (checked October 2026). Plans change; check Zapier's current pricing page.

Can I send HTML built in an earlier step?

Yes. Send `html` instead of `markdown`; the other options are the same. Inline images and custom fonts as data: URIs; nothing is fetched from the network.

Why does my Zapier test fail with a 422 about JSON?

The field you inserted into the JSON contained a double quote or a newline, which breaks the body. Use the POST event with Payload Type JSON and one Data row per field so Zapier escapes values for you, or keep the Markdown on one line with \n where you want breaks.

Related

Free previews carry a watermark and are deleted after 24 hours. Free API output carries a footer mark. The renderer runs no JavaScript and never fetches external URLs. Privacy · Terms · Refunds