Skip to content

Server routes

Routes for portal backends, authenticated by a site key (ADR 0015). Generated from openapi.yaml of games-api 0.7.0: 8 routes.

GET /v1/server/catalog

GET /v1/server/catalog

Terminal window
curl 'https://api.filudi.com/v1/server/catalog' \
-H "authorization: Bearer $FILUDI_SITE_KEY"

The site’s catalog

Scope catalog. Same shape as GET /v1/catalog/{site} for the key’s site, with Cache-Control: private, max-age=60.

Credential: a server key (fsk_…), sent as Authorization: Bearer <key> from your backend, never from a browser. Scope catalog.

NameInTypeRequiredDescription
localequerystringnoReturns texts for one locale only; default returns every locale of the site
StatusBodyDescription
200CatalogCatalog.
401ErrorNo bearer, or a key the API does not know.
403ErrorThe key lacks the scope of this route, is revoked, or its site is not approved; message says which.
429ErrorToo many requests. Headers: Retry-After.

POST /v1/server/players

POST /v1/server/players

Terminal window
curl -X POST 'https://api.filudi.com/v1/server/players' \
-H "authorization: Bearer $FILUDI_SITE_KEY" \
-H 'content-type: application/json' \
-d '{
"externalId": "string",
"nickname": "string",
"locale": "en"
}'

Create or find a player by your own user id

Scope players. externalId is unique per site: an existing player answers 200, a new one 201. A player created here is a guest with no token until POST /v1/server/players/{playerId}/tokens. nickname and locale are applied on creation only; change them later with the player token on PATCH /v1/sdk/players/me.

Credential: a server key (fsk_…), sent as Authorization: Bearer <key> from your backend, never from a browser. Scope players.

application/json, required. The body is a ServerPlayerInput.

PropertyTypeRequiredDescription
externalIdstringyesYour own user id; 1 to 128 characters
nicknamestringno3 to 20 characters; pattern ^[\p{L}\p{N} _.-]+$
localestringnoDefaults to the site’s first locale
StatusBodyDescription
200ServerPlayerExisting player.
201ServerPlayerCreated.
400ErrorValidation failed.
401ErrorNo bearer, or a key the API does not know.
403ErrorThe key lacks the scope of this route, is revoked, or its site is not approved; message says which.
429ErrorToo many requests. Headers: Retry-After.

GET /v1/server/players/{playerId}

GET /v1/server/players/{playerId}

Terminal window
curl 'https://api.filudi.com/v1/server/players/00000000-0000-0000-0000-000000000000' \
-H "authorization: Bearer $FILUDI_SITE_KEY"

Profile, saves metadata and best scores of one of the site’s players

Scope players. 404 for a player of another site.

Credential: a server key (fsk_…), sent as Authorization: Bearer <key> from your backend, never from a browser. Scope players.

NameInTypeRequiredDescription
playerIdpathstring (uuid)yes
StatusBodyDescription
200PlayerAdminPlayer.
401ErrorNo bearer, or a key the API does not know.
403ErrorThe key lacks the scope of this route, is revoked, or its site is not approved; message says which.
404ErrorUnknown resource.
429ErrorToo many requests. Headers: Retry-After.

POST /v1/server/players/{playerId}/tokens

POST /v1/server/players/{playerId}/tokens

Terminal window
curl -X POST 'https://api.filudi.com/v1/server/players/00000000-0000-0000-0000-000000000000/tokens' \
-H "authorization: Bearer $FILUDI_SITE_KEY"

A player token for that player’s browser

Scope tokens. An fp1 token, as POST /v1/sdk/players answers, so your page runs GameFrame or the SDK as filudi.com does. Hand it to the browser over your own authenticated channel.

Credential: a server key (fsk_…), sent as Authorization: Bearer <key> from your backend, never from a browser. Scope tokens.

NameInTypeRequiredDescription
playerIdpathstring (uuid)yes
StatusBodyDescription
201objectToken.
401ErrorNo bearer, or a key the API does not know.
403ErrorThe key lacks the scope of this route, is revoked, or its site is not approved; message says which.
404ErrorUnknown resource.
429ErrorToo many requests. Headers: Retry-After.

Body of 201

PropertyTypeRequiredDescription
tokenstringyes

