Overview
The pptx.dev API lets you generate .pptx files programmatically with a single HTTP request. This guide walks you through making your first API call and building a complete presentation.
Prerequisites
- A pptx.dev API key (get one free)
- Any HTTP client (
curl,fetch, Pythonrequests, etc.)
Step 1: Authenticate
All API requests require a Bearer token in the Authorization header:
Authorization: Bearer YOUR_API_KEY
Step 2: Pick Your Building Blocks
Every presentation is composed of building blocks from the pptx.gallery:
| Block | What it controls |
|---|---|
| Layout | Slide structure and content zones |
| Color scheme | Brand colors across all slides |
| Font scheme | Heading and body typefaces |
| Narrative | Story arc (intro → insight → call-to-action) |
| Theme | Combined color + font preset |
Browse the gallery to find the slugs you need before writing your request body.
Step 3: Make Your First API Call
curl -X POST https://api.pptx.dev/v1/presentations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"$schema": "https://openpresentation.org/schema/opf/v1",
"name": "Q1 Business Review",
"slides": [
{
"layout": "title-subtitle",
"title": "Q1 Business Review",
"subtitle": "January – March 2026"
},
{
"layout": "text-2x",
"title": "Key Highlights",
"blocks": [{"text": "Revenue up 24% YoY"}, {"text": "NPS score: 72"}]
}
],
"narrative": "problem-solution",
"design": {
"colorScheme": "cobalt",
"fontScheme": "inter-plus-merriweather"
}
}'
The response returns a download URL for the generated .pptx file.
Step 4: Download the File
curl -o presentation.pptx "https://files.pptx.dev/..."
Open it in PowerPoint or Google Slides — fully editable, no watermarks.
Step 5: Integrate into Your App
Here is the same call using the Node.js fetch API:
const response = await fetch("https://api.pptx.dev/v1/presentations", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PPTX_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "My Presentation",
colorScheme: "cobalt",
fontScheme: "inter-plus-merriweather",
slides: [
{
layout: "title-hero",
content: { heading: "Hello World" },
},
],
}),
});
const { downloadUrl } = await response.json();
Next Steps
- Browse all layouts to find the right slide structures
- Explore color schemes for brand matching
- Check narratives for structured story arcs