SlideSync API Reference

The SlideSync API gives you programmatic access to project management, current deck snapshots, and server-side HTML ZIP exports. Deck generation and PPTX/PDF/Google Slides export are planned, but are not exposed through the public v1 API yet.

Base URLhttps://api.slidesync.ai/v1

Quick start

bash
curl -X GET "https://api.slidesync.ai/v1/projects/proj_abc/decks?include_html=true" \
  -H "Authorization: Bearer sk_live_your_key" \
  -H "Content-Type: application/json"

Authentication

All API requests must include your API key in the Authorization header as a Bearer token. API keys are scoped to your workspace and inherit the permissions of the account that created them.

http
GET /v1/projects HTTP/1.1
Host: api.slidesync.ai
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
Keep your API key secret. Never expose it in client-side code, public repositories, or browser requests. Use environment variables and server-side requests only.

API Keys & Billing

API keys are generated from your Dashboard Settings. Each key is tied to your account’s subscription plan and usage is billed against your plan’s quota.

How billing works

Every API call that generates, iterates, or exports a deck consumes credits from your plan. Read-only operations (listing projects, getting deck details) are free and unlimited within rate limits.

Free

5 generations/month

  • All read endpoints
  • PDF export
  • 1 project

Pro Recommended

200 generations/month

  • All endpoints
  • PPTX + Google Slides + PDF export
  • Unlimited projects
  • Brand kit upload
  • Webhooks
  • Priority rate limits

Enterprise

Custom volume

  • Dedicated infrastructure
  • Custom rate limits
  • SLA guarantee
  • SSO / SAML
  • Dedicated support
Overages: If you exceed your monthly generation quota, additional generations are billed at $0.25 per deck. You can set a spending cap in your dashboard to prevent unexpected charges.
POST/v1/auth/keys

Create a new API key for your workspace.

Request body

json
{
  "name": "Production Key",
  "permissions": ["read", "write", "export"],
  "rate_limit_tier": "pro"
}

Response

json
{
  "id": "key_xk2m9f",
  "key": "sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "name": "Production Key",
  "created_at": "2026-05-19T10:00:00Z",
  "permissions": ["read", "write", "export"],
  "last_used_at": null
}
GET/v1/auth/keys

List all API keys in your workspace.

Response

json
{
  "keys": [
    {
      "id": "key_xk2m9f",
      "name": "Production Key",
      "prefix": "sk_live_xxxx...xxxx",
      "created_at": "2026-05-19T10:00:00Z",
      "last_used_at": "2026-05-19T14:32:00Z",
      "permissions": ["read", "write", "export"]
    }
  ]
}
DELETE/v1/auth/keys/:key_id

Revoke an API key. This action is immediate and irreversible.

Parameters

key_idrequired
stringThe ID of the key to revoke

Response

json
{
  "deleted": true,
  "id": "key_xk2m9f"
}
GET/v1/usage

Get current billing period usage for your workspace.

Response

json
{
  "plan": "pro",
  "period_start": "2026-05-01T00:00:00Z",
  "period_end": "2026-05-31T23:59:59Z",
  "generations_used": 47,
  "generations_limit": 200,
  "exports_used": 12,
  "overage_charges": 0.00,
  "spending_cap": 50.00
}

Projects

Projects are workspace containers that hold decks, brand kits, uploaded files, and design settings. Each project has its own design context that influences all AI-generated decks within it.

GET/v1/projects

List all projects in your workspace, ordered by last modified.

Parameters

limit
integerMax results (default: 20, max: 100)
offset
integerPagination offset

Response

json
{
  "projects": [
    {
      "id": "proj_abc123",
      "name": "Q3 Board Presentation",
      "created_at": "2026-05-10T09:00:00Z",
      "updated_at": "2026-05-18T14:22:00Z",
      "deck_count": 3,
      "design_settings": {
        "palette": "corporate-navy",
        "font_direction": "swiss-precision"
      }
    }
  ],
  "total": 12,
  "has_more": false
}
POST/v1/projects

Create a new project. Optionally include a brief to auto-generate design settings.

Request body

json
{
  "name": "Product Launch Deck",
  "brief": "Modern tech product launch for developer audience",
  "template_id": "tmpl_startup_pitch"
}

Response

json
{
  "id": "proj_def456",
  "name": "Product Launch Deck",
  "created_at": "2026-05-19T10:15:00Z",
  "design_settings": {
    "palette": "electric-indigo",
    "font_direction": "neo-grotesque",
    "primary_color": "#6D28FF",
    "background": "#FAFAFE"
  },
  "template": {
    "id": "tmpl_startup_pitch",
    "name": "Startup Pitch"
  }
}
GET/v1/projects/:project_id

Get full project details including design system, file count, and deck list.

Parameters

project_idrequired
stringProject ID

Response

