Skip to content

Admin routes

Generated from openapi.yaml of games-api 0.7.0: 93 routes.

GET /v1/admin/me

GET /v1/admin/me

Terminal window
curl 'https://api.filudi.com/v1/admin/me' \
-b "filudi_console=$FILUDI_SESSION"

Who am I and what can I edit

The one /v1/admin/* route that answers for staff without TOTP. roles.admin is true for staff with TOTP enabled.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

StatusBodyDescription
200ConsoleMeIdentity.
401ErrorMissing or invalid token.

GET /v1/admin/accounts

GET /v1/admin/accounts

Terminal window
curl 'https://api.filudi.com/v1/admin/accounts' \
-b "filudi_console=$FILUDI_SESSION"

Staff only. Accounts, newest first

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
qquerystringnoCase-insensitive substring of the name, or an email matched by its hash; 2 to 100 characters
cursorquerystringnoOpaque; the nextCursor of the previous page, with the same filters and sort; at most 200 characters
limitqueryintegerno1 to 500; default 100
StatusBodyDescription
200AccountPageAccounts.
403ErrorNot allowed for this role or site.

GET /v1/admin/accounts/{accountId}

GET /v1/admin/accounts/{accountId}

Terminal window
curl 'https://api.filudi.com/v1/admin/accounts/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION"

Staff only. One account with its memberships

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
accountIdpathstring (uuid)yes
StatusBodyDescription
200AccountAdminAccount.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

PATCH /v1/admin/accounts/{accountId}

PATCH /v1/admin/accounts/{accountId}

Terminal window
curl -X PATCH 'https://api.filudi.com/v1/admin/accounts/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"name": "string",
"email": "you@example.com",
"staff": true,
"canCreateGames": true,
"canCreatePortals": true,
"disabled": true
}'

Staff only. Change name, email, flags, or disable the account

Disabling an account revokes its sessions. Every change writes an audit row.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
accountIdpathstring (uuid)yes

application/json, required. The body is a AccountPatch. At least one field; an empty body is a 400.

PropertyTypeRequiredDescription
nameAccountNamenoDisplay name, shown to other members and in the audit log; 1 to 80 characters
emailstring (email)noChanged at once
staffbooleannoA new staff member gets admin rights once TOTP is enabled
canCreateGamesbooleanno
canCreatePortalsbooleanno
disabledbooleannoTrue revokes every session and refuses sign-in; false enables again
StatusBodyDescription
200AccountAdminAccount.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneThe email is on another account.

POST /v1/admin/accounts/{accountId}/reset-link

POST /v1/admin/accounts/{accountId}/reset-link

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/accounts/00000000-0000-0000-0000-000000000000/reset-link' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Staff only. Email the account a password reset link

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
accountIdpathstring (uuid)yes
StatusBodyDescription
202noneSent.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

DELETE /v1/admin/accounts/{accountId}/totp

DELETE /v1/admin/accounts/{accountId}/totp

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/accounts/00000000-0000-0000-0000-000000000000/totp' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Staff only. Remove the account’s TOTP

For a lost authenticator. A staff account loses its admin rights until it enrols again.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
accountIdpathstring (uuid)yes
StatusBodyDescription
204noneRemoved, or there was none.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

DELETE /v1/admin/accounts/{accountId}/sessions

DELETE /v1/admin/accounts/{accountId}/sessions

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/accounts/00000000-0000-0000-0000-000000000000/sessions' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Staff only. Revoke every session of the account

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
accountIdpathstring (uuid)yes
StatusBodyDescription
204noneRevoked.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

POST /v1/admin/accounts/{accountId}/impersonate

POST /v1/admin/accounts/{accountId}/impersonate

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/accounts/00000000-0000-0000-0000-000000000000/impersonate' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Staff only. Open a one-hour session on a developer’s account

Sets the filudi_impersonation cookie; the console sends X-Filudi-Impersonation: 1 to use it, the admin tab keeps acting as the staff member. Every audit row written during it carries the developer as actor and the staff member as impersonator. Refused on a staff account and on oneself.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
accountIdpathstring (uuid)yes
StatusBodyDescription
200ImpersonationStartedWhere to open the console. Headers: Set-Cookie (filudi_impersonation).
403noneNot staff, a staff account, or your own account.
404ErrorUnknown resource.

GET /v1/admin/invitations

GET /v1/admin/invitations

Terminal window
curl 'https://api.filudi.com/v1/admin/invitations' \
-b "filudi_console=$FILUDI_SESSION"

Staff only. Invitations, newest first

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
statusqueryone of "pending", "accepted", "revoked", "expired"nodefault "pending"
StatusBodyDescription
200Invitation[]Invitations.
403ErrorNot allowed for this role or site.

POST /v1/admin/invitations

POST /v1/admin/invitations

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/invitations' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"email": "you@example.com",
"staff": false,
"canCreateGames": false,
"canCreatePortals": false,
"grants": [
{
"game": "00000000-0000-0000-0000-000000000000",
"site": "00000000-0000-0000-0000-000000000000",
"role": "owner"
}
]
}'

Staff only. Invite an email address

The notify service sends the link, valid 7 days. A pending invitation for the same email is revoked first. An open invitation request for the email moves to invited.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

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

PropertyTypeRequiredDescription
emailstring (email)yesat most 254 characters
staffbooleannodefault false
canCreateGamesbooleannodefault false
canCreatePortalsbooleannodefault false
grantsobject[]noMemberships created on accept. Each item names exactly one of game and site.; at most 50 items
grants[].gamestring (uuid)no
grants[].sitestring (uuid)no
grants[].roleMembershipRoleyesA member has every right of the owner except membership changes
StatusBodyDescription
201InvitationInvitation.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
409noneAn account with that email exists.

DELETE /v1/admin/invitations/{invitationId}

DELETE /v1/admin/invitations/{invitationId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/invitations/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Staff only. Revoke an invitation; its link stops working

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
invitationIdpathstring (uuid)yes
StatusBodyDescription
204noneRevoked.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneAlready accepted.

POST /v1/admin/invitations/{invitationId}/resend

POST /v1/admin/invitations/{invitationId}/resend

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/invitations/00000000-0000-0000-0000-000000000000/resend' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Staff only. Send the invitation email again with a fresh 7-day token

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
invitationIdpathstring (uuid)yes
StatusBodyDescription
202noneSent.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneAccepted or revoked.

GET /v1/admin/invitation-requests

GET /v1/admin/invitation-requests

Terminal window
curl 'https://api.filudi.com/v1/admin/invitation-requests' \
-b "filudi_console=$FILUDI_SESSION"

Staff only. Requests from the form on developers.filudi.com, newest first

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
statusqueryone of "new", "invited", "dismissed"noDefault new
cursorquerystringnoOpaque; the nextCursor of the previous page, with the same filters and sort; at most 200 characters
limitqueryintegerno1 to 500; default 100
StatusBodyDescription
200InvitationRequestPageRequests.
403ErrorNot allowed for this role or site.

PATCH /v1/admin/invitation-requests/{requestId}

PATCH /v1/admin/invitation-requests/{requestId}

Terminal window
curl -X PATCH 'https://api.filudi.com/v1/admin/invitation-requests/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"status": "dismissed"
}'

Staff only. Dismiss a request

The invited status is set by the API when an invitation is created for the email.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
requestIdpathstring (uuid)yes

application/json, required.

PropertyTypeRequiredDescription
statusone of "dismissed"yes
StatusBodyDescription
200InvitationRequestRequest.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

GET /v1/admin/approvals

GET /v1/admin/approvals

Terminal window
curl 'https://api.filudi.com/v1/admin/approvals' \
-b "filudi_console=$FILUDI_SESSION"

Staff only. Everything that waits for approval, oldest first

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

StatusBodyDescription
200ApprovalsPending games, sites, domains and versions.
403ErrorNot allowed for this role or site.

GET /v1/admin/sites

GET /v1/admin/sites

Terminal window
curl 'https://api.filudi.com/v1/admin/sites' \
-b "filudi_console=$FILUDI_SESSION"

Sites the account can see; an account with no site membership gets an empty list

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

StatusBodyDescription
200Site[]Sites.

POST /v1/admin/sites

POST /v1/admin/sites

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/sites' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"slug": "gloop",
"name": "string",
"domains": [
"string"
],
"pendingDomains": [
"string"
],
"firstParty": true,
"locales": [
"string"
],
"accountsAllowed": true,
"personalizedAdsAllowed": true,
"ageBand": "all",
"cdnPullZoneId": "string",
"navCategories": [
"string"
],
"otherSites": [
{
"name": "string",
"url": "https://example.com/",
"description": "string"
}
],
"causalitDomain": "string",
"causalitReadKey": "string",
"causalitWriteKey": "string"
}'

Create a site

Staff, or an account with canCreatePortals; anyone else gets 403. A staff creation is approved at once. A developer’s site is created with approvedAt null and the creator as owner; staff approves it from the Approvals screen. A developer writes pendingDomains, never domains. One account holds at most 3 pending sites (409). A reserved slug answers 400: admin, api, play, developers, filudi, www, static. This route and PATCH answer 400 with issue code game_host when a domain is on or under the play domain, the PLAY_URL host or the preview host (ADR 0013).

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

application/json, required.

PropertyTypeRequiredDescription
slugstringyespattern ^[a-z][a-z0-9-]{1,39}$
namestringyes1 to 80 characters
domainsstring[]noLowercase hostnames, the first is canonical. Staff only.; at least 1 item
pendingDomainsstring[]noLowercase hostnames the owner proposes; each works once staff approves it. Replaces the whole list.; at most 10 items
firstPartybooleannoStaff only
localesstring[]yesLowercase BCP 47, unique, the first is the default; at least 1 item
accountsAllowedbooleanno
personalizedAdsAllowedbooleanno
ageBandAgeBandno
cdnPullZoneIdstring or nullnopattern ^[0-9]{1,12}$
navCategoriesstring[]noSlugs of existing categories of the site, unique, in menu order; at most 12 items
otherSitesOtherSite[]noat most 10 items
causalitDomainstring or nullnopattern ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$
causalitReadKeystring or nullno8 to 200 characters; write only
causalitWriteKeystring or nullno8 to 200 characters; write only
StatusBodyDescription
201SiteCreated.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
409noneSlug taken, or the account already holds 3 pending sites.

GET /v1/admin/sites/{siteId}

GET /v1/admin/sites/{siteId}

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION"

One site

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
StatusBodyDescription
200SiteSite.

PATCH /v1/admin/sites/{siteId}

PATCH /v1/admin/sites/{siteId}

Terminal window
curl -X PATCH 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"slug": "gloop",
"name": "string",
"domains": [
"string"
],
"pendingDomains": [
"string"
],
"firstParty": true,
"locales": [
"string"
],
"accountsAllowed": true,
"personalizedAdsAllowed": true,
"ageBand": "all",
"cdnPullZoneId": "string",
"navCategories": [
"string"
],
"otherSites": [
{
"name": "string",
"url": "https://example.com/",
"description": "string"
}
],
"causalitDomain": "string",
"causalitReadKey": "string",
"causalitWriteKey": "string"
}'

Update policy, domains, locales, name

Owners and members of the site write pendingDomains; a domain works once staff approves it. domains and firstParty are for staff (ADR 0015).

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes

application/json, required. The body is a SiteInput. On PATCH the slug may be repeated unchanged; the API refuses a different slug. slug, domains, firstParty and cdnPullZoneId are for staff only; owners and members write pendingDomains and the CausalIT fields (ADR 0015). A key field set to null clears the stored key; absent leaves it.

PropertyTypeRequiredDescription
slugstringnopattern ^[a-z][a-z0-9-]{1,39}$
namestringno1 to 80 characters
domainsstring[]noLowercase hostnames, the first is canonical. Staff only.; at least 1 item
pendingDomainsstring[]noLowercase hostnames the owner proposes; each works once staff approves it. Replaces the whole list.; at most 10 items
firstPartybooleannoStaff only
localesstring[]noLowercase BCP 47, unique, the first is the default; at least 1 item
accountsAllowedbooleanno
personalizedAdsAllowedbooleanno
ageBandAgeBandno
cdnPullZoneIdstring or nullnopattern ^[0-9]{1,12}$
navCategoriesstring[]noSlugs of existing categories of the site, unique, in menu order; at most 12 items
otherSitesOtherSite[]noat most 10 items
causalitDomainstring or nullnopattern ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$
causalitReadKeystring or nullno8 to 200 characters; write only
causalitWriteKeystring or nullno8 to 200 characters; write only
StatusBodyDescription
200SiteUpdated.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.

POST /v1/admin/sites/{siteId}/approve

POST /v1/admin/sites/{siteId}/approve

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/approve' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Staff only. Approve a pending site

Sets approvedAt. Its approved domains become allowed origins within 60 s; the owners get an email.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
StatusBodyDescription
200SiteSite.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneAlready approved.

POST /v1/admin/sites/{siteId}/reject

POST /v1/admin/sites/{siteId}/reject

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/reject' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"reason": "string"
}'

Staff only. Send the owners a reason; the site stays pending

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes

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

PropertyTypeRequiredDescription
reasonstringyesSent to the owners by email; 1 to 1000 characters
StatusBodyDescription
204noneReason sent.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneThe site is approved.

POST /v1/admin/sites/{siteId}/domains/approve

POST /v1/admin/sites/{siteId}/domains/approve

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/domains/approve' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"domains": [
"string"
]
}'

Staff only. Move proposed domains into the site’s domains

Each listed domain must be in pendingDomains, else 400. The game_host rule of site creation applies.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes

application/json, required.

PropertyTypeRequiredDescription
domainsstring[]yesat least 1 item
StatusBodyDescription
200SiteSite.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

POST /v1/admin/sites/{siteId}/domains/reject

POST /v1/admin/sites/{siteId}/domains/reject

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/domains/reject' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"domains": [
"string"
],
"reason": "string"
}'

Staff only. Remove proposed domains and send the owners the reason

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes

application/json, required.

PropertyTypeRequiredDescription
domainsstring[]yesat least 1 item
reasonstringyes1 to 1000 characters
StatusBodyDescription
200SiteSite.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

GET /v1/admin/sites/{siteId}/members

GET /v1/admin/sites/{siteId}/members

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/members' \
-b "filudi_console=$FILUDI_SESSION"

Members of a site

Owner of the site or staff. Invited emails without an account yet are listed with invited true.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
StatusBodyDescription
200Member[]Members.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

POST /v1/admin/sites/{siteId}/members

POST /v1/admin/sites/{siteId}/members

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/members' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"email": "you@example.com",
"role": "owner"
}'

Add a member by email

Owner of the site or staff. An existing account gets the membership at once. An unknown email gets an invitation that carries it; the membership exists once the invitation is accepted.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes

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

PropertyTypeRequiredDescription
emailstring (email)yesat most 254 characters
roleMembershipRoleyesA member has every right of the owner except membership changes
StatusBodyDescription
201MemberMember.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneAlready a member.

DELETE /v1/admin/sites/{siteId}/members/{accountId}

DELETE /v1/admin/sites/{siteId}/members/{accountId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/members/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Remove a member

Owner of the site or staff. The last owner cannot be removed.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
accountIdpathstring (uuid)yes
StatusBodyDescription
204noneRemoved.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneconflict: “A site keeps at least one owner.”.

DELETE /v1/admin/sites/{siteId}/members/invitations/{invitationId}

DELETE /v1/admin/sites/{siteId}/members/invitations/{invitationId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/members/invitations/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Withdraw an invitation

Owner of the site or staff. Removes this site from the invitation’s grants; an invitation left with no grant is revoked.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
invitationIdpathstring (uuid)yes
StatusBodyDescription
204noneWithdrawn.
403ErrorNot allowed for this role or site.
404noneNo pending invitation to this site has this id.

GET /v1/admin/sites/{siteId}/keys

GET /v1/admin/sites/{siteId}/keys

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/keys' \
-b "filudi_console=$FILUDI_SESSION"

Server keys of a site, revoked ones included

Owner or member of the site, or staff. Approved sites only (409). The key itself is never returned again.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
StatusBodyDescription
200SiteKey[]Keys.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneThe site is not approved.

POST /v1/admin/sites/{siteId}/keys

POST /v1/admin/sites/{siteId}/keys

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/keys' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"name": "string",
"scopes": [
"catalog"
]
}'

Create a server key; the answer shows it once

Owner or member of the site, or staff. Approved sites only. 20 keys per site at most, revoked ones included.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes

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

PropertyTypeRequiredDescription
namestringyes1 to 60 characters
scopesSiteKeyScope[]yesat least 1 item; unique items
StatusBodyDescription
201SiteKeyCreatedThe key, shown once.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneThe site is not approved, or already has 20 keys.

DELETE /v1/admin/sites/{siteId}/keys/{keyId}

DELETE /v1/admin/sites/{siteId}/keys/{keyId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/keys/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Revoke a server key

The row stays with revokedAt; /v1/server/* answers 403 to the key from now on.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
keyIdpathstring (uuid)yes
StatusBodyDescription
204noneRevoked, or already revoked.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

GET /v1/admin/sites/{siteId}/categories

GET /v1/admin/sites/{siteId}/categories

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/categories' \
-b "filudi_console=$FILUDI_SESSION"

Categories of a site, in site order, with the number of games in each

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
StatusBodyDescription
200Category[]Categories.

POST /v1/admin/sites/{siteId}/categories

POST /v1/admin/sites/{siteId}/categories

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/categories' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"slug": "gloop",
"icon": "puzzle",
"texts": {
"en": {
"title": "string",
"navTitle": "string",
"description": "string"
}
}
}'

Add a category at the end of the site order

The default locale needs a title. A category slug never changes once created (ADR 0008). Slugs the fronts use as routes are refused: categories, game, games, search, account, privacy, terms, cookies, stats, cmp, api, assets, and every locale of the site.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes

application/json, required.

PropertyTypeRequiredDescription
slugstringyesOn create only; ignored on PATCH; pattern ^[a-z][a-z0-9-]{0,39}$
iconCategoryIcon or nullno
textsobjectyesKeyed by locale; the site’s default locale needs a title
texts.*.titlestringnoat most 120 characters
texts.*.navTitlestringnoat most 24 characters
texts.*.descriptionstringnoat most 1000 characters
StatusBodyDescription
201CategoryCreated.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
409noneSlug taken on this site.

PUT /v1/admin/sites/{siteId}/categories/order

PUT /v1/admin/sites/{siteId}/categories/order

Terminal window
curl -X PUT 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/categories/order' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"slugs": [
"string"
]
}'

Reorder the categories

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes

application/json, required.

PropertyTypeRequiredDescription
slugsstring[]yesEvery category of the site exactly once
StatusBodyDescription
204noneReordered.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.

GET /v1/admin/sites/{siteId}/categories/{slug}

GET /v1/admin/sites/{siteId}/categories/{slug}

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/categories/gloop' \
-b "filudi_console=$FILUDI_SESSION"

One category

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
slugpathstringyespattern ^[a-z][a-z0-9-]{0,39}$
StatusBodyDescription
200CategoryCategory.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

PATCH /v1/admin/sites/{siteId}/categories/{slug}

PATCH /v1/admin/sites/{siteId}/categories/{slug}

Terminal window
curl -X PATCH 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/categories/gloop' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"slug": "gloop",
"icon": "puzzle",
"texts": {
"en": {
"title": "string",
"navTitle": "string",
"description": "string"
}
}
}'

Update texts and icon

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
slugpathstringyespattern ^[a-z][a-z0-9-]{0,39}$

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

PropertyTypeRequiredDescription
slugstringnoOn create only; ignored on PATCH; pattern ^[a-z][a-z0-9-]{0,39}$
iconCategoryIcon or nullno
textsobjectnoKeyed by locale; the site’s default locale needs a title
texts.*.titlestringnoat most 120 characters
texts.*.navTitlestringnoat most 24 characters
texts.*.descriptionstringnoat most 1000 characters
StatusBodyDescription
200CategoryUpdated.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

DELETE /v1/admin/sites/{siteId}/categories/{slug}

DELETE /v1/admin/sites/{siteId}/categories/{slug}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/categories/gloop' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Remove the category from the site, from its games and from the top menu

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
slugpathstringyespattern ^[a-z][a-z0-9-]{0,39}$
StatusBodyDescription
204noneRemoved.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

GET /v1/admin/sites/{siteId}/tags

GET /v1/admin/sites/{siteId}/tags

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/tags' \
-b "filudi_console=$FILUDI_SESSION"

Tags of a site, in site order, with the number of games carrying each

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
StatusBodyDescription
200Tag[]Tags.

POST /v1/admin/sites/{siteId}/tags

POST /v1/admin/sites/{siteId}/tags

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/tags' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"slug": "gloop",
"texts": {
"en": {
"title": "string"
}
}
}'

Add a tag at the end of the site order

The default locale needs a title. A tag slug never changes once created (ADR 0008).

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes

application/json, required.

PropertyTypeRequiredDescription
slugstringyesOn create only; ignored on PATCH; pattern ^[a-z][a-z0-9-]{0,39}$
textsobjectyesKeyed by locale; the site’s default locale needs a title
texts.*.titlestringnoat most 60 characters
StatusBodyDescription
201TagCreated.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
409noneSlug taken on this site.

PUT /v1/admin/sites/{siteId}/tags/order

PUT /v1/admin/sites/{siteId}/tags/order

Terminal window
curl -X PUT 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/tags/order' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"slugs": [
"string"
]
}'

Reorder the tags

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes

application/json, required.

PropertyTypeRequiredDescription
slugsstring[]yesEvery tag of the site exactly once
StatusBodyDescription
204noneReordered.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.

GET /v1/admin/sites/{siteId}/tags/{slug}

GET /v1/admin/sites/{siteId}/tags/{slug}

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/tags/gloop' \
-b "filudi_console=$FILUDI_SESSION"

One tag

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
slugpathstringyespattern ^[a-z][a-z0-9-]{0,39}$
StatusBodyDescription
200TagTag.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

PATCH /v1/admin/sites/{siteId}/tags/{slug}

PATCH /v1/admin/sites/{siteId}/tags/{slug}

Terminal window
curl -X PATCH 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/tags/gloop' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"slug": "gloop",
"texts": {
"en": {
"title": "string"
}
}
}'

Update the titles

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
slugpathstringyespattern ^[a-z][a-z0-9-]{0,39}$

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

PropertyTypeRequiredDescription
slugstringnoOn create only; ignored on PATCH; pattern ^[a-z][a-z0-9-]{0,39}$
textsobjectnoKeyed by locale; the site’s default locale needs a title
texts.*.titlestringnoat most 60 characters
StatusBodyDescription
200TagUpdated.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

DELETE /v1/admin/sites/{siteId}/tags/{slug}

DELETE /v1/admin/sites/{siteId}/tags/{slug}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/tags/gloop' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Remove the tag from the site and from its games

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
slugpathstringyespattern ^[a-z][a-z0-9-]{0,39}$
StatusBodyDescription
204noneRemoved.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

GET /v1/admin/sites/{siteId}/catalog

GET /v1/admin/sites/{siteId}/catalog

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/catalog' \
-b "filudi_console=$FILUDI_SESSION"

Site catalog entries with every locale

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
StatusBodyDescription
200SiteGame[]Entries in order.

PUT /v1/admin/sites/{siteId}/catalog/order

PUT /v1/admin/sites/{siteId}/catalog/order

Terminal window
curl -X PUT 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/catalog/order' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"gameIds": [
"00000000-0000-0000-0000-000000000000"
]
}'

Reorder the catalog

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes

application/json, required.

PropertyTypeRequiredDescription
gameIdsarray of string (uuid)yes
StatusBodyDescription
204noneReordered.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.

PUT /v1/admin/sites/{siteId}/catalog/{gameId}

PUT /v1/admin/sites/{siteId}/catalog/{gameId}

Terminal window
curl -X PUT 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/catalog/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"featured": true,
"visible": true,
"categories": [
"string"
],
"tags": [
"string"
],
"texts": {
"en": {
"title": "string",
"tagline": "string",
"description": "string",
"howToPlay": [
"string"
],
"controls": [
{
"keys": [
"string"
],
"does": "string"
}
],
"seoTitle": "string",
"seoDescription": "string"
}
}
}'

Add or update a game in the site catalog

Adding a game the site may not list answers 403 with the reason in message: the game is pending, it has no live version, or it is first_party and the site is not first-party (ADR 0015). A pending site of the game’s own developer may list the developer’s pending games.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
gameIdpathstring (uuid)yes

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

PropertyTypeRequiredDescription
featuredbooleanno
visiblebooleanno
categoriesstring[]no
tagsstring[]no
textsobjectno
texts.*GameTextsno
StatusBodyDescription
200SiteGameEntry.
403ErrorThe site may not list this game; message says why.
404ErrorUnknown resource.

DELETE /v1/admin/sites/{siteId}/catalog/{gameId}

DELETE /v1/admin/sites/{siteId}/catalog/{gameId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/catalog/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Remove a game from the site catalog

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
gameIdpathstring (uuid)yes
StatusBodyDescription
204noneRemoved.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

POST /v1/admin/sites/{siteId}/publish

POST /v1/admin/sites/{siteId}/publish

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/publish' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Make the catalog changes visible on the site front

Drops the API’s cached catalog of the site, then purges the site’s CDN pull zone (ADR 0010) when the site has cdnPullZoneId and the API has BUNNY_API_KEY. Without one of them nothing is purged and the answer says why: the front picks the change up on its own within its revalidation delay. Writes an audit row site.publish.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
StatusBodyDescription
200PublishResultWhat was purged.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
503ErrorThe CDN did not accept the purge; retry in a minute.

GET /v1/admin/games

GET /v1/admin/games

Terminal window
curl 'https://api.filudi.com/v1/admin/games' \
-b "filudi_console=$FILUDI_SESSION"

Every game with its versions

Staff and a game’s members get the full game. A site member gets a reader view of the others: the live version only, notes null, createdBy empty, sites limited to its own. An account with no site membership gets only its own games, and 403 on another game’s id.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
availablequerystring (uuid)noA site id. Lists only the games that site may add: approved, with a live version, any_portal or the site is first-party. A pending site of the caller also gets the caller’s own pending games.
StatusBodyDescription
200Game[]Games.

POST /v1/admin/games

POST /v1/admin/games

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/games' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"slug": "gloop",
"name": "string",
"orientation": "portrait",
"minutes": 1,
"mobile": true,
"daily": true,
"coverColor": "string",
"distribution": "first_party"
}'

Create a game

Staff, or an account with canCreateGames; anyone else gets 403. A staff creation is approved at once. A developer’s game is created with approvedAt null and the creator as owner; staff approves it from the Approvals screen. One account holds at most 10 pending games (409). A reserved slug answers 400: admin, api, play, developers, filudi, www, static.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

application/json, required.

PropertyTypeRequiredDescription
slugstringyespattern ^[a-z][a-z0-9-]{1,39}$
namestringyes
orientationone of "portrait", "landscape", "any"no
minutesinteger or nullno1 to 600
mobilebooleanno
dailybooleanno
coverColorstring or nullnopattern ^#[0-9A-Fa-f]{6}$
distributionDistributionnoWhere a game may be listed (ADR 0015). first_party: sites with firstParty only. any_portal: any approved site.
StatusBodyDescription
201GameCreated.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
409noneSlug taken, or the account already holds 10 pending games.

GET /v1/admin/games/{gameId}

GET /v1/admin/games/{gameId}

Terminal window
curl 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION"

One game

Members and staff get listedOn, the sites whose catalog carries the game.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
StatusBodyDescription
200GameGame.

PATCH /v1/admin/games/{gameId}

PATCH /v1/admin/games/{gameId}

Terminal window
curl -X PATCH 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"slug": "gloop",
"name": "string",
"orientation": "portrait",
"minutes": 1,
"mobile": true,
"daily": true,
"coverColor": "string",
"distribution": "first_party"
}'

Update a game

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes

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

PropertyTypeRequiredDescription
slugstringnopattern ^[a-z][a-z0-9-]{1,39}$
namestringno
orientationone of "portrait", "landscape", "any"no
minutesinteger or nullno1 to 600
mobilebooleanno
dailybooleanno
coverColorstring or nullnopattern ^#[0-9A-Fa-f]{6}$
distributionDistributionnoWhere a game may be listed (ADR 0015). first_party: sites with firstParty only. any_portal: any approved site.
StatusBodyDescription
200GameUpdated.

DELETE /v1/admin/games/{gameId}

DELETE /v1/admin/games/{gameId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Delete a game and everything attached to it (staff only)

Refused while a version of the game is live. Deletes the versions, media, saves, scores, leaderboards, ratings, comments and catalog entries of every site, and sets game to null on its feedback (ADR 0012). Then removes the files under games/<slug>/ from the files service (best effort: a failure is logged, the deletion stands), removes the game’s Redis leaderboard sets and drops the catalog cache of every site that listed it. Events and daily aggregates keep the game’s id. Writes an audit row game.delete.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
StatusBodyDescription
204noneDeleted.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409Errorconflict: “Retire the live version first.”.

POST /v1/admin/games/{gameId}/approve

POST /v1/admin/games/{gameId}/approve

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/approve' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Staff only. Approve a pending game

Sets approvedAt. The game may now have a live version and be listed by approved sites; the owners get an email.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
StatusBodyDescription
200GameGame.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneAlready approved.

POST /v1/admin/games/{gameId}/reject

POST /v1/admin/games/{gameId}/reject

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/reject' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"reason": "string"
}'

Staff only. Send the owners a reason; the game stays pending

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes

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

PropertyTypeRequiredDescription
reasonstringyesSent to the owners by email; 1 to 1000 characters
StatusBodyDescription
204noneReason sent.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneThe game is approved.

GET /v1/admin/games/{gameId}/members

GET /v1/admin/games/{gameId}/members

Terminal window
curl 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/members' \
-b "filudi_console=$FILUDI_SESSION"

Members of a game

Owner of the game or staff. Invited emails without an account yet are listed with invited true.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
StatusBodyDescription
200Member[]Members.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

POST /v1/admin/games/{gameId}/members

POST /v1/admin/games/{gameId}/members

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/members' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"email": "you@example.com",
"role": "owner"
}'

Add a member by email

Owner of the game or staff. An existing account gets the membership at once. An unknown email gets an invitation that carries it; the membership exists once the invitation is accepted.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes

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

PropertyTypeRequiredDescription
emailstring (email)yesat most 254 characters
roleMembershipRoleyesA member has every right of the owner except membership changes
StatusBodyDescription
201MemberMember.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneAlready a member.

DELETE /v1/admin/games/{gameId}/members/{accountId}

DELETE /v1/admin/games/{gameId}/members/{accountId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/members/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Remove a member

Owner of the game or staff. The last owner cannot be removed.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
accountIdpathstring (uuid)yes
StatusBodyDescription
204noneRemoved.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneconflict: “A game keeps at least one owner.”.

DELETE /v1/admin/games/{gameId}/members/invitations/{invitationId}

DELETE /v1/admin/games/{gameId}/members/invitations/{invitationId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/members/invitations/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Withdraw an invitation

Owner of the game or staff. Removes this game from the invitation’s grants; an invitation left with no grant is revoked.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
invitationIdpathstring (uuid)yes
StatusBodyDescription
204noneWithdrawn.
403ErrorNot allowed for this role or site.
404noneNo pending invitation to this game has this id.

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

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

Terminal window
curl 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/stats?from=2026-10-30&to=2026-10-30' \
-b "filudi_console=$FILUDI_SESSION"

One game’s numbers across every site that lists it, for a range of UTC days

Members of the game and staff. Same range rules as the site overview: from and to included, at most 400 days, previous covers the range of the same length that ends the day before from. Cached in Redis for 60 s per game, range and filter set. Nothing about ads or money (ADR 0015).

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
fromquerystring (date)yesFirst UTC day, included
toquerystring (date)yesLast UTC day, included
sitequerystring (uuid)noOnly the sessions of this site
hostquerystringnoOnly the sessions of this host
versionquerystringnoOnly the sessions of this bundle version. events and funnel.loaded come from event_daily, which has no version, so they ignore this filter
localequerystringnoOnly the players of this locale. events and funnel.loaded come from event_daily, which has no locale, so they ignore this filter
StatusBodyDescription
200ConsoleGameStatsGame stats.
400noneRange over 400 days, or to before from.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

POST /v1/admin/games/{gameId}/versions

POST /v1/admin/games/{gameId}/versions

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/versions' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"version": "string",
"sizeBytes": 0,
"notes": "string"
}'

Start a version upload

Returns a presigned PUT URL from the files service for a zip. 200 MB max. Answers 409 while a finalize runs or once the version is finalized, and 503 with Retry-After while Redis is down.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes

application/json, required.

PropertyTypeRequiredDescription
versionstringyespattern ^\d+\.\d+\.\d+([-.][0-9A-Za-z.-]+)?$
sizeBytesintegeryesat most 209715200
notesstringno
StatusBodyDescription
201objectUpload slot.
409noneVersion exists.

Body of 201

PropertyTypeRequiredDescription
versionIdstring (uuid)yes
uploadUrlstring (uri)yes
expiresAtstring (date-time)yes

POST /v1/admin/games/{gameId}/media/{slot}

POST /v1/admin/games/{gameId}/media/{slot}

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/media/image-square' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"contentType": "image/avif",
"sizeBytes": 1
}'

Start a media upload

Returns a presigned PUT URL from the files service. The slot keeps its current file until finalize succeeds.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
slotpathone of "image-square", "image-landscape", "image-portrait", "video-landscape", "video-portrait"yesADR 0007 gives the ratio, pixel range, file types and size limit of each slot

application/json, required.

PropertyTypeRequiredDescription
contentTypeone of "image/avif", "image/webp", "image/jpeg", "image/png", "video/mp4"yes
sizeBytesintegeryesChecked against the slot limit; 1 to 15728640
StatusBodyDescription
201objectUpload slot.
400noneType not allowed in this slot, or file over the slot limit.

Body of 201

PropertyTypeRequiredDescription
uploadUrlstring (uri)yes
expiresAtstring (date-time)yes

DELETE /v1/admin/games/{gameId}/media/{slot}

DELETE /v1/admin/games/{gameId}/media/{slot}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/media/image-square' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Empty the slot

The file stays in the files service; built pages may still point to it (ADR 0007).

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
slotpathone of "image-square", "image-landscape", "image-portrait", "video-landscape", "video-portrait"yesADR 0007 gives the ratio, pixel range, file types and size limit of each slot
StatusBodyDescription
204noneEmptied, or already empty.

POST /v1/admin/games/{gameId}/media/{slot}/finalize

POST /v1/admin/games/{gameId}/media/{slot}/finalize

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/media/image-square/finalize' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Check the uploaded file and put it in the slot

Detects the type from the bytes, checks ratio, pixels, size, and for a video H.264, duration and moov before mdat. The message of a 400 says what to change in the file.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
slotpathone of "image-square", "image-landscape", "image-portrait", "video-landscape", "video-portrait"yesADR 0007 gives the ratio, pixel range, file types and size limit of each slot
StatusBodyDescription
200MediaFileThe slot’s new file.
400noneNo upload, or a file that breaks the slot rules.

POST /v1/admin/versions/{versionId}/finalize

POST /v1/admin/versions/{versionId}/finalize

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/versions/00000000-0000-0000-0000-000000000000/finalize' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Unpack the uploaded zip into the bundle prefix

Checks the entry file exists, rejects paths with .., counts files and bytes. The version becomes draft.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
versionIdpathstring (uuid)yes
StatusBodyDescription
200GameVersionVersion.
400noneZip missing, invalid or without the entry file.
409noneAnother finalize or an activation holds this version.
503noneRedis is down: the version lock is not available.

POST /v1/admin/versions/{versionId}/activate

POST /v1/admin/versions/{versionId}/activate

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/versions/00000000-0000-0000-0000-000000000000/activate' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Make this version live; the previous live one goes back to draft (staff only)

Clears reviewRequestedAt. Answers 409 on a game that is not approved, and while a finalize or another activation holds the version; 503 while Redis is down (ADR 0013).

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
versionIdpathstring (uuid)yes
StatusBodyDescription
200GameVersionVersion.
403ErrorNot allowed for this role or site.
409ErrorThe game is pending approval, or another operation holds the version.

POST /v1/admin/versions/{versionId}/retire

POST /v1/admin/versions/{versionId}/retire

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/versions/00000000-0000-0000-0000-000000000000/retire' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Retire a version; its bundle stops being served (staff only)

Retiring the live version takes the game off play: the catalog answers bundleUrl: null and version: null until another version goes live. A game is deleted only with no live version. Clears reviewRequestedAt.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
versionIdpathstring (uuid)yes
StatusBodyDescription
200GameVersionVersion.

POST /v1/admin/versions/{versionId}/review

POST /v1/admin/versions/{versionId}/review

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/versions/00000000-0000-0000-0000-000000000000/review' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Ask staff to review a draft and make it live

Any member of the game. Sets reviewRequestedAt and emails staff. The version shows in the Approvals screen.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
versionIdpathstring (uuid)yes
StatusBodyDescription
200GameVersionVersion.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409ErrorThe version is not a draft, or the game is pending approval.

POST /v1/admin/versions/{versionId}/review/reject

POST /v1/admin/versions/{versionId}/review/reject

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/versions/00000000-0000-0000-0000-000000000000/review/reject' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"reason": "string"
}'

Staff only. Decline a review request and send the owners the reason

Clears reviewRequestedAt; the version stays a draft.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
versionIdpathstring (uuid)yes

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

PropertyTypeRequiredDescription
reasonstringyesSent to the owners by email; 1 to 1000 characters
StatusBodyDescription
200GameVersionVersion.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.
409noneNo review was requested.

GET /v1/admin/versions/{versionId}/preview

GET /v1/admin/versions/{versionId}/preview

Terminal window
curl 'https://api.filudi.com/v1/admin/versions/00000000-0000-0000-0000-000000000000/preview' \
-b "filudi_console=$FILUDI_SESSION"

Signed URL to play a draft version for 1 hour

Built on PREVIEW_URL when it is set, else on the API origin, and never on the CDN, so Bunny cannot strip the preview cookie the bundle’s other files need. Open it in a new tab (a preview answers frame-ancestors 'none').

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
versionIdpathstring (uuid)yes
StatusBodyDescription
200objectURL.

Body of 200

PropertyTypeRequiredDescription
urlstring (uri)yes
expiresAtstring (date-time)yes

GET /v1/admin/games/{gameId}/leaderboards

GET /v1/admin/games/{gameId}/leaderboards

Terminal window
curl 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/leaderboards' \
-b "filudi_console=$FILUDI_SESSION"

Boards of a game

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
StatusBodyDescription
200Leaderboard[]Boards.

PUT /v1/admin/games/{gameId}/leaderboards

PUT /v1/admin/games/{gameId}/leaderboards

Terminal window
curl -X PUT 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/leaderboards' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '[
{
"name": "string",
"sort": "desc",
"min": 0,
"max": 0,
"keep": "best",
"ratePerMinute": 10
}
]'

Replace the boards of a game

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes

application/json, required.

An array of LeaderboardInput.

StatusBodyDescription
200Leaderboard[]Boards.

GET /v1/admin/games/{gameId}/leaderboards/{board}/scores

GET /v1/admin/games/{gameId}/leaderboards/{board}/scores

Terminal window
curl 'https://api.filudi.com/v1/admin/games/00000000-0000-0000-0000-000000000000/leaderboards/height/scores' \
-b "filudi_console=$FILUDI_SESSION"

Scores for moderation

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
gameIdpathstring (uuid)yes
boardpathstringyespattern ^[a-z][a-z0-9_]{0,31}$
periodqueryone of "day", "week", "all"nodefault "all"
sitequerystringno403 unless the caller is an admin or an editor of that site
hiddenquerybooleanno
limitqueryintegernoat most 500; default 100
StatusBodyDescription
200ScoreAdmin[]Scores with player ids.

POST /v1/admin/scores/{scoreId}

POST /v1/admin/scores/{scoreId}

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/scores/string' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Unhide a score

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
scoreIdpathstringyes
StatusBodyDescription
204noneVisible again.

DELETE /v1/admin/scores/{scoreId}

DELETE /v1/admin/scores/{scoreId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/scores/string' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"reason": "string"
}'

Hide a score

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
scoreIdpathstringyes

application/json, optional.

PropertyTypeRequiredDescription
reasonstringnoStored in the audit row; at most 200 characters
StatusBodyDescription
204noneHidden and removed from Redis.

GET /v1/admin/sites/{siteId}/players

GET /v1/admin/sites/{siteId}/players

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/players' \
-b "filudi_console=$FILUDI_SESSION"

List the players of a site, with an optional search

Without q, every player that matches the filters. With q, a player id (a UUID), an email (a value with @, matched by its hash) or a nickname substring, case-insensitive. By default the list shows account players only: guests=true adds guests, and merged=true also adds guests already merged into an account. An id or an email ignores guests and merged: the one match shows, whatever it is. lastSeen and created sort newest first, nickname alphabetically; ties break on id. total counts every row that matches the filters, across pages.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
qquerystringnoat least 2 characters
guestsquerybooleannoFalse hides players without an email; default false
mergedquerybooleannoFalse hides guests merged into an account; only matters with guests=true; default false
sortqueryone of "lastSeen", "created", "nickname"nodefault "lastSeen"
cursorquerystringnoOpaque; the nextCursor of the previous page, with the same filters and sort; at most 200 characters
limitqueryintegerno1 to 500; default 100
StatusBodyDescription
200PlayerPagePlayers, emails masked.
400noneq shorter than 2 characters, or a cursor of another sort.

GET /v1/admin/players/{playerId}

GET /v1/admin/players/{playerId}

Terminal window
curl 'https://api.filudi.com/v1/admin/players/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION"

Player detail with saves metadata and best scores

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
playerIdpathstring (uuid)yes
StatusBodyDescription
200PlayerAdminPlayer.

DELETE /v1/admin/players/{playerId}

DELETE /v1/admin/players/{playerId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/players/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Schedule deletion (GDPR request handled by support)

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
playerIdpathstring (uuid)yes
StatusBodyDescription
202noneScheduled.

GET /v1/admin/players/{playerId}/export

GET /v1/admin/players/{playerId}/export

Terminal window
curl 'https://api.filudi.com/v1/admin/players/00000000-0000-0000-0000-000000000000/export' \
-b "filudi_console=$FILUDI_SESSION"

Export a player’s data

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
playerIdpathstring (uuid)yes
StatusBodyDescription
200PlayerExportJSON file.

GET /v1/admin/sites/{siteId}/comments

GET /v1/admin/sites/{siteId}/comments

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/comments' \
-b "filudi_console=$FILUDI_SESSION"

Comments of a site for moderation, newest first

Editor of the site or admin. q is a case-insensitive substring of the body or of the author’s current nickname. total counts every row that matches the filters, across pages.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
gameIdquerystring (uuid)no
hiddenqueryone of "all", "visible", "hidden"nodefault "all"
qquerystringno2 to 100 characters
cursorquerystringnoOpaque; the nextCursor of the previous page, with the same filters and sort; at most 200 characters
limitqueryintegerno1 to 500; default 100
StatusBodyDescription
200CommentPageComments.
403ErrorNot allowed for this role or site.
404noneUnknown site.

DELETE /v1/admin/comments/{commentId}

DELETE /v1/admin/comments/{commentId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/comments/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Delete a comment for good

Editor of the comment’s site or admin. Audit row comment.delete with the body in before.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
commentIdpathstring (uuid)yes
StatusBodyDescription
204noneDeleted.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

POST /v1/admin/comments/{commentId}/hide

POST /v1/admin/comments/{commentId}/hide

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/comments/00000000-0000-0000-0000-000000000000/hide' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Hide a comment from every player route

Editor of the comment’s site or admin. Sets hiddenBy and hiddenAt. Audit row comment.hide.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
commentIdpathstring (uuid)yes
StatusBodyDescription
204noneHidden, or already hidden.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

POST /v1/admin/comments/{commentId}/unhide

POST /v1/admin/comments/{commentId}/unhide

Terminal window
curl -X POST 'https://api.filudi.com/v1/admin/comments/00000000-0000-0000-0000-000000000000/unhide' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Show a hidden comment again

Editor of the comment’s site or admin. Clears hiddenBy and hiddenAt. Audit row comment.unhide.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
commentIdpathstring (uuid)yes
StatusBodyDescription
204noneVisible, or already visible.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

GET /v1/admin/sites/{siteId}/ratings

GET /v1/admin/sites/{siteId}/ratings

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/ratings' \
-b "filudi_console=$FILUDI_SESSION"

Rating of every rated game of a site

Games with at least one rating, listed in the catalog or not, most ratings first.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
StatusBodyDescription
200GameRatingAdmin[]Ratings.
403ErrorNot allowed for this role or site.
404noneUnknown site.

GET /v1/admin/sites/{siteId}/feedback

GET /v1/admin/sites/{siteId}/feedback

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/feedback' \
-b "filudi_console=$FILUDI_SESSION"

Feedback of a site, newest first

Editor of the site or admin. q is a case-insensitive substring of the message. total counts every row that matches the filters, across pages.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
statusqueryone of "new", "seen", "done"no
kindqueryone of "bug", "suggestion", "other"no
gameIdquerystring (uuid)no
qquerystringno2 to 100 characters
cursorquerystringnoOpaque; the nextCursor of the previous page, with the same filters and sort; at most 200 characters
limitqueryintegerno1 to 500; default 100
StatusBodyDescription
200FeedbackPageFeedback.
403ErrorNot allowed for this role or site.
404noneUnknown site.

GET /v1/admin/feedback/{feedbackId}

GET /v1/admin/feedback/{feedbackId}

Terminal window
curl 'https://api.filudi.com/v1/admin/feedback/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION"

One feedback message

Editor of its site or admin. The reply email is decrypted.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
feedbackIdpathstring (uuid)yes
StatusBodyDescription
200FeedbackAdminFeedback.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

PATCH /v1/admin/feedback/{feedbackId}

PATCH /v1/admin/feedback/{feedbackId}

Terminal window
curl -X PATCH 'https://api.filudi.com/v1/admin/feedback/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com' \
-H 'content-type: application/json' \
-d '{
"status": "new",
"note": "string"
}'

Change the status or the note

Editor of its site or admin. Audit row feedback.update with the old and new status and note.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
feedbackIdpathstring (uuid)yes

application/json, required. The body is a FeedbackUpdate. At least one field; an empty body is a 400.

PropertyTypeRequiredDescription
statusFeedbackStatusno
notestring or nullnoNull clears the note; "" is stored as null; at most 2000 characters
StatusBodyDescription
200FeedbackAdminUpdated.
400ErrorValidation failed.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

DELETE /v1/admin/feedback/{feedbackId}

DELETE /v1/admin/feedback/{feedbackId}

Terminal window
curl -X DELETE 'https://api.filudi.com/v1/admin/feedback/00000000-0000-0000-0000-000000000000' \
-b "filudi_console=$FILUDI_SESSION" \
-H 'origin: https://developers.filudi.com'

Delete a feedback message for good

Editor of its site or admin. Audit row feedback.delete; the row’s email is not copied into it.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
feedbackIdpathstring (uuid)yes
StatusBodyDescription
204noneDeleted.
403ErrorNot allowed for this role or site.
404ErrorUnknown resource.

GET /v1/admin/sites/{siteId}/events/today

GET /v1/admin/sites/{siteId}/events/today

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/events/today' \
-b "filudi_console=$FILUDI_SESSION"

Counts since midnight UTC, live from the events table

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
StatusBodyDescription
200objectCounts.

Body of 200

PropertyTypeRequiredDescription
sincestring (date-time)no
rowsEventCount[]no

GET /v1/admin/sites/{siteId}/events/daily

GET /v1/admin/sites/{siteId}/events/daily

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/events/daily?from=2026-10-30&to=2026-10-30' \
-b "filudi_console=$FILUDI_SESSION"

Daily aggregates

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
fromquerystring (date)yes
toquerystring (date)yes
gamequerystringno
StatusBodyDescription
200EventDaily[]Rows.

GET /v1/admin/sites/{siteId}/stats/overview

GET /v1/admin/sites/{siteId}/stats/overview

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/stats/overview?from=2026-10-30&to=2026-10-30' \
-b "filudi_console=$FILUDI_SESSION"

The site dashboard numbers for a range of UTC days

Read from Postgres (players, play_sessions, scores, saves, magic_links, event_daily) and cached in Redis for 60 s per site and range. from and to are included; at most 400 days. previous covers the range of the same length that ends the day before from.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
fromquerystring (date)yesFirst UTC day, included
toquerystring (date)yesLast UTC day, included
StatusBodyDescription
200StatsOverviewOverview.

GET /v1/admin/sites/{siteId}/stats/games/{gameId}

GET /v1/admin/sites/{siteId}/stats/games/{gameId}

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/stats/games/00000000-0000-0000-0000-000000000000?from=2026-10-30&to=2026-10-30' \
-b "filudi_console=$FILUDI_SESSION"

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

Same range rules and cache as the overview. 404 when the game is not in the site catalog.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
gameIdpathstring (uuid)yes
fromquerystring (date)yesFirst UTC day, included
toquerystring (date)yesLast UTC day, included
StatusBodyDescription
200GameStatsGame stats.

GET /v1/admin/sites/{siteId}/stats/web

GET /v1/admin/sites/{siteId}/stats/web

Terminal window
curl 'https://api.filudi.com/v1/admin/sites/00000000-0000-0000-0000-000000000000/stats/web' \
-b "filudi_console=$FILUDI_SESSION"

Web audience from CausalIT (ADR 0009)

Calls the CausalIT read API with the site’s read key and answers configured: false without one. Cached in Redis for 120 s per site, period and path. path narrows every number to one page path, for the game screens.

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
siteIdpathstring (uuid)yes
periodqueryone of "day", "yesterday", "7d", "14d", "30d", "90d", "6m", "12m", "custom"nodefault "7d"
fromquerystring (date)noWith period=custom
toquerystring (date)noWith period=custom
pathquerystringnoA page path such as /game/gloop/; at most 200 characters
StatusBodyDescription
200WebStatsWeb stats.
503noneCausalIT did not answer.

GET /v1/admin/audit

GET /v1/admin/audit

Terminal window
curl 'https://api.filudi.com/v1/admin/audit' \
-b "filudi_console=$FILUDI_SESSION"

Audit log

Credential: the console session cookie filudi_console, set by POST /v1/console/sign-in. From a browser, send credentials: 'include'; on a non-GET request the Origin header must be one of the console origins. With X-Filudi-Impersonation: 1 the API reads the filudi_impersonation cookie instead.

NameInTypeRequiredDescription
sitequerystringnoSite slug
actorquerystringno
fromquerystring (date-time)no
cursorquerystringno
limitqueryintegernoat most 500; default 100
StatusBodyDescription
200objectEntries, newest first.

Body of 200

PropertyTypeRequiredDescription
itemsAuditEntry[]no
nextCursorstring or nullno