Pulp EngineDocument Rendering
Get started
OpenAPI 3.0.3v0.87.0· 333 operations across 28 tags

Pulp Engine API

Template management and document rendering API for Pulp Engine. Authenticate with X-Api-Key (scoped API keys) or X-Editor-Token (short-lived session token). See /docs for the interactive UI. API stability policy: https://github.com/TroyCoderBoy/PulpEngine/blob/main/docs/api-stability.md.

Preview

11 endpoints

post/render/preview/csv

Preview template CSV with an inline definition (editor use — no DB save required)

Preview template CSV with an inline definition (editor use — no DB save required).

operationId: previewCsv
Request body
Required · application/json
Responses
200CSV table data — or, when dryRun=true, a JSON DryRunResponse
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
504HTTP 504 response.
POST /render/preview/csv
post/render/preview/docx

Preview template DOCX with an inline definition (editor use — no DB save required)

Preview template DOCX with an inline definition (editor use — no DB save required).

operationId: previewDocx
Request body
Required · TemplateDefinition object (no DB lookup — editor preview only) · application/json
Responses
200DOCX document — or, when dryRun=true, a JSON DryRunResponse
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
504HTTP 504 response.
POST /render/preview/docx
post/render/preview/email

Preview email HTML, plain text and inline images

Preview email HTML, plain text and inline images.

operationId: previewEmail
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/preview/email
post/render/preview/expression

Evaluate an expression with server plugin functions

Evaluate an expression with server plugin functions.

operationId: previewExpression
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /render/preview/expression
post/render/preview/html

Preview template HTML with an inline definition (editor use — no DB save required)

Preview template HTML with an inline definition (editor use — no DB save required).

operationId: previewHtml
Parameters
NameInRequiredDescription
annotatequery
Request body
Required · TemplateDefinition object (no DB lookup — editor preview only) · application/json
Responses
200Rendered HTML document — or, when dryRun=true, a JSON DryRunResponse
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
504HTTP 504 response.
POST /render/preview/html
post/render/preview/image

Preview PDF pages as PNG, JPEG or WebP

Preview PDF pages as PNG, JPEG or WebP.

operationId: previewImage
Request body
Required · application/json
Responses
200One raster image or a ZIP of pages and manifest; JSON for dryRun.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/preview/image
post/render/preview/parameters

Resolve parameters for an unsaved report

Resolve parameters for an unsaved report.

operationId: previewParameters
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
POST /render/preview/parameters
post/render/preview/pdf

Preview template PDF with an inline definition (editor use — no DB save required)

Preview template PDF with an inline definition (editor use — no DB save required).

operationId: previewPdf
Parameters
NameInRequiredDescription
annotatequeryInclude preview-only node destinations for the editor page map.
streamqueryStreaming control. Unset (default) or true → chunked stream. false → force buffered response. Preview has no post-render hooks, so stream=true never errors.
Request body
Required · TemplateDefinition object (no DB lookup — editor preview only) · application/json
Responses
200PDF document stream — or, when dryRun=true, a JSON DryRunResponse
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
504HTTP 504 response.
POST /render/preview/pdf
post/render/preview/pptx

Preview template PPTX with an inline definition (editor use — no DB save required)

Preview template PPTX with an inline definition (editor use — no DB save required).

operationId: previewPptx
Request body
Required · TemplateDefinition object (no DB lookup — editor preview only) · application/json
Responses
200PPTX presentation — or, when dryRun=true, a JSON DryRunResponse
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
504HTTP 504 response.
POST /render/preview/pptx
get/render/preview/status

Preview capability status — cached startup snapshot; always returns 200

Returns whether the preview renderer was available when this process started. This is a startup snapshot, not a perpetual guarantee: if preview is available at startup but a later individual render fails, that travels the normal 422/500 path. Raw browser failure details are kept in server logs only.

operationId: getPreviewStatus
Responses
200Successful response.
GET /render/preview/status
post/render/preview/xlsx

Preview template XLSX with an inline definition (editor use — no DB save required)

Preview template XLSX with an inline definition (editor use — no DB save required).

operationId: previewXlsx
Request body
Required · application/json
Responses
200XLSX workbook — or, when dryRun=true, a JSON DryRunResponse
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
504HTTP 504 response.
POST /render/preview/xlsx

Batch

1 endpoint

post/batch/

Execute multiple GET requests in a single HTTP call

Accepts an array of GET sub-requests targeting template read surfaces (/templates, /templates/:key, /templates/:key/versions, /templates/:key/labels). Returns an array of {status, body} responses. Max 20 items. Auth scope: admin or editor.

operationId: submitReadBatch
Request body
Required · application/json
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
POST /batch/

PDF Transform

11 endpoints

post/render/pdf/attach

Attach files to a PDF

Attach files to a PDF.

operationId: attachPdfFiles
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /render/pdf/attach
post/render/pdf/facturx

Embed a Factur-X invoice in a PDF/A-3b document

Embed a Factur-X invoice in a PDF/A-3b document.

operationId: createFacturX
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /render/pdf/facturx
post/render/pdf/fill

Fill an existing AcroForm and optionally flatten its appearances

Fill an existing AcroForm and optionally flatten its appearances.

operationId: fillPdfForm
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /render/pdf/fill
post/render/pdf/form-fields

Inspect AcroForm fields and XFA status

Inspect AcroForm fields and XFA status.

operationId: listPdfFormFields
Parameters
NameInRequiredDescription
limitquery
offsetquery
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /render/pdf/form-fields
post/render/pdf/insert

Insert pages into a PDF

Insert all pages from one PDF into another at a specified position.

operationId: insertPdfPages
Request body
Required · application/json
Responses
200PDF with inserted pages
400Invalid request; inspect code and message.
401Authentication required.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /render/pdf/insert
post/render/pdf/merge

Merge multiple PDFs into one

Concatenate pages from multiple PDF documents into a single PDF, in the order provided.

operationId: mergePdf
Request body
Required · application/json
Responses
200Merged PDF
400Invalid request; inspect code and message.
401Authentication required.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /render/pdf/merge
post/render/pdf/process

Apply a pipeline of PDF operations

Apply a pipeline of PDF operations.

operationId: processPdf
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
404Resource not found.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
500Internal or render error; correlate X-Request-ID with server logs.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/pdf/process
post/render/pdf/process/upload

Process PDF files with a multipart JSON spec

Multipart fields: spec (JSON using sources[].part), and named PDF files. The spec is validated using the same operation schema as processPdf.

operationId: processPdfUpload
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
404Resource not found.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
500Internal or render error; correlate X-Request-ID with server logs.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/pdf/process/upload
post/render/pdf/protect

Encrypt a PDF with AES-256

Encrypt a PDF with AES-256.

operationId: protectPdf
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
500Internal or render error; correlate X-Request-ID with server logs.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/pdf/protect
post/render/pdf/sign

Apply a deployment-owned digital seal (admin only)

Apply a deployment-owned digital seal (admin only).

operationId: signPdf
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
500Internal or render error; correlate X-Request-ID with server logs.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/pdf/sign
post/render/pdf/watermark

Apply a watermark to a PDF

Overlay a text or image watermark on every page (or a page range) of a PDF.

operationId: watermarkPdf
Request body
Required · application/json
Responses
200Watermarked PDF
400Invalid request; inspect code and message.
401Authentication required.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /render/pdf/watermark

Templates

71 endpoints

get/promotion-requests

listPromotionInbox.

operationId: listPromotionInbox
Parameters
NameInRequiredDescription
statusquery
labelquery
versionquery
nodeIdquery
fromquery
toquery
limitquery
offsetquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
GET /promotion-requests
get/templates/

List all templates (paginated)

Returns a paginated list of templates. Use ?expand=versions,labels,lastRenders to include nested relations. When expand is present, limit is capped at 100.

operationId: listTemplates
Parameters
NameInRequiredDescription
kindquery
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
expandqueryComma-separated list of relations to include: versions, labels, lastRenders, permissions. When present, list limit is capped at 100.
qquery
keyquery
folderIdquery
folderPathquery
recursivequery
tagquery
ownerquery
labelquery
statequery
sortquery
orderquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
422Template or data failed validation; branch on code.
501Operation is not implemented.
GET /templates/
post/templates/

Create a new template

Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: createTemplate
Parameters
NameInRequiredDescription
folderIdquery
x-pulpengine-change-noteheaderPercent-encoded UTF-8 change note; up to 1000 decoded UTF-16 code units and 8 KB encoded. Optional on create.
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
POST /templates/
delete/templates/{key}

Delete a template (admin; soft-delete needs If-Match, permanent=true requires trash)

Delete a template (admin; soft-delete needs If-Match, permanent=true requires trash).

operationId: deleteTemplate
Parameters
NameInRequiredDescription
permanentquery
keypath✓
if-matchheaderCurrent version ETag, e.g. "1.0.3"
x-pulpengine-change-noteheaderPercent-encoded UTF-8 change note; at most 1000 decoded characters and 8 KB encoded.
Responses
204Template deleted
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
501Operation is not implemented.
DELETE /templates/{key}
get/templates/{key}

Get a template with its current definition

Get a template with its current definition.

operationId: getTemplate
Parameters
NameInRequiredDescription
expandqueryComma-separated list of relations to include: versions, labels, lastRenders, permissions. When present, list limit is capped at 100.
keypath✓
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}
put/templates/{key}

Update a template definition (requires If-Match header; auto-bumps version)

Update a template definition (requires If-Match header; auto-bumps version).

operationId: updateTemplate
Parameters
NameInRequiredDescription
keypath✓
if-matchheaderCurrent version ETag, e.g. "1.0.3"
x-pulpengine-change-noteheaderPercent-encoded UTF-8 change note; at most 1000 decoded characters and 8 KB encoded.
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
PUT /templates/{key}
get/templates/{key}/bindings

Discover bound paths and the effective input contract

Discover bound paths and the effective input contract.

operationId: getTemplateBindings
Parameters
NameInRequiredDescription
versionquery
labelquery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}/bindings
get/templates/{key}/comments

listTemplateComments.

operationId: listTemplateComments
Parameters
NameInRequiredDescription
statusquery
labelquery
versionquery
nodeIdquery
fromquery
toquery
limitquery
offsetquery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
GET /templates/{key}/comments
post/templates/{key}/comments

createTemplateComment.

operationId: createTemplateComment
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
POST /templates/{key}/comments
delete/templates/{key}/comments/{id}

deleteTemplateComment.

operationId: deleteTemplateComment
Parameters
NameInRequiredDescription
keypath✓
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
DELETE /templates/{key}/comments/{id}
patch/templates/{key}/comments/{id}

updateTemplateComment.

operationId: updateTemplateComment
Parameters
NameInRequiredDescription
keypath✓
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
PATCH /templates/{key}/comments/{id}
get/templates/{key}/compatibility

Compare payload contracts between revisions

Compare payload contracts between revisions.

operationId: compareTemplateContracts
Parameters
NameInRequiredDescription
basequery✓
candidatequery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}/compatibility
get/templates/{key}/datasets

List shared sample datasets with current schema validation

List shared sample datasets with current schema validation.

operationId: listTemplateDatasets
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
tagquery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
501Operation is not implemented.
GET /templates/{key}/datasets
delete/templates/{key}/datasets/{name}

Delete a shared sample dataset (idempotent)

