v1.0 · accepting API keys

Fill templates at the speed of an HTTP request.

Upload a Word, Excel, PowerPoint, or PDF template once. POST a JSON payload to /v1/render — instadoc fills the placeholders and streams back the finished document. No more hand-rolled docx-templater.

4
formats
< 1 s
cold render
EU
data residency
payload.json
{
"client": "Hover Logistics BV",
"invoice_no": "INV-2026-0421",
"amount": € 1,820.00,
"due_date": "2026-06-15"
}
invoice-INV-2026-0421.pdf200 OK · 412 ms

Invoice

INV-2026-0421

Atelier

Studio

Bill toHover Logistics BVDueJune 15, 2026Amount€ 1,820.00
Line items
12
Tax
21%
Currency
EUR
Generated · instadoc · 2026
Renders

Live counters

The numbers behind /v1/render.

Updated every five minutes. Coarse aggregates only — nothing about individual users, templates, or payloads is ever exposed.

2
Templates uploadedWord, Excel, PowerPoint, PDF
2
Documents renderedStreamed straight from /v1/render
1
Builders shippingActive accounts on the platform

01 / How it works

Three steps from a template to a finished file.

The flow is deliberately boring — one upload, one POST, one download. The hard parts (sandboxing, MIME validation, render timeouts, signed storage) live on our side.

  1. 01

    Upload your template

    A Word, Excel, PowerPoint, or PDF file with {{ placeholder }} syntax inside. Brand fonts, tables, images, conditional rows — all preserved.

  2. 02

    POST a JSON payload

    Reference the template by id, hand us your data. We sandbox the Jinja environment so untrusted payloads can’t escape the renderer.

  3. 03

    Stream back the document

    The rendered file comes straight back in the response body. No webhook dance. No polling. 200 OK · binary.

02 / What you get

All the things you’d otherwise have to build.

docx-templater on its own is a starting line, not a finish. We did the unglamorous parts so you can ship the feature, not the infrastructure.

Sandboxed by default

Each render runs in an isolated subprocess with a 15 s wall-clock kill, fresh tempdir, no network, and a Jinja SandboxedEnvironment. Untrusted payloads stay untrusted.

Cold renders under a second

Sub-second median end-to-end for docx / xlsx / pptx. PDF goes through a warmed LibreOffice pool and lands well under two seconds.

Compositions

Stitch multiple templates into one document with ordered, conditional blocks. JSONPath-driven block context, per-block overrides, hard caps so no single render runs away.

Themes for PowerPoint

Upload a .potx master once. Every template in a composition inherits its slide masters, fonts, and colour palette — enforced via signature hash on upload.

API keys, hashed

argon2id at rest. Full key body returned once at issue. Per-key rate limits, audit log on every render, prefix-only in our logs.

Template versioning

Every upload is a new immutable version. Roll forward or pin a render to a specific version — your templates change, your old documents don’t.

EU-hosted, audit-logged

Hosted in Amsterdam by default. Every privileged action lands in an append-only audit log. SOC 2 controls implemented; DPA on request.

Built for developers

OpenAPI 3 spec. Strict JSON schemas. Predictable error codes (402 for plan limits, 423 for locked, 401 for rotated keys). No surprise behaviour.

03 / Render in 12 lines

One POST. One document.

Pick your language. Copy the snippet. Swap in your API key and a template id. That’s the integration.

  • Acceptapplication/octet-stream
  • Idempotency-Keyany string up to 64 chars
  • Format override?format=pdf · docx · xlsx · pptx
  • Errors402 / 401 / 423 — never a 500 for plan limits
12345678910
curl -X POST https://api.instadoc.dev/v1/render?format=pdf \
-H "Authorization: Bearer $INSTADOC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"template_id": "tpl_invoice_v3",
"client": "Hover Logistics BV",
"invoice_no": "INV-2026-0421",
"amount": 1820.00,
"due_date": "2026-06-15"
}' --output invoice.pdf
200 OK · streams the binary directly · no signed URL dance

04 / Pricing

Three plans. No quotes. No sales calls.

Start on Starter. Move to Growth when production calls. Scale when you stop counting renders.

05 / FAQ

Questions worth answering up front.

If we missed yours, email us. Replies come from a person.

Which file formats do you render?

Microsoft Word (.docx), Excel (.xlsx), PowerPoint (.pptx), and PDF (via a sandboxed LibreOffice pipeline). Upload a template once, define placeholders with familiar Jinja-style syntax, and render at scale.

How is this different from spinning up python-docx myself?

It saves you the eight things you didn’t budget for: sandboxing untrusted Jinja, killing runaway renders, MIME sniffing on upload, rate-limiting per API key, audit logging, signed download URLs, a managed PDF pipeline, and a billing surface. We render in an isolated subprocess with hard ulimits and a 15 s wall-clock kill on every request.

Is my data stored?

Templates are stored encrypted at rest in DigitalOcean Spaces. Render payloads are never persisted — they’re held in memory just long enough to fill the template and stream the result back. Rendered output isn’t cached server-side unless you opt in for replay.

Do you support compositions and shared themes?

Yes. A composition is an ordered, conditional list of template blocks rendered into one output — supported across all four formats. PowerPoint compositions can share a theme (.potx master) so every slide deck inherits the same brand. Hard limits: 50 blocks per composition, 200 slides or pages per render.

How do I authenticate?

Issue an API key in your dashboard and pass it as Authorization: Bearer …. Keys are hashed with argon2id; the full key body is shown to you exactly once at creation and never logged.

Can I cancel anytime?

Yes — month-to-month, no contracts. Cancelling reverts you to Starter at the end of the billing period; your templates stay where they are.

What about SOC 2 / GDPR / data residency?

We’re hosted in the EU (Amsterdam) by default. SOC 2 is on our roadmap; we already follow the controls (audit logging, least-privilege access, encrypted secrets, signed webhooks). Need a DPA? Email us — every customer on Growth and up gets one on request.

Ready when you are

Stop hand-rolling docx-templater.

Spin up a free API key in under a minute. Render your first document on the same coffee.

Or read the docs →