The live product API is platform-api (local :8790, $PLATFORM_API_URL). Paths are origin-rooted (/runs, /mcp). Do not call https://api.wavemaker.io/api/v1/videos or worker /mcp — those routes return HTTP 410.
| Surface | Host | REST | MCP | Auth |
|---|---|---|---|---|
| Platform (live) | $PLATFORM_API_URL | /discover, /runs, /iterate/*, /openapi.json | Bearer POST /mcp | wm_ key or org JWT |
| KEEP worker | api.wavemaker.io | Auth, billing, Studio Inngest | /mcp → 410 | Site login / Stripe |
| Managed media (retired) | api.wavemaker.io | /api/v1/* gen → 410 | OAuth /mcp → 410 | — |
Contracts: OpenAPI YAML · public GET $PLATFORM_API_URL/openapi.json · api-mcp guide · /developers#platform.
Authentication
Mint a wm_ key in the app (Account → Keys) and send it as a bearer token:
curl -X POST "$PLATFORM_API_URL/runs" \
-H "Authorization: Bearer wm_your_key_here" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"workflowId":"<uuid>","graph":{...},"inputs":{"prompt":"editorial lookbook"}}'
MCP:
curl -X POST "$PLATFORM_API_URL/mcp" \
-H "Authorization: Bearer wm_your_key_here" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Scopes: runs:read / runs:write / workflows:write. Product shell cookie is wm_shell (POST /auth/shell-session); direct platform-api cookie is wm_session (POST /auth/session). CSRF on cookie auth: X-Platform-Client: web on unsafe methods.
Copy-paste client setup (Cursor, Claude Desktop, Claude Code) is on /developers#platform.
The core flow
# 1. Discover or bind a workflow, or author a graph in a session
GET /discover?q=fashion
POST /sessions
POST /sessions/{id}/op # SessionOp / GraphOp
# MCP: search_workflows → create_session → get_session → apply_workflow / edit_graph
# 2. Validate (free) + cost preflight
POST /workflows/validate
POST /runs/preflight
# 3. Submit (Idempotency-Key recommended)
POST /runs
# MCP: run_workflow (session) or submit_run
# 4. Poll
GET /runs/{runId}
GET /runs/{runId}/events
GET /run-groups/{runGroupId}
# 5. Iterate a gallery file
POST /iterate/resolve
POST /iterate/execute # clientRequestId; likenessConsent for face_swap
Large uploads: MCP mint_file_upload returns a presigned PUT URL. Parked identity refs: POST /run-groups/{id}/resume with inputs. Production edit on idle General Video: POST /run-groups/{id}/edit. Reassemble a terminal group: POST /run-groups/{id}/reassemble.
Catalog campaigns (DCO): POST /campaigns/engage with feedFileId + template (static-ads | ads-catalog-video, {{slot}} prompt) — 24-variant cap, campaignId = runGroupId. Poll GET /campaigns/{id}. MCP: engage_campaign / get_campaign. Dashboard: /platform/campaigns. Creative packs: /creative-packs/*.
Retired managed kernel (HTTP 410)
POST /api/v1/videos, /api/v1/static-ads, /api/v1/audio, /api/v1/w/{slug}/runs, worker OAuth /mcp, and the old workspace tool catalog are gone. Do not copy them into new integrations. Historical shape (if you are migrating): docs/public-api.md (archived) and the retired block on /developers.
Use the Platform table above instead.