REST API
API: Presentations
Presentations: decks and slides bound to governed data, their checks, publishing and versions, presenting, freezing, records and exports. All endpoints require authentication unless noted. 128 endpoints, 6 of them app only: an API key gets 403 there.
GET /api/presentations
Section titled “GET /api/presentations”List the presentations the caller can see by the home’s tab (all, mine, shared with me, assigned to me, favorites, archived), 20, 50 or 100 a page
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
tab |
"all" | "mine" | "shared" | "assigned" | "favorites" | "archived" |
no | |
q |
string | no | |
limit |
20 | 50 | 100 |
no | |
offset |
integer | no | |
withFirstSlide |
boolean | no | Add each deck’s first slide, for the home’s thumbnails |
Responses: 200 · 400 · 401 · 404
POST /api/presentations
Section titled “POST /api/presentations”Create a presentation: blank (in the Meridian style, its one slide on the blank layout), or from a template (a library template in any of the twelve styles and for a period), a dashboard (pages split at row boundaries, or one slide per visual) or a story
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | no | |
from |
object | no |
Responses: 201 · 400 · 401 · 403 · 404 · 409
GET /api/presentations/{id}
Section titled “GET /api/presentations/{id}”Read a presentation: its slides and elements (bindings and captured values, never served values)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
PATCH /api/presentations/{id}
Section titled “PATCH /api/presentations/{id}”Change a presentation’s title, theme, master, page size, locale, time zone, sections or present options
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
baseEditSeq |
integer | no | The deck’s edit sequence the change was made against: required with sections, presentOptions, themeId or masterId; optional for title, pageSize, locale and zone. One that is sent and stale is refused (409) with the deck as it is now (details.current) |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | no | |
themeId |
string | null | no | |
masterId |
string | null | no | |
pageSize |
string | no | The deck’s page size, one of 16:9, 4:3, a4, a4portrait, 9:16. Another size than the deck’s resizes the deck itself, as POST /:id/resize in place: its slides laid out again, its draft kept as a version first, never while someone else edits a slide (423); the size it is changes nothing |
locale |
string | no | |
zone |
string | null | no | |
presentOptions |
object | no | DS4a: the deck’s present options, remembered for the next time it is presented (needs baseEditSeq): DS4a: autoAdvance (slides advance by themselves), advanceSeconds (5 to 120 whole seconds, 10 unless set), loop (after the last slide comes the first) and transition (none, fade or slide; none unless set); PRES-SPEED: refresh, how often the deck’s prepared figures are read again: {every, at}, every being every hour and before meetings (hour-meetings), every 15 minutes (15m), every hour (hour), every day at a time (day), only before meetings (meetings) or only when refreshed (manual), at a time such as 07:00 for day (hour-meetings unless set); MOTION: slides, by slide id, a slide’s own {transition, transitionMs (200 to 2000), advanceSeconds} over the deck’s (200 at most), and animations, by element id, how an element moves: {effect, delayMs, durationMs, from, exit, exitTo, emphasis, intensity}, effect being none, fade, rise, pan, delayMs 0 to 10000, durationMs 200 to 3000 (600 unless set), from and exitTo left, right, above, below, exit fade, rise, pan, emphasis pulse and intensity subtle, normal, strong (normal unless set) (1000 at most); each map is sent whole and replaces the one kept, null takes it away. A part left out keeps what it was. |
sections |
array of object | no | PRES-15: every section in order with the slides it holds; slides named nowhere are in none (needs baseEditSeq) |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423
DELETE /api/presentations/{id}
Section titled “DELETE /api/presentations/{id}”Delete a presentation (its owner only; it is soft-deleted and kept with its records)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 204 — No content · 401 · 403 · 404
GET /api/presentations/{id}/access
Section titled “GET /api/presentations/{id}/access”Who a presentation is shared with and as what, its owner and its publication audience
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
PUT /api/presentations/{id}/access
Section titled “PUT /api/presentations/{id}/access”Share a presentation, change or remove roles, and set its publication audience (its owner only; all or nothing)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
grants |
array of object | no | Each names one person (userId or email) or one existing grant (accessId), with the role they now have; none removes it |
audience |
"workspace" | "invited" |
no | Who reads the published presentation by their workspace role: workspace (everyone whose role can view Presentations) or invited (only the people it is shared with) |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/{id}/access/candidates
Section titled “GET /api/presentations/{id}/access/candidates”Search the workspace’s members to share a presentation with or to mention, with the role each has on it (the first 10 by name)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
q |
string | no |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/add
Section titled “POST /api/presentations/{id}/add”Add to presentation: a dashboard card, an Explore result or a chat answer’s saved query, bound, on a new slide (contributors and up; only what the caller can read)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
source |
object | yes | |
afterSlideId |
string | null | no |
Responses: 201 · 400 · 401 · 403 · 404 · 409
POST /api/presentations/{id}/archive
Section titled “POST /api/presentations/{id}/archive”Archive a presentation, or restore it (its editors and owner)
An archived presentation keeps its versions, links, embeds, schedules and sharing. While it is archived its links and embeds do not open, it cannot be presented or frozen, its schedules skip their sends, and every change to it is refused (409 PRESENTATION_ARCHIVED). Restored, it is published again when it has a published version, and a draft otherwise; its links, embeds and schedules carry on as they were. Archiving an archived presentation, or restoring one that is not archived, changes nothing.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
archived |
boolean | yes | true archives the presentation; false restores it |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/assets
Section titled “POST /api/presentations/{id}/assets”Upload a picture (PNG, JPEG or WebP, 20 MB at most) into the presentation’s private store; contributors and up
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 201 · 400 · 401 · 403 · 404 · 409 · 413 · 503
GET /api/presentations/{id}/assets/{assetId}
Section titled “GET /api/presentations/{id}/assets/{assetId}”Read a picture of the presentation: its editors any of its pictures, a reader of the published version the pictures it shows
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
assetId |
string | yes |
Responses: 200 — The picture’s bytes (image/png, image/jpeg or image/webp) · 404
GET /api/presentations/{id}/brand
Section titled “GET /api/presentations/{id}/brand”The company’s brand locks a presentation keeps to, the brand it wears, and what is off the brand in its working slides (contributors and up)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/brand
Section titled “POST /api/presentations/{id}/brand”Apply the brand, changing only what the company’s locks cover: the presentation’s style in the brand’s colours (colour lock), its text styles in the brand’s fonts and each text box’s own font off the brand taken away (font lock), each written colour off the brand the brand’s nearest (colour lock), and the brand’s logo (logo lock), as one change (editors)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
baseEditSeq |
integer | yes | The deck’s edit sequence it was asked against (409 when it moved on) |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423
POST /api/presentations/{id}/brand/undo
Section titled “POST /api/presentations/{id}/brand/undo”Undo Apply the brand: the draft kept before it restored, its look with it, only while nothing in the deck changed after it (no slide saved, alone or together, added or removed, no setting, no other version kept); refused otherwise with 409 BRAND_UNDO_GONE (editors)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
version |
integer | yes | The version Apply the brand kept the draft as (its kept_as) |
baseEditSeq |
integer | yes | The deck’s edit sequence after Apply the brand (409 when it moved on) |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423
POST /api/presentations/{id}/checks
Section titled “POST /api/presentations/{id}/checks”Run the checks on a presentation’s saved draft, with every figure computed for the caller, for the publish dialog
The same checks as the editor’s Checks tab (contracts deckFindings) on the saved draft, its figures read for the caller under their own access, judged when they were read. Red findings block publishing, links, exports and schedules (may_leave); a Review finding kept with a note is marked kept; what C8 and C18 could not read to compare with is said in unchecked, never a refusal. 409 PRESENTATION_CHANGED when the draft changed while it was checked; 409 PRESENTATION_CHECKS_UNREADABLE when the checks cannot read it, with the reason. Contributors and up.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
purpose |
"publish" | "link" | "export" | "schedule" |
no | The way out the checks are for (publish by default) |
Responses: 200 · 400 · 401 · 403 · 404 · 409
GET /api/presentations/{id}/checks/kept
Section titled “GET /api/presentations/{id}/checks/kept”The Review findings of a presentation’s checks kept with a note, by key, for the editor’s checks (no figure is read); contributors and up
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
PUT /api/presentations/{id}/checks/kept
Section titled “PUT /api/presentations/{id}/checks/kept”Keep a Review finding of a presentation’s checks with a note (a red finding is never kept); contributors and up
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
key |
string | yes | The finding’s key, as the checks answered it |
note |
string | yes | Why it stays, up to 1000 characters |
Responses: 200 · 400 · 401 · 403 · 404
DELETE /api/presentations/{id}/checks/kept
Section titled “DELETE /api/presentations/{id}/checks/kept”Stop keeping a Review finding: it is to review again; contributors and up
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
key |
string | yes |
Responses: 204 — No content · 401 · 403 · 404
POST /api/presentations/{id}/checks/tiles
Section titled “POST /api/presentations/{id}/checks/tiles”Measure KPI tiles as the slide renderer draws them, for the editor’s Checks tab
Each tile’s fit (contracts DeckTextFit) as the PNG and PDF renderer draws it on this deck’s look, page size and locale, with the figure given: overflowing only where its figure can’t be drawn whole (L1, L2). The publish check reads the same function, so the editor’s Checks tab and the publish check agree. Nothing is read or stored. Contributors and up.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
tiles |
array of object | yes |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/{id}/comments
Section titled “GET /api/presentations/{id}/comments”The comment threads on a presentation that the caller may read, with where each one is now
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
status |
"open" | "resolved" | "all" |
no | |
elementId |
string | no | Only the threads on this element |
slideId |
string | no | Only the threads on this slide now (on it, or on an element that is on it) |
limit |
20 | 50 | 100 |
no | |
offset |
integer | no | |
around |
string | no | Answer the page that holds this thread (its first comment’s id) instead of offset, when it is in the list asked for; the answer’s offset says which page |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/comments
Section titled “POST /api/presentations/{id}/comments”Comment on a presentation’s element, slide or the whole presentation, or reply to a thread (commenters and up)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
content |
string | yes | |
parentId |
string | no | Reply to this thread (its first comment); a reply stays where its thread is |
anchor |
object | no | Where a new thread is: an element (and the slide it is on), or a slide; without it, the whole presentation |
mentions |
array of string | no | People to tell; only those who may read the thread are told |
Responses: 201 · 400 · 401 · 403 · 404 · 409
PUT /api/presentations/{id}/comments/{commentId}
Section titled “PUT /api/presentations/{id}/comments/{commentId}”Edit your own comment on a presentation
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
commentId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
content |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
PATCH /api/presentations/{id}/comments/{commentId}
Section titled “PATCH /api/presentations/{id}/comments/{commentId}”Resolve or reopen a comment thread on a presentation (its author, or editors and up)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
commentId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
resolved |
boolean | yes |
Responses: 200 · 400 · 401 · 403 · 404
DELETE /api/presentations/{id}/comments/{commentId}
Section titled “DELETE /api/presentations/{id}/comments/{commentId}”Delete your own comment on a presentation (a thread’s first comment takes its replies with it)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
commentId |
string | yes |
Responses: 204 — No content · 401 · 403 · 404
GET /api/presentations/{id}/copy
Section titled “GET /api/presentations/{id}/copy”The deck’s origin when it is a copy for a next period: the deck it came from, its series, its period and the figures entered by hand it asks for again (contributors and up)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/data
Section titled “POST /api/presentations/{id}/data”The figures of a deck’s elements and slides’ notes, computed for the caller under their own access
Answers contracts DeckDataResponse. Every binding is read from the deck the server holds at the named revision. Figures by key: a text box’s and the notes’ live numbers by token id, a KPI tile’s figure under value, a chart’s, a table’s and a dashboard visual’s rows under rows; asked for, a chart’s rows over its longer range under longer, and a figure’s earlier changes under its key with __base, __y1 and __y2. Each figure is the caller’s own: metric and model-measure figures run under their row security and masking and say where it narrowed them (accessScope); a saved query’s figure is withheld from a caller row security restricts on its source; a figure the caller may not see is unavailable with its reason and no value (removed, access-lost, no-access, withheld, failed). Each says when it was computed, how complete its data is (dataThrough, provisional, completeTo), the period the api read, its source and version, its filters and definition hash. An element the deck does not hold at that revision is removed. 403: a draft asked for by a reader, or notes by a reader below contributor. 409: another published version, or a deck whose locale figures are not written in yet.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404 · 409
GET /api/presentations/{id}/drift
Section titled “GET /api/presentations/{id}/drift”What changed since a presentation was shown: each figure then and now, classed by what the platform knows, with authors’ notes
Compares a record of what was shown (a publish, an export or a presentation; by default the last one whose values you may read) or the values a frozen deck was frozen with, against every figure read live for you now. Each live number and KPI figure is classed by the checks engine (N5 and R2) on unrounded values: late data, correction, definition change, moved on, or reason not recorded; the same value both times is no change; a figure in one side only is new or removed; one you are not served now is not available; charts, tables and dashboard visuals are listed as not compared. A record’s values are read only by the presentation’s owner and editors and the presenter of that meeting, with the access that read them: anyone else is refused with 403 PRESENTATION_RECORD_WITHHELD and the reason (details.reason role, access or frozen). against is null when nothing has been presented, published or exported yet.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
against |
string | no | A record’s id, or frozen; by default a frozen deck’s frozen values, else the last record you may read |
revision |
string | no | Where live values are read: draft, or a published version; by default the draft for its makers and the published version for its readers |
figures |
boolean | no | False leaves what was shown (against.figures) out: the rows are the same |
Responses: 200 · 400 · 401 · 403 · 404 · 409
PUT /api/presentations/{id}/drift/notes
Section titled “PUT /api/presentations/{id}/drift/notes”Write an author’s note on one figure’s change since it was shown (or change it); editors and owners
One note per figure and comparison (a record you may read, or frozen:<version>). Shown beside the platform’s own reason as “Author’s note: …”, never as it: a note never changes how a change is classed. Only a figure of that comparison takes a note (404 otherwise). Audited.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
against |
string | yes | A record’s id, or frozen:<version> |
place |
"element" | "notes" |
yes | An element’s figure, or a slide’s notes’ |
id |
string | yes | The element’s id, or the slide’s for its notes |
key |
string | yes | A live number’s token id, or value for a KPI tile |
note |
string | yes | Plain text, up to 500 characters |
Responses: 200 · 400 · 401 · 403 · 404
DELETE /api/presentations/{id}/drift/notes
Section titled “DELETE /api/presentations/{id}/drift/notes”Remove an author’s note on a figure’s change; editors and owners who may read what it is against
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
against |
string | yes | A record’s id, or frozen:<version> |
place |
"element" | "notes" |
yes | An element’s figure, or a slide’s notes’ |
id |
string | yes | The element’s id, or the slide’s for its notes |
key |
string | yes | A live number’s token id, or value for a KPI tile |
Responses: 204 — No content · 401 · 403 · 404
POST /api/presentations/{id}/duplicate
Section titled “POST /api/presentations/{id}/duplicate”Make a copy: a new draft of the deck as it is now, its slides, speaker notes, pictures, look, sections and motion, its grants and owner its origin’s; no versions, comments, links or schedules (editors with the right to create decks)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | no | The copy’s title; left out, “Copy of” the deck’s |
Responses: 201 · 400 · 401 · 403 · 404 · 409 · 503
GET /api/presentations/{id}/explore
Section titled “GET /api/presentations/{id}/explore”The filters presenters may change while presenting (Explore this slide); for editors, the fields to offer
Anyone who may present the deck reads its declared filters, a setting of the deck read when a session explores. Its editors and owner are also given the fields its figures read (never a labelled, hidden or measure field), each with how many figures read it: the fields of the models its metric, model-measure and field figures read, and the output columns its saved-query figures return (never the column a figure adds up), read by a statement that reads no row, for an editor who may read saved queries (the SQL editor’s view); for one who may not, none of a query’s columns, and the query is never asked.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
PUT /api/presentations/{id}/explore
Section titled “PUT /api/presentations/{id}/explore”Replace the filters presenters may change while presenting (editors and owners)
Up to 12 filters, each a name, a label, the field it filters (a model’s field, or a column a saved query’s figure returns), its type (text, number, date or boolean), one value or several, and the values a presenter may choose (100 at most), checked with the rules a report’s and a story’s parameters keep. 400 PRESENTATION_EXPLORE_FIELD, in a sentence naming the filter: a field no figure on the deck reads (a model’s field, or a column a saved query’s figure returns, for an editor who may read saved queries); a labelled, hidden or measure field; one every metric that reads it filters in its own definition; a type the field doesn’t hold; two filters on one field. Unchanged filters leave the deck’s edit sequence as it was. 409 EDIT_CONFLICT: the deck changed since baseEditSeq.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
filters |
array of — | yes | Up to 12 filters, each {name, label, field, type, mode, allowedValues}; an empty list offers none |
baseEditSeq |
integer | yes | The deck’s edit sequence the change is made on |
Responses: 200 · 400 · 401 · 403 · 404 · 409
GET /api/presentations/{id}/exports
Section titled “GET /api/presentations/{id}/exports”Your exports of a presentation
Your own exports of this presentation, newest first, 20, 50 or 100 a page, with how many there are. Needs edit access.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit |
20 | 50 | 100 |
no | |
offset |
integer | no |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/exports
Section titled “POST /api/presentations/{id}/exports”Export a presentation as a PDF or a PowerPoint file, or one slide as a PNG
Queues a background export (202): a PDF of the presentation’s slides (layout slides, notes for slides with their speaker notes, or handouts with perPage slides a page), one slide as a PNG (slideId), or its shown slides as a PowerPoint file (format pptx: no layout, perPage or slideId; native, editable charts for bar, column, line, area, pie and donut charts and their stacked kinds, pictures with their values in the notes for the rest; each slide’s notes with its sources and the record’s id), of the saved draft (revision {draft: true}, the default) or a published version ({version: n}). The figures are computed once, as the caller, under their own access; an open red finding of the checks refuses the export (status refused, with its findings); every page carries its figures’ source notes and the stamp of whose access they show, and every file says it is a snapshot (how current its figures are, when and by whom exported, and the live presentation’s address). Needs edit access to the presentation. 503 where this server has no private file store; 409 at the export quota.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
format |
"pdf" | "png" | "pptx" |
yes | |
layout |
"slides" | "notes" | "handouts" |
no | |
perPage |
1 | 2 | 3 | 4 | 6 |
no | |
slideId |
string | no | |
revision |
object | no | {draft: true} (the default) or {version: n} |
Responses: 202 · 400 · 401 · 403 · 404 · 409 · 503
GET /api/presentations/{id}/exports/{runId}
Section titled “GET /api/presentations/{id}/exports/{runId}”An export’s progress
One of your exports: queued, running, succeeded, refused (with its red findings), failed, cancelled, expired or revoked.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
runId |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/exports/{runId}/cancel
Section titled “POST /api/presentations/{id}/exports/{runId}/cancel”Cancel an export, or remove its file
Stops one of your queued or running exports, or revokes a finished one so its file is deleted.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
runId |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/{id}/exports/{runId}/download
Section titled “GET /api/presentations/{id}/exports/{runId}/download”Download a finished export
The file of one of your finished exports, while it has not expired (24 hours), after your access is checked again: your membership and the access each figure was read with. An export made with access you no longer have is revoked (403); export again under your current access. 503 when that access could not be checked just now (the export is kept: try again). 410 once it has expired or its file is gone.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
runId |
string | yes |
Responses: 200 — The PDF, PNG or PowerPoint file · 400 · 401 · 403 · 404 · 409 · 410 · 503
PUT /api/presentations/{id}/favorite
Section titled “PUT /api/presentations/{id}/favorite”Star a presentation for the caller’s Favorites tab
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
DELETE /api/presentations/{id}/favorite
Section titled “DELETE /api/presentations/{id}/favorite”Unstar a presentation
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
PUT /api/presentations/{id}/follow
Section titled “PUT /api/presentations/{id}/follow”Follow a presentation to hear of its comments, or stop (anyone who can open it)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
following |
boolean | yes |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/{id}/freeze
Section titled “GET /api/presentations/{id}/freeze”Whether a presentation is frozen: when, for which meeting, which version and who froze it; never a value
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/freeze
Section titled “POST /api/presentations/{id}/freeze”Freeze for a meeting: keep the published version’s values as they are now, for readers whose access is the caller’s (editors and owners)
Reads every figure of the published version as the caller and keeps each, exactly as served, with the target it read and the access it was read with; the deck is then frozen at that version, with the time and the meeting. Readers whose access signature over those figures is the caller’s are served the frozen values; anyone else live values, told so (liveInstead). 403 PRESENTATION_FREEZE_OFF while the workspace’s policy is off; 409 PRESENTATION_NOT_PUBLISHED, PRESENTATION_ARCHIVED, PRESENTATION_ALREADY_FROZEN; 409 PRESENTATION_FREEZE_INCOMPLETE naming each figure that has no value, only its last value, or was cut short (details.figures), unless keepLive; 409 PRESENTATION_CHANGED when it was published again meanwhile.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
meeting |
string | null | no | The meeting it is frozen for, up to 200 characters once tidied |
keepLive |
boolean | no | Freeze anyway: the figures that can’t be kept as they are stay live, and say so |
Responses: 200 · 400 · 401 · 403 · 404 · 409
DELETE /api/presentations/{id}/freeze
Section titled “DELETE /api/presentations/{id}/freeze”Go back to live: the frozen values are deleted and every reader is served live values; records stay (editors and owners)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/import
Section titled “POST /api/presentations/{id}/import”Import a PowerPoint file (100 MB at most) into a presentation: a .pptx’s slides after the slide given (contributors and up), the deck keeping its look; a .potx’s theme and master (editors)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
after |
string | no | The slide the file’s slides follow; left out, they come last |
importId |
string | no | An id the client gives the import, to cancel it by while it reads the file |
Responses: 201 · 400 · 401 · 403 · 404 · 409 · 413 · 423 · 503
GET /api/presentations/{id}/links
Section titled “GET /api/presentations/{id}/links”A presentation’s links that still open: public, password and row-security (its owner)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403
POST /api/presentations/{id}/links
Section titled “POST /api/presentations/{id}/links”Make a public, password or row-security link to a published presentation (its owner; on every plan)
The link shows the published version only, in present mode, without speaker notes. Its guests read every figure with the link’s access, never its maker’s: figures from data with row security are not shown, a row-security link shows only its scope’s rows, and it carries the stamp “Prepared with <maker>’s access”. The token comes back once.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
type |
"public" | "password" | "rls" |
yes | |
password |
string | no | A password link’s password: 8 characters at least |
scope |
object | no | A row-security link’s rows: up to 10 field names, each with a value or a list of values ({“Region”: “West”}). A figure whose data has no such field shows nothing through the link, never every row. |
expiresAt |
string | no | When the link stops opening (in the future); none: until it is revoked |
Responses: 201 · 400 · 401 · 403 · 409
DELETE /api/presentations/{id}/links/{linkId}
Section titled “DELETE /api/presentations/{id}/links/{linkId}”Revoke one of a presentation’s links: it opens no more (its owner)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
linkId |
string | yes |
Responses: 204 — No content · 401 · 403 · 404
POST /api/presentations/{id}/links/{linkId}/unlock
Section titled “POST /api/presentations/{id}/links/{linkId}/unlock”Unlock a password link its wrong passwords locked: it takes its password again (its owner)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
linkId |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/{id}/look
Section titled “GET /api/presentations/{id}/look”A presentation’s look: its theme, master and layouts, for the revision the caller reads (or one version, for contributors and up)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
version |
integer | no |
Responses: 200 · 400 · 401 · 403 · 404
PUT /api/presentations/{id}/master
Section titled “PUT /api/presentations/{id}/master”Change a presentation’s master: every slide follows it, as one change; refused with the reasons, or while someone else edits a slide that would move
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
master |
object | no | The master for the deck’s theme: frames, logo, footer, slide numbers, text styles (a part left out is the theme’s own) |
masterId |
string | null | no | Go back to one of the deck’s masters for its theme (an undo), or null for the theme’s own |
baseEditSeq |
integer | yes |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423
GET /api/presentations/{id}/meeting
Section titled “GET /api/presentations/{id}/meeting”A presentation’s next meeting (none once it has started): its name, its time in the presentation’s zone, and when its morning notice goes; contributors and up
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
PUT /api/presentations/{id}/meeting
Section titled “PUT /api/presentations/{id}/meeting”Set a presentation’s next meeting, or clear it; editors and owners
On the meeting’s morning (07:00 in the presentation’s zone, or when it is set if that is later) its owner is told once, in the app and by email as their notification settings say, what changed since the last record they may read and what went stale, read with their own access: counts and slide numbers, never a value. 400 for a time that has passed, one the zone’s clocks skip, or a name past 200 characters.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | null | no | The meeting’s name, up to 200 characters |
at |
string | null | yes | When it starts, as a date and a time in the presentation’s zone (2026-11-03T10:00), a time to come; null clears the meeting |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/next-period
Section titled “POST /api/presentations/{id}/next-period”Copy for next period: a new draft of the deck with every fixed period moved on by one but those kept as they are, its figures entered by hand asked for again, its grants and owner its origin’s (editors with the right to create decks)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | no | The copy’s title; left out, the suggested one |
accept |
array of string | no | The offered title words to make period tokens, by id (409 when the deck no longer offers one) |
keep |
array of string | no | What to keep as it is, by the ids the preview gives (409 when one names nothing on the deck now); left out, what the deck remembers keeping. The figures kept are remembered on the deck and its copy |
Responses: 201 · 400 · 401 · 403 · 404 · 409 · 503
POST /api/presentations/{id}/next-period/preview
Section titled “POST /api/presentations/{id}/next-period/preview”Preview “Copy for next period”: the moves, the periods kept as they are, what stays, the figures entered by hand it asks for again and the title words it offers as period tokens; nothing is made (editors)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
keep |
array of string | no | What to keep as it is, by the ids the preview gives (a move’s id keeps every figure on that period, a kept period’s id the figures it keeps); left out, what the deck remembers keeping |
Responses: 200 · 400 · 401 · 403 · 404 · 409
GET /api/presentations/{id}/prepared
Section titled “GET /api/presentations/{id}/prepared”The caller’s prepared figures for the revision they would present: when they were read
PRES-SPEED. A deck keeps its figures read ahead of presenting, one copy per access: the one the caller would be shown is the one their access over its figures, judged now, is the copy’s. Says when it was read (null: none is kept for them), whether that was within 5 minutes (presenting then reads nothing first), whether it is being read now, and why its refreshing stopped, if it did.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
draft |
boolean | no | The draft’s, for its editors and contributors (else the revision Start presenting opens on) |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/prepared
Section titled “POST /api/presentations/{id}/prepared”Read the caller’s prepared figures now, in the background (opening a deck, Refresh now)
PRES-SPEED. Opening a deck in the editor or the reader view asks for this, so its figures are read before Present: every shown slide holding a figure of the revision the caller would present, read as them in the background and kept for their access, unless what is kept for them was read within 5 minutes (refresh: always). Notes the caller as its user, so the deck’s refresh schedule keeps it for 14 days. 202 with the state as GET answers it.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
draft |
boolean | no | The draft’s, for its editors and contributors (else the revision Start presenting opens on) |
refresh |
boolean | no | Read them again even when they are fresh (Refresh now); else only when older than 5 minutes |
Responses: 202 · 403
POST /api/presentations/{id}/publish
Section titled “POST /api/presentations/{id}/publish”Publish a presentation’s saved draft: refused while a red finding is open; writes a version with its check report and a record of the values shown
Runs the publish check on the saved draft as the caller (POST /:id/checks). 409 PRESENTATION_CHECKS_FAILED while a red finding is open, with the findings in details; 409 PRESENTATION_CHANGED when the draft changed after it was checked. Otherwise writes, together: a version holding the whole deck and its check report (kept Review findings and their notes carried), the deck’s published version, and a write-once record of the values the publisher was shown (definition hash, metric version, data-through time and the access signature that produced them). Readers are then served that version. Editors and owners. PRES-29: while a live review round is not approved for the draft as it is, 409 PRESENTATION_REVIEW_PENDING; the owner may publish anyway (publishAnyway, with a reason of 10 to 1,000 characters), which is recorded as an event and an audit entry. Publishing closes the round, and its reviewers and requester are told.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
label |
string | null | no | The version’s label, up to 200 characters |
publishAnyway |
boolean | no | PRES-29: the owner publishes before the live review is finished, on the record |
reason |
string | null | no | Why, with publishAnyway: 10 to 1000 characters |
Responses: 200 · 400 · 401 · 403 · 404 · 409
GET /api/presentations/{id}/readers
Section titled “GET /api/presentations/{id}/readers”Who read a published presentation, for how long and which slides (editors and owners)
Totals (readers, those of the last 7 days, time and visits), each slide readers are shown in the published version (its readers, average time and views), and the people a page at a time, newest read first, each with how many of those slides they opened. The owner is never counted. Editors and owners only: a reader’s name is never shown below editor.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit |
20 | 50 | 100 |
no | |
offset |
integer | no |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/reads
Section titled “POST /api/presentations/{id}/reads”A reader’s beat on a slide of a published presentation: when it is shown, and every 30 seconds while it is in view
As Stories’ readers: a beat adds the time since the reader’s last one, at most 30 seconds and only within a minute, to the slide shown then; a gap of 30 minutes starts a new visit. Counted for readers of the published version only: never the owner (reason owner), nor contributors and up, who read the draft (reason draft). The slide is one of the published version’s slides readers are shown (404 otherwise).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
slideId |
string | yes | The slide shown |
Responses: 200 · 400 · 401 · 404
GET /api/presentations/{id}/records
Section titled “GET /api/presentations/{id}/records”What a presentation’s records hold: what was shown, when and to whom, newest first; values for the owner, editors and the session’s presenter only
Every reader sees each record’s event, time, author, version and meeting. Its values (each with its definition hash, metric version and data-through time) are shown only to the owner, editors and that session’s presenter, and only while their own access to every figure it read is the access that produced it (withheld_reason access); everyone else sees the event alone (withheld_reason role). A record of a slide explored while presenting says what was explored (explored), with its values.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit |
20 | 50 | 100 |
no | |
offset |
integer | no |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/{id}/records/last
Section titled “GET /api/presentations/{id}/records/last”The last record of a presentation whose values the caller may read, for the editor’s checks (N5, R2); null when none
The same record the publish check compares live values with (contracts DeckRecord: when, how, the meeting and its figures as they were served), so the editor’s Checks tab finds what publishing finds (D7). Only a record whose values you may read (the owner, editors and that meeting’s presenter, with the access that read them) is answered.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/resize
Section titled “POST /api/presentations/{id}/resize”Resize a presentation to another page size, laid out again (never stretched): as a copy (the default; editors with the right to create decks) or in place, its draft kept as a version first (editors)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
pageSize |
string | yes | The page size to resize to: 16:9, 4:3, a4 (A4 landscape), a4portrait or 9:16 (a phone story) |
mode |
"copy" | "in_place" |
no | copy (the default): a new draft on the new size, the deck left as it is; in_place: the deck itself, its draft kept as a version first |
title |
string | no | A copy’s title; left out, the deck’s with the size named |
baseEditSeq |
integer | no | The deck’s edit sequence the resize was asked against: required in place (409 when it moved on) |
Responses: 200 · 201 · 400 · 401 · 403 · 404 · 409 · 423 · 503
POST /api/presentations/{id}/resize/preview
Section titled “POST /api/presentations/{id}/resize/preview”Preview Resize: what a resize to another page size would move and what would need a look, slide by slide; nothing is made or changed (editors)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
pageSize |
string | yes | The page size to resize to: 16:9, 4:3, a4 (A4 landscape), a4portrait or 9:16 (a phone story) |
Responses: 200 · 400 · 401 · 403 · 404 · 409
POST /api/presentations/{id}/resize/undo
Section titled “POST /api/presentations/{id}/resize/undo”Undo Resize this deck: the draft kept before it restored, its page size with it, only while nothing in the deck changed after it; refused otherwise with 409 RESIZE_UNDO_GONE (editors)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
version |
integer | yes | The version the resize kept the draft as (its kept_as) |
baseEditSeq |
integer | yes | The deck’s edit sequence after the resize (409 when it moved on) |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423
GET /api/presentations/{id}/review
Section titled “GET /api/presentations/{id}/review”A presentation’s live review round, whether publishing waits for it, and what the caller may do; contributors and up
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/review
Section titled “POST /api/presentations/{id}/review”Ask people to review a presentation’s draft before it is published; editors and owners
Reviewers are active members of the workspace with contributor access or above on the presentation (400 otherwise, with the reason). The round is bound to the draft as it is now: an edit after it makes it stale. Asking again replaces the live round. While a round is not approved for the draft as it is, publishing is refused with 409 PRESENTATION_REVIEW_PENDING; the owner may publish anyway, with a reason. The reviewers are told.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
reviewers |
array of string | yes | People with contributor access or above on the presentation |
note |
string | null | no | For the reviewers, up to 2000 characters |
Responses: 201 · 400 · 401 · 403 · 409
DELETE /api/presentations/{id}/review
Section titled “DELETE /api/presentations/{id}/review”Cancel the presentation’s live review round; whoever asked for it, and the owner
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 204 — No content · 401 · 403 · 404
POST /api/presentations/{id}/review/decision
Section titled “POST /api/presentations/{id}/review/decision”As a reviewer: approve the presentation’s draft, or ask for changes with a note
Only a reviewer of the live round decides (403 otherwise). A round whose draft changed after it was asked for is stale: a decision on it is refused with 409 PRESENTATION_REVIEW_STALE (ask again). Whoever asked and the owner are told.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
decision |
"approved" | "changes_requested" |
yes | |
note |
string | null | no | Required when asking for changes: what should change |
Responses: 200 · 400 · 401 · 403 · 404 · 409
GET /api/presentations/{id}/saved-queries/{queryId}/columns
Section titled “GET /api/presentations/{id}/saved-queries/{queryId}/columns”A saved query’s output columns, for a slide’s figure on it
The query’s output columns and their types (the portable type names query results carry; null when the engine does not say), read as the caller by a statement that wraps the query and reads no row: the query is never run whole. The insert dialog and the data tab list them for the column a figure reads, the column its rows are grouped by and the date column its periods are read on. For a contributor and up on the deck who may read saved queries (the SQL editor’s view). 404 for a deck or a query that is not the caller’s workspace’s; 403 when the caller may not edit the deck’s slides or read saved queries, or row-level security applies to them on the query’s source; 400 when its SQL reads a sensitivity-labelled column their role may not read. Rate-limited as raw SQL.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
queryId |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/{id}/schedules
Section titled “GET /api/presentations/{id}/schedules”List a presentation’s schedules
Each schedule’s cadence (cron and time zone), its people and groups by name (a person’s role on the presentation now: none means they cannot open it and get no copy), its format, when it last went out and to how many, when it goes next, and, when its latest send did not go out to everyone, why: paused for everyone (a red finding of the checks, or a figure that failed to read), skipped (switched off, unpublished, archived, its owner no longer an editor), failed, or partial. Needs edit access to the presentation.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/schedules
Section titled “POST /api/presentations/{id}/schedules”Schedule a presentation: its latest published version, as a fresh PDF or PowerPoint file, to people and groups, each copy read with their own access
On the cadence given (a 5-field cron in its time zone), the presentation’s latest published version, never a draft, goes as a fresh PDF of its shown slides or a PowerPoint file to each person its people and groups reach (people and groups of the workspace, never an address; a group is read at each send). Each copy is read with that person’s own access (row security, masking; a figure they may not see is a dash with the reason), carries their access stamp and is recorded. Before anything is sent the checks run on every copy: one red finding, or a figure that fails to read, pauses the send for everyone and its owner is told why. 409 while the presentation is not published; 400 for a person who cannot open it. Needs edit access.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | null | no | Its name; null or empty for none (the cadence names it) |
cronExpression |
string | yes | |
timezone |
string | no | |
format |
"pdf" | "pptx" |
yes | |
recipients |
array of object | yes | People and groups of the workspace (at most 50): never an address |
isActive |
boolean | no |
Responses: 201 · 400 · 401 · 403 · 404 · 409
PUT /api/presentations/{id}/schedules/{scheduleId}
Section titled “PUT /api/presentations/{id}/schedules/{scheduleId}”Change a presentation’s schedule
Its name, cadence, time zone, format, people and groups, or isActive to turn it off and on. With baseEditVersion, refused (409) when the schedule changed since it was read. Needs edit access.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
scheduleId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | null | no | Its name; null or empty for none (the cadence names it) |
cronExpression |
string | no | |
timezone |
string | no | |
format |
"pdf" | "pptx" |
no | |
recipients |
array of object | no | People and groups of the workspace (at most 50): never an address |
isActive |
boolean | no | |
baseEditVersion |
integer | no |
Responses: 200 · 400 · 401 · 403 · 404 · 409
DELETE /api/presentations/{id}/schedules/{scheduleId}
Section titled “DELETE /api/presentations/{id}/schedules/{scheduleId}”Delete a presentation’s schedule
It sends no more; what it sent stays recorded (its sends and their records). Needs edit access.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
scheduleId |
string | yes |
Responses: 204 — No content · 401 · 403 · 404
GET /api/presentations/{id}/schedules/{scheduleId}/history
Section titled “GET /api/presentations/{id}/schedules/{scheduleId}/history”A presentation’s schedule’s sends, newest first
Each occurrence: what it came to (sent, partial, failed, paused for everyone, skipped) and why, the version it read, how many people and reads, who got no copy and why, and every copy it sent from the write-once records: who, which version, which access, whether its read was shared with people whose access was provably the same, the file’s checksum and size, and what the mail server said while that evidence is kept. 20, 50 or 100 a page. Needs edit access.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
scheduleId |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit |
20 | 50 | 100 |
no | |
offset |
integer | no |
Responses: 200 · 403 · 404
POST /api/presentations/{id}/schedules/{scheduleId}/send-again
Section titled “POST /api/presentations/{id}/schedules/{scheduleId}/send-again”Send a paused occurrence of a presentation’s schedule again
Once what paused it is fixed: its latest occurrence, while it is paused for everyone, is queued again; the checks run on every copy again before anything is sent. 409 when its latest occurrence is not paused. Needs edit access.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
scheduleId |
string | yes |
Responses: 202 · 403 · 404 · 409
GET /api/presentations/{id}/schedules/recipients
Section titled “GET /api/presentations/{id}/schedules/recipients”Search the people and groups of the workspace a presentation’s schedule may send to
The first 10 people (with each one’s role on the presentation now) and the first 10 groups (with their members) matching q, by name. Needs edit access to the presentation.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
q |
string | no |
Responses: 200 · 403 · 404
POST /api/presentations/{id}/sessions
Section titled “POST /api/presentations/{id}/sessions”Start presenting a deck to a named meeting, or rehearse it
A published deck presents its published version to anyone who reads it; the draft (an unpublished deck, or draft) only to its editors and contributors, with its figures unchecked. A meeting needs its name; a rehearsal is never recorded. Starting ends the caller’s session left open on the same deck. The new session takes the presenter’s prepared figures for the revision where their access is the copy’s (prepared.as_of says when they were read; those older than 5 minutes are read again in the background), and reads every other slide’s figures at once, as its presenter, the slide shown first (GET …/progress says how far it got). 409: an archived deck.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
meetingName |
string | null | no | The meeting the values shown are recorded under (200 characters at most once trimmed); when none is given, a meeting is named after when it started |
rehearsal |
boolean | no | Rehearse: nothing is recorded |
draft |
boolean | no | Present the saved draft rather than the published version (editors and contributors); its figures are marked Unchecked |
options |
object | no | DS4a: present options for this session over the deck’s own (a part left out keeps the deck’s; none: the deck’s). DS4a: autoAdvance (slides advance by themselves), advanceSeconds (5 to 120 whole seconds, 10 unless set), loop (after the last slide comes the first) and transition (none, fade or slide; none unless set); PRES-SPEED: refresh, how often the deck’s prepared figures are read again: {every, at}, every being every hour and before meetings (hour-meetings), every 15 minutes (15m), every hour (hour), every day at a time (day), only before meetings (meetings) or only when refreshed (manual), at a time such as 07:00 for day (hour-meetings unless set); MOTION: slides, by slide id, a slide’s own {transition, transitionMs (200 to 2000), advanceSeconds} over the deck’s (200 at most), and animations, by element id, how an element moves: {effect, delayMs, durationMs, from, exit, exitTo, emphasis, intensity}, effect being none, fade, rise, pan, delayMs 0 to 10000, durationMs 200 to 3000 (600 unless set), from and exitTo left, right, above, below, exit fade, rise, pan, emphasis pulse and intensity subtle, normal, strong (normal unless set) (1000 at most); each map is sent whole and replaces the one kept, null takes it away. A part left out keeps what it was. |
prepared |
boolean | no | PRES-SPEED: the client says when prepared figures were read and shows a slide read again: it is given every prepared slide; without it, only those read within 5 minutes |
Responses: 201 · 400 · 401 · 403 · 409
GET /api/presentations/{id}/sessions/{sessionId}
Section titled “GET /api/presentations/{id}/sessions/{sessionId}”The deck a present session presents: its revision’s shown slides, as the presenter may read them
The presenter’s own session only (404 for anyone else’s). A published version as published; the draft as it stood when the session started, whatever has been saved since. Speaker notes for contributors and up; written figures removed where the presenter may not see their source. 409: a reader’s published version was published again; the session has ended (PRESENTATION_SESSION_ENDED: ended, or unused for 12 hours and ended now).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404 · 409
PATCH /api/presentations/{id}/sessions/{sessionId}
Section titled “PATCH /api/presentations/{id}/sessions/{sessionId}”End a present session
The presenter’s own session only. Its slides’ reads and explored reads are deleted; its records keep what was shown.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
ended |
true |
yes | End the session (once; ending it again answers it as it is) |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/{id}/sessions/{sessionId}/explore
Section titled “GET /api/presentations/{id}/sessions/{sessionId}/explore”What a present session may explore: the filters presenters may change, and the slides each applies to
The presenter’s own session only (404 for anyone else’s). A filter applies to a slide when a figure on it reads its field: a metric’s or a model measure’s model field, or a column a saved query’s figure returns. 409 PRESENTATION_SESSION_ENDED: the session has ended.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404 · 409
GET /api/presentations/{id}/sessions/{sessionId}/progress
Section titled “GET /api/presentations/{id}/sessions/{sessionId}/progress”How far a present session got reading its slides’ figures
PRES-SPEED. The presenter’s own session only (404 for anyone else’s). A session reads every shown slide holding a figure as it starts; this says how many of them have a read kept, whether the first can be shown, how many are being read now, when the oldest read was made and when each was. 409: the session has ended.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404 · 409
POST /api/presentations/{id}/sessions/{sessionId}/refresh
Section titled “POST /api/presentations/{id}/sessions/{sessionId}/refresh”Read every slide of a present session again now (Refresh now)
PRES-SPEED. The presenter’s own session only (404 for anyone else’s). Every shown slide holding a figure is read again in the background, as the presenter; each slide keeps showing what it showed until its new read lands, and is then shown, and recorded, afresh (GET …/progress says when each was read). 202 with how many slides are read. 409: the session has ended.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes |
Responses: 202 · 403 · 409
GET /api/presentations/{id}/sessions/{sessionId}/remote
Section titled “GET /api/presentations/{id}/sessions/{sessionId}/remote”The screen’s phone remote now: the code waiting, the phone paired, its commands after the last one applied, where the screen is
The presenter’s own running session only (409 once it has ended). The stream (…/remote/events) sends the same as it changes. Each read says the screen follows its phone: a phone’s press while no read has come for a few seconds is refused.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
after |
integer | no | The last command the screen applied (its seq) |
phone |
string | no | The phone those commands came from: a different phone paired since is read from its first command |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 503
POST /api/presentations/{id}/sessions/{sessionId}/remote
Section titled “POST /api/presentations/{id}/sessions/{sessionId}/remote”Use a phone as the remote: show a new code for a phone to pair with (the one shown before stops working)
The presenter’s own running session only. The code is six letters and digits, used once, and waits five minutes; the phone paired, if any, stays paired until another pairs from this code or the screen disconnects it. 409: the session has ended (PRESENTATION_SESSION_ENDED). 503: no code could be made just now (REMOTE_UNAVAILABLE).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 503
DELETE /api/presentations/{id}/sessions/{sessionId}/remote
Section titled “DELETE /api/presentations/{id}/sessions/{sessionId}/remote”Disconnect the phone remote and stop showing its code
The presenter’s own session only. The phone hears it was disconnected (410 REMOTE_DISCONNECTED) and moves nothing more.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes |
Responses: 204 — No content · 401 · 403 · 404 · 409 · 503
GET /api/presentations/{id}/sessions/{sessionId}/remote/events
Section titled “GET /api/presentations/{id}/sessions/{sessionId}/remote/events”The screen’s phone remote as Server-Sent Events: the remote now, then each change and each command
Server-Sent Events. event: remote frames carry the remote as GET …/remote answers it (each command once, in order, after after; a phone paired since is sent from its first command); event: ended says the session ended, and the stream closes; event: error says the remote can’t be read just now, and the stream closes. : keepalive comments arrive every 15 s. The stream closes after ten minutes; the screen opens the next from the last command it applied. While it is open the screen follows its phone. The presenter’s own running session only (404, 409 before anything is sent).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
after |
integer | no | The last command the screen applied (its seq) |
phone |
string | no | The phone those commands came from: a different phone paired since is read from its first command |
Responses: 200 — Server-Sent Events (remote, ended). · 401 · 403 · 404 · 409
PUT /api/presentations/{id}/sessions/{sessionId}/remote/position
Section titled “PUT /api/presentations/{id}/sessions/{sessionId}/remote/position”Where the presenting screen is (the slide shown, how many, which way it can move), for its phone remote to show
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
index |
integer | yes | The slide shown, from 0 |
count |
integer | yes | How many slides the session presents |
can_next |
boolean | no | Whether the screen’s Next would move (pages of a last slide’s sources, a loop); by the slide shown when left out |
can_previous |
boolean | no | Whether the screen’s Previous would move; by the slide shown when left out |
Responses: 204 — No content · 400 · 401 · 403 · 404 · 409 · 503
POST /api/presentations/{id}/sessions/{sessionId}/slides/{slideId}
Section titled “POST /api/presentations/{id}/sessions/{sessionId}/slides/{slideId}”A slide’s values in a present session: read once, kept for the session, recorded when first shown to a meeting
Answers contracts DeckDataResponse for the slide’s elements and, for contributors and up (by the presenter’s role at this request), its notes, computed under the presenter’s own access the first time the session asks and the same answer every time after (going back shows the same numbers). A figure whose source failed while the slide was read ahead is read again when the slide is first shown. With shown, the first showing to a meeting writes a record of the elements’ values shown; a rehearsal records nothing. 404: a slide the revision does not show. 409: a session that has ended (PRESENTATION_SESSION_ENDED), or a slide of a draft session whose figures the draft has rebound since the session started (PRESENTATION_SLIDE_CHANGED: nothing is read, kept or recorded for it; start presenting again to show it as it is now).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes | |
slideId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
shown |
boolean | no | The slide is being shown now (false: read ahead while the slide before it shows) |
ahead |
boolean | no | PRES-SPEED: asked for ahead of time, not for a window to show now: it waits its turn behind the slides shown |
Responses: 200 · 400 · 401 · 403 · 404 · 409
POST /api/presentations/{id}/sessions/{sessionId}/slides/{slideId}/explore
Section titled “POST /api/presentations/{id}/sessions/{sessionId}/slides/{slideId}/explore”Explore a slide while presenting: its figures read with a filter the deck’s authors allow presenters to change
Read as the presenter, under their own row security and masking: each metric and model-measure figure on the slide whose model has a chosen filter’s field is read with its filter on that field replaced by the values chosen; a saved query’s figure, a dashboard visual, a figure of another model and a metric whose own definition filters that field keep what the slide showed (explore.untouched counts them); on a frozen deck the explored figures are read live (explore.live). Kept for the session and those values; with shown, the first showing of an explored state to a meeting writes a record naming what was explored; a rehearsal records nothing. 400 PRESENTATION_EXPLORE_NOT_ALLOWED: a filter the authors did not allow, or one that applies to no figure on this slide; 400 PRESENTATION_EXPLORE_VALUE: a value the filter does not take, or values for two filters on one field. 404: a slide the session does not show. 409: the session has ended (PRESENTATION_SESSION_ENDED), or a draft’s slide rebound since presenting started (PRESENTATION_SLIDE_CHANGED).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
sessionId |
string | yes | |
slideId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
values |
object | yes | By declared filter name, the value chosen (one), or the values (several) |
shown |
boolean | no | The explored slide is being shown now (the room’s window); false: the presenter window reading it |
Responses: 200 · 400 · 401 · 403 · 404 · 409
POST /api/presentations/{id}/slides
Section titled “POST /api/presentations/{id}/slides”Add a blank slide after another, or at the end (a presentation holds up to 200 slides)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
afterSlideId |
string | null | no | |
layoutId |
string | no |
Responses: 201 · 400 · 401 · 403 · 404 · 409
PUT /api/presentations/{id}/slides/{slideId}
Section titled “PUT /api/presentations/{id}/slides/{slideId}”Save one slide’s elements and speaker notes (refused while someone else holds its lock, and with a stale edit sequence)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
baseEditSeq |
integer | yes | The edit sequence the change was made against (409 when it moved on) |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
elements |
array of object | yes | |
notes |
object | null | no | |
layoutId |
string | no | |
styleParts |
object | null | no | CE-11: what the slide changes of its style’s parts, by part id (contracts deck-style-parts.ts); null for none; left out, as stored |
stylePartsUngrouped |
boolean | no | DECK-FIX: true once the slide’s style artwork is ungrouped in the editor, false grouped again; left out, as stored |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423
DELETE /api/presentations/{id}/slides/{slideId}
Section titled “DELETE /api/presentations/{id}/slides/{slideId}”Delete a slide with its elements, notes and bindings (editors; refused while someone else holds its lock, for a deck’s last slide, and with a stale edit sequence)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
baseEditSeq |
integer | yes | The deck’s edit sequence the deletion was made against (409 when it moved on) |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423
POST /api/presentations/{id}/slides/{slideId}/ai/estimate
Section titled “POST /api/presentations/{id}/slides/{slideId}/ai/estimate”A slide’s headline and speaker notes: what its figures read for you, and each step’s AI credits with your balance, before anything runs
App only. An API key gets 403: AI features are available in the DataSquares app; API keys can’t use them.
Reads the figures the slide shows — its KPI tiles and the live numbers of its text and notes — with your own access, as saved, and says how each reads for you now, what could not be read, and about how many AI credits a headline and speaker notes each use (whole credits, rounded up). 400 SLIDE_NOTHING_TO_WRITE for a slide without a figure. No AI runs and nothing is written.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404 · 423
POST /api/presentations/{id}/slides/{slideId}/ai/headline
Section titled “POST /api/presentations/{id}/slides/{slideId}/ai/headline”Suggest a headline for a slide from its figures (one AI call, AI credits)
App only. An API key gets 403: AI features are available in the DataSquares app; API keys can’t use them.
The AI writes one headline from the slide’s figures read with your access; every figure in it is a live number, a period token or a claim word the platform fills. A headline that types a figure, a period, a claim word or a comparison of the AI’s own is refused (headline null, left_out says why; the step is charged all the same). confirmCredits: the estimate you were shown; when it is now higher, 409 ESTIMATE_CHANGED with details.estimateCredits and nothing runs. 429 AI_BUDGET_REACHED, before it runs, when its estimate is more than what is left of this month’s AI budget. 502 AI_DRAFT_UNUSABLE when the reply cannot be used. Nothing is written to the slide: the deck remembers what the AI wrote, so the save that places it is marked AI-written.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
confirmCredits |
integer | yes | The step’s estimate you were shown, whole credits |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423 · 429 · 502 · 503
POST /api/presentations/{id}/slides/{slideId}/ai/notes
Section titled “POST /api/presentations/{id}/slides/{slideId}/ai/notes”Write a slide’s speaker notes from its figures (one AI call, AI credits)
App only. An API key gets 403: AI features are available in the DataSquares app; API keys can’t use them.
The AI writes up to six lines of speaker notes from the slide’s figures read with your access; every figure in them is a live number, a period token or a claim word the platform fills. Each line that types a figure, a period, a claim word or a comparison of the AI’s own is left out (left_out says which and why; the step is charged all the same). confirmCredits: the estimate you were shown; when it is now higher, 409 ESTIMATE_CHANGED with details.estimateCredits and nothing runs. 429 AI_BUDGET_REACHED, before it runs, when its estimate is more than what is left of this month’s AI budget. 502 AI_DRAFT_UNUSABLE when the reply cannot be used. Nothing is written to the slide: the deck remembers what the AI wrote, so the save that places it is marked AI-written.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
confirmCredits |
integer | yes | The step’s estimate you were shown, whole credits |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423 · 429 · 502 · 503
PUT /api/presentations/{id}/slides/{slideId}/assignee
Section titled “PUT /api/presentations/{id}/slides/{slideId}/assignee”Give a slide to someone to work on, or take it back (editors): a contributor edits the slides they added or were given, and the home’s Assigned to me lists them. Only someone who can edit the presentation (contributor and up) is given a slide; they are told (Presentation work notifications). Not content: the slide’s edit sequence stays
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
userId |
string | null | yes | The person given the slide; null takes it back |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/slides/{slideId}/elements/{elementId}/editable
Section titled “POST /api/presentations/{id}/slides/{slideId}/elements/{elementId}/editable”Make it an editable chart: the KPI tile, chart or table a dashboard visual becomes, bound to its card’s data and placed where it is, or why it cannot (contributors and up, with view access to the dashboard; nothing is written)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes | |
elementId |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
element |
object | yes | The dashboard visual as the editor holds it (its card, frame, lock and placeholder) |
zone |
string | yes | The deck’s time zone: a metric’s period is read there |
Responses: 200 · 400 · 401 · 403 · 404 · 409
POST /api/presentations/{id}/slides/{slideId}/elements/{elementId}/rewritten
Section titled “POST /api/presentations/{id}/slides/{slideId}/elements/{elementId}/rewritten”Say a text box the AI drafting wrote has been rewritten: its AI-written marker is removed and its text kept (audited; refused while someone else holds the slide’s lock, and with a stale edit sequence)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes | |
elementId |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
baseEditSeq |
integer | yes | The edit sequence the change was made against (409 when it moved on) |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423
POST /api/presentations/{id}/slides/{slideId}/lock
Section titled “POST /api/presentations/{id}/slides/{slideId}/lock”Take or renew the edit lock on a slide (423 when someone else holds it)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404 · 423
DELETE /api/presentations/{id}/slides/{slideId}/lock
Section titled “DELETE /api/presentations/{id}/slides/{slideId}/lock”Release your edit lock on a slide
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes |
Responses: 204 — No content · 401 · 404
POST /api/presentations/{id}/slides/{slideId}/notes/rewritten
Section titled “POST /api/presentations/{id}/slides/{slideId}/notes/rewritten”Say the speaker notes the AI wrote for a slide have been rewritten: their AI-written marker is removed and the notes kept (audited; refused while someone else holds the slide’s lock, and with a stale edit sequence)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
baseEditSeq |
integer | yes | The edit sequence the change was made against (409 when it moved on) |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423
POST /api/presentations/{id}/slides/{slideId}/restore
Section titled “POST /api/presentations/{id}/slides/{slideId}/restore”Bring a slide deleted within the last day back under its own id, with its owner, assignee, place, section and hidden flag; its content is saved back through the slide’s own save (editors)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
slideId |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
baseEditSeq |
integer | yes | The deck’s edit sequence the undo was made against (409 when it moved on) |
Responses: 201 · 400 · 401 · 403 · 404 · 409
POST /api/presentations/{id}/slides/order
Section titled “POST /api/presentations/{id}/slides/order”Reorder a presentation’s slides and choose which are hidden
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
baseEditSeq |
integer | yes | The edit sequence the change was made against (409 when it moved on) |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
order |
array of string | yes | Every slide of the presentation, once, in its new order |
hidden |
array of string | no | The slides hidden after this change; left out, hidden flags stay as they are |
Responses: 200 · 400 · 401 · 403 · 404 · 409
GET /api/presentations/{id}/slot-suggestions
Section titled “GET /api/presentations/{id}/slot-suggestions”Suggested metrics for each unbound data slot of a presentation, ranked by name, synonyms and unit, certified first, as the caller may read them
A data slot is a template’s placeholder that asks for its data (“Choose your revenue metric”): a text box slot-<kind>-<n>. Each slot points at its answer in answers; slots of a kind whose asks read alike share one, sent once. An answer holds the workspace’s metrics that match its ask, read with the caller’s own access: a metric whose source is gone, one withheld from them by row security, or one masking refuses them is never suggested. No AI, no query against a source, nothing written: a suggestion binds nothing until the person chooses it. Contributors and up; 404 for a slide the deck does not hold.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
slide |
string | no | Only this slide’s slots |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/story
Section titled “POST /api/presentations/{id}/story”Make a story from a presentation: its published version, or its draft for the people who make it, as a new story that is the caller’s draft; nothing is shared or published
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
revision |
"published" | "draft" |
no | The published version (the default when there is one), or the draft, for the people who make the deck |
Responses: 201 · 400 · 401 · 403 · 409
POST /api/presentations/{id}/story/preview
Section titled “POST /api/presentations/{id}/story/preview”Preview the story a presentation would become: one section per visible slide, each number, tile and chart bound again, and what a story cannot hold; nothing is created
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
revision |
"published" | "draft" |
no | The published version (the default when there is one), or the draft, for the people who make the deck |
Responses: 200 · 400 · 401 · 403 · 404 · 409
PUT /api/presentations/{id}/theme
Section titled “PUT /api/presentations/{id}/theme”Switch a presentation’s theme: refused with the gate’s reasons, or while someone else edits a slide that would move; every binding and element kept
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
themeId |
string | null | yes | |
masterId |
string | null | no | An undo: the master the deck had with that theme (one of its own for it; null for the theme’s own), in the colours it kept |
brand |
boolean | no | PRES-46: true dresses the style in the workspace’s brand kit as it is now (refused for a theme that is not one of the twelve styles, or where the workspace has no kit that changes a deck’s look); false takes it off; left out, a switch between styles keeps the brand the deck wears |
baseEditSeq |
integer | yes | The deck’s edit sequence the switch was made against (409 when it moved on) |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423
GET /api/presentations/{id}/themes
Section titled “GET /api/presentations/{id}/themes”The themes a presentation may take: the twelve built-in styles, the dashboards’ built-in themes and the workspace’s own, each with the gate’s reasons where it refuses one
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/{id}/versions
Section titled “GET /api/presentations/{id}/versions”A presentation’s versions, newest first: who, when, which is published, and each check report counted; contributors and up
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit |
20 | 50 | 100 |
no | |
offset |
integer | no |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/{id}/versions/{a}/compare/{b}
Section titled “GET /api/presentations/{id}/versions/{a}/compare/{b}”What changed between two versions of a presentation: slides and elements, and each figure’s published value in both; contributors and up
Slides added, removed and moved; per slide, its layout, hidden flag and notes changing (never the notes’ words), and each element added, removed, moved, resized, restyled, rebound (by its bindings’ definition hashes) or with its text changed (live numbers as placeholders, never a written figure). Values: each figure’s published value in each version, from the record publishing wrote with it, compared unrounded, only for a reader who may read both records’ values (D14: the owner and editors, with the access that read them); anyone else is told why (withheld role or access), and a version with no such record says so (not-recorded).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
a |
integer | yes | |
b |
integer | yes |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/{id}/versions/{version}
Section titled “GET /api/presentations/{id}/versions/{version}”One version of a presentation: the whole deck as it holds it, and its check report; contributors and up
The check report’s findings were written with the figures its publisher was shown, under the publisher’s access, so they are read as that version’s publish record is (GET /:id/records): whole only by the owner and editors whose own access to every figure is the access that produced them. Anyone else reads each finding’s check, level, place, key, kept mark and fixes as the catalogue says them, never its message or data (findings_withheld, withheld_reason role or access). The counts and the kept findings’ notes are read by every maker.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
version |
integer | yes |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/{id}/versions/{version}/restore
Section titled “POST /api/presentations/{id}/versions/{version}/restore”Make a version the presentation’s draft again (the draft is kept as a version first; slide and element ids kept); editors and owners
The draft as it is now is kept as a version of kind restore, then the deck’s own fields and every slide come back as the version holds them. The published version does not change until the presentation is published again. 423 SLIDE_LOCKED while someone else is editing a slide; 409 EDIT_CONFLICT with a stale baseEditSeq. Under the company’s brand locks (PRES-46) the version’s theme, master and footer come back with the parts the locks cover kept (the brand’s colours, its fonts, its logo), and what on its slides is off the brand is listed.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | |
version |
integer | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
baseEditSeq |
integer | no | The deck’s edit sequence the restore was asked against (409 when it moved on) |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 423
POST /api/presentations/ai/draft/estimate
Section titled “POST /api/presentations/ai/draft/estimate”Draft from data: what a draft would read, and each step’s AI credits with your balance, before anything runs
App only. An API key gets 403: AI features are available in the DataSquares app; API keys can’t use them.
Reads the figures a draft starts from with your own access — metrics you pick, a dashboard’s KPI cards and charts, a story’s live numbers, or the metrics a question names — and says how each reads for you now, what was left out and why, about how many AI credits the outline and the slides each use (whole credits, rounded up) and how many you can use now. No AI runs and nothing is written.
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
from |
object | yes | What the draft starts from: metrics you pick, a dashboard, a story, or a question in your words |
choices |
object | no | The period its figures are read for, what they are compared with, who it is written for and how many slides it may run to |
deckId |
string | no | The deck the slides go into; none for a new deck |
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/ai/draft/outline
Section titled “POST /api/presentations/ai/draft/outline”Draft from data: the outline, written by the AI from figures read with your access (one call, AI credits)
App only. An API key gets 403: AI features are available in the DataSquares app; API keys can’t use them.
The AI plans the deck from the figures: a title and slides, each a title and a point in words, a layout, and the figures and visual it shows, by reference. You edit and approve it before any slide is written. confirmCredits: the estimate you were shown; when it is now higher, 409 ESTIMATE_CHANGED with details.estimateCredits and nothing runs. problems: titles and points where the AI typed a figure, named a period or said which way a figure moved, cleared for you to write. 429 AI_BUDGET_REACHED, before it runs, when its estimate is more than what is left of this month’s AI budget. 502 AI_DRAFT_UNUSABLE when the reply cannot be used. Nothing is written.
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
from |
object | yes | What the draft starts from: metrics you pick, a dashboard, a story, or a question in your words |
choices |
object | no | The period its figures are read for, what they are compared with, who it is written for and how many slides it may run to |
deckId |
string | no | The deck the slides go into; none for a new deck |
confirmCredits |
integer | yes | The outline’s estimate you were shown, whole credits |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 429 · 502 · 503
POST /api/presentations/ai/draft/slides
Section titled “POST /api/presentations/ai/draft/slides”Draft from data: the slides of the outline you approved, written by the AI with every figure live (one call, AI credits)
App only. An API key gets 403: AI features are available in the DataSquares app; API keys can’t use them.
Reads the figures again with your access and refuses an outline written for others (409 DRAFT_DATA_CHANGED: the data or your access moved since; draft the outline again), or one whose slides’ titles or points type a figure or name a period (400); the outline’s own title, the new deck’s name, may be any words. The AI writes each slide’s words; every figure in them is a live number, a period token or a claim word the platform fills. The slides go after afterSlideId in deckId (contributors and up), or into a new deck (the Presentations create right); in a deck the outline’s title is not used. Each slide’s words may quote only the figures its slide of the outline shows, and a title, headline or line that types a figure, a period, a claim word or a comparison of the AI’s own never reaches the slide (left_out says which text of which slide and why; the step is charged all the same, and a slide whose title is left out takes the outline’s). Every text box is marked AI-written. confirmCredits as the outline’s. Refused before the AI runs, nothing charged: a step estimated past this month’s AI budget (429 AI_BUDGET_REACHED), a slide to go after that is gone (404), a deck without room (400 PRESENTATION_SLIDE_LIMIT). The AI work is paid for once it ran: when the slide to go after is deleted meanwhile, the slides go at the end and notices say so; any other refusal to write them then says the credits were used.
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
from |
object | yes | What the draft starts from: metrics you pick, a dashboard, a story, or a question in your words |
choices |
object | no | The period its figures are read for, what they are compared with, who it is written for and how many slides it may run to |
deckId |
string | no | The deck the slides go into; none for a new deck |
outline |
object | yes | The outline as you approved it: its title and slides, each a title and a point in words, its layout, its figures and visual by reference |
draftKey |
string | yes | The outline’s draft_key |
confirmCredits |
integer | yes | The slides’ estimate you were shown, whole credits |
afterSlideId |
string | null | no | In a deck: the slide they go after; none puts them at the end |
Responses: 201 · 400 · 401 · 403 · 404 · 409 · 429 · 502 · 503
POST /api/presentations/import
Section titled “POST /api/presentations/import”Import a PowerPoint file (100 MB at most): a .pptx as a new deck in its look, a .potx as a template of the workspace. Its theme, layouts, text and pictures come in; numbers come in as typed text, flagged until bound; charts and tables as slots to bind. Answers what came in and what was left out
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
importId |
string | no | An id the client gives the import, to cancel it by while it reads the file |
Responses: 201 · 400 · 401 · 403 · 409 · 413 · 503
DELETE /api/presentations/imports/{importId}
Section titled “DELETE /api/presentations/imports/{importId}”Cancel an import of yours (the id your client gave it) while it reads its file: it stops and answers that nothing was made. Once its deck is being written it is too late (409): its own answer says what was made
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
importId |
string | yes |
Responses: 200 · 404 · 409
POST /api/presentations/preview
Section titled “POST /api/presentations/preview”Preview the slides a template, a dashboard (with its cutting) or a story would become, with what stays out and the filters it carries; nothing is created
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | no | |
from |
object | yes |
Responses: 200 · 400 · 401 · 403 · 404
GET /api/presentations/remote/{remoteId}
Section titled “GET /api/presentations/remote/{remoteId}”This phone’s pairing with a presenting screen: the deck, the session and where the screen is
410 with why once it is no longer the screen’s remote: REMOTE_DISCONNECTED, REMOTE_REPLACED, REMOTE_ENDED, or REMOTE_LOST (this service does not know it); 403 REMOTE_CANNOT_PRESENT; 409 REMOTE_SCREEN_AWAY: the screen is not following this phone right now (the pairing stands).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
remoteId |
string | yes |
Responses: 200 · 400 · 401 · 403 · 404 · 409 · 410
DELETE /api/presentations/remote/{remoteId}
Section titled “DELETE /api/presentations/remote/{remoteId}”Stop using this phone as the remote
The screen hears the phone left. Nothing to do (204) for a pairing that already ended or is not this person’s.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
remoteId |
string | yes |
Responses: 204 — No content · 401 · 404
POST /api/presentations/remote/{remoteId}/commands
Section titled “POST /api/presentations/remote/{remoteId}/commands”Move the presenting screen’s slides from this phone: next, previous, or a slide by its number
Kept for the screen in order. The answer waits up to a second for the screen to apply it: applied true and the position after the move, or applied false and the position the screen last gave (read the pairing again shortly). 410 once the phone is no longer its remote (REMOTE_DISCONNECTED, REMOTE_REPLACED, REMOTE_ENDED, REMOTE_LOST); 403 REMOTE_CANNOT_PRESENT; 409 REMOTE_SCREEN_AWAY: the screen is not following this phone right now, so the press is not kept (the pairing stands).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
remoteId |
string | yes |
Responses: 202 · 400 · 401 · 403 · 409 · 410
POST /api/presentations/remote/pair
Section titled “POST /api/presentations/remote/pair”Pair this phone with a presenting screen by its code, to move its slides
Signed in as a person who may present the deck as the session presents it: any role that reads a published version; a draft, its contributors and up. The code is used once. A phone paired before from this screen is no longer its remote. 404 REMOTE_CODE_UNKNOWN: no presentation is waiting for this code (never was, used, run out, burnt after five refused attempts, or not yours to see); 409 REMOTE_OTHER_WORKSPACE: the code is for your other workspace; 409 REMOTE_ENDED; 403 REMOTE_CANNOT_PRESENT; 429 REMOTE_TOO_MANY_TRIES: twenty refused attempts by this person in ten minutes.
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
code |
string | yes | The code the presenting screen shows, as typed (any case, spaces or a dash) |
device |
string | no | The name this phone goes by on the screen (one line, 60 characters at most; “Phone” when none) |
Responses: 201 · 400 · 401 · 403 · 404 · 409 · 429
GET /api/presentations/series
Section titled “GET /api/presentations/series”The series of the decks named (decks made from one another by “Copy for next period”), each with the decks of it the caller may read, latest first
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
ids |
string | yes | The decks’ ids, separated by commas: up to 100 (a page of the home) |
Responses: 200 · 400 · 401 · 404
GET /api/presentations/templates
Section titled “GET /api/presentations/templates”Deck templates: the four Stories templates, then the library’s twelve (with their data slots, style, audience and grain), then the workspace’s own, newest first
Responses: 200 · 400 · 401 · 403 · 404
POST /api/presentations/templates
Section titled “POST /api/presentations/templates”Save a presentation as a workspace template: its slides, notes and bindings as they are (its editors only)
Request body (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
presentationId |
string | yes | |
name |
string | yes | |
description |
string | null | no |
Responses: 201 · 400 · 401 · 403 · 404 · 409
GET /api/presentations/templates/{templateId}
Section titled “GET /api/presentations/templates/{templateId}”One template as a deck would start from it: a library template in a style and for a period (its slides, notes, data slots and prompts), with the look it is drawn in (under the company’s brand locks, the look the deck will be made in); built in or the workspace’s own
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
templateId |
string | yes |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
style |
"meridian" | "ledger" | "graphite" | "atlas" | "mono" | "bloom" | "aurora" | "linen" | "harbor" | "citrus" | "slate" | "orchid" |
no | A library template made in one of the twelve styles; left out, its own |
period |
string | no | A quarter (2026-Q3), a month (2026-10) or a year (2026), by the template’s grain |
brand |
boolean | no | PRES-46: a library template made with the workspace’s brand kit over its style (refused where the workspace has no kit that changes a deck’s look) |
pageSize |
string | no | The template in this page size (16:9, 4:3, a4, a4portrait or 9:16), its slides laid out again for it, as a deck started from it in that size; left out, its own |
Responses: 200 · 400 · 401 · 403 · 404
DELETE /api/presentations/templates/{templateId}
Section titled “DELETE /api/presentations/templates/{templateId}”Remove a workspace template (its author or an admin; built-in templates stay)
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
templateId |
string | yes |
Responses: 204 — No content · 401 · 403 · 404