Delete a shared sample dataset (idempotent).

operationId: deleteTemplateDataset
Parameters
NameInRequiredDescription
keypath✓
namepath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
501Operation is not implemented.
DELETE /templates/{key}/datasets/{name}
get/templates/{key}/datasets/{name}

Read a shared sample dataset

Read a shared sample dataset.

operationId: getTemplateDataset
Parameters
NameInRequiredDescription
keypath✓
namepath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
501Operation is not implemented.
GET /templates/{key}/datasets/{name}
put/templates/{key}/datasets/{name}

Create or update a shared sample dataset

Stores schema-invalid data with validation warnings. Optional If-Match protects revisions; use "0" to create only.

operationId: putTemplateDataset
Parameters
NameInRequiredDescription
keypath✓
namepath✓
if-matchheader
Request body
Required · application/json
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
413Request exceeds the configured size limit.
501Operation is not implemented.
PUT /templates/{key}/datasets/{name}
get/templates/{key}/dependencies

Inspect transitive template and asset dependencies

Inspect transitive template and asset dependencies.

operationId: getTemplateDependencies
Parameters
NameInRequiredDescription
versionquery
labelquery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}/dependencies
get/templates/{key}/dependents

Find templates that use a shared component

Scans current and labelled versions in this tenant, including reachable version pins. Transitive traversal is bounded to five hops. Truncated scans must not be treated as exhaustive.

operationId: listTemplateDependents
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
transitivequery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}/dependents
post/templates/{key}/dependents/validate

Validate children against a saved or draft layout

Validate children against a saved or draft layout.

operationId: validateTemplateDependents
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
422Template or data failed validation; branch on code.
POST /templates/{key}/dependents/validate
post/templates/{key}/diff

Diff two stored versions of a template

Computes a structural diff between two stored versions of the same template key. Returns the raw TemplateDiff JSON from @pulp-engine/template-diff — metadata, renderConfig, inputSchema, fieldMapping, document-root, and document-tree changes plus aggregate counts. v1 scope: both versions must exist in the resolved tenant.

operationId: diffTemplateVersions
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
POST /templates/{key}/diff
delete/templates/{key}/draft

Delete your draft

Requires a named actor. Draft writes are last-write-wins and do not advance HEAD or labels.

operationId: deleteTemplateDraft
Parameters
NameInRequiredDescription
keypath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
DELETE /templates/{key}/draft
get/templates/{key}/draft

Read your draft

Requires a named actor. Draft writes are last-write-wins and do not advance HEAD or labels.

operationId: getTemplateDraft
Parameters
NameInRequiredDescription
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}/draft
put/templates/{key}/draft

Save your draft without publishing

Requires a named actor. Draft writes are last-write-wins and do not advance HEAD or labels.

operationId: putTemplateDraft
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
PUT /templates/{key}/draft
get/templates/{key}/drafts

List teammates’ draft summaries

Read-only draft summaries, scoped to the resolved tenant and template.

operationId: listTemplateDrafts
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}/drafts
get/templates/{key}/drafts/{owner}

Read a teammate’s draft

Read-only review; this operation cannot modify the teammate’s draft.

operationId: getTemplateDraftForReview
Parameters
NameInRequiredDescription
keypath✓
ownerpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}/drafts/{owner}
get/templates/{key}/effective

Get the template after applying its master layout

Get the template after applying its master layout.

operationId: getEffectiveTemplate
Parameters
NameInRequiredDescription
versionquery
labelquery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
422Template or data failed validation; branch on code.
GET /templates/{key}/effective
get/templates/{key}/form-metadata

Get form-rendering metadata for a template

Returns { key, version, title?, description?, inputSchema, hasFieldMappings } for the given template. Used by the <pulp-engine-form> embed to auto-generate a fillable form. hasFieldMappings=true signals that the template transforms raw input via fieldMappings; the v1 form refuses to render such templates because inputSchema describes the POST-MAPPING shape, not the submission shape.

operationId: getTemplateFormMetadata
Parameters
NameInRequiredDescription
versionqueryExact version to pin; mutually exclusive with label
labelqueryLabel name to resolve; mutually exclusive with version
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
GET /templates/{key}/form-metadata
get/templates/{key}/i18n

getTemplateI18n.

operationId: getTemplateI18n
Parameters
NameInRequiredDescription
formatquery
languagesquery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
GET /templates/{key}/i18n
put/templates/{key}/i18n

putTemplateI18n.

operationId: putTemplateI18n
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
PUT /templates/{key}/i18n
get/templates/{key}/labels

List all labels on a template

Returns every named label pointer and the version it resolves to. Dual-scoped: admin or editor.

operationId: listTemplateLabels
Parameters
NameInRequiredDescription
keypath✓
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}/labels
delete/templates/{key}/labels/{label}

Delete a label (admin-only)

Removes the label pointer. Idempotent — succeeds silently on unknown labels as long as the template exists. Admin scope required.

operationId: deleteTemplateLabel
Parameters
NameInRequiredDescription
forcequeryAllow deletion even when a component reference pins this label.
keypath✓
labelpath✓
Responses
204Successful response with no body.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
DELETE /templates/{key}/labels/{label}
get/templates/{key}/labels/{label}

Get the template definition at a labeled version

Resolves the label to its target version and returns the full template definition. Dual-scoped: admin or editor.

operationId: getTemplateAtLabel
Parameters
NameInRequiredDescription
asOfquery
keypath✓
labelpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
422Template or data failed validation; branch on code.
GET /templates/{key}/labels/{label}
put/templates/{key}/labels/{label}

Create or re-point a label (admin-only)

Creates the label if it does not exist, or re-points it if it does. The target version must be a saved version. Supports optimistic concurrency via the If-Match header: when present, the label's current version must match the supplied string or the request fails with 412 Precondition Failed. When absent, the label is upserted unconditionally (for automated promotion flows that trust their own serialization). Admin scope required.

operationId: setTemplateLabel
Parameters
NameInRequiredDescription
requireCompatiblequery
keypath✓
labelpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
PUT /templates/{key}/labels/{label}
get/templates/{key}/labels/{label}/history

listTemplateLabelHistory.

operationId: listTemplateLabelHistory
Parameters
NameInRequiredDescription
statusquery
labelquery
versionquery
nodeIdquery
fromquery
toquery
limitquery
offsetquery
keypath✓
labelpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
GET /templates/{key}/labels/{label}/history
post/templates/{key}/labels/{label}/schedule

scheduleTemplateLabel.

operationId: scheduleTemplateLabel
Parameters
NameInRequiredDescription
keypath✓
labelpath✓
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
POST /templates/{key}/labels/{label}/schedule
delete/templates/{key}/labels/{label}/schedule/{eventId}

cancelTemplateLabelSchedule.

operationId: cancelTemplateLabelSchedule
Parameters
NameInRequiredDescription
keypath✓
labelpath✓
eventIdpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
DELETE /templates/{key}/labels/{label}/schedule/{eventId}
delete/templates/{key}/lock

Release own lock or force release as admin

Release own lock or force release as admin.

operationId: releaseTemplateLock
Parameters
NameInRequiredDescription
sessionIdquery
forcequery
keypath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
DELETE /templates/{key}/lock
put/templates/{key}/lock

Acquire an advisory editing lock

Acquire an advisory editing lock.

operationId: acquireTemplateLock
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
PUT /templates/{key}/lock
patch/templates/{key}/meta

Update folder, tags and owner without creating a version

Update folder, tags and owner without creating a version.

operationId: updateTemplateMeta
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
PATCH /templates/{key}/meta
put/templates/{key}/office

Replace an Office template source and save a version

Replace an Office template source and save a version.

operationId: replaceOfficeTemplateSource
Parameters
NameInRequiredDescription
keypath✓
if-matchheaderCurrent version ETag, e.g. "1.0.3"
x-pulpengine-change-noteheaderPercent-encoded UTF-8 change note; at most 1000 decoded characters and 8 KB encoded.
Request body
Required · multipart/form-data
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
428If-Match is required.
PUT /templates/{key}/office
get/templates/{key}/office/source

Download the original private Office template source

Download the original private Office template source.

operationId: downloadOfficeTemplateSource
Parameters
NameInRequiredDescription
versionquery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
428If-Match is required.
GET /templates/{key}/office/source
get/templates/{key}/office/tags

Inspect an Office template tag contract

Inspect an Office template tag contract.

operationId: getOfficeTemplateTags
Parameters
NameInRequiredDescription
versionquery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
428If-Match is required.
GET /templates/{key}/office/tags
post/templates/{key}/parameters/resolve

Resolve report parameter defaults and choices

Resolve report parameter defaults and choices.

operationId: resolveTemplateParameters
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
POST /templates/{key}/parameters/resolve
get/templates/{key}/presence

List active editors and advisory lock

List active editors and advisory lock.

operationId: getTemplatePresence
Parameters
NameInRequiredDescription
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
GET /templates/{key}/presence
put/templates/{key}/presence

Refresh editor presence and renew its advisory lock

Refresh editor presence and renew its advisory lock.

operationId: heartbeatTemplatePresence
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
PUT /templates/{key}/presence
delete/templates/{key}/presence/{sessionId}

Leave presence and release this session lock

Leave presence and release this session lock.

operationId: leaveTemplatePresence
Parameters
NameInRequiredDescription
keypath✓
sessionIdpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
DELETE /templates/{key}/presence/{sessionId}
get/templates/{key}/promotion-requests

listPromotionRequests.

operationId: listPromotionRequests
Parameters
NameInRequiredDescription
statusquery
labelquery
versionquery
nodeIdquery
fromquery
toquery
limitquery
offsetquery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
GET /templates/{key}/promotion-requests
post/templates/{key}/promotion-requests

createPromotionRequest.

operationId: createPromotionRequest
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
POST /templates/{key}/promotion-requests
post/templates/{key}/promotion-requests/{id}/approve

approvePromotionRequest.

operationId: approvePromotionRequest
Parameters
NameInRequiredDescription
keypath✓
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
POST /templates/{key}/promotion-requests/{id}/approve
post/templates/{key}/promotion-requests/{id}/cancel

cancelPromotionRequest.

operationId: cancelPromotionRequest
Parameters
NameInRequiredDescription
keypath✓
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
POST /templates/{key}/promotion-requests/{id}/cancel
post/templates/{key}/promotion-requests/{id}/reject

rejectPromotionRequest.

operationId: rejectPromotionRequest
Parameters
NameInRequiredDescription
keypath✓
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
501Operation is not implemented.
POST /templates/{key}/promotion-requests/{id}/reject
delete/templates/{key}/sample

Delete stored sample data for a template version

Admin-only. Idempotent — returns 204 whether or not a row existed. Use ?version= to target a specific version; defaults to the current version. Subsequent GET falls through to SampleService.

operationId: deleteTemplateSample
Parameters
NameInRequiredDescription
versionqueryTarget template version. Defaults to currentVersion.
keypath✓
Responses
204Successful response with no body.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
DELETE /templates/{key}/sample
get/templates/{key}/sample

Get sample preview data for a template

Returns stored sample data when present and still valid against the template's inputSchema; otherwise tries the valid default dataset, then synthesises a payload via SampleService. Use ?version= to target a specific historical version; defaults to the current version. The source is reported in the X-Sample-Source response header.

