For most use cases, the
slideless CLI handles the upload flow end-to-end. This reference is for custom tooling.Endpoint
Auth
| Header | Value |
|---|---|
Authorization | Bearer cko_… (or cka_…) |
Content-Type | multipart/form-data; boundary=... |
presentations:write.
Multipart fields
Order-independent. Send all five in one request:| Field | Required | Description |
|---|---|---|
presentationId | one of | Existing presentation to upload into (update flow). |
sessionId | one of | Upload session (new-presentation flow). You need one of presentationId or sessionId. |
sha256 | yes | Declared hash of the bytes being uploaded (64 lowercase hex chars). |
contentType | yes | MIME type. Stored on the blob; returned in Content-Type headers when the viewer serves this asset. |
file | yes | The raw bytes. Any field name accepted for the file part. |
Hash verification
The backend recomputes the SHA-256 of the received bytes and compares against the declaredsha256. If they don’t match, the blob is deleted and the call returns 400 hash-mismatch. This prevents a malicious client from smuggling corrupt content into another user’s namespace.
Response (200)
size: 0 indicates the blob was already present — upload was skipped (idempotent).
Plan caps
The per-file cap depends on your plan:| Plan | Per-file cap |
|---|---|
| Free | 50 MB |
| Starter | 100 MB |
| Pro | 250 MB |
| Business | 500 MB |
| Enterprise | 1 GB |
413 payload-too-large.
Example
curl
Node.js (native FormData + Blob)
Errors
| Status | Code | Cause |
|---|---|---|
400 | invalid-argument | Missing field, bad sha256 format, or malformed multipart body |
400 | hash-mismatch | Uploaded bytes don’t match declared sha256 (blob was deleted) |
401 | unauthenticated | Missing/invalid API key |
403 | permission-denied | Key lacks presentations:write, or caller is not the owner or an active dev collaborator |
404 | not-found | presentationId or sessionId doesn’t exist |
413 | payload-too-large | Blob exceeds the plan’s per-file cap |
Next
- POST /commitPresentationVersion — after all missing blobs are uploaded, commit the manifest.