wakato-io Decks API
Presentation decks: slides of HTML and CSS in a 1280×720 frame, pictures and video from the space's Assets, speaker notes, a link per person and who watched it how far. Uses the decks scope.
Presentation decks: slides of HTML and CSS in a 1280×720 frame, pictures and video from the space's Assets, speaker notes, a link per person and who watched it how far. Uses the decks scope.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/wakato-io:wakato-io-decks-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Wakato Space Decks API
version: 1.0.0
description: 'The **Wakato Space API** lets an external agent or tool (Claude Code, Cursor,
Zapier, a partner integration, your own scripts) operate a single Wakato
**Space** using a scoped Bearer token (a *Space API key*, `wks_live_…`).
The **same token** works two ways:
- **REST** — the endpoints documented here (`/functions/v1/space-api/…`).
- **MCP** — a Model Context Protocol server at `/functions/v1/space-mcp`
that exposes the same operations as tools to MCP clients. MCP clients
self-discover the tools via `tools/list`; see the Quickstart to connect.
### Authentication
Send the key as a Bearer token: `Authorization: Bearer wks_live_…`.
A key is locked to exactly one Space and cannot read or write any other
Space, the wallet (beyond read), member permissions, or other users.
### Scopes
Every key grants per-domain scopes with up to three actions:
- `read` — list / inspect
- `write` — create / edit
- `run` — the *consequential* action (publish a page, send an SMS, post
socially, run an automation). Public/billable actions are deliberately
split into `run` so you grant them explicitly.
Each operation below notes its required scope via `x-required-scope`.
A call without the scope returns `403`.
### Safety model
- Wallet, Finance, Integrations are **read-only**. Money is never moved.
- Secrets returns **names only** — values are never exposed.
- Social posts and ad campaigns default to **drafts**; going live requires
the `run` scope. Connecting new OAuth accounts is never done by a key.'
servers:
- url: https://api.wakato.io/functions/v1/space-api
description: Production
- url: https://pnwxrleocjbcvrrwrycq.supabase.co/functions/v1/space-api
description: Development
security:
- bearerAuth: []
tags:
- name: Decks
description: 'Presentation decks: slides of HTML and CSS in a 1280×720 frame, pictures and video from the space''s Assets, speaker notes, a link per person and who watched it how far. Uses the decks scope.'
paths:
/decks:
get:
tags:
- Decks
summary: List decks
description: '**Required scope:** `decks:read`
Title, how many slides, who made it, when it was changed, how it is shared, and its link in the editor.'
x-required-scope: decks:read
parameters:
- in: query
name: query
schema:
type: string
description: Words in the title
- in: query
name: limit
schema:
type: integer
responses:
'200':
$ref: '#/components/responses/Ok'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X GET \"https://api.wakato.io/functions/v1/space-api/decks\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\""
operationId: getDecks
x-operation-id-source: derived
post:
tags:
- Decks
summary: Create a deck with all its slides
description: '**Required scope:** `decks:write`
Each slide is the HTML + CSS inside one 1280×720 box (no scripts, no
forms). `theme_css` sits above every slide; `fonts` are Google Fonts
families with their weights (at most three). Pictures and videos must
be files of this space''s Assets, bound by id:
`" src="">` — anything else is
refused and nothing is saved.'
x-required-scope: decks:write
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- title
- slides
properties:
title:
type: string
description:
type: string
theme_css:
type: string
fonts:
type: array
items:
type: string
transition:
type: string
enum:
- none
- fade
- slide
slides:
type: array
items:
type: object
required:
- html
properties:
html:
type: string
description: The inside of one 1280×720 slide; data-build="1", "2"… on what appears one click at a time
notes:
type: string
description: Speaker notes
responses:
'201':
$ref: '#/components/responses/Created'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X POST \"https://api.wakato.io/functions/v1/space-api/decks\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"title\": \"Launch plan\",\n \"slides\": []\n}'"
operationId: postDecks
x-operation-id-source: derived
/decks/{id}:
parameters:
- in: path
name: id
required: true
schema:
type: string
get:
tags:
- Decks
summary: Get a deck (its look and every slide)
x-required-scope: decks:read
responses:
'200':
$ref: '#/components/responses/Ok'
description: '**Required scope:** `decks:read`'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X GET \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\""
operationId: getDecksById
x-operation-id-source: derived
patch:
tags:
- Decks
summary: Change a deck's title, description or look
x-required-scope: decks:write
requestBody:
content:
application/json:
schema:
type: object
properties:
title:
type: string
description:
type: string
theme_css:
type: string
fonts:
type: array
items:
type: string
transition:
type: string
enum:
- none
- fade
- slide
responses:
'200':
$ref: '#/components/responses/Ok'
description: '**Required scope:** `decks:write`'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X PATCH \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{}'"
operationId: patchDecksById
x-operation-id-source: derived
delete:
tags:
- Decks
summary: Delete a deck (its links stop working)
x-required-scope: decks:write
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- confirm_title
properties:
confirm_title:
type: string
description: The deck's exact title
responses:
'200':
$ref: '#/components/responses/Ok'
description: '**Required scope:** `decks:write`'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X DELETE \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"confirm_title\": \"Launch plan\"\n}'"
operationId: deleteDecksById
x-operation-id-source: derived
/decks/{id}/views:
parameters:
- in: path
name: id
required: true
schema:
type: string
get:
tags:
- Decks
summary: Who watched a deck
description: '**Required scope:** `decks:read`
Every person, each visit, the slides in the order they went through with seconds on each, where they stopped, whether they finished or downloaded the PDF, and who is watching now.'
x-required-scope: decks:read
parameters:
- in: query
name: viewer_id
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Ok'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X GET \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c/views\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\""
operationId: getDecksByIdViews
x-operation-id-source: derived
/decks/{id}/preview:
parameters:
- in: path
name: id
required: true
schema:
type: string
post:
tags:
- Decks
summary: Look at a deck
description: '**Required scope:** `decks:write`
One picture of every slide (or one slide with slide_id), and for each slide whether its words run out of the frame or are too small on a phone.'
x-required-scope: decks:write
requestBody:
content:
application/json:
schema:
type: object
properties:
slide_id:
type: string
responses:
'200':
$ref: '#/components/responses/Ok'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X POST \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c/preview\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{}'"
operationId: postDecksByIdPreview
x-operation-id-source: derived
/decks/{id}/share:
parameters:
- in: path
name: id
required: true
schema:
type: string
post:
tags:
- Decks
summary: Share a deck outside the space
description: '**Required scope:** `decks:run`
`people` each get a link of their own; `public_link` turns on one link
for anyone (`ask_email` asks for an email first, `check_email` sends a
code to it); `pdf` lets them download it; `remove_people` takes
person links away. Nothing is sent.'
x-required-scope: decks:run
requestBody:
content:
application/json:
schema:
type: object
properties:
people:
type: array
items:
type: object
properties:
name:
type: string
email:
type: string
contact_id:
type: string
remove_people:
type: array
items:
type: string
public_link:
type: boolean
ask_email:
type: boolean
check_email:
type: boolean
pdf:
type: boolean
responses:
'200':
$ref: '#/components/responses/Ok'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X POST \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c/share\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{}'"
operationId: postDecksByIdShare
x-operation-id-source: derived
/decks/{id}/media:
parameters:
- in: path
name: id
required: true
schema:
type: string
post:
tags:
- Decks
summary: Replace one Assets file with another wherever the deck uses it
x-required-scope: decks:write
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- from_asset_id
- to_asset_id
properties:
from_asset_id:
type: string
to_asset_id:
type: string
slide_id:
type: string
description: Only on this slide
responses:
'200':
$ref: '#/components/responses/Ok'
description: '**Required scope:** `decks:write`'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X POST \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c/media\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"from_asset_id\": \"b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c\",\n \"to_asset_id\": \"b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c\"\n}'"
operationId: postDecksByIdMedia
x-operation-id-source: derived
/decks/{id}/slides:
parameters:
- in: path
name: id
required: true
schema:
type: string
post:
tags:
- Decks
summary: Add a slide
x-required-scope: decks:write
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- html
properties:
html:
type: string
notes:
type: string
position:
type: integer
description: 1 = first; default last
responses:
'201':
$ref: '#/components/responses/Created'
description: '**Required scope:** `decks:write`'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X POST \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c/slides\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"html\": \"example\"\n}'"
operationId: postDecksByIdSlides
x-operation-id-source: derived
/decks/{id}/slides/{slideId}:
parameters:
- in: path
name: id
required: true
schema:
type: string
- in: path
name: slideId
required: true
schema:
type: string
patch:
tags:
- Decks
summary: Write a slide's html and/or speaker notes again
x-required-scope: decks:write
requestBody:
content:
application/json:
schema:
type: object
properties:
html:
type: string
notes:
type: string
responses:
'200':
$ref: '#/components/responses/Ok'
description: '**Required scope:** `decks:write`'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X PATCH \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c/slides/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{}'"
operationId: patchDecksByIdSlidesBySlideId
x-operation-id-source: derived
delete:
tags:
- Decks
summary: Take a slide out (it stays in the deck's history)
x-required-scope: decks:write
responses:
'200':
$ref: '#/components/responses/Ok'
description: '**Required scope:** `decks:write`'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X DELETE \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c/slides/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\""
operationId: deleteDecksByIdSlidesBySlideId
x-operation-id-source: derived
/decks/{id}/slides/{slideId}/edit:
parameters:
- in: path
name: id
required: true
schema:
type: string
- in: path
name: slideId
required: true
schema:
type: string
post:
tags:
- Decks
summary: Change one piece of a slide's html (find → replace)
x-required-scope: decks:write
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- find
- replace
properties:
find:
type: string
replace:
type: string
all:
type: boolean
responses:
'200':
$ref: '#/components/responses/Ok'
description: '**Required scope:** `decks:write`'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X POST \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c/slides/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c/edit\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"find\": \"example\",\n \"replace\": \"example\"\n}'"
operationId: postDecksByIdSlidesBySlideIdEdit
x-operation-id-source: derived
/decks/{id}/slides/{slideId}/move:
parameters:
- in: path
name: id
required: true
schema:
type: string
- in: path
name: slideId
required: true
schema:
type: string
post:
tags:
- Decks
summary: Move a slide to a new place in its deck
x-required-scope: decks:write
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- to
properties:
to:
type: integer
description: 1 = first
responses:
'200':
$ref: '#/components/responses/Ok'
description: '**Required scope:** `decks:write`'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X POST \"https://api.wakato.io/functions/v1/space-api/decks/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c/slides/b7e4a1c2-9d3f-4e8a-b2c1-5f6d7e8a9b0c/move\" \\\n -H \"Authorization: Bearer wks_live_YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"to\": 1\n}'"
operationId: postDecksByIdSlidesBySlideIdMove
x-operation-id-source: derived
components:
responses:
Ok:
description: Success
content:
application/json:
schema:
type: object
Created:
description: Created
content:
application/json:
schema:
type: object
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: A Space API key, e.g. `wks_live_…`.