{"openapi":"3.0.0","paths":{"/api/war":{"get":{"operationId":"ApiGameController_getWar[0]","parameters":[],"responses":{"200":{"description":"Current war as reported by Foxhole and stored by Foxpile's war reset guard."}},"summary":"Get the current tracked Foxhole war","tags":["Maps"]}},"/v1/api/war":{"get":{"operationId":"ApiGameController_getWar[1]_v1","parameters":[],"responses":{"200":{"description":"Current war as reported by Foxhole and stored by Foxpile's war reset guard."}},"summary":"Get the current tracked Foxhole war","tags":["Maps"]}},"/api/maps/{mapId}":{"get":{"description":"Returns stockpiles controlled by the caller's faction. Reserve contents are omitted unless the token has `regiment.read` and the user has a matching access grant.","operationId":"ApiGameController_getMapStockpiles[0]","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Faction-filtered map collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMapCollectionDto"}}}},"401":{"description":"Invalid or expired token."},"403":{"description":"Missing scope or faction."},"404":{"description":"Unknown map."}},"security":[{"oauth2":[]}],"summary":"Get the accessible stockpiles for a map","tags":["Maps"]}},"/v1/api/maps/{mapId}":{"get":{"description":"Returns stockpiles controlled by the caller's faction. Reserve contents are omitted unless the token has `regiment.read` and the user has a matching access grant.","operationId":"ApiGameController_getMapStockpiles[1]_v1","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Faction-filtered map collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMapCollectionDto"}}}},"401":{"description":"Invalid or expired token."},"403":{"description":"Missing scope or faction."},"404":{"description":"Unknown map."}},"security":[{"oauth2":[]}],"summary":"Get the accessible stockpiles for a map","tags":["Maps"]}},"/api/maps":{"get":{"description":"Lists maps visible to the authenticated faction with quantity and freshness summaries.","operationId":"ApiGameController_listMaps[0]","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Accessible map summaries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapListDto"}}}}},"security":[{"oauth2":[]}],"summary":"List accessible maps","tags":["Maps"]}},"/v1/api/maps":{"get":{"description":"Lists maps visible to the authenticated faction with quantity and freshness summaries.","operationId":"ApiGameController_listMaps[1]_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Accessible map summaries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapListDto"}}}}},"security":[{"oauth2":[]}],"summary":"List accessible maps","tags":["Maps"]}},"/api/maps/{mapId}/summary":{"get":{"operationId":"ApiGameController_getMapSummary[0]","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Totals by stockpile and category. Reserve quantities require `regiment.read`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapSummaryDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get an aggregated map summary","tags":["Maps"]}},"/v1/api/maps/{mapId}/summary":{"get":{"operationId":"ApiGameController_getMapSummary[1]_v1","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Totals by stockpile and category. Reserve quantities require `regiment.read`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapSummaryDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get an aggregated map summary","tags":["Maps"]}},"/api/stats":{"get":{"description":"Statistics are restricted to the authenticated faction.","operationId":"ApiGameController_getStats[0]","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Global stockpile statistics.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get global stockpile statistics","tags":["Maps"]}},"/v1/api/stats":{"get":{"description":"Statistics are restricted to the authenticated faction.","operationId":"ApiGameController_getStats[1]_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Global stockpile statistics.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get global stockpile statistics","tags":["Maps"]}},"/api/history":{"get":{"description":"Public history requires `stockpile.read`. Reserve history is included only with `regiment.read`.","operationId":"ApiGameController_getHistory[0]","parameters":[{"name":"mapId","required":false,"in":"query","schema":{"type":"string"}},{"name":"itemName","required":false,"in":"query","schema":{"example":"MaintenanceSupplies","type":"string"}},{"name":"cityId","required":false,"in":"query","schema":{"type":"string"}},{"name":"stockpileCodeName","required":false,"in":"query","schema":{"type":"string"}},{"name":"from","required":false,"in":"query","description":"Inclusive ISO 8601 date.","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","description":"Inclusive ISO 8601 date.","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Between 1 and 500.","schema":{"example":100,"type":"number"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Matching history entries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponseDto"}}}}},"security":[{"oauth2":[]}],"summary":"Search stockpile quantity history","tags":["Maps","History"]}},"/v1/api/history":{"get":{"description":"Public history requires `stockpile.read`. Reserve history is included only with `regiment.read`.","operationId":"ApiGameController_getHistory[1]_v1","parameters":[{"name":"mapId","required":false,"in":"query","schema":{"type":"string"}},{"name":"itemName","required":false,"in":"query","schema":{"example":"MaintenanceSupplies","type":"string"}},{"name":"cityId","required":false,"in":"query","schema":{"type":"string"}},{"name":"stockpileCodeName","required":false,"in":"query","schema":{"type":"string"}},{"name":"from","required":false,"in":"query","description":"Inclusive ISO 8601 date.","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","description":"Inclusive ISO 8601 date.","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Between 1 and 500.","schema":{"example":100,"type":"number"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Matching history entries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponseDto"}}}}},"security":[{"oauth2":[]}],"summary":"Search stockpile quantity history","tags":["Maps","History"]}},"/api/history/items/{codeName}":{"get":{"operationId":"ApiGameController_getItemHistory[0]","parameters":[{"name":"codeName","required":true,"in":"path","schema":{"example":"MaintenanceSupplies","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"example":100,"type":"number"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponseDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get history for one item code name","tags":["Maps","History"]}},"/v1/api/history/items/{codeName}":{"get":{"operationId":"ApiGameController_getItemHistory[1]_v1","parameters":[{"name":"codeName","required":true,"in":"path","schema":{"example":"MaintenanceSupplies","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"example":100,"type":"number"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponseDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get history for one item code name","tags":["Maps","History"]}},"/api/history/{mapId}":{"get":{"operationId":"ApiGameController_getMapHistory[0]","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"example":100,"type":"number"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponseDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get history for one map","tags":["Maps","History"]}},"/v1/api/history/{mapId}":{"get":{"operationId":"ApiGameController_getMapHistory[1]_v1","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"example":100,"type":"number"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponseDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get history for one map","tags":["Maps","History"]}},"/api/maps/{mapId}/{cityId}":{"get":{"operationId":"ApiGameController_getMapCityStockpiles[0]","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"cityId","required":true,"in":"path","schema":{"example":"Cragstown","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Matching public stockpiles.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMapCollectionDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get stockpiles near a city or map label","tags":["Maps"]}},"/v1/api/maps/{mapId}/{cityId}":{"get":{"operationId":"ApiGameController_getMapCityStockpiles[1]_v1","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"cityId","required":true,"in":"path","schema":{"example":"Cragstown","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Matching public stockpiles.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMapCollectionDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get stockpiles near a city or map label","tags":["Maps"]}},"/api/maps/{mapId}/{cityId}/{stockName}":{"get":{"description":"Requires `regiment.read` and a reserve access grant recorded for the authenticated user.","operationId":"ApiGameController_getMapCityNamedStockpile[0]","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"cityId","required":true,"in":"path","schema":{"example":"Cragstown","type":"string"}},{"name":"stockName","required":true,"in":"path","schema":{"example":"Logistics","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Named reserve stockpile.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMapCollectionDto"}}}},"403":{"description":"Missing scope or access grant."}},"security":[{"oauth2":[]}],"summary":"Get one named reserve stockpile","tags":["Maps"]}},"/v1/api/maps/{mapId}/{cityId}/{stockName}":{"get":{"description":"Requires `regiment.read` and a reserve access grant recorded for the authenticated user.","operationId":"ApiGameController_getMapCityNamedStockpile[1]_v1","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"cityId","required":true,"in":"path","schema":{"example":"Cragstown","type":"string"}},{"name":"stockName","required":true,"in":"path","schema":{"example":"Logistics","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Named reserve stockpile.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMapCollectionDto"}}}},"403":{"description":"Missing scope or access grant."}},"security":[{"oauth2":[]}],"summary":"Get one named reserve stockpile","tags":["Maps"]}},"/api/users/steam/{steamUsername}":{"get":{"operationId":"ApiUsersController_getSteamUser[0]","parameters":[{"name":"steamUsername","required":true,"in":"path","schema":{"example":"JohnDoe","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns Steam username, faction and whether the companion was used.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLookupDto"}}}}},"security":[{"oauth2":[]}],"summary":"Look up a limited user profile by Steam username","tags":["Users"]}},"/v1/api/users/steam/{steamUsername}":{"get":{"operationId":"ApiUsersController_getSteamUser[1]_v1","parameters":[{"name":"steamUsername","required":true,"in":"path","schema":{"example":"JohnDoe","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns Steam username, faction and whether the companion was used.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLookupDto"}}}}},"security":[{"oauth2":[]}],"summary":"Look up a limited user profile by Steam username","tags":["Users"]}},"/api/users/discord/{discordId}":{"get":{"operationId":"ApiUsersController_getDiscordUser[0]","parameters":[{"name":"discordId","required":true,"in":"path","schema":{"example":"123456789012345678","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns Discord ID, linked Steam username, faction and usage state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLookupDto"}}}}},"security":[{"oauth2":[]}],"summary":"Look up a limited user profile by Discord ID","tags":["Users"]}},"/v1/api/users/discord/{discordId}":{"get":{"operationId":"ApiUsersController_getDiscordUser[1]_v1","parameters":[{"name":"discordId","required":true,"in":"path","schema":{"example":"123456789012345678","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns Discord ID, linked Steam username, faction and usage state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLookupDto"}}}}},"security":[{"oauth2":[]}],"summary":"Look up a limited user profile by Discord ID","tags":["Users"]}},"/oauth/authorize":{"get":{"description":"Open this route in the user's browser. Web clients receive the code through `redirect_uri`; bot clients display an out-of-band code.","operationId":"OAuthController_authorize[0]","parameters":[{"name":"client_id","required":true,"in":"query","schema":{"type":"string"}},{"name":"response_type","required":true,"in":"query","schema":{"example":"code","type":"string"}},{"name":"redirect_uri","required":false,"in":"query","schema":{"type":"string"}},{"name":"scope","required":false,"in":"query","schema":{"example":"identity stockpile.read","type":"string"}},{"name":"state","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"HTML authorization page."}},"summary":"Start the OAuth authorization-code flow","tags":["OAuth"]},"post":{"operationId":"OAuthController_confirmAuthorize[0]","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["client_id"],"properties":{"client_id":{"type":"string"},"redirect_uri":{"type":"string"},"scope":{"type":"string"},"state":{"type":"string"},"action":{"type":"string","enum":["authorize","cancel"]}}}},"application/json":{"schema":{"type":"object","required":["client_id"],"properties":{"client_id":{"type":"string"},"redirect_uri":{"type":"string"},"scope":{"type":"string"},"state":{"type":"string"},"action":{"type":"string","enum":["authorize","cancel"]}}}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Approve or cancel an OAuth authorization request","tags":["OAuth"]}},"/v1/oauth/authorize":{"get":{"description":"Open this route in the user's browser. Web clients receive the code through `redirect_uri`; bot clients display an out-of-band code.","operationId":"OAuthController_authorize[1]_v1","parameters":[{"name":"client_id","required":true,"in":"query","schema":{"type":"string"}},{"name":"response_type","required":true,"in":"query","schema":{"example":"code","type":"string"}},{"name":"redirect_uri","required":false,"in":"query","schema":{"type":"string"}},{"name":"scope","required":false,"in":"query","schema":{"example":"identity stockpile.read","type":"string"}},{"name":"state","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"HTML authorization page."}},"summary":"Start the OAuth authorization-code flow","tags":["OAuth"]},"post":{"operationId":"OAuthController_confirmAuthorize[1]_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["client_id"],"properties":{"client_id":{"type":"string"},"redirect_uri":{"type":"string"},"scope":{"type":"string"},"state":{"type":"string"},"action":{"type":"string","enum":["authorize","cancel"]}}}},"application/json":{"schema":{"type":"object","required":["client_id"],"properties":{"client_id":{"type":"string"},"redirect_uri":{"type":"string"},"scope":{"type":"string"},"state":{"type":"string"},"action":{"type":"string","enum":["authorize","cancel"]}}}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Approve or cancel an OAuth authorization request","tags":["OAuth"]}},"/oauth/apps/context":{"get":{"operationId":"OAuthController_appsContext[0]","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Get the authenticated developer portal context","tags":["OAuth"]}},"/v1/oauth/apps/context":{"get":{"operationId":"OAuthController_appsContext[1]_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Get the authenticated developer portal context","tags":["OAuth"]}},"/oauth/apps":{"post":{"description":"The client secret is returned once. Store it server-side and never expose it to browsers or Discord users.","operationId":"OAuthController_createApp[0]","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["name","application_type"],"properties":{"name":{"type":"string","example":"My Foxpile bot"},"description":{"type":"string"},"redirect_uris":{"type":"string","description":"Comma or newline-separated URIs. Required for web apps."},"allowed_scopes":{"type":"string","example":"identity stockpile.read"},"application_type":{"type":"string","enum":["web","bot"]}}}},"application/json":{"schema":{"type":"object","required":["name","application_type"],"properties":{"name":{"type":"string","example":"My Foxpile bot"},"description":{"type":"string"},"redirect_uris":{"type":"string","description":"Comma or newline-separated URIs. Required for web apps."},"allowed_scopes":{"type":"string","example":"identity stockpile.read"},"application_type":{"type":"string","enum":["web","bot"]}}}}}},"responses":{"201":{"description":"Client metadata and one-time client secret."}},"security":[{"oauth2":[]}],"summary":"Create an OAuth client","tags":["OAuth"]}},"/v1/oauth/apps":{"post":{"description":"The client secret is returned once. Store it server-side and never expose it to browsers or Discord users.","operationId":"OAuthController_createApp[1]_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["name","application_type"],"properties":{"name":{"type":"string","example":"My Foxpile bot"},"description":{"type":"string"},"redirect_uris":{"type":"string","description":"Comma or newline-separated URIs. Required for web apps."},"allowed_scopes":{"type":"string","example":"identity stockpile.read"},"application_type":{"type":"string","enum":["web","bot"]}}}},"application/json":{"schema":{"type":"object","required":["name","application_type"],"properties":{"name":{"type":"string","example":"My Foxpile bot"},"description":{"type":"string"},"redirect_uris":{"type":"string","description":"Comma or newline-separated URIs. Required for web apps."},"allowed_scopes":{"type":"string","example":"identity stockpile.read"},"application_type":{"type":"string","enum":["web","bot"]}}}}}},"responses":{"201":{"description":"Client metadata and one-time client secret."}},"security":[{"oauth2":[]}],"summary":"Create an OAuth client","tags":["OAuth"]}},"/oauth/authorize/context":{"get":{"operationId":"OAuthController_authorizeContext[0]","parameters":[{"name":"client_id","required":true,"in":"query","schema":{"type":"string"}},{"name":"response_type","required":true,"in":"query","schema":{"example":"code","type":"string"}},{"name":"redirect_uri","required":false,"in":"query","schema":{"type":"string"}},{"name":"scope","required":false,"in":"query","schema":{"type":"string"}},{"name":"state","required":false,"in":"query","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Resolve authorization details for the consent page","tags":["OAuth"]}},"/v1/oauth/authorize/context":{"get":{"operationId":"OAuthController_authorizeContext[1]_v1","parameters":[{"name":"client_id","required":true,"in":"query","schema":{"type":"string"}},{"name":"response_type","required":true,"in":"query","schema":{"example":"code","type":"string"}},{"name":"redirect_uri","required":false,"in":"query","schema":{"type":"string"}},{"name":"scope","required":false,"in":"query","schema":{"type":"string"}},{"name":"state","required":false,"in":"query","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Resolve authorization details for the consent page","tags":["OAuth"]}},"/oauth/token":{"post":{"description":"Authorization codes are single-use and expire after five minutes. Access tokens expire after 30 days.","operationId":"OAuthController_token[0]","parameters":[],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["client_id","client_secret","code"],"properties":{"client_id":{"type":"string"},"client_secret":{"type":"string","format":"password"},"code":{"type":"string"},"redirect_uri":{"type":"string"},"grant_type":{"type":"string","enum":["authorization_code"],"default":"authorization_code"}}}},"application/json":{"schema":{"type":"object","required":["client_id","client_secret","code"],"properties":{"client_id":{"type":"string"},"client_secret":{"type":"string","format":"password"},"code":{"type":"string"},"redirect_uri":{"type":"string"},"grant_type":{"type":"string","enum":["authorization_code"],"default":"authorization_code"}}}}}},"responses":{"201":{"description":"Bearer access token valid for 30 days.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthTokenDto"}}}}},"summary":"Exchange an authorization code for an access token","tags":["OAuth"]}},"/v1/oauth/token":{"post":{"description":"Authorization codes are single-use and expire after five minutes. Access tokens expire after 30 days.","operationId":"OAuthController_token[1]_v1","parameters":[],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["client_id","client_secret","code"],"properties":{"client_id":{"type":"string"},"client_secret":{"type":"string","format":"password"},"code":{"type":"string"},"redirect_uri":{"type":"string"},"grant_type":{"type":"string","enum":["authorization_code"],"default":"authorization_code"}}}},"application/json":{"schema":{"type":"object","required":["client_id","client_secret","code"],"properties":{"client_id":{"type":"string"},"client_secret":{"type":"string","format":"password"},"code":{"type":"string"},"redirect_uri":{"type":"string"},"grant_type":{"type":"string","enum":["authorization_code"],"default":"authorization_code"}}}}}},"responses":{"201":{"description":"Bearer access token valid for 30 days.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthTokenDto"}}}}},"summary":"Exchange an authorization code for an access token","tags":["OAuth"]}},"/oauth/userinfo":{"get":{"description":"Requires the `identity` scope.","operationId":"OAuthController_userInfo[0]","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthUserInfoDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get the authenticated user","tags":["OAuth"]}},"/v1/oauth/userinfo":{"get":{"description":"Requires the `identity` scope.","operationId":"OAuthController_userInfo[1]_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthUserInfoDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get the authenticated user","tags":["OAuth"]}},"/oauth/validate":{"get":{"operationId":"OAuthController_validate[0]","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenValidationDto"}}}}},"security":[{"oauth2":[]}],"summary":"Check whether an access token is valid","tags":["OAuth"]}},"/v1/oauth/validate":{"get":{"operationId":"OAuthController_validate[1]_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenValidationDto"}}}}},"security":[{"oauth2":[]}],"summary":"Check whether an access token is valid","tags":["OAuth"]}},"/oauth/revoke":{"post":{"operationId":"OAuthController_revoke[0]","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeTokenDto"}}}}},"security":[{"oauth2":[]}],"summary":"Revoke the current access token","tags":["OAuth"]}},"/v1/oauth/revoke":{"post":{"operationId":"OAuthController_revoke[1]_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeTokenDto"}}}}},"security":[{"oauth2":[]}],"summary":"Revoke the current access token","tags":["OAuth"]}},"/api/events":{"get":{"description":"Keeps the HTTP connection open and emits named SSE events. Public subscriptions must provide event filters. Use EventSource, curl with `-N`, or an SSE client for testing.","operationId":"ApiSseController_stream[0]","parameters":[{"name":"items","required":false,"in":"query","schema":{"example":"MaintenanceSupplies,Diesel","type":"string"}},{"name":"minQuantity","required":false,"in":"query","schema":{"example":20,"type":"number"}},{"name":"filters","required":false,"in":"query","description":"JSON object containing additional exact-match filters.","schema":{"example":"{\"category\":[\"items\",\"itemCrates\"]}","type":"string"}},{"name":"secret","required":true,"in":"query","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}},{"name":"x-foxpile-sse-secret","required":true,"in":"header","schema":{"type":"string"}},{"name":"stockNames","required":false,"in":"query","schema":{}},{"name":"cityIds","required":false,"in":"query","schema":{"example":"ThePits"}},{"name":"mapIds","required":false,"in":"query","schema":{"example":"DeadLandsHex"}},{"name":"events","required":true,"in":"query","description":"Comma-separated events: token.expire, stock.updated, stock.low, stock.critical, stock.removed, faction.update.","schema":{"example":"stock.low,stock.critical"}}],"responses":{"200":{"description":"Persistent text/event-stream connection."},"400":{"description":"Invalid or missing filters."},"401":{"description":"Invalid or expired token."}},"security":[{"oauth2":[]}],"summary":"Open a Server-Sent Events subscription","tags":["Realtime"]}},"/v1/api/events":{"get":{"description":"Keeps the HTTP connection open and emits named SSE events. Public subscriptions must provide event filters. Use EventSource, curl with `-N`, or an SSE client for testing.","operationId":"ApiSseController_stream[1]_v1","parameters":[{"name":"items","required":false,"in":"query","schema":{"example":"MaintenanceSupplies,Diesel","type":"string"}},{"name":"minQuantity","required":false,"in":"query","schema":{"example":20,"type":"number"}},{"name":"filters","required":false,"in":"query","description":"JSON object containing additional exact-match filters.","schema":{"example":"{\"category\":[\"items\",\"itemCrates\"]}","type":"string"}},{"name":"secret","required":true,"in":"query","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}},{"name":"x-foxpile-sse-secret","required":true,"in":"header","schema":{"type":"string"}},{"name":"stockNames","required":false,"in":"query","schema":{}},{"name":"cityIds","required":false,"in":"query","schema":{"example":"ThePits"}},{"name":"mapIds","required":false,"in":"query","schema":{"example":"DeadLandsHex"}},{"name":"events","required":true,"in":"query","description":"Comma-separated events: token.expire, stock.updated, stock.low, stock.critical, stock.removed, faction.update.","schema":{"example":"stock.low,stock.critical"}}],"responses":{"200":{"description":"Persistent text/event-stream connection."},"400":{"description":"Invalid or missing filters."},"401":{"description":"Invalid or expired token."}},"security":[{"oauth2":[]}],"summary":"Open a Server-Sent Events subscription","tags":["Realtime"]}},"/api/references/icons/{fileName}":{"get":{"operationId":"ApiReferencesController_getIcon[0]","parameters":[{"name":"fileName","required":true,"in":"path","description":"FIR CodeName followed by .png or -crated.png.","schema":{"example":"RifleW-crated.png","type":"string"}}],"responses":{"200":{"description":"PNG icon from FIR airborne-63."},"404":{"description":"Unknown FIR icon."}},"summary":"Get a FIR item icon","tags":["References"]}},"/references/icons/{fileName}":{"get":{"operationId":"ApiReferencesController_getIcon[1]","parameters":[{"name":"fileName","required":true,"in":"path","description":"FIR CodeName followed by .png or -crated.png.","schema":{"example":"RifleW-crated.png","type":"string"}}],"responses":{"200":{"description":"PNG icon from FIR airborne-63."},"404":{"description":"Unknown FIR icon."}},"summary":"Get a FIR item icon","tags":["References"]}},"/v1/api/references/icons/{fileName}":{"get":{"operationId":"ApiReferencesController_getIcon[2]_v1","parameters":[{"name":"fileName","required":true,"in":"path","description":"FIR CodeName followed by .png or -crated.png.","schema":{"example":"RifleW-crated.png","type":"string"}}],"responses":{"200":{"description":"PNG icon from FIR airborne-63."},"404":{"description":"Unknown FIR icon."}},"summary":"Get a FIR item icon","tags":["References"]}},"/v1/references/icons/{fileName}":{"get":{"operationId":"ApiReferencesController_getIcon[3]_v1","parameters":[{"name":"fileName","required":true,"in":"path","description":"FIR CodeName followed by .png or -crated.png.","schema":{"example":"RifleW-crated.png","type":"string"}}],"responses":{"200":{"description":"PNG icon from FIR airborne-63."},"404":{"description":"Unknown FIR icon."}},"summary":"Get a FIR item icon","tags":["References"]}},"/api/references/catalog/{codeName}":{"get":{"operationId":"ApiReferencesController_getCatalogEntry[0]","parameters":[{"name":"codeName","required":true,"in":"path","schema":{"example":"RifleW","type":"string"}}],"responses":{"200":{"description":"Unmodified FIR catalog object plus its source revision and synchronization date."},"404":{"description":"Unknown FIR CodeName."}},"summary":"Get the complete FIR data for a CodeName","tags":["References"]}},"/references/catalog/{codeName}":{"get":{"operationId":"ApiReferencesController_getCatalogEntry[1]","parameters":[{"name":"codeName","required":true,"in":"path","schema":{"example":"RifleW","type":"string"}}],"responses":{"200":{"description":"Unmodified FIR catalog object plus its source revision and synchronization date."},"404":{"description":"Unknown FIR CodeName."}},"summary":"Get the complete FIR data for a CodeName","tags":["References"]}},"/v1/api/references/catalog/{codeName}":{"get":{"operationId":"ApiReferencesController_getCatalogEntry[2]_v1","parameters":[{"name":"codeName","required":true,"in":"path","schema":{"example":"RifleW","type":"string"}}],"responses":{"200":{"description":"Unmodified FIR catalog object plus its source revision and synchronization date."},"404":{"description":"Unknown FIR CodeName."}},"summary":"Get the complete FIR data for a CodeName","tags":["References"]}},"/v1/references/catalog/{codeName}":{"get":{"operationId":"ApiReferencesController_getCatalogEntry[3]_v1","parameters":[{"name":"codeName","required":true,"in":"path","schema":{"example":"RifleW","type":"string"}}],"responses":{"200":{"description":"Unmodified FIR catalog object plus its source revision and synchronization date."},"404":{"description":"Unknown FIR CodeName."}},"summary":"Get the complete FIR data for a CodeName","tags":["References"]}},"/api/references/{type}":{"get":{"description":"Returns cached Foxhole references for items, vehicles, structures, maps or cities. Each reference has a stable text `id` and a user-facing `visibleName` that falls back to `id`.","operationId":"ApiReferencesController_getReferences[0]","parameters":[{"name":"type","required":true,"in":"path","schema":{"enum":["item","vehicle","structure","map","city"],"type":"string"}},{"name":"q","required":false,"in":"query","description":"Partial search across stable IDs, visible names, and aliases.","schema":{"example":"MetalBeamMaterial","type":"string"}}],"responses":{"200":{"description":"Alphabetically sorted reference collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferenceCollectionDto"}}}},"400":{"description":"Unsupported reference type."}},"summary":"List stable references by type","tags":["References"]}},"/references/{type}":{"get":{"description":"Returns cached Foxhole references for items, vehicles, structures, maps or cities. Each reference has a stable text `id` and a user-facing `visibleName` that falls back to `id`.","operationId":"ApiReferencesController_getReferences[1]","parameters":[{"name":"type","required":true,"in":"path","schema":{"enum":["item","vehicle","structure","map","city"],"type":"string"}},{"name":"q","required":false,"in":"query","description":"Partial search across stable IDs, visible names, and aliases.","schema":{"example":"MetalBeamMaterial","type":"string"}}],"responses":{"200":{"description":"Alphabetically sorted reference collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferenceCollectionDto"}}}},"400":{"description":"Unsupported reference type."}},"summary":"List stable references by type","tags":["References"]}},"/v1/api/references/{type}":{"get":{"description":"Returns cached Foxhole references for items, vehicles, structures, maps or cities. Each reference has a stable text `id` and a user-facing `visibleName` that falls back to `id`.","operationId":"ApiReferencesController_getReferences[2]_v1","parameters":[{"name":"type","required":true,"in":"path","schema":{"enum":["item","vehicle","structure","map","city"],"type":"string"}},{"name":"q","required":false,"in":"query","description":"Partial search across stable IDs, visible names, and aliases.","schema":{"example":"MetalBeamMaterial","type":"string"}}],"responses":{"200":{"description":"Alphabetically sorted reference collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferenceCollectionDto"}}}},"400":{"description":"Unsupported reference type."}},"summary":"List stable references by type","tags":["References"]}},"/v1/references/{type}":{"get":{"description":"Returns cached Foxhole references for items, vehicles, structures, maps or cities. Each reference has a stable text `id` and a user-facing `visibleName` that falls back to `id`.","operationId":"ApiReferencesController_getReferences[3]_v1","parameters":[{"name":"type","required":true,"in":"path","schema":{"enum":["item","vehicle","structure","map","city"],"type":"string"}},{"name":"q","required":false,"in":"query","description":"Partial search across stable IDs, visible names, and aliases.","schema":{"example":"MetalBeamMaterial","type":"string"}}],"responses":{"200":{"description":"Alphabetically sorted reference collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferenceCollectionDto"}}}},"400":{"description":"Unsupported reference type."}},"summary":"List stable references by type","tags":["References"]}},"/v1/game-data/releases":{"get":{"operationId":"ApiGameDataController_listReleases_v1","parameters":[],"responses":{"200":{"description":""}},"summary":"List synchronized Foxhole data releases","tags":["Game data versions"]}},"/v1/game-data/{release}/references/{type}":{"get":{"operationId":"ApiGameDataController_listReferences_v1","parameters":[{"name":"release","required":true,"in":"path","schema":{"example":"airborne-63","type":"string"}},{"name":"type","required":true,"in":"path","schema":{"enum":["item","vehicle","structure","map","city"],"type":"string"}},{"name":"q","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"List references for one Foxhole data release","tags":["Game data versions"]}},"/v1/game-data/{release}/catalog/{codeName}":{"get":{"operationId":"ApiGameDataController_getCatalogEntry_v1","parameters":[{"name":"release","required":true,"in":"path","schema":{"example":"lts","type":"string"}},{"name":"codeName","required":true,"in":"path","schema":{"example":"RifleW","type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get complete FIR data for a release and CodeName","tags":["Game data versions"]}},"/v1/game-data/{release}/icons/{fileName}":{"get":{"operationId":"ApiGameDataController_getIcon_v1","parameters":[{"name":"release","required":true,"in":"path","schema":{"type":"string"}},{"name":"fileName","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"PNG icon."}},"summary":"Get a FIR icon for one game release","tags":["Game data versions"]}},"/health":{"get":{"operationId":"HealthController_health[0]","parameters":[],"responses":{"200":{"description":"Process and database are reachable."}},"summary":"Check API liveness","tags":["Operations"]}},"/v1/health":{"get":{"operationId":"HealthController_health[1]_v1","parameters":[],"responses":{"200":{"description":"Process and database are reachable."}},"summary":"Check API liveness","tags":["Operations"]}},"/health/ready":{"get":{"operationId":"HealthController_readiness[0]","parameters":[],"responses":{"200":{"description":"API is ready to receive traffic."},"503":{"description":"A required dependency is unavailable."}},"summary":"Check API readiness","tags":["Operations"]}},"/v1/health/ready":{"get":{"operationId":"HealthController_readiness[1]_v1","parameters":[],"responses":{"200":{"description":"API is ready to receive traffic."},"503":{"description":"A required dependency is unavailable."}},"summary":"Check API readiness","tags":["Operations"]}},"/metrics":{"get":{"operationId":"HealthController_metrics[0]","parameters":[],"responses":{"200":{"description":"Storage, history, references, process and SSE metrics."}},"summary":"Get operational JSON metrics","tags":["Operations"]}},"/v1/metrics":{"get":{"operationId":"HealthController_metrics[1]_v1","parameters":[],"responses":{"200":{"description":"Storage, history, references, process and SSE metrics."}},"summary":"Get operational JSON metrics","tags":["Operations"]}},"/v1/stockpiles/maps":{"get":{"operationId":"StockpilesController_listMaps_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapListDto"}}}}},"security":[{"oauth2":[]}],"summary":"List maps containing accessible stockpiles","tags":["Stockpiles"]}},"/v1/stockpiles/maps/{mapId}":{"get":{"description":"Returns public stockpiles controlled by the caller's faction. Accessible reserve contents are included when authorized.","operationId":"StockpilesController_getMapStockpiles_v1","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMapCollectionDto"}}}},"404":{"description":"No stockpile data for this map."}},"security":[{"oauth2":[]}],"summary":"Get accessible stockpiles on a map","tags":["Stockpiles"]}},"/v1/stockpiles/maps/{mapId}/summary":{"get":{"operationId":"StockpilesController_getMapSummary_v1","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapSummaryDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get a stockpile summary for one map","tags":["Stockpiles"]}},"/v1/stockpiles/maps/{mapId}/locations/{locationId}":{"get":{"operationId":"StockpilesController_getLocationStockpiles_v1","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"locationId","required":true,"in":"path","schema":{"example":"Cragstown","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMapCollectionDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get accessible stockpiles near a map location","tags":["Stockpiles"]}},"/v1/stockpiles/maps/{mapId}/locations/{locationId}/reserves/{reserveName}":{"get":{"operationId":"StockpilesController_getNamedReserveStockpile_v1","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"locationId","required":true,"in":"path","schema":{"example":"Cragstown","type":"string"}},{"name":"reserveName","required":true,"in":"path","schema":{"example":"Logistics","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMapCollectionDto"}}}},"403":{"description":"Missing reserve access grant."}},"security":[{"oauth2":[]}],"summary":"Get one accessible named reserve stockpile","tags":["Stockpiles"]}},"/v1/stockpiles/stats":{"get":{"operationId":"StockpilesController_getStats_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get global accessible stockpile statistics","tags":["Stockpiles"]}},"/v1/stockpiles/search":{"get":{"operationId":"StockpilesController_search_v1","parameters":[{"name":"q","required":false,"in":"query","description":"Free-text item names or aliases, comma-separated. Partial matching is supported.","schema":{"example":"Freighter,BasicMaterials","type":"string"}},{"name":"maps","required":false,"in":"query","schema":{"type":"string"}},{"name":"cities","required":false,"in":"query","schema":{"type":"string"}},{"name":"structures","required":false,"in":"query","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}},{"name":"items","required":false,"in":"query","description":"Explicit alias of q.","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Search accessible stockpile contents","tags":["Stockpiles"]}},"/v1/stockpiles/history":{"get":{"operationId":"StockpilesController_getHistory_v1","parameters":[{"name":"mapId","required":false,"in":"query","schema":{"type":"string"}},{"name":"itemName","required":false,"in":"query","schema":{"type":"string"}},{"name":"locationId","required":false,"in":"query","schema":{"type":"string"}},{"name":"stockpileCodeName","required":false,"in":"query","schema":{"type":"string"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponseDto"}}}}},"security":[{"oauth2":[]}],"summary":"Search stockpile quantity history","tags":["Stockpiles"]}},"/v1/stockpiles/maintenance-tunnels/analysis":{"get":{"operationId":"StockpilesController_analyzeMaintenanceTunnel_v1","parameters":[{"name":"mapId","required":true,"in":"query","schema":{"type":"string"}},{"name":"x","required":true,"in":"query","schema":{"type":"number"}},{"name":"y","required":true,"in":"query","schema":{"type":"number"}},{"name":"locationId","required":false,"in":"query","schema":{"type":"string"}},{"name":"days","required":false,"in":"query","schema":{"type":"number"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Analyze Maintenance Supplies consumption for one tunnel","tags":["Stockpiles"]}},"/v1/stockpiles/history/items/{itemName}":{"get":{"operationId":"StockpilesController_getItemHistory_v1","parameters":[{"name":"itemName","required":true,"in":"path","schema":{"example":"MaintenanceSupplies","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponseDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get history for one stockpile item","tags":["Stockpiles"]}},"/v1/stockpiles/history/maps/{mapId}":{"get":{"operationId":"StockpilesController_getMapHistory_v1","parameters":[{"name":"mapId","required":true,"in":"path","schema":{"example":"CallahansPassageHex","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponseDto"}}}}},"security":[{"oauth2":[]}],"summary":"Get stockpile history for one map","tags":["Stockpiles"]}},"/api/reserves":{"get":{"operationId":"ReservesController_list[0]","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"List reserves with an active membership","tags":["Reserve ownership"]}},"/reserves":{"get":{"operationId":"ReservesController_list[1]","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"List reserves with an active membership","tags":["Reserve ownership"]}},"/v1/api/reserves":{"get":{"operationId":"ReservesController_list[2]_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"List reserves with an active membership","tags":["Reserve ownership"]}},"/v1/reserves":{"get":{"operationId":"ReservesController_list[3]_v1","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"List reserves with an active membership","tags":["Reserve ownership"]}},"/api/reserves/{id}":{"get":{"operationId":"ReservesController_get[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Get a reserve and its active memberships","tags":["Reserve ownership"]}},"/reserves/{id}":{"get":{"operationId":"ReservesController_get[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Get a reserve and its active memberships","tags":["Reserve ownership"]}},"/v1/api/reserves/{id}":{"get":{"operationId":"ReservesController_get[2]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Get a reserve and its active memberships","tags":["Reserve ownership"]}},"/v1/reserves/{id}":{"get":{"operationId":"ReservesController_get[3]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Get a reserve and its active memberships","tags":["Reserve ownership"]}},"/api/reserves/{id}/audit":{"get":{"operationId":"ReservesController_audit[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Get reserve ownership audit events","tags":["Reserve ownership"]}},"/reserves/{id}/audit":{"get":{"operationId":"ReservesController_audit[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Get reserve ownership audit events","tags":["Reserve ownership"]}},"/v1/api/reserves/{id}/audit":{"get":{"operationId":"ReservesController_audit[2]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Get reserve ownership audit events","tags":["Reserve ownership"]}},"/v1/reserves/{id}/audit":{"get":{"operationId":"ReservesController_audit[3]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Get reserve ownership audit events","tags":["Reserve ownership"]}},"/api/reserves/{id}/members":{"post":{"operationId":"ReservesController_addMember[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddReserveMemberDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Add a member or manager by Foxhole name","tags":["Reserve ownership"]}},"/reserves/{id}/members":{"post":{"operationId":"ReservesController_addMember[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddReserveMemberDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Add a member or manager by Foxhole name","tags":["Reserve ownership"]}},"/v1/api/reserves/{id}/members":{"post":{"operationId":"ReservesController_addMember[2]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddReserveMemberDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Add a member or manager by Foxhole name","tags":["Reserve ownership"]}},"/v1/reserves/{id}/members":{"post":{"operationId":"ReservesController_addMember[3]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddReserveMemberDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Add a member or manager by Foxhole name","tags":["Reserve ownership"]}},"/api/reserves/{id}/members/{identityId}":{"delete":{"operationId":"ReservesController_removeMember[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"identityId","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Revoke an active reserve membership","tags":["Reserve ownership"]}},"/reserves/{id}/members/{identityId}":{"delete":{"operationId":"ReservesController_removeMember[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"identityId","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Revoke an active reserve membership","tags":["Reserve ownership"]}},"/v1/api/reserves/{id}/members/{identityId}":{"delete":{"operationId":"ReservesController_removeMember[2]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"identityId","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Revoke an active reserve membership","tags":["Reserve ownership"]}},"/v1/reserves/{id}/members/{identityId}":{"delete":{"operationId":"ReservesController_removeMember[3]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"identityId","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"oauth2":[]}],"summary":"Revoke an active reserve membership","tags":["Reserve ownership"]}},"/api/reserves/{id}/transfer":{"post":{"operationId":"ReservesController_transfer[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferReserveOwnershipDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Transfer Foxpile Ownership","tags":["Reserve ownership"]}},"/reserves/{id}/transfer":{"post":{"operationId":"ReservesController_transfer[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferReserveOwnershipDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Transfer Foxpile Ownership","tags":["Reserve ownership"]}},"/v1/api/reserves/{id}/transfer":{"post":{"operationId":"ReservesController_transfer[2]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferReserveOwnershipDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Transfer Foxpile Ownership","tags":["Reserve ownership"]}},"/v1/reserves/{id}/transfer":{"post":{"operationId":"ReservesController_transfer[3]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferReserveOwnershipDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Transfer Foxpile Ownership","tags":["Reserve ownership"]}},"/api/reserves/{id}/disputes":{"post":{"operationId":"ReservesController_dispute[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReserveDisputeDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Open a Foxpile Ownership dispute","tags":["Reserve ownership"]}},"/reserves/{id}/disputes":{"post":{"operationId":"ReservesController_dispute[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReserveDisputeDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Open a Foxpile Ownership dispute","tags":["Reserve ownership"]}},"/v1/api/reserves/{id}/disputes":{"post":{"operationId":"ReservesController_dispute[2]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReserveDisputeDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Open a Foxpile Ownership dispute","tags":["Reserve ownership"]}},"/v1/reserves/{id}/disputes":{"post":{"operationId":"ReservesController_dispute[3]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReserveDisputeDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Open a Foxpile Ownership dispute","tags":["Reserve ownership"]}},"/api/reserves/{id}/disputes/{disputeId}/resolve":{"post":{"operationId":"ReservesController_resolveDispute[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"disputeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveReserveDisputeDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Resolve or reject a reserve dispute","tags":["Reserve ownership"]}},"/reserves/{id}/disputes/{disputeId}/resolve":{"post":{"operationId":"ReservesController_resolveDispute[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"disputeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveReserveDisputeDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Resolve or reject a reserve dispute","tags":["Reserve ownership"]}},"/v1/api/reserves/{id}/disputes/{disputeId}/resolve":{"post":{"operationId":"ReservesController_resolveDispute[2]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"disputeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveReserveDisputeDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Resolve or reject a reserve dispute","tags":["Reserve ownership"]}},"/v1/reserves/{id}/disputes/{disputeId}/resolve":{"post":{"operationId":"ReservesController_resolveDispute[3]_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"disputeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveReserveDisputeDto"}}}},"responses":{"201":{"description":""}},"security":[{"oauth2":[]}],"summary":"Resolve or reject a reserve dispute","tags":["Reserve ownership"]}}},"info":{"title":"Foxpile API","description":"API for Foxhole stockpiles, references, history, OAuth identities and realtime events.\n\nVersioned routes are available under `/v1`. Existing unversioned routes remain supported for backwards compatibility.\n\nUse the OAuth authorization-code flow to obtain a Bearer token. Public stockpile routes require `stockpile.read`; reserve stockpiles require `regiment.read` and a matching stored access grant.\n\nThe SSE endpoint returns `text/event-stream` and stays open. Swagger can describe its filters, but a browser `EventSource`, curl, or an SSE client is better suited for testing it.","version":"1.0","contact":{"name":"Foxpile","url":"https://compagnon-api.foxwar.net","email":""}},"tags":[{"name":"OAuth","description":"Create clients, authorize users and manage access tokens."},{"name":"Maps","description":"Read faction-filtered maps and stockpile data."},{"name":"Stockpiles","description":"Versioned stockpile collections, summaries, statistics and history."},{"name":"History","description":"Query recorded stock quantity changes."},{"name":"References","description":"Discover Foxhole code names grouped by domain type."},{"name":"Users","description":"Resolve limited public profile information."},{"name":"Realtime","description":"Subscribe to Server-Sent Events."},{"name":"Operations","description":"Health, readiness and runtime metrics."},{"name":"Authentication","description":"Foxpile browser sessions and Discord linking."}],"servers":[{"url":"https://compagnon-api.foxwar.net","description":"Configured API server"}],"components":{"securitySchemes":{"oauth2":{"scheme":"bearer","bearerFormat":"OAuth access token","type":"http","description":"Access token returned by POST /oauth/token"}},"schemas":{"ReferencePositionDto":{"type":"object","properties":{"mapId":{"type":"string","example":"DeadLandsHex"},"x":{"type":"number","example":0.410076},"y":{"type":"number","example":0.4957782},"mapMarkerType":{"type":"object","nullable":true,"example":"Major"}},"required":["mapId","x","y","mapMarkerType"]},"ReferenceDto":{"type":"object","properties":{"id":{"type":"string","example":"MetalBeamMaterials"},"visibleName":{"type":"string","example":"Metal Beam"},"codeName":{"type":"string","example":"MetalBeamMaterials","deprecated":true},"aliases":{"example":["MetalBeamMaterial"],"description":"Names mapped to this stable in-game identifier.","type":"array","items":{"type":"string"}},"type":{"type":"string","enum":["item","vehicle","structure","map","city"]},"category":{"type":"object","nullable":true,"example":"EItemCategory::Supplies"},"gameVersion":{"type":"object","nullable":true,"example":"airborne"},"patchVersion":{"type":"object","nullable":true,"example":"63"},"iconUrl":{"type":"object","nullable":true,"example":"/v1/references/icons/RifleW.png"},"cratedIconUrl":{"type":"object","nullable":true,"example":"/v1/references/icons/RifleW-crated.png"},"sourceCategories":{"example":["itemCrates","items"],"type":"array","items":{"type":"string"}},"positions":{"description":"Known normalized positions. City coordinates are relative to the map identified by mapId.","type":"array","items":{"$ref":"#/components/schemas/ReferencePositionDto"}},"firstSeenAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"}},"required":["id","visibleName","codeName","aliases","type","category","gameVersion","patchVersion","iconUrl","cratedIconUrl","sourceCategories","positions","firstSeenAt","lastSeenAt"]},"StockpileEntryDto":{"type":"object","properties":{"name":{"type":"string","example":"MaintenanceSupplies"},"reference":{"$ref":"#/components/schemas/ReferenceDto"},"icon":{"type":"object","nullable":true},"quantity":{"type":"number"}},"required":["name","reference","icon","quantity"]},"StockpileContentsDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/StockpileEntryDto"}},"itemCrates":{"type":"array","items":{"$ref":"#/components/schemas/StockpileEntryDto"}},"vehicles":{"type":"array","items":{"$ref":"#/components/schemas/StockpileEntryDto"}},"vehicleCrates":{"type":"array","items":{"$ref":"#/components/schemas/StockpileEntryDto"}},"structures":{"type":"array","items":{"$ref":"#/components/schemas/StockpileEntryDto"}},"structureCrates":{"type":"array","items":{"$ref":"#/components/schemas/StockpileEntryDto"}}},"required":["items","itemCrates","vehicles","vehicleCrates","structures","structureCrates"]},"ReserveStockpileDto":{"type":"object","properties":{"name":{"type":"string"},"stockpile":{"$ref":"#/components/schemas/StockpileContentsDto"}},"required":["name","stockpile"]},"MapCoordsDto":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"]},"PublicStockpileControlDto":{"type":"object","properties":{"controllingFaction":{"type":"string","enum":["colonial","warden"],"nullable":true},"isAccessibleForSourceFaction":{"type":"object","nullable":true},"checkedAt":{"type":"object","nullable":true,"format":"date-time"}},"required":["controllingFaction","isAccessibleForSourceFaction","checkedAt"]},"PublicMapItemDetailsDto":{"type":"object","properties":{"flags":{"type":"number"},"detailValue":{"type":"number"},"altDetailValue":{"type":"number"},"stockpile":{"$ref":"#/components/schemas/StockpileContentsDto"},"reserveStockpiles":{"type":"array","items":{"$ref":"#/components/schemas/ReserveStockpileDto"}}},"required":["flags","detailValue","altDetailValue","stockpile","reserveStockpiles"]},"PublicMapStockpileDto":{"type":"object","properties":{"mapId":{"type":"string","example":"DeadLandsHex"},"normalizedMapCoords":{"$ref":"#/components/schemas/MapCoordsDto"},"codeName":{"type":"string","example":"TownBaseTier3"},"reference":{"$ref":"#/components/schemas/ReferenceDto"},"renderState":{"type":"string"},"control":{"$ref":"#/components/schemas/PublicStockpileControlDto"},"details":{"$ref":"#/components/schemas/PublicMapItemDetailsDto"},"updatedAt":{"type":"object","nullable":true,"format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"}},"required":["mapId","normalizedMapCoords","codeName","reference","renderState","control","details","updatedAt","lastSeenAt"]},"PublicMapCollectionDto":{"type":"object","properties":{"mapId":{"type":"string","example":"DeadLandsHex"},"stockpiles":{"type":"array","items":{"$ref":"#/components/schemas/PublicMapStockpileDto"}},"updatedAt":{"type":"string","format":"date-time"}},"required":["mapId","stockpiles","updatedAt"]},"MapSummaryDto":{"type":"object","properties":{"mapId":{"type":"string","example":"DeadLandsHex"},"faction":{"type":"string","enum":["colonial","warden"],"nullable":true},"updatedAt":{"type":"string","format":"date-time"},"stockpileCount":{"type":"number"},"reserveStockpileCount":{"type":"number"},"itemEntryCount":{"type":"number"},"totalQuantity":{"type":"number"},"zeroQuantityEntryCount":{"type":"number"},"ageSeconds":{"type":"object","nullable":true},"stale":{"type":"boolean"},"cityIds":{"type":"array","items":{"type":"string"}},"structureCodeNames":{"type":"array","items":{"type":"string"}}},"required":["mapId","faction","updatedAt","stockpileCount","reserveStockpileCount","itemEntryCount","totalQuantity","zeroQuantityEntryCount","ageSeconds","stale","cityIds","structureCodeNames"]},"MapListDto":{"type":"object","properties":{"maps":{"type":"array","items":{"$ref":"#/components/schemas/MapSummaryDto"}}},"required":["maps"]},"StatsDto":{"type":"object","properties":{"faction":{"type":"string","enum":["colonial","warden"],"nullable":true},"mapCount":{"type":"number"},"stockpileCount":{"type":"number"},"reserveStockpileCount":{"type":"number"},"itemEntryCount":{"type":"number"},"totalQuantity":{"type":"number"},"zeroQuantityEntryCount":{"type":"number"},"latestUpdatedAt":{"type":"object","nullable":true,"format":"date-time"},"maps":{"type":"array","items":{"$ref":"#/components/schemas/MapSummaryDto"}}},"required":["faction","mapCount","stockpileCount","reserveStockpileCount","itemEntryCount","totalQuantity","zeroQuantityEntryCount","latestUpdatedAt","maps"]},"HistoryEntryDto":{"type":"object","properties":{"id":{"type":"number"},"mapId":{"type":"string","example":"DeadLandsHex"},"cityId":{"type":"object","nullable":true,"example":"ThePits"},"stockpileCodeName":{"type":"string","example":"TownBaseTier3"},"stockpileReference":{"$ref":"#/components/schemas/ReferenceDto"},"stockpileType":{"type":"string","enum":["public","reserve"]},"stockpileName":{"type":"object","nullable":true},"faction":{"type":"string","enum":["colonial","warden"],"nullable":true},"itemName":{"type":"string","example":"MaintenanceSupplies"},"reference":{"$ref":"#/components/schemas/ReferenceDto"},"category":{"type":"string","example":"items"},"previousQuantity":{"type":"number","example":40},"currentQuantity":{"type":"number","example":20},"delta":{"type":"number","example":-20},"x":{"type":"number"},"y":{"type":"number"},"recordedAt":{"type":"string","format":"date-time"}},"required":["id","mapId","cityId","stockpileCodeName","stockpileReference","stockpileType","stockpileName","faction","itemName","reference","category","previousQuantity","currentQuantity","delta","x","y","recordedAt"]},"HistoryResponseDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEntryDto"}},"count":{"type":"number"},"limit":{"type":"number","maximum":500}},"required":["items","count","limit"]},"UserLookupDto":{"type":"object","properties":{"steamId":{"type":"string"},"discordId":{"type":"string"},"steamUsername":{"type":"object","nullable":true},"faction":{"type":"string","enum":["colonial","warden"],"nullable":true},"hasUsedApp":{"type":"boolean"}},"required":["steamUsername","faction","hasUsedApp"]},"OAuthTokenDto":{"type":"object","properties":{"access_token":{"type":"string"},"token_type":{"type":"string","example":"Bearer"},"expires_in":{"type":"number","example":2592000}},"required":["access_token","token_type","expires_in"]},"ReserveAccessDto":{"type":"object","properties":{"mapId":{"type":"string"},"cityId":{"type":"object","nullable":true},"stockpileName":{"type":"string"},"stockpileCodeName":{"type":"string"}},"required":["mapId","cityId","stockpileName","stockpileCodeName"]},"OAuthUserInfoDto":{"type":"object","properties":{"steamId":{"type":"string"},"steamUsername":{"type":"object","nullable":true},"faction":{"type":"string","enum":["colonial","warden"],"nullable":true},"reserveStockpileAccess":{"type":"array","items":{"$ref":"#/components/schemas/ReserveAccessDto"}},"hasUsedApp":{"type":"boolean"}},"required":["steamId","steamUsername","faction","reserveStockpileAccess","hasUsedApp"]},"TokenValidationDto":{"type":"object","properties":{"valid":{"type":"boolean"}},"required":["valid"]},"RevokeTokenDto":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]},"ReferenceCollectionDto":{"type":"object","properties":{"type":{"type":"string","enum":["item","vehicle","structure","map","city"]},"references":{"type":"array","items":{"$ref":"#/components/schemas/ReferenceDto"}},"count":{"type":"number","example":108}},"required":["type","references","count"]},"AddReserveMemberDto":{"type":"object","properties":{"foxholeName":{"type":"string","example":"Vulkan"},"role":{"type":"string","enum":["MEMBER","MANAGER"],"default":"MEMBER"}},"required":["foxholeName","role"]},"TransferReserveOwnershipDto":{"type":"object","properties":{"identityId":{"type":"string","example":"76561198000000000"}},"required":["identityId"]},"CreateReserveDisputeDto":{"type":"object","properties":{"reason":{"type":"string","example":"Je suis le responsable actuel du regiment."}},"required":["reason"]},"ResolveReserveDisputeDto":{"type":"object","properties":{"status":{"type":"string","enum":["RESOLVED","REJECTED"]}},"required":["status"]}}}}