Slides API

Beta

Use the Slides API to access your decks and account data from scripts, integrations or AI tools.

Create and manage API keys from your API key management page.

Authentication

Authorization: Bearer YOUR_API_KEY

REST Base URL

https://api.slides.com

MCP Server URL

https://mcp.slides.com/

Example Request

curl -sS -H 'Authorization: Bearer YOUR_API_KEY' 'https://api.slides.com/v1/user'
GET

/v1/user

Returns the authenticated user profile together with account and team details.

Parameters

No request parameters.

Example Response

{
  "data": {
    "id": 123,
    "username": "alice",
    "name": "Alice Example",
    "email": "alice@example.com",
    "description": "Presentation designer",
    "thumbnail_url": "https://...",
    "website_url": "https://example.com",
    "twitter_handle": "alice",
    "profile_url": "https://slides.com/alice",
    "account": {
      "type": "pro",
      "billing_period": "monthly"
    },
    "team": null,
    "created_at": "2026-03-01T12:00:00Z",
    "updated_at": "2026-03-05T09:00:00Z"
  }
}

Response

A user object containing profile, account, team, and timestamp fields.

GET

/v1/decks

Returns owned deck summaries ordered by newest first.

Parameters

page
Integer Default 1 Optional

Page number to return. Minimum: 1.

per_page
Integer Default 20 Optional

Number of records to return per page, up to a maximum of 100. Range: 1–100.

Example Response

