{"name":"SPED API","routes":[{"method":"GET","pattern":"/health","auth":false,"admin":false,"description":"Liveness and feature flags."},{"method":"GET","pattern":"/","auth":false,"admin":false,"description":"Self-describing route index."},{"method":"POST","pattern":"/auth/challenge","auth":false,"admin":false,"description":"Issue a single-use challenge to sign."},{"method":"POST","pattern":"/auth/verify","auth":false,"admin":false,"description":"Exchange a signed LOGIN challenge for a session token."},{"method":"POST","pattern":"/auth/logout","auth":true,"admin":false,"description":"Revoke the current session."},{"method":"GET","pattern":"/auth/me","auth":true,"admin":false},{"method":"GET","pattern":"/horses/:id","auth":false,"admin":false,"description":"Public horse view."},{"method":"GET","pattern":"/horses/:id/render","auth":false,"admin":false,"description":"Everything the Three.js client needs to draw this horse."},{"method":"GET","pattern":"/wallet/:wallet/horses","auth":false,"admin":false,"description":"Every horse a wallet currently owns, with its league."},{"method":"POST","pattern":"/horses/:id/name","auth":true,"admin":false,"description":"Name a horse. Once, by the original owner, forever."},{"method":"GET","pattern":"/generations/active","auth":false,"admin":false,"description":"Active generation supply and whether it can still be minted."},{"method":"GET","pattern":"/mint/tiers","auth":false,"admin":false},{"method":"POST","pattern":"/mint/create","auth":true,"admin":false,"description":"Request a mint quote. Returns where to send $SPED."},{"method":"POST","pattern":"/mint/:id/submit","auth":true,"admin":false,"description":"Record the payment transaction. Verification happens in the background."},{"method":"GET","pattern":"/mint/:id","auth":true,"admin":false,"description":"Poll a mint until COMPLETED or FAILED."},{"method":"GET","pattern":"/market","auth":false,"admin":false,"description":"Browse open listings."},{"method":"GET","pattern":"/market/:id","auth":false,"admin":false},{"method":"POST","pattern":"/market/list","auth":true,"admin":false,"description":"List a horse for sale."},{"method":"POST","pattern":"/market/:id/reserve","auth":true,"admin":false,"description":"Claim the exclusive right to buy. Returns payment instructions."},{"method":"POST","pattern":"/market/:id/pay","auth":true,"admin":false,"description":"Record the purchase payment."},{"method":"POST","pattern":"/market/:id/cancel","auth":true,"admin":false,"description":"Withdraw a listing. Not available once the buyer has paid."},{"method":"GET","pattern":"/race-lobbies","auth":false,"admin":false,"description":"Open matchmaking lobbies with public ready and wagering state."},{"method":"GET","pattern":"/race-lobbies/:id","auth":false,"admin":false},{"method":"POST","pattern":"/race-lobbies","auth":true,"admin":true,"description":"Create an authoritative race lobby."},{"method":"POST","pattern":"/race-lobbies/:id/join","auth":true,"admin":false,"description":"Enter one owned horse in its assigned league."},{"method":"POST","pattern":"/race-lobbies/:id/ready","auth":true,"admin":false,"description":"Ready an entered horse. The field locks atomically when everyone is ready."},{"method":"POST","pattern":"/race-lobbies/:id/leave","auth":true,"admin":false,"description":"Leave before wagering opens."},{"method":"GET","pattern":"/custody/balance","auth":true,"admin":false},{"method":"POST","pattern":"/custody/faucet","auth":true,"admin":false,"description":"Simulation credits. Refused when real wagering is enabled."},{"method":"POST","pattern":"/custody/deposit","auth":true,"admin":false},{"method":"POST","pattern":"/custody/deposit/:id/submit","auth":true,"admin":false,"description":"Record the deposit transaction."},{"method":"POST","pattern":"/custody/withdraw","auth":true,"admin":false,"description":"Withdraw to your own wallet. Requires a signed WITHDRAW challenge."},{"method":"GET","pattern":"/custody/deposit/:id","auth":true,"admin":false,"description":"Poll your own deposit until it is credited or fails."},{"method":"GET","pattern":"/custody/withdraw/:id","auth":true,"admin":false,"description":"Poll your own withdrawal until it is sent or fails."},{"method":"GET","pattern":"/admin/reconcile","auth":true,"admin":true,"description":"Liabilities against the custody wallet."},{"method":"GET","pattern":"/rewards/pool","auth":false,"admin":false,"description":"The tournament prize pool and how it will be split."},{"method":"GET","pattern":"/rankings","auth":false,"admin":false,"description":"The competitive ladder, best first."},{"method":"GET","pattern":"/wallet/:wallet/profile","auth":false,"admin":false,"description":"A wallet stable summary and record."},{"method":"GET","pattern":"/me/wagers","auth":true,"admin":false,"description":"Your own wagers, most recent first."},{"method":"GET","pattern":"/races/recent","auth":false,"admin":false,"description":"Recently completed races and who won them."},{"method":"GET","pattern":"/wallet/:wallet/races","auth":false,"admin":false,"description":"Settled races this wallet had a runner in, newest first."},{"method":"GET","pattern":"/races/:id","auth":false,"admin":false,"description":"Race card and status."},{"method":"GET","pattern":"/races/:id/replay","auth":false,"admin":false,"description":"Deterministic position samples and events for the client to render."},{"method":"POST","pattern":"/races/:id/wagers","auth":true,"admin":false,"description":"Place a wager from your custody balance."},{"method":"GET","pattern":"/races/:id/wagers","auth":false,"admin":false,"description":"Wagers on a race. Stakes are public; identities are not."}]}