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.
https://api.slidesync.ai/v1Quick start
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.
GET /v1/projects HTTP/1.1
Host: api.slidesync.ai
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxx
Content-Type: application/jsonAPI 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
/v1/auth/keysCreate a new API key for your workspace.
Request body
{
"name": "Production Key",
"permissions": ["read", "write", "export"],
"rate_limit_tier": "pro"
}Response
{
"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
}/v1/auth/keysList all API keys in your workspace.
Response
{
"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"]
}
]
}/v1/auth/keys/:key_idRevoke an API key. This action is immediate and irreversible.
Parameters
key_idrequiredResponse
{
"deleted": true,
"id": "key_xk2m9f"
}/v1/usageGet current billing period usage for your workspace.
Response
{
"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.
/v1/projectsList all projects in your workspace, ordered by last modified.
Parameters
limitoffsetResponse
{
"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
}/v1/projectsCreate a new project. Optionally include a brief to auto-generate design settings.
Request body
{
"name": "Product Launch Deck",
"brief": "Modern tech product launch for developer audience",
"template_id": "tmpl_startup_pitch"
}Response
{
"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"
}
}/v1/projects/:project_idGet full project details including design system, file count, and deck list.
Parameters
project_idrequiredResponse
{
"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": { ... }
}/v1/projects/:project_idUpdate project name, design settings, or configuration.
Parameters
project_idrequiredRequest body
{
"name": "Updated Project Name",
"design_settings": {
"palette": "warm-sunset",
"font_direction": "humanist-warm"
}
}Response
{
"id": "proj_abc123",
"name": "Updated Project Name",
"updated_at": "2026-05-19T11:00:00Z",
"design_settings": {
"palette": "warm-sunset",
"font_direction": "humanist-warm"
}
}/v1/projects/:project_idPermanently delete a project and all its decks, files, and exports.
Parameters
project_idrequiredResponse
{
"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.
/v1/projects/:project_id/decksDeck generation is not implemented in the public v1 API yet. This endpoint returns not_implemented after authentication and project ownership checks.
Parameters
project_idrequiredRequest body
{
"brief": "Create a 10-slide investor pitch deck"
}Response
{
"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
}
}/v1/decks/:deck_idGet deck details, status, and all slides. Slides include full HTML content.
Parameters
deck_idrequiredinclude_htmlResponse
{
"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"
}/v1/decks/:deck_id/iterateIterate on an existing deck with natural language feedback. Consumes one credit.
Parameters
deck_idrequiredRequest body
{
"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
{
"id": "deck_xyz789",
"status": "iterating",
"version": 2,
"changes": ["slide_003"],
"credits_consumed": 1
}/v1/projects/:project_id/decksList 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_idrequiredinclude_htmlResponse
{
"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
}/v1/decks/:deck_idDelete a deck and all its slide versions.
Parameters
deck_idrequiredResponse
{
"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.
/v1/decks/:deck_id/slidesList all slides in a deck with metadata.
Parameters
deck_idrequiredResponse
{
"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"
}
]
}/v1/slides/:slide_idGet a single slide with full HTML content and version history.
Parameters
slide_idrequiredResponse
{
"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" }
]
}/v1/slides/:slide_idUpdate a slide's HTML content or notes directly.
Parameters
slide_idrequiredRequest body
{
"html": "<!DOCTYPE html><html>...updated content...</html>",
"notes": "Updated speaker notes"
}Response
{
"id": "slide_001",
"version": 3,
"updated_at": "2026-05-19T11:00:00Z"
}/v1/decks/:deck_id/slides/reorderReorder slides within a deck.
Parameters
deck_idrequiredRequest body
{
"order": ["slide_001", "slide_003", "slide_002", "slide_004"]
}Response
{
"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.
/v1/decks/:deck_id/exportCreate a completed HTML ZIP export. Supported formats: html-zip, zip-html, package.
Parameters
deck_idrequiredRequest body
{
"format": "html-zip"
}Response
{
"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"]
}/v1/exports/:export_idPlanned status endpoint. Current public v1 returns a completed export and download_url from POST /v1/decks/:deck_id/export.
Parameters
export_idrequiredResponse
{
"error": {
"code": "not_implemented",
"message": "Use the download_url returned by the export creation endpoint."
}
}/v1/exports/:export_id/downloadDownload the completed HTML ZIP artifact.
Parameters
export_idrequiredResponse
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.
/v1/projects/:project_id/brandGet the brand kit configuration for a project.
Parameters
project_idrequiredResponse
{
"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
}
}/v1/projects/:project_id/brandUpload or update the brand kit. Supports multipart/form-data for logo upload.
Parameters
project_idrequiredRequest body
{
"colors": {
"primary": "#0F172A",
"secondary": "#3B82F6",
"accent": "#F59E0B"
},
"typography": {
"heading_font": "Satoshi",
"body_font": "Inter"
},
"rules": {
"logo_placement": "top-right",
"logo_max_height": 28
}
}Response
{
"id": "brand_xyz",
"updated_at": "2026-05-19T11:30:00Z",
"status": "active"
}/v1/projects/:project_id/brandRemove the brand kit from a project. Future decks will use AI-inferred styling.
Parameters
project_idrequiredResponse
{
"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.
/v1/templatesList all available templates.
Parameters
categoryResponse
{
"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
}/v1/projects/:project_id/apply-templateApply a template to a project. Sets design context and optional starter slides.
Parameters
project_idrequiredRequest body
{
"template_id": "tmpl_startup_pitch",
"include_starter_slides": true
}Response
{
"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 successfullydeck.generation.failedDeck generation faileddeck.iteration.completeDeck iteration finishedexport.completeExport job finished, download URL availableexport.failedExport job failedWebhook payload
{
"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:
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)
);
}/v1/webhooksRegister a webhook endpoint.
Request body
{
"url": "https://yourapp.com/webhooks/slidesync",
"events": ["deck.generation.complete", "export.complete"],
"secret": "whsec_your_secret"
}Response
{
"id": "wh_abc123",
"url": "https://yourapp.com/webhooks/slidesync",
"events": ["deck.generation.complete", "export.complete"],
"active": true,
"created_at": "2026-05-19T12:00:00Z"
}/v1/webhooks/:webhook_idRemove a webhook endpoint.
Parameters
webhook_idrequiredResponse
{
"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
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118
X-RateLimit-Reset: 1716112800Limits by plan
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.
{
"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
invalid_requestRequest body is malformed or missing required fieldsunauthorizedAPI key is missing, invalid, or revokedinsufficient_creditsNo remaining credits — upgrade plan or wait for resetforbiddenAPI key doesn't have permission for this operationnot_foundThe requested resource doesn't existconflictResource state conflict (e.g., deck still generating)rate_limitedToo many requests — check Retry-After headerinternal_errorServer error — retry with exponential backoffservice_unavailableAI generation temporarily at capacitySDKs & Libraries
Official client libraries to get started faster. All SDKs are open-source and fully typed.
Node.js / TypeScript
npm install @slidesync/sdkimport { 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',
});Python
pip install slidesyncfrom 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",
)