Free beta — 1,000 calls/month, no card required

Convert anything.
Ship instantly.

One API call. Every document format. Zero infrastructure.

// your first conversion in under 5 minutes

request
curl -X POST https://api.apijolt.com/v1/html-to-pdf \ -H "Authorization: Bearer aj_live_xxxx" \ -H "Content-Type: application/json" \ -d '{ "url": "https://yourapp.com/invoice/1234" }'
response — binary PDF 200 OK
HTTP/1.1 200 OK Content-Type: application/pdf Content-Length: 8472 %PDF-1.4 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 2 0 obj << /Type /Pages /Kids [3 0 R] /Count 1 >> endobj ... 8,472 bytes of PDF. No config. No server. No 2am maintenance window.

Managing a document pipeline is complex

You have a product to build. Features to ship. Users who are waiting.

And yet — here you are. Three hours deep into a Puppeteer crash inside Docker. Or fighting wkhtmltopdf because it eats your CSS for breakfast. Or discovering that LibreOffice needs a display server to run headless in production.

Or reading a six-year-old Stack Overflow thread that ends with “works on my machine.”

This is infrastructure. Boring, brittle, not-your-job infrastructure.

Your users don’t pay for your PDF pipeline.
They pay for your product.

🐳
Puppeteer in Docker
Works locally. Crashes in prod. Needs a display server you forgot about. You realize this at midnight.
💀
wkhtmltopdf
Eats your CSS for breakfast. Doesn’t support flexbox. The last release was 2019.
📦
LibreOffice headless
Needs a display server. Leaks memory every few hours. Has to be restarted occasionally.

One request. Zero dependencies.

No package to install. No server to provision. No runtime to babysit. An HTTPS call from any language, any stack, any environment.

request
curl -X POST https://api.apijolt.com/v1/html-to-pdf \ -H "Authorization: Bearer aj_live_xxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "html": "<h1>Invoice #1042</h1><p>Due: $240.00</p>" }'
response — binary PDF 200 OK
Content-Type: application/pdf Content-Length: 6218 %PDF-1.4 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 2 0 obj << /Type /Pages /Kids [3 0 R] ... ... 6,218 bytes of PDF ...
request
curl -X POST https://api.apijolt.com/v1/url-to-pdf \ -H "Authorization: Bearer aj_live_xxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "url": "https://yourapp.com/report/annual", "response_type": "base64" }'
response — base64 JSON 200 OK
{ "pdf": "JVBERi0xLjQKMSAwIG9iaiA8PC9UeXBlIC9DYXRhb2...", "size": 9341 } // base64-encoded — drop straight into // n8n, Zapier, or Make. No download step.
request
curl -X POST https://api.apijolt.com/v1/word-to-pdf \ -H "Authorization: Bearer aj_live_xxxxxxxxxxxx" \ -F "[email protected]"
response — binary PDF 200 OK
Content-Type: application/pdf Content-Disposition: attachment; filename="contract.pdf" Content-Length: 42819 %PDF-1.4 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj ... 42,819 bytes of PDF ...
request — format auto-detected
# Unsure of the format? /convert-to-pdf handles it. curl -X POST https://api.apijolt.com/v1/convert-to-pdf \ -H "Authorization: Bearer aj_live_xxxxxxxxxxxx" \ -F "[email protected]"
response — binary PDF 200 OK
Content-Type: application/pdf Content-Length: 18204 %PDF-1.4 ... xlsx → PDF, no config, no guessing ...
Node.js — base64 for no-code workflows
const res = await fetch("https://api.apijolt.com/v1/url-to-pdf", { method: "POST", headers: { "Authorization": "Bearer aj_live_xxxxxxxxxxxx", "Content-Type": "application/json" }, body: JSON.stringify({ url: "https://yourapp.com/invoice/1042", response_type: "base64" }) }); const { pdf } = await res.json();
response 200 OK
{ "pdf": "JVBERi0xLjQKMSAwIG9iaiA8PC9UeXBlIC9DYXRhb2...", "size": 9341 } // pass pdf directly into n8n / Zapier / Make
PHP — stream binary PDF to browser
$response = Http::withToken(env('APIJOLT_KEY')) ->post('https://api.apijolt.com/v1/url-to-pdf', [ 'url' => 'https://yourapp.com/invoice/1042', ]); header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="invoice.pdf"'); echo $response->body();
response — binary PDF 200 OK
Content-Type: application/pdf Content-Length: 11048 %PDF-1.4 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj ... streamed directly to browser ...

