# API map ## app/api/routes/system.py - GET / - GET /healthz - GET /api/v1/ping - GET /api/v1/auth/me - GET /api/v1/db/ping - GET /api/v1/manifest ## app/api/routes/uploads.py - POST /api/v1/schemes/upload - GET /api/v1/uploads - GET /api/v1/uploads/{upload_id} - GET /api/v1/uploads/{upload_id}/normalized ## app/api/routes/schemes.py - GET /api/v1/schemes - GET /api/v1/schemes/{scheme_id} - GET /api/v1/schemes/{scheme_id}/current - GET /api/v1/schemes/{scheme_id}/versions - POST /api/v1/schemes/{scheme_id}/versions - GET /api/v1/schemes/{scheme_id}/publish/validation - POST /api/v1/schemes/{scheme_id}/publish - POST /api/v1/schemes/{scheme_id}/unpublish - POST /api/v1/schemes/{scheme_id}/rollback ## app/api/routes/structure.py - GET /api/v1/schemes/{scheme_id}/current/sectors - GET /api/v1/schemes/{scheme_id}/current/groups - GET /api/v1/schemes/{scheme_id}/current/seats - GET /api/v1/schemes/{scheme_id}/current/seats/{seat_id}/price - GET /api/v1/schemes/{scheme_id}/current/svg - GET /api/v1/schemes/{scheme_id}/current/svg/display - GET /api/v1/schemes/{scheme_id}/current/svg/display/meta ## app/api/routes/pricing.py - GET /api/v1/schemes/{scheme_id}/pricing - POST /api/v1/schemes/{scheme_id}/pricing/categories - PUT /api/v1/schemes/{scheme_id}/pricing/categories/{pricing_category_id} - DELETE /api/v1/schemes/{scheme_id}/pricing/categories/{pricing_category_id} - POST /api/v1/schemes/{scheme_id}/pricing/rules - PUT /api/v1/schemes/{scheme_id}/pricing/rules/{price_rule_id} - DELETE /api/v1/schemes/{scheme_id}/pricing/rules/{price_rule_id} ## app/api/routes/pricing_diagnostics.py - GET /api/v1/schemes/{scheme_id}/pricing/coverage - GET /api/v1/schemes/{scheme_id}/pricing/unpriced-seats - GET /api/v1/schemes/{scheme_id}/pricing/explain/{seat_id} - GET /api/v1/schemes/{scheme_id}/pricing/rules/diagnostics ## app/api/routes/test_mode.py - GET /api/v1/schemes/{scheme_id}/test/seats/{seat_id} ## app/api/routes/audit.py - GET /api/v1/schemes/{scheme_id}/audit ## app/api/routes/publish.py - POST /api/v1/schemes/{scheme_id}/draft/pricing/snapshot - GET /api/v1/schemes/{scheme_id}/draft/publish-preview - GET /api/v1/schemes/{scheme_id}/draft/publish-readiness - POST /api/v1/schemes/{scheme_id}/draft/remap/preview - POST /api/v1/schemes/{scheme_id}/draft/remap/apply ## app/api/routes/editor.py - GET /api/v1/schemes/{scheme_id}/editor/context - POST /api/v1/schemes/{scheme_id}/draft/ensure - GET /api/v1/schemes/{scheme_id}/draft/summary - GET /api/v1/schemes/{scheme_id}/draft/structure - GET /api/v1/schemes/{scheme_id}/draft/validation - GET /api/v1/schemes/{scheme_id}/draft/compare-preview - GET /api/v1/schemes/{scheme_id}/draft/seats/records/{seat_record_id} - GET /api/v1/schemes/{scheme_id}/draft/sectors/records/{sector_record_id} - GET /api/v1/schemes/{scheme_id}/draft/groups/records/{group_record_id} - POST /api/v1/schemes/{scheme_id}/draft/sectors - POST /api/v1/schemes/{scheme_id}/draft/groups - DELETE /api/v1/schemes/{scheme_id}/draft/sectors/records/{sector_record_id} - DELETE /api/v1/schemes/{scheme_id}/draft/groups/records/{group_record_id} - PATCH /api/v1/schemes/{scheme_id}/draft/seats/records/{seat_record_id} - POST /api/v1/schemes/{scheme_id}/draft/seats/bulk - PATCH /api/v1/schemes/{scheme_id}/draft/sectors/records/{sector_record_id} - PATCH /api/v1/schemes/{scheme_id}/draft/groups/records/{group_record_id} - POST /api/v1/schemes/{scheme_id}/draft/repair-references ## app/api/routes/admin.py - GET /api/v1/admin/schemes/{scheme_id}/current/artifacts - GET /api/v1/admin/schemes/{scheme_id}/current/validation - POST /api/v1/admin/schemes/{scheme_id}/current/display/regenerate - POST /api/v1/admin/display/backfill - GET /api/v1/admin/artifacts/publish-preview/audit - POST /api/v1/admin/artifacts/publish-preview/cleanup ## Notes - This file is an operational route index, not a generated OpenAPI export. - Update this map in the same change set when adding, removing, renaming, or moving routes. - Query guards such as expected_current_scheme_version_id / expected_scheme_version_id are part of the operational contract for optimistic concurrency on mutable flows. - Draft/editor routes may legally return 409 draft_not_editable when current version is already published and no editable draft exists yet.