Skip to content
maskostudioDocs

All pages

  • Overview/docs/use-cases
  • Mobile app/docs/use-cases#mobile
  • Website/docs/use-cases#website
  • Desktop/docs/use-cases#desktop
  • AI agents/docs/use-cases#agents
  • Videos/docs/use-cases#videos
  • Brand/docs/use-cases#brand
  • Start building/docs/ai-agents
  • Set up once/docs/ai-agents#set-up-once
  • Ask in plain words/docs/ai-agents#ask-in-plain-words
  • What your agent does/docs/ai-agents#what-your-agent-does
  • MCP server/docs/mcp
  • Masko for Cursor/docs/ai-tools/cursor
  • Masko in ChatGPT/docs/ai-tools/chatgpt
  • Start here/docs/tutorials#start-here
  • All tutorials/docs/tutorials
  • Create your first mascot/docs/tutorials/first-mascot
  • Create an animated character/docs/tutorials/first-animation
  • Make a character talk/docs/tutorials/make-it-talk
  • Put your mascot on your website/docs/tutorials/mascot-on-your-website
  • Guide onboarding with a talking mascot/docs/tutorials/web-onboarding-mascot
  • Add a mascot that celebrates progress and welcomes users back/docs/tutorials/web-progress-companion
  • Add a talking support mascot in the bottom right/docs/tutorials/web-support-mascot
  • Show a mascot while your AI thinks/docs/tutorials/ai-loading-mascot
  • Give your AI agent a face/docs/tutorials/ai-agent-face
  • Animate the mascot you already have/docs/tutorials/animate-your-mascot
  • How to make Telegram stickers/docs/tutorials/telegram-stickers
  • How to make Discord stickers/docs/tutorials/discord-stickers
  • Quickstart: your first animation/docs/quickstart
  • Terminal quickstart/docs/terminal
  • API keys and workspaces/docs/authentication
  • CLI browser login/docs/authentication/cli
  • How mascots work/docs/how-mascots-work
  • Credits and costs/docs/credits
  • From text/docs/create/from-text
  • From an image/docs/create/from-image
  • From a website/docs/create/from-website
  • From a brand book/docs/create/from-brand-book
  • Reference images/docs/manage/references
  • What you can generate/docs/generation
  • Pose-to-animation walkthrough/docs/generate/workflow
  • Images and poses/docs/generate/images
  • Animations/docs/generate/animations
  • Talking animations/docs/generate/talking
  • Logos, backgrounds and stickers/docs/generate/design-assets
  • Cursor follower/docs/generate/cursor-follower
  • Batch generation/docs/generate/batch
  • Image and video exports/docs/manage/media-exports
  • Canvases and releases/docs/canvas
  • Build a canvas/docs/canvas/build
  • Canvas templates/docs/canvas/templates
  • Generate canvas assets/docs/canvas/generate-all
  • Export a canvas/docs/canvas/export
  • Overview and demo/docs/player
  • Play one animation/docs/player/one-animation
  • Play a canvas/docs/player/canvas
  • Hosting and file formats/docs/generate/cdn
  • File sizes/docs/generate/file-sizes
  • Float a mascot on your Mac/docs/integrations/desktop
  • Jobs and polling/docs/manage/jobs
  • Webhooks/docs/manage/webhooks
  • Manage mascots and assets/docs/manage/collections
  • All endpoints/docs/reference
  • Requests and responses/docs/reference/conventions
  • Errors and recovery/docs/reference/errors
  • Command line reference/docs/terminal/commands
  • TypeScript SDK/docs/sdk/typescript
  • Changelog/docs/reference/changelog
  • Migrate to mascots and canvases/docs/manage/studio-migration
Get an API key
Documentation

Export a canvas

Export a fully generated canvas as JSON: its nodes, edges, video URLs and inputs, as a MaskoAnimationConfig by default.

curl https://api.masko.ai/v1/canvases/CANVAS_ID/export \
  -H "Authorization: Bearer masko_YOUR_API_KEY"

Before exporting

Turn on asset hosting with Get Links in the Masko app or with POST /v1/mascots/MASCOT_ID/publish (turn on hosting), then wait for status.media.generation.ready: true on the canvas: every node image and edge video completed, not just assigned. Otherwise the export returns HTTP 400.

