API Platform

Get started in 3 steps

Register the MCP server and install Skills. Then just tell your AI agent to create a presentation — PowerPoint is generated automatically.

Get started
terminal
1# 1. MCP サーバーを登録
2claude mcp add --transport http html2pptx https://html2pptx.app/mcp
3
4# 2. Skills をインストール(--yes で Claude Code 対応)
5npx skills add https://html2pptx.app --yes
6
7# 3. あとは自然言語で指示するだけ
8# 「この会議メモからプレゼンを作って」
9# → エージェントが自動で HTML 生成 → PPTX 変換

Service Overview

What is html2pptx.app

html2pptx.app converts your HTML and CSS into fully editable PowerPoint files -- not screenshots. Your text stays editable, layouts are preserved, and CSS properties like Flexbox, Grid, gradients, and shadows are faithfully reproduced. The result is a production-ready presentation file.

Architecture

html2pptx.app follows a four-stage pipeline that separates concerns for reliability and scalability:

Client
Step 01
Client
Your application, agent, or script sends HTML/CSS via REST API. Any language or platform that can make HTTP requests works.
API Gateway
Step 02
API Gateway
Handles authentication (Bearer / X-API-Key), rate limiting per plan tier, request validation, and the initial job creation request.
Durable Queue
Step 03
Durable Queue
Job metadata is stored in Convex, large request payloads are stored in object storage, and Cloud Tasks can dispatch processing without losing jobs on worker restart.
Private Worker
Step 04
Private Worker
The private renderer loads the saved job, converts your HTML/CSS into a fully editable PowerPoint file, and updates the durable job state as it progresses.
PPTX Output
Step
PPTX Output
The generated PowerPoint file is uploaded to cloud storage and a time-limited signed URL is returned for download. Files are retained for 24 hours.

Three Integration Channels

REST API

Standard HTTP endpoints for creating export jobs and polling status. Best for backend integrations, internal tools, and SaaS embedding. Works with any language -- curl, JavaScript, Python, Go, Ruby, and more.

Skills

Register a skill definition for agent tools like Claude Code and Codex. The agent can diagnose, rewrite, and export slide-safe HTML. Ideal for AI-powered workflows where the agent manages the full pipeline.

MCP (Model Context Protocol)

Expose the conversion backend to AI agents via the MCP protocol. Use either the local stdio server or the remote HTTP endpoint at /mcp. Enables natural-language-driven PPTX generation with the same job lifecycle as the REST API.

How html2pptx.app Compares

Featurehtml2pptx.appTypical alternatives
Conversion methodFully editable PowerPoint outputScreenshot/raster image per slide
Text editabilityFully editable text boxesFlat image -- no text editing
CSS supportFlexbox, Grid, gradients, shadows, transformsLimited or none
SVG handlingConverted to high-quality PNG imagesConverted to PNG
File sizeUsually compact, depends on embedded imageryLarge (embedded images)
Font embeddingAutomatic web font embeddingNot supported

Supported CSS Features

CategorySupported properties
Layoutdisplay: flex, display: grid, position: absolute/relative, gap, align-items, justify-content
Box Modelpadding, margin, width, height, box-sizing, overflow: hidden
Backgroundbackground-color, linear-gradient(), radial-gradient(), background-image (URL/base64)
Borderborder, border-radius (including per-corner), border-color, border-width
Shadowbox-shadow (single and multiple), text-shadow
Typographyfont-family, font-size, font-weight, color, text-align, line-height, letter-spacing
Transformtransform: rotate(), scale(), translate(), skew()
Visualopacity, visibility, z-index, object-fit

Use Cases

  • Automated report generation from live data sources
  • Agent-powered presentation creation from text prompts
  • Internal tool integration for recurring slide decks
  • SaaS export feature embedding (dashboard-to-PPTX)
  • Brand-compliant template population
  • Meeting notes to presentation conversion via AI agents

Supported Features

  • SVGs are converted to high-quality images for reliable output
  • Automatic web font embedding (Google Fonts, custom fonts)
  • Flexbox and CSS Grid layout support with faithful PowerPoint reproduction
  • Gradients, shadows, and border-radius faithfully reproduced in PowerPoint
  • Base64 and URL image handling with automatic optimization
  • Explicit slide canvases with custom width/height/layout support. 1600x900px (13.333in x 7.5in) remains the default example
  • Multi-slide support (each .slide element becomes one PPTX slide)
  • Japanese font support (Noto Sans JP, Yu Gothic, Meiryo)
  • Hosted Studio and hosted web export for manual use in the browser

Quick Start

Your first authenticated export in 4 steps

The REST API is asynchronous: create a job, poll status, then decode the returned fileBase64 when the job is completed.

1

Sign Up

Create an account at html2pptx.app. Free Preview lets you validate output quality, and Founder Beta unlocks API keys for real API usage.

2

Get API Key

Navigate to the Dashboard and click "Create API Key". Copy and store it securely -- it will only be shown once. Your key starts with sk_live_ and should be treated as a secret.

3

Send First Request

POST your HTML slide content to /api/export/jobs with your API key in the Authorization header. The API returns a jobId that you can use to track the export.

4

Download PPTX

Poll GET /api/export/jobs/{jobId} until status is "completed" (typically 5-15 seconds). The response includes a downloadUrl for the PPTX file. Use responseFormat: "base64" if you need the file content inline.

Code Examples