operationId: getTemplateSample
Parameters
NameInRequiredDescription
versionquery
labelquery
keypath✓
Responses
200Sample data object matching the template's inputSchema.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}/sample
put/templates/{key}/sample

Persist sample preview data against the template's current version

Last-write-wins: no If-Match, no ETag response header. The payload is AJV-validated against the current inputSchema before persist; invalid payloads are rejected with 422 and no row is written. Audit: emits a `template_mutation` event with operation `set_sample`.

operationId: putTemplateSample
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · Preview data payload. Validated against the template's current inputSchema by the server; rejected with 422 on AJV failure. · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
422Template or data failed validation; branch on code.
PUT /templates/{key}/sample
get/templates/{key}/schema

Get the JSON Schema input definition for a template

Get the JSON Schema input definition for a template.

operationId: getTemplateSchema
Parameters
NameInRequiredDescription
versionquery
labelquery
keypath✓
Responses
200JSON Schema object describing the expected data payload
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}/schema
post/templates/{key}/tests/run

Run stored dataset content checks against a saved or unsaved template

Returns checks and counts only. Negative and schema-stale datasets are skipped. Does not block server-side label promotion.

operationId: runTemplateTests
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
501Operation is not implemented.
POST /templates/{key}/tests/run
get/templates/{key}/theme

Get a brand kit at its current, labelled or pinned version

Get a brand kit at its current, labelled or pinned version.

operationId: getTemplateTheme
Parameters
NameInRequiredDescription
labelquery
versionquery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
422Template or data failed validation; branch on code.
GET /templates/{key}/theme
get/templates/{key}/thumbnail

Render a private, cached first-page template thumbnail

Render a private, cached first-page template thumbnail.

operationId: getTemplateThumbnail
Parameters
NameInRequiredDescription
versionquery
widthquery
formatquery
keypath✓
Responses
200Private first-page thumbnail
304HTTP 304 response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /templates/{key}/thumbnail
post/templates/{key}/undelete

Restore a template from trash (admin only)

Restore a template from trash (admin only).

operationId: undeleteTemplate
Parameters
NameInRequiredDescription
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
POST /templates/{key}/undelete
post/templates/{key}/validate

Validate a data payload against a template's input schema

Validates arbitrary input data against the stored template's JSON Schema. Applies field mappings (data adapter) before validation. Use this to pre-check data payloads before calling the render endpoint. This does NOT validate the template structure itself — use POST /render/validate for that.

operationId: validateTemplateData
Parameters
NameInRequiredDescription
versionquery
labelquery
keypath✓
Request body
Required · Arbitrary data object to validate against the template's input schema · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
POST /templates/{key}/validate
get/templates/{key}/versions

List all saved versions for a template (newest first, paginated)

List all saved versions for a template (newest first, paginated).

operationId: listTemplateVersions
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
keypath✓
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
GET /templates/{key}/versions
get/templates/{key}/versions/{version}

Get a template's definition at a specific version

Get a template's definition at a specific version.

operationId: getTemplateVersion
Parameters
NameInRequiredDescription
keypath✓
versionpath✓
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /templates/{key}/versions/{version}
patch/templates/{key}/versions/{version}

Amend a version change note

Admin or the version author may amend its note without changing the version.

operationId: setTemplateVersionNote
Parameters
NameInRequiredDescription
keypath✓
versionpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
PATCH /templates/{key}/versions/{version}
post/templates/{key}/versions/{version}/restore

Promote a historical version to current (admin only; requires If-Match header)

Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: restoreTemplateVersion
Parameters
NameInRequiredDescription
keypath✓
versionpath✓
if-matchheaderCurrent version ETag, e.g. "1.0.3"
x-pulpengine-change-noteheaderPercent-encoded UTF-8 change note; at most 1000 decoded characters and 8 KB encoded.
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
422Template or data failed validation; branch on code.
428If-Match is required.
POST /templates/{key}/versions/{version}/restore
post/templates/edit

Propose validated edits to an unsaved template

Propose validated edits to an unsaved template.

operationId: editTemplateWithAi
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /templates/edit
post/templates/generate

Generate a draft template from a natural-language prompt (AI)

Schema-constrained Claude tool-use call. Returns an unsaved draft TemplateDefinition validated by the same Zod schema as hand-authored saves. The caller must POST /templates to persist. Per-actor rate limited (default 5/min). Returns 503 when ANTHROPIC_API_KEY is unset. 502 is returned for any upstream failure (network, malformed tool use, or validation exhausted after repair attempts) — query the audit log (event=template_generation) for specifics. Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: generateTemplate
Parameters
NameInRequiredDescription
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /templates/generate
post/templates/generate-sample

Generate schema-valid named sample scenarios

Generate schema-valid named sample scenarios.

operationId: generateSampleWithAi
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /templates/generate-sample
post/templates/import

Import a document as an unsaved editable draft

Import a document as an unsaved editable draft. HTML and DOCX support deterministic conversion without AI. PDF and raster images require AI_TEMPLATE_IMPORT_ENABLED and an Anthropic key. Draft templates are never saved by this operation.

operationId: importTemplate
Request body
Required · application/json, multipart/form-data
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /templates/import
post/templates/infer-schema

Infer a Draft-07 input schema from a sample

Infer a Draft-07 input schema from a sample.

operationId: inferTemplateSchema
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
413Request exceeds the configured size limit.
POST /templates/infer-schema
post/templates/office

Create an Office template from an authored file

Create an Office template from an authored file.

operationId: createOfficeTemplate
Request body
Required · multipart/form-data
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
428If-Match is required.
POST /templates/office
post/templates/office/lint

Lint an Office-authored file without saving it

Lint an Office-authored file without saving it.

operationId: lintOfficeTemplate
Request body
Required · multipart/form-data
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
428If-Match is required.
POST /templates/office/lint

Assets

11 endpoints

get/assets/

List uploaded assets, optionally filtered by name (?q=), MIME type (?mimeType=), or legacy SVG signals (?legacySvg=true)

List uploaded assets, optionally filtered by name (?q=), MIME type (?mimeType=), or legacy SVG signals (?legacySvg=true).

operationId: listAssets
Parameters
NameInRequiredDescription
qqueryCase-insensitive substring filter on originalName
kindquery
mimeTypequeryExact MIME type filter (e.g. image/png). Case-insensitive.
tagquery
folderquery
recursivequery
sortquery
orderquery
includequery
legacySvgqueryReturn assets matching legacy SVG detection signals: declared mimeType of image/svg+xml OR filename ending with .svg. Use this to enumerate assets that may have been uploaded before v0.27.0 SVG rejection was enforced.
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
GET /assets/
delete/assets/{id}

Delete an asset; referenced assets require force=true

Delete an asset; referenced assets require force=true.

operationId: deleteAsset
Parameters
NameInRequiredDescription
forcequery
idpath✓
Responses
204Asset deleted
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
DELETE /assets/{id}
patch/assets/{id}

Update asset metadata

Update asset metadata.

operationId: updateAsset
Parameters
NameInRequiredDescription
forcequery
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
PATCH /assets/{id}
put/assets/{id}/content

Replace asset bytes while keeping its URL and MIME type

Replace asset bytes while keeping its URL and MIME type.

operationId: replaceAssetContent
Parameters
NameInRequiredDescription
idpath✓
if-matchheaderCurrent version ETag, e.g. "1.0.3"
x-pulpengine-change-noteheaderPercent-encoded UTF-8 change note; at most 1000 decoded characters and 8 KB encoded.
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
412Version conflict; fetch the current ETag and retry.
413Request exceeds the configured size limit.
415HTTP 415 response.
PUT /assets/{id}/content
get/assets/{id}/details

Get an asset and its template references

Get an asset and its template references.

operationId: getAssetDetails
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /assets/{id}/details
get/assets/{id}/font-info

Read uploaded font metadata

Read uploaded font metadata.

operationId: getAssetFontInfo
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
415HTTP 415 response.
GET /assets/{id}/font-info
get/assets/{id}/form-fields

Inspect the fields of an uploaded PDF form

Inspect the fields of an uploaded PDF form.

operationId: getAssetFormFields
Parameters
NameInRequiredDescription
limitquery
offsetquery
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
415HTTP 415 response.
422Template or data failed validation; branch on code.
GET /assets/{id}/form-fields
get/assets/{id}/versions

List retained asset versions

List retained asset versions.

operationId: listAssetVersions
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /assets/{id}/versions
post/assets/{id}/versions/{version}/restore

Restore retained bytes as a new asset version

Restore retained bytes as a new asset version.

operationId: restoreAssetVersion
Parameters
NameInRequiredDescription
idpath✓
versionpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
415HTTP 415 response.
POST /assets/{id}/versions/{version}/restore
get/assets/facets

List asset folders and tags

List asset folders and tags.

operationId: getAssetFacets
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /assets/facets
post/assets/upload

Upload an image, PDF or font asset (multipart/form-data, max 10 MB)

Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: uploadAsset
Parameters
NameInRequiredDescription
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
POST /assets/upload

Schedules

25 endpoints

get/schedules/

List schedules

Returns a paginated list of schedule definitions. Admin scope required.

operationId: listSchedules
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
enabledqueryFilter by enabled status (true/false)
templateKeyquery
templateLabelquery
Responses
200Successful response.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /schedules/
post/schedules/

Create a schedule

Creates a new schedule definition. Computes and stores the next fire time from the cron expression. Admin scope required. Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: createSchedule
Parameters
NameInRequiredDescription
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /schedules/
delete/schedules/{id}

Delete schedule

Deletes a schedule and all its execution history. Admin scope required.

operationId: deleteSchedule
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /schedules/{id}
get/schedules/{id}

Get schedule by ID

Returns a single schedule definition with secrets masked. Admin scope required.

operationId: getSchedule
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /schedules/{id}
patch/schedules/{id}

Partially update schedule

Updates specified fields only. JSON fields (dataSource, deliveryTargets) are full-replaced, not deep-merged. Recomputes next fire time if cron or enabled changes. Admin scope required.

operationId: updateSchedule
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
PATCH /schedules/{id}
put/schedules/{id}

Update schedule (full replace)

Replaces the entire schedule definition. Recomputes next fire time. Admin scope required.

operationId: replaceSchedule
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
PUT /schedules/{id}
post/schedules/{id}/duplicate

Duplicate a schedule while preserving its secrets

Duplicate a schedule while preserving its secrets.

operationId: duplicateSchedule
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
404Resource not found.
409Resource conflict; inspect code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /schedules/{id}/duplicate
get/schedules/{id}/executions

List execution history

Returns a paginated list of executions for a schedule. Admin scope required.

operationId: listScheduleExecutions
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
statusqueryFilter by execution status
idpath✓
Responses
200Successful response.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /schedules/{id}/executions
get/schedules/{id}/executions/{execId}

Get execution detail

Returns a single execution record. Admin scope required.

operationId: getScheduleExecution
Parameters
NameInRequiredDescription
idpath✓
execIdpath✓
Responses
200Successful response.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /schedules/{id}/executions/{execId}
get/schedules/{id}/executions/{execId}/items

listScheduleExecutionItems.

operationId: listScheduleExecutionItems
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
statusquery
idpath✓
execIdpath✓
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /schedules/{id}/executions/{execId}/items
get/schedules/{id}/preview

previewScheduleFires.

