Skip to main content
For most use cases, the slideless CLI handles the upload flow end-to-end — you rarely need to call this endpoint directly. This reference is for custom tooling that can’t run Node.

The three-step upload flow

Slideless uses a content-addressed upload protocol. Each file is stored by its SHA-256 hash, so unchanged files across deck versions dedupe automatically.
  1. POST /precheckAssets — send hashes, get back which ones are missing. (This page.)
  2. POST /uploadPresentationAsset — upload each missing blob (multipart, streamed).
  3. POST /commitPresentationVersion — commit the manifest, bump the version.

Endpoint

POST https://europe-west1-slideless-ai.cloudfunctions.net/precheckAssets

Auth

HeaderValue
AuthorizationBearer cko_… (or cka_…)
Content-Typeapplication/json
Required scope: presentations:write.

Request body

FieldTypeRequiredDescription
hashesstring[]yesSHA-256 hashes (64 lowercase hex chars each). Max 2000 per call.
presentationIdstringnoCheck against this existing presentation’s blob store. Requires ownership.
sessionIdstringnoCarry a session from a prior call. Mutually exclusive with presentationId.
Call patterns:
  • New presentation (first call): omit both presentationId and sessionId. Response includes sessionId + reserved presentationId to use for uploadPresentationAsset and commitPresentationVersion.
  • Update existing presentation: pass presentationId. Backend checks dedup against that presentation’s blob store.
  • Subsequent calls in a new-presentation flow: pass the sessionId you got from the first call.
Example:
{
  "hashes": [
    "4edd6a4b20278337c9cd35ef2b71e375522abd1c7563301dca7eebac31b5665e",
    "c3d6ce7c672be2d98d555bed4504b944c9730ec33baf35b778cc049cf928ccb0"
  ]
}

Response (200)

New-presentation flow (no presentationId in request)

{
  "success": true,
  "data": {
    "missing": [
      "4edd6a4b20278337c9cd35ef2b71e375522abd1c7563301dca7eebac31b5665e",
      "c3d6ce7c672be2d98d555bed4504b944c9730ec33baf35b778cc049cf928ccb0"
    ],
    "sessionId": "019dba77-...",
    "presentationId": "019dba77-4a1d-716e-8993-61e7c5771a7b"
  }
}

Update flow (presentationId in request)

{
  "success": true,
  "data": {
    "missing": ["c3d6ce7c672be2d98d555bed4504b944c9730ec33baf35b778cc049cf928ccb0"]
  }
}
FieldDescription
missingSubset of input hashes that need uploading. Everything else is already in the store.
sessionIdOnly present on new-presentation flow. Pass on subsequent calls. Sessions auto-expire after 1 hour.
presentationIdOnly present on new-presentation flow. The reserved presentationId for the final commit.

Errors

StatusCodeCause
400invalid-argumenthashes isn’t an array, >2000 entries, or entries don’t match the sha256 regex
401unauthenticatedMissing/invalid API key
403permission-deniedKey lacks presentations:write, or caller is not the owner or an active dev collaborator
404not-foundpresentationId or sessionId doesn’t exist (sessions expire after 1 hour)

Next