json
{
  "id": "proj_abc123",
  "name": "Q3 Board Presentation",
  "created_at": "2026-05-10T09:00:00Z",
  "updated_at": "2026-05-18T14:22:00Z",
  "design_settings": { ... },
  "design_system": { ... },
  "decks": [...],
  "files": [...],
  "brand_kit": { ... }
}
PATCH/v1/projects/:project_id

Update project name, design settings, or configuration.

Parameters

project_idrequired
stringProject ID

Request body

json
{
  "name": "Updated Project Name",
  "design_settings": {
    "palette": "warm-sunset",
    "font_direction": "humanist-warm"
  }
}

Response

json
{
  "id": "proj_abc123",
  "name": "Updated Project Name",
  "updated_at": "2026-05-19T11:00:00Z",
  "design_settings": {
    "palette": "warm-sunset",
    "font_direction": "humanist-warm"
  }
}
DELETE/v1/projects/:project_id

Permanently delete a project and all its decks, files, and exports.

Parameters

project_idrequired
stringProject ID

Response

json
{
  "deleted": true,
  "id": "proj_abc123"
}

Deck Generation

Public v1 exposes the current saved deck snapshot for each project. Slides are stored as versioned canonical HTML in the project; public API deck generation is not implemented yet.

POST/v1/projects/:project_id/decks

Deck generation is not implemented in the public v1 API yet. This endpoint returns not_implemented after authentication and project ownership checks.

Parameters

project_idrequired
stringProject to create the deck in

Request body

json
{
  "brief": "Create a 10-slide investor pitch deck"
}

Response

json
{
  "error": {
    "code": "not_implemented",
    "message": "Public API deck generation is not implemented yet. Create or revise decks through the app chat/templates, then list the current deck from this endpoint.",
    "status": 501
  }
}
GET/v1/decks/:deck_id

Get deck details, status, and all slides. Slides include full HTML content.

Parameters

deck_idrequired
stringDeck ID
include_html
booleanInclude full slide HTML (default: true)

Response

json
{
  "id": "deck_xyz789",
  "status": "complete",
  "title": "MenuAI — Investor Pitch",
  "slide_count": 10,
  "design_system": {
    "genre": "investor-pitch",
    "palette": { "primary": "#1A1A2E", "accent": "#6D28FF" },
    "typography": { "heading": "Inter", "body": "Inter" }
  },
  "slides": [
    {
      "id": "slide_001",
      "index": 0,
      "role": "cover",
      "title": "MenuAI",
      "html": "<!DOCTYPE html>...",
      "notes": "Opening slide with company name and tagline"
    }
  ],
  "created_at": "2026-05-19T10:30:00Z",
  "completed_at": "2026-05-19T10:31:28Z"
}
POST/v1/decks/:deck_id/iterate

Iterate on an existing deck with natural language feedback. Consumes one credit.

Parameters

deck_idrequired
stringDeck ID to iterate on

Request body

json
{
  "feedback": "Make slide 3 more data-focused with a chart showing revenue growth. Also change the color scheme to be warmer.",
  "target_slides": [2],
  "regenerate_all": false
}

Response

json
{
  "id": "deck_xyz789",
  "status": "iterating",
  "version": 2,
  "changes": ["slide_003"],
  "credits_consumed": 1
}
GET/v1/projects/:project_id/decks

List the current deck snapshot in a project. This returns zero or one deck because v1 maps decks to the latest slide_versions row.

Parameters

project_idrequired
stringProject ID
include_html
booleanInclude full slide HTML. Defaults to false.

Response

json
{
  "decks": [
    {
      "id": "proj_abc123",
      "object": "deck",
      "project_id": "proj_abc123",
      "title": "MenuAI — Investor Pitch",
      "source": "latest_slide_version",
      "latest_version_id": "version_xyz789",
      "slide_count": 10,
      "slides": [
        {
          "id": "slide-1",
          "title": "MenuAI",
          "position": 0,
          "has_html": true
        }
      ]
    }
  ],
  "project_id": "proj_abc123",
  "has_current_deck": true
}
DELETE/v1/decks/:deck_id

Delete a deck and all its slide versions.

Parameters

deck_idrequired
stringDeck ID

Response

json
{
  "deleted": true,
  "id": "deck_xyz789"
}

Slides

Access and manipulate individual slides within a deck. Each slide has a role (cover, content, data-viz, etc.), HTML content, and speaker notes.

GET/v1/decks/:deck_id/slides

List all slides in a deck with metadata.

Parameters

deck_idrequired
stringDeck ID

Response

json
{
  "slides": [
    {
      "id": "slide_001",
      "index": 0,
      "role": "cover",
      "title": "MenuAI",
      "thumbnail_url": "https://cdn.slidesync.ai/thumbs/slide_001.png"
    },
    {
      "id": "slide_002",
      "index": 1,
      "role": "agenda",
      "title": "Today's Agenda",
      "thumbnail_url": "https://cdn.slidesync.ai/thumbs/slide_002.png"
    }
  ]
}
GET/v1/slides/:slide_id

