{"components":{"schemas":{"CollectionResponse":{"properties":{"achievements":{"properties":{"earned":{"items":{"type":"string"},"type":"array"},"total":{"type":"integer"}},"required":["earned","total"],"type":"object"},"completion_pct":{"type":"number"},"species":{"additionalProperties":{"$ref":"#/components/schemas/SpeciesProgress"},"type":"object"},"total_possible":{"type":"integer"},"total_species":{"type":"integer"}},"required":["species","total_species","total_possible","completion_pct","achievements"],"type":"object"},"SpeciesProgress":{"properties":{"best_weight":{"type":"number"},"count":{"type":"integer"}},"required":["count"],"type":"object"},"FishResponse":{"properties":{"count":{"minimum":0,"type":"integer"},"fish":{"items":{"$ref":"#/components/schemas/CaughtFish"},"type":"array"},"online":{"type":"boolean"}},"required":["fish","count","online"],"type":"object"},"WebhookResponse":{"properties":{"webhook":{"$ref":"#/components/schemas/Webhook"}},"required":["webhook"],"type":"object"},"Webhook":{"properties":{"created_at":{"format":"date-time","type":"string"},"events":{"items":{"type":"string"},"type":"array"},"id":{"type":"string"},"secret":{"description":"Masked in list responses.","type":"string"},"url":{"format":"uri","type":"string"}},"required":["id","url","events","secret","created_at"],"type":"object"},"DeliveryListResponse":{"properties":{"deliveries":{"items":{"$ref":"#/components/schemas/Delivery"},"type":"array"}},"required":["deliveries"],"type":"object"},"StatusRequest":{"properties":{"active":{"type":"boolean"}},"required":["active"],"type":"object"},"AgentMessageResponse":{"properties":{"message":{"$ref":"#/components/schemas/AgentMessage"}},"required":["message"],"type":"object"},"PlayerState":{"properties":{"gold":{"type":"integer"},"location":{"type":"string"},"online":{"type":"boolean"},"rod":{"type":"string"},"skills":{"additionalProperties":{"$ref":"#/components/schemas/Skill"},"type":"object"},"total_caught":{"type":"integer"},"total_gold":{"type":"integer"}},"required":["online","gold","location","rod","total_caught","total_gold","skills"],"type":"object"},"Error":{"properties":{"error":{"type":"string"}},"required":["error"],"type":"object"},"WorldLocation":{"properties":{"featured_fish":{"properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"type":"object"},"id":{"type":"string"},"name":{"type":"string"},"player_count":{"minimum":0,"type":"integer"},"premium":{"type":"boolean"},"weather":{"type":"string"}},"required":["id","name","premium","weather","featured_fish","player_count"],"type":"object"},"CatalogResponse":{"properties":{"count":{"minimum":0,"type":"integer"},"entries":{"items":{"$ref":"#/components/schemas/CatalogEntry"},"type":"array"},"limit":{"maximum":100,"minimum":1,"type":"integer"},"next_offset":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}]},"offset":{"minimum":0,"type":"integer"},"schema_version":{"const":2,"type":"integer"},"total":{"minimum":0,"type":"integer"}},"required":["schema_version","entries","count","total","limit","offset","next_offset"],"type":"object"},"AgentMessage":{"properties":{"client_id":{"maxLength":120,"type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"expires_at":{"format":"date-time","type":["string","null"]},"expires_in":{"maximum":600,"minimum":10,"type":["integer","null"]},"id":{"type":"string"},"kind":{"enum":["note","question"],"type":"string"},"seq":{"minimum":1,"type":"integer"},"status":{"enum":["pending","expired",null],"type":["string","null"]},"text":{"maxLength":2000,"type":"string"}},"required":["id","seq","kind","text","created_at"],"type":"object"},"OpenApiDocument":{"properties":{"components":{"type":"object"},"info":{"type":"object"},"openapi":{"const":"3.1.0","type":"string"},"paths":{"type":"object"}},"required":["openapi","info","paths","components"],"type":"object"},"Agent":{"properties":{"created_at":{"format":"date-time","type":"string"},"id":{"type":"string"},"last_seen_at":{"format":"date-time","type":"string"},"messages":{"items":{"$ref":"#/components/schemas/AgentMessage"},"type":"array"},"name":{"maxLength":80,"type":"string"},"replies":{"items":{"$ref":"#/components/schemas/AgentReply"},"type":"array"},"stale":{"type":"boolean"},"status":{"enum":["idle","working","waiting","complete","failed"],"type":"string"},"summary":{"maxLength":500,"type":"string"},"task":{"maxLength":120,"type":"string"}},"required":["id","name","task","status","summary","last_seen_at","stale","messages","replies"],"type":"object"},"DeliveryResponse":{"properties":{"delivery":{"$ref":"#/components/schemas/Delivery"}},"required":["delivery"],"type":"object"},"NotificationRequest":{"properties":{"alert_level":{"enum":["success","info","warning","error","record"],"type":"string"},"dismiss_interval":{"default":5000,"maximum":30000,"minimum":1,"type":"integer"},"message":{"maxLength":80,"minLength":1,"type":"string"},"source":{"maxLength":20,"type":"string"}},"required":["message"],"type":"object"},"CatalogEntry":{"properties":{"art":{"type":"string"},"bait":{"items":{"type":"string"},"type":"array"},"bait_ids":{"items":{"type":"string"},"type":"array"},"bait_names":{"items":{"type":"string"},"type":"array"},"id":{"type":"string"},"id_string":{"type":"string"},"location_ids":{"items":{"type":"string"},"type":"array"},"location_names":{"items":{"type":"string"},"type":"array"},"locations":{"items":{"type":"string"},"type":"array"},"name":{"type":"string"},"preferred_time":{"items":{"type":"string"},"type":"array"},"preferred_times":{"items":{"type":"string"},"type":"array"},"preferred_weather":{"items":{"type":"string"},"type":"array"},"preferred_weathers":{"items":{"type":"string"},"type":"array"},"rarity":{"enum":["common","uncommon","rare","epic","legendary"],"type":"string"},"rarity_hex":{"type":"string"},"rarity_id":{"type":"string"},"rarity_label":{"type":"string"},"value":{"type":"integer"},"weight":{"type":"string"},"weight_range":{"properties":{"max":{"type":"number"},"min":{"type":"number"}},"required":["min","max"],"type":"object"}},"required":["id","name","rarity","value","weight_range","location_ids"],"type":"object"},"AgentReply":{"properties":{"created_at":{"format":"date-time","type":"string"},"id":{"type":"string"},"question_id":{"type":["string","null"]},"seq":{"minimum":1,"type":"integer"},"text":{"maxLength":2000,"type":"string"}},"required":["id","seq","text","question_id","created_at"],"type":"object"},"CaughtFish":{"properties":{"burnt":{"type":"boolean"},"cooked":{"type":"boolean"},"name":{"type":"string"},"rarity":{"type":"string"},"species":{"type":"string"},"value":{"type":"integer"},"weight":{"type":["number","null"]}},"required":["species","name","weight","rarity","value","cooked","burnt"],"type":"object"},"Delivery":{"properties":{"attempts":{"minimum":0,"type":"integer"},"created_at":{"format":"date-time","type":"string"},"event":{"type":"string"},"id":{"type":"string"},"next_attempt_at":{"format":"date-time","type":["string","null"]},"status":{"type":"string"},"webhook_id":{"type":"string"}},"required":["id","webhook_id","status","attempts","created_at"],"type":"object"},"AgentListResponse":{"properties":{"agents":{"items":{"$ref":"#/components/schemas/Agent"},"type":"array"}},"required":["agents"],"type":"object"},"WebhookListResponse":{"properties":{"webhooks":{"items":{"$ref":"#/components/schemas/Webhook"},"type":"array"}},"required":["webhooks"],"type":"object"},"AgentRegistrationResponse":{"properties":{"agent":{"allOf":[{"$ref":"#/components/schemas/Agent"},{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"}]}},"required":["agent"],"type":"object"},"ActionRequest":{"properties":{"action":{"enum":["cast","hook","reel","sell_all","interact","enter","escape","move","travel","key"],"type":"string"},"direction":{"enum":["up","down","left","right"],"type":"string"},"key":{"maxLength":1,"minLength":1,"type":"string"},"location":{"type":"string"}},"required":["action"],"type":"object"},"AgentRepliesResponse":{"properties":{"cursor":{"minimum":0,"type":"integer"},"replies":{"items":{"$ref":"#/components/schemas/AgentReply"},"type":"array"}},"required":["replies","cursor"],"type":"object"},"Skill":{"properties":{"level":{"type":"integer"},"xp":{"type":"integer"}},"required":["level","xp"],"type":"object"},"AgentRequest":{"properties":{"name":{"maxLength":80,"type":"string"},"status":{"enum":["idle","working","waiting","complete","failed"],"type":"string"},"summary":{"maxLength":500,"type":"string"},"task":{"maxLength":120,"type":"string"}},"type":"object"},"AgentMessageRequest":{"properties":{"client_id":{"maxLength":120,"type":"string"},"expires_in":{"maximum":600,"minimum":10,"type":"integer"},"kind":{"default":"note","enum":["note","question"],"type":"string"},"text":{"maxLength":2000,"minLength":1,"type":"string"}},"required":["text"],"type":"object"},"AgentUpdateRequest":{"properties":{"name":{"maxLength":80,"type":"string"},"status":{"enum":["idle","working","waiting","complete","failed"],"type":"string"},"summary":{"maxLength":500,"type":"string"},"task":{"maxLength":120,"type":"string"}},"type":"object"},"OkResponse":{"properties":{"ok":{"const":true}},"required":["ok"],"type":"object"},"BotEnabledResponse":{"properties":{"message":{"type":"string"},"ok":{"const":true}},"required":["ok","message"],"type":"object"},"AgentResponse":{"properties":{"agent":{"$ref":"#/components/schemas/Agent"}},"required":["agent"],"type":"object"},"WorldResponse":{"properties":{"locations":{"items":{"$ref":"#/components/schemas/WorldLocation"},"type":"array"},"online_count":{"minimum":0,"type":"integer"},"refreshed_at":{"format":"date-time","type":"string"},"schema_version":{"const":2,"type":"integer"},"time_period":{"enum":["Dawn","Day","Dusk","Night"],"type":"string"}},"required":["schema_version","time_period","online_count","locations","refreshed_at"],"type":"object"},"WebhookRequest":{"properties":{"events":{"default":["*"],"items":{"type":"string"},"type":"array"},"url":{"format":"uri","type":"string"}},"required":["url"],"type":"object"}},"securitySchemes":{"agentTokenAuth":{"bearerFormat":"fsa_ agent token","description":"Use the token returned by agent registration. It can access only that agent's heartbeat, messages, and replies.","scheme":"bearer","type":"http"},"apiKeyAuth":{"bearerFormat":"fsh_ API key","description":"Use Authorization: Bearer YOUR_API_KEY. Player data can work offline; live actions require an active session.","scheme":"bearer","type":"http"}}},"info":{"description":"Public world and fish data plus authenticated player, agent, bot, and webhook operations.","title":"Fisshing API","version":"2.0.0"},"openapi":"3.1.0","paths":{"/api/v2/actions":{"post":{"description":"Actions are accepted only for an active SSH session with bot mode enabled. The game still validates each action; acceptance means the input was queued.","operationId":"submitAction","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionRequest"}}},"description":"Action payload.","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}},"description":"Action accepted and queued."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bot mode is not enabled."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Player is not online."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid action payload."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Action rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Submit a bot action","tags":["player"]}},"/api/v2/agents":{"get":{"description":"Lists the external agents registered for the authenticated player.","operationId":"listAgents","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentListResponse"}}},"description":"Connected agents."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"List connected agents","tags":["agents"]},"post":{"description":"Registers one external agent. The agent token is returned once in the response.","operationId":"createAgent","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentRequest"}}},"description":"Agent registration.","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentRegistrationResponse"}}},"description":"Agent registered."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The player has reached the agent limit."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid agent attributes."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Register an agent","tags":["agents"]}},"/api/v2/agents/{id}":{"delete":{"description":"Deletes an agent and revokes its token.","operationId":"deleteAgent","parameters":[{"description":"Agent id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}},"description":"Agent revoked."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Agent was not found."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Revoke an agent","tags":["agents"]},"patch":{"description":"Updates the agent status and heartbeat. The agent token can update only its own record.","operationId":"updateAgent","parameters":[{"description":"Agent id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentUpdateRequest"}}},"description":"Agent heartbeat.","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}},"description":"Agent updated."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid agent token."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid agent attributes."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"agentTokenAuth":[]}],"summary":"Update agent heartbeat","tags":["agents"]}},"/api/v2/agents/{id}/messages":{"post":{"description":"Publishes a bounded note or question for the player. A client_id makes retries idempotent.","operationId":"createAgentMessage","parameters":[{"description":"Agent id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMessageRequest"}}},"description":"Agent message.","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMessageResponse"}}},"description":"Agent message."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid agent token."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid or conflicting message."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"agentTokenAuth":[]}],"summary":"Publish an agent message","tags":["agents"]}},"/api/v2/agents/{id}/replies":{"get":{"description":"Returns replies after a durable sequence cursor. A positive cursor that falls outside retained history returns cursor_expired.","operationId":"listAgentReplies","parameters":[{"description":"Agent id.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Reply sequence to read after.","in":"query","name":"after","required":false,"schema":{"default":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentRepliesResponse"}}},"description":"Agent replies."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid agent token."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The reply cursor expired."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The reply cursor is invalid."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"agentTokenAuth":[]}],"summary":"Read player replies","tags":["agents"]}},"/api/v2/bot/enable":{"post":{"description":"Requires an active SSH session. Bot mode stays enabled for that session and cannot be undone through this endpoint.","operationId":"enableBotMode","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BotEnabledResponse"}}},"description":"Bot mode enabled."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Player is not online."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Enable bot mode","tags":["player"]}},"/api/v2/catalog":{"get":{"operationId":"getCatalog","parameters":[{"description":"Search fish names.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Filter by public location id.","in":"query","name":"location","required":false,"schema":{"type":"string"}},{"description":"Filter by rarity id.","in":"query","name":"rarity","required":false,"schema":{"type":"string"}},{"description":"Number of entries, from 1 to 100.","in":"query","name":"limit","required":false,"schema":{"default":25,"type":"integer"}},{"description":"Zero-based page offset.","in":"query","name":"offset","required":false,"schema":{"default":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogResponse"}}},"description":"Catalog page."},"304":{"description":"Catalog has not changed since the supplied ETag."}},"summary":"List fish catalog entries","tags":["public"]}},"/api/v2/deliveries":{"get":{"description":"Lists recent delivery records owned by the authenticated player.","operationId":"listDeliveries","parameters":[{"description":"Filter by webhook id.","in":"query","name":"webhook_id","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryListResponse"}}},"description":"Delivery list."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"List webhook deliveries","tags":["deliveries"]}},"/api/v2/deliveries/{id}/replay":{"post":{"description":"Queues a new attempt and keeps the original delivery record.","operationId":"replayDelivery","parameters":[{"description":"Delivery id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryResponse"}}},"description":"Replay accepted."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Delivery was not found."},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Delivery is already pending."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The delivery could not be queued."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Replay a webhook delivery","tags":["deliveries"]}},"/api/v2/me/collection":{"get":{"description":"Returns journal species counts, personal bests, completion, and achievements.","operationId":"getPlayerCollection","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse"}}},"description":"Collection progress."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Read collection progress","tags":["player"]}},"/api/v2/me/fish":{"get":{"description":"Returns live inventory or saved inventory when the player is offline.","operationId":"getPlayerFish","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FishResponse"}}},"description":"Fish inventory."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"List caught fish","tags":["player"]}},"/api/v2/me/state":{"get":{"description":"The state endpoint works for an offline player when saved data exists.","operationId":"getPlayerState","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerState"}}},"description":"Player state."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Player was not found."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Read player state","tags":["player"]}},"/api/v2/notify":{"post":{"description":"Requires an active online player session. The message is limited to 80 characters.","operationId":"sendNotification","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationRequest"}}},"description":"Notification payload.","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}},"description":"Notification accepted."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Player is not online."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid notification payload."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Send an in-game notification","tags":["player"]}},"/api/v2/openapi.json":{"get":{"operationId":"getOpenApiDocument","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}},"description":"OpenAPI 3.1 document."}},"summary":"Get this OpenAPI document","tags":["public"]}},"/api/v2/status":{"post":{"description":"Requires an active online player session.","operationId":"setAgentStatus","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusRequest"}}},"description":"Agent status payload.","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}},"description":"Status accepted."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Player is not online."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Payload must contain active true or false."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Set agent status","tags":["player"]}},"/api/v2/webhooks":{"get":{"description":"Secrets are masked in the response. Each player can register at most three webhooks.","operationId":"listWebhooks","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookListResponse"}}},"description":"Registered webhooks."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"List webhooks","tags":["webhooks"]},"post":{"description":"Registers an HTTPS or HTTP endpoint for supported game events.","operationId":"createWebhook","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRequest"}}},"description":"Webhook registration.","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}},"description":"Webhook created."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid webhook payload."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Register a webhook","tags":["webhooks"]}},"/api/v2/webhooks/{id}":{"delete":{"description":"Deletes a webhook owned by the authenticated player.","operationId":"deleteWebhook","parameters":[{"description":"Webhook id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}},"description":"Webhook deleted."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Webhook was not found."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Delete a webhook","tags":["webhooks"]}},"/api/v2/webhooks/{id}/test":{"post":{"description":"Queues a test delivery for the registered webhook.","operationId":"testWebhook","parameters":[{"description":"Webhook id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryResponse"}}},"description":"Test delivery accepted."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API key."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Webhook was not found."},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The delivery could not be queued."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authenticated API rate limit reached."}},"security":[{"apiKeyAuth":[]}],"summary":"Send a test delivery","tags":["webhooks"]}},"/api/v2/world":{"get":{"operationId":"getWorld","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorldResponse"}}},"description":"Current public world snapshot."}},"summary":"Read shared world conditions","tags":["public"]}}},"servers":[{"url":"/"}],"tags":[{"description":"Anonymous catalog and world data.","name":"public"},{"description":"Authenticated player data and actions.","name":"player"},{"description":"Scoped external agent sessions and replies.","name":"agents"},{"description":"Authenticated webhook registration.","name":"webhooks"},{"description":"Webhook delivery records.","name":"deliveries"}]}