A template is the brand and structural contract for everything you generate — fonts, colours, table styles, chart presets, master layouts. The API never invents a look; it conforms to whatever yourDocumentation Index
Fetch the complete documentation index at: https://duomi.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
.pptx encodes. Upload it once, analyze it once, and reference it by ID on every generation request.
Step 1: Prepare your template
Build the template in PowerPoint (or any tool that exports.pptx). A few things that help analysis identify slide structure cleanly:
- Tables with the right column count and a populated header row
- Charts with realistic sample categories and series
- Distinct master layouts for distinct page types (table-heavy pages, chart pages, agenda, dividers)
- Title placeholders on slides that should accept titles

Step 2: Upload
Two-step flow: the API returns a signed upload URL; youPUT the .pptx directly to storage; you confirm the upload.
Initiate
Upload the file
PUT the .pptx bytes to upload_url. The bytes go directly to object storage; the API never sees them.
Confirm
Step 3: Run analysis
analysis_id and status: "processing".
Step 4: Inspect the analysis output
Once analysis completes, fetch the results:slideId (assigned during analysis, stable across reads). Generation requests target slides by slideId, not by template — which means a single deck can mix slides from multiple templates by referencing each one’s slideId. slideIndex (0-based) and slideNumber (1-based, matches PowerPoint’s slide number) are also available if you need ordering.
Each entry in shapes has a common set of fields, plus type-specific extras keyed off shape_type. The rest of this section walks through each shape type with a real excerpt from the parser running against slide 1 of the demo template above.
Common fields (every shape)
| Field | Meaning |
|---|---|
shape_type | AutoShape, Table, Chart, OleObjectFrame, etc. |
name | The shape’s name as set in PowerPoint |
is_placeholder | true if the shape is a master-layout placeholder |
placeholder_type | TITLE, BODY, SLIDE_NUMBER, etc. (or null) |
placeholder_index | Index that ties the shape to its master-layout slot (or null) |
text | Current text on the shape (often "" for an unfilled template) |
x, y, width, height | Position and size in points |
Placeholder shapes (TITLE, BODY, SLIDE_NUMBER)
Addstext_format, describing the font the template uses for that placeholder.
text_format block tells you what the title (or body, etc.) will look like once populated — the same font and colour the template’s master layout encodes.
Table shapes
Addstable_rows / table_columns, plus table_info (dimensions, style preset, six PowerPoint table-style flags) and table_styling (per-cell formatting for the header and body rows).
diagonal_down and diagonal_up (typically LineStyle.NOT_DEFINED for tables that don’t use diagonals).
table_styling arrays:
| Array | What it contains |
|---|---|
header_row_format | One entry per column of the header row: fill type, fill colour, transparency, and four borders + two diagonals |
header_text_format | One entry per column of the header row: font name, size, colour, bold/italic, alignment |
body_row_format | Same shape as header_row_format, for body rows; empty when the template has no populated body row |
body_text_format | Same shape as header_text_format, for body rows |
Table-style flags
The six boolean flags insidetable_info mirror PowerPoint’s “Table Tools → Design → Table Style Options” checkboxes. They control whether the applied style preset (e.g. MEDIUM_STYLE_2_ACCENT_1) emphasizes certain rows or columns:
| Flag | PowerPoint checkbox | Effect when true |
|---|---|---|
has_first_row | Header Row | First row gets the style’s header formatting |
has_last_row | Total Row | Last row gets the style’s “totals” formatting |
has_first_col | First Column | First column gets emphasized formatting |
has_last_col | Last Column | Last column gets emphasized formatting |
horizontal_banding | Banded Rows | Alternating row colours from the style |
vertical_banding | Banded Columns | Alternating column colours from the style |
header_row_format / header_text_format. In the example above all six are false because the header band is styled directly on each cell, not via the style preset.
Chart shapes
Charts return only the common shape fields — position, name,shape_type: "Chart". Example from a chart slide elsewhere in the same template:
.pptx itself; generation requests reference the chart by its slide’s identifier and supply the data to populate it. See the chart guides for how to fill or refresh a chart.
Text-marker shapes (AutoShape placeholders)
Templates also use a second placeholder pattern: regularAutoShape shapes whose text field holds a recognized marker string. The API identifies these by their text value and swaps in the real content from the request payload. Common markers in the demo template: LHS_header, RHS_header, Bullet_placeholder, Text_placeholder.
These have is_placeholder: false and placeholder_type: null (PowerPoint doesn’t classify them as native placeholders) but functionally they are content slots.
| Shape | Identifier the API uses |
|---|---|
| Native PowerPoint placeholder | placeholder_type (TITLE, BODY, etc.) |
| Text-marker AutoShape | text value (LHS_header, etc.) |
| Decorative AutoShape | None — has text: "" and is ignored at generation time |
Authoring-tool artifacts
OleObjectFrame shapes are embedded objects from authoring tools, most commonly think-cell. They appear on every slide in templates built with such tools and don’t carry generatable content.
Step 5: Use it for generation
Generation requests reference slides byslideId. Because IDs are per-slide, a single deck can pull slides from multiple templates — useful for assembling pitch books, IC memos, or LP updates that combine standard cover/agenda slides from one template with content slides from another.
Maintenance
Template lifecycle
| Action | Endpoint |
|---|---|
| List templates | GET /api/v1/templates |
| Get template details and the latest analysis summary | GET /api/v1/templates/{id} |
Download the original .pptx | GET /api/v1/templates/{id}/download |
| Update template metadata (name, tags, description) | PATCH /api/v1/templates/{id} |
| Soft-delete a template | DELETE /api/v1/templates/{id} |
| Restore a soft-deleted template | POST /api/v1/templates/{id}/restore |
Analysis
| Action | Endpoint |
|---|---|
| Re-run analysis (e.g. after parser updates, or to refresh with new options) | POST /api/v1/templates/{id}/analysis |
| Check analysis status (lightweight, no full payload) | GET /api/v1/templates/{id}/analysis/status |
| Get the full analysis results | GET /api/v1/templates/{id}/analysis |
| Cancel a running analysis | DELETE /api/v1/templates/{id}/analysis/{analysis_id} |
Slides
| Action | Endpoint |
|---|---|
Get a specific slide’s analysis (by slide_number) | GET /api/v1/templates/{id}/slides/{slide_number} |
| Render a slide as a PNG preview | GET /api/v1/templates/{id}/slides/{slide_number}/preview |
Updating templates
There is no endpoint to overwrite a template’s.pptx bytes. If you change the underlying file, upload it as a new template (new template_id) — generations reference templates by ID and the analysis is tied to the file that was uploaded. The PATCH endpoint only updates metadata (name, tags, description), not the file itself.