Generate PowerPoint Presentations Programmatically: Poesius REST API Guide

2026-04-17·by Poesius Team

Generate PowerPoint Presentations Programmatically: Poesius REST API Guide

Poesius's REST API enables teams to embed consulting-grade presentation generation into their own applications, data pipelines, and automated workflows. If your use case requires generating PPTX files programmatically—from a CRM, a reporting system, a data pipeline, or a custom application—the Poesius API provides the generation capability without requiring a human in the loop.

API Overview

Base URL: https://poe.poesius.com/api/v1

Authentication: Bearer token (API key from https://app.poesius.com)

Output format: .pptx (Microsoft PowerPoint)

Processing model: Asynchronous (submit → poll status → download)

The API accepts text documents, structured content, and data tables as input. It generates fully formatted, brand-compliant PowerPoint presentations using your configured templates.

Full reference: https://docs.poesius.com/

Authentication

All API calls require an Authorization header with your Poesius API key:

Authorization: Bearer your-api-key-here
Content-Type: application/json

Obtain your API key from https://app.poesius.com → Settings → API Keys.

Core Endpoints

POST /generate

Submit a document for presentation generation.

Request:

{
  "content": "string (document text, markdown, or structured outline)",
  "template_id": "string (from GET /templates)",
  "slide_count": 15,
  "narrative_style": "pyramid_principle",
  "options": {
    "include_executive_summary": true,
    "action_titles": true,
    "language": "en"
  }
}

Response:

{
  "job_id": "job_abc123",
  "status": "processing",
  "estimated_completion_seconds": 45
}

GET /status/{job_id}

Poll generation status.

Response:

{
  "job_id": "job_abc123",
  "status": "complete",
  "slide_count": 15,
  "created_at": "2026-04-18T10:00:00Z",
  "completed_at": "2026-04-18T10:00:47Z"
}

Status values: queued, processing, complete, error

GET /download/{job_id}

Download the completed PPTX file. Returns a signed URL with 24-hour expiry.

Response:

{
  "download_url": "https://poe.poesius.com/files/job_abc123.pptx?token=...",
  "expires_at": "2026-04-19T10:00:47Z",
  "file_size_bytes": 2847392
}

GET /templates

List available templates for the authenticated account.

Response:

{
  "templates": [
    {
      "id": "consulting-standard",
      "name": "Consulting Standard",
      "description": "McKinsey-style consulting template",
      "slide_masters": 12
    }
  ]
}

Code Examples

Python (simple generation)

import requests
import time

API_KEY = "your-api-key"
BASE_URL = "https://poe.poesius.com/api/v1"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# 1. Submit generation job
content = """
Company X Market Entry Analysis
 
Key recommendation: Enter the APAC market in Q3 2026, starting with Singapore and Australia.

Supporting analysis:
1. Market opportunity: APAC B2B SaaS market growing 28% CAGR through 2028; Company X addressable market is $2.3B
2. Competitive window: Major competitors have limited APAC presence; 12-18 month advantage available
3. Financial model: Payback period of 2.8 years at conservative assumptions; IRR of 34%

Recommended entry approach: Partnership model with local resellers in Singapore and Sydney.
"""

response = requests.post(
    f"{BASE_URL}/generate",
    headers=headers,
    json={
        "content": content,
        "template_id": "consulting-standard",
        "slide_count": 12,
        "narrative_style": "pyramid_principle"
    }
)

job_id = response.json()["job_id"]

# 2. Poll for completion
while True:
    status_response = requests.get(
        f"{BASE_URL}/status/{job_id}",
        headers=headers
    )
    status = status_response.json()["status"]
    
    if status == "complete":
        break
    elif status == "error":
        raise Exception("Generation failed")
    
    time.sleep(5)

# 3. Get download URL
download_response = requests.get(
    f"{BASE_URL}/download/{job_id}",
    headers=headers
)
download_url = download_response.json()["download_url"]

# 4. Download the file
pptx_response = requests.get(download_url)
with open("presentation.pptx", "wb") as f:
    f.write(pptx_response.content)

print("Presentation downloaded: presentation.pptx")

JavaScript/Node.js

Get Poesius for Free

  • Create professional presentations 5x faster than manual formatting

  • Get custom-designed slides built from the ground up, not templates

  • Start free with no credit card required

const fetch = require('node-fetch');
const fs = require('fs');

const API_KEY = process.env.POESIUS_API_KEY;
const BASE_URL = 'https://poe.poesius.com/api/v1';

const headers = {
  'Authorization': `Bearer ${API_KEY}`,
  'Content-Type': 'application/json'
};

async function generatePresentation(content, templateId = 'consulting-standard') {
  // Submit
  const submitRes = await fetch(`${BASE_URL}/generate`, {
    method: 'POST',
    headers,
    body: JSON.stringify({ content, template_id: templateId, slide_count: 12 })
  });
  const { job_id } = await submitRes.json();
  
  // Poll
  while (true) {
    await new Promise(r => setTimeout(r, 5000));
    const statusRes = await fetch(`${BASE_URL}/status/${job_id}`, { headers });
    const { status } = await statusRes.json();
    if (status === 'complete') break;
    if (status === 'error') throw new Error('Generation failed');
  }
  
  // Download
  const downloadRes = await fetch(`${BASE_URL}/download/${job_id}`, { headers });
  const { download_url } = await downloadRes.json();
  
  const fileRes = await fetch(download_url);
  const buffer = await fileRes.buffer();
  fs.writeFileSync('presentation.pptx', buffer);
  
  return 'presentation.pptx';
}

generatePresentation(yourContent).then(path => console.log(`Saved: ${path}`));

Common Integration Patterns

Pattern 1: CRM-triggered presentation generation

When a deal reaches a specific stage in Salesforce/HubSpot, automatically generate a tailored proposal deck:

  1. CRM webhook fires on deal stage change
  2. Your automation fetches deal context (company, pain points, pricing)
  3. Calls Poesius API with deal context as content input
  4. Generated PPTX uploaded to CRM or sent to sales rep

Pattern 2: Scheduled reporting

Weekly or monthly performance reports generated automatically:

  1. Cron job pulls metrics from analytics platforms
  2. Formats metrics as structured content with narrative context
  3. Calls Poesius API to generate presentation
  4. Emails report to stakeholders or uploads to shared drive

Pattern 3: AI agent workflow

AI agent (Claude, GPT-4, Gemini) uses Poesius as a tool:

  1. Agent receives user request: "Create a competitive analysis presentation for ACME Corp"
  2. Agent gathers data (web search, internal knowledge base)
  3. Agent calls Poesius API with synthesized research
  4. Agent returns download link to user

(For AI agent integrations, the MCP integration is often more convenient than direct REST API calls.)

Pattern 4: Document-to-presentation conversion

Convert existing documents (PDF, Word, markdown) to presentations:

  1. Extract text from source document
  2. Submit to Poesius API with appropriate template and narrative style
  3. Download generated PPTX

Error Handling

Common error codes:

| Code | Meaning | Resolution | |------|---------|-----------| | 401 | Invalid API key | Check API key in account settings | | 400 | Invalid request | Verify request body schema | | 404 | Template not found | Use GET /templates to list valid template IDs | | 429 | Rate limit exceeded | Implement exponential backoff; contact for limit increase | | 500 | Generation error | Retry; contact support if persistent |

Rate Limits

Rate limits depend on your Poesius plan:

  • Individual: 10 generations/hour
  • Team: 50 generations/hour
  • Enterprise: Custom limits

Implement exponential backoff for 429 responses: wait 2^retry_count seconds between retries (max 32 seconds).

Frequently Asked Questions

Can I specify the exact slide titles and content for each slide?

The API accepts both fully structured input (specifying each slide's content) and unstructured input (a document that Poesius structures into slides automatically). For fully structured input, format your content as a slide outline with headings for each slide.

How do I include charts with specific data?

Include data tables in your content input, formatted as markdown tables or JSON. Specify the desired chart type in the narrative (e.g., "The following data should be shown as a waterfall chart: [data table]"). Poesius interprets the chart type specification and data.

Is there a maximum content length?

The API accepts documents up to 100,000 characters (~20,000 words). For larger documents, consider extracting the most relevant sections before submission.

Can I pass a binary PowerPoint file as the template?

Templates are managed in your Poesius account at app.poesius.com. Upload your PowerPoint template file through the web interface; it becomes available as a template_id in the API.

Get Poesius for Free

  • Create professional presentations 5x faster than manual formatting

  • Get custom-designed slides built from the ground up, not templates

  • Start free with no credit card required