Exodus Migration API Stage Map

This page maps each migration stage to the API calls used by operators, dashboards, and supervised agents. It covers the raw migration API used by heterogeneous migration validation runs and the lower-level service surface behind guided workflows.

Execution starts with POST /api/v1/migrations/{migrationId}/migrate. Completion uses POST /api/v1/migrations/{migrationId}/complete. Preflight, read, planning, and readiness endpoints are separate checks; they are not alternate names for the same mutation.

End-To-End Stage Flow

Stage Gates

API Responsibility Table

StageRead APIsMutation APIsNotes
CreateGET /api/v1/migrations, GET /api/v1/migrations/{migrationId}POST /api/v1/migrations, PATCH /api/v1/migrations/{migrationId}, DELETE /api/v1/migrations/{migrationId}Heterogeneous mapping is intentionally not supplied in the constructor.
AttachGET /api/v1/migrations/{migrationId}POST /api/v1/migrations/{migrationId}/api/{apiId}, POST /api/v1/migrations/{migrationId}/interlay/{interlayId}Wires source, target, and gateway ownership.
AnalysisGET /analysis/info, GET /analysis/history, GET /analysis/timeseriesPOST /analysis/start, POST /analysis/stop, PATCH /analysis/configMeasures source behavior and workload shape.
CompatibilityGET /compatibility/infoPOST /compatibility/start, POST /compatibility/resolve, POST /compatibility/unresolveBlocks unsupported endpoint, policy, and feature combinations.
Query seedingGET /planning/query-seeding/status, GET /planning/query-seeding/queries, GET /planning/query-seeding/queries/{queryKey}POST /planning/query-seeding/startObserves live traffic and stores normalized query shapes.
Schema mappingGET /planning/schema-mapping, GET /planning/schema-mapping/missing, GET /planning/target-schema-planPOST /planning/run, PATCH /planning/schema-mappingDiscovers source fields, exposes missing mappings, and previews target schema/index plans.
Request mappingGET /planning/request-mapping, GET /planning/request-mapping/missing, GET /planning/request-mapping/query/{queryKey}PATCH /planning/request-mapping, PATCH /planning/request-mapping/query/{queryKey}, PATCH /planning/request-mapping/queriesMaps request templates and response templates for live traffic.
Planning gatePOST /planning/validatePOST /planning/finalizeValidate returns blockers. Finalize moves the plan to ready only when blockers are gone.
Execution gatePOST /execution/preflight, GET /migrations/{migrationId}, GET /migrations/{migrationId}/live_metricsPOST /migrate, POST /pause, POST /resume, POST /cancel/migrate is the canonical start command.
Runtime strategyGET /live-write-mode, GET /live-write-mode/readiness, GET /write-log/status, GET /write-log/gaps, GET /runtime-query-missesPATCH /live-write-mode, PATCH /traffic, PATCH /toggleLogAndReplay must prove replay readiness before switching to strict dual-write or target reads.
CutoverPOST /cutover/preflightPOST /complete/complete is the canonical completion command.

No Duplicate Command Routes

The migration API should have narrow read, validation, preflight, and resource-update endpoints, but should not add duplicate command routes for the same mutation. Keep the public command names stable:

  • start execution with POST /api/v1/migrations/{migrationId}/migrate;
  • complete with POST /api/v1/migrations/{migrationId}/complete;
  • use preflight endpoints to inspect blockers before mutating state.
Last updated: July 5, 2026