Presentation API
Generate professional presentations from a topic, raw text, or a source document (PDF / PPTX / DOCX / TXT) — programmatically, outside PowerPoint. Output is a downloadable PPTX or PDF.
Base URL
https://api.appsdowonders.com
Availability
Pro and Team plans — see API Access for getting a key
Style
Asynchronous: submit a job, poll for the result
The API inherits the add-in's generation pipeline — the same templates, image sources and styles, and quality.
Authentication
Every request must carry your API key (starts with ppsk_), one of two ways:
Bearer auth (recommended)
Authorization: Bearer ppsk_…
API-key header
x-api-key: ppsk_…
For platforms that can't set a Bearer header
Keys are issued in the add-in (Settings → API key, Pro/Team) — see API Access. One active key per account: to rotate, revoke the old key first, then create a new one.
Asynchronous flow
Every POST endpoint queues a generation job and returns 202 Accepted with a job descriptor. Poll GET /v1/presentations/{id} (recommended cadence: every 2–3 seconds) until status becomes completed — download URL in result.url — or failed, with the reason in error.
Typical generation time is 30–90 seconds; the hard cap is 5 minutes per job, after which jobs are marked
failedwith codeTIMEOUT.Download links are permanent.
Jobs are owner-scoped — visible only to the API key that created them.
Job
statusis one ofqueued,processing,completed,failed.
Rate limits
Two separate buckets per API key:
public-write
3 requests/min
All POST /v1/presentations/* endpoints
public-read
1200 requests/min
GET /v1/presentations/{id}
Every response includes x-ratelimit-limit, x-ratelimit-remaining, and x-ratelimit-reset (milliseconds until the window resets). Exceeding a bucket returns 429 RATE_LIMIT_EXCEEDED. The read limit comfortably supports the 2–3 s polling cadence, even across many concurrent jobs.
Shared parameters
These fields are accepted by all creation endpoints (see each endpoint for which apply):
numSlides
-1 (auto) or 1–50
-1
0 is invalid. Auto lets the AI fit the count to the content — see Number of Slides
template
Template id
Tokyo
Case-sensitive, no spaces: the template name with spaces removed (New York → NewYork). All 51 built-in templates are available — see Templates for the gallery and the full id list. Custom uploaded templates are not available — jobs referencing them fail with UNSUPPORTED_TEMPLATE
format
pptx | pdf
pptx
Output file format
imageSource
unsplash | pexels | scrapingdog | ai | flux
unsplash
unsplash/pexels are stock, scrapingdog is web search, ai/flux are AI-generated — see Images in Your Presentation
imageStyle
auto | photorealistic | illustration | neon | abstract | black-and-white | 3d | linear
—
Only when imageSource is ai or flux — the same styles as the add-in's AI image styles
POST /v1/presentations/topic
Create a presentation from a topic — you have a topic or idea, the AI writes the content.
Body (application/json) — shared parameters above, plus:
topic
string
Yes
—
Subject of the presentation, ≤ 450 chars
language
string
No
auto-detect
Output language
content
short | detailed | bulletPoints
No
detailed
Text verbosity
presentationType
General | Educational Project | Business Pitch | Reports and Insights
No
—
targetAudience
string
No
—
Free text, ≤ 200 chars
toneAndStyle
string
No
—
Free text, ≤ 200 chars
Examples:
POST /v1/presentations/text
Create a presentation from raw text. The output language always matches the source language.
Body (application/json) — shared parameters above, plus:
text
string
Yes
—
Source text, max 665,000 tokens (≈ 500,000 words)
contentModificator
preserve | expand | condense
No
expand
How the source content is treated: keep as-is, add detail, or tighten into key takeaways
textDensity
minimal | concise | detailed
No
concise
Density of text on each slide
verbosity
short | detailed | bulletPoints
No
—
Text verbosity
If the text exceeds the token limit, the API responds 400 BAD_REQUEST with tokensCount and tokenLimit in the error body.
Example — text to a 10-slide PDF:
POST /v1/presentations/file
Create a presentation from a document. Upload a PDF, PPTX, DOCX, or TXT (max 300 MB). File types are validated by magic-byte sniffing — extension spoofing is rejected. The output language always matches the source language.
Body (multipart/form-data) — every non-file field arrives as a string (numSlides as "15"); the API coerces them. Shared parameters above, plus:
file
binary
Yes
PDF (application/pdf), PPTX, DOCX, or TXT (text/plain), max 300 MB
contentModificator
string
No
preserve | expand | condense (default expand)
textDensity
string
No
minimal | concise | detailed (default concise)
verbosity
string
No
short | detailed | bulletPoints
Example:
GET /v1/presentations/{id}
Get job status and result. Once status is completed, fetch the permanent download URL from result.url.
id
path
UUID
Job id returned by a POST /v1/presentations/* endpoint
Job object:
id
UUID
always
status
queued | processing | completed | failed
always
createdAt
ISO-8601
always
completedAt
ISO-8601
when status is completed or failed
result.url
URL
when completed — permanent download URL for the PPTX/PDF
error.code, error.message
see below
when failed
Response examples:
Returns 404 NOT_FOUND for unknown ids (or jobs belonging to another key).
Job failure codes (error.code on a failed job):
TIMEOUT
Generation exceeded the soft timeout
WORKER_TIMEOUT
Worker aborted the job (default 5 min)
UPSTREAM_FAILURE
Underlying AI/build pipeline failed — retry
UNSUPPORTED_TEMPLATE
Custom (user-uploaded) templates are not supported via the public API
INPUT_TOO_LARGE
Source content exceeded internal processing limits
GET /v1/me
Lightweight key-validation endpoint. Returns the account associated with the API key — useful as an authentication test (e.g., for Zapier or other integration platforms) and for checking remaining credits.
Response 200:
credits.remaining is null for internal/unlimited keys. Returns 401 UNAUTHORIZED if the key is missing or invalid.
HTTP errors
All 4xx/5xx responses use a uniform envelope:
HTTP status
error.code
400
BAD_REQUEST — validation failed (for oversized text, includes tokensCount and tokenLimit)
401
UNAUTHORIZED — missing or invalid API key
403
FORBIDDEN — the account's plan doesn't include API access
404
NOT_FOUND — unknown job id (or a job owned by another key)
422
UNPROCESSABLE_ENTITY — input can't be processed
429
RATE_LIMIT_EXCEEDED — see Rate limits
500
INTERNAL_SERVER_ERROR
Last updated