{"name":"Crosstown prototype API","version":2,"create":"POST /api/rooms {mode,scenario,clock,turnstileToken}. Browser admission required; 60 new rooms/day globally. Check GET /api/admission before starting.","state":"GET /api/rooms/:id; Authorization: Bearer <key> identifies your role. Full board, no keys.","commands":"POST /api/rooms/:id/orders or /control; Bearer key and a unique UUID Idempotency-Key required. Retry the same body/key to deduplicate. Maximum 240 accepted commands per room.","controls":"Live: play, reset. Manual: play, pause, advance (1–240 whole minutes while paused), speed (0.5/1/2), reset. Reset preserves clock policy.","orders":"{team (host only),crewIds (1–3),intent:retrieve|move|guard|return,destination (move/guard)}","seats":"GET /api/rooms/:id/seats; host key only.","socket":"GET /api/rooms/:id/socket; protocols crosstown, key.<bearer>. Receives snapshots on connect and accepted commands. Project anchorAt locally with the shared engine; no polling. ping/pong is auto-replied while hibernating.","expiry":"Every room expires two hours after creation, even while inactive. Live time is never paused by disconnects. Manual running rooms pause after five minutes without authenticated observation.","safety":"Synthetic geography and schedules. No GPS, actual MTA integration, or built-in opponents. Invite links and access files are bearer credentials."}