When to use this
You want to upload a presentation from somewhere other than the dashboard or a Claude session — for example:- A CI/CD job that publishes a release deck on every tag
- A cron task that re-publishes a daily metrics deck
- Any custom integration
Prerequisites
- An organization API key with
presentations:write(see API keys) - The HTML you want to share, ≤ 10 MB
- A way to make HTTPS POST requests (curl, Node, Python — any will do)
Endpoint
| Header | Value |
|---|---|
X-Process-Manager-Key | Your cko_… API key |
Content-Type | application/json |
POST /uploadSharedPresentation.
curl
jq -Rs reads the file as a single JSON-escaped string. Don’t try to inline raw HTML into a JSON payload — quotes and backslashes will break it.
Node.js
Python
Two URLs, two purposes
Don’t confuse the share URL (what you give recipients) with the fetch URL (where the raw HTML lives):| Purpose | URL | When |
|---|---|---|
| Share URL — recipients open this | https://app.slideless.ai/share/{shareId}?token={token} | What uploadSharedPresentation returns; what you send people |
| Fetch URL — raw HTML | https://europe-west1-slideless-ai.cloudfunctions.net/getSharedPresentation/{shareId}?token={token} | Used internally by the share viewer iframe; you rarely need this |
text/html). For everything else, use the share URL.
Errors
| Status | Code | Meaning |
|---|---|---|
400 | invalid-argument | Missing html or title field |
401 | unauthenticated | Missing or invalid API key |
403 | forbidden | Key lacks presentations:write scope |
405 | method-not-allowed | Use POST |
413 | payload-too-large | HTML exceeds 10 MB |
500 | internal | Backend error — retry with exponential backoff |
Next
- Update in place — Re-publish without changing the URL.
- Full API reference — Field-by-field details.