1curl -X POST https://html2pptx.app/api/export/jobs \
2  -H "Authorization: Bearer sk_live_xxxx" \
3  -H "Content-Type: application/json" \
4  -H "Idempotency-Key: my-unique-request-id-123" \
5  -d '{
6    "fileName": "quarterly-review.pptx",
7    "html": "<section class=\"slide\" style=\"width: 1600px;height: 900px;padding: 64px\"><h1>Hello</h1><p>Generated via API</p></section>",
8    "css": ".slide { font-family: Arial, sans-serif; background: #fff; }",
9    "autoEmbedFonts": false,
10    "responseFormat": "url",
11    "metadata": {
12      "channel": "api",
13      "source": "docs-quickstart"
14    }
15  }'
16
17# Response (200 OK):
18# {
19#   "jobId": "5d934729-a0db-4aa9-bc65-e7a3e7e52b32",
20#   "status": "queued",
21#   "createdAt": "2026-04-02T10:30:00Z",
22#   "fileName": "quarterly-review.pptx",
23#   "slideCount": 1
24# }
25# Response headers include: x-request-id: req_abc123...
26
27# Poll for completion:
28curl -s https://html2pptx.app/api/export/jobs/5d934729-a0db-4aa9-bc65-e7a3e7e52b32 \
29  -H "Authorization: Bearer sk_live_xxxx"
30
31# Response (200 OK, when completed with responseFormat "url"):
32# {
33#   "jobId": "5d934729-a0db-4aa9-bc65-e7a3e7e52b32",
34#   "status": "completed",
35#   "createdAt": "2026-04-02T10:30:00Z",
36#   "completedAt": "2026-04-02T10:30:12Z",
37#   "fileName": "quarterly-review.pptx",
38#   "slideCount": 1,
39#   "mimeType": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
40#   "downloadUrl": "https://storage.example.com/quarterly-review.pptx?token=..."
41# }

API Reference

Connection Details

Base URL: Base URL: https://html2pptx.app

Content-Type: All request and response bodies use application/json. The create endpoint accepts top-level html/css/fileName fields plus optional width/height/layout controls; there is no nested payload wrapper.

Authentication

All commercial API endpoints require authentication. Include your API key in one of the following headers. Keys are scoped per environment (test vs. production) and can be rotated from the Dashboard.

AuthorizationBearer sk_live_xxxxRecommended -- standard Bearer token format used by most HTTP clients and libraries
X-API-Keysk_live_xxxxAlternative header for environments where Authorization is reserved (e.g., API gateways, proxies)

Job Lifecycle Notes

  • POST /api/export/jobs returns immediately with a queued job descriptor. It does not block until the PPTX is finished.
  • Use the public status route at GET /api/export/jobs/{jobId}. Do not rely on any upstream worker URL that may appear in internal payloads.
  • The completed REST response currently includes fileBase64 and mimeType. Decode fileBase64 to write the PPTX to disk or return it to the browser.
  • Job ownership is bound to the API key or authenticated MCP principal that created the job. A different key cannot read the same jobId.
  • Slide count is derived server-side from sanitized .slide roots. Client-provided counts are ignored for enforcement.

Rate Limiting

Every REST API response includes headers that describe your current per-minute window, daily limit, and monthly fair-use status. Limits are enforced per API key for REST calls and per authenticated principal for remote MCP calls.

HeaderDescription
x-request-idUnique request identifier included in every API response. Useful for debugging and when contacting support.
X-Plan-IdThe effective plan ID applied to the request.
X-RateLimit-LimitMaximum requests allowed in the current one-minute window.
X-RateLimit-RemainingRequests remaining in the current window.
Retry-AfterSeconds to wait before retrying after a 429 response.
X-Daily-LimitReturned on plans with a daily export cap.
X-Daily-RemainingRemaining jobs in the current UTC day.
X-Monthly-UsedExports accepted in the current UTC month.
X-Fair-Use-StateMonthly fair-use status such as normal, review, or upgrade_recommended.
POST/api/export/jobs

Create Export Job

Creates a new PPTX export job from top-level HTML/CSS fields plus optional presentation size controls. The response is a queued job descriptor; use GET /api/export/jobs/{jobId} to retrieve terminal results.

Request Body

fileNamestring

Output filename for the generated PPTX. Must end with .pptx extension.

Default: export.pptx

htmlstringRequired

HTML content containing one or more elements with .slide class. Each .slide becomes one PPTX slide. Required.

cssstring

Optional CSS applied globally to the submitted HTML.

Default: ""

autoEmbedFontsboolean

Attempt to detect and embed fonts into the generated PPTX.

Default: false

widthnumber

Optional PPTX slide width in inches. Use with height for custom presentation sizes.

heightnumber

Optional PPTX slide height in inches. Use with width for custom presentation sizes.

layoutstring

Optional PPTX layout preset or custom layout name. Common presets: LAYOUT_16x9, LAYOUT_16x10, LAYOUT_4x3, LAYOUT_WIDE.

metadataobject

Opaque metadata forwarded to the worker. Useful for request tracing on your side.

Default: {}

responseFormatstring

Controls how the completed PPTX file is delivered. "url" returns a presigned download URL (default). "base64" returns the file inline as base64. "both" returns both. Replaces the deprecated includeFileBase64 parameter.

Default: "url"

callbackUrlstring

An HTTPS URL to receive a webhook POST when the job completes or fails. The worker sends the full job result to this URL with an x-signature-sha256 HMAC header for verification. Only https:// URLs are accepted.

Error Codes