operationId: previewScheduleFires
Parameters
NameInRequiredDescription
countquery
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /schedules/{id}/preview
post/schedules/{id}/test

Send a saved schedule to test recipients

Send a saved schedule to test recipients.

operationId: testSchedule
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
404Resource not found.
409Resource conflict; inspect code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /schedules/{id}/test
post/schedules/{id}/trigger

Manually trigger schedule

Creates an immediate execution for the schedule. Rate-limited. Admin scope required. Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: triggerSchedule
Parameters
NameInRequiredDescription
idpath✓
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
202Job accepted for asynchronous processing.
400Invalid request; inspect code and message.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /schedules/{id}/trigger
post/schedules/burst/preview

previewScheduleBurst.

operationId: previewScheduleBurst
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /schedules/burst/preview
get/schedules/calendars

listScheduleCalendars.

operationId: listScheduleCalendars
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /schedules/calendars
post/schedules/calendars

createScheduleCalendar.

operationId: createScheduleCalendar
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /schedules/calendars
delete/schedules/calendars/{id}

deleteScheduleCalendar.

operationId: deleteScheduleCalendar
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /schedules/calendars/{id}
get/schedules/calendars/{id}

getScheduleCalendar.

operationId: getScheduleCalendar
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /schedules/calendars/{id}
patch/schedules/calendars/{id}

updateScheduleCalendar.

operationId: updateScheduleCalendar
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
PATCH /schedules/calendars/{id}
put/schedules/calendars/{id}

replaceScheduleCalendar.

operationId: replaceScheduleCalendar
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
PUT /schedules/calendars/{id}
post/schedules/calendars/{id}/import

importScheduleCalendarIcal.

operationId: importScheduleCalendarIcal
Parameters
NameInRequiredDescription
modequery
idpath✓
Request body
Required · text/calendar
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /schedules/calendars/{id}/import
post/schedules/cron-preview

Preview upcoming schedule fires

Preview upcoming schedule fires.

operationId: previewScheduleCron
Request body
Required · application/json
Responses
200Successful response.
POST /schedules/cron-preview
post/schedules/data-source/test

Test a schedule data source

Test a schedule data source.

operationId: testScheduleDataSource
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
404Resource not found.
409Resource conflict; inspect code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /schedules/data-source/test
post/schedules/preview

previewScheduleTiming.

operationId: previewScheduleTiming
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /schedules/preview
get/schedules/recent-failures

List recent failed scheduled runs

List recent failed scheduled runs.

operationId: listRecentScheduleFailures
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
sinceHoursquery
Responses
200Successful response.
400Invalid request; inspect code and message.
404Resource not found.
409Resource conflict; inspect code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /schedules/recent-failures

Auth

10 endpoints

post/auth/console-session

Exchange an admin API key for a restricted console session

Exchange an admin API key for a restricted console session.

operationId: createConsoleSession
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /auth/console-session
post/auth/editor-token

Exchange an API key for a short-lived editor session token (8 hours)

Exchange an API key for a short-lived editor session token (8 hours).

operationId: createEditorToken
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /auth/editor-token
get/auth/oidc/callback

OIDC authorization code callback

OIDC authorization code callback. Available only when OIDC is configured.

operationId: oidcCallback
Parameters
NameInRequiredDescription
codequery
statequery
errorquery
error_descriptionquery
Responses
200Successful response.
GET /auth/oidc/callback
post/auth/oidc/complete

Exchange a single-use OIDC completion code for a Pulp Engine editor token

Exchange a single-use OIDC completion code for a Pulp Engine editor token. Available only when OIDC is configured.

operationId: oidcComplete
Request body
Required · application/json
Responses
200Successful response.
404Resource not found.
429Rate limit exceeded; wait for Retry-After.
POST /auth/oidc/complete
post/auth/oidc/exchange

Exchange an OIDC id_token for a Pulp Engine editor session token (embed mode)

Exchange an OIDC id_token for a Pulp Engine editor session token (embed mode). Available only when OIDC is configured.

operationId: oidcExchange
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /auth/oidc/exchange
get/auth/oidc/login

Redirect to OIDC provider for SSO login

Redirect to OIDC provider for SSO login. Available only when OIDC is configured.

operationId: oidcLogin
Parameters
NameInRequiredDescription
return_urlquery
promptquery
Responses
200Successful response.
GET /auth/oidc/login
get/auth/oidc/logout

OIDC RP-initiated logout

OIDC RP-initiated logout. Available only when OIDC is configured.

operationId: oidcLogout
Responses
200Successful response.
GET /auth/oidc/logout
get/auth/status

Check whether authentication is required and if editor login is available

Check whether authentication is required and if editor login is available.

operationId: getAuthStatus
Parameters
NameInRequiredDescription
tenantquery
emailquery
Responses
200Successful response.
403Credential scope does not permit this operation.
GET /auth/status
post/render-tokens/

Mint a scoped browser render token

Mint a scoped browser render token.

operationId: createRenderToken
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render-tokens/
delete/render-tokens/{tokenId}

Revoke a browser render token

Revoke a browser render token.

operationId: revokeRenderToken
Parameters
NameInRequiredDescription
tokenIdpath✓
Responses
204Successful response with no body.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /render-tokens/{tokenId}

Admin

36 endpoints

get/admin/api-keys/

List tenant API keys without secrets

List tenant API keys without secrets.

operationId: listApiKeys
Parameters
NameInRequiredDescription
limitquery
offsetquery
statusquery
scopequery
modequery
qquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/api-keys/
post/admin/api-keys/

Create an API key and reveal its secret once

Create an API key and reveal its secret once.

operationId: createApiKey
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/api-keys/
get/admin/api-keys/{id}

Get API key metadata

Get API key metadata.

operationId: getApiKey
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/api-keys/{id}
patch/admin/api-keys/{id}

Update API key metadata, expiry and restrictions

Update API key metadata, expiry and restrictions.

operationId: updateApiKey
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
PATCH /admin/api-keys/{id}
post/admin/api-keys/{id}/revoke

Revoke an API key

Revoke an API key.

operationId: revokeApiKey
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/api-keys/{id}/revoke
post/admin/api-keys/{id}/rotate

Rotate an API key with bounded overlap

Rotate an API key with bounded overlap.

operationId: rotateApiKey
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/api-keys/{id}/rotate
get/admin/batch-dlq/

List batch webhook DLQ entries

Returns a paginated list of dead-lettered batch webhook delivery attempts. Each entry includes a `replayable` flag: on postgres deployments this is a three-part check (the durable batch-job row exists + the result blob is present + the DLQ entry is still `pending`). On file/sqlserver deployments it falls back to the pre-T3 in-memory check. Admin scope required. Returns 503 in file mode (requires STORAGE_MODE=postgres or sqlserver for the DLQ store).

operationId: listBatchDlq
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
statusqueryFilter by status: pending | replayed | abandoned
jobIdqueryFilter by batch job id
Responses
200Successful response.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/batch-dlq/
get/admin/batch-dlq/{id}

Get a batch webhook DLQ entry

Get a batch webhook DLQ entry.

operationId: getBatchDlqEntry
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/batch-dlq/{id}
post/admin/batch-dlq/{id}/abandon

Mark a batch webhook DLQ entry as abandoned

Marks a DLQ entry as terminal (abandoned). Does not require active tenant (terminal cleanup). Admin scope required.

operationId: abandonBatchDlqEntry
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/batch-dlq/{id}/abandon
post/admin/batch-dlq/{id}/replay

Replay a dead-lettered batch webhook delivery

Re-delivers the batch job webhook. On postgres deployments reads the webhook URL, secret, and result payload from the durable batch-job + blob stores, so replay survives API restart. On file/sqlserver deployments falls back to the in-memory job store. Returns 409 `job_expired` if the job has been purged, 409 `job_not_completed` if the job is still running, 409 `already_terminal` if already replayed/abandoned.

operationId: replayBatchDlqEntry
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/batch-dlq/{id}/replay
get/admin/ingest/sources

List tenant-bound queue and folder intake sources

List tenant-bound queue and folder intake sources.

operationId: listIngestSources
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
Responses
200Successful response.
GET /admin/ingest/sources
post/admin/ingest/sources/{id}/pause

Pause an intake source

Pause an intake source.

operationId: pauseIngestSource
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
404Resource not found.
POST /admin/ingest/sources/{id}/pause
post/admin/ingest/sources/{id}/resume

Resume an intake source

Resume an intake source.

operationId: resumeIngestSource
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
404Resource not found.
POST /admin/ingest/sources/{id}/resume
get/admin/schedule-dlq/

List schedule delivery DLQ entries

Returns a paginated list of dead-lettered delivery attempts. Response includes references only — the raw target config is never echoed back. Admin scope required. Returns 503 when the DLQ store is not available (file mode — requires STORAGE_MODE=postgres or sqlserver).

operationId: listScheduleDlq
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
statusqueryFilter by status: pending | replayed | abandoned | orphaned
scheduleIdqueryFilter by schedule id
Responses
200Successful response.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/schedule-dlq/
get/admin/schedule-dlq/{id}

Get a schedule delivery DLQ entry

Get a schedule delivery DLQ entry.

operationId: getScheduleDlqEntry
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/schedule-dlq/{id}
post/admin/schedule-dlq/{id}/abandon

Mark a DLQ entry as abandoned

Marks a DLQ entry as terminal (abandoned). Use when an operator has determined the delivery cannot or should not be replayed. Admin scope required.

operationId: abandonScheduleDlqEntry
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/schedule-dlq/{id}/abandon
post/admin/schedule-dlq/{id}/replay

Replay a dead-lettered delivery

Re-dispatches a single failed delivery target. Rehydrates the current target config from the live schedule — an operator fix to the schedule (e.g. correcting a webhook URL) is picked up automatically. Returns 409 with a specific `code` when the replay cannot proceed: schedule_gone, schedule_mutated, render_artifact_expired, dispatcher_unavailable, already_terminal.

operationId: replayScheduleDlqEntry
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/schedule-dlq/{id}/replay
get/admin/system

Admin system and available console surfaces

Admin system and available console surfaces.

operationId: getAdminSystem
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
GET /admin/system
get/admin/tenants/

List tenants (super-admin only)

List tenants (super-admin only). Available only when MULTI_TENANT_ENABLED is configured.

operationId: listTenants
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
Responses
200Successful response.
403Credential scope does not permit this operation.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/tenants/
post/admin/tenants/

Create a tenant (super-admin only)

Creates a new tenant row. Requires a super-admin credential (API_KEY_SUPER_ADMIN or an API_KEYS_JSON entry with tenantId: null). Tenant-bound admin credentials are rejected with 403 super_admin_only. Available only when MULTI_TENANT_ENABLED is configured.

operationId: createTenant
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/tenants/
delete/admin/tenants/{id}

Permanently purge an archived tenant

Permanently purge an archived tenant. Available only when MULTI_TENANT_ENABLED is configured.

operationId: purgeTenant
Parameters
NameInRequiredDescription
purgequery
confirmquery
retainAuditquery
retainUsagequery
idpath✓
Responses
202Job accepted for asynchronous processing.
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /admin/tenants/{id}
get/admin/tenants/{id}

Get a tenant by id (super-admin only)

Get a tenant by id (super-admin only). Available only when MULTI_TENANT_ENABLED is configured.

