Skip to main content
Version: 1.0

AutoGenerator API

The AutoGenerator API turns natural-language prompts, supporting files, and asset references into a Prezent-quality deck. Generation is asynchronous: kick off a job with POST /api/v1/autogenerator, then poll GET /api/v1/autogenerator/status?callback_id={callback_id} until the status reaches success (or failed).

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

v1 is deprecated

The v1 AutoGenerator APIs are deprecated, and supported v1 requests are redirected to the v2 AI Builder APIs. Redirected endpoints accept the v1 request and return the v2 response. New integrations should call the v2 APIs directly.

Supported (redirected to v2)

v1 endpointRedirected to
POST /api/v1/autogeneratorPOST /api/v2/generate
GET /api/v1/autogenerator/statusGET /api/v2/autogenerator/status
POST /api/v1/autogenerator/downloadPOST /api/v2/autogenerator/download
POST /api/v1/autogenerator/regeneratePOST /api/v2/autogenerator/edit (see Regenerate for the supported operations)
POST /api/v1/autogenerator/reaction-feedbackPOST /api/v2/autogenerator/feedback

Not supported — these endpoints do not work with presentations created through the v2 flow:

  • POST /api/v1/autogenerator/status-bulk
  • POST /api/v1/autogenerator/node-change (use the regenerate node_change operation instead)
  • POST /api/v1/autogenerator/replace-image
  • POST /api/v1/autogenerator/slide-actions
  • POST /api/v1/autogenerator/meta
  • POST /api/v1/autogenerator/slide-data
  • POST /api/v1/autogenerator/brand-image-search

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

Authentication​

All endpoints require a Bearer token:

Authorization: Bearer YOUR_API_KEY

See Getting Started → Authentication for details.

Response envelope​

Errors use the canonical envelope:

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

Most endpoints on this page return success as { "success": true, "data": { ... } }, but three do not: POST /api/v1/autogenerator returns its payload under resData, and both GET /api/v1/autogenerator/status and POST /api/v1/autogenerator/download return their fields at the top level. Each endpoint below documents its own success shape.

See Developer Guide → Error codes for the full code catalog.

Endpoint summary​

MethodPathDescriptionSync/Async
POST/api/v1/autogeneratorCreate an AutoGenerator jobAsync
GET/api/v1/autogenerator/statusRead an AutoGenerator jobSync
POST/api/v1/autogenerator/status-bulkLook up multiple jobs in one callSync
POST/api/v1/autogenerator/downloadCreate a download artefact for a deckSync (up to ~60s)
POST/api/v1/autogenerator/regenerateCreate a regeneration of a deckAsync
POST/api/v1/autogenerator/node-changeCreate a node-level change on a slideSync
POST/api/v1/autogenerator/extract-imagesCreate an image-extraction for a deckSync
POST/api/v1/autogenerator/replace-imageCreate an image replacement on a slideSync
POST/api/v1/autogenerator/reaction-feedbackCreate a like / feedback reactionSync
POST/api/v1/autogenerator/slide-actionsDuplicate, delete, or annotate a slideSync
GET/api/v1/autogenerator/templatesList templates available to AutoGeneratorSync

Utility operations​

These endpoints are read/lookup utilities, not resource operations. They are still in the auto_generator rate-limit category.

MethodPathDescriptionSync/Async
POST/api/v1/autogenerator/metaFetch slide metadata for asset idsSync
POST/api/v1/autogenerator/slide-dataFetch slide data for one slideSync
POST/api/v1/autogenerator/brand-image-searchSearch the caller's brand-image librarySync
POST/api/v1/autogenerator/library-image-searchSearch the configured stock-image librarySync

All AutoGenerator endpoints are in the auto_generator rate-limit category. The slide-generation and presentation-download operations also count against per-key annual usage quotas (50,000 / year and 1,000,000 / year respectively, configurable per company). See Developer Guide → Usage quotas and rate limits.


POST /api/v1/autogenerator — Create a job​

