The open-source document generation engine for enterprise teams.

Epistola only does one job: turn structured data into perfect PDFs. Model templates, validate JSON Schema inputs, and promote render-ready versions across environments without dragging workflows or AI "intelligence" along for the ride.

200+

Template versions per variant

50–200ms

Render latency

Multi-tenant

Role & environment isolation

/ Trusted in regulated industries

Company A Company B Company C Company D

/ See it in action

From template to PDF in minutes.

Introduction video coming soon

/ How it works

A single path from template to PDF.

01

Model + author

Define input variables per template, manage variants, and drag blocks in the visual editor with live PDF preview.

02

Promote + govern

Freeze versions, assign them to staging/production environments, and gate releases behind reviewer approvals per tenant.

03

Render + deliver

Call the REST API or batch jobs, render PDFs in milliseconds, then push artifacts via storage adapters or webhooks.

/ Why Epistola

A single-purpose document generator you can trust.

Keep your processes simple: orchestrate elsewhere, render here, and never worry about PDF fidelity again.

Open-source first

Inspect every line of code, contribute renderers, and self-host on your own infrastructure.

Common Ground native

Epistola speaks ZGW APIs and aligns with Dutch municipal standards out of the box.

Integrates anywhere

Expose a simple HTTP API so workflow engines like GZAC or Valtimo stay in control.

Quality output

PDF/A, PDF/X, web-ready bundles, and template testing pipelines keep every document consistent.

/ Deploy Anywhere

Keep orchestration elsewhere. Let Epistola handle the PDFs.

Self-host with Docker, run on Kubernetes, or consume the managed service. Either way, you stay in control of data, security, and release cadence.

/ Everything you need to render PDFs

Epistola does templates and rendering — nothing else.

Keep workflows in the products that orchestrate your cases while Epistola focuses on perfect output.

Templates

Template lifecycle

Variants, immutable versions, and draft/publish/archived states per tenant with audit trails and schema migrations.

Learn more

Authoring

Visual editor

Drag-and-drop blocks with conditional logic, loops, live PDF preview, and inline expression chips.

Learn more

Logic

Expression engine

Use flexible expressions to calculate totals, format values, and apply conditional logic. Define input variables per template.

Learn more

Rendering

Direct PDF renderer

Render PDF/A and PDF/X outputs directly — no HTML conversion step. Handles 10,000+ documents per minute on simple hardware.

Learn more

Operations

Multi-tenant governance

Role-based access, environment promotions (staging/production), and per-tenant default themes keep teams isolated.

Learn more

Delivery

API + jobs

OpenAPI 3.1 REST endpoints for single or batch renders with adaptive job sizing, webhooks, and storage adapters.

Learn more

/ Built for orchestrators

Drop into ZGW, Valtimo, or bespoke stacks without touching workflows.

Epistola exposes a narrow surface: JSON in, PDF/HTML out. Multi-tenant auth via Keycloak, Helm charts, and health probes make it feel like any other platform service in your cluster.

Current render job

Payload intake · Besluit

Queued
  1. 1

    Orchestrator

    Emit signed JSON + tenant slug; webhooks register batch IDs.

  2. 2

    Validation

    Verify schema version, tenant access, and required fields.

  3. 3

    Queue

    Assign job ID and enqueue render on the tenant pool.

/ DocOps architecture

Editor → template service → renderer: a single document generation lane.

Epistola Suite is unapologetically about generation, not analytics or AI insights. Authors design templates, developers automate the render API, and platform teams run the Helm stack — all centered on getting compliant PDFs out the door.

Business authors

Drag/drop blocks, manage schema examples, and preview PDFs with inline expression evaluation.

  • Block library: text, tables, columns, clauses, headers, footers
  • Undo/redo + autosave stacks
  • Inline expression tester

Developers

Version templates in Git, run Testcontainers suites, and invoke the OpenAPI-render API from orchestrators.

  • API commands for template + theme automation
  • Adaptive batch jobs with job states and metrics
  • Webhooks + storage adapters (S3, Azure, DMS)

Platform ops

Deploy Helm charts with Keycloak/OIDC, monitor renders, and promote versions across environments.

  • Multi-tenant isolation + RBAC memberships
  • Environments per tenant (staging/production)
  • Prometheus/OTel metrics + health probes