operationId: getTenant
Parameters
NameInRequiredDescription
idpath✓Tenant slug
Responses
200Successful response.
403Credential scope does not permit this operation.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/tenants/{id}
patch/admin/tenants/{id}

Update a tenant (super-admin only)

Update a tenant (super-admin only). Available only when MULTI_TENANT_ENABLED is configured.

operationId: updateTenant
Parameters
NameInRequiredDescription
idpath✓Tenant slug
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
PATCH /admin/tenants/{id}
post/admin/tenants/{id}/archive

Soft-archive a tenant (super-admin only). Reads still work; writes fail with 409 tenant_archived.

Soft-archive a tenant (super-admin only). Reads still work; writes fail with 409 tenant_archived.. Available only when MULTI_TENANT_ENABLED is configured.

operationId: archiveTenant
Parameters
NameInRequiredDescription
idpath✓Tenant slug
Responses
204Tenant archived
403Credential scope does not permit this operation.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/tenants/{id}/archive
post/admin/tenants/{id}/clone

Clone a tenant with disabled schedules

Clone a tenant with disabled schedules. Available only when MULTI_TENANT_ENABLED is configured.

operationId: cloneTenant
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
202Job accepted for asynchronous processing.
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/tenants/{id}/clone
get/admin/tenants/{id}/export

Export a portable tenant ZIP bundle

Export a portable tenant ZIP bundle. Available only when MULTI_TENANT_ENABLED is configured.

operationId: exportTenant
Parameters
NameInRequiredDescription
includequery
auditSincequery
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/tenants/{id}/export
get/admin/tenants/{id}/operations

List tenant lifecycle operations

List tenant lifecycle operations. Available only when MULTI_TENANT_ENABLED is configured.

operationId: listTenantOperations
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/tenants/{id}/operations
get/admin/tenants/{id}/operations/{opId}

Get tenant lifecycle operation

Get tenant lifecycle operation. Available only when MULTI_TENANT_ENABLED is configured.

operationId: getTenantOperation
Parameters
NameInRequiredDescription
idpath✓
opIdpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/tenants/{id}/operations/{opId}
get/admin/tenants/{id}/purge-preview

Preview tenant erasure

Preview tenant erasure. Available only when MULTI_TENANT_ENABLED is configured.

operationId: previewTenantPurge
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/tenants/{id}/purge-preview
post/admin/tenants/{id}/unarchive

Unarchive a tenant (super-admin only). Writes resume immediately after cache bust.

Unarchive a tenant (super-admin only). Writes resume immediately after cache bust.. Available only when MULTI_TENANT_ENABLED is configured.

operationId: unarchiveTenant
Parameters
NameInRequiredDescription
idpath✓Tenant slug
Responses
204Tenant unarchived
403Credential scope does not permit this operation.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/tenants/{id}/unarchive
post/admin/tenants/import

Import a portable tenant ZIP bundle

Multipart fields: bundle (ZIP file), id (new tenant slug), name, activate (true or false; default false). Expanded and compressed archives are limited to 128 MiB. Available only when MULTI_TENANT_ENABLED is configured.

operationId: importTenant
Responses
202Job accepted for asynchronous processing.
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/tenants/import
get/admin/users/

List all named editor users (key redacted)

List all named editor users (key redacted).

operationId: listUsers
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
GET /admin/users/
post/admin/users/

Add a new named editor user

Add a new named editor user.

operationId: createUser
Request body
Required · application/json
Responses
201Resource created.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
POST /admin/users/
delete/admin/users/{id}

Remove a named editor user (existing tokens rejected on next request)

Remove a named editor user (existing tokens rejected on next request).

operationId: deleteUser
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
DELETE /admin/users/{id}
put/admin/users/{id}

Update an existing named editor user

Update an existing named editor user.

operationId: updateUser
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
PUT /admin/users/{id}
post/admin/users/reload

Reload the editor-user registry cache from the authoritative store (file or DB)

Reload the editor-user registry cache from the authoritative store (file or DB).

operationId: reloadUsers
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
500Internal or render error; correlate X-Request-ID with server logs.
POST /admin/users/reload

Audit

3 endpoints

delete/audit-events/

Purge audit events

Deletes audit events. Supply "before" for time-based retention purges, "actor" for GDPR erasure of a specific identity, or both to scope an erasure to events older than a cutoff. At least one of "before" or "actor" is required. Admin scope required.

operationId: purgeAuditEvents
Parameters
NameInRequiredDescription
beforequeryISO 8601 cutoff — events with timestamp strictly before this value are deleted
actorqueryActor identifier — deletes events attributed to this actor (GDPR erasure). May be combined with "before" for scoped erasure.
Responses
200Successful response.
400Invalid request; inspect code and message.
DELETE /audit-events/
get/audit-events/

List audit events

Returns a paginated, filterable list of audit events. Admin scope required.

operationId: listAuditEvents
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
eventqueryFilter by event type
operationqueryFilter by operation
actorqueryFilter by actor
resourceTypequeryFilter by resource type
resourceIdqueryFilter by resource ID (template key or asset ID)
sincequeryISO 8601 lower bound (inclusive)
untilqueryISO 8601 upper bound (inclusive)
Responses
200Successful response.
GET /audit-events/
get/audit-events/export

Stream audit events as CSV or NDJSON

Admin-only ascending export. Defaults to the last 30 days; CSV cells are protected from spreadsheet formulas. Each export is audited.

operationId: exportAuditEvents
Parameters
NameInRequiredDescription
eventqueryFilter by event type
operationqueryFilter by operation
actorqueryFilter by actor
resourceTypequeryFilter by resource type
resourceIdqueryFilter by resource ID (template key or asset ID)
sincequeryISO 8601 lower bound (inclusive)
untilqueryISO 8601 upper bound (inclusive)
formatquery
Responses
200CSV or newline-delimited JSON stream
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /audit-events/export

Usage

9 endpoints

get/admin/usage

Cross-tenant usage; super-admin only

Cross-tenant usage; super-admin only.

operationId: getAdminUsageRollup
Parameters
NameInRequiredDescription
fromquery✓Inclusive lower bound
toquery✓Exclusive upper bound
sourcequery
modequery
templateKeyquery
credentialIdquery
actorquery
scopequery
statusquery
limitquery
offsetquery
groupByquery
statsquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/usage
get/renders

Search the tenant render log (admin)

Search the tenant render log (admin).

operationId: listRenders
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
fromquery✓
toquery✓
statusquery
templateKeyquery
formatquery
modequery
sourcequery
errorCodequery
correlationIdquery
requestIdquery
metaquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /renders
get/renders/{id}

Get a tenant render log entry (admin)

Get a tenant render log entry (admin).

operationId: getRender
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /renders/{id}
get/usage

Rollup render usage by time bucket or category

Aggregates render volume for the caller's tenant over a half-open [from, to) window. Temporal buckets (day/week/month) use UTC date_trunc; categorical buckets use direct group-by. Window capped at 92 days. Admin scope required. Returns 503 usage_not_available in file mode (no DB-backed store).

operationId: getUsageRollup
Parameters
NameInRequiredDescription
fromquery✓Inclusive lower bound
toquery✓Exclusive upper bound
sourcequery
modequery
templateKeyquery
credentialIdquery
actorquery
scopequery
statusquery
groupByquery
statsquery
Responses
200Successful response.
GET /usage
get/usage.csv

Export render usage rows as CSV for invoicing pipelines

Returns up to USAGE_EXPORT_MAX_ROWS rows as text/csv, ordered by timestamp. Hard cap 500000: if count exceeds cap, returns 413 usage_export_too_large with the count. Narrow the window to fit. Admin scope required. Returns 503 in file mode (no DB-backed store).

operationId: exportUsageCsv
Parameters
NameInRequiredDescription
fromquery✓Inclusive lower bound
toquery✓Exclusive upper bound
sourcequery
modequery
templateKeyquery
credentialIdquery
actorquery
scopequery
statusquery
Responses
200Successful response.
GET /usage.csv
get/usage/ai

Roll up tenant AI usage and monthly budget

Roll up tenant AI usage and monthly budget.

operationId: getAiUsageRollup
Parameters
NameInRequiredDescription
fromquery✓
toquery✓
groupByquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /usage/ai
get/usage/ai.csv

Export tenant AI usage as CSV

Export tenant AI usage as CSV.

operationId: exportAiUsageCsv
Parameters
NameInRequiredDescription
fromquery✓
toquery✓
groupByquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /usage/ai.csv
get/usage/quota

Read caller render quotas and rate limits

Read caller render quotas and rate limits.

operationId: getRenderQuota
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /usage/quota
get/usage/templates

Per-report usage and unused reports in a bounded window

Per-report usage and unused reports in a bounded window.

operationId: getUsageTemplateStats
Parameters
NameInRequiredDescription
fromquery✓Inclusive lower bound
toquery✓Exclusive upper bound
sourcequery
modequery
templateKeyquery
credentialIdquery
actorquery
scopequery
statusquery
limitquery
offsetquery
sortquery
orderquery
includeUnusedquery
unusedOnlyquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /usage/templates

Health

4 endpoints

get/capabilities

Server feature capabilities — per-format render toggles + future flags

Returns which features are currently enabled at this server. v0.60.0 only carries per-format render route booleans (pdf/html/docx/csv/xlsx/pptx). PPTX is gated by the PPTX_ENABLED env var (default true). Always returns 200.

operationId: getCapabilities
Responses
200Successful response.
GET /capabilities
get/capabilities/format-support

Per-format node and feature support

Per-format node and feature support.

operationId: getFormatSupport
Responses
200Successful response.
GET /capabilities/format-support
get/health

Liveness probe — always 200 if the process is up

Liveness probe — always 200 if the process is up.

operationId: getHealth
Responses
200Successful response.
GET /health
get/health/ready

Readiness probe — 503 if storage is unreachable

Readiness probe — 503 if storage is unreachable.

operationId: getHealthReady
Responses
200Successful response.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /health/ready

Datasets

3 endpoints

post/datasets

Upload a temporary JSON dataset

Tenant-private JSON data, reusable through dataRef until expiry. Gzip request encoding is supported. Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: createDataset
Parameters
NameInRequiredDescription
ttlSecondsquery
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /datasets
delete/datasets/{id}

Delete temporary dataset data

Delete temporary dataset data.

operationId: deleteDataset
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
413Request exceeds the configured size limit.
415HTTP 415 response.
429Rate limit exceeded; wait for Retry-After.
DELETE /datasets/{id}
get/datasets/{id}

Read temporary dataset metadata

Read temporary dataset metadata.

operationId: getDataset
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
413Request exceeds the configured size limit.
415HTTP 415 response.
429Rate limit exceeded; wait for Retry-After.
GET /datasets/{id}

Identity

25 endpoints

get/admin/identity-providers/

listIdentityProviders.

operationId: listIdentityProviders
Parameters
NameInRequiredDescription
limitquery
offsetquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/identity-providers/
post/admin/identity-providers/

createIdentityProvider.

operationId: createIdentityProvider
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/identity-providers/
delete/admin/identity-providers/{id}

deleteIdentityProvider.

operationId: deleteIdentityProvider
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /admin/identity-providers/{id}
get/admin/identity-providers/{id}

getIdentityProvider.

operationId: getIdentityProvider
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/identity-providers/{id}
patch/admin/identity-providers/{id}

updateIdentityProvider.

