REST API

Beta

Use the Slides REST API to access your decks and account data from scripts and integrations.

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

Authentication

Authorization: Bearer YOUR_API_KEY

REST Base URL

https://api.slides.com

Example Request

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

Endpoints

REST responses are JSON unless an endpoint returns 204 No Content. List endpoints return a data array and a meta object; resource endpoints return a data object.

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 param 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,
    "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. Read speaker notes through the slide APIs. 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

Canvas width in pixels. Defaults to 1280 on creation. Minimum: 1.

height
Integer Optional

Canvas height in pixels. Defaults to 720 on creation. Minimum: 1.

margin
Number Optional

Viewport margin factor from 0 to 1; defaults to 0.05 (5%). Reserves space around the presentation during scaling, not padding inside the slide. Range: 0–1.

theme_color
String Optional

Presentation color preset. Defaults to white-blue on creation. View color presets. Allowed values: white-blue, sand-blue, beige-brown, silver-green, silver-blue, sky-blue, blue-yellow, cobalt-orange, asphalt-orange, forest-yellow, mint-beige, sea-yellow, yellow-black, coral-blue, grey-blue, black-blue, black-mint, black-orange.

theme_font
String Optional

Presentation font preset. Defaults to montserrat on creation. View font presets. Allowed values: montserrat, league, opensans, josefine, palatino, news, helvetica, merriweather, asul, sketch, quicksand, overpass2.

visibility
String Optional

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

slides
Array Optional

Initial slides in presentation order. Each object accepts html containing one <section> with no nested sections, plus optional speaker notes. Omit html for a blank slide. Omit slides to create one blank slide; an empty array is not accepted.

Example Request Body

{
  "title": "Quarterly Review",
  "description": "Q1 business update",
  "width": 1280,
  "height": 720,
  "theme_color": "white-blue",
  "theme_font": "montserrat",
  "visibility": "self",
  "slides": [
    {
      "html": "<section><h1>Quarterly Review</h1></section>",
      "notes": "Welcome to the Q1 review."
    },
    {
      "html": "<section><h2>Results</h2><p>Revenue increased by 18%.</p></section>"
    }
  ]
}

Response

Returns deck metadata and slide_ids in presentation order, without HTML, notes, or CSS. Use the Get slide endpoint to retrieve content. Validation failures return an error.

PATCH

/v1/decks/:id

Read-write API key required

Updates selected fields on an owned deck.

Parameters

id
Path param Integer Required

ID of the deck.

title
String Optional

Deck title.

description
String Optional

Deck description.

width
Integer Optional

Canvas width in pixels. Defaults to 1280 on creation. Minimum: 1.

height
Integer Optional

Canvas height in pixels. Defaults to 720 on creation. Minimum: 1.

margin
Number Optional

Viewport margin factor from 0 to 1; defaults to 0.05 (5%). Reserves space around the presentation during scaling, not padding inside the slide. Range: 0–1.

theme_color
String Optional

Presentation color preset. Defaults to white-blue on creation. View color presets. Allowed values: white-blue, sand-blue, beige-brown, silver-green, silver-blue, sky-blue, blue-yellow, cobalt-orange, asphalt-orange, forest-yellow, mint-beige, sea-yellow, yellow-black, coral-blue, grey-blue, black-blue, black-mint, black-orange.

theme_font
String Optional

Presentation font preset. Defaults to montserrat on creation. View font presets. Allowed values: montserrat, league, opensans, josefine, palatino, news, helvetica, merriweather, asul, sketch, quicksand, overpass2.

visibility
String Optional

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

Example Request Body

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

Response

Returns deck metadata without HTML, notes, or CSS. Use get_deck with include_deck_html to retrieve 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 param 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 param Integer Required

ID of the deck.

Response

Returns 204 No Content on success.

GET

/v1/decks/:deck_id/slides

Returns slide summaries in presentation order without slide HTML or speaker notes. Use the returned IDs to retrieve, edit, move, or remove slides.

Parameters

deck_id
Path param Integer Required

ID of the deck that owns the slides.

page
Integer Default 1 Optional

Page number to return. Minimum: 1.

per_page
Integer Default 50 Optional

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

Example Response