Kicks off the AutoGenerator pipeline. Returns a callback_id to poll via GET /api/v1/autogenerator/status?callback_id={callback_id}.

Request body​

FieldTypeRequiredDescription
promptstringyesNatural-language description of the deck to generate.
textsarray of stringnoAdditional free-text context to ground the deck.
filesarray of stringnoIDs of previously uploaded supporting files.
web_linksarray of URInoWeb URLs to ingest as additional context.
audienceobjectnoTarget audience. Requires id (string) and num_id (integer).
template_idstringnoTarget theme/template id.
settingsobjectnoOptional per-generation settings — see below.

All settings keys are optional; omit the object entirely to use the defaults configured for your API key.

KeyTypeAllowed values
template_idstringAny template id. Used only when the root-level template_id is absent.
ai_modelstringastrid_standard, astrid_advanced
image_preferencesarray of stringprezent_library, company_library, brand_library
knowledge_basestringuploaded_only, uploaded_and_web
data_sourcesarray of stringadd_sources_to_footer, add_sources_to_slides_note
speaker_notesarray of stringadd_speaker_notes, add_speaker_notes_to_slides_note
preserve_textbooleantrue, false
voice_settingsobjecttype: brand, standard, custom. When type is custom, details.tone and details.emotion are required.

Example​

curl -X POST https://api.prezent.ai/api/v1/autogenerator \
-H "Authorization: Bearer $PREZENT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Generate a presentation on AI trends",
"template_id": "tmpl_corp_2024",
"audience": {
"id": "aud_9f1b2c2f",
"num_id": 42
},
"settings": {
"ai_model": "astrid_standard",
"image_preferences": ["prezent_library", "company_library"],
"knowledge_base": "uploaded_and_web",
"data_sources": ["add_sources_to_footer", "add_sources_to_slides_note"],
"speaker_notes": ["add_speaker_notes", "add_speaker_notes_to_slides_note"]
}
}'

Success response (200)​

This endpoint returns the payload under resData, not the canonical data key:

{
"message": "Job submitted successfully",
"resData": {
"callback_id": "cb_a1b2c3d4",
"token": "3f6c1e9a-..."
},
"error": null
}

GET /api/v1/autogenerator/status — Read a job​

Returns the current state of an AutoGenerator job.

Query parameters​

ParameterTypeRequiredDescription
callback_idstringyesCallback id returned by POST /api/v1/autogenerator.
deck_callback_idstringnoParent deck callback id. Required when polling a regeneration — pass the original deck's callback id alongside the regeneration's callback_id so the regenerated slide is merged into the deck and the merged deck is returned. Omitting it returns only the regenerated slide.

Example​

curl "https://api.prezent.ai/api/v1/autogenerator/status?callback_id=cb_a1b2c3d4" \
-H "Authorization: Bearer $PREZENT_API_KEY"

Success response (200)​

Fields are returned at the top level, not nested under data:

{
"message": "Workflow status polling completed.",
"status": "success",
"prompt": "Generate a presentation on AI trends",
"fileName": "ai-trends.pptx",
"allSlides": [ { "..." : "..." } ],
"extracted_images": [ { "..." : "..." } ],
"company": "co_xyz",
"template_code": "tmpl_corp_2024",
"audience": { "id": "aud_9f1b2c2f", "num_id": 42 },
"execution_start": "2026-05-18T10:14:00Z",
"execution_end": "2026-05-18T10:14:42Z"
}

status is one of in_progress, success, or failed. Once success, polling the same callback_id returns the same cached payload. Note the response does not echo back the callback_id you polled with.


POST /api/v1/autogenerator/status-bulk — Bulk lookup​

Returns layout metadata for many callbacks in one call. Useful for list-view rendering.

Request body​

{
"callback_ids": ["cb_1", "cb_2", "cb_3"]
}

Success response (200)​

