Platform

HTTP API

Two surfaces that never share authentication: /v1/game for dedicated servers, /v1/admin for the dashboard.
Authentication

A dedicated server holds an API key and exchanges a provider ticket for a short-lived player token. The token is opaque and checked against the platform on every request, so a ban applies immediately rather than whenever the token happens to expire.

sign a player in, then act as them
curl -X POST https://api.raidstate.com/v1/game/sessions \
  -H "Authorization: Bearer $EXTRACTOR_API_KEY" \
  -d '{"provider":"steam","ticket":"…","scopes":["player:read"]}'

# -> {"player":{...},"tokens":{"access_token":"…"}}
Game endpoints
MethodPathWhat it does
POST
/v1/game/sessionsExchange a provider ticket for a player token
GET
/v1/game/players/me/summaryPlayer, containers and contents in one call
POST
/v1/game/containers/ensureFind or create a container, with its contents
GET
/v1/game/containers/{id}One container
POST
/v1/game/inventory/grantPut an item in
POST
/v1/game/inventory/moveRelocate an instance, possibly across containers
POST
/v1/game/inventory/consumeRemove some or all of a stack
POST
/v1/game/inventory/splitDivide a stack
POST
/v1/game/inventory/mergeCombine two stacks
POST
/v1/game/inventory/transactionA batch of intents, all-or-nothing
POST
/v1/game/currency/transferMove currency between players
GET
/v1/game/catalog/itemsWhat items exist in this environment
Idempotency

Every mutation accepts an Idempotency-Key header. Replaying a request with the same key returns the original outcome instead of performing it again, which is what makes a retry safe over a connection that drops mid-raid.

Errors

Failures are RFC 9457 problem documents. The type is a stable URI, so a client can branch on the kind of failure without matching on message text.

{
  "type": "https://errors.raidstate.com/slot_occupied",
  "title": "Position occupied",
  "detail": "those cells are already occupied",
  "status": 409,
  "instance": "a86c39d2-…"
}

The instance is the request id, and it appears in the platform's own logs — quote it and support can find the exact request.

The full specification

api/openapi.yaml in the repository covers all 59 operations, and a test walks the routing table in both directions: an endpoint cannot be added without appearing in the spec, and the spec cannot describe one that does not exist.