Quick start

  1. Create an API key in Settings (sign in first). Copy it right away; it is shown only once.
  2. Create a deck: POST /api/v1/presentations.
  3. Poll GET /api/v1/presentations/:slug until status is completed (usually 20 to 90 seconds).
  4. 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." } }
StatusCodeMeaning
400invalid_request, invalid_json, invalid_format, extraction_failedBad input, or the URL/video could not be read
401unauthorized, invalid_api_keyMissing, invalid or revoked key
403insufficient_creditsNot enough credits for the requested slides
404not_foundNo such presentation on your account
409not_ready, generation_failedExport requested before the deck finished, or generation failed
429rate_limited, export_busySlow 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".

FieldTypeDescription
topicstringTopic or source text (2 to 10,000 characters). text is accepted as an alias.
urlstringA web page or YouTube URL to build the deck from. Takes precedence over topic.
slidesCountinteger1 to 50, default 5.
visibilitystringpublic (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

ToolWhat it does
get_accountCredit balance and whether today's free generation is available.
create_presentationStart a deck from topic or url (web page or YouTube), with optional slides_count and visibility.
get_presentationStatus and full slide content for a slug.
list_presentationsYour decks, newest first (page, per_page).
export_presentationA 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.