operationId: updateIdentityProvider
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
PATCH /admin/identity-providers/{id}
get/auth/oidc/{slug}/callback

ssoOidcCallback. Available only when OIDC is configured.

operationId: ssoOidcCallback
Parameters
NameInRequiredDescription
codequery
statequery
errorquery
slugpath✓
Responses
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /auth/oidc/{slug}/callback
post/auth/saml/{slug}/acs

samlAcs.

operationId: samlAcs
Parameters
NameInRequiredDescription
slugpath✓
Request body
Required · application/json
Responses
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /auth/saml/{slug}/acs
get/auth/saml/{slug}/metadata

samlMetadata.

operationId: samlMetadata
Parameters
NameInRequiredDescription
slugpath✓
Responses
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /auth/saml/{slug}/metadata
get/auth/sso/{slug}/login

ssoLogin.

operationId: ssoLogin
Parameters
NameInRequiredDescription
return_urlquery
slugpath✓
Responses
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /auth/sso/{slug}/login
post/auth/sso/discover

discoverSsoProvider.

operationId: discoverSsoProvider
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
403Credential scope does not permit this operation.
404Resource not found.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /auth/sso/discover
get/scim/v2/Groups

scimListGroups.

operationId: scimListGroups
Parameters
NameInRequiredDescription
filterquery
startIndexquery
countquery
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
GET /scim/v2/Groups
post/scim/v2/Groups

scimCreateGroups.

operationId: scimCreateGroups
Request body
Required · application/json
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
POST /scim/v2/Groups
delete/scim/v2/Groups/{id}

scimDeleteGroups.

operationId: scimDeleteGroups
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
DELETE /scim/v2/Groups/{id}
get/scim/v2/Groups/{id}

scimGetGroups.

operationId: scimGetGroups
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
GET /scim/v2/Groups/{id}
patch/scim/v2/Groups/{id}

scimPatchGroups.

operationId: scimPatchGroups
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
PATCH /scim/v2/Groups/{id}
put/scim/v2/Groups/{id}

scimReplaceGroups.

operationId: scimReplaceGroups
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
PUT /scim/v2/Groups/{id}
get/scim/v2/ResourceTypes

scimGetResourceTypes.

operationId: scimGetResourceTypes
Responses
200Successful response.
GET /scim/v2/ResourceTypes
get/scim/v2/Schemas

scimGetSchemas.

operationId: scimGetSchemas
Responses
200Successful response.
GET /scim/v2/Schemas
get/scim/v2/ServiceProviderConfig

scimGetServiceProviderConfig.

operationId: scimGetServiceProviderConfig
Responses
200Successful response.
GET /scim/v2/ServiceProviderConfig
get/scim/v2/Users

scimListUsers.

operationId: scimListUsers
Parameters
NameInRequiredDescription
filterquery
startIndexquery
countquery
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
GET /scim/v2/Users
post/scim/v2/Users

scimCreateUsers.

operationId: scimCreateUsers
Request body
Required · application/json
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
POST /scim/v2/Users
delete/scim/v2/Users/{id}

scimDeleteUsers.

operationId: scimDeleteUsers
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
DELETE /scim/v2/Users/{id}
get/scim/v2/Users/{id}

scimGetUsers.

operationId: scimGetUsers
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
GET /scim/v2/Users/{id}
patch/scim/v2/Users/{id}

scimPatchUsers.

operationId: scimPatchUsers
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
PATCH /scim/v2/Users/{id}
put/scim/v2/Users/{id}

scimReplaceUsers.

operationId: scimReplaceUsers
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
PUT /scim/v2/Users/{id}

Access Control

8 endpoints

get/admin/role-bindings

List direct and inherited bindings

List direct and inherited bindings.

operationId: listRoleBindings
Parameters
NameInRequiredDescription
limitquery
offsetquery
principalTypequery
principalIdquery
resourceTypequery
resourceIdquery
includeInheritedquery
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/role-bindings
post/admin/role-bindings

Bind a role to a principal and resource

Bind a role to a principal and resource.

operationId: createRoleBinding
Request body
Required · application/json
Responses
201Resource created.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/role-bindings
delete/admin/role-bindings/{id}

Remove a role binding

Remove a role binding.

operationId: deleteRoleBinding
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /admin/role-bindings/{id}
get/admin/roles

List built-in and custom roles

List built-in and custom roles.

operationId: listRoles
Parameters
NameInRequiredDescription
limitquery
offsetquery
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/roles
post/admin/roles

Create a custom role

Create a custom role.

operationId: createRole
Request body
Required · application/json
Responses
201Resource created.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/roles
delete/admin/roles/{name}

Delete an unused custom role

Delete an unused custom role.

operationId: deleteRole
Parameters
NameInRequiredDescription
namepath✓
Responses
204Successful response with no body.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /admin/roles/{name}
put/admin/roles/{name}

Update a custom role

Update a custom role.

operationId: updateRole
Parameters
NameInRequiredDescription
namepath✓
Request body
Required · application/json
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
PUT /admin/roles/{name}
get/auth/me

Inspect the current principal and effective permissions

Inspect the current principal and effective permissions.

operationId: getAuthMe
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
GET /auth/me

Portal

10 endpoints

get/portal/reports

List permitted published reports

List permitted published reports.

operationId: listPortalReports
Parameters
NameInRequiredDescription
limitquery
offsetquery
qquery
categoryquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /portal/reports
get/portal/reports/{key}

Get a published report and its guided form

Get a published report and its guided form.

operationId: getPortalReport
Parameters
NameInRequiredDescription
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /portal/reports/{key}
post/portal/reports/{key}/runs

Run the published label and archive the result

Run the published label and archive the result.

operationId: runPortalReport
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /portal/reports/{key}/runs
get/portal/runs

List report runs owned by the signed-in user

List report runs owned by the signed-in user.

operationId: listPortalRuns
Parameters
NameInRequiredDescription
limitquery
offsetquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /portal/runs
get/portal/runs/{id}/download

Download an owned run using its signed expiring link

Download an owned run using its signed expiring link.

operationId: downloadPortalRun
Parameters
NameInRequiredDescription
expquery✓
dquery✓
sigquery✓
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /portal/runs/{id}/download
get/portal/subscriptions

List subscriptions owned by the signed-in user

List subscriptions owned by the signed-in user.

operationId: listPortalSubscriptions
Parameters
NameInRequiredDescription
limitquery
offsetquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /portal/subscriptions
post/portal/subscriptions

Subscribe only the signed-in user to their own email address

Subscribe only the signed-in user to their own email address.

operationId: createPortalSubscription
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /portal/subscriptions
delete/portal/subscriptions/{id}

Delete an owned subscription

Delete an owned subscription.

operationId: deletePortalSubscription
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /portal/subscriptions/{id}
get/templates/{key}/portal

Read operational portal publication settings

Read operational portal publication settings.

operationId: getPortalPublication
Parameters
NameInRequiredDescription
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /templates/{key}/portal
put/templates/{key}/portal

Set operational portal publication settings

Set operational portal publication settings.

operationId: setPortalPublication
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
PUT /templates/{key}/portal

Data

1 endpoint

post/data/convert

Convert CSV, XML or XLSX input to JSON

Convert CSV, XML or XLSX input to JSON.

operationId: convertData
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /data/convert

Connections

15 endpoints

get/admin/connections

List shared data connections

List shared data connections. Credentials are encrypted and write-only; responses never include tenant identifiers or stored secrets.

operationId: listDataConnections
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/connections
post/admin/connections

Create an encrypted data connection

Create an encrypted data connection. Credentials are encrypted and write-only; responses never include tenant identifiers or stored secrets.

operationId: createDataConnection
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/connections
delete/admin/connections/{id}

Delete a shared data connection

Delete a shared data connection. Credentials are encrypted and write-only; responses never include tenant identifiers or stored secrets.

operationId: deleteDataConnection
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /admin/connections/{id}
get/admin/connections/{id}

Get data connection settings

Get data connection settings. Credentials are encrypted and write-only; responses never include tenant identifiers or stored secrets.

operationId: getDataConnection
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/connections/{id}
patch/admin/connections/{id}

Update connection settings or replace its secret

Update connection settings or replace its secret. Credentials are encrypted and write-only; responses never include tenant identifiers or stored secrets.

operationId: updateDataConnection
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
PATCH /admin/connections/{id}
post/admin/connections/{id}/test

Test connection authentication and reachability

Test connection authentication and reachability. Credentials are encrypted and write-only; responses never include tenant identifiers or stored secrets.

operationId: testDataConnection
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/connections/{id}/test
get/connections/

List encrypted delivery connections

List encrypted delivery connections.

operationId: listDeliveryConnections
Parameters
NameInRequiredDescription
limitquery
offsetquery
typequery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /connections/
post/connections/

Create an encrypted delivery connection

Create an encrypted delivery connection.

operationId: createDeliveryConnection
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /connections/
delete/connections/{id}

Delete an unused delivery connection

Delete an unused delivery connection.

operationId: deleteDeliveryConnection
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /connections/{id}
get/connections/{id}

Get delivery connection settings

Get delivery connection settings.

operationId: getDeliveryConnection
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /connections/{id}
patch/connections/{id}

Update delivery settings and merge secrets

Update delivery settings and merge secrets.

operationId: updateDeliveryConnection
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
PATCH /connections/{id}
post/connections/{id}/test

Test delivery connection access

Test delivery connection access.

operationId: testDeliveryConnection
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /connections/{id}/test
get/connections/providers

List delivery providers and target schemas

List delivery providers and target schemas.

operationId: listDeliveryProviders
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /connections/providers
get/data/connections

List credential-free connection choices

List credential-free connection choices. Credentials are encrypted and write-only; responses never include tenant identifiers or stored secrets.

operationId: listAvailableDataConnections
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /data/connections
post/render/preview/data-sources

Test an unsaved template data source

Editor-only bounded fetch using tenant-scoped connections. Returns the first 50 rows or a bounded text preview, source status and HTTP status. Credentials are never returned.

operationId: previewDataSource
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
504HTTP 504 response.
POST /render/preview/data-sources

ESign

6 endpoints

post/esign/callbacks/{id}

Authenticated provider callback; status is re-fetched from the provider

Authenticated provider callback; status is re-fetched from the provider.

operationId: receiveEsignCallback
Parameters
NameInRequiredDescription
tquery
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /esign/callbacks/{id}
get/esign/envelopes

List signature envelopes

List signature envelopes.

operationId: listEsignEnvelopes
Parameters
NameInRequiredDescription
limitquery
offsetquery
statusquery
templateKeyquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /esign/envelopes
post/esign/envelopes

Render PDF and send it for signature

Render PDF and send it for signature.

operationId: createEsignEnvelope
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /esign/envelopes
get/esign/envelopes/{id}

Get signature envelope status

Get signature envelope status.

operationId: getEsignEnvelope
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /esign/envelopes/{id}
get/esign/envelopes/{id}/documents/{kind}

Download signed document or completion certificate

Download signed document or completion certificate.

operationId: downloadEsignDocument
Parameters
NameInRequiredDescription
idpath✓
kindpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /esign/envelopes/{id}/documents/{kind}
post/esign/envelopes/{id}/void

Void an outstanding signature request

Void an outstanding signature request.

operationId: voidEsignEnvelope
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
501Operation is not implemented.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /esign/envelopes/{id}/void