{
  "data": [
    {
      "id": 456,
      "title": "Quarterly Review",
      "description": "Q1 business update",
      "thumbnail_url": "https://...",
      "url": "https://slides.com/alice/q1-review"
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 1
  }
}

Response

Deck summaries are returned in data; meta contains page, per_page, and total.

GET

/v1/decks/trashed

Returns owned decks in trash, ordered by the time they were trashed.

Parameters

page
Integer Default 1 Optional

Page number to return. Minimum: 1.

per_page
Integer Default 20 Optional

Number of records to return per page, up to a maximum of 100. Range: 1–100.

Example Response

{
  "data": [
    {
      "id": 456,
      "title": "Quarterly Review",
      "description": "Q1 business update",
      "thumbnail_url": "https://...",
      "trashed_at": "2026-07-28T14:00:00Z"
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 1
  }
}

Response

Deck summaries are returned in data with trashed_at and without url; meta contains page, per_page, and total.

GET

/v1/decks/:id

Returns details for an owned deck.

Parameters

id
Path parameter Integer Required

ID of the deck.

include_deck_html
Boolean Default false Optional

Whether to include deck_html, which contains the HTML for all slides in the deck.

Example Response (include_deck_html=true)

{
  "data": {
    "id": 456,
    "title": "Quarterly Review",
    "description": "Q1 business update",
    "thumbnail_url": "https://...",
    "url": "https://slides.com/alice/q1-review",
    "urls": {
      "default": "https://slides.com/alice/q1-review",
      "fullscreen": "https://slides.com/alice/q1-review/fullscreen",
      "edit": "https://slides.com/alice/q1-review/edit",
      "present": "https://slides.com/alice/q1-review/live"
    },
    "slug": "q1-review",
    "visibility": "self",
    "slide_count": 12,
    "notes": "",
    "css": ".slides h1 { color: #ff0000; }",
    "width": 1280,
    "height": 720,
    "margin": 0.05,
    "transition": "slide",
    "background_transition": "slide",
    "rtl": false,
    "loop": false,
    "theme_font": "montserrat",
    "theme_color": "white-blue",
    "language": "en",
    "created_at": "2026-03-01T12:00:00Z",
    "updated_at": "2026-03-05T09:00:00Z",
    "deck_html": "<section>...</section>"
  }
}

Response

Returns deck details. deck_html is present only when include_deck_html is true.

POST

/v1/decks

Read-write API key required

Creates a new deck.

Parameters

title
String Default "deck" Optional

Deck title.

description
String Optional

Deck description.

width
Integer Optional

Deck width in pixels. Minimum: 1.

height
Integer Optional

Deck height in pixels. Minimum: 1.

deck_html
String Optional

HTML for all slides in the deck. Must contain one or more top-level section elements.

visibility
String Optional

Deck visibility. Team accounts may also use team visibility. Allowed values: all, self, team.

Example Request Body

{
  "title": "Quarterly Review",
  "description": "Q1 business update",
  "width": 1280,
  "height": 720,
  "deck_html": "<section>...</section>",
  "visibility": "self"
}

Response

Returns the created deck, including deck_html. Validation failures return an error.

PATCH

/v1/decks/:id

Read-write API key required

Updates selected fields on an owned deck.

Parameters

id
Path parameter Integer Required

ID of the deck.

title
String Optional

Deck title.

description
String Optional

Deck description.

width
Integer Optional

Deck width in pixels. Minimum: 1.

height
Integer Optional

Deck height in pixels. Minimum: 1.

deck_html
String Optional

HTML for all slides in the deck. Must contain one or more top-level section elements.

visibility
String Optional

Deck visibility. Team accounts may also use team visibility. Allowed values: all, self, team.

Example Request Body

{
  "title": "Updated title",
  "visibility": "all"
}

Response

Returns the updated deck, including deck_html. Read-only keys and validation failures return an error.

POST

/v1/decks/:id/trash

Read-write API key required

Moves an owned deck to trash without permanently deleting it.

Parameters

id
Path parameter Integer Required

ID of the deck.

Response

Returns 204 No Content on success.

POST

/v1/decks/:id/recover

Read-write API key required

Recovers an owned deck from trash.

Parameters

id
Path parameter Integer Required

ID of the deck.

Response

Returns 204 No Content on success.

GET

/v1/decks/:deck_id/share

Pro or Team account required

Returns all private share links for an owned deck, ordered newest first.

Parameters

deck_id
Path parameter Integer Required

ID of the deck.

Example Response

{
  "data": [
    {
      "id": 789,
      "deck_id": 456,
      "name": "Customer review",
      "url": "https://slides.com/alice/q1-review?token=...",
      "urls": {
        "default": "https://slides.com/alice/q1-review?token=...",
        "fullscreen": "https://slides.com/alice/q1-review/fullscreen?token=..."
      },
      "password_protected": true,
      "expires_at": "2026-08-01T12:00:00Z",
      "expired": true,
      "notify_on_view": true,
      "view_count": 3,
      "first_viewed_at": "2026-07-21T09:30:00Z",
      "created_at": "2026-07-20T12:00:00Z"
    }
  ],
  "meta": {
    "total": 1
  }
}

Response

Private share links are returned in data; meta contains total. Each link includes default and fullscreen URLs.

POST

/v1/decks/:deck_id/share

Pro or Team account required Read-write API key required

Creates a private share link for an owned private or team-visible deck.

Parameters

deck_id
Path parameter Integer Required

ID of the deck to create a private share link for.

name
String Default "API Link" Optional

Name identifying the private share link.

password
String Optional

Password recipients must enter before viewing the deck through this link.

expires_at
String or null Optional

ISO 8601 timestamp after which the private share link expires.

notify_on_view
Boolean Default false Optional

Whether to notify the deck owner when the deck is first viewed through this link.

Example Request Body

{
  "name": "Customer review",
  "password": "optional-password",
  "expires_at": "2030-08-01T12:00:00Z",
  "notify_on_view": true
}

Response

Returns the new private share link with default and fullscreen URLs. Passwords are never returned. Each deck is limited to 100 private share links.

DELETE

/v1/decks/:deck_id/share/:id

Pro or Team account required Read-write API key required

Revokes a private share link for an owned deck.

Parameters

deck_id
Path parameter Integer Required

ID of the deck.

id
Path parameter Integer Required

ID of the private share link to revoke.

Response

Returns 204 No Content on success.

POST

/v1/decks/:deck_id/exports

Read-write API key required

Starts an asynchronous PDF or ZIP export for an owned deck.

Parameters

deck_id
Path parameter Integer Required

Deck ID to export.

format
String Required

Export format: pdf or zip. Allowed values: pdf, zip.

margin
Number Default 0.0 PDF only Optional

PDF-only page margin between 0 and 0.2. Range: 0–0.2.

slide_number
Boolean Default false PDF only Optional

PDF-only option that includes slide numbers.

slide_notes
Boolean Default false PDF only Optional

PDF-only option that includes speaker notes.

separate_fragments
Boolean Default false PDF only Optional

PDF-only option that prints fragment steps separately.

Rate limit

Export creation is limited to 10 exports per user per hour. Polling uses the standard API rate limit.

Example Request Body

{
  "format": "pdf",
  "margin": 0.05,
  "slide_number": true,
  "slide_notes": false,
  "separate_fragments": false
}

Example Response

{
  "data": {
    "id": 901,
    "deck_id": 456,
    "format": "pdf",
    "status": "pending",
    "created_at": "2030-08-01T09:30:00Z",
    "completed_at": null,
    "download_url": null,
    "download_url_expires_at": null
  },
  "meta": {
    "poll_after_seconds": 5
  }
}

Response

Returns a pending export; meta contains poll_after_seconds.

GET

/v1/decks/:deck_id/exports/:id

Returns the current state of a PDF or ZIP export for an owned deck.

Parameters

deck_id
Path parameter Integer Required

Deck ID that owns the export.

id
Path parameter Integer Required

Export ID to retrieve.

Polling

Pending responses include poll_after_seconds in meta. Poll again after that interval.

Example Response

{
  "data": {
    "id": 901,
    "deck_id": 456,
    "format": "pdf",
    "status": "completed",
    "created_at": "2030-08-01T09:30:00Z",
    "completed_at": "2030-08-01T09:31:00Z",
    "download_url": "https://...",
    "download_url_expires_at": "2030-08-01T09:36:00Z"
  }
}

Response

Returns a pending, completed, or failed export. Completed exports include a temporary download URL and its expiration time.

GET

/v1/team/decks

Team admin or owner required

Returns team-visible and public decks from the authenticated user’s team.

Parameters

page
Integer Default 1 Optional

Page number to return. Minimum: 1.

per_page
Integer Default 20 Optional

Number of records to return per page, up to a maximum of 100. Range: 1–100.

Example Response

{
  "data": [
    {
      "id": 456,
      "title": "Quarterly Review",
      "description": "Q1 business update",
      "thumbnail_url": "https://...",
      "url": "https://team.slides.com/alice/q1-review",
      "visibility": "team",
      "owner": {
        "id": 123,
        "name": "Alice Example",
        "username": "alice"
      }
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 1
  }
}

Response

Deck summaries are returned in data; meta contains page, per_page, and total. Every summary includes visibility and deck owner identity.

GET

/v1/team/decks/:id

Team admin or owner required

Returns a team-visible or public deck.

Parameters

id
Path parameter Integer Required

ID of the team deck.

include_deck_html
Boolean Default false Optional

Whether to include deck_html, which contains the HTML for all slides in the deck.

Example Response (include_deck_html=true)

{
  "data": {
    "id": 456,
    "title": "Quarterly Review",
    "description": "Q1 business update",
    "thumbnail_url": "https://...",
    "url": "https://team.slides.com/alice/q1-review",
    "urls": {
      "default": "https://team.slides.com/alice/q1-review",
      "fullscreen": "https://team.slides.com/alice/q1-review/fullscreen",
      "edit": "https://team.slides.com/alice/q1-review/edit",
      "present": "https://team.slides.com/alice/q1-review/live"
    },
    "slug": "q1-review",
    "visibility": "team",
    "slide_count": 12,
    "notes": "",
    "css": ".slides h1 { color: #ff0000; }",
    "width": 1280,
    "height": 720,
    "margin": 0.05,
    "transition": "slide",
    "background_transition": "slide",
    "rtl": false,
    "loop": false,
    "theme_font": "montserrat",
    "theme_color": "white-blue",
    "language": "en",
    "created_at": "2026-03-01T12:00:00Z",
    "updated_at": "2026-03-05T09:00:00Z",
    "deck_html": "<section>...</section>",
    "owner": {
      "id": 123,
      "name": "Alice Example",
      "username": "alice"
    }
  }
}

Response

Returns the same fields as get_deck, plus deck owner identity. deck_html is present only when include_deck_html is true.

MCP API

MCP is available at mcp.slides.com with Bearer authentication. The server exposes the same deck operations as REST as named tools, plus an MCP App viewer tool.

Server URL

https://mcp.slides.com/

Transport

Streamable HTTP

Remote HTTP clients can connect directly. Clients that only launch local MCP processes can use a bridge such as mcp-remote.

Claude Desktop Example

{
  "mcpServers": {
    "slides": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@latest",
        "https://mcp.slides.com/",
        "--header",
        "Authorization: Bearer YOUR_API_KEY"
      ]
    }
  }
}
Tool

list_decks

Returns owned deck summaries ordered by newest first.

Inputs

page
Integer Default 1 Optional

Page number to return. Minimum: 1.

per_page
Integer Default 20 Optional

Number of records to return per page, up to a maximum of 100. Range: 1–100.

Returns

Deck summaries are returned in data; meta contains page, per_page, and total.

Tool

list_trashed_decks

Returns owned decks in trash, ordered by the time they were trashed.

Inputs

page
Integer Default 1 Optional

Page number to return. Minimum: 1.

per_page
Integer Default 20 Optional

Number of records to return per page, up to a maximum of 100. Range: 1–100.

Returns

Deck summaries are returned in data with trashed_at and without url; meta contains page, per_page, and total.

Tool

get_deck

Returns details for an owned deck.

Inputs

id
Integer Required

ID of the deck.

include_deck_html
Boolean Default false Optional

Whether to include deck_html, which contains the HTML for all slides in the deck.

Example JSON Content (include_deck_html=true)

{
  "id": 456,
  "title": "Quarterly Review",
  "description": "Q1 business update",
  "thumbnail_url": "https://...",
  "url": "https://slides.com/alice/q1-review",
  "urls": {
    "default": "https://slides.com/alice/q1-review",
    "fullscreen": "https://slides.com/alice/q1-review/fullscreen",
    "edit": "https://slides.com/alice/q1-review/edit",
    "present": "https://slides.com/alice/q1-review/live"
  },
  "slug": "q1-review",
  "visibility": "self",
  "slide_count": 12,
  "notes": "",
  "css": ".slides h1 { color: #ff0000; }",
  "width": 1280,
  "height": 720,
  "margin": 0.05,
  "transition": "slide",
  "background_transition": "slide",
  "rtl": false,
  "loop": false,
  "theme_font": "montserrat",
  "theme_color": "white-blue",
  "language": "en",
  "created_at": "2026-03-01T12:00:00Z",
  "updated_at": "2026-03-05T09:00:00Z",
  "deck_html": "<section>...</section>"
}

Returns

Returns deck details. deck_html is present only when include_deck_html is true.

Tool

view_deck

Returns deck metadata and a short-lived MCP App embed URL for an owned deck.

Inputs

id
Integer Required

ID of the deck.

MCP Apps

Linked to ui://slides/deck-viewer.html so supported hosts can render the presentation inline.

Example Structured Content

{
  "id": 456,
  "title": "Quarterly Review",
  "description": "Q1 business update",
  "thumbnail_url": "https://...",
  "url": "https://slides.com/alice/q1-review",
  "urls": {
    "default": "https://slides.com/alice/q1-review",
    "fullscreen": "https://slides.com/alice/q1-review/fullscreen",
    "edit": "https://slides.com/alice/q1-review/edit",
    "present": "https://slides.com/alice/q1-review/live"
  },
  "slug": "q1-review",
  "visibility": "self",
  "slide_count": 12,
  "width": 1280,
  "height": 720,
  "ephemeral_embed_url": "https://mcp.slides.com/decks/456/embed?embed_token=...",
  "ephemeral_embed_url_expires_at": "2030-08-01T09:40:00Z"
}

Returns

Structured content containing deck summary fields, an ephemeral embed URL, and its expiration.

Tool

create_deck

Read-write API key required

Creates a new deck.

Inputs

title
String Default "deck" Optional

Deck title.

description
String Optional

Deck description.

width
Integer Optional

Deck width in pixels. Minimum: 1.

height
Integer Optional

Deck height in pixels. Minimum: 1.

deck_html
String Optional

HTML for all slides in the deck. Must contain one or more top-level section elements.

visibility
String Optional

Deck visibility. Team accounts may also use team visibility. Allowed values: all, self, team.

Example Arguments

{
  "title": "Quarterly Review",
  "description": "Q1 business update",
  "width": 1280,
  "height": 720,
  "deck_html": "<section>...</section>",
  "visibility": "self"
}

Returns

Returns the created deck, including deck_html. Validation failures return an error.

Tool

update_deck

Read-write API key required

Updates selected fields on an owned deck.

Inputs

id
Integer Required

ID of the deck.

title
String Optional

Deck title.

description
String Optional

Deck description.

width
Integer Optional

Deck width in pixels. Minimum: 1.

height
Integer Optional

Deck height in pixels. Minimum: 1.

deck_html
String Optional

HTML for all slides in the deck. Must contain one or more top-level section elements.

visibility
String Optional

Deck visibility. Team accounts may also use team visibility. Allowed values: all, self, team.

Example Arguments

{
  "id": 456,
  "title": "Updated title",
  "visibility": "all"
}

Returns

Returns the updated deck, including deck_html. Read-only keys and validation failures return an error.

Tool

trash_deck

Read-write API key required

Moves an owned deck to trash without permanently deleting it.

Inputs

id
Integer Required

ID of the deck.

Example JSON Content

{
  "id": 456,
  "trashed": true
}

Returns

JSON content confirming the deck ID and trashed state.

Tool

recover_deck

Read-write API key required

Recovers an owned deck from trash.

Inputs

id
Integer Required

ID of the deck.

Example JSON Content

{
  "id": 456,
  "recovered": true
}

Returns

JSON content confirming the deck ID and recovered state.

Tool

list_deck_shares

Pro or Team account required

Returns all private share links for an owned deck, ordered newest first.

Inputs

deck_id
Integer Required

ID of the deck.

Returns

Private share links are returned in data; meta contains total. Each link includes default and fullscreen URLs.

Tool

create_deck_share

Pro or Team account required Read-write API key required

Creates a private share link for an owned private or team-visible deck.

Inputs

deck_id
Integer Required

ID of the deck to create a private share link for.

name
String Default "API Link" Optional

Name identifying the private share link.

password
String Optional

Password recipients must enter before viewing the deck through this link.

expires_at
String or null Optional

ISO 8601 timestamp after which the private share link expires.

notify_on_view
Boolean Default false Optional

Whether to notify the deck owner when the deck is first viewed through this link.

Example Arguments

{
  "name": "Customer review",
  "password": "optional-password",
  "expires_at": "2030-08-01T12:00:00Z",
  "notify_on_view": true,
  "deck_id": 456
}

Returns

Returns the new private share link with default and fullscreen URLs. Passwords are never returned. Each deck is limited to 100 private share links.

Tool

revoke_deck_share

Pro or Team account required Read-write API key required

Revokes a private share link for an owned deck.

Inputs

deck_id
Integer Required

ID of the deck.

id
Integer Required

ID of the private share link to revoke.

Example JSON Content

{
  "id": 789,
  "revoked": true
}

Returns

JSON content confirming the private share link ID and revoked state.

Tool

create_deck_export

Read-write API key required

Starts an asynchronous PDF or ZIP export for an owned deck.

Inputs

deck_id
Integer Required

Deck ID to export.

format
String Required

Export format: pdf or zip. Allowed values: pdf, zip.

margin
Number Default 0.0 PDF only Optional

PDF-only page margin between 0 and 0.2. Range: 0–0.2.

slide_number
Boolean Default false PDF only Optional

PDF-only option that includes slide numbers.

slide_notes
Boolean Default false PDF only Optional

PDF-only option that includes speaker notes.

separate_fragments
Boolean Default false PDF only Optional

PDF-only option that prints fragment steps separately.

Rate limit

Export creation is limited to 10 exports per user per hour. Polling uses the standard API rate limit.

Example Arguments

{
  "format": "pdf",
  "margin": 0.05,
  "slide_number": true,
  "slide_notes": false,
  "separate_fragments": false,
  "deck_id": 456
}

Returns

Returns a pending export; meta contains poll_after_seconds.

Tool

get_deck_export

Returns the current state of a PDF or ZIP export for an owned deck.

Inputs

deck_id
Integer Required

Deck ID that owns the export.

id
Integer Required

Export ID to retrieve.

Polling

Pending responses include poll_after_seconds in meta. Poll again after that interval.

Returns

Returns a pending, completed, or failed export. Completed exports include a temporary download URL and its expiration time.

Tool

list_team_decks

Team admin or owner required

Returns team-visible and public decks from the authenticated user’s team.

Inputs

page
Integer Default 1 Optional

Page number to return. Minimum: 1.

per_page
Integer Default 20 Optional

Number of records to return per page, up to a maximum of 100. Range: 1–100.

Returns

Deck summaries are returned in data; meta contains page, per_page, and total. Every summary includes visibility and deck owner identity.

Tool

get_team_deck

Team admin or owner required

Returns a team-visible or public deck.

Inputs

id
Integer Required

ID of the team deck.

include_deck_html
Boolean Default false Optional

Whether to include deck_html, which contains the HTML for all slides in the deck.

Returns

Returns the same fields as get_deck, plus deck owner identity. deck_html is present only when include_deck_html is true.