Generate Presentation
Generate presentations (PPTX, PDF, or Google Slides) using the Pluslide API. Supports both synchronous and asynchronous modes.
Endpoint
POST /v1/project/export
Content-Type: application/json
Authorization: Bearer YOUR_API_KEYRequest Body
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID |
presentation | object | Yes | Presentation content |
presentation.slideList | array | Yes | List of slides |
presentation.slideList[].templateKey | string | Yes | Template identifier |
presentation.slideList[].content | object | Yes | Field data in key-value format. The structure depends on the fields defined in the selected template. These fields are customizable and controlled by the user |
presentation.slideList[].attributes | object | No | Slide attributes |
presentation.slideList[].attributes.speakerNote | string | No | Speaker notes |
presentation.slideList[].attributes.hidden | boolean | No | Whether to hide this slide |
presentation.slideList[].attributes.slideNumber | object or boolean | No | Slide number settings |
presentation.attributes | object | No | Presentation attributes |
presentation.attributes.title | string | No | Presentation title |
presentation.attributes.author | string | No | Author name |
presentation.attributes.company | string | No | Company name |
presentation.attributes.subject | string | No | Presentation subject |
options | object | No | Export options |
options.format | string | No | Export format: pptx (default), pdf, or google-slides |
options.compressImages | boolean | No | Whether to compress images (default: true) |
options.embedFonts | boolean | No | Whether to embed fonts for consistent rendering across devices (default: true) |
options.async | boolean | No | Enable async mode to return immediately with task ID (default: false). See Export Options for details. |
options.dev | boolean | No | Enable development mode for testing without consuming quota (default: false). See Development Mode for details. |
Slide Number Settings
If slideNumber is an object, it supports the following properties:
| Property | Type | Required | Description |
|---|---|---|---|
x | number | Yes | X-position (0.0 to 1.0) |
y | number | Yes | Y-position (0.0 to 1.0) |
color | string | No | Text color (e.g., "#333333") |
fontSize | number | No | Font size in points |
Example
If you are unsure about what to include in the slideList, you can go to the Playground page to test it out.
{
"projectId": "proj_123456",
"presentation": {
"slideList": [
{
"templateKey": "title-slide",
"content": {
"title": "Annual Report 2025",
"subtitle": "Financial Performance Overview"
},
"attributes": {
"speakerNote": "Welcome everyone to our annual report presentation."
}
},
{
"templateKey": "bullet-list",
"content": {
"title": "Key Achievements",
"bullets": [
"Increased revenue by 25%",
"Expanded to 3 new markets",
"Launched 5 new products"
]
},
"attributes": {
"slideNumber": {
"x": 0.95,
"y": 0.95,
"color": "#333333",
"fontSize": 12
}
}
},
{
"templateKey": "chart-slide",
"content": {
"title": "Revenue Growth",
"chartData": {
"labels": ["Q1", "Q2", "Q3", "Q4"],
"values": [1.2, 1.8, 2.3, 2.9]
}
},
"attributes": {
"hidden": false
}
}
],
"attributes": {
"title": "Annual Report 2025",
"author": "Finance Team",
"company": "Acme Corporation",
"subject": "Financial Performance"
}
}
}Response
Synchronous Mode (default)
A successful request returns a JSON object with the URL:
{
"url": "https://storage.example.com/presentations/presentation-123456.pptx"
}| Field | Type | Description |
|---|---|---|
url | string | For PPTX/PDF: Direct download URL. For Google Slides: Edit URL of the file. |
Google Slides
When using google-slides format:
- The returned
urlis an edit link — anyone with the link can edit the presentation - The file is stored in Pluslide's Google Drive and will be automatically deleted based on your plan's retention policy (same as PPTX/PDF)
- Important: Copy the presentation to your own Google Drive before the expiration to keep it permanently
Async Mode
When options.async is true, the response contains only the task ID:
{
"id": 12345
}| Field | Type | Description |
|---|---|---|
id | number | Task ID. Use GET /v1/presentation/:id to check the status and get the result. |
Code Examples
cURL
curl -X POST "https://api.pluslide.com/v1/project/export" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"projectId": "proj_123456",
"presentation": {
"slideList": [
{
"templateKey": "title-slide",
"content": {
"title": "Annual Report 2025",
"subtitle": "Financial Overview"
}
}
]
}
}'JavaScript
const response = await fetch('https://api.pluslide.com/v1/project/export', {
method: 'POST',
headers: {
Authorization: `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
projectId: 'proj_123456',
presentation: {
slideList: [
{
templateKey: 'title-slide',
content: {
title: 'Annual Report 2025',
subtitle: 'Financial Overview',
},
},
],
},
}),
});
// Handle HTTP errors (4xx/5xx)
if (!response.ok) {
const error = await response.json();
throw new Error(`${error.error}: ${error.message} (requestId: ${error.requestId})`);
}
const { url } = await response.json();
// url is the direct download link to the PPTX fileError Responses
| Status | Code | Description |
|---|---|---|
400 | INVALID_REQUEST | Missing or invalid request body |
401 | UNAUTHORIZED | Invalid or missing API key |
403 | INSUFFICIENT_CREDITS | Not enough credits |
404 | PROJECT_NOT_FOUND | Project ID doesn't exist |
404 | TEMPLATE_NOT_FOUND | Template key doesn't exist |
429 | RATE_LIMIT_EXCEEDED | Too many requests |
Authentication
Learn how to authenticate with the Pluslide API using API keys. Includes setup instructions, security best practices, and code examples.
Get Presentation
API endpoint to check the status of an async PPTX export task and retrieve the download URL. Includes polling strategies and response examples.