Bundles

2 endpoints

get/admin/bundles/export

Export portable templates and dependencies

Export portable templates and dependencies.

operationId: exportBundle
Parameters
NameInRequiredDescription
keysquery
allquery
historyquery
withDepsquery
includequery
versionquery
labelquery
Responses
200Portable gzip NDJSON bundle
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
501Operation is not implemented.
GET /admin/bundles/export
post/admin/bundles/import

Plan or apply a portable environment bundle

Multipart bundle field. Validation and planning finish before any write. Application is atomic per template; partial failures return completed resources in plan.

operationId: importBundle
Parameters
NameInRequiredDescription
dryRunquery
onConflictquery
preserveVersionsquery
labelMapquery
allowMissingDepsquery
requireCompatiblequery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
500Internal or render error; correlate X-Request-ID with server logs.
501Operation is not implemented.
POST /admin/bundles/import

Tenant

6 endpoints

get/admin/tenants/{id}/settings

getAdminTenantSettings. Available only when MULTI_TENANT_ENABLED is configured.

operationId: getAdminTenantSettings
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /admin/tenants/{id}/settings
patch/admin/tenants/{id}/settings

updateAdminTenantSettings. Available only when MULTI_TENANT_ENABLED is configured.

operationId: updateAdminTenantSettings
Parameters
NameInRequiredDescription
idpath✓
if-matchheaderCurrent version ETag, e.g. "1.0.3"
x-pulpengine-change-noteheaderPercent-encoded UTF-8 change note; at most 1000 decoded characters and 8 KB encoded.
Request body
Required · JSON Merge Patch. Null removes an override. Secrets are connection references only. · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
503Service unavailable or at capacity; retry when Retry-After is present.
PATCH /admin/tenants/{id}/settings
get/tenant/branding

getTenantBranding.

operationId: getTenantBranding
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /tenant/branding
get/tenant/quota

getTenantQuota.

operationId: getTenantQuota
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /tenant/quota
get/tenant/settings

getTenantSettings.

operationId: getTenantSettings
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /tenant/settings
patch/tenant/settings

updateTenantSettings.

operationId: updateTenantSettings
Parameters
NameInRequiredDescription
if-matchheaderCurrent version ETag, e.g. "1.0.3"
x-pulpengine-change-noteheaderPercent-encoded UTF-8 change note; at most 1000 decoded characters and 8 KB encoded.
Request body
Required · JSON Merge Patch. Null removes an override. Secrets are connection references only. · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
410Resource no longer available; follow the successor link.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
503Service unavailable or at capacity; retry when Retry-After is present.
PATCH /tenant/settings

Catalogue

5 endpoints

post/admin/catalogue/upgrade

bulkUpgradeCatalogueTemplate.

operationId: bulkUpgradeCatalogueTemplate
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /admin/catalogue/upgrade
get/catalogue/templates

listCatalogueTemplates.

operationId: listCatalogueTemplates
Parameters
NameInRequiredDescription
limitquery
offsetquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /catalogue/templates
get/catalogue/templates/{key}

getCatalogueTemplate.

operationId: getCatalogueTemplate
Parameters
NameInRequiredDescription
versionquery
keypath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /catalogue/templates/{key}
post/templates/{key}/fork

forkCatalogueTemplate.

operationId: forkCatalogueTemplate
Parameters
NameInRequiredDescription
keypath✓
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /templates/{key}/fork
post/templates/{key}/upgrade

upgradeCatalogueTemplate.

operationId: upgradeCatalogueTemplate
Parameters
NameInRequiredDescription
keypath✓
if-matchheaderCurrent version ETag, e.g. "1.0.3"
x-pulpengine-change-noteheaderPercent-encoded UTF-8 change note; at most 1000 decoded characters and 8 KB encoded.
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
412Version conflict; fetch the current ETag and retry.
428If-Match is required.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /templates/{key}/upgrade

Webhooks

11 endpoints

get/webhooks/

List outbound event subscriptions

List outbound event subscriptions.

operationId: listWebhooks
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /webhooks/
post/webhooks/

Create an outbound event subscription

Create an outbound event subscription.

operationId: createWebhook
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /webhooks/
delete/webhooks/{id}

Delete a subscription and its delivery log

Delete a subscription and its delivery log.

operationId: deleteWebhook
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /webhooks/{id}
get/webhooks/{id}

Get an outbound event subscription

Get an outbound event subscription.

operationId: getWebhook
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /webhooks/{id}
patch/webhooks/{id}

Update an outbound event subscription

Update an outbound event subscription.

operationId: updateWebhook
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
PATCH /webhooks/{id}
get/webhooks/{id}/deliveries

List a subscription delivery log

List a subscription delivery log.

operationId: listWebhookDeliveries
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
statusquery
eventTypequery
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /webhooks/{id}/deliveries
get/webhooks/{id}/deliveries/{deliveryId}

Get the exact event payload and delivery outcome

Get the exact event payload and delivery outcome.

operationId: getWebhookDelivery
Parameters
NameInRequiredDescription
idpath✓
deliveryIdpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /webhooks/{id}/deliveries/{deliveryId}
post/webhooks/{id}/deliveries/{deliveryId}/redeliver

Enqueue a new delivery of the same event

Enqueue a new delivery of the same event.

operationId: redeliverWebhook
Parameters
NameInRequiredDescription
idpath✓
deliveryIdpath✓
Responses
202Job accepted for asynchronous processing.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /webhooks/{id}/deliveries/{deliveryId}/redeliver
post/webhooks/{id}/ping

Send and record a synchronous test event

Send and record a synchronous test event.

operationId: pingWebhook
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /webhooks/{id}/ping
post/webhooks/{id}/rotate-secret

Rotate a subscription signing secret

Rotate a subscription signing secret.

operationId: rotateWebhookSecret
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /webhooks/{id}/rotate-secret
get/webhooks/event-types

List available outbound event types

List available outbound event types.

operationId: webhookEventTypes
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /webhooks/event-types

Nodes

4 endpoints

post/nodes/expression

Generate and validate a JEXL expression

Generate and validate a JEXL expression.

operationId: generateExpression
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /nodes/expression
post/nodes/narrative/preview

Generate or retrieve a grounded narrative for explicit facts

Generate or retrieve a grounded narrative for explicit facts.

operationId: previewNarrative
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /nodes/narrative/preview
post/nodes/rewrite

AI-rewrite the content of a single text or heading node (SSE stream)

Streams `delta` (append) or `replace` (reset-buffer) events, optional `restart` on repair, then a terminal `done` or `error`. Response Content-Type is text/event-stream. See plan for wire contract. Returns 503 when AI generation is disabled and 409 when block-form Handlebars (`{{#each}}`, `{{#if}}`, `{{else}}`) is present in content.

operationId: rewriteNode
Request body
Required · application/json
Responses
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /nodes/rewrite
post/nodes/rewrite/outcome

Record the user's apply/dismiss choice for an AI node rewrite

Record the user's apply/dismiss choice for an AI node rewrite.

operationId: recordRewriteOutcome
Request body
Required · application/json
Responses
204Successful response with no body.
401Authentication required.
403Credential scope does not permit this operation.
429Rate limit exceeded; wait for Retry-After.
POST /nodes/rewrite/outcome

Template Folders

5 endpoints

get/template-folders

List folders in the current tenant

List folders in the current tenant.

operationId: listTemplateFolders
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /template-folders
post/template-folders

Create a folder

Create a folder.

operationId: createTemplateFolder
Request body
Required · application/json
Responses
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /template-folders
delete/template-folders/{id}

Delete an empty folder (admin only)

Delete an empty folder (admin only).

operationId: deleteTemplateFolder
Parameters
NameInRequiredDescription
idpath✓
Responses
204Folder deleted
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /template-folders/{id}
patch/template-folders/{id}

Rename or move a folder and its subtree

Rename or move a folder and its subtree.

operationId: updateTemplateFolder
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
PATCH /template-folders/{id}
get/template-tags

List tags with active template counts

List tags with active template counts.

operationId: listTemplateTags
Parameters
NameInRequiredDescription
limitqueryMaximum number of items to return (1-1000, default 50)
offsetqueryNumber of items to skip
qquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
501Operation is not implemented.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /template-tags

MCP

3 endpoints

delete/mcp

MCP supports POST only

MCP supports POST only.

operationId: mcpDeleteNotAllowed
Responses
405HTTP 405 response.
DELETE /mcp
get/mcp

MCP supports POST only

MCP supports POST only.

operationId: mcpGetNotAllowed
Responses
405HTTP 405 response.
GET /mcp
post/mcp

Stateless MCP streamable HTTP request

Stateless MCP streamable HTTP request.

operationId: mcpRequest
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
429Rate limit exceeded; wait for Retry-After.
POST /mcp

Documents

6 endpoints

get/documents/

List stored documents for the current tenant

List stored documents for the current tenant. Available only when DOCUMENT_STORE_ENABLED is configured.

operationId: listDocuments
Parameters
NameInRequiredDescription
templateKeyquery
formatquery
sourcequery
scheduleIdquery
createdFromquery
createdToquery
limitquery
offsetquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
410Resource no longer available; follow the successor link.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /documents/
delete/documents/{id}

Erase a stored document and its bytes

Erase a stored document and its bytes. Available only when DOCUMENT_STORE_ENABLED is configured.

operationId: deleteDocument
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
410Resource no longer available; follow the successor link.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /documents/{id}
get/documents/{id}

Read stored document metadata

Read stored document metadata. Available only when DOCUMENT_STORE_ENABLED is configured.

operationId: getDocument
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
410Resource no longer available; follow the successor link.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /documents/{id}
get/documents/{id}/content

Download stored bytes using an API key or signed URL

Download stored bytes using an API key or signed URL. Available only when DOCUMENT_STORE_ENABLED is configured.

operationId: downloadDocument
Parameters
NameInRequiredDescription
expquerySigned Unix expiry; do not edit.
dquerySigned disposition a (attachment) or i (inline).
idpath✓
Responses
200Stored bytes. HTML is always a sandboxed attachment. S3 can redirect for non-HTML formats.
302Short-lived private S3 download redirect
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
410Resource no longer available; follow the successor link.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /documents/{id}/content
post/documents/{id}/links

Issue a signed document download link

Issue a signed document download link. Available only when DOCUMENT_STORE_ENABLED is configured.

operationId: createDocumentLink
Parameters
NameInRequiredDescription
idpath✓
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
410Resource no longer available; follow the successor link.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /documents/{id}/links
post/documents/{id}/links/revoke

Revoke every outstanding document link

Revoke every outstanding document link. Available only when DOCUMENT_STORE_ENABLED is configured.

operationId: revokeDocumentLinks
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
410Resource no longer available; follow the successor link.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /documents/{id}/links/revoke

Render Preview

1 endpoint

post/render/preview/office

Fill a stored Office template for private preview or native download

Fill a stored Office template for private preview or native download.

operationId: previewOfficeTemplate
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/preview/office

Render

30 endpoints

post/render/

[Deprecated - use /render/pdf] Render a template to PDF

Sunset: 2027-03-06. Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: renderPdfLegacy
Parameters
NameInRequiredDescription
streamqueryStreaming control. Unset (default) or true → chunked stream when no post-render hooks are registered. false → force buffered response. true + post-render hooks → 400 STREAM_INCOMPATIBLE_HOOK.
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
200PDF document stream — or, when dryRun=true, a JSON DryRunResponse
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
504HTTP 504 response.
POST /render/
post/render/batch

