FlashSlides API & MCP Server
Generate AI presentations from your own code, or let Claude, Cursor and other AI assistants create decks for you.
Quick start
- Create an API key in Settings (sign in first). Copy it right away; it is shown only once.
- Create a deck:
POST /api/v1/presentations. - Poll
GET /api/v1/presentations/:sluguntilstatusiscompleted(usually 20 to 90 seconds). - Download it as PowerPoint, PDF or Word with
GET /api/v1/presentations/:slug/export/pptx.
API generations use the same credits as the website: your first generation each day is free for up to 5 slides, and every other slide costs 1 credit. Buy credits.
Authentication
Send your key as a bearer token on every request. Keys start with fs_live_. Keep them secret: anyone with a key can spend your credits. Revoke a leaked key in Settings.
Authorization: Bearer fs_live_your_key_here
Base URL: https://flashslides.com/api/v1
Errors & limits
Errors always use the same JSON shape with a matching HTTP status:
{ "error": { "code": "insufficient_credits", "message": "Not enough credits: you need 5 credits for 10 slides." } }
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request, invalid_json, invalid_format, extraction_failed | Bad input, or the URL/video could not be read |
| 401 | unauthorized, invalid_api_key | Missing, invalid or revoked key |
| 403 | insufficient_credits | Not enough credits for the requested slides |
| 404 | not_found | No such presentation on your account |
| 409 | not_ready, generation_failed | Export requested before the deck finished, or generation failed |
| 429 | rate_limited, export_busy | Slow down; see the Retry-After header |
Each key can make 60 requests per minute across the REST API and MCP server. Responses include X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers. Exports are also queued, so heavy use may get a 429 with Retry-After.
REST endpoints
GET /api/v1/me
Your account, credit balance and whether today's free generation is still available.
curl https://flashslides.com/api/v1/me \
-H "Authorization: Bearer $FLASHSLIDES_API_KEY"
{
"user": { "id": 42, "name": "Ada", "email": "[email protected]", "createdAt": "2026-01-02 10:00:00" },
"credits": 25,
"freeGeneration": { "available": true, "freeSlidesPerDay": 5, "generationsPerDay": 1 },
"pricing": { "creditsPerSlide": 1, "note": "..." },
"slideLimits": { "min": 1, "max": 50, "default": 5 }
}
POST /api/v1/presentations
Start generating a deck. Returns 202 Accepted right away with status: "generating".
| Field | Type | Description |
|---|---|---|
topic | string | Topic or source text (2 to 10,000 characters). text is accepted as an alias. |
url | string | A web page or YouTube URL to build the deck from. Takes precedence over topic. |
slidesCount | integer | 1 to 50, default 5. |
visibility | string | public (default, listed in the archive) or private. |
curl -X POST https://flashslides.com/api/v1/presentations \
-H "Authorization: Bearer $FLASHSLIDES_API_KEY" \
-H "Content-Type: application/json" \
-d '{"topic": "The history of the printing press", "slidesCount": 8, "visibility": "private"}'
# From a YouTube video
curl -X POST https://flashslides.com/api/v1/presentations \
-H "Authorization: Bearer $FLASHSLIDES_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.youtube.com/watch?v=VIDEO_ID", "slidesCount": 5}'
{
"presentation": {
"id": 1234, "slug": "the-history-of-the-printing-press-x1y2z3",
"title": "The history of the printing press", "status": "generating",
"slidesCount": 8, "isPublic": false, "sourceType": "text", "sourceUrl": null,
"url": "https://flashslides.com/p/the-history-of-the-printing-press-x1y2z3"
},
"billing": { "creditsUsed": 3, "freeSlidesUsed": 5 },
"statusUrl": "https://flashslides.com/api/v1/presentations/the-history-of-the-printing-press-x1y2z3"
}
If generation fails, the credits are refunded automatically.
GET /api/v1/presentations
Your presentations, newest first. Query parameters: page (default 1) and per_page (1 to 100, default 20).
curl "https://flashslides.com/api/v1/presentations?page=1&per_page=20" \
-H "Authorization: Bearer $FLASHSLIDES_API_KEY"
{
"presentations": [ { "slug": "...", "title": "...", "status": "completed", "slidesCount": 8, "isPublic": false, "url": "...", "createdAt": "..." } ],
"pagination": { "page": 1, "perPage": 20, "total": 37, "totalPages": 2 }
}
GET /api/v1/presentations/:slug
Status and, once completed, every slide's title, bullet points and image URL. status is generating, completed or failed (with error set).
curl https://flashslides.com/api/v1/presentations/the-history-of-the-printing-press-x1y2z3 \
-H "Authorization: Bearer $FLASHSLIDES_API_KEY"
{
"presentation": {
"slug": "the-history-of-the-printing-press-x1y2z3", "title": "The Printing Press",
"status": "completed", "slidesCount": 8, "thumbnailUrl": "https://...",
"slides": [
{ "index": 0, "title": "Before Gutenberg", "content": ["Hand-copied manuscripts", "..."], "imageUrl": "https://..." }
]
}
}
GET /api/v1/presentations/:slug/export/:format
Download a completed deck. format is pptx, pdf or docx. The response is the file itself.
curl -o deck.pptx https://flashslides.com/api/v1/presentations/the-history-of-the-printing-press-x1y2z3/export/pptx \
-H "Authorization: Bearer $FLASHSLIDES_API_KEY"
DELETE /api/v1/presentations/:slug
Permanently delete one of your presentations.
curl -X DELETE https://flashslides.com/api/v1/presentations/the-history-of-the-printing-press-x1y2z3 \
-H "Authorization: Bearer $FLASHSLIDES_API_KEY"
{ "deleted": true, "slug": "the-history-of-the-printing-press-x1y2z3" }
MCP server
FlashSlides runs a remote Model Context Protocol server so AI assistants can create and export decks for you. It uses Streamable HTTP and the same API key.
Server URL: https://flashslides.com/mcp
Claude Code
claude mcp add --transport http flashslides https://flashslides.com/mcp \
--header "Authorization: Bearer fs_live_your_key_here"
Claude Desktop
Add this to claude_desktop_config.json (Settings → Developer → Edit Config). It uses mcp-remote to pass your key as a header, which needs Node.js installed. Restart Claude Desktop afterwards.
{
"mcpServers": {
"flashslides": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://flashslides.com/mcp", "--header", "Authorization:${FLASHSLIDES_AUTH}"],
"env": { "FLASHSLIDES_AUTH": "Bearer fs_live_your_key_here" }
}
}
}
Cursor
Add this to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):
{
"mcpServers": {
"flashslides": {
"url": "https://flashslides.com/mcp",
"headers": { "Authorization": "Bearer fs_live_your_key_here" }
}
}
}
Other clients that support Streamable HTTP with custom headers can use the same URL and header.
Tools
| Tool | What it does |
|---|---|
get_account | Credit balance and whether today's free generation is available. |
create_presentation | Start a deck from topic or url (web page or YouTube), with optional slides_count and visibility. |
get_presentation | Status and full slide content for a slug. |
list_presentations | Your decks, newest first (page, per_page). |
export_presentation | A download link for pptx, pdf or docx. The link works without a key and expires after 1 hour. |
Try asking your assistant: "Make an 8-slide FlashSlides deck about photosynthesis for a 10th grade class and give me the PowerPoint."
Need help?
Questions or feature requests? Contact us.