The MaskoAnimationConfig

A versioned JSON format (currently 2.0) describing the state machine. All media URLs use the public CDN.

Response Structure

{
  "version": "2.0",
  "name": "My Mascot",
  "initialNode": "idle",
  "autoPlay": true,
  "clickEffect": "none",
  "nodes": [
    {
      "id": "idle",
      "name": "Idle",
      "transparentThumbnailUrl": "https://assets.masko.ai/57fa7e3f-4fdb-556a-8167-968b2b3d8f4b/idle.png"
    },
    {
      "id": "waving",
      "name": "Waving",
      "transparentThumbnailUrl": "https://assets.masko.ai/57fa7e3f-4fdb-556a-8167-968b2b3d8f4b/waving.png"
    },
    {
      "id": "thinking",
      "name": "Thinking",
      "transparentThumbnailUrl": "https://assets.masko.ai/57fa7e3f-4fdb-556a-8167-968b2b3d8f4b/thinking.png"
    }
  ],
  "edges": [
    {
      "id": "idle-loop",
      "source": "idle",
      "target": "idle",
      "isLoop": true,
      "duration": 4,
      "videos": {
        "webm": "https://assets.masko.ai/57fa7e3f-4fdb-556a-8167-968b2b3d8f4b/idle-loop.webm",
        "hevc": "https://assets.masko.ai/57fa7e3f-4fdb-556a-8167-968b2b3d8f4b/idle-loop.mp4"
      }
    },
    {
      "id": "idle-to-waving",
      "source": "idle",
      "target": "waving",
      "isLoop": false,
      "duration": 4,
      "videos": {
        "webm": "https://assets.masko.ai/57fa7e3f-4fdb-556a-8167-968b2b3d8f4b/idle-to-waving.webm",
        "hevc": "https://assets.masko.ai/57fa7e3f-4fdb-556a-8167-968b2b3d8f4b/idle-to-waving.mp4"
      },
      "conditions": [{ "input": "behavior::interact", "op": "==", "value": true }]
    },
    {
      "id": "waving-to-idle",
      "source": "waving",
      "target": "idle",
      "isLoop": false,
      "duration": 4,
      "videos": {
        "webm": "https://assets.masko.ai/57fa7e3f-4fdb-556a-8167-968b2b3d8f4b/waving-to-idle.webm",
        "hevc": "https://assets.masko.ai/57fa7e3f-4fdb-556a-8167-968b2b3d8f4b/waving-to-idle.mp4"
      }
    }
  ],
  "inputs": [
    {
      "name": "behavior::interact",
      "type": "boolean",
      "default": false
    }
  ]
}

Config Fields

FieldTypeDescription
versionstringConfig format version. Currently "2.0".
namestringDisplay name of the canvas.
initialNodestringID of the node to display on load.
autoPlaybooleanStart playing the initial loop automatically.
clickEffectstringOptional click effect, currently "ripple" or "none".
nodes[]arrayMascot poses. Each has id, name, and optional transparentThumbnailUrl.
edges[]arrayTransitions between nodes. Each has source, target, isLoop, duration, videos, and optional conditions. A node can have several isLoop edges: the first without conditions is its loop, and the others play while their conditions hold, or now and then when they have none.
inputs[]arrayProgrammatic inputs. Each has name, type, and default.

Play it

Apps play a release, not this config: create one through /v1/canvases/CANVAS_ID/history, fetch its signed delivery through your backend and play it with the Masko player. Never pass a raw draft export or an API key to a visitor.

In the config, each edge's webm URL is for Chrome, Firefox and Edge, and its hevc (MP4) URL for Safari.

Targeted delivery

?delivery=1&target=macos returns the runtime delivery envelope under data instead of the config. target also accepts android (stacked MP4, for Android players), apple (HEVC, for iPhone, iPad and Mac players), web, windows or full, which select media formats; the desktop runtime itself runs on macOS only.

mode=selected is the default and mode=manifest requests manifest delivery. An optional positive integer size selects a variant. See the endpoint reference for the envelope fields.