Skip to main content
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 your .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
The example used throughout this page is slide 1 of a small demo template — a single six-column table with a coloured header band:
Empty template slide with a teal/blue six-column header band.

Demo template, slide 1 — six-column table with a header band

Step 2: Upload

Two-step flow: the API returns a signed upload URL; you PUT 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

The service verifies the object exists and marks the template as uploaded.

Step 3: Run analysis

Analysis runs asynchronously; the response returns immediately with an analysis_id and status: "processing".

Step 4: Inspect the analysis output

Once analysis completes, fetch the results:
The response wraps the parser output. The top-level structure:
Each slide gets its own 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)

Placeholder shapes (TITLE, BODY, SLIDE_NUMBER)

Adds text_format, describing the font the template uses for that placeholder.
The 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

Adds table_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).
The example shows one entry in each per-cell array; the real response has one entry per column (six entries, mostly identical). Each border block also includes diagonal_down and diagonal_up (typically LineStyle.NOT_DEFINED for tables that don’t use diagonals). table_styling arrays:

Table-style flags

The six boolean flags inside table_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: These flags are independent of the cell-level formatting in 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:
The chart’s internal structure (categories, series, preset) lives inside the .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: regular AutoShape 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.
The distinction:

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.
The parser returns these as-is for completeness. Safe to ignore.

Step 5: Use it for generation

Generation requests reference slides by slideId. 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.
See Slide input for how to map your data onto each slide’s analysis structure, and Examples for copy-paste payloads against common slide shapes.

Maintenance

Template lifecycle

Analysis

Slides

The slide preview endpoint is useful when an agent or app wants to show the user a thumbnail of the template slide they’re about to populate.

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.
Looking for the endpoint that picks the best-fit slide for a given input shape? That’s POST /api/v1/templates/match, documented under Slide input since it’s part of composing a generation request rather than maintaining a template.