400Invalid request body -- missing required fields or malformed JSON.
401Missing or invalid API key. Ensure the Authorization or X-API-Key header is set with a valid sk_live_ key.
403API key does not have permission for this operation. Check plan limits or key scope.
413Request entity too large. The total request body exceeds your plan limit or the worker hard cap.
422The sanitized HTML resolves to more slides than your plan allows.
429Rate limit exceeded, daily limit exceeded, monthly fair-use review triggered, or concurrent job limit exceeded. Check Retry-After and usage headers.
502Bad gateway -- the worker backend is temporarily unavailable. Retry after a short delay.
503Service unavailable -- the system is under maintenance or experiencing high load. Retry with exponential backoff.
Response (200 OK)
1{
2  "jobId": "5d934729-a0db-4aa9-bc65-e7a3e7e52b32",
3  "status": "queued",
4  "createdAt": "2026-04-02T10: 30: 00Z",
5  "fileName": "quarterly-review.pptx",
6  "slideCount": 1
7}
GET/api/export/jobs/{jobId}

Check Job Status

Retrieves the current status of an export job. Poll this endpoint until status is "completed" or "failed". When the job completes, the REST API returns the PPTX as fileBase64.

Path Parameters

jobIdstringRequired

The job ID returned from the POST /api/export/jobs endpoint.

Status Values

queued

Job is waiting in the processing queue.

processing

Worker is actively converting HTML to PowerPoint.

completed

Conversion finished successfully. fileBase64 and mimeType are available.

failed

Conversion failed. The message field contains a human-readable description.

Error Codes

401Missing or invalid API key.
404Job not found -- either the jobId is invalid or the job belongs to a different API key.
429Status polling rate limit exceeded.
Response (200 OK)
1{
2  "jobId": "5d934729-a0db-4aa9-bc65-e7a3e7e52b32",
3  "status": "completed",
4  "createdAt": "2026-04-02T10: 30: 00Z",
5  "completedAt": "2026-04-02T10: 30: 12Z",
6  "fileName": "quarterly-review.pptx",
7  "slideCount": 3,
8  "mimeType": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
9  "downloadUrl": "https://storage.example.com/quarterly-review.pptx?token=..."
10}
GET/api/export/plans

List Plans

Returns the public plan catalog plus the recommended default plan. No authentication required.

Response (200 OK)
1{
2  "recommendedPlanId": "founding_beta",
3  "plans": [
4    {
5      "id": "free_web",
6      "name": "Free Preview",
7      "includes": { "api": true, "skills": true, "mcp": true },
8      "limits": {
9        "requestsPerMinute": 1,
10        "dailyRequestLimit": 10,
11        "monthlyRequestLimit": 30,
12        "maxSlidesPerJob": 5,
13        "concurrentJobs": 1,
14        "apiKeys": 1,
15        "maxPayloadBytes": 524288
16      }
17    }
18  ],
19  "note": "Launch recommendation: keep the web app free, and monetize API, skills, and MCP access through authenticated commercial plans."
20}
GET/api/openapi.json

OpenAPI Specification

Returns the OpenAPI 3.x specification for the html2pptx.app API. Useful for generating client SDKs, importing into Postman, or browsing the API schema.

Response (200 OK)
1// Returns the full OpenAPI 3.x JSON document

HTML Contract

The HTML you send must follow these rules for reliable conversion.

  • Each slide must have the class .slide -- this is the boundary marker for slide separation
  • Each .slide must have explicit dimensions. 1600px x 900px (16:9 ratio at 13.333in x 7.5in) is the default example, and API/MCP callers can also set width, height, or layout for portrait/custom output
  • Supported CSS: flexbox, grid, linear-gradient, radial-gradient, box-shadow, text-shadow, border-radius, transform (rotate, scale, translate, skew), opacity
  • Fonts: system fonts (Arial, Helvetica, Noto Sans JP) work by default. Enable autoEmbedFonts for Google Fonts or custom @font-face declarations
  • Images: both base64 data URIs and absolute URLs are supported. Relative paths will fail -- always use absolute URLs
  • SVGs: inline SVG elements are supported and are converted to high-quality PNG images
  • Avoid: script tags, iframes, canvas elements, anchor tags, form elements, SVG external references, CSS animations, @keyframes, and runtime-dependent state
  • Nesting: deeply nested elements (> 10 levels) may impact output quality. Keep your HTML structure flat where possible
  • Text wrapping: text boxes default to no-wrap to prevent unexpected line breaks in PPTX. If you need text to wrap within a container (e.g. long paragraphs), add white-space: normal to that element

Error Response Format

All error responses follow the RFC 9457 Problem Details format with additional legacy fields for backwards compatibility:

1{
2  "type": "https://html2pptx.app/errors/slides-limit-exceeded",
3  "status": 422,
4  "title": "Slides limit exceeded",
5  "detail": "Plan Starter supports up to 50 slides per job. You submitted 62 slides.",
6  "instance": "/api/export/jobs",
7  "error": "slides_limit_exceeded",
8  "message": "Plan Starter supports up to 50 slides per job.",
9  "slideCount": 62
10}

Supported HTML Elements

Each HTML element is converted to the most appropriate PowerPoint object for maximum editability.

