Skip to main content

Template Converter API

The Template Converter API applies a target brand template to an uploaded deck. The pipeline is asynchronous: kick off a job with POST /api/v1/template-conversions, then poll the recommended v2 status endpoint until the workflow reaches a terminal state.

REST resource paths (v1.1). This page documents the REST-resource path names (/api/v1/template-conversions/...). The legacy RPC-style paths under /api/v1/template-converter/* continue to be served indefinitely — they return a Deprecation: true header pointing to the successor alias documented here. New integrations should use the paths shown on this page.

Full schemas, request/response examples, and per-field documentation live in the interactive API Reference.

Skip the polling loop. If you can expose an HTTPS endpoint, subscribe to template_conversion.completed / template_conversion.failed via the Webhooks API and receive signed completion callbacks instead of polling for status.

Authentication

All endpoints require a Bearer token:

Authorization: Bearer YOUR_API_KEY

See Getting Started → Authentication for details.

Response envelope

Every endpoint returns the canonical envelope:

{ "success": true, "data": { "..." } }

…or, on error:

{ "success": false, "data": null, "error": { "code": "...", "message": "..." } }

Endpoint summary

MethodPathDescriptionSync/Async
POST/api/v1/template-conversionsCreate a template-conversion jobAsync
GET/api/v2/template-converter/status/{callback_id}Recommended. Poll a job with strict HTTP-status mappingSync
GET/api/v1/templates?feature=template_converterList templates available to Template ConverterSync
POST/api/v1/template-conversions/preprocessingsUpload a PPTX in chunksSync
POST/api/v1/template-conversions/finalisationsFinalise a chunked PPTX uploadSync
GET/api/v1/template-conversions/{callback_id}/review-suggestionsGet editorial review suggestionsSync
PATCH/api/v1/template-conversions/{callback_id}/review-suggestionsApply a subset of review suggestionsAsync
POST/api/v1/template-conversions/{callback_id}/template-changesRe-convert to a different templateAsync
GET/api/v1/template-conversions/{callback_id}/downloadGet a signed download URLSync
POST/api/v1/template-conversions/{callback_id}/comply-metricsRecord Comply metricsSync
PUT/api/v1/template-conversions/{callback_id}/reactionsRecord like / feedback (PUT, legacy quirk)Sync
GET/api/v1/template-conversions/{callback_id}/work-area-optionsGet work-area options for a slideSync
POST/api/v1/template-conversions/{callback_id}/work-area-adjustmentsApply a work-area adjustmentSync
GET/api/v1/template-conversions/{callback_id}/layoutsGet layout options for a slide / deckSync
POST/api/v1/template-conversions/{callback_id}/layout-updatesChange the layout of a slideAsync
POST/api/v1/template-conversions/{callback_id}/format-modificationsApply title/body formatting changesAsync
GET/api/v1/template-conversions/{callback_id}/format-modifications/settingsGet available modify-format settingsSync

All endpoints are in the template_converter rate-limit category. The start and download operations also count against per-key annual usage quotas (negotiated per customer — contact CS for your tier). See Developer Guide → Usage quotas and rate limits.


POST /api/v1/template-conversions — Create a conversion

Kicks off a template-conversion pipeline. Returns a callback_id to poll. Counts against the TC_START usage limit.

Pass either fileId (an id returned by a previous upload) or inputDeck (an inline reference to the input deck) — never both.

Request body

FieldTypeRequiredDescription
fileIdstringconditionalId of a previously uploaded input deck.
inputDeckobjectconditionalInline reference to the input deck (S3 path / chunk identifier).
templateNamestringyesName of the target brand template.
includeImageWithoutDatabooleannoCarry over images that have no associated data.
includeImageWithDatabooleannoCarry over images that have associated data.
includeIconsbooleannoCarry over icons.
includeSpecialColorbooleannoPreserve special color treatments.
settingsobjectnoPer-conversion settings (ai_mode, work_area_option, modifyFormat, color_preference, content_formatting).
modifyFormatobjectnoOptional top-level format overrides.

Example

curl -X POST https://api.prezent.ai/api/v1/template-conversions \
-H "Authorization: Bearer $PREZENT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fileId": "file_abc123",
"templateName": "Corporate 2024",
"includeImageWithData": true,
"settings": {
"ai_mode": "balanced",
"color_preference": "brand"
}
}'

Success response (200)

{
"success": true,
"data": {
"callback_id": "cb_tc_xyz",
"token": "tok_one_time_xyz",
"presentation_name": "Q3 review.pptx",
"status": "in_progress"
}
}

GET /api/v2/template-converter/status/{callback_id} — Poll a job (v2, strict mapping)

The recommended polling endpoint for the Template Converter family. Uses strict HTTP-status mapping so agents can branch on HTTP status alone, without inspecting body fields.

  • 200 OK — Conversion has completed successfully.
  • 202 Accepted — Conversion is still in progress.
  • 4xx / 5xx — Workflow failure, with the standard error envelope.

A separate v1 polling endpoint exists for backwards compatibility; it always returns HTTP 200 and requires inspecting data.status. New integrations should not use it. The v2 status path will be renamed to /api/v2/template-conversions/{callback_id} in a future cleanup; until then it continues to live at the path above.

Path parameters

ParameterTypeRequiredDescription
callback_idstringyesConversion job id (from POST /api/v1/template-conversions).

Query parameters

ParameterTypeRequiredDescription
sourcestring (nexus)noPass nexus to include the full outputs blob in the response.

Example

curl -i "https://api.prezent.ai/api/v2/template-converter/status/cb_tc_xyz" \
-H "Authorization: Bearer $PREZENT_API_KEY"

Success response (200)

{
"success": true,
"data": {
"callback_id": "cb_tc_xyz",
"status": "success",
"presentation_name": "Q3 review (Corporate 2024).pptx",
"template_name": "Corporate 2024",
"outputs": { "...": "..." }
}
}

In-progress response (202)

{
"success": true,
"data": {
"callback_id": "cb_tc_xyz",
"status": "in_progress",
"presentation_name": "Q3 review.pptx",
"template_name": "Corporate 2024",
"progress": { "stage": "rendering", "percent": 67 }
}
}

Failure responses

On workflow failure the response is 4xx or 5xx with the standard error envelope:

{
"success": false,
"data": null,
"error": {
"code": "EXTERNAL_SERVICE_ERROR",
"message": "Conversion failed at the layout-resolution stage.",
"details": { "stage": "layout" }
}
}
HTTPTypical codes
400MISSING_CALLBACK_ID, INVALID_INPUT.
401UNAUTHORIZED, INVALID_API_KEY, EXPIRED_API_KEY.
404RESOURCE_NOT_FOUND (unknown callback_id).
422UNPROCESSABLE_ENTITY (job was malformed at start).
429RATE_LIMIT_EXCEEDED, USAGE_LIMIT_EXCEEDED.
500INTERNAL_SERVER_ERROR.
502EXTERNAL_SERVICE_ERROR (downstream conversion pipeline error).
503SERVICE_UNAVAILABLE.
504GATEWAY_TIMEOUT.

GET /api/v1/templates?feature=template_converter — List templates

Returns themes/templates available to Template Converter. This single endpoint replaces the legacy /api/v1/autogenerator/templates and /api/v1/template-converter/templates paths — pass feature to scope results.

Query parameters

ParameterTypeRequiredDescription
featurestring (auto_generator / template_converter)noFilter to templates enabled for a specific feature.
namestringnoCase-insensitive name filter.
sortstringnoSort expression.
sourcestringnoSource filter.

Success response (200)

{
"success": true,
"data": {
"items": [
{ "id": "tmpl_corp_2024", "name": "Corporate 2024", "code": "CORP24", "source": "brand" }
],
"next_cursor": null
}
}

Chunked upload — preprocessings + finalisations

For input decks too large to send in a single request, use the chunked-upload flow.

POST /api/v1/template-conversions/preprocessings

Accepts one chunk of a multi-chunk PPTX upload. See the shared schema on the File Upload page (PreprocessFileRequest).

Only .pptx files are accepted.

POST /api/v1/template-conversions/finalisations

Concludes the chunked upload identified by fileIdentifier. The finalised file must be a .pptx, no larger than 200 MB, and no more than 100 pages.

Request body

FieldTypeRequiredDescription
fileIdentifierstringyesIdentifier shared across all chunks.
fileNamestringyesFinal filename. Must end in .pptx.

Success response (200)

{
"success": true,
"data": {
"file_id": "file_abc123",
"s3_prefix": "uploads/co_xyz/file_abc123/",
"s3_bucket": "prezent-uploads",
"type": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
"size_kb": 18432,
"num_of_pages": 42
}
}

data.file_id is what you pass to POST /api/v1/template-conversions as fileId.


Smart-edit endpoints

These endpoints let you refine an already-converted deck without re-running the full conversion from scratch.

GET /api/v1/template-conversions/{callback_id}/review-suggestions

Returns the editorial suggestions produced for the converted deck.

Success response (200)

{
"success": true,
"data": {
"callback_id": "cb_tc_xyz",
"presentation_name": "Q3 review (Corporate 2024).pptx",
"suggestions": [ { "..." : "..." } ]
}
}

PATCH /api/v1/template-conversions/{callback_id}/review-suggestions

Applies a subset of suggestions. Kicks off a background pipeline; the response carries a new callback_id to poll.

Request body

{
"suggestions": [
{ "id": "sug_1", "accepted": true },
{ "id": "sug_2", "accepted": false }
]
}

Success response (200)

{ "success": true, "data": { "callback_id": "cb_tc_xyz_v2" } }

POST /api/v1/template-conversions/{callback_id}/template-changes

Re-runs the conversion pipeline for an already-converted deck against a different templateName. Returns a new callback_id to poll.

Request body

FieldTypeRequiredDescription
templateNamestringyesNew target brand template name.
settingsobjectnoOverride conversion settings.

Success response (200)

{ "success": true, "data": { "callback_id": "cb_tc_xyz_v3" } }

GET /api/v1/template-conversions/{callback_id}/work-area-options

Returns available work-area adjustment options for a slide.

Path parameters

ParameterTypeRequiredDescription
callback_idstringyesConversion job id.

Query parameters

ParameterTypeRequiredDescription
slide_indexinteger ≥ 0yesZero-based slide index.

Success response (200)

{
"success": true,
"data": {
"callback_id": "cb_tc_xyz",
"work_area_adjustments": [ { "..." : "..." } ]
}
}

POST /api/v1/template-conversions/{callback_id}/work-area-adjustments

Applies a selected work-area adjustment to a slide.

Request body

FieldTypeRequiredDescription
slide_indexinteger ≥ 0yesZero-based slide index.
selectionobjectyesSelected work-area-option payload.

Success response (200)

{ "success": true, "data": { "message": "Adjustment applied." } }

GET /api/v1/template-conversions/{callback_id}/layouts

Returns available layouts for the target template and, optionally, the input deck's layouts for a slide.

Path parameters

ParameterTypeRequiredDescription
callback_idstringyesConversion job id.

Query parameters

ParameterTypeRequiredDescription
slide_indexinteger ≥ 0noZero-based slide index. Omit to return layouts for every slide.

Success response (200)

{
"success": true,
"data": {
"callback_id": "cb_tc_xyz",
"status": "success",
"layouts": {
"target_template_layouts": [ { "..." : "..." } ],
"input_deck_layouts": [ { "..." : "..." } ]
}
}
}

POST /api/v1/template-conversions/{callback_id}/layout-updates

Updates the layout of a slide and re-renders the affected portion of the deck. Returns a new callback_id to poll.

Request body

FieldTypeRequiredDescription
slide_indexinteger ≥ 0yesZero-based slide index.
layout_idstringyesTarget layout id (from /template-conversions/{callback_id}/layouts).

Success response (200)

{ "success": true, "data": { "callback_id": "cb_tc_xyz_v4" } }

POST /api/v1/template-conversions/{callback_id}/format-modifications

Applies a batch of title/body formatting changes and re-renders the affected slides. Returns a new callback_id to poll.

Request body

FieldTypeRequiredDescription
modify_format_configarray of objectyesPer-slide formatting modifications. Each item may contain title and body objects.

Success response (200)

{ "success": true, "data": { "callback_id": "cb_tc_xyz_v5" } }

GET /api/v1/template-conversions/{callback_id}/format-modifications/settings

Returns the available formatting controls (font sizes, weight, alignment) for title/body text in the converted deck.

Path parameters

ParameterTypeRequiredDescription
callback_idstringyesConversion job id.

Success response (200)

{
"success": true,
"data": {
"callback_id": "cb_tc_xyz",
"modify_format_settings": [ { "..." : "..." } ]
}
}

GET /api/v1/template-conversions/{callback_id}/download — Download

Returns a signed download URL for the converted deck. Counts against the TC_DOWNLOAD usage limit.

Success response (200)

{
"success": true,
"data": {
"download_url": "https://...signed-url...",
"file_name": "Q3 review (Corporate 2024).pptx",
"message": "Ready to download."
}
}

POST /api/v1/template-conversions/{callback_id}/comply-metrics — Comply metrics

Records compliance metrics for a converted deck. The body is forwarded to the ComplyMetrics service. Typically invoked via a callback_id + token URL handed back to the caller after a conversion.

Success response (200)

{ "success": true, "data": { "message": "Metrics recorded." } }

PUT /api/v1/template-conversions/{callback_id}/reactions — Like / feedback

Records a like or qualitative feedback against a converted deck. Uses PUT rather than POST — a legacy quirk preserved from the original endpoint.

Path parameters

ParameterTypeRequiredDescription
callback_idstringyesConverted-deck callback id.

Request body

FieldTypeRequiredDescription
typestringyesliked or feedback.
valueboolean or stringyesBoolean when type=liked; string when type=feedback.

Success response (200)

{
"success": true,
"data": {
"callback_id": "cb_tc_xyz",
"type": "liked",
"message": "Reaction recorded.",
"warnings": []
}
}

Errors

All endpoints on this page return the standard error envelope. Common codes:

  • 400MISSING_CALLBACK_ID, MISSING_TEMPLATE_ID, INVALID_INPUT, INVALID_PAYLOAD.
  • 401INVALID_API_KEY, EXPIRED_API_KEY, UNAUTHORIZED.
  • 404ENDPOINT_NOT_FOUND, RESOURCE_NOT_FOUND.
  • 415UNSUPPORTED_FILE_TYPE (uploads / chunking only).
  • 429RATE_LIMIT_EXCEEDED, USAGE_LIMIT_EXCEEDED.
  • 500 / 502 / 503 / 504 — standard server-side codes.

See the full catalog in Developer Guide → Error codes.