The HTML-to-PDF engine for serious document volume.

Design documents as HTML templates, POST your data, get pixel-perfect PDFs: invoices, payslips, statements, certificates, labels. One REST API, from a single render to a 40,000-document payroll run.

# one invoice, right now
curl -X POST https://api.kimidoc.com/v1/render \
  -H "X-Api-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"html": "<h1>Invoice {{no}}</h1>", "data": {"no": "A-1042"}}' \
  -o invoice.pdf

HTTP/2 200 · application/pdf · 48 KB
Fast enough to feel instant, a single document comes back while your user waits Built for the whole payroll run, not one document at a time Encrypted per recipient, watermarked, sealed Pixel-perfect: your CSS, your fonts, your charts, right-to-left included
Built for document workloads

Everything between "template" and "delivered PDF"

KimiDoc is a document pipeline, not a screenshot tool: templating, batch orchestration, post-processing, and delivery, engineered as one system.

Batch jobs at payroll scale

Submit a template plus 40,000 data rows. Poll or get a webhook. Failures are per-document, so one bad record never kills the run, and jobs survive restarts.

Encryption & permissions

AES-256 with per-recipient passwords straight from your data ({{employee.dob}}), plus no-print / no-copy / no-modify restrictions.

Watermarks & assembly

Stamp DRAFT / COPY / VOID across every page, prepend cover pages, append terms & conditions, server-side, per document.

Templates & assets

Start from 100+ ready-made templates across 20 categories, store yours with sample data, upload logos and fonts once and reference them as asset://logo.png. No data-URI bloat, works fully offline.

AI template generation

Describe the document, get an editable template with sample data. Bring your own OpenAI-compatible key, or configure one server-wide; KimiDoc hosts no model and never stores your key.

Real paged media

Page numbers, running headers and footers with plain CSS @page, with no JavaScript hacks. Custom page sizes down to 80 mm receipt rolls.

Streaming & webhooks

NDJSON streaming input for batches beyond request-size limits, ZIP output with a reconciliation manifest, HMAC-signed completion webhooks.

The engine

Always warm. Never spawning.

The common way to render HTML to PDF is to launch a browser per document and pay for it in latency and memory: a launch costs hundreds of milliseconds before rendering even begins, and each instance wants hundreds of megabytes. KimiDoc keeps a fixed pool of renderers warm and routes every request to one that is already running.

No cold starts

Your request never waits for a browser to boot. The pool is up before the request arrives, which is why single documents come back while your user is still watching the spinner.

Queue, not fork

Under load, documents queue onto the fixed pool instead of forking processes until memory runs out. Throughput stays steady and the machine stays predictable, through a 40,000-document run.

One lean service

The whole engine is a single service with a pool sized to the machine, which is what makes self-hosting practical on modest hardware instead of a container fleet.

Running your own browsers instead? See the honest comparison.

Your documents, your rules

Cloud when you want speed. Self-hosted when data can't leave.

Both run the identical engine. Use the cloud API in minutes, or run KimiDoc inside your network, where payslips and statements never touch third-party infrastructure.

Cloud API

api.kimidoc.com

Zero infrastructure. Sign up, grab a key, render.

  • TLS, storage and scaling handled for you
  • Template editor with live preview
  • Usage dashboard and per-key metering
Create your account
Self-hosted

Your servers, your network

The documents never leave your network. No callbacks, no telemetry, no fonts fetched at render time. It runs in an air-gapped subnet with no route to the internet at all.

Licensed per server. Tell us about your setup and we will send the build, the install steps and a licence sized to it.

Talk to us about self-hosting
The flagship workload

A payroll run in one request

Encrypted per employee, watermarked, terms attached, delivered as a ZIP with a reconciliation manifest, and a signed webhook when it's done.

curl -X POST https://api.kimidoc.com/v1/jobs \
  -H "X-Api-Key: $KEY" -H "Content-Type: application/json" -d '{
    "templateId": "payslip-2026",
    "documents":  [ …40,000 employee records… ],
    "output": {
      "filenameTemplate": "payslip-{{employee.id}}.pdf",
      "encrypt":  { "userPassword": "{{employee.dob}}", "allowCopy": false },
      "stamp":    { "text": "CONFIDENTIAL" },
      "assemble": { "append": ["terms.pdf"] }
    },
    "webhook": { "url": "https://erp.example.com/hooks/payroll", "secret": "…" },
    "idempotencyKey": "payroll-2026-08"
  }'

HTTP/2 202 · job queued · 40,000 documents · poll /v1/jobs/{id}
See it before you sign up

100+ ready-made templates. Every preview is a real render.

Not mockups. Each one below was produced by the engine you would be calling, from that template's own sample data. Open the PDFs and check. Invoices, payslips, statements, labels, certificates and contracts across twenty categories, free to take and change.

Browse all templates

Self-hosted

When the document is the sensitive part

A payslip carries a salary. A statement carries a balance. A discharge summary carries a diagnosis. For plenty of teams the blocker was never the rendering; it was sending that data to somebody else's server at all.

Data residency you can point at

Run it in the region, datacentre or rack you are already accountable for. There is no cross-border transfer to document, because there is no transfer: the data never leaves the machine you installed it on.