/ Architecture flow

From template to document — watch the data flow.

Epistola generates documents on demand. Click through the steps or let the animation play to see how data flows between systems.

1

Caseworker starts process

Caseworker → Zaakafhandelsysteem

A caseworker initiates a case process in the zaakafhandelsysteem — for example handling an objection ("bezwaar").

2

Collect case data

Zaakafhandelsysteem → Data Source

GET /zaken/BZ-2024-001/eigenschappen
{ "zaaktype": "bezwaar", "eigenschappen": [...] }

The zaakafhandelsysteem gathers case data from the ZRC, ZTC, and other configured data sources.

3

Request document generation

Zaakafhandelsysteem → Epistola

POST /api/v1/documents/generate
{ "templateId": "bezwaar-v2", "data": { "zaak": "BZ-2024-001", ... } }

Plugin sends a generation request to Epistola with the resolved template and all variable data.

4

Render and store document

Epistola → Temporary Storage

PUT /documents/gen-48291.pdf
{ "contentType": "application/pdf", "size": "142KB" }

Epistola renders the template with the provided data and stores the resulting PDF in temporary storage.

5

Publish completion event

Epistola → Open Notificaties

POST /api/v1/notificaties
{ "kanaal": "documenten", "hoofdObject": "...", "actie": "create" }

Epistola publishes a notification via the Open Notificaties API to signal the document is ready for pickup.

6

EpistolaDocumentGenerated

Open Notificaties → Zaakafhandelsysteem

EVENT EpistolaDocumentGenerated
{ "resourceUrl": "/tmp-storage/gen-48291.pdf" }

Open Notificaties delivers the event callback to the zaakafhandelsysteem — the document is ready for pickup.

7

Collect document

Zaakafhandelsysteem → Temporary Storage

GET /tmp-storage/gen-48291.pdf
{ "format": "application/pdf", "bytes": 145291 }

The zaakafhandelsysteem uses the resource URL from the event to download the generated PDF from temporary storage.

8

Register in Documenten API

Zaakafhandelsysteem → DRC

POST /enkelvoudiginformatieobjecten
{ "titel": "Besluit op bezwaar", "informatieobjecttype": "besluit" }

The zaakafhandelsysteem stores the PDF in the Documenten API (DRC), linking it to the original case for archival.

9

Document available

Zaakafhandelsysteem → Caseworker

The caseworker can now view and download the generated document from within the zaakafhandelsysteem.

Step 1 / 9

/ Connect everything

Wire Epistola in through the APIs you already own.

Common Ground support ships out of the box today; other orchestrators are delivered via custom adapters while we expand the integration catalog.

Common Ground ready

Built-in alignment with Common Ground APIs keeps municipalities compliant without reinventing orchestration.

Open REST API

Every template, clause, and delivery endpoint is controllable via our documented REST interface, ready for any stack.

Custom adapters

We co-design integrations for the orchestrators on your roadmap—no prebuilt connectors yet, but expert services on call.

Integration roadmap

We're actively validating packaged connectors for leading municipal orchestrators. Until those land, teams can move forward using REST endpoints, event hooks, and service engagements tailored to their environment.

8.2k

templates in git

140k

render jobs / day

100%

pdf/a compliance

4.1k

docker pull / month

/ Customer impact

Trusted with high-stakes documents.

"Epistola is the simplest part of our case platform. We send JSON, we get flawless PDF/A output back. That focus is refreshing."

Customer Name

Product Owner

"Common Ground compliance was non‑negotiable. Epistola spoke the same language from day one."

Customer Name

Solution Architect

"We keep workflows in our orchestrator and let Epistola handle rendering. Separation of concerns, just like it should be."

Customer Name

Lead Developer

/ Frequently asked questions

Everything you need to know

Answers about launch timelines, integrations, compliance, and support.

Answer

How fast can we launch?

Timelines mainly depend on how quickly your infrastructure lands. Epistola ships everything you need on day one, so once access is provisioned we can start templating immediately. Our optional AI-assisted authoring trims the time it takes to shape bespoke templates.

/ Next step

Interested in what Epistola can do for your product?

Schedule a call and ask us any of your questions.

Hoe wilt u contact opnemen? *