{
"success": true,
"data": [
{ "slide_id": "...", "layouts": [ { "..." : "..." } ] },
{ "slide_id": "...", "layouts": [ { "..." : "..." } ] }
]
}

POST /api/v1/autogenerator/download — Merge & download​

Synchronously merges all slides for the callback_id supplied in the request body into a single deck and returns a signed download URL. May take up to 60 seconds. Counts against the presentation-download annual quota (default 1,000,000 / year, configurable per company).

Request body​

FieldTypeRequiredDescription
callback_idstringyesDeck callback id to merge. Must be a non-empty string.
sourcesobjectnoSource-attribution config. Supports add_sources_to_slides_note (boolean).
speaker_notesobjectnoSpeaker-notes config. Supports add_speaker_notes_to_slides_note (boolean) and speaker_notes_type (string).
{
"callback_id": "cb_a1b2c3d4",
"sources": {
"add_sources_to_slides_note": true
},
"speaker_notes": {
"add_speaker_notes_to_slides_note": true
}
}

Success response (200)​

Fields are returned at the top level, not nested under data:

{
"message": "Slides merged successfully",
"status": "success",
"output_file": "cb_a1b2c3d4.pptx",
"download_url": "https://...signed-url..."
}

POST /api/v1/autogenerator/regenerate — Regenerate​

Re-runs part of an existing deck — typically a slide, node, or section — and returns a new callback_id. Counted as a fresh generation.

Query parameters​

ParameterTypeRequiredDescription
operationstringyesSub-operation to perform — see the table below.

Request body​

callback_id is always required. The remaining required fields depend on operation:

operationAdditionally required
audience_changeaudience
template_changetemplate_code
slide_changeslide_override
context_changecontext and slide_override (with ui_slide_position)
smart_chart_changeslide_override (with slide_type and ui_slide_position)
node_changeslide_override (with node_count and ui_slide_position)
story_content_changestory_content_override
add_slidecontext (with context.context prompt) and slide_position
duration_changeduration (with duration.no_of_slides)
note

slide_change and generate_speaker_notes are no longer available through the API — use the presentation's preview_url (returned by POST /api/v1/autogenerator) instead. story_content_change is not supported. These operations return 400.

FieldTypeRequiredDescription
callback_idstringyesExisting deck callback id.
audienceobjectconditionalOverride audience. Requires id (string) and num_id (integer). Resolved automatically from the original deck when omitted.
template_codestringconditionalOverride template code.
slide_overrideobjectconditionalSlide-level overrides. For node_change, smart_chart_change and context_change, identify the target slide with ui_slide_position — its zero-based position in the deck (0 is the first slide). For node_change, node_count (1–10) sets the new node count.
contextobjectconditionalAdditional context. For add_slide, the nested context property carries the prompt.
slide_positionintegerconditionalZero-based insert position for add_slide.
durationobjectconditionalTarget deck length. Requires no_of_slides (positive integer).
story_content_overrideobjectconditionalNarrative-content overrides. May also be an array.
voice_settingsobjectnoVoice/tone settings.
data_sources_settingsobjectnoSource attribution — add_sources_to_footer, add_sources_to_slides_note. Both default to false.
preserve_textbooleannoPreserve existing text where possible. Inherited from the original deck's workflow when omitted.
{
"callback_id": "cb_a1b2c3d4",
"audience": {
"id": "aud_9f1b2c2f",
"num_id": 42
}
}

Success response (200)​

{
"success": true,
"data": {
"new_callback_id": "cb_regen_xyz",
"message": "Regenerate job started."
}
}

Poll GET /api/v1/autogenerator/status?callback_id=cb_regen_xyz, setting deck_callback_id to the original deck's id so the regenerated slide is merged into the deck.


POST /api/v1/autogenerator/node-change — Apply a node change​

Mutates a single node (text, image, shape) on one slide. Returns the updated slide payload synchronously.

Request body​

