All guidesInDesign / IDML

Automate InDesign projects

Turn a single InDesign layout into a rendering pipeline — batch outputs, dynamic fields, and PDF/PNG/JPEG/SVG generation with no InDesign install anywhere.

July 16, 2026·6 min read
Diagram: Automate InDesign projects

The problem

InDesign is a design tool, not a rendering server. The moment you need to generate a hundred name badges, a thousand certificates, or a weekly batch of social posts from one master layout, you're stuck: either someone opens InDesign and does it by hand, or you buy and run InDesign Server — a license, a machine, and an operations burden, just to turn a template into pixels.

Bluepic's IDML renderer is a plain HTTP API that does exactly that one job: take an InDesign file (exported as IDML) and a set of field values, and hand back rendered output. No InDesign install, no server to maintain, no license — a POST request from wherever your automation already lives (a cron job, a serverless function, a CI pipeline, your app's backend).

The building blocks

1. Export once. Design your master in InDesign, File → Export → InDesign Markup (IDML). This is your template — the thing you POST every time.

2. Render it.

POST https://api.bluepic.io/api/idml/render
Authorization: <your API key>
Content-Type: multipart/form-data

[email protected]
[email protected]
[email protected]

Every asset the IDML links to (images, fonts) goes in a repeated assets field, matched back to the document by filename — so name each part after what the IDML actually links (hero.jpg, not hero-final-v2.jpg). Anything you leave out renders as a placeholder rather than failing the request, so partial asset sets are safe to iterate on.

3. Pick your output. Query parameters control the render:

ParamWhat it does
formatpng, jpeg, pdf or svg
pagesall, or a 1-based list like 1,3,5
enginepuppeteer (full fidelity — the default) or resvg (faster PNG/JPEG, no Chromium)
dpiOutput resolution for raster and PDF, default 300
width / heightOverride the rendered size in px

Multiple pages come back as a single merged PDF (for format=pdf) or a zip with one file per page (PNG/JPEG/SVG) — one request, one response, no follow-up polling.

The API playground's Files and Options cards — the same parameters as the table above, live

4. Fill in the dynamic fields. This is what turns a converter into automation: textOverrides, a JSON object of {"<pageIndex>:<elementId>": "value"} pairs. Any text element you name gets replaced; anything you don't name keeps its source value. The interactive playground generates this JSON for you — load your IDML once, type into the fields you want to control, and copy the live-updating curl command as your starting point.

One field you'll almost always vary this way is a name — and names vary a lot in length. The text frame's size in InDesign is the hard ceiling any override gets fit inside (it shrinks or wraps, it never grows the frame), so size name/value fields generously for your longest real record, not just your test data. Full detail in Text frames, bounds & best practices. If a field has mixed formatting inside it, its override needs the array shape from Rich text format for overrides instead of a plain string.

A concrete pipeline: personalized certificates

const attendees = await getAttendeesFromYourDatabase(); // [{ name, date, score }, ...]

for (const attendee of attendees) {
  const textOverrides = {
    '0:TextFrame_name': attendee.name,
    '0:TextFrame_date': attendee.date,
    '0:TextFrame_score': `${attendee.score}%`,
  };

  const form = new FormData();
  form.append('idml', certificateIdml);
  form.append('assets', sealImage, 'seal.png');

  const res = await fetch(
    `https://api.bluepic.io/api/idml/render?format=pdf&textOverrides=${encodeURIComponent(JSON.stringify(textOverrides))}`,
    { method: 'POST', headers: { Authorization: apiKey }, body: form },
  );

  await saveFile(`certificate-${attendee.name}.pdf`, await res.blob());
}

Same shape works for event badges, invoice-style documents, personalized social graphics, or a weekly report that only changes three numbers — anywhere you'd otherwise open InDesign, change some text, and export by hand.

engine: fidelity vs. throughput

For a handful of renders, the default puppeteer engine (a real, full layout engine — the same technology behind the free converter) is the right call: full fidelity, every feature. For a large batch of simple PNG/JPEG exports where you're rendering hundreds or thousands of variants, engine=resvg skips the Chromium instance entirely and renders faster — worth benchmarking against your own document before committing to it for a production batch job.

Credits

Every account gets 100 free credits a month — 1 credit per rendered page, regardless of format or how many textOverrides you send. A 500-badge batch job is 500 credits; check usage and get in touch for higher volume from the account page.

Next steps

Back to all guidesGet your API key