HTML ElementPPTX OutputNotes
div, section, articleShape with fillBackground colors, gradients, borders, and rounded corners are preserved.
p, h1-h6, span, b, em, strong, i, smallText boxText is fully editable in PowerPoint. Font size, weight, style, color, alignment, and line-height are all converted. Inline elements (span, b, em, etc.) become styled text runs within the same text box.
imgImageSupports absolute URLs and base64 data URIs. CSS object-fit (contain, cover, fill, scale-down) and object-position are respected. Rounded corners are applied via clipping.
table, tr, td, thNative PPTX tableFull table support with cell-level text styling, background fill, borders (solid/dashed/dotted), padding, text alignment, and colspan/rowspan.
ul, ol, liBulleted / Numbered listSimple lists become editable bullet or numbered lists. Complex lists (with images or flex/grid inside) are converted as images.
svgImage (PNG)SVGs are converted to high-quality PNG images.
canvasImage (PNG)Canvas content is embedded as a PNG image.
Icon elements (FontAwesome, Material Icons, etc.)ImageIcon fonts are automatically detected and converted to images.

Forbidden Elements

The following elements are stripped during input sanitization for security and compatibility:

script, iframe, object, embed

Security: active content removed

link, meta, base

Security: external references removed

form

Interactive elements not supported in PPTX

style

Use inline styles or the css parameter instead

a

Anchor tags stripped for security

foreignobject, image (SVG), feimage, use

SVG external references removed

animate, animateMotion, animateTransform, set, discard, mpath

SVG animations not supported

Skills Integration

Install

Step 1: Preview published skills

npx skills add https://html2pptx.app --list

Step 2: Install skill (--yes includes Claude Code)

npx skills add https://html2pptx.app --yes

Step 3: Connect MCP server

claude mcp add --transport http html2pptx https://html2pptx.app/mcp

What are Skills

Skills are packaged capabilities that extend AI coding agents with domain-specific knowledge and workflows. The html2pptx.app skill teaches your agent how to author slide-safe HTML, validate it against the PPTX conversion contract, and export it via the MCP server -- all in a single automated pipeline. Install once, and your agent can convert natural language instructions into production-ready PowerPoint files.

How it works

The skill bundles two core capabilities: (1) HTML authoring knowledge -- the rules for writing HTML/CSS that converts cleanly to editable PowerPoint, and (2) MCP-based export automation -- connecting to the html2pptx.app MCP server to create jobs, poll status, and retrieve results. The agent reads the skill definition, understands what good slide HTML looks like, generates it, and exports it through MCP tools -- no manual API calls or configuration needed.

claude-codecodexcursorwindsurf

Works with 18+ AI agents including Claude Code, Cursor, GitHub Copilot, Windsurf, Cline, Codex, and more. Install with a single command via the skills CLI.

Workflow

  1. 1Agent receives a user request (e.g., "Create a deck from these meeting notes")
  2. 2Agent reads the skill definition to understand the html2pptx.app HTML contract
  3. 3Agent generates slide-safe HTML with .slide class elements and explicit dimensions. 1600x900 is the default example
  4. 4Agent validates the markup against the conversion contract
  5. 5Agent connects to the MCP server and calls html2pptx_create_export_job
  6. 6Agent polls with html2pptx_wait_for_export_job until completed
  7. 7Agent returns the completed job summary to the user

Setup

1

Install MCP + Skill

claude-codecodexcursorwindsurf

Run the command with the --yes flag. The interactive TUI does not list Claude Code as a selectable agent, so --yes is required to install the skill for Claude Code. Works with Claude Code, Cursor, Copilot, Codex, and 18+ AI agents.

1# Install the skill (includes Claude Code)
2npx skills add https://html2pptx.app --yes
3# --yes auto-installs to all detected agents including Claude Code.
4# The interactive TUI does NOT list Claude Code as a selectable agent,
5# so --yes is required for Claude Code users.
6
7# Install for Claude Code only
8npx skills add https://html2pptx.app -a claude-code
9
10# Install globally (all projects)
11npx skills add https://html2pptx.app -g --yes
12
13# Connect the MCP server
14claude mcp add --transport http html2pptx https://html2pptx.app/mcp
2

Configure API key

Create an API key in the html2pptx.app dashboard and set it as an environment variable.

1# Set API key as environment variable
2export HTML2PPTX_API_KEY="sk_live_xxxx"
3
4# Or add to your .env file
5echo 'HTML2PPTX_API_KEY=sk_live_xxxx' >> .env
3

Try it out

Launch your editor and give it a natural language instruction to create slides. The skill handles everything automatically.

1# 例: Claude Code でスライド作成 → PPTX出力
2
3> 「この会議メモから5枚のプレゼンを作って、PPTXで出力して」
4
5# エージェントが自動で実行するフロー:
6# 1. SKILL.md を読み込み、html2pptx.app のHTML契約を理解
7# 2. 会議メモを解析し、スライド構成を設計
8# 3. .slide クラス + 明示サイズ付きのスライドセーフHTMLを生成(1600x900 はデフォルト例)
9# 4. diagnose でマークアップを検証(safe / needs-rewrite / out-of-scope)
10# 5. html2pptx.app API にエクスポートジョブを送信
11# 6. 完了をポーリングし、completed payload をユーザーに返却
12
13# APIキーの設定(環境変数)
14export HTML2PPTX_API_KEY="sk_live_xxxx"

Available Skills

html-to-pptx-slide-authoring

スライド用HTML/CSSの作成・診断・修正。HTMLがPPTXに正しく変換されるかを事前チェックし、問題があれば自動で書き換え。

  • HTML診断(safe / needs-rewrite / out-of-scope)
  • マークアップ自動書き換え
  • スライドHTML新規生成
  • 入力バリデーション
pptx-studio-export-automation

