Documentation
Docs version 2026-08-storyboard-v2.1. Contracts match the deployed Core service.
Getting started
- Request API access and receive a
pm_live_…key. - Set
PLYMOVE_API_KEYand callPOST /v1/analyses/position. - Expect JSON with
schema: plymove/explain-position-v1in under a few minutes on a warm service.
Base URL: https://api.plymove.com
Authentication
Authorization: Bearer <api_key>- or
X-API-Key: <api_key> - Agent gateway path uses signed
X-Payment-Context(set by the gateway - not by public clients talking to Core directly).
REST API
| Method | Path | Mode | Body (required) |
|---|---|---|---|
| POST | /v2/storyboard/game | sync | pgn, target_elo; optional max_moments, include_rendered_story, engine_depth |
| POST | /v1/analyses/position | sync | fen, target_elo (400-3500) |
| POST | /v1/analyses/game | async (legacy v1) | pgn, target_elo; optional output_format, verbosity (minimal | standard | detailed) |
| POST | /v1/analyses/teaching-moments | async (legacy v1) | pgn, target_elo; optional verbosity (minimal | standard | detailed) |
| POST | /v1/analyses/compare | sync | fen, moves (SAN[]), target_elo |
| POST | /v1/analyses/what-if | sync | alternative_move_san, target_elo; pgn or analysis_id; anchor_ply or move_label |
| GET | /v1/jobs/{job_id} | n/a | Job status |
| GET | /v1/analyses/{analysis_id} | n/a | Result payload |
| GET | /v1/analyses/{analysis_id}/annotated.pgn | n/a | Annotated PGN file |
Optional on most bodies: opponent_elo, engine_depth (4-24, default 16),idempotency_key, client_metadata. Game endpoints also accept verbosity (default standard): controls how many teaching moments are selected — not the model threshold.
MCP
Endpoint: https://mcp.plymove.com/mcp (Streamable HTTP, first-party Cloudflare). Primary whole-game tool: build_game_storyboard (sync storyboard v2). Also: explain_position, compare_moves, analyze_what_if (sync what-if branches). Legacy aliases explain_game and find_teaching_moments route to the same storyboard flow. ChatGPT Apps SDK adapter: https://chatgpt.plymove.com/mcp (same six tools; prepaid server-side key).
- API key:
Authorization: Bearer <key>- no 402; usage on the org rail. - Agent-native: no key → HTTP 402 → x402 → retry. Invalid keys return 401 (never x402).
Agent payments
MCP x402 and HTTP agent gateway (https://agent.plymove.com) share the same Core signed payment context onBase mainnet. Unpaid → 402 → pay → retry → result. Replays are idempotent (Neon payment cache; no duplicate usage).
x402 is priced at 1.5× prepaid unit economics. See Pricing.
Operations
build_game_storyboard- sync Elo-aware game storyboard (POST /v2/storyboard/game)explain_position- sync teaching explanation for a FENcompare_moves- sync learner-relative move comparisonanalyze_what_if- sync user-requested alternative at a decision point (legal RAV PGN, eval vs played move, Maia); reuseanalysis_idfrom storyboardexplain_game/find_teaching_moments- legacy MCP aliases → storyboard v2 (optionalverbositycontrols chapter count)
Storyboard max_moments or legacy verbosity: minimal (~3 chapters), standard (~5, default), detailed (~8).
Async jobs (legacy v1)
v1 game analysis remains on REST for backward compatibility. Prefer storyboard v2 for new integrations.
- Submit game or teaching-moments →
{ job_id, analysis_id, status: "queued", request_id } - Poll
GET /v1/jobs/{job_id}until status issucceededorfailed - Retrieve
GET /v1/analyses/{analysis_id}forstructured_result
Status values: queued | running | succeeded | failed.
Errors
Shape: { "error": { "code", "message", "request_id?", "details?" } }
Stable codes: INVALID_PGN, INVALID_FEN, INVALID_MOVES,UNSUPPORTED_ELO, ENGINE_UNAVAILABLE, ANALYSIS_TIMEOUT,QUOTA_DENIED, PAYMENT_DENIED, NOT_FOUND, CONFLICT,INTERNAL_ERROR.
Rate limits
No public HTTP rate-limit headers are documented yet. Practical limits include max PGN size and analysis time budgets on the service. Contact us for volume needs.
Idempotency
Pass idempotency_key in the JSON body (not a header). Uniqueness is per(organization, idempotency_key, operation). Retries return the same analysis/job instead of enqueueing duplicate work. Agent payments additionally cache by payment_reference.
Annotated PGN output
Game analysis can return annotated PGN (output_format: "annotated_pgn" default). Fetch viaGET /v1/analyses/{id}/annotated.pgn (application/x-chess-pgn).
Examples
See Developers for curl and Python. Health check:
curl https://api.plymove.com/health