DocgenTry it

TypeScript SDK

@philiprehberger/docgen

Generated client + hand-tuned pollRender helper. View source on GitHub.

Install

shell
npm install @philiprehberger/docgen

Quickstart

Author a template, freeze a version, submit a render, poll until terminal.

typescript
import {
  Configuration,
  TemplatesApi,
  RendersApi,
  pollRender,
} from '@philiprehberger/docgen';

const config = new Configuration({
  basePath: 'https://api.docgen.philiprehberger.com',
  accessToken: process.env.DOCGEN_API_KEY,   // docgen_live_…
});

const templates = new TemplatesApi(config);
const renders = new RendersApi(config);

// 1. Create a template
const template = await templates.createTemplate({
  templateCreate: {
    name: 'Invoice',
    body: '<h1>Invoice {{ number }}</h1><p>Total: {{ total }}</p>',
  },
});

// 2. Freeze v1
await templates.createTemplateVersion({ templateId: template.id });

// 3. Submit a render
const render = await renders.createRender({
  renderCreate: {
    templateId: template.id,
    formats: ['pdf'],
    data: { number: 'INV-001', total: '$2,625.00' },
  },
});

// 4. Poll until terminal
const done = await pollRender(renders, render.id);

if (done.status === 'succeeded') {
  const pdfUrl = done.outputs.find((o) => o.format === 'pdf')!.url;
  console.log(`Download: ${pdfUrl}`);
}

The pollRender helper

Exponential backoff (500ms → 5s ceiling), configurable wall-clock budget.

typescript
import { pollRender, PollRenderTimeout } from '@philiprehberger/docgen';

const controller = new AbortController();

try {
  const done = await pollRender(renders, render.id, {
    maxWaitMs: 30_000,
    signal: controller.signal,
  });
} catch (e) {
  if (e instanceof PollRenderTimeout) {
    // Render didn't finish in time; the job is still running.
  }
}

Sync mode. Add ?sync=true to the request via the runtime override to block up to 15s for an inline response — useful for single-page renders where you don't want to poll.

AbortSignal. The signal option threads through the polling loop, so you can wire it to a UI cancel button without leaving an orphan timer running.