APIジョブの作成・ステータス管理・エラーハンドリング。REST API / MCP の使い分け判断も含む。

  • エクスポートジョブ作成
  • ポーリング&完了待機
  • エラー分析&リトライ
  • プラン制限の事前チェック

Skill Capabilities

Diagnose HTML

Classify markup as safe, needs-rewrite, or out-of-scope before attempting export. Catches issues like missing .slide elements, unsupported CSS, or dynamic content.

Rewrite Markup

Transform web-shaped HTML (responsive layouts, percentage-based sizing, scroll containers) into fixed-size .slide structures suitable for PPTX conversion.

Generate Slides

Create new slide-safe HTML from scratch given a text prompt, topic outline, or data payload. Applies best practices for visual hierarchy and readability.

Validate Output

Run the generated HTML through a pre-flight check against the html2pptx.app HTML contract before making the API call, preventing wasted export quota on invalid input.

MCP Integration

Install

Connect MCP server

claude mcp add --transport http html2pptx https://html2pptx.app/mcp

What is MCP

MCP (Model Context Protocol) is an open protocol that exposes backend capabilities to AI agents through a standardized tool interface. html2pptx.app provides an MCP server that agents can connect to for creating export jobs, checking status, listing plans, and diagnosing HTML -- all through natural language conversations. When connected to Claude Desktop or VS Code, users can generate PPTX files simply by describing what they want.

Installation & Setup

Choose your editor and install the MCP server.

Claude Code

Set up the remote server (recommended)

Run the following command in your terminal.

1claude mcp add --transport http html2pptx https://html2pptx.app/mcp

Manual setup for Claude Code

If the command above does not work, run the following to add the MCP server manually.

1claude mcp add html2pptx --transport http https://html2pptx.app/mcp

Tip: To make the MCP server available across all projects, install it with the --scope user flag:claude mcp add --scope user --transport http html2pptx https://html2pptx.app/mcp

Authentication

The MCP server supports two authentication methods. Choose the one that best fits your use case.

API Key (Recommended)

Use an API key from the dashboard. API keys do not expire (unless you set an expiration date), so you never need to re-authenticate. This is the recommended method for regular MCP usage.

Generate an API key from the dashboard, then pass it as a Bearer token. Most MCP clients handle this automatically when you add the server.

  • No token expiration — stable, long-lived sessions
  • Simple setup — just paste the key
  • Best for daily use and automation

OAuth (Browser Login)

Sign in with your Google or email account via WorkOS AuthKit. The access token is valid for 24 hours, after which you will need to re-authenticate.

When you add the MCP server, your browser will open the login page automatically. Sign in to authorize.

  • No API key management needed
  • Good for quick trials and evaluation

OAuth sessions expire after 24 hours of inactivity. For uninterrupted access, we recommend using an API key instead.

Available MCP Tools

ToolDescription
html2pptx_list_export_plansList the current commercial plan catalog and recommended plan.
html2pptx_create_export_jobCreate an export job from HTML/CSS content. Supports optional width, height, layout, waitForCompletion, timeoutMs, and responseFormat ("url" | "base64" | "both").
html2pptx_get_export_jobGet the current status of an export job by jobId.
html2pptx_wait_for_export_jobPoll until the job completes or fails. Handles retries and backoff inside the tool.
html2pptx_get_docsFetch html2pptx.app documentation to understand the API contract, HTML requirements, and integration guides.
html2pptx_get_usageFetch the current usage and quota status for your plan. Shows weekly export count, remaining quota, plan limits, and reset timing.

MCP Resources (Documentation)

The MCP server provides documentation as Resources. Agents can read these before creating export jobs to understand the API contract and HTML requirements.

URIResourceDescription
docs://html2pptx/overviewService OverviewArchitecture, CSS support, comparison with alternatives
docs://html2pptx/quickstartQuickstartFirst API call in 4 steps
docs://html2pptx/api-referenceAPI ReferenceEndpoints, authentication, error codes
docs://html2pptx/html-contractHTML ContractHTML structure requirements and supported CSS
docs://html2pptx/skillsSkills IntegrationSkill definitions for AI agents
docs://html2pptx/mcpMCP IntegrationMCP server setup and usage

llms.txt (AI-Optimized Docs)

html2pptx.app supports the llms.txt standard. Structured Markdown documentation optimized for AI agents and LLMs to efficiently understand the service.

https://html2pptx.app/llms.txt

Concise index (~100 lines) — service overview, API spec, supported CSS

https://html2pptx.app/llms-full.txt

Complete documentation (~900 lines) — full Markdown of all sections

Example Usage

1# Example conversation in Claude Desktop with html2pptx.app MCP:
2
3User: "Create a presentation about our Q1 2026 results."
4
5Claude (via MCP):
61. Calls html2pptx_list_export_plans to inspect available plans
72. Generates slide HTML from the conversation context
83. Calls html2pptx_create_export_job with the HTML payload
94. Calls html2pptx_wait_for_export_job to poll until completion
105. Returns the resulting PPTX payload or follow-up instructions
11
12# Behind the scenes, the MCP tools handle:
13# - Authentication with your configured API key
14# - Proper HTML contract formatting (.slide class, explicit slide dimensions)
15# - Status polling with exponential backoff
16# - Error handling and retry logic

CLI Tool

Install

Install globally

npm install -g html2pptx-cli

Or run directly with npx

npx html2pptx-cli convert slides.html

What is the CLI

