Present API Documentation

The Present API enables dynamic generation of PowerPoint presentations and PDFs from templates.

Base URL

Production: https://apim-public-api.azure-api.net/api/v2/present
Test: https://apim-public-api-test.azure-api.net/api/v2/present

Authentication

All API requests require OAuth2 authentication using Azure AD:

Authorization: Bearer <access_token>
Ocp-Apim-Subscription-Key: <subscription_key>

Endpoints

Slides

Create Slide Deck

Create a new PowerPoint presentation.

POST /slides

Request Body:

{
  "template": "template-name",
  "slides": [
    {
      "slideId": "slide-1",
      "data": {
        "title": "Meeting Overview",
        "content": "Dynamic content"
      }
    }
  ]
}

Response: PowerPoint file download

Generate Slide Content

Generate slide content with dynamic data.

POST /slides/generate

Request Body:

{
  "template": "template-name",
  "data": {
    "customerName": "Company Name",
    "meetingDate": "2025-08-20",
    "advisorName": "John Doe"
  }
}

Response: Content response with generated data

Convert to PDF

Convert slides to PDF format. Supports both JSON and file upload.

JSON Request:

POST /slides/pdf
Content-Type: application/json
{
  "slideLocation": "path-to-slides",
  "options": {
    "handoutMode": false,
    "notesPages": false
  }
}

File Upload:

POST /slides/pdf
Content-Type: multipart/form-data

Response: PDF file or download URL

Templates

List All Templates

Retrieve all available presentation templates.

GET /templates

Response: Array of SlideTemplate objects

Get Template Details

Get details for a specific template.

GET /templates/{name}

Response: SlideTemplateDetails object

Upload Template

Upload a new presentation template. Supports both JSON and file upload.

JSON Upload:

POST /templates
Content-Type: application/json
{
  "contentId": "template-content-id",
  "name": "Template Name",
  "category": "Business"
}

File Upload:

POST /templates
Content-Type: multipart/form-data

Form fields:

  • file: Template file (PowerPoint)
  • name: Template name
  • category: Template category

Response: SlideTemplateDetails object

Delete Template

Delete a template.

DELETE /templates/{name}

Response: 200 OK on success

Validate Template

Validate template structure and tags. Supports both JSON and file upload.

JSON Validation:

POST /templates/validation
Content-Type: application/json
{
  "contentId": "template-content-id"
}

File Validation:

POST /templates/validation
Content-Type: multipart/form-data

Form field:

  • file: Template file to validate

Response: Array of ValidationResult objects

Get Template Slides

Get all slides from a template as images.

GET /templates/{name}/slides

Response: SlideImagesResponse with slide images

Get Specific Template Slide

Get a specific slide from a template.

GET /templates/{templateName}/slides/{slideName}

Response: Image URL for the specific slide

Data Models

SlideTemplate

{
  "uri": "template-uri",
  "name": "Template Name",
  "customerType": "Business",
  "tenantId": "tenant-uuid",
  "ownerId": "owner-uuid"
}

SlideTemplateDetails

{
  "uri": "template-uri",
  "name": "Template Name", 
  "customerType": "Business",
  "tenantId": "tenant-uuid",
  "ownerId": "owner-uuid",
  "tags": [
    {
      "name": "customer_name",
      "description": "Customer company name"
    }
  ],
  "sections": [
    {
      "name": "Introduction",
      "slides": ["slide-1", "slide-2"]
    }
  ]
}

ValidationResult

{
  "type": "Error|Warning|Info",
  "message": "Validation message",
  "location": "slide-1",
  "details": {}
}

Code Examples

JavaScript/Node.js

const ACCESS_TOKEN = 'your-access-token';
const SUBSCRIPTION_KEY = 'your-subscription-key';
const BASE_URL = 'https://apim-public-api.azure-api.net/api/v2/present';

// Create presentation
async function createPresentation(templateData) {
  const response = await fetch(`${BASE_URL}/slides`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${ACCESS_TOKEN}`,
      'Ocp-Apim-Subscription-Key': SUBSCRIPTION_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(templateData)
  });
  
  return response.blob(); // PowerPoint file
}

// List templates
async function listTemplates() {
  const response = await fetch(`${BASE_URL}/templates`, {
    headers: {
      'Authorization': `Bearer ${ACCESS_TOKEN}`,
      'Ocp-Apim-Subscription-Key': SUBSCRIPTION_KEY
    }
  });
  
  return response.json();
}

cURL

# List templates
curl -X GET "https://apim-public-api.azure-api.net/api/v2/present/templates" \
  -H "Authorization: Bearer your-access-token" \
  -H "Ocp-Apim-Subscription-Key: your-subscription-key"

# Upload template (file)
curl -X POST "https://apim-public-api.azure-api.net/api/v2/present/templates" \
  -H "Authorization: Bearer your-access-token" \
  -H "Ocp-Apim-Subscription-Key: your-subscription-key" \
  -H "Content-Type: multipart/form-data" \
  -F "file=@template.pptx" \
  -F "name=Business Template" \
  -F "category=Business"

# Generate slides
curl -X POST "https://apim-public-api.azure-api.net/api/v2/present/slides/generate" \
  -H "Authorization: Bearer your-access-token" \
  -H "Ocp-Apim-Subscription-Key: your-subscription-key" \
  -H "Content-Type: application/json" \
  -d '{
    "template": "business-template",
    "data": {
      "customerName": "Acme Corp",
      "meetingDate": "2025-09-15"
    }
  }'

Full API Specification

For the complete API specification including all endpoints, parameters, and response schemas: