Terminal quickstart
The masko command signs in to your Masko account and calls the Masko API for you: the same requests and responses as the REST API, with your browser login instead of an API key. It runs on Apple Silicon Macs with macOS 14 or later. It does not show mascots on screen; Masko for Mac does, see Float a mascot on your Mac.
Coding agents such as Claude Code, Codex and Cursor can also connect to the Masko MCP server, which needs no install.
Install
curl -fsSL https://releases.masko.ai/cli/install.sh | shThis installs the signed, notarized CLI at ~/.local/bin/masko, adds that folder to your PATH in ~/.zshrc (or ~/.bash_profile for bash), and opens your browser to sign you in. Over SSH it shows a code to enter on any device instead, and Ctrl+C skips sign-in. Then open a new terminal before you run masko. Running the installer again updates the CLI and keeps your sign-in; in scripts and CI it never waits for a browser. To leave your shell profile alone, put MASKO_NO_MODIFY_PATH=1 on the right side of the pipe and add export PATH="$HOME/.local/bin:$PATH" yourself. No Xcode, Node.js or checkout is needed. Intel Macs, Linux and Windows can use the REST API or the MCP server.
The installer sends anonymous install reports, never account data. To turn them off, put the variable on the right side of the pipe:
curl -fsSL https://releases.masko.ai/cli/install.sh | MASKO_TELEMETRY_DISABLED=1 shThat choice is kept for later installs. DO_NOT_TRACK=1 works too. The masko command itself sends no analytics.
Sign in and check your account
masko login
masko whoami
masko creditsThe installer already signed you in. masko login signs in again, for example to switch account or workspace: it prints a link, opens your browser and returns after you approve; choose your account and workspace there. Over SSH or on another computer, use masko login --device --no-browser. See CLI login. masko logout signs out on this Mac.
Make a mascot
masko studio METHOD PATH calls any Masko API path. --file sends a JSON body, or an image or video to upload.
masko studio GET projects
masko studio POST upload --file character.png
masko studio POST mascots --file mascot.json
masko studio POST mascots/MASCOT_ID/generate --file pose.json
masko studio GET 'jobs/JOB_ID?wait=true'
masko assets download ASSET_ID --output mascot.webmmascot.json can be {"project_id": "PROJECT_ID", "name": "Ko", "reference_asset_ids": ["ASSET_ID"]}, with a project from the first command and the asset_id that upload returned. pose.json can be {"type": "image", "name": "Wave", "prompt": "waving hello"}, or {"type": "animation", "item_id": "ITEM_ID", "animation_model": "standard", "animation_prompt": "waves hello"} to animate a pose. The quickstart lists every field. Generation spends credits: an image is 1 credit and a Standard animation 2 credits a second. Name the model: without animation_model, the older price of 5 credits a second applies. A mascot made from a prompt draws its first image for 1 credit and is hosted on the public CDN unless settings.cdn_enabled is false.
The output is the API's own response: data, plus meta.pagination for lists. When has_more is true, ask for the next page with next_cursor:
masko studio GET 'assets?mascot_id=MASCOT_ID&limit=100'
masko studio GET 'assets?mascot_id=MASCOT_ID&limit=100&cursor=NEXT_CURSOR'Paths are the API's /v1 paths, such as mascots, canvases/CANVAS_ID or credit-checkouts; a job's poll_url works as it is. Sign-in, admin and the old collections paths are not available here. Requests use API version 2026-09-26, like the MCP server.
Retry without paying twice
Every POST sends an idempotency key. When a POST fails without an answer, or you press Control+C, masko prints its key. Run the same command with that key, and Masko returns the first result instead of running or charging it again:
masko studio POST mascots/MASCOT_ID/generate --file pose.json --idempotency-key KEYErrors
Errors print the API's code and message, the field that was wrong and a request ID to give support. With --json they are JSON on stdout, {"error": {"code", "message", "status", "request_id", "doc_url", ...}}, and the exit code is 1. A 402 says how many credits are needed and where to buy more, on Billing. See errors.
Update or choose a version
Run the install command again for the latest version; your sign-in is kept. Once a day, masko also says when a newer version is out (MASKO_NO_UPDATE_CHECK=1 turns that off). To install a specific version, use its number from the changelog:
curl -fsSL https://releases.masko.ai/cli/install.sh | MASKO_VERSION=0.4.0 sh
masko --versionNext steps
- Command line reference: every command and option.
- Quickstart: the API requests to make a mascot and its animations.
- TypeScript SDK: the same calls from Node.js or Electron main.
- Masko MCP server: connect Claude Code, Codex, Cursor, Claude or ChatGPT.
