{"openapi":"3.0.3","info":{"title":"Wits World API","description":"Hand-written HTTP API for the Wits Quest game.","version":"0.0.0"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Auth0 bearer access token issued for the Wits World API."}},"schemas":{}},"paths":{"/health":{"get":{"operationId":"getHealth","summary":"Check API health","tags":["System"],"description":"Confirms that the Wits World API process is running and accepting requests.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["status","service","requestId"],"properties":{"status":{"type":"string","enum":["ok"]},"service":{"type":"string","enum":["Wits World API"]},"requestId":{"type":"string"}}}}}}}}},"/api/v1/":{"get":{"operationId":"getApiVersion","summary":"Get API version information","tags":["System"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name","version","requestId"],"properties":{"name":{"type":"string","enum":["Wits World API"]},"version":{"type":"string","enum":["v1"]},"requestId":{"type":"string"}}}}}}}}},"/api/v1/auth/account-deletion":{"post":{"operationId":"deleteCurrentPlayerAccount","summary":"Permanently delete the current player account","tags":["Authentication"],"description":"Requires a valid API access token, recent Auth0 reauthentication proof, and explicit permanent-deletion confirmation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["reauthenticationToken","confirmation"],"properties":{"reauthenticationToken":{"type":"string","minLength":1,"maxLength":16384,"description":"Fresh Auth0 ID token used only as recent-authentication proof."},"confirmation":{"type":"string","minLength":1,"description":"Must exactly equal DELETE_MY_ACCOUNT."}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["deletionId","status","requestId"],"properties":{"deletionId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["completed"]},"requestId":{"type":"string"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["deletionId","status","requestId"],"properties":{"deletionId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["retry_pending"]},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/auth/me":{"get":{"operationId":"getCurrentPlayer","summary":"Get the current player","tags":["Authentication"],"description":"Resolves the authenticated Auth0 identity to the current local Wits World player.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["id","playerName","playerNameSetupRequired","role","lifecycleStatus","requestId"],"properties":{"id":{"type":"string","format":"uuid"},"role":{"type":"string","enum":["player","author"]},"lifecycleStatus":{"type":"string","enum":["active","deletion_pending","deleted"]},"playerName":{"type":["null","string"],"minLength":3,"maxLength":20},"playerNameSetupRequired":{"type":"boolean"},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[401]},"code":{"type":"string","enum":["UNAUTHORIZED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/auth/me/player-name":{"put":{"operationId":"assignCurrentPlayerName","summary":"Choose the current Google player Player Name","tags":["Authentication"],"description":"Assigns the authenticated Google player their one-time, immutable Basic Tier Player Name.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["playerName"],"properties":{"playerName":{"type":"string","description":"Between 3 and 20 characters using letters, numbers, and _ + - . ! # $ ^ ` ~ @ '; email and phone number formats are not allowed."}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["id","playerName","playerNameSetupRequired","role","lifecycleStatus","requestId"],"properties":{"id":{"type":"string","format":"uuid"},"role":{"type":"string","enum":["player","author"]},"lifecycleStatus":{"type":"string","enum":["active","deletion_pending","deleted"]},"playerName":{"type":["null","string"],"minLength":3,"maxLength":20},"playerNameSetupRequired":{"type":"boolean"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/events":{"get":{"operationId":"listPlayerEvents","summary":"List published events for players","tags":["Events"],"description":"Returns player-safe published event information for the campus map and event list.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["events","requestId"],"properties":{"events":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["eventId","title","description","latitude","longitude","radiusMetres","startsAt","endsAt","availability"],"properties":{"eventId":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"radiusMetres":{"type":"number","exclusiveMinimum":0},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"availability":{"type":"string","enum":["active","upcoming","ended"]}}}},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/events/{eventId}/eligibility":{"post":{"operationId":"evaluateEventEligibility","summary":"Evaluate a player location claim for an event","tags":["Events"],"description":"Validates a browser location claim and delegates authoritative distance and radius evaluation to the server-side PostGIS service.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["latitude","longitude","accuracyMetres","acquiredAt"],"properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"accuracyMetres":{"type":"number","minimum":0},"acquiredAt":{"type":"string","format":"date-time"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"eventId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["eventId","status","reachable","requestId"],"properties":{"eventId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["reachable","unreachable","retry","unavailable"]},"reachable":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"reason":{"type":"string","enum":["location_accuracy","stale_location","future_acquisition_time","not_started","ended"]},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/events":{"get":{"operationId":"listAuthorEvents","summary":"List events for Authors","tags":["Authoring"],"description":"Returns draft and published event definitions for protected Basic content management.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["events","requestId"],"properties":{"events":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["eventId","title","description","latitude","longitude","radiusMetres","startsAt","endsAt","isPublished","createdAt","updatedAt","authoringStatus","retiredAt"],"properties":{"eventId":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"radiusMetres":{"type":"integer","minimum":1},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"isPublished":{"type":"boolean"},"authoringStatus":{"type":"string","enum":["draft","published","retired"]},"retiredAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}},"post":{"operationId":"createAuthorEvent","summary":"Create an event draft","tags":["Authoring"],"description":"Creates an unpublished event definition and records the acting Author in the audit trail.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["title","latitude","longitude","radiusMetres","startsAt","endsAt"],"properties":{"title":{"type":"string","minLength":1},"description":{"type":"string","minLength":1,"nullable":true},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"radiusMetres":{"type":"integer","minimum":1},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"}}}}}},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["event","requestId"],"properties":{"event":{"type":"object","additionalProperties":false,"required":["eventId","title","description","latitude","longitude","radiusMetres","startsAt","endsAt","isPublished","createdAt","updatedAt","authoringStatus","retiredAt"],"properties":{"eventId":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"radiusMetres":{"type":"integer","minimum":1},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"isPublished":{"type":"boolean"},"authoringStatus":{"type":"string","enum":["draft","published","retired"]},"retiredAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/events/{eventId}":{"put":{"operationId":"updateAuthorEvent","summary":"Update an event definition","tags":["Authoring"],"description":"Updates an existing event definition and records the acting Author in the audit trail.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["title","latitude","longitude","radiusMetres","startsAt","endsAt"],"properties":{"title":{"type":"string","minLength":1},"description":{"type":"string","minLength":1,"nullable":true},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"radiusMetres":{"type":"integer","minimum":1},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"eventId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["event","requestId"],"properties":{"event":{"type":"object","additionalProperties":false,"required":["eventId","title","description","latitude","longitude","radiusMetres","startsAt","endsAt","isPublished","createdAt","updatedAt","authoringStatus","retiredAt"],"properties":{"eventId":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"radiusMetres":{"type":"integer","minimum":1},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"isPublished":{"type":"boolean"},"authoringStatus":{"type":"string","enum":["draft","published","retired"]},"retiredAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/events/{eventId}/publish":{"post":{"operationId":"publishAuthorEvent","summary":"Publish a ready event","tags":["Authoring"],"description":"Publishes a draft event only after its Basic challenge and reward catalogue dependencies are ready.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"maxProperties":0}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"eventId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["event","requestId"],"properties":{"event":{"type":"object","additionalProperties":false,"required":["eventId","title","description","latitude","longitude","radiusMetres","startsAt","endsAt","isPublished","createdAt","updatedAt","authoringStatus","retiredAt"],"properties":{"eventId":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"radiusMetres":{"type":"integer","minimum":1},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"isPublished":{"type":"boolean"},"authoringStatus":{"type":"string","enum":["draft","published","retired"]},"retiredAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/events/{eventId}/retire":{"post":{"operationId":"retireAuthorEvent","summary":"Retire an event","tags":["Authoring"],"description":"Removes an event from player publication while preserving its immutable authored record.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"maxProperties":0}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"eventId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["event","requestId"],"properties":{"event":{"type":"object","additionalProperties":false,"required":["eventId","title","description","latitude","longitude","radiusMetres","startsAt","endsAt","isPublished","createdAt","updatedAt","authoringStatus","retiredAt"],"properties":{"eventId":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"radiusMetres":{"type":"integer","minimum":1},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"isPublished":{"type":"boolean"},"authoringStatus":{"type":"string","enum":["draft","published","retired"]},"retiredAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/events/{eventId}/challenges":{"get":{"operationId":"listAuthorChallenges","summary":"List challenges for an event","tags":["Authoring"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"eventId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["challenges","requestId"],"properties":{"challenges":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["challengeId","eventId","format","status","createdAt","updatedAt"],"properties":{"challengeId":{"type":"string","format":"uuid"},"eventId":{"type":"string","format":"uuid"},"format":{"type":"string","enum":["multiple_choice"]},"status":{"type":"string","enum":["draft","published","retired"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}},"post":{"operationId":"createAuthorChallenge","summary":"Create a draft challenge for an event","tags":["Authoring"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"maxProperties":0}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"eventId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["challenge","requestId"],"properties":{"challenge":{"type":"object","additionalProperties":false,"required":["challengeId","eventId","format","status","createdAt","updatedAt"],"properties":{"challengeId":{"type":"string","format":"uuid"},"eventId":{"type":"string","format":"uuid"},"format":{"type":"string","enum":["multiple_choice"]},"status":{"type":"string","enum":["draft","published","retired"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/challenges/{challengeId}/questions":{"get":{"operationId":"listAuthorQuestions","summary":"List Author-visible challenge questions","tags":["Authoring"],"description":"Returns challenge questions including the private accepted-answer relationship. This operation is Author-only.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"challengeId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["questions","requestId"],"properties":{"questions":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["questionId","challengeId","prompt","difficulty","explanation","status","choices","acceptedChoiceId","acceptedChoicePosition","createdAt","updatedAt"],"properties":{"questionId":{"type":"string","format":"uuid"},"challengeId":{"type":"string","format":"uuid"},"prompt":{"type":"string"},"difficulty":{"type":"integer","minimum":1,"maximum":3},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["draft","published","retired"]},"choices":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["choiceId","position","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":4},"text":{"type":"string"}}}},"acceptedChoiceId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"acceptedChoicePosition":{"anyOf":[{"type":"integer","minimum":1,"maximum":4},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}},"post":{"operationId":"createAuthorQuestion","summary":"Create a draft multiple-choice question","tags":["Authoring"],"description":"Creates four choices and stores the accepted-answer relationship privately using the Author-supplied accepted choice position.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["prompt","difficulty","explanation","choices","acceptedChoicePosition"],"properties":{"prompt":{"type":"string","minLength":1},"difficulty":{"type":"integer","minimum":1,"maximum":3},"explanation":{"type":"string","minLength":1},"choices":{"type":"array","minItems":4,"maxItems":4,"items":{"type":"string","minLength":1}},"acceptedChoicePosition":{"type":"integer","minimum":1,"maximum":4}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"challengeId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["question","requestId"],"properties":{"question":{"type":"object","additionalProperties":false,"required":["questionId","challengeId","prompt","difficulty","explanation","status","choices","acceptedChoiceId","acceptedChoicePosition","createdAt","updatedAt"],"properties":{"questionId":{"type":"string","format":"uuid"},"challengeId":{"type":"string","format":"uuid"},"prompt":{"type":"string"},"difficulty":{"type":"integer","minimum":1,"maximum":3},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["draft","published","retired"]},"choices":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["choiceId","position","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":4},"text":{"type":"string"}}}},"acceptedChoiceId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"acceptedChoicePosition":{"anyOf":[{"type":"integer","minimum":1,"maximum":4},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/questions/{questionId}":{"put":{"operationId":"updateAuthorQuestion","summary":"Edit a draft question","tags":["Authoring"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["prompt","difficulty","explanation","choices","acceptedChoicePosition"],"properties":{"prompt":{"type":"string","minLength":1},"difficulty":{"type":"integer","minimum":1,"maximum":3},"explanation":{"type":"string","minLength":1},"choices":{"type":"array","minItems":4,"maxItems":4,"items":{"type":"string","minLength":1}},"acceptedChoicePosition":{"type":"integer","minimum":1,"maximum":4}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"questionId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["question","requestId"],"properties":{"question":{"type":"object","additionalProperties":false,"required":["questionId","challengeId","prompt","difficulty","explanation","status","choices","acceptedChoiceId","acceptedChoicePosition","createdAt","updatedAt"],"properties":{"questionId":{"type":"string","format":"uuid"},"challengeId":{"type":"string","format":"uuid"},"prompt":{"type":"string"},"difficulty":{"type":"integer","minimum":1,"maximum":3},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["draft","published","retired"]},"choices":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["choiceId","position","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":4},"text":{"type":"string"}}}},"acceptedChoiceId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"acceptedChoicePosition":{"anyOf":[{"type":"integer","minimum":1,"maximum":4},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/questions/{questionId}/publish":{"post":{"operationId":"publishAuthorQuestion","summary":"Publish a complete draft question","tags":["Authoring"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"maxProperties":0}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"questionId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["question","requestId"],"properties":{"question":{"type":"object","additionalProperties":false,"required":["questionId","challengeId","prompt","difficulty","explanation","status","choices","acceptedChoiceId","acceptedChoicePosition","createdAt","updatedAt"],"properties":{"questionId":{"type":"string","format":"uuid"},"challengeId":{"type":"string","format":"uuid"},"prompt":{"type":"string"},"difficulty":{"type":"integer","minimum":1,"maximum":3},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["draft","published","retired"]},"choices":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["choiceId","position","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":4},"text":{"type":"string"}}}},"acceptedChoiceId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"acceptedChoicePosition":{"anyOf":[{"type":"integer","minimum":1,"maximum":4},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/questions/{questionId}/retire":{"post":{"operationId":"retireAuthorQuestion","summary":"Retire a question","tags":["Authoring"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"maxProperties":0}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"questionId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["question","requestId"],"properties":{"question":{"type":"object","additionalProperties":false,"required":["questionId","challengeId","prompt","difficulty","explanation","status","choices","acceptedChoiceId","acceptedChoicePosition","createdAt","updatedAt"],"properties":{"questionId":{"type":"string","format":"uuid"},"challengeId":{"type":"string","format":"uuid"},"prompt":{"type":"string"},"difficulty":{"type":"integer","minimum":1,"maximum":3},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["draft","published","retired"]},"choices":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["choiceId","position","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":4},"text":{"type":"string"}}}},"acceptedChoiceId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"acceptedChoicePosition":{"anyOf":[{"type":"integer","minimum":1,"maximum":4},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/challenges/{challengeId}/publish":{"post":{"operationId":"publishAuthorChallenge","summary":"Publish a ready challenge","tags":["Authoring"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"maxProperties":0}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"challengeId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["challenge","requestId"],"properties":{"challenge":{"type":"object","additionalProperties":false,"required":["challengeId","eventId","format","status","createdAt","updatedAt"],"properties":{"challengeId":{"type":"string","format":"uuid"},"eventId":{"type":"string","format":"uuid"},"format":{"type":"string","enum":["multiple_choice"]},"status":{"type":"string","enum":["draft","published","retired"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/challenges/{challengeId}/retire":{"post":{"operationId":"retireAuthorChallenge","summary":"Retire a challenge","tags":["Authoring"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"maxProperties":0}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"challengeId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["challenge","requestId"],"properties":{"challenge":{"type":"object","additionalProperties":false,"required":["challengeId","eventId","format","status","createdAt","updatedAt"],"properties":{"challengeId":{"type":"string","format":"uuid"},"eventId":{"type":"string","format":"uuid"},"format":{"type":"string","enum":["multiple_choice"]},"status":{"type":"string","enum":["draft","published","retired"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/cards":{"get":{"operationId":"listAuthorCards","summary":"List card definitions for Authors","tags":["Authoring"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["cards","requestId"],"properties":{"cards":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","category","affinity","rarity","hp","power","description","imageUrl","isActive","moves","effects","authoringStatus","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"hp":{"type":"integer","minimum":0,"nullable":true},"power":{"type":"integer","minimum":0,"nullable":true},"description":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"isActive":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","name","moveType","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns","powerCost"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true},"powerCost":{"type":"integer"}}}},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer"},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true}}}},"authoringStatus":{"type":"string","enum":["draft","published","retired"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}},"post":{"operationId":"createAuthorCard","summary":"Create a draft card definition","tags":["Authoring"],"description":"Creates an inactive draft. Publication is a separate Author-only operation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["name","category","affinity","rarity","hp","power","moves"],"properties":{"name":{"type":"string","minLength":1,"pattern":"\\S"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"description":{"type":"string","minLength":1,"pattern":"\\S","nullable":true},"imageUrl":{"type":"string","minLength":1,"pattern":"\\S","nullable":true},"category":{"type":"string","enum":["creature"]},"hp":{"type":"integer","minimum":1},"power":{"type":"integer","minimum":0},"moves":{"type":"array","maxItems":4,"items":{"type":"object","additionalProperties":false,"required":["position","name","moveType","effectType","powerCost"],"properties":{"position":{"type":"integer","minimum":1,"maximum":4},"name":{"type":"string","minLength":1,"pattern":"\\S"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true},"powerCost":{"type":"integer","minimum":0}}},"description":"Draft Creature cards allow zero through four moves. Move positions must be unique; publication requires exactly four moves."},"effects":{"type":"array","maxItems":0,"items":{"type":"object","additionalProperties":false,"required":["position","effectType"],"properties":{"position":{"type":"integer","minimum":1},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true}}},"description":"Creature cards cannot define Power-card effects."}}},{"type":"object","additionalProperties":false,"required":["name","category","affinity","rarity","hp","power","effects"],"properties":{"name":{"type":"string","minLength":1,"pattern":"\\S"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"description":{"type":"string","minLength":1,"pattern":"\\S","nullable":true},"imageUrl":{"type":"string","minLength":1,"pattern":"\\S","nullable":true},"category":{"type":"string","enum":["power"]},"hp":{"type":"integer","enum":[null],"nullable":true},"power":{"type":"integer","enum":[null],"nullable":true},"moves":{"type":"array","maxItems":0,"items":{"type":"object","additionalProperties":false,"required":["position","name","moveType","effectType","powerCost"],"properties":{"position":{"type":"integer","minimum":1,"maximum":4},"name":{"type":"string","minLength":1,"pattern":"\\S"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true},"powerCost":{"type":"integer","minimum":0}}},"description":"Power cards cannot define Creature moves."},"effects":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["position","effectType"],"properties":{"position":{"type":"integer","minimum":1},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true}}},"description":"Power cards require at least one effect. Effect positions must be unique."}}}]}}}},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["card","requestId"],"properties":{"card":{"type":"object","additionalProperties":false,"required":["id","name","category","affinity","rarity","hp","power","description","imageUrl","isActive","moves","effects","authoringStatus","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"hp":{"type":"integer","minimum":0,"nullable":true},"power":{"type":"integer","minimum":0,"nullable":true},"description":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"isActive":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","name","moveType","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns","powerCost"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true},"powerCost":{"type":"integer"}}}},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer"},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true}}}},"authoringStatus":{"type":"string","enum":["draft","published","retired"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Another draft, published, or retired card definition already reserves the normalized name. The error code is CARD_NAME_CONFLICT.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}},"description":"Another draft, published, or retired card definition already reserves the normalized name. The error code is CARD_NAME_CONFLICT."}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/cards/{cardId}":{"put":{"operationId":"updateAuthorCard","summary":"Edit a draft card definition","tags":["Authoring"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["name","category","affinity","rarity","hp","power","moves"],"properties":{"name":{"type":"string","minLength":1,"pattern":"\\S"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"description":{"type":"string","minLength":1,"pattern":"\\S","nullable":true},"imageUrl":{"type":"string","minLength":1,"pattern":"\\S","nullable":true},"category":{"type":"string","enum":["creature"]},"hp":{"type":"integer","minimum":1},"power":{"type":"integer","minimum":0},"moves":{"type":"array","maxItems":4,"items":{"type":"object","additionalProperties":false,"required":["position","name","moveType","effectType","powerCost"],"properties":{"position":{"type":"integer","minimum":1,"maximum":4},"name":{"type":"string","minLength":1,"pattern":"\\S"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true},"powerCost":{"type":"integer","minimum":0}}},"description":"Draft Creature cards allow zero through four moves. Move positions must be unique; publication requires exactly four moves."},"effects":{"type":"array","maxItems":0,"items":{"type":"object","additionalProperties":false,"required":["position","effectType"],"properties":{"position":{"type":"integer","minimum":1},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true}}},"description":"Creature cards cannot define Power-card effects."}}},{"type":"object","additionalProperties":false,"required":["name","category","affinity","rarity","hp","power","effects"],"properties":{"name":{"type":"string","minLength":1,"pattern":"\\S"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"description":{"type":"string","minLength":1,"pattern":"\\S","nullable":true},"imageUrl":{"type":"string","minLength":1,"pattern":"\\S","nullable":true},"category":{"type":"string","enum":["power"]},"hp":{"type":"integer","enum":[null],"nullable":true},"power":{"type":"integer","enum":[null],"nullable":true},"moves":{"type":"array","maxItems":0,"items":{"type":"object","additionalProperties":false,"required":["position","name","moveType","effectType","powerCost"],"properties":{"position":{"type":"integer","minimum":1,"maximum":4},"name":{"type":"string","minLength":1,"pattern":"\\S"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true},"powerCost":{"type":"integer","minimum":0}}},"description":"Power cards cannot define Creature moves."},"effects":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["position","effectType"],"properties":{"position":{"type":"integer","minimum":1},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true}}},"description":"Power cards require at least one effect. Effect positions must be unique."}}}]}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"cardId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["card","requestId"],"properties":{"card":{"type":"object","additionalProperties":false,"required":["id","name","category","affinity","rarity","hp","power","description","imageUrl","isActive","moves","effects","authoringStatus","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"hp":{"type":"integer","minimum":0,"nullable":true},"power":{"type":"integer","minimum":0,"nullable":true},"description":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"isActive":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","name","moveType","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns","powerCost"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true},"powerCost":{"type":"integer"}}}},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer"},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true}}}},"authoringStatus":{"type":"string","enum":["draft","published","retired"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"The draft cannot be updated because of a lifecycle conflict or because another card definition reserves the normalized name. Name conflicts use the error code CARD_NAME_CONFLICT.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}},"description":"The draft cannot be updated because of a lifecycle conflict or because another card definition reserves the normalized name. Name conflicts use the error code CARD_NAME_CONFLICT."}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/cards/{cardId}/publish":{"post":{"operationId":"publishAuthorCard","summary":"Publish a ready card definition","tags":["Authoring"],"description":"Publishes an executable draft only after every Creature move or Power-card effect has a non-null effect value.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"maxProperties":0}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"cardId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["card","requestId"],"properties":{"card":{"type":"object","additionalProperties":false,"required":["id","name","category","affinity","rarity","hp","power","description","imageUrl","isActive","moves","effects","authoringStatus","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"hp":{"type":"integer","minimum":0,"nullable":true},"power":{"type":"integer","minimum":0,"nullable":true},"description":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"isActive":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","name","moveType","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns","powerCost"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true},"powerCost":{"type":"integer"}}}},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer"},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true}}}},"authoringStatus":{"type":"string","enum":["draft","published","retired"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/author/cards/{cardId}/retire":{"post":{"operationId":"retireAuthorCard","summary":"Retire a card definition","tags":["Authoring"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"maxProperties":0}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"cardId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["card","requestId"],"properties":{"card":{"type":"object","additionalProperties":false,"required":["id","name","category","affinity","rarity","hp","power","description","imageUrl","isActive","moves","effects","authoringStatus","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"hp":{"type":"integer","minimum":0,"nullable":true},"power":{"type":"integer","minimum":0,"nullable":true},"description":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"isActive":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","name","moveType","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns","powerCost"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true},"powerCost":{"type":"integer"}}}},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer"},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"type":"integer","minimum":0,"nullable":true},"modifierStat":{"type":"string","enum":["hp","power","damage_multiplier",null],"nullable":true},"modifierOperation":{"type":"string","enum":["add","multiply",null],"nullable":true},"modifierDurationTurns":{"type":"integer","minimum":1,"nullable":true}}}},"authoringStatus":{"type":"string","enum":["draft","published","retired"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/events/{eventId}/challenge-attempts":{"post":{"operationId":"startOrResumeChallengeAttempt","summary":"Start or resume an event challenge attempt","tags":["Challenges"],"description":"Creates a challenge attempt after fresh authoritative event and location checks, or returns the player existing persisted attempt.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["latitude","longitude","accuracyMetres","acquiredAt"],"properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"accuracyMetres":{"type":"number","minimum":0},"acquiredAt":{"type":"string","format":"date-time"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"eventId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["attemptId","eventId","format","status","startedAt","deadline","totalQuestions","answeredCount","questions","requestId"],"properties":{"attemptId":{"type":"string","format":"uuid"},"eventId":{"type":"string","format":"uuid"},"format":{"type":"string","enum":["multiple_choice"]},"status":{"type":"string","enum":["in_progress"]},"startedAt":{"type":"string","format":"date-time"},"deadline":{"type":"string","format":"date-time"},"totalQuestions":{"type":"integer","enum":[5]},"answeredCount":{"type":"integer","minimum":0,"maximum":5},"questions":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["attemptQuestionId","position","prompt","choices","selectedChoiceId","answeredAt"],"properties":{"attemptQuestionId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":5},"prompt":{"type":"string"},"choices":{"type":"array","minItems":4,"maxItems":4,"items":{"type":"object","additionalProperties":false,"required":["choiceId","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"text":{"type":"string"}}}},"selectedChoiceId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"answeredAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}}}},"requestId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["attemptId","eventId","format","status","completedAt","completionReason","totalQuestions","scoreCorrect","reward","review","requestId"],"properties":{"attemptId":{"type":"string","format":"uuid"},"eventId":{"type":"string","format":"uuid"},"format":{"type":"string","enum":["multiple_choice"]},"status":{"type":"string","enum":["completed"]},"completedAt":{"type":"string","format":"date-time"},"completionReason":{"type":"string","enum":["answered","timeout"]},"totalQuestions":{"type":"integer","enum":[5]},"scoreCorrect":{"type":"integer","minimum":0,"maximum":5},"reward":{"type":"object","additionalProperties":false,"required":["coinsAwarded","cards"],"properties":{"coinsAwarded":{"type":"integer","minimum":0},"cards":{"type":"array","minItems":0,"maxItems":2,"items":{"type":"object","additionalProperties":false,"required":["ownedCardId","cardDefinitionId","name","category","affinity","rarity"],"properties":{"ownedCardId":{"type":"string","format":"uuid"},"cardDefinitionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]}}}}}},"review":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["attemptQuestionId","position","prompt","selectedChoice","correctChoice","isCorrect"],"properties":{"attemptQuestionId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":5},"prompt":{"type":"string"},"selectedChoice":{"anyOf":[{"type":"object","additionalProperties":false,"required":["choiceId","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"text":{"type":"string"}}},{"type":"null"}]},"correctChoice":{"type":"object","additionalProperties":false,"required":["choiceId","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"text":{"type":"string"}}},"isCorrect":{"type":"boolean"}}}},"requestId":{"type":"string"}}}]}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["attemptId","eventId","format","status","startedAt","deadline","totalQuestions","answeredCount","questions","requestId"],"properties":{"attemptId":{"type":"string","format":"uuid"},"eventId":{"type":"string","format":"uuid"},"format":{"type":"string","enum":["multiple_choice"]},"status":{"type":"string","enum":["in_progress"]},"startedAt":{"type":"string","format":"date-time"},"deadline":{"type":"string","format":"date-time"},"totalQuestions":{"type":"integer","enum":[5]},"answeredCount":{"type":"integer","minimum":0,"maximum":5},"questions":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["attemptQuestionId","position","prompt","choices","selectedChoiceId","answeredAt"],"properties":{"attemptQuestionId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":5},"prompt":{"type":"string"},"choices":{"type":"array","minItems":4,"maxItems":4,"items":{"type":"object","additionalProperties":false,"required":["choiceId","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"text":{"type":"string"}}}},"selectedChoiceId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"answeredAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/challenge-attempts/{attemptId}":{"get":{"operationId":"fetchChallengeAttempt","summary":"Fetch the current challenge attempt state","tags":["Challenges"],"description":"Returns the authenticated player persisted in-progress or completed attempt. Expired in-progress attempts are finalized synchronously before the completed result is returned.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"attemptId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["attemptId","eventId","format","status","startedAt","deadline","totalQuestions","answeredCount","questions","requestId"],"properties":{"attemptId":{"type":"string","format":"uuid"},"eventId":{"type":"string","format":"uuid"},"format":{"type":"string","enum":["multiple_choice"]},"status":{"type":"string","enum":["in_progress"]},"startedAt":{"type":"string","format":"date-time"},"deadline":{"type":"string","format":"date-time"},"totalQuestions":{"type":"integer","enum":[5]},"answeredCount":{"type":"integer","minimum":0,"maximum":5},"questions":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["attemptQuestionId","position","prompt","choices","selectedChoiceId","answeredAt"],"properties":{"attemptQuestionId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":5},"prompt":{"type":"string"},"choices":{"type":"array","minItems":4,"maxItems":4,"items":{"type":"object","additionalProperties":false,"required":["choiceId","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"text":{"type":"string"}}}},"selectedChoiceId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"answeredAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}}}},"requestId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["attemptId","eventId","format","status","completedAt","completionReason","totalQuestions","scoreCorrect","reward","review","requestId"],"properties":{"attemptId":{"type":"string","format":"uuid"},"eventId":{"type":"string","format":"uuid"},"format":{"type":"string","enum":["multiple_choice"]},"status":{"type":"string","enum":["completed"]},"completedAt":{"type":"string","format":"date-time"},"completionReason":{"type":"string","enum":["answered","timeout"]},"totalQuestions":{"type":"integer","enum":[5]},"scoreCorrect":{"type":"integer","minimum":0,"maximum":5},"reward":{"type":"object","additionalProperties":false,"required":["coinsAwarded","cards"],"properties":{"coinsAwarded":{"type":"integer","minimum":0},"cards":{"type":"array","minItems":0,"maxItems":2,"items":{"type":"object","additionalProperties":false,"required":["ownedCardId","cardDefinitionId","name","category","affinity","rarity"],"properties":{"ownedCardId":{"type":"string","format":"uuid"},"cardDefinitionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]}}}}}},"review":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["attemptQuestionId","position","prompt","selectedChoice","correctChoice","isCorrect"],"properties":{"attemptQuestionId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":5},"prompt":{"type":"string"},"selectedChoice":{"anyOf":[{"type":"object","additionalProperties":false,"required":["choiceId","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"text":{"type":"string"}}},{"type":"null"}]},"correctChoice":{"type":"object","additionalProperties":false,"required":["choiceId","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"text":{"type":"string"}}},"isCorrect":{"type":"boolean"}}}},"requestId":{"type":"string"}}}]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}},"/api/v1/challenge-attempts/{attemptId}/answers":{"post":{"operationId":"submitChallengeAnswer","summary":"Submit and lock a challenge answer","tags":["Challenges"],"description":"Locks one answer using server receipt time and returns the updated persisted attempt state. Fifth answers and expired attempts finalize synchronously through the atomic completion boundary.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["attemptQuestionId","choiceId"],"properties":{"attemptQuestionId":{"type":"string","format":"uuid"},"choiceId":{"type":"string","format":"uuid"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"attemptId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["attemptId","eventId","format","status","startedAt","deadline","totalQuestions","answeredCount","questions","requestId"],"properties":{"attemptId":{"type":"string","format":"uuid"},"eventId":{"type":"string","format":"uuid"},"format":{"type":"string","enum":["multiple_choice"]},"status":{"type":"string","enum":["in_progress"]},"startedAt":{"type":"string","format":"date-time"},"deadline":{"type":"string","format":"date-time"},"totalQuestions":{"type":"integer","enum":[5]},"answeredCount":{"type":"integer","minimum":0,"maximum":5},"questions":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["attemptQuestionId","position","prompt","choices","selectedChoiceId","answeredAt"],"properties":{"attemptQuestionId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":5},"prompt":{"type":"string"},"choices":{"type":"array","minItems":4,"maxItems":4,"items":{"type":"object","additionalProperties":false,"required":["choiceId","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"text":{"type":"string"}}}},"selectedChoiceId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"answeredAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}}}},"requestId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["attemptId","eventId","format","status","completedAt","completionReason","totalQuestions","scoreCorrect","reward","review","requestId"],"properties":{"attemptId":{"type":"string","format":"uuid"},"eventId":{"type":"string","format":"uuid"},"format":{"type":"string","enum":["multiple_choice"]},"status":{"type":"string","enum":["completed"]},"completedAt":{"type":"string","format":"date-time"},"completionReason":{"type":"string","enum":["answered","timeout"]},"totalQuestions":{"type":"integer","enum":[5]},"scoreCorrect":{"type":"integer","minimum":0,"maximum":5},"reward":{"type":"object","additionalProperties":false,"required":["coinsAwarded","cards"],"properties":{"coinsAwarded":{"type":"integer","minimum":0},"cards":{"type":"array","minItems":0,"maxItems":2,"items":{"type":"object","additionalProperties":false,"required":["ownedCardId","cardDefinitionId","name","category","affinity","rarity"],"properties":{"ownedCardId":{"type":"string","format":"uuid"},"cardDefinitionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]}}}}}},"review":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["attemptQuestionId","position","prompt","selectedChoice","correctChoice","isCorrect"],"properties":{"attemptQuestionId":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1,"maximum":5},"prompt":{"type":"string"},"selectedChoice":{"anyOf":[{"type":"object","additionalProperties":false,"required":["choiceId","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"text":{"type":"string"}}},{"type":"null"}]},"correctChoice":{"type":"object","additionalProperties":false,"required":["choiceId","text"],"properties":{"choiceId":{"type":"string","format":"uuid"},"text":{"type":"string"}}},"isCorrect":{"type":"boolean"}}}},"requestId":{"type":"string"}}}]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"},"validation":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}},"/api/v1/cards/collection":{"get":{"operationId":"listOwnedCards","summary":"List the current player card collection","tags":["Cards"],"description":"Returns every card copy owned by the authenticated player with player-safe catalogue and acquisition metadata.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["cards","requestId"],"properties":{"cards":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["ownedCardId","cardDefinitionId","name","category","affinity","rarity","hp","power","description","imageUrl","isActive","moves","effects","acquisitionKind","acquiredAt"],"properties":{"ownedCardId":{"type":"string","format":"uuid"},"cardDefinitionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"hp":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]},"power":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"imageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"isActive":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","name","moveType","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns","powerCost"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]},"modifierStat":{"anyOf":[{"type":"string","enum":["hp","power","damage_multiplier"]},{"type":"null"}]},"modifierOperation":{"anyOf":[{"type":"string","enum":["add","multiply"]},{"type":"null"}]},"modifierDurationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]},"powerCost":{"type":"integer","minimum":0}}}},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]},"modifierStat":{"anyOf":[{"type":"string","enum":["hp","power","damage_multiplier"]},{"type":"null"}]},"modifierOperation":{"anyOf":[{"type":"string","enum":["add","multiply"]},{"type":"null"}]},"modifierDurationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}},"acquisitionKind":{"type":"string","enum":["event_reward","starter"]},"acquiredAt":{"type":"string","format":"date-time"}}}},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/cards/starter":{"post":{"operationId":"selectStarterCards","summary":"Select the current player starter affinity","tags":["Cards"],"description":"Grants one server-selected set of three Common Creature cards and two Common Power cards for the selected affinity.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["affinity"],"properties":{"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["starterGrantId","affinity","grantedAt","cards","requestId"],"properties":{"starterGrantId":{"type":"string","format":"uuid"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"grantedAt":{"type":"string","format":"date-time"},"cards":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["ownedCardId","cardDefinitionId","name","category","affinity","rarity","hp","power","description","imageUrl","isActive","moves","effects","acquisitionKind","acquiredAt"],"properties":{"ownedCardId":{"type":"string","format":"uuid"},"cardDefinitionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"hp":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]},"power":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"imageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"isActive":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","name","moveType","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns","powerCost"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]},"modifierStat":{"anyOf":[{"type":"string","enum":["hp","power","damage_multiplier"]},{"type":"null"}]},"modifierOperation":{"anyOf":[{"type":"string","enum":["add","multiply"]},{"type":"null"}]},"modifierDurationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]},"powerCost":{"type":"integer","minimum":0}}}},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]},"modifierStat":{"anyOf":[{"type":"string","enum":["hp","power","damage_multiplier"]},{"type":"null"}]},"modifierOperation":{"anyOf":[{"type":"string","enum":["add","multiply"]},{"type":"null"}]},"modifierDurationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}},"acquisitionKind":{"type":"string","enum":["starter"]},"acquiredAt":{"type":"string","format":"date-time"}}}},"requestId":{"type":"string"}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["starterGrantId","affinity","grantedAt","cards","requestId"],"properties":{"starterGrantId":{"type":"string","format":"uuid"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"grantedAt":{"type":"string","format":"date-time"},"cards":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["ownedCardId","cardDefinitionId","name","category","affinity","rarity","hp","power","description","imageUrl","isActive","moves","effects","acquisitionKind","acquiredAt"],"properties":{"ownedCardId":{"type":"string","format":"uuid"},"cardDefinitionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]},"hp":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]},"power":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"imageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"isActive":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","name","moveType","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns","powerCost"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]},"modifierStat":{"anyOf":[{"type":"string","enum":["hp","power","damage_multiplier"]},{"type":"null"}]},"modifierOperation":{"anyOf":[{"type":"string","enum":["add","multiply"]},{"type":"null"}]},"modifierDurationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]},"powerCost":{"type":"integer","minimum":0}}}},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","position","effectType","effectValue","modifierStat","modifierOperation","modifierDurationTurns"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","minimum":1},"effectType":{"type":"string","enum":["damage","debuff","heal","buff"]},"effectValue":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]},"modifierStat":{"anyOf":[{"type":"string","enum":["hp","power","damage_multiplier"]},{"type":"null"}]},"modifierOperation":{"anyOf":[{"type":"string","enum":["add","multiply"]},{"type":"null"}]},"modifierDurationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}},"acquisitionKind":{"type":"string","enum":["starter"]},"acquiredAt":{"type":"string","format":"date-time"}}}},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/decks":{"get":{"operationId":"listSavedDecks","summary":"List the current player saved decks","tags":["Decks"],"description":"Returns every saved deck owned by the authenticated player and identifies the currently selected deck.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["decks","requestId"],"properties":{"decks":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["deckId","name","isSelected","totalPoints","createdAt","updatedAt","cards"],"properties":{"deckId":{"type":"string","format":"uuid"},"name":{"type":"string"},"isSelected":{"type":"boolean"},"totalPoints":{"type":"integer","minimum":5,"maximum":10},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"cards":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["position","ownedCardId","cardDefinitionId","name","category","affinity","rarity"],"properties":{"position":{"type":"integer","minimum":1,"maximum":5},"ownedCardId":{"type":"string","format":"uuid"},"cardDefinitionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]}}}}}}},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}},"post":{"operationId":"createSavedDeck","summary":"Create a saved deck","tags":["Decks"],"description":"Creates a five-card Basic deck from owned card-copy IDs. Composition, ownership, and rarity points are validated by the server.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name","ownedCardIds"],"properties":{"name":{"type":"string","minLength":1},"ownedCardIds":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"string","format":"uuid"}}}}}}},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["deckId","name","isSelected","totalPoints","createdAt","updatedAt","cards","requestId"],"properties":{"deckId":{"type":"string","format":"uuid"},"name":{"type":"string"},"isSelected":{"type":"boolean"},"totalPoints":{"type":"integer","minimum":5,"maximum":10},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"cards":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["position","ownedCardId","cardDefinitionId","name","category","affinity","rarity"],"properties":{"position":{"type":"integer","minimum":1,"maximum":5},"ownedCardId":{"type":"string","format":"uuid"},"cardDefinitionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]}}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/decks/{deckId}":{"put":{"operationId":"updateSavedDeck","summary":"Update a saved deck","tags":["Decks"],"description":"Replaces the authenticated player saved deck name and ordered owned-card copies after server-side validation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name","ownedCardIds"],"properties":{"name":{"type":"string","minLength":1},"ownedCardIds":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"string","format":"uuid"}}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"deckId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["deckId","name","isSelected","totalPoints","createdAt","updatedAt","cards","requestId"],"properties":{"deckId":{"type":"string","format":"uuid"},"name":{"type":"string"},"isSelected":{"type":"boolean"},"totalPoints":{"type":"integer","minimum":5,"maximum":10},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"cards":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["position","ownedCardId","cardDefinitionId","name","category","affinity","rarity"],"properties":{"position":{"type":"integer","minimum":1,"maximum":5},"ownedCardId":{"type":"string","format":"uuid"},"cardDefinitionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]}}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}},"delete":{"operationId":"deleteSavedDeck","summary":"Delete a saved deck","tags":["Decks"],"description":"Deletes a saved deck owned by the authenticated player without deleting any owned card copies.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"deckId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Default Response"},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/decks/{deckId}/selection":{"put":{"operationId":"selectSavedDeck","summary":"Select a saved deck","tags":["Decks"],"description":"Makes one valid saved deck the authenticated player active selection after revalidating its authoritative card state.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"deckId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["deckId","name","isSelected","totalPoints","createdAt","updatedAt","cards","requestId"],"properties":{"deckId":{"type":"string","format":"uuid"},"name":{"type":"string"},"isSelected":{"type":"boolean"},"totalPoints":{"type":"integer","minimum":5,"maximum":10},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"cards":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["position","ownedCardId","cardDefinitionId","name","category","affinity","rarity"],"properties":{"position":{"type":"integer","minimum":1,"maximum":5},"ownedCardId":{"type":"string","format":"uuid"},"cardDefinitionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"category":{"type":"string","enum":["creature","power"]},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"rarity":{"type":"string","enum":["common","rare","epic","legendary"]}}}},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/matches/cpu":{"post":{"operationId":"createCpuMatch","summary":"Create a server-authoritative CPU match","tags":["Matches"],"description":"Creates a CPU match from the authenticated player selected deck and snapshots the authoritative card data.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["deckId"],"properties":{"deckId":{"type":"string","format":"uuid"}}}}}},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["matchId","status","version","winner","startedAt","completedAt","state","lastAction","requestId"],"properties":{"matchId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["active","completed"]},"version":{"type":"integer","minimum":0},"winner":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"state":{"type":"object","additionalProperties":false,"required":["phase","turnNumber","currentSide","replacementSide","firstSide","selections","player","cpu","legalActions","turnDeadline"],"properties":{"phase":{"type":"string","enum":["initial_selection","active","replacement","completed"]},"turnNumber":{"type":"integer","minimum":0},"currentSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"replacementSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"firstSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"selections":{"type":"object","additionalProperties":false,"required":["player","cpu"],"properties":{"player":{"anyOf":[{"type":"string"},{"type":"null"}]},"cpu":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"player":{"type":"object","additionalProperties":false,"required":["creatures","powerCards","usedPowerCardIds","activeCreatureId"],"properties":{"creatures":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}}},"powerCards":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","available"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}},"available":{"type":"boolean"}}}},"usedPowerCardIds":{"type":"array","items":{"type":"string"}},"activeCreatureId":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"cpu":{"type":"object","additionalProperties":false,"required":["activeCreature","defeatedCreatures","remainingCreatureCount","usedPowerCardIds","remainingPowerCardCount"],"properties":{"activeCreature":{"anyOf":[{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}},{"type":"null"}]},"defeatedCreatures":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}}},"remainingCreatureCount":{"type":"integer","minimum":0},"usedPowerCardIds":{"type":"array","items":{"type":"string"}},"remainingPowerCardCount":{"type":"integer","minimum":0}}},"legalActions":{"type":"array","items":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","creatureId"],"properties":{"type":{"enum":["select_initial_creature"]},"creatureId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","creatureId"],"properties":{"type":{"enum":["select_replacement"]},"creatureId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","moveId"],"properties":{"type":{"enum":["use_move"]},"moveId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","powerCardId"],"properties":{"type":{"enum":["use_power_card"]},"powerCardId":{"type":"string"}}}]}},"turnDeadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}}},"lastAction":{"anyOf":[{"type":"object","additionalProperties":false,"required":["side","action","effects","defeatedCreatureId","winner","turnEnded"],"properties":{"side":{"type":"string","enum":["player","cpu"]},"action":{"type":"object","additionalProperties":true},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["effectId","effectType","targetSide","targetCreatureId","amount","damageMultiplier"],"properties":{"effectId":{"type":"string"},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"targetSide":{"type":"string","enum":["player","cpu"]},"targetCreatureId":{"type":"string"},"amount":{"type":"number"},"damageMultiplier":{"anyOf":[{"type":"number"},{"type":"null"}]},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}},"defeatedCreatureId":{"anyOf":[{"type":"string"},{"type":"null"}]},"winner":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"turnEnded":{"type":"boolean"}}},{"type":"null"}]},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}},"get":{"operationId":"getActiveCpuMatch","summary":"Read the current active CPU match","tags":["Matches"],"description":"Returns the authenticated player's current unfinished CPU match without creating or advancing it. Returns CPU_MATCH_NOT_FOUND when none exists.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["matchId","status","version","winner","startedAt","completedAt","state","lastAction","requestId"],"properties":{"matchId":{"type":"string","format":"uuid"},"status":{"enum":["active"]},"version":{"type":"integer","minimum":0},"winner":{"type":"null"},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"null"},"state":{"type":"object","additionalProperties":false,"required":["phase","turnNumber","currentSide","replacementSide","firstSide","selections","player","cpu","legalActions","turnDeadline"],"properties":{"phase":{"type":"string","enum":["initial_selection","active","replacement","completed"]},"turnNumber":{"type":"integer","minimum":0},"currentSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"replacementSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"firstSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"selections":{"type":"object","additionalProperties":false,"required":["player","cpu"],"properties":{"player":{"anyOf":[{"type":"string"},{"type":"null"}]},"cpu":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"player":{"type":"object","additionalProperties":false,"required":["creatures","powerCards","usedPowerCardIds","activeCreatureId"],"properties":{"creatures":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}}},"powerCards":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","available"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}},"available":{"type":"boolean"}}}},"usedPowerCardIds":{"type":"array","items":{"type":"string"}},"activeCreatureId":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"cpu":{"type":"object","additionalProperties":false,"required":["activeCreature","defeatedCreatures","remainingCreatureCount","usedPowerCardIds","remainingPowerCardCount"],"properties":{"activeCreature":{"anyOf":[{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}},{"type":"null"}]},"defeatedCreatures":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}}},"remainingCreatureCount":{"type":"integer","minimum":0},"usedPowerCardIds":{"type":"array","items":{"type":"string"}},"remainingPowerCardCount":{"type":"integer","minimum":0}}},"legalActions":{"type":"array","items":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","creatureId"],"properties":{"type":{"enum":["select_initial_creature"]},"creatureId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","creatureId"],"properties":{"type":{"enum":["select_replacement"]},"creatureId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","moveId"],"properties":{"type":{"enum":["use_move"]},"moveId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","powerCardId"],"properties":{"type":{"enum":["use_power_card"]},"powerCardId":{"type":"string"}}}]}},"turnDeadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}}},"lastAction":{"anyOf":[{"type":"object","additionalProperties":false,"required":["side","action","effects","defeatedCreatureId","winner","turnEnded"],"properties":{"side":{"type":"string","enum":["player","cpu"]},"action":{"type":"object","additionalProperties":true},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["effectId","effectType","targetSide","targetCreatureId","amount","damageMultiplier"],"properties":{"effectId":{"type":"string"},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"targetSide":{"type":"string","enum":["player","cpu"]},"targetCreatureId":{"type":"string"},"amount":{"type":"number"},"damageMultiplier":{"anyOf":[{"type":"number"},{"type":"null"}]},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}},"defeatedCreatureId":{"anyOf":[{"type":"string"},{"type":"null"}]},"winner":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"turnEnded":{"type":"boolean"}}},{"type":"null"}]},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/matches/{matchId}":{"get":{"operationId":"getCpuMatch","summary":"Read the authenticated player CPU match","tags":["Matches"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"matchId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["matchId","status","version","winner","startedAt","completedAt","state","lastAction","requestId"],"properties":{"matchId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["active","completed"]},"version":{"type":"integer","minimum":0},"winner":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"state":{"type":"object","additionalProperties":false,"required":["phase","turnNumber","currentSide","replacementSide","firstSide","selections","player","cpu","legalActions","turnDeadline"],"properties":{"phase":{"type":"string","enum":["initial_selection","active","replacement","completed"]},"turnNumber":{"type":"integer","minimum":0},"currentSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"replacementSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"firstSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"selections":{"type":"object","additionalProperties":false,"required":["player","cpu"],"properties":{"player":{"anyOf":[{"type":"string"},{"type":"null"}]},"cpu":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"player":{"type":"object","additionalProperties":false,"required":["creatures","powerCards","usedPowerCardIds","activeCreatureId"],"properties":{"creatures":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}}},"powerCards":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","available"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}},"available":{"type":"boolean"}}}},"usedPowerCardIds":{"type":"array","items":{"type":"string"}},"activeCreatureId":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"cpu":{"type":"object","additionalProperties":false,"required":["activeCreature","defeatedCreatures","remainingCreatureCount","usedPowerCardIds","remainingPowerCardCount"],"properties":{"activeCreature":{"anyOf":[{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}},{"type":"null"}]},"defeatedCreatures":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}}},"remainingCreatureCount":{"type":"integer","minimum":0},"usedPowerCardIds":{"type":"array","items":{"type":"string"}},"remainingPowerCardCount":{"type":"integer","minimum":0}}},"legalActions":{"type":"array","items":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","creatureId"],"properties":{"type":{"enum":["select_initial_creature"]},"creatureId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","creatureId"],"properties":{"type":{"enum":["select_replacement"]},"creatureId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","moveId"],"properties":{"type":{"enum":["use_move"]},"moveId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","powerCardId"],"properties":{"type":{"enum":["use_power_card"]},"powerCardId":{"type":"string"}}}]}},"turnDeadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}}},"lastAction":{"anyOf":[{"type":"object","additionalProperties":false,"required":["side","action","effects","defeatedCreatureId","winner","turnEnded"],"properties":{"side":{"type":"string","enum":["player","cpu"]},"action":{"type":"object","additionalProperties":true},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["effectId","effectType","targetSide","targetCreatureId","amount","damageMultiplier"],"properties":{"effectId":{"type":"string"},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"targetSide":{"type":"string","enum":["player","cpu"]},"targetCreatureId":{"type":"string"},"amount":{"type":"number"},"damageMultiplier":{"anyOf":[{"type":"number"},{"type":"null"}]},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}},"defeatedCreatureId":{"anyOf":[{"type":"string"},{"type":"null"}]},"winner":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"turnEnded":{"type":"boolean"}}},{"type":"null"}]},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/matches/{matchId}/actions":{"post":{"operationId":"submitCpuMatchAction","summary":"Submit one intended CPU match action","tags":["Matches"],"description":"The server validates and applies the intended action, then performs any CPU action using server-side randomness.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["submissionId","expectedVersion","action"],"properties":{"submissionId":{"type":"string","format":"uuid"},"expectedVersion":{"type":"integer","minimum":0},"action":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","creatureId"],"properties":{"type":{"enum":["select_initial_creature"]},"creatureId":{"type":"string","format":"uuid"}}},{"type":"object","additionalProperties":false,"required":["type","creatureId"],"properties":{"type":{"enum":["select_replacement"]},"creatureId":{"type":"string","format":"uuid"}}},{"type":"object","additionalProperties":false,"required":["type","moveId"],"properties":{"type":{"enum":["use_move"]},"moveId":{"type":"string","format":"uuid"}}},{"type":"object","additionalProperties":false,"required":["type","powerCardId"],"properties":{"type":{"enum":["use_power_card"]},"powerCardId":{"type":"string","format":"uuid"}}}]}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"matchId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["matchId","status","version","winner","startedAt","completedAt","state","lastAction","requestId"],"properties":{"matchId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["active","completed"]},"version":{"type":"integer","minimum":0},"winner":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"state":{"type":"object","additionalProperties":false,"required":["phase","turnNumber","currentSide","replacementSide","firstSide","selections","player","cpu","legalActions","turnDeadline"],"properties":{"phase":{"type":"string","enum":["initial_selection","active","replacement","completed"]},"turnNumber":{"type":"integer","minimum":0},"currentSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"replacementSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"firstSide":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"selections":{"type":"object","additionalProperties":false,"required":["player","cpu"],"properties":{"player":{"anyOf":[{"type":"string"},{"type":"null"}]},"cpu":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"player":{"type":"object","additionalProperties":false,"required":["creatures","powerCards","usedPowerCardIds","activeCreatureId"],"properties":{"creatures":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}}},"powerCards":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","available"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}},"available":{"type":"boolean"}}}},"usedPowerCardIds":{"type":"array","items":{"type":"string"}},"activeCreatureId":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"cpu":{"type":"object","additionalProperties":false,"required":["activeCreature","defeatedCreatures","remainingCreatureCount","usedPowerCardIds","remainingPowerCardCount"],"properties":{"activeCreature":{"anyOf":[{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}},{"type":"null"}]},"defeatedCreatures":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","affinity","maxHp","maxPower","currentHp","remainingPower","defeated","moves"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"affinity":{"type":"string","enum":["wit","grit","spark","spirit","mystic"]},"maxHp":{"type":"integer","minimum":0},"maxPower":{"type":"integer","minimum":0},"currentHp":{"type":"integer","minimum":0},"remainingPower":{"type":"integer","minimum":0},"defeated":{"type":"boolean"},"moves":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","name","moveType","powerCost"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"moveType":{"type":"string","enum":["basic","wit","grit","spark","spirit","mystic"]},"powerCost":{"type":"integer","minimum":0},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["damageMultiplier","effectType","effectValue","modifier"],"properties":{"damageMultiplier":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"effectValue":{"type":"integer","minimum":0},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}}}}},"activeModifiers":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["stat","operation","percentage","remainingTurns"],"properties":{"stat":{"enum":["damage_multiplier"]},"operation":{"enum":["multiply"]},"percentage":{"type":"integer","minimum":-100},"remainingTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}}}}}},"remainingCreatureCount":{"type":"integer","minimum":0},"usedPowerCardIds":{"type":"array","items":{"type":"string"}},"remainingPowerCardCount":{"type":"integer","minimum":0}}},"legalActions":{"type":"array","items":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","creatureId"],"properties":{"type":{"enum":["select_initial_creature"]},"creatureId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","creatureId"],"properties":{"type":{"enum":["select_replacement"]},"creatureId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","moveId"],"properties":{"type":{"enum":["use_move"]},"moveId":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["type","powerCardId"],"properties":{"type":{"enum":["use_power_card"]},"powerCardId":{"type":"string"}}}]}},"turnDeadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}}},"lastAction":{"anyOf":[{"type":"object","additionalProperties":false,"required":["side","action","effects","defeatedCreatureId","winner","turnEnded"],"properties":{"side":{"type":"string","enum":["player","cpu"]},"action":{"type":"object","additionalProperties":true},"effects":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["effectId","effectType","targetSide","targetCreatureId","amount","damageMultiplier"],"properties":{"effectId":{"type":"string"},"effectType":{"type":"string","enum":["buff","damage","debuff","heal"]},"targetSide":{"type":"string","enum":["player","cpu"]},"targetCreatureId":{"type":"string"},"amount":{"type":"number"},"damageMultiplier":{"anyOf":[{"type":"number"},{"type":"null"}]},"modifier":{"anyOf":[{"type":"object","additionalProperties":false,"required":["stat","operation"],"properties":{"stat":{"type":"string","enum":["hp","power","damage_multiplier"]},"operation":{"type":"string","enum":["add","multiply"]},"durationTurns":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]}}},{"type":"null"}]}}}},"defeatedCreatureId":{"anyOf":[{"type":"string"},{"type":"null"}]},"winner":{"anyOf":[{"type":"string","enum":["player","cpu"]},{"type":"null"}]},"turnEnded":{"type":"boolean"}}},{"type":"null"}]},"requestId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}},"/api/v1/matches/history":{"get":{"operationId":"listCpuMatchHistory","summary":"List completed CPU matches for the current player","tags":["Matches"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["matches","requestId"],"properties":{"matches":{"type":"array","items":{"type":"object","additionalProperties":true,"required":["matchId","status","winner","startedAt","completedAt","rounds"],"properties":{"matchId":{"type":"string","format":"uuid"},"status":{"enum":["completed"]},"winner":{"type":"string","enum":["player","cpu"]},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"},"rounds":{"type":"array","items":{"type":"object","additionalProperties":true}}}}},"requestId":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}},"429":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","headers":{"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Whole seconds until this process-local window resets."},"RateLimit-Limit":{"schema":{"type":"integer","minimum":1},"description":"Maximum requests allowed in the current fixed window."},"RateLimit-Remaining":{"schema":{"type":"integer","minimum":0},"description":"Requests remaining in the current window."}},"content":{"application/json":{"schema":{"description":"The verified local player has exceeded this API process request quota. Retry after the advertised delay.","type":"object","additionalProperties":false,"required":["type","title","status","code","detail","requestId"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"code":{"type":"string","enum":["RATE_LIMITED"]},"detail":{"type":"string"},"requestId":{"type":"string"}}}}}}}}}},"tags":[{"name":"System","description":"API health and version information."},{"name":"Authentication","description":"Authenticated API identity operations."},{"name":"Events","description":"Player-safe event discovery and location eligibility."},{"name":"Challenges","description":"Timed event challenge attempts and player quiz state."},{"name":"Cards","description":"Player card catalogue and starter selection."},{"name":"Decks","description":"Player saved decks and active deck selection."},{"name":"Authoring","description":"Protected Author-only Basic content management."},{"name":"Matches","description":"Server-authoritative CPU matches and private history."}]}