Get a single slide with full HTML content and version history.

Parameters

slide_idrequired
stringSlide ID

Response

json
{
  "id": "slide_001",
  "deck_id": "deck_xyz789",
  "index": 0,
  "role": "cover",
  "title": "MenuAI",
  "html": "<!DOCTYPE html><html>...</html>",
  "notes": "Opening slide — company name, tagline, and visual identity",
  "version": 2,
  "versions": [
    { "version": 1, "created_at": "2026-05-19T10:31:00Z" },
    { "version": 2, "created_at": "2026-05-19T10:45:00Z" }
  ]
}
PATCH/v1/slides/:slide_id

Update a slide's HTML content or notes directly.

Parameters

slide_idrequired
stringSlide ID

Request body

json
{
  "html": "<!DOCTYPE html><html>...updated content...</html>",
  "notes": "Updated speaker notes"
}

Response

json
{
  "id": "slide_001",
  "version": 3,
  "updated_at": "2026-05-19T11:00:00Z"
}
POST/v1/decks/:deck_id/slides/reorder

Reorder slides within a deck.

Parameters

deck_idrequired
stringDeck ID

Request body

json
{
  "order": ["slide_001", "slide_003", "slide_002", "slide_004"]
}

Response

json
{
  "reordered": true,
  "slide_count": 4
}

Exports

Public v1 exports completed HTML ZIP packages from the current deck HTML. Server-side PPTX, PDF, and Google Slides export are not exposed through the public API yet.

POST/v1/decks/:deck_id/export

Create a completed HTML ZIP export. Supported formats: html-zip, zip-html, package.

Parameters

deck_idrequired
stringDeck ID to export

Request body

json
{
  "format": "html-zip"
}

Response

json
{
  "export": {
    "id": "export_abc",
    "object": "export",
    "deck_id": "proj_abc123",
    "project_id": "proj_abc123",
    "status": "completed",
    "format": "html-zip",
    "artifact_type": "html_zip",
    "download_url": "/api/v1/exports/export_abc/download"
  },
  "artifact": {
    "type": "html_zip",
    "bucket": "project-files",
    "slide_count": 10
  },
  "supported_formats": ["html-zip", "package", "zip-html"],
  "unsupported_formats": ["pptx", "pdf", "google-slides"]
}
GET/v1/exports/:export_id

Planned status endpoint. Current public v1 returns a completed export and download_url from POST /v1/decks/:deck_id/export.

Parameters

export_idrequired
stringExport job ID

Response

json
{
  "error": {
    "code": "not_implemented",
    "message": "Use the download_url returned by the export creation endpoint."
  }
}
GET/v1/exports/:export_id/download

Download the completed HTML ZIP artifact.

Parameters

export_idrequired
stringExport job ID

Response

json
HTTP/1.1 200 OK
Content-Type: application/zip
Content-Disposition: attachment; filename="slidesync-export-html.zip"

Brand Kits

Upload brand assets — logos, color palettes, typography rules, and placement constraints. Once set, the AI enforces these as hard constraints on every deck generated in that project.

GET/v1/projects/:project_id/brand

Get the brand kit configuration for a project.

Parameters

project_idrequired
stringProject ID

Response

json
{
  "id": "brand_xyz",
  "project_id": "proj_abc123",
  "logo_url": "https://cdn.slidesync.ai/brands/logo.svg",
  "colors": {
    "primary": "#1A1A2E",
    "secondary": "#6D28FF",
    "accent": "#2FB4FF",
    "background": "#FFFFFF"
  },
  "typography": {
    "heading_font": "Inter",
    "body_font": "Inter",
    "heading_weight": 800,
    "body_weight": 400
  },
  "rules": {
    "logo_placement": "top-left",
    "logo_max_height": 32
  }
}
PUT/v1/projects/:project_id/brand

Upload or update the brand kit. Supports multipart/form-data for logo upload.

Parameters

project_idrequired
stringProject ID

Request body

json
{
  "colors": {
    "primary": "#0F172A",
    "secondary": "#3B82F6",
    "accent": "#F59E0B"
  },
  "typography": {
    "heading_font": "Satoshi",
    "body_font": "Inter"
  },
  "rules": {
    "logo_placement": "top-right",
    "logo_max_height": 28
  }
}

Response

json
{
  "id": "brand_xyz",
  "updated_at": "2026-05-19T11:30:00Z",
  "status": "active"
}
DELETE/v1/projects/:project_id/brand

Remove the brand kit from a project. Future decks will use AI-inferred styling.

Parameters

project_idrequired
stringProject ID

Response

json
{
  "deleted": true,
  "project_id": "proj_abc123"
}

