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.
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 endpoint | Redirected to |
|---|---|
POST /api/v1/autogenerator | POST /api/v2/generate |
GET /api/v1/autogenerator/status | GET /api/v2/autogenerator/status |
POST /api/v1/autogenerator/download | POST /api/v2/autogenerator/download |
POST /api/v1/autogenerator/regenerate | POST /api/v2/autogenerator/edit (see Regenerate for the supported operations) |
POST /api/v1/autogenerator/reaction-feedback | POST /api/v2/autogenerator/feedback |
Not supported — these endpoints do not work with presentations created through the v2 flow:
POST /api/v1/autogenerator/status-bulkPOST /api/v1/autogenerator/node-change(use the regeneratenode_changeoperation instead)POST /api/v1/autogenerator/replace-imagePOST /api/v1/autogenerator/slide-actionsPOST /api/v1/autogenerator/metaPOST /api/v1/autogenerator/slide-dataPOST /api/v1/autogenerator/brand-image-search
Skip the polling loop. If you can expose an HTTPS endpoint, subscribe to
autogeneration.completed/autogeneration.failedvia the Webhooks API and receive signed completion callbacks instead of pollingGET /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
| Method | Path | Description | Sync/Async |
|---|---|---|---|
POST | /api/v1/autogenerator | Create an AutoGenerator job | Async |
GET | /api/v1/autogenerator/status | Read an AutoGenerator job | Sync |
POST | /api/v1/autogenerator/status-bulk | Look up multiple jobs in one call | Sync |
POST | /api/v1/autogenerator/download | Create a download artefact for a deck | Sync (up to ~60s) |
POST | /api/v1/autogenerator/regenerate | Create a regeneration of a deck | Async |
POST | /api/v1/autogenerator/node-change | Create a node-level change on a slide | Sync |
POST | /api/v1/autogenerator/extract-images | Create an image-extraction for a deck | Sync |
POST | /api/v1/autogenerator/replace-image | Create an image replacement on a slide | Sync |
POST | /api/v1/autogenerator/reaction-feedback | Create a like / feedback reaction | Sync |
POST | /api/v1/autogenerator/slide-actions | Duplicate, delete, or annotate a slide | Sync |
GET | /api/v1/autogenerator/templates | List templates available to AutoGenerator | Sync |
Utility operations
These endpoints are read/lookup utilities, not resource operations.
They are still in the auto_generator rate-limit category.
| Method | Path | Description | Sync/Async |
|---|---|---|---|
POST | /api/v1/autogenerator/meta | Fetch slide metadata for asset ids | Sync |
POST | /api/v1/autogenerator/slide-data | Fetch slide data for one slide | Sync |
POST | /api/v1/autogenerator/brand-image-search | Search the caller's brand-image library | Sync |
POST | /api/v1/autogenerator/library-image-search | Search the configured stock-image library | Sync |
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
| Field | Type | Required | Description |
|---|---|---|---|
prompt | string | yes | Natural-language description of the deck to generate. |
texts | array of string | no | Additional free-text context to ground the deck. |
files | array of string | no | IDs of previously uploaded supporting files. |
web_links | array of URI | no | Web URLs to ingest as additional context. |
audience | object | no | Target audience. Requires id (string) and num_id (integer). |
template_id | string | no | Target theme/template id. |
settings | object | no | Optional per-generation settings — see below. |
All settings keys are optional; omit the object entirely to use the
defaults configured for your API key.
| Key | Type | Allowed values |
|---|---|---|
template_id | string | Any template id. Used only when the root-level template_id is absent. |
ai_model | string | astrid_standard, astrid_advanced |
image_preferences | array of string | prezent_library, company_library, brand_library |
knowledge_base | string | uploaded_only, uploaded_and_web |
data_sources | array of string | add_sources_to_footer, add_sources_to_slides_note |
speaker_notes | array of string | add_speaker_notes, add_speaker_notes_to_slides_note |
preserve_text | boolean | true, false |
voice_settings | object | type: brand, standard, custom. When type is custom, details.tone and details.emotion are required. |
Example
- cURL
- Python
- Node.js
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"]
}
}'
import os
import requests
url = "https://api.prezent.ai/api/v1/autogenerator"
headers = {
"Authorization": f"Bearer {os.environ['PREZENT_API_KEY']}",
"Content-Type": "application/json",
}
payload = {
"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"],
},
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
const axios = require('axios');
const { data } = await axios.post(
'https://api.prezent.ai/api/v1/autogenerator',
{
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'],
},
},
{
headers: {
Authorization: `Bearer ${process.env.PREZENT_API_KEY}`,
'Content-Type': 'application/json',
},
}
);
console.log(data);
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
| Parameter | Type | Required | Description |
|---|---|---|---|
callback_id | string | yes | Callback id returned by POST /api/v1/autogenerator. |
deck_callback_id | string | no | Parent 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
- Python
- Node.js
curl "https://api.prezent.ai/api/v1/autogenerator/status?callback_id=cb_a1b2c3d4" \
-H "Authorization: Bearer $PREZENT_API_KEY"
import os
import requests
url = "https://api.prezent.ai/api/v1/autogenerator/status"
headers = {
"Authorization": f"Bearer {os.environ['PREZENT_API_KEY']}",
}
params = {"callback_id": "cb_a1b2c3d4"}
response = requests.get(url, headers=headers, params=params)
response.raise_for_status()
print(response.json())
const axios = require('axios');
const { data } = await axios.get(
'https://api.prezent.ai/api/v1/autogenerator/status',
{
params: { callback_id: 'cb_a1b2c3d4' },
headers: {
Authorization: `Bearer ${process.env.PREZENT_API_KEY}`,
},
}
);
console.log(data);
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
| Field | Type | Required | Description |
|---|---|---|---|
callback_id | string | yes | Deck callback id to merge. Must be a non-empty string. |
sources | object | no | Source-attribution config. Supports add_sources_to_slides_note (boolean). |
speaker_notes | object | no | Speaker-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
| Parameter | Type | Required | Description |
|---|---|---|---|
operation | string | yes | Sub-operation to perform — see the table below. |
Request body
callback_id is always required. The remaining required fields depend on
operation:
operation | Additionally required |
|---|---|
audience_change | audience |
template_change | template_code |
slide_change | slide_override |
context_change | context and slide_override (with ui_slide_position) |
smart_chart_change | slide_override (with slide_type and ui_slide_position) |
node_change | slide_override (with node_count and ui_slide_position) |
story_content_change | story_content_override |
add_slide | context (with context.context prompt) and slide_position |
duration_change | duration (with duration.no_of_slides) |
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.
| Field | Type | Required | Description |
|---|---|---|---|
callback_id | string | yes | Existing deck callback id. |
audience | object | conditional | Override audience. Requires id (string) and num_id (integer). Resolved automatically from the original deck when omitted. |
template_code | string | conditional | Override template code. |
slide_override | object | conditional | Slide-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. |
context | object | conditional | Additional context. For add_slide, the nested context property carries the prompt. |
slide_position | integer | conditional | Zero-based insert position for add_slide. |
duration | object | conditional | Target deck length. Requires no_of_slides (positive integer). |
story_content_override | object | conditional | Narrative-content overrides. May also be an array. |
voice_settings | object | no | Voice/tone settings. |
data_sources_settings | object | no | Source attribution — add_sources_to_footer, add_sources_to_slides_note. Both default to false. |
preserve_text | boolean | no | Preserve 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
| Field | Type | Required | Description |
|---|---|---|---|
callback_id | string | yes | Deck callback id. |
slide_callback_id | string | yes | Slide 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
| Field | Type | Required | Description |
|---|---|---|---|
s3_bucket | string | yes | Bucket containing the PowerPoint. |
s3_path | string | yes | S3 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
| Parameter | Type | Required | Description |
|---|---|---|---|
callback_id | string | yes | Deck callback id that owns the slide. Used to update the deck's cached state after the replacement. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
oldImage | object | yes | Existing image being replaced. Requires meta (object) and shapeType (string). |
newImage | object | yes | Replacement image. Requires imageIndex (integer) and source — see the source table below. |
slide_callback_id | string | yes | Slide where the image lives. |
duplicate_slide_callback_id | string | no | Duplicate 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:
source | Additionally required |
|---|---|
myWorkspace | s3_path, s3_bucket |
s3 | s3_path, s3_bucket |
brand-images | s3_path |
extracted | s3_path (bucket is resolved server-side) |
adobe | id |
freepik | id |
upload | image (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
| Field | Type | Required | Description |
|---|---|---|---|
uuid | string | yes | Target asset uuid. Must be a canonical UUID (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx). |
type | string | yes | liked or feedback. |
value | boolean or string | yes | Boolean when type=liked; non-empty string when type=feedback. |
shareDetails | object | conditional | Required 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:
action | Additionally required |
|---|---|
duplicate | deck_callback_id, slide_callback_id |
delete | deck_callback_id, slide_callback_id |
add_sources_to_slides_note | data.uuid, data.addDataSourcesTo.slideNote |
speaker_notes | uuid, type, data |
| Field | Type | Required | Description |
|---|---|---|---|
action | string | yes | One of duplicate, delete, add_sources_to_slides_note, speaker_notes. |
deck_callback_id | string | conditional | Deck callback id. Required for duplicate / delete. |
slide_callback_id | string | conditional | Slide callback id. Required for duplicate / delete. |
uuid | string | conditional | Deck callback id. Required for speaker_notes only — add_sources_to_slides_note carries its id at data.uuid instead. |
type | string | conditional | Note sub-type. Required for speaker_notes only. |
data | object | conditional | Action-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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | no | Case-insensitive name filter. |
sort | string | no | Sort expression (for example name:asc). |
source | string | no | Source filter (brand vs prezent). |
enabledFeature | string | no | Optional feature flag filter. |
limit | integer | no | Items per page (1–200, default 50). Enables pagination. |
cursor | string | no | Opaque 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
| Field | Type | Required | Description |
|---|---|---|---|
assetIds | array of string | yes | Asset ids to look up. |
callbackID | string | yes | Parent 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
| Field | Type | Required | Description |
|---|---|---|---|
callback_id | string | yes | Deck callback id (scopes the search to the right company). |
query | string | no | Search query. Defaults to * (return all). |
skip | integer | no | Number of results to skip. |
limit | integer | no | Maximum 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
| Field | Type | Required | Description |
|---|---|---|---|
searchKey | string | no | Search query. If blank, derived from the supplied slide context. |
limit | integer | no | Max results (default 30). |
offset | integer | no | Result offset (default 0). |
slide_callback_id | string | no | Optional 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.