FieldTypeRequiredDescription
callback_idstringyesDeck callback id.
slide_callback_idstringyesSlide to modify. The node count applied is read from the slide's own state, not from the request.
{
"callback_id": "cb_a1b2c3d4",
"slide_callback_id": "cb_slide_7h3k"
}

Success response (200)​

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

POST /api/v1/autogenerator/extract-images — Extract images​

Extracts embedded images from a PowerPoint stored in S3.

Request body​

FieldTypeRequiredDescription
s3_bucketstringyesBucket containing the PowerPoint.
s3_pathstringyesS3 key of the PowerPoint.
{
"s3_bucket": "your-bucket",
"s3_path": "path/to/deck.pptx"
}

Success response (200)​

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

POST /api/v1/autogenerator/replace-image — Replace an image​

Swaps an image on a slide with a new image from one of the supported sources. The target slide's S3 location is resolved from slide_callback_id — you do not supply it.

Query parameters​

ParameterTypeRequiredDescription
callback_idstringyesDeck callback id that owns the slide. Used to update the deck's cached state after the replacement.

Request body​

FieldTypeRequiredDescription
oldImageobjectyesExisting image being replaced. Requires meta (object) and shapeType (string).
newImageobjectyesReplacement image. Requires imageIndex (integer) and source — see the source table below.
slide_callback_idstringyesSlide where the image lives.
duplicate_slide_callback_idstringnoDuplicate slide id to mirror the replacement onto.

newImage.source must be one of myWorkspace, adobe, freepik, upload, extracted, s3, or brand-images. The other fields it needs depend on that value:

sourceAdditionally required
myWorkspaces3_path, s3_bucket
s3s3_path, s3_bucket
brand-imagess3_path
extracteds3_path (bucket is resolved server-side)
adobeid
freepikid
uploadimage (base64), extension
{
"oldImage": {
"meta": { "...": "..." },
"shapeType": "Picture"
},
"newImage": {
"imageIndex": 0,
"source": "s3",
"s3_bucket": "your-bucket",
"s3_path": "path/to/image.png"
},
"slide_callback_id": "cb_slide_7h3k"
}

Success response (200)​

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

POST /api/v1/autogenerator/reaction-feedback — Like / feedback​

Records a like or qualitative feedback against a deck or slide.

Request body​