Templates

Browse and apply pre-built template packs to projects. Templates provide starting structure and design direction that the AI builds upon.

GET/v1/templates

List all available templates.

Parameters

category
stringFilter by category: pitch, corporate, creative, educational

Response

json
{
  "templates": [
    {
      "id": "tmpl_startup_pitch",
      "name": "Startup Pitch",
      "category": "pitch",
      "slide_count": 12,
      "preview_url": "https://cdn.slidesync.ai/templates/startup_pitch.png",
      "description": "Clean, modern pitch deck optimized for investor meetings"
    }
  ],
  "total": 18
}
POST/v1/projects/:project_id/apply-template

Apply a template to a project. Sets design context and optional starter slides.

Parameters

project_idrequired
stringProject ID

Request body

json
{
  "template_id": "tmpl_startup_pitch",
  "include_starter_slides": true
}

Response

json
{
  "applied": true,
  "template": "tmpl_startup_pitch",
  "starter_slides_created": 12
}

Webhooks

Receive real-time notifications when async operations complete. Webhooks are sent as POST requests with a JSON payload and include a signature header for verification.

Supported events

deck.generation.completeDeck generation finished successfully
deck.generation.failedDeck generation failed
deck.iteration.completeDeck iteration finished
export.completeExport job finished, download URL available
export.failedExport job failed

Webhook payload

json
{
  "id": "evt_abc123",
  "type": "deck.generation.complete",
  "created_at": "2026-05-19T10:31:28Z",
  "data": {
    "deck_id": "deck_xyz789",
    "project_id": "proj_abc123",
    "slide_count": 10,
    "status": "complete"
  }
}

Verifying signatures

Each webhook includes a X-SlideSync-Signature header. Verify it using your webhook secret:

javascript
import crypto from 'crypto';

function verifyWebhook(payload, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}
POST/v1/webhooks

Register a webhook endpoint.

Request body

json
{
  "url": "https://yourapp.com/webhooks/slidesync",
  "events": ["deck.generation.complete", "export.complete"],
  "secret": "whsec_your_secret"
}

Response

json
{
  "id": "wh_abc123",
  "url": "https://yourapp.com/webhooks/slidesync",
  "events": ["deck.generation.complete", "export.complete"],
  "active": true,
  "created_at": "2026-05-19T12:00:00Z"
}
DELETE/v1/webhooks/:webhook_id

Remove a webhook endpoint.

Parameters

webhook_idrequired
stringWebhook ID

Response

json
{
  "deleted": true,
  "id": "wh_abc123"
}

Rate Limits

API requests are rate-limited per workspace to ensure fair usage and platform stability. Rate limit headers are included in every response.

Response headers

http
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118
X-RateLimit-Reset: 1716112800

Limits by plan

OperationFreeProEnterprise
Read operations60/min300/min1000/min
Deck generation5/min30/min100/min
Exports3/min20/min50/min
File uploads10/min60/min200/min
When you exceed the rate limit, the API returns 429 Too Many Requests with aRetry-After header indicating when you can retry.

Errors

The API uses standard HTTP status codes. Errors include a machine-readable code and human-readable message.

json
{
  "error": {
    "code": "insufficient_credits",
    "message": "Your workspace has used all available generation credits for this billing period.",
    "status": 402,
    "details": {
      "credits_used": 200,
      "credits_limit": 200,
      "upgrade_url": "https://slidesync.ai/dashboard/billing"
    }
  }
}

Error codes

400invalid_requestRequest body is malformed or missing required fields
401unauthorizedAPI key is missing, invalid, or revoked
402insufficient_creditsNo remaining credits — upgrade plan or wait for reset
403forbiddenAPI key doesn't have permission for this operation
404not_foundThe requested resource doesn't exist
409conflictResource state conflict (e.g., deck still generating)
429rate_limitedToo many requests — check Retry-After header
500internal_errorServer error — retry with exponential backoff
503service_unavailableAI generation temporarily at capacity

SDKs & Libraries

Official client libraries to get started faster. All SDKs are open-source and fully typed.

JS

Node.js / TypeScript

npm install @slidesync/sdk
typescript
import { SlideSync } from '@slidesync/sdk';

const client = new SlideSync('sk_live_your_key');

const deck = await client.decks.create('proj_abc', {
  brief: 'Q3 board presentation',
  slide_count: 12,
});

const exported = await client.exports.create(deck.id, {
  format: 'pptx',
});
PY

Python

pip install slidesync
python
from slidesync import SlideSync

client = SlideSync(api_key="sk_live_your_key")

deck = client.decks.create(
    project_id="proj_abc",
    brief="Q3 board presentation",
    slide_count=12,
)

export = client.exports.create(
    deck_id=deck.id,
    format="pptx",
)
Need help? Check out our tutorials, join the Discord community, or contact support.