Nothing phones home

No telemetry, no licence check-in, no usage beacon. Remote fetching is off by default, so a template cannot pull an asset from the internet unless you allow that host yourself.

Your retention rules, not ours

You choose how long rendered documents live and where the files sit. Delete a job and the PDFs go with it, on storage you control, backed up under whatever policy you already run.

Auditable by inspection

One service, one database file, one storage directory. Your security team can read the config, watch the ports and see exactly what it does, rather than taking a vendor's word from a questionnaire.

Where teams put it

Payroll and HRPayslips, Form 16s, offer letters and experience certificates. Salary data that finance would rather never left the building.
Banking and insuranceStatements, policy documents and remittance advice, generated inside the same network as the core system that holds them.
HealthcareDischarge summaries, lab reports and prescriptions, rendered where the patient record already lives.
Government and public sectorCertificates, notices and permits on infrastructure that procurement already approved, air-gapped where required.
Legal and professional servicesEngagement letters, agreements and bills of costs, under client-confidentiality obligations that outsourcing complicates.
LogisticsLabels, manifests and delivery notes printed at the depot, still working when the site's uplink is not.
E-commerce and retailOrder confirmations, tax invoices and return labels at checkout volume, webhooked straight into the fulfilment flow.
Education and trainingCertificates, transcripts, admit cards and completion letters: one template per program, one batch per cohort.
Questions people actually ask

Before you sign up

Do I need to install anything to try it?

No. Sign up, take the API key and POST your HTML. The free tier needs no card. If you would rather it never touched our servers at all, self-hosted runs the same engine inside your own network; it is licensed per server, so get in touch and we will size it with you.

What is the difference between the cloud API and self-hosted?

The engine is identical. The cloud API means no infrastructure to run, on a monthly plan; self-hosted means the documents and the data behind them never leave your network, licensed per server. Self-hosted has no telemetry and no licence check-in, and runs in an air-gapped subnet with no route to the internet.

Can it handle a full payroll or statement run?

That is what the batch endpoint is for. Submit up to 40,000 documents in one job, poll it or take a webhook when it finishes, and download the results as a single archive. Failures are tracked per document and can be retried without repeating the run.

How do I keep each document private to its recipient?

Encrypt per document with a password drawn from that recipient's own data, such as an employee number or a date of birth. You can also restrict printing, copying and modification, watermark every page, and append fixed pages such as terms and conditions.

What do my templates have to be written in?

Plain HTML and CSS, with {{placeholders}} where your data goes. Anything you can lay out for print works: flexbox, grid, SVG, web fonts, charts, right-to-left scripts. Every starter template on this site is an ordinary HTML file you can read and change.

What exactly counts against my quota?

Documents, not API calls. A render that fails is never counted, and previews in the editor are not counted either. A 5,000-payslip job counts as 5,000 documents.

Can I move from the cloud API to self-hosted later?

Yes, and nothing about your templates or your integration changes: same API, same template format. Teams often prototype on the cloud API and move the production workload in-house once it matters.

Is there a limit on templates or storage?

Templates are unlimited on every plan. Rendered documents and uploaded assets share a storage quota, and you choose how long finished jobs are kept before their files are cleaned up.

Pricing

One meter. Everything included.

You pay for successfully rendered documents, nothing else. Unlimited templates on every plan. Watermarking, encryption, merging, batch jobs and webhooks included. Failed renders never count, and previewing a template in the editor counts as none. Pay yearly and two months are free.

Free

$0
₹0 · forever
  • 100 documents / month
  • 24-hour output retention
  • 1 AI template generation
  • Every feature, no card
  • Unlimited templates
Start free

Starter

$9 /month
₹799 / month
or $90 / year, two months free
  • 1,000 documents / month
  • 3-day output retention
  • 10 AI template generations
  • Everything in Free
  • Email support
Get started

Growth

$29 /month
₹2,499 / month
or $290 / year, two months free
  • 5,000 documents / month
  • 7-day output retention
  • 50 AI template generations
  • Everything in Starter
  • Priority rendering
Get started

Business

$69 /month
₹5,999 / month
or $690 / year, two months free
  • 20,000 documents / month
  • 14-day output retention
  • 150 AI template generations
  • Everything in Growth
  • Priority support
Get started

Scale

$149 /month
₹12,999 / month
or $1,490 / year, two months free
  • 50,000 documents / month
  • 30-day output retention
  • 300 AI template generations
  • Everything in Business
  • Volume pricing above this
Get started
Your infrastructure

Self-hosted: the plan where the data never leaves

Most rendering APIs are cloud-only. The identical KimiDoc engine also installs inside your own network, which changes what you can put through it: payslips, statements, patient records, documents you could never send to a third party.

  • Documents render on hardware you control; nothing crosses a border
  • No telemetry, no licence check-in, nothing phones home
  • Unlimited documents, retention rules you set, air-gap friendly

Licensed per server, per year

Talk to us Why teams self-host
Documents, not requests. Every paid plan works out to less than a cent per document. A 5,000-payslip batch counts as 5,000 documents; previewing a template in the editor counts as none. Self-hosted is licensed per server, so talk to us about volume, multi-tenant mode or a custom plan.