Skip to main content

Prezent Platform API (2.0.0)

Download OpenAPI specification:Download

Agent-ready REST API for Prezent's content-generation and template-conversion services.

The Prezent Platform API exposes Prezent's AI Builder, Template Converter, Audiences, Themes, and File-upload services as a JSON HTTP API.

Only the AI Builder surface changed from 1.0. Template Converter, Audiences, Themes, Upload, File Access, Webhooks, and Health are identical to 1.0 — the same paths, payloads, and responses. If you use only those, 2.0 requires no change on your side.

The AI Builder API moved from a polling model to a streaming one. POST /api/v2/generate (or /autogenerator/edit) returns a callback_id; POST /api/v2/streams/sessions with that id returns a short-lived stream_url; opening it with any SSE client yields events shaped {status, message, callback_id}status: "inprogress" until a terminal success, failed, or cancelled, with a successful terminal event adding download_url. POST /api/v2/autogenerator/download skips the streams/sessions step and returns a stream_url directly, because the file may need exporting first and that can outlast an HTTP response. Stream URLs expire in about 5 minutes with the token embedded in the URL (so no Authorization header is sent, and EventSource cannot send one); mint a fresh one by repeating the call — the stream replays from the start of the turn. There is no status endpoint in 2.0, and the former regenerate / node-change / slide-actions endpoints collapsed into the single POST /api/v2/autogenerator/edit. A full walk-through with client code is in the Streaming guide.

Success shapes are not uniform on the v2 AI Builder surface — read the response schema on the endpoint you are calling rather than assuming a shared shape. POST /api/v2/generate and /autogenerator/edit return {message, resData, error}; /autogenerator/download returns flat top-level fields; /streams/sessions returns {success, data}; /autogenerator/languages returns {status, message, data}; and /integrations/auth returns one of two shapes documented on that endpoint. Errors remain uniform everywhere: { "success": false, "data": null, "error": { "code": "...", "message": "...", "details": { } } }. Error codes are drawn from a stable catalog (see ErrorCode) — codes never change meaning or HTTP status once published. Schemas allow additional properties, so handlers may emit extra keys alongside the documented ones; do not depend on undocumented keys.

Conventions that apply to every endpoint (full reference in the companion guides on this documentation site):

  • Auth: API key as a Bearer token — Authorization: Bearer <key>. Each key is scoped to an allow-list of endpoint paths; an out-of-scope call returns 404 ENDPOINT_NOT_FOUND, indistinguishable from a path that does not exist.
  • Rate limits: gateway throttle 10 req/s sustained, 5 burst, 1,000 req/day per key; per-company per-category 60-second sliding windows; annual quotas (50,000 slide generations/yr, 1,000,000 downloads/yr). Limit breaches return 429 with error.code TOO_MANY_REQUESTS (gateway), RATE_LIMIT_EXCEEDED (per-category), or USAGE_LIMIT_EXCEEDED (annual).
  • Idempotency & pagination: mutating requests accept an Idempotency-Key; list endpoints accept opt-in limit/cursor paging.

Still on 1.0? The 1.0 contract is unchanged and still served — see the 1.0 API reference and the 1.0 documentation. Both versions run side by side; there is no forced migration.

Building with an AI agent? Prezent ships a first-class Model Context Protocol (MCP) server. The hosted endpoint is https://mcp.myprezent.com/mcp (OAuth 2.1, works with Claude.ai Custom Connectors); a local stdio server is published on PyPI as prezent-mcp-server and plugs into Claude Desktop, Cursor, Cline, Continue, and Zed. The MCP tools wrap the same REST endpoints described here.

Official SDKs. Typed REST clients are published for Python and TypeScript (prezent-sdk) — generated from and versioned against this spec. For other languages, generate a client from this document.