POST /v1/server/game-tokens

POST /v1/server/game-tokens

Terminal window
curl -X POST 'https://api.filudi.com/v1/server/game-tokens' \
-H "authorization: Bearer $FILUDI_SITE_KEY" \
-H 'content-type: application/json' \
-d '{
"playerId": "00000000-0000-0000-0000-000000000000",
"game": "gloop"
}'

A game token for a player and a game

Scope tokens. The same token as POST /v1/sdk/game-tokens answers (ADR 0013), without the player’s own token.

Credential: a server key (fsk_…), sent as Authorization: Bearer <key> from your backend, never from a browser. Scope tokens.

application/json, required.

PropertyTypeRequiredDescription
playerIdstring (uuid)yes
gamestringyesGame slug
StatusBodyDescription
201GameTokenGame token.
401ErrorNo bearer, or a key the API does not know.
403ErrorThe key lacks the scope of this route, is revoked, or its site is not approved; message says which.
404noneUnknown player on this site, or the game is not on the site catalog.
429ErrorToo many requests. Headers: Retry-After.

GET /v1/server/leaderboards/{gameId}/{board}

GET /v1/server/leaderboards/{gameId}/{board}

Terminal window
curl 'https://api.filudi.com/v1/server/leaderboards/gloop/height' \
-H "authorization: Bearer $FILUDI_SITE_KEY"

Top entries with nicknames

Scope leaderboards. Same answer as GET /v1/sdk/leaderboards/{gameId}/{board}; isMe is always false.

Credential: a server key (fsk_…), sent as Authorization: Bearer <key> from your backend, never from a browser. Scope leaderboards.

NameInTypeRequiredDescription
gameIdpathstringyesGame slug
boardpathstringyespattern ^[a-z][a-z0-9_]{0,31}$
periodqueryone of "day", "week", "all"nodefault "all"
limitqueryintegerno1 to 50; default 10
StatusBodyDescription
200LeaderboardTopTop entries.
401ErrorNo bearer, or a key the API does not know.
403ErrorThe key lacks the scope of this route, is revoked, or its site is not approved; message says which.
404ErrorUnknown resource.
429ErrorToo many requests. Headers: Retry-After.

GET /v1/server/stats/overview

GET /v1/server/stats/overview

Terminal window
curl 'https://api.filudi.com/v1/server/stats/overview?from=2026-10-30&to=2026-10-30' \
-H "authorization: Bearer $FILUDI_SITE_KEY"

The site’s numbers for a range of UTC days

Scope stats. Same answer and range rules as GET /v1/admin/sites/{siteId}/stats/overview.

Credential: a server key (fsk_…), sent as Authorization: Bearer <key> from your backend, never from a browser. Scope stats.

NameInTypeRequiredDescription
fromquerystring (date)yesFirst UTC day, included
toquerystring (date)yesLast UTC day, included
StatusBodyDescription
200StatsOverviewOverview.
400noneRange over 400 days, or to before from.
401ErrorNo bearer, or a key the API does not know.
403ErrorThe key lacks the scope of this route, is revoked, or its site is not approved; message says which.
429ErrorToo many requests. Headers: Retry-After.

GET /v1/server/stats/games/{gameId}

GET /v1/server/stats/games/{gameId}

Terminal window
curl 'https://api.filudi.com/v1/server/stats/games/00000000-0000-0000-0000-000000000000?from=2026-10-30&to=2026-10-30' \
-H "authorization: Bearer $FILUDI_SITE_KEY"

One game’s numbers on the site for a range of UTC days

Scope stats. Same answer as GET /v1/admin/sites/{siteId}/stats/games/{gameId}. 404 when the game is not on the site catalog.

Credential: a server key (fsk_…), sent as Authorization: Bearer <key> from your backend, never from a browser. Scope stats.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
fromquerystring (date)yesFirst UTC day, included
toquerystring (date)yesLast UTC day, included
StatusBodyDescription
200GameStatsGame stats.
400noneRange over 400 days, or to before from.
401ErrorNo bearer, or a key the API does not know.
403ErrorThe key lacks the scope of this route, is revoked, or its site is not approved; message says which.
404ErrorUnknown resource.
429ErrorToo many requests. Headers: Retry-After.