{
  "data": [
    {
      "id": "a1b2c3d4e5f6",
      "position": {
        "horizontal": 0,
        "vertical": null
      },
      "title": "Quarterly results",
      "text_preview": "Quarterly results Revenue increased by 18%.",
      "html_bytes": 86,
      "has_notes": true
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 50,
    "total": 1
  }
}

Response

Slide summaries are returned in data; meta contains page, per_page, and total. Position indexes start at 0. Slides in a vertical group share position.horizontal; position.vertical identifies each slide within the group and is null for ungrouped slides.

GET

/v1/decks/:deck_id/slides/:slide_id

Returns one slide by its ID from a deck you own.

Parameters

deck_id
Path param Integer Required

ID of the deck that owns the slides.

slide_id
Path param String Required

ID of the slide, returned by List slides. Use the ID, not the slide number.

Example Response

{
  "data": {
    "id": "a1b2c3d4e5f6",
    "deck_id": 456,
    "position": {
      "horizontal": 0,
      "vertical": null
    },
    "html": "<section data-id=\"a1b2c3d4e5f6\"><h2>Quarterly results</h2></section>",
    "notes": "Introduce the results."
  }
}

Response

Returns the slide HTML, speaker notes, and position. Position indexes start at 0; position.vertical is null for ungrouped slides.

PATCH

/v1/decks/:deck_id/slides/:slide_id

Read-write API key required

Replaces one slide’s HTML, notes, or both while preserving its slide ID. Provide at least one of html or notes.

Parameters

deck_id
Path param Integer Required

ID of the deck that owns the slides.

slide_id
Path param String Required

ID of the slide, returned by List slides. Use the ID, not the slide number.

html
String Optional

Complete replacement HTML for one slide, enclosed in one <section> with no nested <section> elements. Omit to keep the current HTML.

notes
String or null Optional

Speaker notes for the slide. Use null to clear existing notes, or omit to keep them.

Example Request Body

{
  "html": "<section><h2>Updated</h2></section>",
  "notes": "Introduce the results."
}

Response

Returns the slide ID, deck ID, and position without HTML or notes. Use the Get slide endpoint to retrieve content. Validation failures leave the deck unchanged.

POST

/v1/decks/:deck_id/slides

Read-write API key required

Creates a slide and returns its ID. By default, adds it at the horizontal end of the deck. To choose a position, provide insert_before_slide_id or insert_after_slide_id. If that slide is in a vertical group, the new slide joins the same group.

Parameters

deck_id
Path param Integer Required

ID of the deck that owns the slides.

html
String Default "<section></section>" Optional

HTML for one slide, enclosed in one <section> with no nested <section> elements. Defaults to an empty <section>.

notes
String or null Optional

Optional speaker notes for the new slide.

insert_before_slide_id
String Optional

Insert before this slide. Cannot be combined with insert_after_slide_id.

insert_after_slide_id
String Optional

Insert after this slide. Cannot be combined with insert_before_slide_id.

Example Request Body

{
  "html": "<section><h2>Next steps</h2></section>",
  "insert_after_slide_id": "a1b2c3d4e5f6"
}

Response

Returns the generated slide ID, deck ID, and position without HTML or notes. Use the Get slide endpoint to retrieve content.

PATCH

/v1/decks/:deck_id/slides/move

Read-write API key required

Moves slides in the order given in slide_ids. Provide either insert_before_slide_id or insert_after_slide_id, identifying a slide that is not being moved. If that slide is in a vertical group, the moved slides join the same group; otherwise they become horizontal slides.

Parameters

deck_id
Path param Integer Required

ID of the deck that owns the slides.

slide_ids
Array Required

IDs of the slides to change, returned by List slides. Accepts 1–200 unique IDs.

insert_before_slide_id
String Optional

Move the selected slides before this slide. Cannot be combined with insert_after_slide_id.

insert_after_slide_id
String Optional

Move the selected slides after this slide. Cannot be combined with insert_before_slide_id.

Example Request Body

{
  "slide_ids": [
    "f6e5d4c3b2a1",
    "a1b2c3d4e5f6"
  ],
  "insert_after_slide_id": "123456abcdef"
}

Response

Returns count, the number of moved slides. If some requested IDs are not found, the other slides are moved and missing_slide_ids lists the missing IDs. Returns a not-found error if none of the requested slides exist.

DELETE

/v1/decks/:deck_id/slides

Read-write API key required

Removes slides and their speaker notes. Requests that would remove every slide are rejected. A vertical group with only one remaining slide becomes a horizontal slide.

Parameters

deck_id
Path param Integer Required

ID of the deck that owns the slides.

slide_ids
Array Required

IDs of the slides to change, returned by List slides. Accepts 1–200 unique IDs.

Example Request Body

{
  "slide_ids": [
    "f6e5d4c3b2a1",
    "a1b2c3d4e5f6"
  ]
}

Response

Returns count, the number of removed slides. If some requested IDs are not found, the other slides are removed and missing_slide_ids lists the missing IDs. Returns a not-found error if none of the requested slides exist.

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 param 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 param 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 param Integer Required

ID of the deck.

id
Path param 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 param 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 param Integer Required

Deck ID that owns the export.

id
Path param 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 param 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,
    "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.