Out of scope of this document: SCIM endpoints under /api/v1/scim/*. Those endpoints conform to RFC 7644 (SCIM 2.0) and follow a different envelope (schemas, Resources, totalResults, etc.). They are documented separately at /docs/scim-user-management.

AI Builder

Generate, edit, and download AI-authored presentations. In API 2.0 every one of these is a STREAMING flow: the endpoint returns a callback_id (or, for download, a stream_url directly), and progress plus the final download URL arrive as Server-Sent Events. See the AI Builder API guide.

Generate a presentation

Start a presentation generation and receive a callback_id.

This is a streaming flow. Nothing is returned but the id — to watch progress and obtain the finished deck, exchange the callback_id for a stream URL via POST /api/v2/streams/sessions and read the Server-Sent Events. The terminal done event carries the download_url.

Providing context

Beyond prompt, you can ground the generation in your own material:

  • files — ids of previously uploaded files (see POST /api/v1/preprocess)
  • web_links — URLs to read
  • text — an inline block of text

Settings resolution

Every key in settings is optional. Any key you omit falls back to the default stored on your API key, and then to the documented default. So a key configured with your house template and language needs only a prompt.

Authorizations:
BearerAuth
header Parameters
Idempotency-Key
string
Example: 8e6df756-18f6-4f16-8e12-7d7a5c5cb181

Optional client-generated key (a UUID is ideal) that makes a write request safe to retry. The first request is processed and its response cached for 24 hours; an identical retry with the same key returns the cached response plus an Idempotency-Replayed: true header, so the job is never created twice. Reusing a key with a different body returns 409 IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_BODY.

Request Body schema: application/json
required
prompt
required
string non-empty

What to generate, in plain language. Be specific about topic, audience, and length — "a 10-slide deck on renewable-energy market trends for a board audience" produces a better result than "renewable energy".

template_id
string

Brand template to apply. Takes precedence over settings.template_id. Falls back to your key's configured template, then your default theme.

audience_id
string

Audience profile to tailor the deck to (tone, detail, structure). List available profiles with GET /api/v1/audiences.

object

Object form of audience_id. audience_id takes precedence.

Array of objects (GenerationContextFile)

Files to ground the generation in. Upload them first with POST /api/v1/preprocess, then pass the ids here.

web_links
Array of strings <uri> [ items <uri > ]

URLs for the generator to read as source material.

text
string

A block of text to use as source material — notes, an outline, an excerpt. Use texts to pass several.

texts
Array of strings

Several blocks of text as source material. Takes precedence over text.

websearch
boolean
Default: false

Let the generator search the web. Takes precedence over settings.websearch.

externalContext
boolean

Alias for websearch.

object (GenerationSettingsV2)

Generation settings. Every key is optional. An omitted key falls back to the default configured on your API key, and then to the documented default — so a fully configured key needs no settings object at all.

Responses

Request samples

Content type
application/json
Example
{
  • "prompt": "A 10-slide deck on renewable-energy market trends for 2026"
}

Response samples

Content type
application/json
{
  • "message": "Job submitted successfully",
  • "resData": {
    },
  • "error": null
}

Edit a presentation

Apply a natural-language edit to a presentation that was generated with POST /api/v2/generate.

This is a streaming flow, and it works exactly like generate: you receive a new callback_id for this edit turn, which you exchange for a stream URL via POST /api/v2/streams/sessions.

Edits are conversational — each edit builds on the last. Pass the callback_id of the most recent turn (the original generation, or a previous edit) as the callback_id here, and use the new id returned for the next edit.

Omit slideIndex to edit the deck as a whole; supply it to target one slide.

The generation must have finished. Editing is only possible once the target presentation has completed — the deck size has to be known before a slide can be addressed. Editing a callback_id that is still generating returns 400.

One turn at a time. If a previous turn on this presentation is still running, the request is rejected with that condition reported in error.message.

Authorizations:
BearerAuth
header Parameters
Idempotency-Key
string
Example: 8e6df756-18f6-4f16-8e12-7d7a5c5cb181

Optional client-generated key (a UUID is ideal) that makes a write request safe to retry. The first request is processed and its response cached for 24 hours; an identical retry with the same key returns the cached response plus an Idempotency-Replayed: true header, so the job is never created twice. Reusing a key with a different body returns 409 IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_BODY.

Request Body schema: application/json
required
callback_id
required
string non-empty

The presentation to edit — the callback_id of the original generation, or of the most recent edit.

prompt
required
string non-empty

The change to make, in plain language.

slideIndex
integer >= 0

Which slide to edit, counting from 0. Omit to edit the deck as a whole.

Must be within the deck — a value past the last slide is rejected with 400 reporting the actual slide count.

Array of objects (GenerationContextFile)

Files to use as context for this edit.

web_links
Array of strings <uri> [ items <uri > ]

URLs to read as context for this edit.

text
string

A block of text to use as context for this edit.

Responses

Request samples

Content type
application/json
Example
{
  • "callback_id": "3f8e7d61-9a2b-4c5e-b013-7d4a6f2c8e91",
  • "prompt": "Make the tone more formal and shorten every bullet"
}

Response samples

Content type
application/json
{
  • "message": "Edit submitted successfully",
  • "resData": {
    },
  • "error": null
}

Download a presentation

Obtain the finished presentation file for a callback_id.

This is a streaming flow, and it is the one place where it differs from generate and edit: this endpoint returns a stream_url directly, so there is no POST /api/v2/streams/sessions step. Open the URL and read the events; the terminal done event carries the download_url.

A stream rather than an inline URL because the file may not exist yet. If the requested export_type is not the format this presentation already produced, a fresh export runs — which can take several minutes, far longer than an HTTP response allows. Both cases end on the same terminal event, so one parser handles either:

Case What you see
Already exported in this format done immediately, with the download_url
Needs exporting progress events, then done with the new download_url

Quota is checked up front. If your plan does not have enough remaining download slides for this presentation, the request fails with 429 USAGE_LIMIT_EXCEEDED and no stream is minted.

Authorizations:
BearerAuth
header Parameters
Idempotency-Key
string
Example: 8e6df756-18f6-4f16-8e12-7d7a5c5cb181

Optional client-generated key (a UUID is ideal) that makes a write request safe to retry. The first request is processed and its response cached for 24 hours; an identical retry with the same key returns the cached response plus an Idempotency-Replayed: true header, so the job is never created twice. Reusing a key with a different body returns 409 IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_BODY.

Request Body schema: application/json
required
callback_id
required
string non-empty

The presentation to download.

export_type
string
Enum: "pptx" "pdf"

File format. Defaults to the format configured on your API key, and then to pptx.

Responses

Request samples

Content type
application/json
Example
{
  • "callback_id": "3f8e7d61-9a2b-4c5e-b013-7d4a6f2c8e91"
}

Response samples

Content type
application/json
{}

List supported languages

The languages a presentation can be generated in. Pass a locale from this list as settings.language on POST /api/v2/generate; an unsupported locale is rejected with 422.

The list is static — cache it rather than calling this on every generation.

Authorizations:
BearerAuth

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "message": "Supported languages retrieved successfully",
  • "data": [
    ]
}

List templates available to AutoGenerator

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

Pagination is opt-in. Send limit (and follow next_cursor) to page; omit both limit and cursor to receive the full list unchanged.

Authorizations:
BearerAuth
query Parameters
name
string

Optional case-insensitive name filter.

sort
string

Sort expression (for example name:asc).

limit
integer [ 1 .. 200 ]
Default: 50

Items per page (1–200, default 50). Enables pagination.

cursor
string

Opaque cursor from a previous response's next_cursor.

source
string

Source filter (e.g. brand vs prezent).

enabledFeature
string

Optional feature flag filter.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": [
    ],
  • "next_cursor": "string"
}

Posters

Version: 1.0

Generate, edit, and download AI-authored posters — a single canvas rather than a deck of slides. Same STREAMING contract as AI Builder: the endpoint returns a callback_id (or, for download, a stream_url directly), and progress plus the final download URL arrive as Server-Sent Events. Orientation and page size replace the deck-size settings, an edit addresses a region of the canvas by name instead of a slideIndex, and citations render per reference_format. See the Posters API guide.

Generate a poster

Start a poster generation and receive a callback_id.

This is a streaming flow. Nothing is returned but the id — to watch progress and obtain the finished poster, exchange the callback_id for a stream URL via POST /api/v2/streams/sessions and read the Server-Sent Events. The terminal done event carries the download_url.

Describing the poster

A poster is read all at once, so the layout matters as much as the content — and the prompt is where you specify it. Name the regions you want and what goes in each ("3 horizontal rows; row 1 covers … with a pie chart of …"). Those names are also how you target part of the canvas in a later edit.

Providing context

Beyond prompt, you can ground the poster in your own material:

  • files — ids of previously uploaded files (see POST /api/v1/preprocess)
  • web_links — URLs to read
  • text — an inline block of text

Settings resolution

Every key in settings is optional. Any key you omit falls back to the default stored on your API key, and then to the documented default. So a key configured with your house template and language needs only a prompt.

Authorizations:
BearerAuth
header Parameters
Idempotency-Key
string
Example: 8e6df756-18f6-4f16-8e12-7d7a5c5cb181

Optional client-generated key (a UUID is ideal) that makes a write request safe to retry. The first request is processed and its response cached for 24 hours; an identical retry with the same key returns the cached response plus an Idempotency-Replayed: true header, so the job is never created twice. Reusing a key with a different body returns 409 IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_BODY.

Request Body schema: application/json
required
prompt
required
string non-empty

What to generate, in plain language.

A poster is read all at once, so describe the layout as well as the content — name the regions you want and what goes in each ("organise content in 3 horizontal rows; row 1 covers … with a pie chart of …"). A bare topic produces a valid poster but leaves every layout decision to the generator, and gives a later edit nothing to address by name.

template_id
string

Brand template to apply. Takes precedence over settings.template_id. Falls back to your key's configured template, then your default theme.

Array of objects (GenerationContextFile)

Files to ground the poster in. Upload them first with POST /api/v1/preprocess, then pass the ids here. Supported: .pptx, .pdf, .docx, .txt, .xlsx, .csv, .png, .jpg, .jpeg.

web_links
Array of strings <uri> [ items <uri > ]

URLs for the generator to read as source material.

text
string

A block of text to use as source material — notes, an outline, an excerpt.

websearch
boolean
Default: false

Let the generator search the web. Takes precedence over settings.websearch.

Independent of the fields above: enable both to have the poster built from your sources and supplemented with current public data.

object (PosterSettingsV2)

Poster settings. Every key is optional. An omitted key falls back to the default configured on your API key, and then to the documented default — so a fully configured key needs no settings object at all.

Responses

Request samples

Content type
application/json
Example
{
  • "prompt": "A poster on cloud misconfiguration as the leading cause of enterprise data breaches"
}

Response samples

Content type
application/json
{
  • "message": "Job submitted successfully",
  • "resData": {
    },
  • "error": null
}

Edit a poster

Apply a natural-language edit to a poster that was generated with POST /api/v1/posters/generate.

This is a streaming flow, and it works exactly like generate: you receive a new callback_id for this edit turn, which you exchange for a stream URL via POST /api/v2/streams/sessions.

Edits are conversational — each edit builds on the last. Pass the callback_id of the most recent turn (the original generation, or a previous edit) as the callback_id here, and use the new id returned for the next edit.

What an edit can change

Intent Example prompt
Change template Apply the corporate 2026 template
Replace a visual Replace the image in row 1 with something from the brand library
Change a chart Turn the pie chart into a horizontal bar chart, sorted descending
Manage sources Add the 2026 cloud security report and switch citations to AMA
Rewrite content Shorten every bullet in row 3 to one line
Change layout Move the comparison table to row 3

The generation must have finished. Editing a callback_id that is still generating returns 400.

One turn at a time. If a previous turn on this poster is still running, the request is rejected with that condition reported in error.message.

Authorizations:
BearerAuth
header Parameters
Idempotency-Key
string
Example: 8e6df756-18f6-4f16-8e12-7d7a5c5cb181

Optional client-generated key (a UUID is ideal) that makes a write request safe to retry. The first request is processed and its response cached for 24 hours; an identical retry with the same key returns the cached response plus an Idempotency-Replayed: true header, so the job is never created twice. Reusing a key with a different body returns 409 IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_BODY.

Request Body schema: application/json
required
callback_id
required
string non-empty

The poster to edit — the callback_id of the original generation, or of the most recent edit.

prompt
required
string non-empty

The change to make, in plain language.

The poster's settings — template, orientation, size, language, reference format, image sources — are fixed at generation time and carry over unchanged through every edit; ask for what you want here. Asking for a different orientation or page size reflows the whole canvas: content is preserved and recomposed for the new aspect ratio, so region positions move.

Array of objects (GenerationContextFile)

Files to use as context for this edit.

web_links
Array of strings <uri> [ items <uri > ]

URLs to read as context for this edit.

text
string

A block of text to use as context for this edit.

Responses

Request samples

Content type
application/json
Example
{
  • "callback_id": "3f8e7d61-9a2b-4c5e-b013-7d4a6f2c8e91",
  • "prompt": "In row 2, replace the comparison table with a stacked bar chart and keep the same three columns as series"
}

Response samples

Content type
application/json
{
  • "message": "Edit submitted successfully",
  • "resData": {
    },
  • "error": null
}

Download a poster

Obtain the finished poster file for a callback_id. The download_url is returned inline — one request, one URL.

If you ask for the format the generation already produced, that file's URL is returned as-is. Any other format is re-exported from the poster's stored canvas before the URL comes back, so allow up to ~25 seconds for that call.

download_url carries its own access token: fetch it as-is, with no Authorization header. It expires at expires_at, about 5 minutes out — call this endpoint again for a fresh URL.

The poster must have finished generating. Requesting a download while generation is still in progress returns 400.

Authorizations:
BearerAuth
header Parameters
Idempotency-Key
string
Example: 8e6df756-18f6-4f16-8e12-7d7a5c5cb181

Optional client-generated key (a UUID is ideal) that makes a write request safe to retry. The first request is processed and its response cached for 24 hours; an identical retry with the same key returns the cached response plus an Idempotency-Replayed: true header, so the job is never created twice. Reusing a key with a different body returns 409 IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_BODY.

Request Body schema: application/json
required
callback_id
required
string non-empty

The poster to download.

export_type
string
Enum: "pptx" "pdf" "png" "jpg" "jpeg"

File format. Defaults to the format configured on your API key, and then to pptx.

Value Result
pptx A PowerPoint file sized to the canvas — editable downstream
pdf Vector, print-ready at the canvas size — the right choice for printing
jpg Raster, smaller file, no transparency — for web and previews
png Raster, lossless, supports transparency

Each format is a separate export, so the same poster can be downloaded in several — call this endpoint once per export_type.

Responses

Request samples

Content type
application/json
Example
{
  • "callback_id": "3f8e7d61-9a2b-4c5e-b013-7d4a6f2c8e91"
}

Response samples

Content type
application/json
{}

List poster templates

The brand templates available for poster generation — the values you pass as template_id. Results are scoped to the poster feature server-side; the scoping cannot be overridden by the caller.

Always list from this endpoint: a template_id from another surface is not necessarily valid for a poster.

Pagination is opt-in. Send limit (and follow next_cursor) to page; omit both limit and cursor to receive the full list unchanged.

Authorizations:
BearerAuth
query Parameters
name
string

Optional case-insensitive name filter.

sort
string

Sort expression (for example name:asc).

source
string

Source filter (e.g. brand vs prezent).

orientation
string
Enum: "landscape" "portrait" "square"

Only templates supporting this orientation.

enabledFeature
string

Optional feature flag filter.

limit
integer [ 1 .. 200 ]
Default: 50

Items per page (1–200, default 50). Enables pagination.

cursor
string

Opaque cursor from a previous response's next_cursor.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": [
    ],
  • "next_cursor": "string"
}

List supported languages

The languages a poster can be generated in. Pass a locale from this list as settings.language on POST /api/v1/posters/generate; an unsupported locale is rejected with 422.

Right-to-left locales such as ar mirror the poster's region order as well as its text.

The list is static — cache it rather than calling this on every generation.

Authorizations:
BearerAuth

Responses

Response samples

Content type
application/json
{
  • "status": "success",
  • "message": "Supported languages retrieved successfully",
  • "data": [
    ]
}

Template Converter

Apply a target brand template to an uploaded presentation, including review suggestions, work-area adjustment, layout change, and download.

Create a template-conversion job

Kicks off a pipeline that applies the target brand template (templateName) to the input PowerPoint (fileId or inputDeck). Returns a callback_id to poll. Counted against the TC_START usage limit.

Subsequent calls in the same conversion lifecycle: poll GET /api/v1/template-converter/status/{callbackId} until the pipeline reaches a terminal state.

Authorizations:
BearerAuth
header Parameters
Idempotency-Key
string
Example: 8e6df756-18f6-4f16-8e12-7d7a5c5cb181

Optional client-generated key (a UUID is ideal) that makes a write request safe to retry. The first request is processed and its response cached for 24 hours; an identical retry with the same key returns the cached response plus an Idempotency-Replayed: true header, so the job is never created twice. Reusing a key with a different body returns 409 IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_BODY.

Request Body schema: application/json
required
fileId
string

Identifier of a previously uploaded input deck. Supply either fileId or inputDeck.

object

Inline reference to the input deck. All four properties below are required when inputDeck is used.

templateName
required
string non-empty

Code of the target brand template. Must be one the caller's company is authorised to use — an unknown or unauthorised code is rejected.

includeImageWithoutData
boolean
Default: false

Carry over images that have no associated data.

includeImageWithData
boolean
Default: false

Carry over images that have associated data.

includeIcons
boolean
Default: false

Carry over icons.

includeSpecialColor
boolean
Default: false

Preserve special color treatments from the source deck.

color_preference
string
Default: "standard"
Enum: "standard" "advanced"

Color treatment preference. Also accepted as colorPreference.

content_formatting_preference
string
Enum: "standard" "advanced"

Content-formatting preference. Also accepted as contentFormattingPreference.

modifyFormat
string
Enum: "source" "target"

Which deck's formatting to apply. Also accepted as modify_format.

object

Per-conversion settings. Each key overrides the corresponding API-key default.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "fileId": "string",
  • "inputDeck": {
    },
  • "templateName": "string",
  • "includeImageWithoutData": false,
  • "includeImageWithData": false,
  • "includeIcons": false,
  • "includeSpecialColor": false,
  • "color_preference": "standard",
  • "content_formatting_preference": "standard",
  • "modifyFormat": "source",
  • "settings": {
    }
}

Response samples

Content type
application/json
{
  • "callbackId": "string",
  • "status": "processing",
  • "presentationName": "string",
  • "token": "string"
}

Poll a template-conversion job

Returns the current state of a template-conversion job. The response is HTTP 200 whenever the job is found — branch on the status field in the body, which reports whether the pipeline is still running, has completed, or has failed.

For the same callbackId, polling after a successful conversion returns the same cached payload.

Authorizations:
BearerAuth
path Parameters
callbackId
required
string non-empty

Callback id returned by POST /api/v1/template-converter/start.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Upload a preprocessing chunk for a template-conversion input

Accepts one chunk of a multi-chunk PPTX upload, used as the inputDeck for a subsequent template-conversion job. Only .pptx files are accepted. Chunks of the same upload are grouped by the body's requestIdentifier, and the upload precedes the creation of the conversion's callback_id.

Authorizations:
BearerAuth
Request Body schema: application/json
required
fileContent
required
string

Chunk content as base64 / data: URL.

fileName
required
string

Original filename including extension.

chunkIndex
required
integer >= 0

Zero-based index of this chunk.

totalChunks
required
integer >= 1

Total number of chunks for this upload.

requestIdentifier
required
string

Caller-supplied identifier that groups chunks of the same upload.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "fileContent": "string",
  • "fileName": "string",
  • "chunkIndex": 0,
  • "totalChunks": 1,
  • "requestIdentifier": "string"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Finalise a chunked PPTX upload

Concludes a chunked upload. fileIdentifier must match the requestIdentifier used when uploading the chunks via POST /api/v1/template-converter/preprocess.

The finalised file must be a .pptx, no larger than 200 MB, and no more than 100 pages. Runs before the conversion's callback_id exists — the fileId it returns is what you pass to POST /api/v1/template-converter/start.

Authorizations:
BearerAuth
Request Body schema: application/json
required
fileIdentifier
required
string

Identifier shared across all chunks of this upload. Must match the requestIdentifier sent with each chunk.

fileName
required
string

Final filename. Must end in .pptx.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "fileIdentifier": "string",
  • "fileName": "string"
}

Response samples

Content type
application/json
{
  • "status": "success",
  • "log": "string",
  • "data": {
    }
}

Read review suggestions for a template-conversion

Returns the colour and special-colour suggestions produced for the converted deck identified by callbackId. Each suggestion may be applied via the corresponding PATCH endpoint.

The conversion must have completed and produced compliance data — otherwise the request is rejected.

Authorizations:
BearerAuth
path Parameters
callbackId
required
string non-empty

Server-issued opaque identifier returned by an async kick-off endpoint. Used to poll status or fetch derived artefacts.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Update review suggestions on a template-conversion

Applies a subset of editorial suggestions to the converted deck identified by callbackId. Kicks off a background pipeline that produces a new derived deck; the response carries a new callback_id to poll.

Authorizations:
BearerAuth
path Parameters
callbackId
required
string non-empty

Server-issued opaque identifier returned by an async kick-off endpoint. Used to poll status or fetch derived artefacts.

Request Body schema: application/json
required
Any of
required
object

Colour replacement to apply.

object

Special-colour replacement to apply.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "colorSuggestions": {
    },
  • "specialColorSuggestions": {
    }
}

Response samples

Content type
application/json
{
  • "status": "processing",
  • "callbackId": "string",
  • "presentationName": "string"
}

Create a template change on a template-conversion

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

Authorizations:
BearerAuth
path Parameters
callbackId
required
string non-empty

Server-issued opaque identifier returned by an async kick-off endpoint. Used to poll status or fetch derived artefacts.

Request Body schema: application/json
required
templateName
required
string non-empty

Code of the new target brand template. Must be one the caller's company is authorised to use — an unknown or unauthorised code is rejected.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "templateName": "string"
}

Response samples

Content type
application/json
{
  • "status": "processing",
  • "callbackId": "string",
  • "presentationName": "string"
}

Read the download URL for a template-conversion

Returns a signed download URL for the converted deck identified by callbackId. Counted against the TC_DOWNLOAD usage limit.

The conversion must have reached completed — polling GET /api/v1/template-converter/status/{callbackId} first is required, otherwise the request is rejected with the current status.

Authorizations:
BearerAuth
path Parameters
callbackId
required
string non-empty

Server-issued opaque identifier returned by an async kick-off endpoint. Used to poll status or fetch derived artefacts.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {}
}

Upsert a reaction on a template-conversion

Records a like or qualitative feedback against a converted deck. The target deck is identified by callback_id in the request body. When type is liked the value must be a boolean; when feedback the value must be a string.

This endpoint accepts PUT only — a POST returns METHOD_NOT_ALLOWED.

Authorizations:
BearerAuth
Request Body schema: application/json
required
callback_id
required
string non-empty

Converted-deck callback id. Must correspond to a live conversion session.

type
required
string
Enum: "liked" "feedback"

Reaction kind.

required
boolean or string

When type=liked, a boolean. When type=feedback, a string. An empty string is rejected.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "callback_id": "string",
  • "type": "liked",
  • "value": true
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Read work-area options for a template-conversion slide

Returns the available work-area adjustment options for the given slide of the given conversion job. Both parameters are supplied as query parameters.

Authorizations:
BearerAuth
query Parameters
callbackId
required
string non-empty

Conversion job id. Must correspond to a live conversion session.

slideIndex
required
integer >= 0

Zero-based slide index.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Create a work-area adjustment on a template-conversion

Applies a selected work-area adjustment to the given slide of a conversion job. All parameters are supplied in the request body.

selection is validated against the options currently available for that slide — fetch them first via GET /api/v1/template-converter/work-area-options.

Authorizations:
BearerAuth
Request Body schema: application/json
required
callbackId
required
string non-empty

Conversion job id. Must correspond to a live conversion session.

slideIndex
required
integer >= 0

Zero-based slide index.

selection
required
string

The work-area option to apply. Must be one of the options currently available for this slide, as returned by GET /api/v1/template-converter/work-area-options.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "callbackId": "string",
  • "slideIndex": 0,
  • "selection": "string"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Read layout options for a template-conversion

Returns the layout options available for the given slide of a conversion job. Both parameters are supplied as query parameters.

Authorizations:
BearerAuth
query Parameters
callbackId
required
string non-empty

Conversion job id. Must correspond to a live conversion session.

slideIndex
required
integer >= 0

Zero-based slide index.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Create a layout update on a template-conversion

Updates the layout of one or more slides and re-renders the affected portion of the converted deck. Returns a new callback_id to poll. All parameters are supplied in the request body.

Authorizations:
BearerAuth
Request Body schema: application/json
required
callbackId
required
string non-empty

Conversion job id. Must correspond to a live conversion session.

slideIndex
required
Array of integers non-empty [ items >= 0 ]

Zero-based indices of the slides to update. Must be an array with at least one element, even for a single slide.

layoutId
required
string non-empty

Target layout id, taken from GET /api/v1/template-converter/layouts.

source
required
string
Enum: "targetTemplateLayouts" "inputDeckLayouts"

Which layout collection layoutId belongs to.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "callbackId": "string",
  • "slideIndex": [
    ],
  • "layoutId": "string",
  • "source": "targetTemplateLayouts"
}

Response samples

Content type
application/json
{
  • "status": "processing",
  • "callbackId": "string",
  • "presentationName": "string"
}

Create a format modification on a template-conversion

Applies a batch of format modifications (title-formatting, body-formatting) to a converted deck and re-renders the affected slides. Returns a new callback_id to poll. All parameters are supplied in the request body.

The conversion must have completed before this can be called.

Authorizations:
BearerAuth
Request Body schema: application/json
required
callbackId
required
string non-empty

Conversion job id. Must correspond to a live, completed conversion.

slideIndex
required
Array of integers non-empty [ items >= 0 ]

Zero-based indices of the slides to restyle. Each value must be within the deck's slide count.

selection_type
string
Enum: "single" "all" "custom" "apply to slides after the current slide" "apply to slides before the current slide"

How the selection was made. Derived automatically when omitted.

overall_settings_selected
boolean
Default: false

When true, deck-level settings are applied and modify_format_config is not required. When false or omitted, modify_format_config is required.

Array of objects

Per-slide formatting modifications. Required unless overall_settings_selected is true.

The array length must equal slideIndex's length — entry i applies to slide slideIndex[i]. Each entry must contain either title or body, never both.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "callbackId": "string",
  • "slideIndex": [
    ],
  • "selection_type": "single",
  • "overall_settings_selected": false,
  • "modify_format_config": [
    ]
}

Response samples

Content type
application/json
{
  • "status": "processing",
  • "callbackId": "string",
  • "presentationName": "string"
}

Read available format-modification settings for a template-conversion

Returns the current title/body formatting settings for every slide of a converted deck. Use these as the starting point for a POST /api/v1/template-converter/modify-format request.

The conversion must have completed — otherwise the request is rejected with the current status.

Authorizations:
BearerAuth
query Parameters
callbackId
required
string non-empty

Conversion job id. Must correspond to a completed conversion.

Responses

Response samples

Content type
application/json
{
  • "callbackId": "string",
  • "modify_format_settings": [
    ]
}

Audiences

List and search the audience profiles configured for the caller's company.

List audience profiles

Returns the audiences configured for the caller's company.

Pagination is opt-in. Send limit (and follow next_cursor) to page; omit both limit and cursor to receive the full list unchanged.

Authorizations:
BearerAuth
query Parameters
feature
string

Filter by feature scope.

id
string

Filter to a single audience by id.

sort
string

Sort expression (for example name:asc).

limit
integer [ 1 .. 200 ]
Default: 50

Max items per page (1–200, default 50). Sending this enables cursor pagination.

cursor
string

Opaque cursor from a previous response's next_cursor.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "result": [
    ],
  • "items": [
    ],
  • "next_cursor": "string"
}

Search audience profiles

Free-text and field-filtered search across audience profiles. Use the request body's limit field to cap how many matches are returned (most-relevant first) and the filterBy* fields to narrow the search.

Authorizations:
BearerAuth
query Parameters
feature
string

Filter by feature scope.

Request Body schema: application/json
required
query
string

Free-text search query.

id
string

Filter to a single audience by id.

sort
string

Sort expression (for example name:asc).

object

Field-level filter.

object

Collection-level filter.

fields
Array of strings

Subset of fields to return.

extraFields
Array of strings

Additional fields to include beyond defaults.

limit
integer
Default: 15

Maximum number of results.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "query": "string",
  • "id": "string",
  • "sort": "string",
  • "filterBy": { },
  • "filterByCollection": { },
  • "fields": [
    ],
  • "extraFields": [
    ],
  • "limit": 15
}

Response samples

Content type
application/json
{
  • "success": true,
  • "result": [
    ],
  • "items": [
    ],
  • "next_cursor": "string"
}

Themes

List the presentation themes (brand templates) configured for the caller's company.

List themes (brand templates)

Returns the presentation themes available to the caller's company.

Pagination is opt-in. Send limit (and follow next_cursor) to page; omit both limit and cursor to receive the full list unchanged.

Authorizations:
BearerAuth
query Parameters
name
string

Optional case-insensitive name filter.

feature
string

Filter by feature scope.

enabledFeature
string

Optional feature flag filter.

sort
string

Sort expression (for example name:asc).

limit
integer [ 1 .. 200 ]
Default: 50

Max items per page (1–200, default 50). Sending this enables cursor pagination.

cursor
string

Opaque cursor from a previous response's next_cursor.

source
string

Source filter.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": [
    ],
  • "next_cursor": "string"
}

Upload

Validate, preprocess, and upload supporting files (PowerPoint, PDF, images, etc.).

Preprocess a file in chunks

Accepts one chunk of a multi-chunk file upload. The caller drives chunking via chunkIndex and totalChunks; chunks for the same upload share a requestIdentifier. Once all chunks for a requestIdentifier have arrived the file is assembled and made available to downstream operations.

Authorizations:
BearerAuth
Request Body schema: application/json
required
fileContent
required
string

Chunk content as base64 / data: URL.

fileName
required
string

Original filename including extension.

chunkIndex
required
integer >= 0

Zero-based index of this chunk.

totalChunks
required
integer >= 1

Total number of chunks for this upload.

requestIdentifier
required
string

Caller-supplied identifier that groups chunks of the same upload.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "fileContent": "string",
  • "fileName": "string",
  • "chunkIndex": 0,
  • "totalChunks": 1,
  • "requestIdentifier": "string"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Validate uploaded files and/or web links

Validates a set of previously uploaded files (referenced by fileIdentifiers) and/or a list of web links. At least one of fileIdentifiers or webLinks must be non-empty.

Authorizations:
BearerAuth
Request Body schema: application/json
required
object

Map of uuidfileName for previously uploaded files.

webLinks
Array of strings <uri> [ items <uri > ]

List of URLs to validate.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "fileIdentifiers": {
    },
  • "webLinks": []
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

File Access

Mint short-lived access tokens for the caller's stored files.

Create signed access tokens for stored files

Returns short-lived per-file access tokens that allow the caller to download the referenced files from the underlying storage backend.

Paths that are not non-empty strings are skipped rather than rejected, so the response may contain fewer tokens than the number of filePaths supplied.

Authorizations:
BearerAuth
Request Body schema: application/json
required
filePaths
required
Array of strings non-empty

List of stored file paths to mint tokens for.

source
string
Enum: "betaimages" "magikarp"

Storage backend source.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "filePaths": [
    ],
  • "source": "betaimages"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Webhooks

Receive signed HTTPS callbacks when Prezent jobs complete or fail. Subscriptions are scoped per API key, retried over a 21h window, and auto-disabled after 50 consecutive failures. See the Webhooks guide for the signature format and verification examples.

AutoGenerator job completed Webhook

Delivered when an AutoGenerator job finishes successfully. Verify the X-Prezent-Signature header and deduplicate on the event id.

Authorizations:
BearerAuth
Request Body schema: application/json
required
id
required
string^evt_[a-zA-Z0-9_]+$

Globally unique event identifier. Also sent in the X-Prezent-Event header. Dedupe on this if you receive the same event twice (at-least-once delivery).

type
required
string (WebhookEventType)
Enum: "autogeneration.completed" "autogeneration.failed" "template_conversion.completed" "template_conversion.failed" "webhook.test"

Catalog of event types emitted by Prezent. New types may be added without notice; clients should ignore unknown values.

api_version
required
string

Schema version for the data field. Increments only on breaking changes; legacy versions remain available.

created_at
required
string <date-time>
required
object

Event-specific payload. For autogeneration.* events, contains callback_id, report_id, status, plus outputs (on success) or error_log (on failure). For template_conversion.* events, contains the conversion callback_id, status, and output URLs.

Responses

Request samples

Content type
application/json
{
  • "id": "evt_8c2a1f7e6d3b4a5c9e0f8d7b6a5c4d3e",
  • "type": "autogeneration.completed",
  • "api_version": "1.0",
  • "created_at": "2019-08-24T14:15:22Z",
  • "data": { }
}

AutoGenerator job failed Webhook

Delivered when an AutoGenerator job fails. Same envelope, signature, and retry semantics as autogeneration.completed.

Authorizations:
BearerAuth
Request Body schema: application/json
required
id
required
string^evt_[a-zA-Z0-9_]+$

Globally unique event identifier. Also sent in the X-Prezent-Event header. Dedupe on this if you receive the same event twice (at-least-once delivery).

type
required
string (WebhookEventType)
Enum: "autogeneration.completed" "autogeneration.failed" "template_conversion.completed" "template_conversion.failed" "webhook.test"

Catalog of event types emitted by Prezent. New types may be added without notice; clients should ignore unknown values.

api_version
required
string

Schema version for the data field. Increments only on breaking changes; legacy versions remain available.

created_at
required
string <date-time>
required
object

Event-specific payload. For autogeneration.* events, contains callback_id, report_id, status, plus outputs (on success) or error_log (on failure). For template_conversion.* events, contains the conversion callback_id, status, and output URLs.

Responses

Request samples

Content type
application/json
{
  • "id": "evt_8c2a1f7e6d3b4a5c9e0f8d7b6a5c4d3e",
  • "type": "autogeneration.completed",
  • "api_version": "1.0",
  • "created_at": "2019-08-24T14:15:22Z",
  • "data": { }
}

Template Converter job completed Webhook

Delivered when a Template Converter job finishes successfully.

Authorizations:
BearerAuth
Request Body schema: application/json
required
id
required
string^evt_[a-zA-Z0-9_]+$

Globally unique event identifier. Also sent in the X-Prezent-Event header. Dedupe on this if you receive the same event twice (at-least-once delivery).

type
required
string (WebhookEventType)
Enum: "autogeneration.completed" "autogeneration.failed" "template_conversion.completed" "template_conversion.failed" "webhook.test"

Catalog of event types emitted by Prezent. New types may be added without notice; clients should ignore unknown values.

api_version
required
string

Schema version for the data field. Increments only on breaking changes; legacy versions remain available.

created_at
required
string <date-time>
required
object

Event-specific payload. For autogeneration.* events, contains callback_id, report_id, status, plus outputs (on success) or error_log (on failure). For template_conversion.* events, contains the conversion callback_id, status, and output URLs.

Responses

Request samples

Content type
application/json
{
  • "id": "evt_8c2a1f7e6d3b4a5c9e0f8d7b6a5c4d3e",
  • "type": "autogeneration.completed",
  • "api_version": "1.0",
  • "created_at": "2019-08-24T14:15:22Z",
  • "data": { }
}

Template Converter job failed Webhook

Delivered when a Template Converter job fails.

Authorizations:
BearerAuth
Request Body schema: application/json
required
id
required
string^evt_[a-zA-Z0-9_]+$

Globally unique event identifier. Also sent in the X-Prezent-Event header. Dedupe on this if you receive the same event twice (at-least-once delivery).

type
required
string (WebhookEventType)
Enum: "autogeneration.completed" "autogeneration.failed" "template_conversion.completed" "template_conversion.failed" "webhook.test"

Catalog of event types emitted by Prezent. New types may be added without notice; clients should ignore unknown values.

api_version
required
string

Schema version for the data field. Increments only on breaking changes; legacy versions remain available.

created_at
required
string <date-time>
required
object

Event-specific payload. For autogeneration.* events, contains callback_id, report_id, status, plus outputs (on success) or error_log (on failure). For template_conversion.* events, contains the conversion callback_id, status, and output URLs.

Responses

Request samples

Content type
application/json
{
  • "id": "evt_8c2a1f7e6d3b4a5c9e0f8d7b6a5c4d3e",
  • "type": "autogeneration.completed",
  • "api_version": "1.0",
  • "created_at": "2019-08-24T14:15:22Z",
  • "data": { }
}

Test delivery Webhook

Sent once when you call the subscription test endpoint. Single-shot — delivered once with no retries — so you can verify connectivity and signature handling before production traffic flows.

Authorizations:
BearerAuth
Request Body schema: application/json
required
id
required
string^evt_[a-zA-Z0-9_]+$

Globally unique event identifier. Also sent in the X-Prezent-Event header. Dedupe on this if you receive the same event twice (at-least-once delivery).

type
required
string (WebhookEventType)
Enum: "autogeneration.completed" "autogeneration.failed" "template_conversion.completed" "template_conversion.failed" "webhook.test"

Catalog of event types emitted by Prezent. New types may be added without notice; clients should ignore unknown values.

api_version
required
string

Schema version for the data field. Increments only on breaking changes; legacy versions remain available.

created_at
required
string <date-time>
required
object

Event-specific payload. For autogeneration.* events, contains callback_id, report_id, status, plus outputs (on success) or error_log (on failure). For template_conversion.* events, contains the conversion callback_id, status, and output URLs.

Responses

Request samples

Content type
application/json
{
  • "id": "evt_8c2a1f7e6d3b4a5c9e0f8d7b6a5c4d3e",
  • "type": "autogeneration.completed",
  • "api_version": "1.0",
  • "created_at": "2019-08-24T14:15:22Z",
  • "data": { }
}

Create a webhook subscription

Registers a new HTTPS endpoint to receive signed delivery callbacks for the listed event types. Returns the HMAC secret ONCE — store it securely. Subsequent reads only expose the secret_prefix.

Authorizations:
BearerAuth
Request Body schema: application/json
required
url
required
string <uri>

HTTPS endpoint to receive deliveries. Must use https://, resolve to a public IP, and not use a disallowed port. See the Webhooks guide.

events
Array of strings (WebhookEventType)
Default: ["*"]
Items Enum: "autogeneration.completed" "autogeneration.failed" "template_conversion.completed" "template_conversion.failed" "webhook.test"

Event types to subscribe to. Defaults to ["*"].

description
string or null
status
string (WebhookSubscriptionStatus)
Enum: "active" "disabled"

active subscriptions receive deliveries. disabled subscriptions are skipped at dispatch time — either explicitly set by the customer or set by Prezent's auto-disable rule after 50 consecutive delivery failures. PATCH status: active to re-enable.

Responses

Request samples

Content type
application/json
{
  • "events": [
    ],
  • "description": "Push completions into our deal-room worker.",
  • "status": "active"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

List webhook subscriptions

Returns the subscriptions owned by the calling API key. Excludes soft-deleted rows. Use the standard cursor-pagination parameters — see Developer Guide → Pagination.

Authorizations:
BearerAuth
query Parameters
limit
integer <int32> [ 1 .. 100 ]
Default: 25
cursor
string

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Read a webhook subscription

Returns one subscription. secret_prefix (the first 6 chars of the HMAC secret) is exposed for human disambiguation; the full secret is never returned by a read.

Authorizations:
BearerAuth
path Parameters
id
required
string^whsub_[a-f0-9]{32}$
Example: whsub_3f7a9b1c8d2e4f5a6b7c8d9e0f1a2b3c

The public subscription id returned by POST /api/v1/webhook-subscriptions — shaped whsub_<32 hex chars>.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Update a webhook subscription

Partial update. Any combination of url, events, description, or status may be supplied. Changes to url are re-validated against the SSRF / scheme / port rules. Setting status to "active" re-enables an auto-disabled subscription.

Authorizations:
BearerAuth
path Parameters
id
required
string^whsub_[a-f0-9]{32}$
Example: whsub_3f7a9b1c8d2e4f5a6b7c8d9e0f1a2b3c

The public subscription id returned by POST /api/v1/webhook-subscriptions — shaped whsub_<32 hex chars>.

Request Body schema: application/json
required
url
string <uri>
events
Array of strings (WebhookEventType) non-empty
Items Enum: "autogeneration.completed" "autogeneration.failed" "template_conversion.completed" "template_conversion.failed" "webhook.test"
description
string or null
status
string (WebhookSubscriptionStatus)
Enum: "active" "disabled"

active subscriptions receive deliveries. disabled subscriptions are skipped at dispatch time — either explicitly set by the customer or set by Prezent's auto-disable rule after 50 consecutive delivery failures. PATCH status: active to re-enable.

Responses

Request samples

Content type
application/json
{
  • "events": [
    ],
  • "description": "string",
  • "status": "active"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Delete a webhook subscription

Soft-deletes the subscription. The id is permanently retired — no future deliveries will be attempted, and the row is excluded from list responses.

Authorizations:
BearerAuth
path Parameters
id
required
string^whsub_[a-f0-9]{32}$
Example: whsub_3f7a9b1c8d2e4f5a6b7c8d9e0f1a2b3c

The public subscription id returned by POST /api/v1/webhook-subscriptions — shaped whsub_<32 hex chars>.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Rotate the HMAC secret for a subscription

Generates a new HMAC secret and invalidates the old one immediately. Returns the new secret ONCE — store it before responding to the caller. There is no grace window during which both secrets verify; if you need an overlap, stand up a second subscription on a distinct path, switch over, then delete the old one.

Authorizations:
BearerAuth
path Parameters
id
required
string^whsub_[a-f0-9]{32}$
Example: whsub_3f7a9b1c8d2e4f5a6b7c8d9e0f1a2b3c

The public subscription id returned by POST /api/v1/webhook-subscriptions — shaped whsub_<32 hex chars>.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Send a test delivery to a subscription

Immediately POSTs a synthetic webhook.test event to the subscription's URL (signed with the current secret, 5s timeout, no retries) and returns the response status + body verbatim. Use this to verify the receiver's signature-verification path before real traffic flows.

Authorizations:
BearerAuth
path Parameters
id
required
string^whsub_[a-f0-9]{32}$
Example: whsub_3f7a9b1c8d2e4f5a6b7c8d9e0f1a2b3c

The public subscription id returned by POST /api/v1/webhook-subscriptions — shaped whsub_<32 hex chars>.

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Streaming

Mint a short-lived, authenticated Server-Sent Events URL for a callback_id returned by generate or edit. The stream carries progress events and delivers the download URL on its terminal event. See the Streaming guide.

Create a stream session

Exchange a callback_id from generate or edit for an authenticated Server-Sent Events URL.

Open the returned stream_url with any SSE client — the token is embedded in the URL, so no Authorization header is needed (and cannot be sent by EventSource anyway). Every event on the stream has the same shape, so one parser handles all of them:

event: status
data: {"status":"inprogress","message":"Analyzing the key elements","callback_id":"..."}

status is inprogress on every progress event, and on the terminal event one of success, failed, or cancelled. A successful terminal event adds a download_url. The stream closes after it.

The full event catalog, reconnection semantics, and client code samples are in the Streaming guide.

Short-lived. The URL expires at expires_at (about 5 minutes). Open it promptly; mint a new one by calling this endpoint again — the stream replays from the start of the turn, so nothing is missed.

Download is different. POST /api/v2/autogenerator/download returns its own stream_url and does not come through here.

Authorizations:
BearerAuth
Request Body schema: application/json
required
callback_id
required
string non-empty

The callback_id from generate or edit.

Responses

Request samples

Content type
application/json
{
  • "callback_id": "3f8e7d61-9a2b-4c5e-b013-7d4a6f2c8e91"
}

Response samples

Content type
application/json
{}

Integrations

Connect third-party apps (Google Drive, Notion, …) to the caller's Prezent account so the generator can pull context from them. Connect once, then reference the app in a prompt.

Connect an app

Begin connecting a third-party app (Google Drive, Notion, …) to the caller's Prezent account. Once connected, a generation can pull context from that app by setting settings.enable_mcp_context to true on POST /api/v2/generate.

The response has two shapes, depending on whether the app needs authorization:

App Response
Requires authorization (OAuth etc.) An authorization URL for the user to open
Requires none { "status": "connected" } — already done, nothing to visit

For the first shape, send the user to the URL, let them authorize, then confirm with GET /api/v2/integrations/auth/status.

Which shape applies is a property of the app, not something you choose. Branch on the presence of status: "connected".

The connection is made for the user who owns the API key. There is no parameter to connect an app on another user's behalf.

Authorizations:
BearerAuth
query Parameters
mcp_id
required
string
Example: mcp_id=google-drive

Identifier of the app to connect.

Responses

Response samples

Content type
application/json
Example

Check app connection status

Whether an app is currently connected for the caller. Use this after sending a user through the authorization URL from GET /api/v2/integrations/auth to confirm the connection completed, and before a generation that depends on the app.

Authorizations:
BearerAuth
query Parameters
mcp_id
required
string
Example: mcp_id=google-drive

Identifier of the app to check.

Responses

Response samples

Content type
application/json
{
  • "connected": false
}

Health

Liveness and component health-check endpoints.

Liveness check

Returns a fixed greeting payload. Exists to allow clients to verify connectivity and credentials. Does not consult any downstream services.

Authorizations:
BearerAuth

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Component health check

Reports the status of downstream services. With no category parameter, returns a simple "alive" greeting. With category=autogenerator or category=scim, reports per-component status and returns 503 if any required service is unhealthy.

Authorizations:
BearerAuth
query Parameters
category
string
Enum: "autogenerator" "scim"

Component group to check. Omit for a generic liveness response.

Responses

Response samples

Content type
application/json
{
  • "message": "string",
  • "status": "string",
  • "data": {
    }
}