Render multiple templates to PDF in a single request

Renders up to 50 templates concurrently. Each item is rendered independently; one failure does not abort others. Default response is a single JSON envelope. When the caller sends `Accept: application/x-ndjson`, the route streams one `result` line per item in completion order as each resolves, followed by a single `summary` line with authoritative totals.

operationId: renderBatchPdf
Request body
Required · application/json
Responses
200Batch results. JSON envelope by default; NDJSON stream when Accept: application/x-ndjson is requested.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
POST /render/batch
post/render/batch/async

[Deprecated - use /render/jobs] Submit an async PDF batch render with webhook callback

Accepts up to 50 templates. Returns 202 immediately with a job ID. Results are rendered in the background and the webhook URL receives a metadata-only notification on completion. Poll GET /render/batch/jobs/:id for full results including rendered PDFs. Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: submitAsyncBatchPdfLegacy
Parameters
NameInRequiredDescription
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
202Job accepted for asynchronous processing.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/batch/async
post/render/batch/async/docx

[Deprecated - use /render/jobs] Submit an async DOCX batch render with webhook callback

Accepts up to 50 templates. Returns 202 immediately with a job ID. Results are rendered in the background and the webhook URL receives a metadata-only notification on completion. Poll GET /render/batch/jobs/:id for full results including rendered DOCX bytes. Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: submitAsyncBatchDocxLegacy
Parameters
NameInRequiredDescription
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
202Job accepted for asynchronous processing.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/batch/async/docx
post/render/batch/csv

renderBatchCsv.

operationId: renderBatchCsv
Request body
Required · application/json
Responses
200JSON results, a stored package link, ZIP archive, or merged PDF.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/batch/csv
post/render/batch/docx

Render multiple templates to DOCX in a single request

Renders up to 50 templates concurrently. Each item is rendered independently; one failure does not abort others. Results are returned as base64-encoded DOCX bytes in a JSON envelope.

operationId: renderBatchDocx
Request body
Required · application/json
Responses
200JSON results, a stored package link, ZIP archive, or merged PDF.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/batch/docx
post/render/batch/html

renderBatchHtml.

operationId: renderBatchHtml
Request body
Required · application/json
Responses
200JSON results, a stored package link, ZIP archive, or merged PDF.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/batch/html
get/render/batch/jobs/{id}

[Deprecated - use /render/jobs] Poll async batch job status

Returns the current status and results (when complete) of an async batch render job. Results include base64-encoded rendered output. Jobs are retained after completion for at least WEBHOOK_JOB_RETENTION_SECONDS; on postgres deployments completed jobs survive API restart and remain pollable until that retention window elapses. Pending/processing jobs that survive a restart without their worker are failed at the next start via the orphan-reconciliation step.

operationId: getAsyncBatchJobLegacy
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
GET /render/batch/jobs/{id}
post/render/batch/pptx

Render multiple templates to PPTX in a single request

Renders up to 50 templates concurrently as PowerPoint presentations. Each item is rendered independently; one failure does not abort others. Each successful result includes a warningCount field counting structured warnings emitted by the renderer. Beta in v0.60.0 — gated by PPTX_ENABLED.

operationId: renderBatchPptx
Request body
Required · application/json
Responses
200JSON results, a stored package link, ZIP archive, or merged PDF.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/batch/pptx
post/render/batch/xlsx

renderBatchXlsx.

operationId: renderBatchXlsx
Request body
Required · application/json
Responses
200JSON results, a stored package link, ZIP archive, or merged PDF.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/batch/xlsx
post/render/convert/pdf

Convert HTML or an allowlisted URL to PDF

Convert HTML or an allowlisted URL to PDF. Available only when CONVERT_HTML_ENABLED is configured.

operationId: convertHtmlToPdf
Parameters
NameInRequiredDescription
streamquery
Request body
Required · application/json
Responses
200Converted PDF or dry-run JSON
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
500Internal or render error; correlate X-Request-ID with server logs.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/convert/pdf
post/render/csv

Export table data as CSV, TSV or a ZIP

Extracts table and pivot data with configurable CSV dialects. Select `tableId` for one table or `csv.tables: all` for a ZIP or stacked file. Request options override template CSV defaults. A tab delimiter returns TSV. BOM is off by default. Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: renderCsv
Parameters
NameInRequiredDescription
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
200CSV data — or, when dryRun=true, a JSON DryRunResponse
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
504HTTP 504 response.
POST /render/csv
post/render/docx

Render a template to DOCX

Renders a template to a Word document (.docx). The template AST is walked directly — no browser required. Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: renderDocx
Parameters
NameInRequiredDescription
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
200DOCX document — or, when dryRun=true, a JSON DryRunResponse
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
504HTTP 504 response.
POST /render/docx
post/render/einvoice

Generate a CII or UBL invoice from a saved template

Generate a CII or UBL invoice from a saved template.

operationId: renderEInvoice
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
404Resource not found.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/einvoice
post/render/email

Render email HTML, plain text and inline images

Render email HTML, plain text and inline images.

operationId: renderEmail
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/email
post/render/html

Render a template to HTML

Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: renderHtml
Parameters
NameInRequiredDescription
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
200Rendered HTML document — or, when dryRun=true, a JSON DryRunResponse
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
504HTTP 504 response.
POST /render/html
post/render/image

Render PDF pages as PNG, JPEG or WebP

Render PDF pages as PNG, JPEG or WebP.

operationId: renderImage
Request body
Required · application/json
Responses
200One raster image or a ZIP of pages and manifest; JSON for dryRun.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/image
get/render/jobs

List render jobs

List render jobs.

operationId: listRenderJobs
Parameters
NameInRequiredDescription
statusquery
sincequery
untilquery
referencequery
limitquery
offsetquery
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /render/jobs
post/render/jobs

Submit a pollable render job in any format

Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: submitRenderJob
Parameters
NameInRequiredDescription
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
202Job accepted for asynchronous processing.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/jobs
delete/render/jobs/{id}

Purge a terminal render job and its transport blobs

Purge a terminal render job and its transport blobs.

operationId: deleteRenderJob
Parameters
NameInRequiredDescription
idpath✓
Responses
204Successful response with no body.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
DELETE /render/jobs/{id}
get/render/jobs/{id}

Poll a render job

Poll a render job.

operationId: getRenderJob
Parameters
NameInRequiredDescription
includequery
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /render/jobs/{id}
post/render/jobs/{id}/cancel

Cancel a render job, keeping finished items

Cancel a render job, keeping finished items.

operationId: cancelRenderJob
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
202Job accepted for asynchronous processing.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/jobs/{id}/cancel
get/render/jobs/{id}/items/{index}/content

Download completed item bytes

Download completed item bytes.

operationId: downloadRenderJobItem
Parameters
NameInRequiredDescription
idpath✓
indexpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /render/jobs/{id}/items/{index}/content
get/render/jobs/{id}/package

downloadRenderJobPackage.

operationId: downloadRenderJobPackage
Parameters
NameInRequiredDescription
idpath✓
Responses
200Successful response.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
429Rate limit exceeded; wait for Retry-After.
503Service unavailable or at capacity; retry when Retry-After is present.
GET /render/jobs/{id}/package
post/render/pdf

Render a template to PDF

Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: renderPdf
Parameters
NameInRequiredDescription
streamqueryStreaming control. Unset (default) or true → chunked stream when no post-render hooks are registered. false → force buffered response. true + post-render hooks → 400 STREAM_INCOMPATIBLE_HOOK.
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
200PDF document stream — or, when dryRun=true, a JSON DryRunResponse
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
504HTTP 504 response.
POST /render/pdf
post/render/pdf/book

Assemble a PDF report book with final folios and contents

Assemble a PDF report book with final folios and contents.

operationId: renderPdfBook
Request body
Required · application/json
Responses
200Successful response.
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
404Resource not found.
413Request exceeds the configured size limit.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
500Internal or render error; correlate X-Request-ID with server logs.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/pdf/book
post/render/pptx

Render a template to PPTX

Renders a template to a PowerPoint presentation (.pptx). Beta in v0.60.0 — gated by the PPTX_ENABLED env var (default true). The renderer walks the template AST directly and produces a .pptx binary via pptxgenjs. Structured warnings are surfaced via the x-render-warnings response header. Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: renderPptx
Parameters
NameInRequiredDescription
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
200PPTX presentation — or, when dryRun=true, a JSON DryRunResponse
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
504HTTP 504 response.
POST /render/pptx
post/render/preview/einvoice

Check an unsaved invoice with sample data

Check an unsaved invoice with sample data.

operationId: checkEInvoice
Request body
Required · application/json
Responses
200Successful response.
400Invalid request; inspect code and message.
422Template or data failed validation; branch on code.
503Service unavailable or at capacity; retry when Retry-After is present.
POST /render/preview/einvoice
post/render/validate

Validate a template for publish readiness — always registered, no HTML/PDF output

Validates a template DEFINITION for structural correctness and renderability. Always runs (1) Zod structural parse and (2) blocked-asset detection. For (3) renderability, behaviour depends on whether the request includes a `formats` array. Without `formats` (legacy default): runs an HTML-only trial render and returns `{ valid, issues }` byte-for-byte unchanged from pre-v0.78.0. With `formats` (v0.78.0+): runs each requested format through its real renderer, classifies typed errors into structural (untagged, emitted once) and format-specific (tagged with the originating `format`), and returns a `skippedFormats` array listing any requested formats disabled by server capability (e.g. pptx when PPTX_ENABLED=false). PDF is special: it never boots Chromium — when requested, an HTML preflight runs and an info-severity PDF_VALIDATED_VIA_HTML issue is emitted to acknowledge transitive coverage. For format-specific runtime issues a real /render call is required. This endpoint does NOT validate input data against a stored template — use POST /templates/:key/validate for that.

operationId: validateTemplateDefinition
Request body
Required · TemplateDefinition + sample data for publish-readiness validation; optional formats[] for per-format checks. · application/json
Responses
200Successful response.
401Authentication required.
403Credential scope does not permit this operation.
429Rate limit exceeded; wait for Retry-After.
POST /render/validate
post/render/xlsx

Export table data from a template as XLSX

Extracts table nodes from a template and renders them into an Excel workbook. Single-table templates auto-select; multi-table templates produce one sheet per table (or filter to a single table via `tableId`). Supports optional Idempotency-Key for safe retries. Stored render responses honour it only with output.store=true and output.respondWith=link.

operationId: renderXlsx
Parameters
NameInRequiredDescription
idempotency-keyheaderRetry key, scoped to the current tenant, principal, method and concrete path. Reuse only for the same request.
Request body
Required · application/json
Responses
200XLSX workbook — or, when dryRun=true, a JSON DryRunResponse
201Resource created.
400Invalid request; inspect code and message.
401Authentication required.
403Credential scope does not permit this operation.
404Resource not found.
409Resource conflict; inspect code.
413Request exceeds the configured size limit.
415HTTP 415 response.
422Template or data failed validation; branch on code.
429Rate limit exceeded; wait for Retry-After.
502HTTP 502 response.
503Service unavailable or at capacity; retry when Retry-After is present.
504HTTP 504 response.
POST /render/xlsx