FieldTypeRequiredDescription
uuidstringyesTarget asset uuid. Must be a canonical UUID (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
typestringyesliked or feedback.
valueboolean or stringyesBoolean when type=liked; non-empty string when type=feedback.
shareDetailsobjectconditionalRequired when type=feedback.
{
"uuid": "8f14e45f-ceea-467a-9f1b-2c2f0e3a1b90",
"type": "liked",
"value": true
}

Success response (200)​

{
"success": true,
"data": {
"uuid": "8f14e45f-ceea-467a-9f1b-2c2f0e3a1b90",
"type": "liked",
"value": true,
"message": "Reaction recorded."
}
}

POST /api/v1/autogenerator/slide-actions — Slide actions​

Performs one of four per-slide actions: duplicate, delete, add_sources_to_slides_note, or speaker_notes.

Request body​

action is always required. The remaining fields differ per action — the two note-style actions do not take the same shape:

actionAdditionally required
duplicatedeck_callback_id, slide_callback_id
deletedeck_callback_id, slide_callback_id
add_sources_to_slides_notedata.uuid, data.addDataSourcesTo.slideNote
speaker_notesuuid, type, data
FieldTypeRequiredDescription
actionstringyesOne of duplicate, delete, add_sources_to_slides_note, speaker_notes.
deck_callback_idstringconditionalDeck callback id. Required for duplicate / delete.
slide_callback_idstringconditionalSlide callback id. Required for duplicate / delete.
uuidstringconditionalDeck callback id. Required for speaker_notes only — add_sources_to_slides_note carries its id at data.uuid instead.
typestringconditionalNote sub-type. Required for speaker_notes only.
dataobjectconditionalAction-specific payload. Required for both note-style actions. For add_sources_to_slides_note it must contain uuid and addDataSourcesTo.slideNote (boolean).

Duplicating a slide:

{
"action": "duplicate",
"deck_callback_id": "cb_a1b2c3d4",
"slide_callback_id": "cb_slide_7h3k"
}

Adding source attributions to slide notes:

{
"action": "add_sources_to_slides_note",
"data": {
"uuid": "cb_a1b2c3d4",
"addDataSourcesTo": {
"slideNote": true
}
}
}

Success response (200)​

For duplicate:

{
"success": true,
"data": { "new_callback_id": "cb_dup_xyz", "message": "Slide duplicated." }
}

For delete:

{
"success": true,
"data": { "deleted_slide_id": "slide_42", "message": "Slide deleted." }
}

For note-style actions, data carries the downstream service's payload.


GET /api/v1/autogenerator/templates — List templates​

Returns themes/templates available to AutoGenerator. Results are always scoped to the auto_generator feature — the scoping is applied server-side and cannot be overridden by the caller.

Query parameters​

ParameterTypeRequiredDescription
namestringnoCase-insensitive name filter.
sortstringnoSort expression (for example name:asc).
sourcestringnoSource filter (brand vs prezent).
enabledFeaturestringnoOptional feature flag filter.
limitintegernoItems per page (1–200, default 50). Enables pagination.
cursorstringnoOpaque cursor from a previous response's next_cursor.

Success response (200)​

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

next_cursor is null on the last page (or when pagination was not requested). Send limit to page; pass next_cursor back as cursor. See Developer Guide → Pagination.


Utility operations​

These endpoints are read/lookup utilities, not resource operations. Their RPC-style paths are kept verbatim because REST-ifying them produces awkward names (/image-search-queries, /slide-metadata-fetches).

POST /api/v1/autogenerator/meta — Slide metadata​

Returns slide-level metadata (titles, layout codes, thumbnails) for each asset id.

Request body​

FieldTypeRequiredDescription
assetIdsarray of stringyesAsset ids to look up.
callbackIDstringyesParent deck callback id (legacy camelCase preserved for backwards compatibility).

Success response (200)​

{
"success": true,
"data": {
"...": "passthrough payload from the SlideMeta service"
}
}

POST /api/v1/autogenerator/slide-data — Fetch one slide​

Returns the raw slide-data document (text, images, layout, speaker notes) for a slide.

Request body​

{ "slide_callback_id": "slide_42" }

Success response (200)​

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

POST /api/v1/autogenerator/brand-image-search — Brand image search​

Searches the caller's brand-image library.

Request body​

FieldTypeRequiredDescription
callback_idstringyesDeck callback id (scopes the search to the right company).
querystringnoSearch query. Defaults to * (return all).
skipintegernoNumber of results to skip.
limitintegernoMaximum number of results (max 100).

Success response (200)​

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

POST /api/v1/autogenerator/library-image-search — Stock image search​

Searches the configured stock image provider (Adobe Stock or Freepik, depending on company configuration).

Request body​

FieldTypeRequiredDescription
searchKeystringnoSearch query. If blank, derived from the supplied slide context.
limitintegernoMax results (default 30).
offsetintegernoResult offset (default 0).
slide_callback_idstringnoOptional slide callback id used to infer searchKey.

Success response (200)​

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

Errors​

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

  • 400 — MISSING_PROMPT, MISSING_TEMPLATE_ID, MISSING_CALLBACK_ID, MISSING_SHARE_DETAILS, INVALID_INPUT, INVALID_PAYLOAD.
  • 401 — INVALID_API_KEY, EXPIRED_API_KEY, UNAUTHORIZED.
  • 404 — ENDPOINT_NOT_FOUND, RESOURCE_NOT_FOUND.
  • 429 — RATE_LIMIT_EXCEEDED, USAGE_LIMIT_EXCEEDED.
  • 500 / 502 / 503 / 504 — standard server-side codes.

See the full catalog in Developer Guide → Error codes.