Complete REST API documentation for creating, managing, and retrieving presentations programmatically
PPT Agent provides a comprehensive REST API for programmatic access to presentation management. All endpoints include rate limiting for optimal performance and are publicly accessible.
http://localhost:3000/apihttps://your-domain.com/apiAll endpoints are publicly accessible. No authentication required.
No authentication headers required/presentationsRetrieve all presentations for the authenticated user, sorted by modification date.
[
{
"id": "my-presentation",
"name": "My Presentation",
"description": "A sample presentation",
"theme": "default",
"created": "2024-01-12T23:17:31.000Z",
"updated": "2024-01-12T23:17:31.000Z",
"slideCount": 5
}
]curl -X GET http://localhost:3000/api/presentationsArray of presentation objects
Rate limit exceeded
/presentationsCreate a new presentation with the specified configuration.
{
"name": "My New Presentation",
"description": "A presentation created via API",
"theme": "dark"
}name (string) - Presentation namedescription (string) - Presentation descriptiontheme (string) - Theme namecurl -X POST http://localhost:3000/api/presentations \
-H "Content-Type: application/json" \
-d '{
"name": "API Presentation",
"description": "Created via REST API",
"theme": "dark"
}'Created presentation object
Validation failed
Presentation already exists
/presentationsUpdate an existing presentation's metadata.
{
"id": "my-presentation",
"name": "Updated Presentation Name",
"description": "Updated description",
"theme": "light",
"slideCount": 10
}id (string) - Presentation IDname (string) - Updated namedescription (string) - Updated descriptiontheme (string) - Updated themeslideCount (number) - Updated slide countcurl -X PUT http://localhost:3000/api/presentations \
-H "Content-Type: application/json" \
-d '{
"id": "my-presentation",
"name": "Updated Name",
"description": "Updated description"
}'Updated presentation object
Validation failed
Access denied - not owner
/presentationsDelete a presentation by ID. Requires ownership verification.
id (string, required) - Presentation ID to deletecurl -X DELETE "http://localhost:3000/api/presentations?id=my-presentation"{ success: true }
Missing presentation ID
Access denied - not owner
/slidesRetrieve all slides for a specific presentation.
presentationId (string, required) - Presentation IDcurl -X GET "http://localhost:3000/api/slides?presentationId=my-presentation"Array of slide objects with id, filename, and content
Missing presentationId
/slidesCreate a new slide in a presentation. Supports all slide types including timeline, hero, stats, infographic, and more.
{
"presentationId": "my-presentation",
"type": "timeline",
"title": "2026 Roadmap",
"subtitle": "Strategic Plan",
"points": [
{ "date": "Q1 2026", "title": "Foundation" },
{ "date": "Q2 2026", "title": "Launch" }
]
}hero - Title slidetimeline - Roadmapstats - Statisticsinfographic - Visual cardsbullets - Bullet pointsquote - Quote slidesplit - Split layoutgallery - Image gallery+18 morecurl -X POST http://localhost:3000/api/slides \
-H "Content-Type: application/json" \
-d '{
"presentationId": "roadmap-2026",
"type": "timeline",
"title": "Product Roadmap",
"subtitle": "2026 Strategic Plan",
"points": [
{"date": "Q1", "title": "Foundation"},
{"date": "Q2", "title": "Launch"},
{"date": "Q3", "title": "Scale"},
{"date": "Q4", "title": "Expand"}
]
}'curl -X POST http://localhost:3000/api/slides \
-H "Content-Type: application/json" \
-d '{
"presentationId": "my-presentation",
"type": "stats",
"title": "Key Metrics",
"stats": [
{"value": "150+", "label": "Customers"},
{"value": "99.9%", "label": "Uptime"},
{"value": "50ms", "label": "Latency"}
]
}'curl -X POST http://localhost:3000/api/slides \
-H "Content-Type: application/json" \
-d '{
"presentationId": "my-presentation",
"type": "infographic",
"title": "Our Values",
"items": [
{"icon": "users", "value": "Team", "label": "50+ Engineers", "color": "#3b82f6"},
{"icon": "zap", "value": "Speed", "label": "10x Faster", "color": "#10b981"}
],
"layout": "horizontal"
}'Created slide object
Validation failed
Presentation not found
/slidesDelete a slide from a presentation by slide ID.
presentationId (string, required) - Presentation IDslideId (string, required) - Slide ID to deletecurl -X DELETE "http://localhost:3000/api/slides?presentationId=my-presentation&slideId=01-my-slide"{ success: true }
Missing parameters
Slide not found
{
"error": "Validation failed",
"details": [
"name: Name is required",
"description: Description must be 500 characters or less"
]
}{
"error": "Unauthorized"
}import fetch from 'node-fetch';
class VisionDeckAPI {
constructor(baseUrl) {
this.baseUrl = baseUrl;
this.headers = {
'Content-Type': 'application/json'
};
}
async listPresentations() {
const response = await fetch(`${this.baseUrl}/presentations`, {
headers: this.headers
});
return response.json();
}
async createPresentation(data) {
const response = await fetch(`${this.baseUrl}/presentations`, {
method: 'POST',
headers: this.headers,
body: JSON.stringify(data)
});
return response.json();
}
async updatePresentation(id, data) {
const response = await fetch(`${this.baseUrl}/presentations`, {
method: 'PUT',
headers: this.headers,
body: JSON.stringify({ id, ...data })
});
return response.json();
}
async deletePresentation(id) {
const response = await fetch(`${this.baseUrl}/presentations?id=${id}`, {
method: 'DELETE',
headers: this.headers
});
return response.json();
}
}
// Usage
const api = new VisionDeckAPI('http://localhost:3000/api');
// Create a presentation
const presentation = await api.createPresentation({
name: 'My API Presentation',
description: 'Created via JavaScript API'
});
console.log('Created:', presentation);
// --- Slides API ---
async listSlides(presentationId) {
const response = await fetch(`${this.baseUrl}/slides?presentationId=${presentationId}`, {
headers: this.headers
});
return response.json();
}
async createSlide(data) {
const response = await fetch(`${this.baseUrl}/slides`, {
method: 'POST',
headers: this.headers,
body: JSON.stringify(data)
});
return response.json();
}
async deleteSlide(presentationId, slideId) {
const response = await fetch(`${this.baseUrl}/slides?presentationId=${presentationId}&slideId=${slideId}`, {
method: 'DELETE',
headers: this.headers
});
return response.json();
}
// Create a timeline slide (great for roadmaps from Google Sheets!)
const timelineSlide = await api.createSlide({
presentationId: 'my-roadmap',
type: 'timeline',
title: '2026 Product Roadmap',
subtitle: 'Strategic Plan',
points: [
{ date: 'Q1 2026', title: 'Foundation' },
{ date: 'Q2 2026', title: 'Launch' },
{ date: 'Q3 2026', title: 'Scale' },
{ date: 'Q4 2026', title: 'Expand' }
]
});
console.log('Created slide:', timelineSlide.id);import requests
import json
class VisionDeckAPI:
def __init__(self, base_url):
self.base_url = base_url
self.headers = {
'Content-Type': 'application/json'
}
def list_presentations(self):
response = requests.get(f'{self.base_url}/presentations', headers=self.headers)
response.raise_for_status()
return response.json()
def create_presentation(self, name, description=None, theme=None):
data = {'name': name}
if description:
data['description'] = description
if theme:
data['theme'] = theme
response = requests.post(f'{self.base_url}/presentations',
headers=self.headers,
json=data)
response.raise_for_status()
return response.json()
def update_presentation(self, presentation_id, **kwargs):
data = {'id': presentation_id, **kwargs}
response = requests.put(f'{self.base_url}/presentations',
headers=self.headers,
json=data)
response.raise_for_status()
return response.json()
def delete_presentation(self, presentation_id):
response = requests.delete(f'{self.base_url}/presentations?id={presentation_id}',
headers=self.headers)
response.raise_for_status()
return response.json()
# Usage
api = VisionDeckAPI('http://localhost:3000/api')
# Create a presentation
presentation = api.create_presentation(
name='Python API Presentation',
description='Created via Python API',
theme='dark'
)
print(f"Created: {presentation['id']}")
# --- Slides API ---
def list_slides(self, presentation_id):
response = requests.get(f'{self.base_url}/slides?presentation_id={presentation_id}',
headers=self.headers)
response.raise_for_status()
return response.json()
def create_slide(self, presentation_id, slide_type, title, **kwargs):
data = {
'presentationId': presentation_id,
'type': slide_type,
'title': title
}
data.update(kwargs)
response = requests.post(f'{self.base_url}/slides',
headers=self.headers,
json=data)
response.raise_for_status()
return response.json()
def delete_slide(self, presentation_id, slide_id):
response = requests.delete(f'{self.base_url}/slides?presentation_id={presentation_id}&slide_id={slide_id}',
headers=self.headers)
response.raise_for_status()
return response.json()
# Create a timeline slide from Google Sheets data
timeline_slide = api.create_slide(
presentation_id='my-roadmap',
slide_type='timeline',
title='2026 Product Roadmap',
subtitle='Strategic Plan',
points=[
{'date': 'Q1 2026', 'title': 'Foundation'},
{'date': 'Q2 2026', 'title': 'Launch'},
{'date': 'Q3 2026', 'title': 'Scale'},
{'date': 'Q4 2026', 'title': 'Expand'}
]
)
print(f"Created slide: {timeline_slide['id']}")# List presentations
curl -X GET http://localhost:3000/api/presentations
# Create presentation
curl -X POST http://localhost:3000/api/presentations \
-H "Content-Type: application/json" \
-d '{
"name": "cURL Presentation",
"description": "Created via cURL"
}'
# Update presentation
curl -X PUT http://localhost:3000/api/presentations \
-H "Content-Type: application/json" \
-d '{
"id": "curl-presentation",
"name": "Updated cURL Presentation"
}'
# Delete presentation
curl -X DELETE "http://localhost:3000/api/presentations?id=curl-presentation"
# --- Slides API ---
# List slides in a presentation
curl -X GET "http://localhost:3000/api/slides?presentationId=my-presentation"
# Create a timeline slide (roadmap from Google Sheets!)
curl -X POST http://localhost:3000/api/slides \
-H "Content-Type: application/json" \
-d '{
"presentationId": "my-roadmap",
"type": "timeline",
"title": "2026 Product Roadmap",
"subtitle": "Strategic Plan",
"points": [
{"date": "Q1 2026", "title": "Foundation"},
{"date": "Q2 2026", "title": "Launch"},
{"date": "Q3 2026", "title": "Scale"},
{"date": "Q4 2026", "title": "Expand"}
]
}'
# Create a stats slide
curl -X POST http://localhost:3000/api/slides \
-H "Content-Type: application/json" \
-d '{
"presentationId": "my-presentation",
"type": "stats",
"title": "Key Metrics",
"stats": [
{"value": "150+", "label": "Customers"},
{"value": "99.9%", "label": "Uptime"},
{"value": "50ms", "label": "Latency"}
]
}'
# Delete a slide
curl -X DELETE "http://localhost:3000/api/slides?presentationId=my-presentation&slideId=01-my-slide"Use standard HTTP methods: GET (read), POST (create), PUT (update), DELETE (delete)
Always handle 4xx and 5xx responses gracefully with appropriate user feedback
Implement retry logic with exponential backoff when hitting rate limits
For more information, visit our user guide or check out the GitHub repository for additional examples and documentation.