Pick how you want your PDF back.

Multiple response modes. Covers every integration pattern without extra steps or adapters.

response_type: "binary"

Raw PDF bytes

Get the PDF as a direct binary response — the default. Stream it straight to the browser, pipe it to S3, save it to disk. Zero overhead, maximum flexibility.

Browser streams, S3 uploads, file storage
response_type: "base64"

Base64 in JSON

Get the PDF encoded directly inside the JSON response. No extra HTTP request to download the file. Native fit for n8n, Zapier, and Make — use it without a separate file step.

n8n · Zapier · Make · no-code workflows

Every format. One endpoint.

No MS Office licence. No display server. No headless browser to spin up yourself.

Input Endpoint Engine
HTML string /v1/html-to-pdf Headless Chrome — full CSS & JS
Any URL /v1/url-to-pdf Headless Chrome — full CSS & JS
Markdown /v1/markdown-to-pdf GFM parser + Chrome (tables, code blocks, task lists)
DOCX / DOC / ODT / RTF /v1/word-to-pdf LibreOffice
XLSX / XLS / ODS / CSV /v1/spreadsheet-to-pdf LibreOffice
PPTX / PPT / ODP /v1/presentation-to-pdf LibreOffice
JPG / PNG / WebP / GIF / BMP / TIFF /v1/image-to-pdf ImageMagick
Anything above /v1/convert-to-pdf Auto-detected · no guessing · no config

Files deleted in 1 hour.
In plain English,
not a Trust Center.

Your converted files are automatically purged from our servers after 60 minutes. We’re not logging your documents. We’re not training on them.

We’re saying it here, in plain English — not buried in clause 14(b) of a DPA.

No vendor lock-in. No data warehouse. Just a conversion API that does what it says and gets out of the way.

Works wherever you work.

Any language. Any stack. Any environment. If it can make an HTTP request, it works with APIJolt.

Languages
Node.js PHP Python Ruby Go .NET anything with HTTP
No-code
n8n Zapier Make Airtable Notion
AI-native
MCP server Cursor Claude Code CLI tool
~/.claude/claude_desktop_config.json  ·  or run: claude mcp add apijolt
{ "mcpServers": { "apijolt": { "command": "npx", "args": ["-y", "@getapijolt/mcp"], "env": { "APIJOLT_API_KEY": "aj_live_xxxxxxxxxxxx" } } } } # Tools available: html_to_pdf, markdown_to_pdf, # url_to_pdf, file_to_pdf, check_usage
.cursor/mcp.json  (project)  ·  or ~/.cursor/mcp.json (global)
{ "mcpServers": { "apijolt": { "command": "npx", "args": ["-y", "@getapijolt/mcp"], "env": { "APIJOLT_API_KEY": "aj_live_xxxxxxxxxxxx" } } } } # Restart Cursor → open Settings → MCP # → confirm apijolt is listed as enabled

Flat monthly. No credits.
No surprises.

🚧 Paid plans are coming — beta is free.

All accounts get 1,000 conversions/month with full API access. No card. No trial. No catch. Beta users get an early adopter discount when paid plans launch.

Get your free key →
Launch
For early-stage products with real users and real volume.
~$29/month
10,000 conversions/month
Everything in Invoice
Priority conversion queue
24-hour file retention
Email support
Automate
For teams running document workflows — invoices, reports, pipelines.
~$79/month
50,000 conversions/month
Everything in Launch
Async jobs + webhook callbacks
HTML & JSON templating
72-hour file retention
Studio
For agencies and teams shipping document generation across multiple projects.
~$149/month
150,000 conversions/month
Everything in Automate
Higher rate limits
SLA
Priority support
No credits. No overages. No surprises.  ·  Flat monthly, hard cap, upgrade prompt — that’s the model.

Stop building infrastructure.
Start shipping features.

APIJolt is in free beta. 1,000 conversions a month, no card, no time limit. Full API access from the first request.

The document pipeline is solved. Go build the thing that matters.