The html2pptx CLI lets you convert HTML files to PowerPoint directly from your terminal. It supports both interactive mode (guided prompts for first-time users) and direct mode (flags for scripting, CI/CD, and AI agents like Claude Code).

Initial Setup

Before converting files, configure your API key. This is a one-time setup that saves your credentials to ~/.html2pptx/config.json (owner-only permissions).

1html2pptx init

Commands

CommandDescription
html2pptx loginConfigure your API key interactively. Shows a link to the dashboard where you can generate a key.
html2pptx logoutRemove your stored API key from ~/.html2pptx/config.json.
html2pptx convert [file]Convert an HTML file to PPTX. Run without arguments for interactive mode, or pass a file path for direct mode.
html2pptx statusCheck your current usage, remaining quota, rate limits, and plan details.
html2pptx whoamiVerify your API key and show authentication status, plan name, and usage.
html2pptx configDisplay current configuration (API key, base URL).
html2pptx templates listBrowse all available templates with title, category, and slide count.
html2pptx templates get <id>Get template details including download URLs. Use --prompt for the design prompt, --html for source code.
html2pptx --helpShow help and available commands.
html2pptx --versionShow the installed CLI version.

Convert Options

FlagDescription
-o, --output <file>Output PPTX filename (default: input filename with .pptx extension)
-s, --size <size>Slide size: "16:9", "4:3", or custom "WxH" (e.g. 1920x1080)
--css <file>External CSS file to include alongside the HTML
--jsonOutput result as JSON for scripting and CI/CD pipelines
--openAutomatically open the PPTX file after conversion
--base-url <url>API base URL (default: https://html2pptx.app)

Examples

Direct mode (for scripts & AI agents)

1# One-liner conversion
2html2pptx convert ./slides.html -o presentation.pptx -s 16: 9
3
4# With external CSS
5html2pptx convert ./slides.html --css ./styles.css -o deck.pptx
6
7# JSON output for scripting
8html2pptx convert ./slides.html --json
9# {"success":true,"file":"slides.pptx","size":"1.2 MB","duration":"3.2s"}

Interactive mode (for first-time users)

1# Just run convert without arguments
2html2pptx convert
3
4# The CLI will guide you through:
5#   > HTML file to convert
6#   > Slide size selection
7#   > Output filename

Account management

1# Check authentication
2html2pptx whoami
3#   Plan: Starter
4#   Usage: 1 / 120 exports today
5#   Remaining: 119
6
7# Check detailed usage
8html2pptx status
9#   Plan: Starter
10#   Daily Usage: 42 / 120 exports  ████████████░░░░░░░░
11#   Remaining: 78
12#   Rate Limit: 5 req/min
13#   Max Slides: 50 per job
14
15# Remove credentials
16html2pptx logout

Templates

1# List all templates
2html2pptx templates list
3
4# Get template with design prompt
5html2pptx templates get atlantis-pizza-corp --prompt
6
7# Get template with HTML source (JSON output)
8html2pptx templates get atlantis-pizza-corp --prompt --html --json

Use Cases & Examples

html2pptx.app is designed for automated, repeatable slide generation. Here are the most common integration patterns:

Automated Quarterly Reports

Generate quarterly performance decks from live data. Pull metrics from your database, format them as slide HTML with charts and KPI cards, and export via the API. Schedule with cron or trigger from your BI pipeline for fully hands-off reporting.

1const slides = quarterly_data.map((quarter, i) => `
2  <section class="slide" style="width: 1600px;height: 900px;padding: 60px;font-family:'Noto Sans JP',sans-serif;">
3    <h2 style="color:#1a1a2e;font-size: 36px;">Q${i+1} Results</h2>
4    <div style="display:grid;grid-template-columns: 1fr 1fr;gap: 40px;margin-top: 40px;">
5      <div style="background:#f0f4ff;border-radius: 16px;padding: 32px;">
6        <p style="font-size: 14px;color:#6b7280;">Revenue</p>
7        <p style="font-size: 48px;font-weight: 700;color:#1a1a2e;">${quarter.revenue}</p>
8      </div>
9      <div style="background:#f0fdf4;border-radius: 16px;padding: 32px;">
10        <p style="font-size: 14px;color:#6b7280;">Growth</p>
11        <p style="font-size: 48px;font-weight: 700;color:#16a34a;">${quarter.growth}%</p>
12      </div>
13    </div>
14  </section>
15`).join("\n");
16
17const resp = await fetch("/api/export/jobs", {
18  method: "POST",
19  headers: { "Authorization": "Bearer sk_live_xxxx", "Content-Type": "application/json" },
20  body: JSON.stringify({ fileName: "q-report.pptx", html: slides }),
21});

Sales Proposal Templates

Define brand-compliant slide templates in HTML/CSS once, then populate them with dynamic content for each campaign or client pitch. Variables like company name, project details, and pricing are injected at generation time. Marketing teams maintain the templates; sales reps get pixel-perfect branded decks instantly.

1// Sales proposal template with dynamic client data
2function generateProposal(client) {
3  return `
4    <section class="slide" style="width: 1600px;height: 900px;padding: 60px;background:linear-gradient(135deg,#1a1a2e,#16213e);">
5      <h1 style="color:#fff;font-size: 48px;">${client.companyName} 御中</h1>
6      <p style="color:#a0aec0;font-size: 24px;margin-top: 20px;">ご提案書 - ${client.projectName}</p>
7      <div style="position:absolute;bottom: 60px;left: 60px;color:#718096;font-size: 14px;">
8        ${new Date().toLocaleDateString('ja-JP')} | Confidential
9      </div>
10    </section>
11    <section class="slide" style="width: 1600px;height: 900px;padding: 60px;">
12      <h2 style="font-size: 36px;color:#1a1a2e;">提案概要</h2>
13      <div style="display:grid;grid-template-columns: 1fr 1fr 1fr;gap: 30px;margin-top: 40px;">
14        ${client.features.map(f => `
15          <div style="background:#f7fafc;border-radius: 12px;padding: 24px;">
16            <h3 style="font-size: 20px;color:#2d3748;">${f.title}</h3>
17            <p style="font-size: 14px;color:#718096;margin-top: 8px;">${f.description}</p>
18          </div>
19        `).join('')}
20      </div>
21    </section>
22  `;
23}

Agent-Powered Presentations

Let AI agents create presentation decks from meeting notes, research summaries, or project briefs. Using Skills or MCP integration, the agent understands the html2pptx.app HTML contract, generates compliant slides, and delivers a download link. Users simply describe what they want in natural language.

SaaS Export Embedding

Add "Export to PowerPoint" functionality to your SaaS product. Render your app's dashboards, analytics views, or reports as slide HTML and call the html2pptx.app API from your backend. Users get native PPTX files with editable text and shapes -- not flat screenshots.

1// Backend route: POST /api/dashboard/export-pptx
2app.post("/api/dashboard/export-pptx", async (req, res) => {
3  const { dashboardId } = req.body;
4  const dashboard = await getDashboard(dashboardId);
5
6  // Render each widget as a slide
7  const slides = dashboard.widgets.map(widget => `
8    <section class="slide" style="width: 1600px;height: 900px;padding: 40px;">
9      <h2 style="font-size: 28px;color:#1a1a2e;">${widget.title}</h2>
10      <div style="margin-top: 20px;">${widget.renderToHTML()}</div>
11    </section>
12  `).join("");
13
14  // Call html2pptx.app API
15  const job = await fetch(process.env.HTML2PPTX_API_URL + "/api/export/jobs", {
16    method: "POST",
17    headers: {
18      "Authorization": `Bearer ${process.env.HTML2PPTX_API_KEY}`,
19      "Content-Type": "application/json",
20    },
21    body: JSON.stringify({
22      fileName: `${dashboard.name}.pptx`,
23      html: slides,
24    }),
25  });
26
27  const { jobId } = await job.json();
28  res.json({ jobId, statusUrl: `/api/export/jobs/${jobId}` });
29});

Plans & Pricing

Choose the plan that fits your usage. The current public catalog is defined in code and enforced in the API gateway: requests per minute, daily guardrails, maximum slides per job, concurrent jobs, API key count, and payload size all vary by plan.

PlanExportsSlides/JobSupportPrice
Free Preview5/month, 1 rpm5 per jobCommunity¥0
Founder BetaUnlimited* / 30 per day / 2 rpm15 per jobSelf-serve¥980/mo
Starter120 per day / 5 rpm50 per jobEmail¥2,980/mo
Business500 per day / 15 rpm100 per jobPriority¥9,800/mo
Enterprise / OEMCustom150+ per jobDedicated¥49,800/mo〜

Upgrade anytime from the Dashboard. Changes take effect immediately with prorated billing. Downgrade at the end of the current billing period.

Rate Limits & Quotas by Plan

Each plan enforces the following limits. All channels (REST API, Skills, MCP) share the same quotas.

PlanRPMDailyMonthlySlides/JobConcurrentAPI KeysPayloadFair Use
Free Preview1 req/min10/day30/month5 slides1 job1 key512 KB
Founder Beta2 req/min30/dayUnlimited*15 slides1 job1 key512 KBReview at 300/mo, prompt at 500/mo
Starter5 req/min120/dayUnlimited*50 slides2 jobs3 keys1 MBReview at 1,500/mo, prompt at 2,500/mo
Business15 req/min500/dayUnlimited*100 slides5 jobs10 keys2 MBReview at 5,000/mo, prompt at 10,000/mo
Enterprise / OEM60 req/minCustomCustom150 slides10 jobs25 keys5 MBCustom terms

* Unlimited = within fair-use policy. MCP protocol requests are rate-limited at 3x the plan RPM to account for protocol overhead (initialize, tools/list, etc.).

Security & Limits

Public API, Skills, MCP, Studio, and hosted web export are all routed through the same security-sensitive conversion pipeline. The practical controls below are the ones that matter when you integrate or expose the product.

Authentication and authorization

REST API uses API keys. Remote MCP supports commercial API keys or WorkOS-backed authenticated sessions. Job lookup is bound to the same API key or authenticated principal that created the job.

SVG and untrusted markup

Public API and MCP sanitize incoming HTML. Inline SVG is converted to PNG images for reliable output.

Worker isolation

Export jobs run in isolated contexts with enforced request body limits and automatic cleanup of expired jobs.

Usage controls

Per-minute rate limiting, daily guardrails, monthly fair-use review thresholds, maximum slides per job, maximum payload size, and concurrent job limits are all enforced server-side based on the active plan.

Recommended production practices

  • Treat API keys as secrets and rotate them from the dashboard when they are exposed.
  • Use the REST API for backend automation and same-origin hosted web export only for first-party browser flows.
  • Poll the public job status route with backoff instead of hammering the status endpoint.
  • Keep slide markup deterministic: explicit slide dimensions, predictable CSS, and no runtime-dependent content. 1600x900 remains the default example.
  • With responseFormat: "base64", fileBase64 can be large; decode it in streaming or binary-safe code paths on your side.
  • For agent integrations, decide whether the client should use local stdio MCP or remote /mcp before rollout.

FAQ

How is html2pptx.app different from other HTML-to-PPTX solutions?

Most alternatives take a screenshot of your HTML and embed it as a flat image in each slide. html2pptx.app produces fully editable PowerPoint output -- CSS properties like flexbox, gradients, border-radius, and shadows are faithfully reproduced. The result is editable text, high-quality shapes, and smaller file sizes.

Can I convert any HTML to PPTX?

Not reliably. html2pptx.app is optimized for slide-oriented HTML with .slide class elements and explicit dimensions. 1600x900 is the default example, but portrait and other custom sizes are also supported. Arbitrary web pages, interactive apps, scroll-based layouts, and pages with JavaScript-dependent rendering are not supported. The HTML contract section describes the exact requirements.

What becomes a separate slide?

Each element with the .slide class becomes one slide in the output PPTX. If your HTML contains 5 elements with class="slide", the output will have 5 slides. Define clear slide boundaries for predictable results.

Will exported content remain editable in PowerPoint?

Yes, in most cases. Text stays fully editable and shapes remain adjustable in PowerPoint. Inline SVG is converted to high-quality PNG images for reliable output.

How long does export take?

Most single-slide jobs complete in 3-5 seconds. Multi-slide decks (10-50 slides) typically take 8-20 seconds depending on complexity, image count, and font embedding. The worker processes slides in parallel where possible. Poll the job status endpoint every 2 seconds for optimal responsiveness.

Which fonts are supported?

System fonts (Arial, Helvetica, Times New Roman, etc.) work by default. For web fonts, enable autoEmbedFonts: true -- html2pptx.app will download the font files from Google Fonts or your custom @font-face URLs and embed them into the PPTX. Japanese fonts like Noto Sans JP, Yu Gothic, Meiryo, and Hiragino are fully supported.

Is there a free plan?

Yes. The current public catalog includes an Early Access tier with limited API, Skills, and MCP usage. Check GET /api/export/plans for the current plan metadata because limits are enforced from code and may evolve during early rollout.

Can I use SVGs in my slides?

Yes. Inline SVG is supported and is converted to high-quality PNG images for reliable output across all PowerPoint environments.

What is the maximum file size?

The HTML payload should stay under 5MB. Generated PPTX files vary by content but typically range from 100KB to 10MB. Jobs with many high-resolution images embedded as base64 will produce larger files. Consider using URL references for large images.

How secure is the service?

html2pptx.app implements multiple security layers: jobs are bound to the creating principal; API keys are hashed at rest; request body limits and concurrent job limits are enforced server-side. Use the REST API for server-side automation and treat hosted web export as a browser surface.

Does html2pptx.app support Japanese text and CJK characters?

Yes, fully. Japanese, Chinese, and Korean characters render correctly. For best results, specify a CJK font in your CSS (e.g., font-family: "Noto Sans JP", sans-serif) and enable autoEmbedFonts to ensure portable rendering on machines without the font installed.

How do I handle errors?

Check the job status endpoint. If status is "failed", the error field contains a human-readable description. All API errors return a structured JSON body following RFC 9457 Problem Details format with type, status, title, detail, and instance fields, plus legacy error and message fields for backwards compatibility. Common issues: missing .slide elements (400), expired API key (401), rate limit exceeded (429), oversized content (413).

Can I use CSS Grid for complex slide layouts?

Yes. CSS Grid is fully supported including grid-template-columns, grid-template-rows, gap, and grid placement properties. This makes it easy to create multi-column layouts, dashboard-style cards, and complex visual arrangements that convert cleanly to PPTX.

Is there a webhook for job completion?

Yes. Add a callbackUrl field (HTTPS only) to your POST /api/export/jobs request. The worker will POST the full job result to your callback URL when the job completes or fails, with an x-signature-sha256 HMAC header for verification. Alternatively, you can still use polling on GET /api/export/jobs/{jobId} with a 2-second interval. For MCP users, html2pptx_wait_for_export_job handles polling automatically.

Troubleshooting

IssueSolution
Job stuck in "queued" statusThe private worker may be offline or overloaded. Wait 30 seconds and retry. If persistent, check worker health from the Dashboard or contact support.
Slides appear blankEnsure your HTML contains elements with class="slide" and that those elements have visible content. Also verify that CSS is included in the payload and not relying on external stylesheets.
Fonts look different in PPTXEnable autoEmbedFonts: true to embed web fonts. If using custom fonts, ensure the @font-face URLs are publicly accessible. Fallback to system-safe fonts like Arial or Noto Sans for maximum compatibility.
429 Rate limit errorCheck the X-RateLimit-Reset header for when your window resets. Implement exponential backoff in your polling logic. Upgrade your plan for higher request limits.
Layout differs from browser previewUse explicit dimensions on .slide elements with inline styles. 1600x900 is the default example, but custom aspect ratios also work when your slide HTML and requested width/height/layout match. Avoid responsive/percentage-based layouts, media queries, and viewport-relative units (vh, vw).
Images not appearing in PPTXUse absolute URLs (https://...) or base64 data URIs for images. Relative paths and localhost URLs will fail. Ensure image URLs are publicly accessible from the worker.
PPTX file size is too largeLarge files are usually caused by embedded base64 images or image-heavy content. Use URL references instead, or compress images before embedding.