Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.slideless.ai/llms.txt

Use this file to discover all available pages before exploring further.

For most use cases, the slideless CLI is easier than calling this endpoint directly. The CLI command equivalent is slideless publish --kind <presentation|app|plan> --description "…", run from inside a linked deck folder.

When to use

Turn a presentation you own into a public marketplace listing. The listing is pinned to one immutable version of the deck — later pushes do not move it. To re-pin, call this endpoint again or use slideless listing update --republish-version. Publishing is free and instant — there is no review queue.

Endpoint

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

Auth

HeaderValue
AuthorizationBearer cko_… — must belong to the presentation’s owner
The key must carry the marketplace:publish scope. See API keys.

Request body

{
  "presentationId": "0192f1c3-...",
  "kind": "presentation",
  "interactive": false,
  "description": "Investor-ready pitch skeleton — 8 slides, placeholder copy.",
  "slug": "q4-pitch-template",
  "title": "Q4 Pitch Template",
  "tags": ["pitch", "startup", "investor"],
  "techStack": ["html", "css"],
  "category": "business",
  "version": 3
}
FieldTypeRequiredDescription
presentationIdUUIDv7 stringyesThe deck to publish. Caller must be its owner.
kind"presentation" | "app" | "plan"yesThe listing’s purpose — message, machine, or blueprint. See The three kinds.
interactivebooleannoWhether the listing is interactive. The backend forces true for app; defaults to false for presentation.
descriptionstringyesOne- or two-line catalog summary.
slugstringnoPermanent listing id. Lowercase, hyphenated, unique. Auto-derived from the title if omitted.
titlestringnoListing title. Defaults to the presentation’s title.
tagsstring[]noSearch tags.
techStackstring[]noTechnologies the listing is built with or built for, as free-form lowercase technology slugs (e.g. ["nextjs","firebase","n8n"]). One canonical slug per technology; no display names or versions. Especially useful for plan listings. See Tech stack.
categorystringnoCategory bucket.
versionnumbernoVersion to pin. Defaults to the deck’s current version.
The listing is created with status: "public". Use updateMarketplaceListing to switch it to unlisted.

Response (200)

{
  "success": true,
  "data": {
    "slug": "q4-pitch-template",
    "kind": "presentation",
    "interactive": false,
    "version": 3,
    "status": "public",
    "marketplaceUrl": "https://slideless.ai/marketplace/q4-pitch-template"
  }
}

Examples

curl

curl -sS -X POST \
  -H "Authorization: Bearer $SLIDELESS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "presentationId": "0192f1c3-...",
    "kind": "presentation",
    "description": "Investor-ready pitch skeleton — 8 slides, placeholder copy.",
    "tags": ["pitch", "startup"]
  }' \
  https://europe-west1-slideless-ai.cloudfunctions.net/publishMarketplaceListing

Node.js

const res = await fetch(
  'https://europe-west1-slideless-ai.cloudfunctions.net/publishMarketplaceListing',
  {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.SLIDELESS_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      presentationId: '0192f1c3-...',
      kind: 'presentation',
      description: 'Investor-ready pitch skeleton — 8 slides, placeholder copy.',
    }),
  }
);

const { data } = await res.json();
console.log(`Published: ${data.marketplaceUrl}`);

Errors

StatusCodeCauseFix
400invalid-argumentMissing kind/description, or bad slug syntaxSupply both required fields; slugs are lowercase/hyphenated
401unauthenticatedMissing or invalid API keySet Authorization
403permission-deniedKey lacks marketplace:publish, or caller is not the ownerRecreate the key with the scope; publish from the owner’s account
404not-foundpresentationId unknownVerify the ID via listMyPresentations
409conflictSlug already taken, or the deck already has a listingPass a different slug, or use updateMarketplaceListing
500internalBackend errorRetry with backoff

Next