SlideSync API Reference

The SlideSync API gives you programmatic access to everything you can do in the app — generate decks from briefs, manage projects, upload brand kits, iterate on slides, and export to PPTX, PDF, or Google Slides. Build custom integrations, automate deck creation, or embed SlideSync into your product.

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

Quick start

bash
curl -X POST "https://api.slidesync.ai/v1/projects/proj_abc/decks" \
  -H "Authorization: Bearer sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "brief": "Create a 10-slide investor pitch deck for a SaaS startup",
    "style": "investor-pitch",
    "slide_count": 10
  }'

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

The core of SlideSync. Generate complete presentation decks from a text brief using AI. Each generation consumes one credit from your plan quota. The AI analyzes your brief, creates a design system, assigns slide roles, and generates professional HTML slides.

POST/v1/projects/:project_id/decks

Generate a new deck from a brief. This is an async operation — poll the deck status or use webhooks.

Parameters

project_idrequired
stringProject to create the deck in

Request body

json
{
  "brief": "Create a 10-slide investor pitch for an AI startup that helps restaurants optimize their menu pricing using machine learning",
  "slide_count": 10,
  "genre": "investor-pitch",
  "style_preferences": {
    "palette": "corporate-navy",
    "font_direction": "swiss-precision"
  },
  "context_files": ["file_abc123"],
  "webhook_url": "https://yourapp.com/webhooks/slidesync"
}

Response

json
{
  "id": "deck_xyz789",
  "project_id": "proj_abc123",
  "status": "generating",
  "brief": "Create a 10-slide investor pitch...",
  "slide_count": 10,
  "genre": "investor-pitch",
  "created_at": "2026-05-19T10:30:00Z",
  "estimated_completion": "2026-05-19T10:31:30Z",
  "credits_consumed": 1
}
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 all decks in a project.

Parameters

project_idrequired
stringProject ID
status
stringFilter by status: generating, complete, failed

Response

json
{
  "decks": [
    {
      "id": "deck_xyz789",
      "title": "MenuAI — Investor Pitch",
      "status": "complete",
      "slide_count": 10,
      "version": 2,
      "created_at": "2026-05-19T10:30:00Z"
    }
  ],
  "total": 3
}
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

Export decks to PowerPoint (.pptx), PDF, or Google Slides format. Exports are async — the API returns immediately with a status URL to poll, or you can use webhooks.

POST/v1/decks/:deck_id/export

Start an export job. Supported formats: pptx, pdf, google-slides.

Parameters

deck_idrequired
stringDeck ID to export

Request body

json
{
  "format": "pptx",
  "options": {
    "embed_fonts": true,
    "include_notes": true,
    "resolution": "high"
  }
}

Response

json
{
  "id": "export_abc",
  "deck_id": "deck_xyz789",
  "format": "pptx",
  "status": "processing",
  "created_at": "2026-05-19T11:10:00Z",
  "estimated_seconds": 15
}
GET/v1/exports/:export_id

Check the status of an export job.

Parameters

export_idrequired
stringExport job ID

Response

json
{
  "id": "export_abc",
  "status": "complete",
  "format": "pptx",
  "file_size_bytes": 2847291,
  "download_url": "https://cdn.slidesync.ai/exports/export_abc.pptx",
  "expires_at": "2026-05-20T11:10:00Z"
}
GET/v1/exports/:export_id/download

Download the exported file. Returns a redirect to the CDN URL.

Parameters

export_idrequired
stringExport job ID

Response

json
HTTP/1.1 302 Found
Location: https://cdn.slidesync.ai/exports/export_abc.pptx

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.