Skip to content

Schemas

The named schemas of openapi.yaml, games-api 0.7.0. A route’s body or response links here; a field that is itself a named schema links to its own section.

Error

PropertyTypeRequiredDescription
errorone of "unauthorized", "forbidden", "not_found", "invalid", "conflict", "too_large", "rate_limited", "unavailable", "internal"yes
messagestringyes
detailsobjectno

Period

Type: one of "day", "week", "all"; default "all".

AgeBand

Type: one of "all", "kids", "teen", "adult".

Player

PropertyTypeRequiredDescription
idstring (uuid)yes
nicknamestringyes
guestbooleanyes
sitestringyes
localestringyes
emailMaskedstring or nullnoa***@example.com for the account page
hasPasswordbooleanyesTrue when the account set a password (ADR 0011); false for a guest
createdAtstring (date-time)no

PlayerWithToken

PropertyTypeRequiredDescription
playerPlayeryes
tokenstringyes

ConsumeResponse

What magic-link consume, consume-code and sign-in answer (ADR 0011)

PropertyTypeRequiredDescription
playerPlayeryes
tokenstringyes
mergedbooleanyesTrue when a guest was merged into the account by this call
redirectstringnoPath on the site to go to; magic-link consume only, when the link carried one

SaveMeta

PropertyTypeRequiredDescription
gameIdstringyes
versionintegeryes
etagstringyes
bytesintegeryes
updatedAtstring (date-time)yes

SaveServerCopy

The 409 body. When nothing is stored yet, version is 0, etag is empty and updatedAt and data are null.

PropertyTypeRequiredDescription
gameIdstringyes
versionintegeryes
etagstringyes
bytesintegeryes
updatedAtstring (date-time) or nullyes
dataany or nullyes

Save

Type: SaveMeta + object.

PropertyTypeRequiredDescription
gameIdstringyes
versionintegeryes
etagstringyes
bytesintegeryes
updatedAtstring (date-time)yes
dataanyyes

LeaderboardEntry

PropertyTypeRequiredDescription
rankintegeryes
nicknamestringyes
scoreintegeryes
metaobject or nullno
isMebooleanyes

LeaderboardTop

PropertyTypeRequiredDescription
periodPeriodyesdefault "all"
entriesLeaderboardEntry[]yes
totalintegeryes
meLeaderboardEntry or nullno

EventBatch

PropertyTypeRequiredDescription
eventsEventIn[]yesat most 50 items

EventIn

PropertyTypeRequiredDescription
namestringyesframe_loaded is reserved: accepted with a player token from the hub, refused with a game token (ADR 0015); pattern ^[a-z][a-z0-9_]{0,39}$
propsobjectno
props.*string or number or booleanno
tsintegeryesUnix milliseconds on the client
gameIdstringno
gameVersionstringno
sessionIdstring (uuid)no
hoststringno
localestringno

Catalog

PropertyTypeRequiredDescription
siteobjectyes
site.slugstringyes
site.namestringyes
site.domainsstring[]yes
site.localesstring[]yes
site.policyobjectyes
site.policy.accountsAllowedbooleanno
site.policy.personalizedAdsAllowedbooleanno
site.policy.ageBandAgeBandno
site.navCategoriesstring[]yesCategory slugs of the top menu, in menu order; only slugs that exist
site.otherSitesOtherSite[]yes
site.analyticsDomainstringyesThe domain registered at CausalIT (causalitDomain, else the first domain); the front’s tag reports to it
generatedAtstring (date-time)yes
categoriesCategory[]yes
tagsTag[]yesEvery tag of the site, in site order; game tags are slugs of this list
gamesCatalogGame[]yes

CatalogGame

PropertyTypeRequiredDescription
slugstringyes
orderintegeryes
featuredbooleanyes
categoriesstring[]yes
tagsstring[]yes
orientationone of "portrait", "landscape", "any"yes
minutesinteger or nullyesTypical run length in minutes; null when not set
mobilebooleanyes
dailybooleanyes
coverColorstring or nullno
publishedAtstring (date-time) or nullnoWhen the live version was activated; null without one
bundleUrlstring (uri) or nullyeshttps://play.filudi.com/<slug>/<version>/index.html; null when no live version
versionstring or nullyes
boardsobject[]yes
boards[].namestringno
boards[].sortone of "desc", "asc"no
textsobjectyesKeyed by locale
texts.*GameTextsno
mediaGameMediayesFilled slots only; a missing key is an empty slot
ratingCatalogRatingyesStars of a game on the site (ADR 0012). Follows ratings within the catalog’s 60-second cache.

CatalogRating

Stars of a game on the site (ADR 0012). Follows ratings within the catalog’s 60-second cache.

PropertyTypeRequiredDescription
averagenumber or nullyesMean of the stars, rounded to one decimal; null when count is 0
countintegeryesat least 0

RatingSummary

PropertyTypeRequiredDescription
averagenumber or nullyesMean of the stars, rounded to one decimal; null when count is 0
countintegeryesat least 0
histograminteger[]yesRatings per star count; index 0 is one star, index 4 is five stars; 5 to 5 items

Comment

PropertyTypeRequiredDescription
idstring (uuid)yes
nicknamestringyesThe author’s current nickname, read when the list is served
bodystringyesPlain text with newlines; render as text
createdAtstring (date-time)yes
editedAtstring (date-time) or nullyes

GameReviews

PropertyTypeRequiredDescription
ratingRatingSummaryyes
commentsComment[]yes
nextCursorstring or nullyesNull on the last page

PlayerReview

PropertyTypeRequiredDescription
starsinteger or nullyesNull when the player has not rated the game; 1 to 5
commentsComment[]yesThe player’s visible comments on the game, newest first

CommentAdmin

PropertyTypeRequiredDescription
idstring (uuid)yes
gameIdstring (uuid)yes
gamestringyesGame slug
playerobjectyes
player.idstring (uuid)yes
player.nicknamestringyes
player.emailMaskedstring or nullyes
bodystringyes
localestringyes
hiddenbooleanyes
hiddenBystring or nullyesUsername of the moderator
hiddenAtstring (date-time) or nullyes
createdAtstring (date-time)yes
editedAtstring (date-time) or nullyes

CommentPage

PropertyTypeRequiredDescription
itemsCommentAdmin[]yes
nextCursorstring or nullyes
totalintegeryes

GameRatingAdmin

PropertyTypeRequiredDescription
gameIdstring (uuid)yes
gamestringyesGame slug
averagenumber or nullyes
countintegeryes
histograminteger[]yesIndex 0 is one star; 5 to 5 items

FeedbackKind

Type: one of "bug", "suggestion", "other".

FeedbackStatus

Type: one of "new", "seen", "done".

FeedbackInput

PropertyTypeRequiredDescription
sitestringyesSite slug
gamestringnoGame slug; absent when the message is about the site
kindFeedbackKindyes
messagestringyesCounted after trim; 10 to 2000 characters
emailstring (email) or stringnoWhere the team may reply; "" counts as no email
pagestringnoPath of the page, without the query string; at most 512 characters; pattern ^/
localestringnoThe page locale; kept when it is a locale of the site

FeedbackAccepted

PropertyTypeRequiredDescription
idstring (uuid)yes

FeedbackAdmin

PropertyTypeRequiredDescription
idstring (uuid)yes
kindFeedbackKindyes
statusFeedbackStatusyes
messagestringyes
emailstring or nullyesIn clear: the reporter gave it to be contacted
gameIdstring (uuid) or nullyes
gamestring or nullyesGame slug; null for the site or a deleted game
playerobject or nullyes
pagestring or nullyes
userAgentstring or nullyes
localestring or nullyes
notestring or nullyes
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

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

FeedbackPage

PropertyTypeRequiredDescription
itemsFeedbackAdmin[]yes
nextCursorstring or nullyes
totalintegeryes

MediaSlot

ADR 0007 gives the ratio, pixel range, file types and size limit of each slot

Type: one of "image-square", "image-landscape", "image-portrait", "video-landscape", "video-portrait".

MediaFile

PropertyTypeRequiredDescription
urlstring (uri)yeshttps://play.filudi.com/<slug>/media/<kind>-<format>-<sha256:16>.<ext>; immutable
typeone of "image/avif", "image/webp", "image/jpeg", "image/png", "video/mp4"yes
bytesintegeryes
widthintegeryes
heightintegeryes
durationMsintegernoVideos only

GameMedia

Filled slots only; a missing key is an empty slot

PropertyTypeRequiredDescription
imagesobjectyes
images.squareMediaFileno
images.landscapeMediaFileno
images.portraitMediaFileno
videosobjectyes
videos.landscapeMediaFileno
videos.portraitMediaFileno

GameTexts

PropertyTypeRequiredDescription
titlestringyes
taglinestringyesOne line under the title
descriptionstringyes
howToPlaystring[]no
controlsobject[]no
controls[].keysstring[]no
controls[].doesstringno
seoTitlestringno
seoDescriptionstringno

CategoryIcon

Stroke icons drawn by hub-core (categoryIconSvg), the same list in the admin picker

Type: one of "puzzle", "joystick", "calendar", "keyboard", "letters", "brain", "cards", "dice", "target", "rocket", "timer", "trophy", "heart", "star", "sparkle", "grid", "map", "music", "bolt", "leaf".

Category

PropertyTypeRequiredDescription
idstring (uuid)no
slugstringyes
orderintegeryes
iconCategoryIcon or nullno
textsobjectyes
texts.*.titlestringno
texts.*.navTitlestringnoShort form for the menu, chips and card meta: “Puzzle” for “Puzzle games”
texts.*.descriptionstringno
gameCountintegernoAdmin routes only; games of the site in this category
createdAtstring (date-time)no
updatedAtstring (date-time)no

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

Tag

PropertyTypeRequiredDescription
idstring (uuid)no
slugstringyes
orderintegeryes
textsobjectyesKeyed by locale
texts.*.titlestringno
gameCountintegernoAdmin routes only; games of the site carrying this tag
createdAtstring (date-time)no
updatedAtstring (date-time)no

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

OtherSite

A sister site of the footer

PropertyTypeRequiredDescription
namestringyes1 to 60 characters
urlstring (uri)yeshttps only
descriptionstringnoat most 120 characters

Site

PropertyTypeRequiredDescription
idstring (uuid)yes
slugstringyes
namestringyes
domainsstring[]yesApproved domains; allowed origins once the site is approved
localesstring[]yes
approvedAtstring (date-time) or nullyesNull while the site waits for staff (ADR 0015); then its domains are not allowed origins
pendingDomainsstring[]yesDomains the owner proposed; approval moves them into domains
firstPartybooleanyesThe owner’s own site: lists any approved game, whatever its distribution
accountsAllowedbooleanyes
personalizedAdsAllowedbooleanyes
ageBandAgeBandyes
cdnPullZoneIdstring or nullnoBunny pull zone in front of the site; publish purges it
navCategoriesstring[]yesCategory slugs of the top menu, in order
otherSitesOtherSite[]yes
causalitDomainstring or nullnoDomain registered at CausalIT; null means the first domain
causalitKeysobjectyesWhether each key is stored. The keys themselves are never returned.
causalitKeys.readbooleanyes
causalitKeys.writebooleanyes
createdAtstring (date-time)no
updatedAtstring (date-time)no

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

PublishResult

PropertyTypeRequiredDescription
purgedbooleanyes
reasonone of "no_zone", "no_key"noWhy nothing was purged; absent when purged is true
atstring (date-time)yes

Distribution

Where a game may be listed (ADR 0015). first_party: sites with firstParty only. any_portal: any approved site.

Type: one of "first_party", "any_portal".

Game

PropertyTypeRequiredDescription
idstring (uuid)yes
slugstringyes
namestringyes
orientationone of "portrait", "landscape", "any"yes
minutesinteger or nullyesTypical run length in minutes; null when not set
mobilebooleanyes
dailybooleanyes
coverColorstring or nullno
approvedAtstring (date-time) or nullyesNull while the game waits for staff (ADR 0015): no live version, no listing on an approved site
distributionDistributionyesWhere a game may be listed (ADR 0015). first_party: sites with firstParty only. any_portal: any approved site.
listedOnobject[]yesSites whose catalog carries the game
listedOn[].siteIdstring (uuid)yes
listedOn[].slugstringyes
listedOn[].namestringyes
versionsGameVersion[]yes
mediaGameMediayesFilled slots only; a missing key is an empty slot
sitesstring[]noSlugs of sites listing this game
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

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.

GameVersion

PropertyTypeRequiredDescription
idstring (uuid)yes
versionstringyes
stateone of "draft", "live", "retired"yes
bundlePathstringyes
entrystringyes
sizeBytesintegeryes
fileCountintegeryes
notesstring or nullno
createdBystringyes
createdAtstring (date-time)yes
activatedAtstring (date-time) or nullno
retiredAtstring (date-time) or nullno
reviewRequestedAtstring (date-time) or nullyesSet by POST /v1/admin/versions/{versionId}/review; cleared on activate, retire and review reject

SiteGame

PropertyTypeRequiredDescription
gameIdstring (uuid)yes
slugstringyes
orderintegeryes
featuredbooleanyes
visiblebooleanyes
categoriesstring[]yes
tagsstring[]yes
textsobjectyes
texts.*GameTextsno
liveVersionstring or nullno
updatedAtstring (date-time)no

SiteGameInput

PropertyTypeRequiredDescription
featuredbooleanno
visiblebooleanno
categoriesstring[]no
tagsstring[]no
textsobjectno
texts.*GameTextsno

Leaderboard

PropertyTypeRequiredDescription
idstring (uuid)yes
namestringyes
sortone of "desc", "asc"yes
minintegeryes
maxintegeryes
keepone of "best", "latest"yes
ratePerMinuteintegeryes

LeaderboardInput

PropertyTypeRequiredDescription
namestringyespattern ^[a-z][a-z0-9_]{0,31}$
sortone of "desc", "asc"yes
minintegeryes
maxintegeryes
keepone of "best", "latest"nodefault "best"
ratePerMinuteintegernodefault 10

ScoreAdmin

A developer who does not edit the player’s site gets no playerId, site, hiddenBy or sessionId (ADR 0014).

PropertyTypeRequiredDescription
idstringyes
playerIdstring (uuid)no
nicknamestringyes
sitestringno
scoreintegeryes
metaobject or nullno
hiddenbooleanyes
hiddenBystring or nullno
sessionIdstring (uuid)no
createdAtstring (date-time)yes

PlayerAdmin

PropertyTypeRequiredDescription
idstring (uuid)yes
sitestringyes
nicknamestringyes
guestbooleanyes
emailMaskedstring or nullno
externalIdstring or nullnoA portal backend’s own user id, set through POST /v1/server/players; null otherwise
hasPasswordbooleanyesWhether the account set a password; the admin cannot set one
localestringno
createdAtstring (date-time)yes
lastSeenAtstring (date-time)yes
deleteAtstring (date-time) or nullno
mergedIntoIdstring (uuid) or nullno
savesSaveMeta[]no
bestScoresobject[]no
bestScores[].gamestringyes
bestScores[].boardstringyes
bestScores[].scoreintegeryes
bestScores[].createdAtstring (date-time)yes

PlayerPage

PropertyTypeRequiredDescription
itemsPlayerAdmin[]yes
nextCursorstring or nullyesNull on the last page
totalintegeryesRows matching the filters

PlayerExport

PropertyTypeRequiredDescription
exportedAtstring (date-time)yes
playerPlayeryes
emailstring or nullno
savesSave[]yes
scoresobject[]yes
eventsobject[]yesMost recent 20 000 of the last 13 months
eventsTruncatedbooleannoTrue when older events were left out
ratingsobject[]yesThe player’s ratings on the site (ADR 0012)
ratings[].gamestringyesGame slug
ratings[].starsintegeryes1 to 5
ratings[].createdAtstring (date-time)yes
ratings[].updatedAtstring (date-time)yes
commentsobject[]yesEvery comment of the player, hidden ones included
comments[].idstring (uuid)yes
comments[].gamestringyesGame slug
comments[].bodystringyes
comments[].hiddenbooleanyes
comments[].createdAtstring (date-time)yes
comments[].editedAtstring (date-time) or nullyes
feedbackobject[]yesFeedback the player sent with a token
feedback[].idstring (uuid)yes
feedback[].kindFeedbackKindyes
feedback[].statusFeedbackStatusyes
feedback[].messagestringyes
feedback[].gamestring or nullyesGame slug; null for the site or a deleted game
feedback[].pagestring or nullyes
feedback[].createdAtstring (date-time)yes

EventCount

PropertyTypeRequiredDescription
gamestring or nullno
namestringyes
hoststringyes
countintegeryes
playersintegeryes

EventDaily

Type: EventCount + object.

PropertyTypeRequiredDescription
gamestring or nullno
namestringyes
hoststringyes
countintegeryes
playersintegeryes
daystring (date)yes

StatsTotals

Counts over a range of days. Players and accounts count rows created in the range.

PropertyTypeRequiredDescription
playersintegeryesPlayers created
accountsintegeryesPlayers that linked an email
activePlayersintegeryesDistinct players with a play session
sessionsintegeryes
scoresintegeryes
savesintegeryesSaves written or updated
linksSentintegeryesMagic links created
linksConsumedintegeryes
eventsintegeryesRows of event_daily summed
avgSessionSecnumber or nullyesMean of last_seen_at minus started_at
medianSessionSecnumber or nullyesMedian of the same lengths
returningPlayersintegeryesPlayers of the range with a session on at least two distinct days
retentionD1RetentionShare or nullyesShare of new players who played again in the window; null below 10 players old enough to be counted; 0 to 1
retentionD7RetentionShare or nullyesShare of new players who played again in the window; null below 10 players old enough to be counted; 0 to 1
retentionD30RetentionShare or nullyesShare of new players who played again in the window; null below 10 players old enough to be counted; 0 to 1

StatsDay

PropertyTypeRequiredDescription
daystring (date)yes
playersintegeryes
accountsintegeryes
activePlayersintegeryes
wauintegeryesDistinct players with a session in the 7 days ending that day
mauintegeryesDistinct players with a session in the 30 days ending that day
returningPlayersintegeryesActive players whose first session is before that day
sessionsintegeryes
scoresintegeryes
savesintegeryes
linksSentintegeryes
linksConsumedintegeryes
eventsintegeryes
medianSessionSecnumber or nullyes

StatsGameRow

PropertyTypeRequiredDescription
gameIdstring (uuid)yes
slugstringyes
namestringyesThe game’s internal name
sessionsintegeryes
playersintegeryesDistinct players
scoresintegeryes
avgSessionSecnumber or nullno

StatsKeyCount

PropertyTypeRequiredDescription
keystringyes
countintegeryes
playersintegernoPlayers, when the dimension has them. For event names: distinct players per day, summed over the range

StatsOverview

PropertyTypeRequiredDescription
fromstring (date)yes
tostring (date)yes
daysStatsDay[]yesOne per day of the range
totalsStatsTotalsyesCounts over a range of days. Players and accounts count rows created in the range.
previousStatsTotalsyesCounts over a range of days. Players and accounts count rows created in the range.
cohortsStatsCohort[]yes
funnelStatsFunnelyesDistinct players of the range at each step
devicesStatsKeyCount[]yesSessions per device: phone, tablet, desktop, unknown
gamesStatsGameRow[]yesEvery game of the site catalog, most sessions first
hostsStatsKeyCount[]yesSessions per host
localesStatsKeyCount[]yesPlayers per locale, all time
eventsStatsKeyCount[]yesevent_daily counts per event name, top 20
catalogobjectyes
catalog.gamesintegeryesGames in the site catalog
catalog.visibleintegeryes
catalog.liveintegeryesVisible games with a live version
catalog.categoriesintegeryes
catalog.tagsintegeryes
generatedAtstring (date-time)yes

GameStatsDay

PropertyTypeRequiredDescription
daystring (date)yes
sessionsintegeryes
playersintegeryesDistinct players with a session
wauintegeryesDistinct players with a session in the 7 days ending that day
mauintegeryesDistinct players with a session in the 30 days ending that day
newPlayersintegeryesPlayers whose first session on this game is that day
returningPlayersintegeryesPlayers with a session that day and a first session before it
scoresintegeryes
savesintegeryesSaves written or updated
eventsintegeryes
avgSessionSecnumber or nullno
medianSessionSecnumber or nullyes

GameStatsTotals

PropertyTypeRequiredDescription
sessionsintegeryes
playersintegeryes
newPlayersintegeryes
returningPlayersintegeryesPlayers of the range with a session on at least two distinct days
scoresintegeryes
savesintegeryes
eventsintegeryes
avgSessionSecnumber or nullno
medianSessionSecnumber or nullyes
retentionD1number or nullnoShare (0 to 1) of the range’s new players who played again the next day, counting only players whose first day is at least two days before the current UTC day; null below 10 such players
retentionD7number or nullnoShare of the range’s new players who played again between day 2 and day 7, counting only players whose first day is at least eight days before the current UTC day; null below 10 such players
retentionD30number or nullyesShare of the range’s new players who played again between day 8 and day 30, counting only players whose first day is at least 31 days before the current UTC day; null below 10 such players

GameStatsBoard

PropertyTypeRequiredDescription
namestringyes
sortone of "desc", "asc"yes
scoresintegeryes
playersintegeryes
bestinteger or nullnoBest score of the range by the board’s sort
mediannumber or nullno

GameStats

PropertyTypeRequiredDescription
gameIdstring (uuid)yes
slugstringyes
fromstring (date)yes
tostring (date)yes
daysGameStatsDay[]yes
totalsGameStatsTotalsyes
previousGameStatsTotalsyes
cohortsStatsCohort[]yes
funnelStatsFunnelyesDistinct players of the range at each step
hostsStatsKeyCount[]yesSessions per host
localesStatsKeyCount[]yesSessions per player locale
devicesStatsKeyCount[]yesSessions per device: phone, tablet, desktop, unknown
boardsGameStatsBoard[]yes
eventsStatsKeyCount[]yesPer event name, top 20
versionsStatsKeyCount[]yesSessions per bundle version
generatedAtstring (date-time)yes

WebStatsRow

PropertyTypeRequiredDescription
keystringyes
visitorsintegeryes
pageviewsintegeryes

WebStats

When configured is false every other field is absent.

PropertyTypeRequiredDescription
configuredbooleanyesFalse when the site has no CausalIT read key
domainstringno
periodstringno
startstring (date-time)no
endstring (date-time)no
summaryobjectno
summary.visitorsintegeryes
summary.pageviewsintegeryes
summary.sessionsintegeryes
summary.bounceRatenumber or nullnoPercentage, 0 to 100
summary.avgDurationSecnumber or nullno
seriesobject[]no
series[].bucketstringyes
series[].visitorsintegeryes
series[].pageviewsintegeryes
pagesWebStatsRow[]no
sourcesWebStatsRow[]no
countriesWebStatsRow[]no
devicesWebStatsRow[]no
goalsobject[]no
goals[].namestringyes
goals[].kindone of "path", "event"yes
goals[].patternstringno
goals[].conversionsintegeryes
goals[].visitorsintegeryes
goals[].ratenumber or nullnoConversion rate, percentage, 0 to 100

AuditEntry

PropertyTypeRequiredDescription
idstringyes
actorstringyesThe account’s email (ADR 0015)
actorEmailstring or nullno
impersonatorstring or nullnoThe staff member’s email when the row was written under impersonation; null otherwise
sitestring or nullnoSite slug
actionstringyes
targetTypestringyes
targetIdstringyes
beforeobject or nullno
afterobject or nullno
createdAtstring (date-time)yes

GameToken

What POST /v1/sdk/game-tokens and POST /v1/server/game-tokens answer (ADR 0013)

PropertyTypeRequiredDescription
tokenstringyesfg1.<payload>.<hmac>, valid 24 hours
expiresAtstring (date-time)yes

AccountName

Display name, shown to other members and in the audit log

Type: string; 1 to 80 characters.

NewPassword

The policy of PUT /v1/account/password: 8 to 128 characters after NFC normalization, not equal to the email

Type: string; 8 to 128 characters; write only.

TotpCode

Six digits, “123456” or “123 456”

Type: string; pattern ^[0-9 ]{6,7}$.

MembershipRole

A member has every right of the owner except membership changes

Type: one of "owner", "member".

Scope

One game or site of the account, for the console’s scope switcher

PropertyTypeRequiredDescription
kindone of "game", "site"yes
idstring (uuid)yes
slugstringyes
namestringyes
roleMembershipRoleyesA member has every right of the owner except membership changes
approvedbooleanyesFalse while the game or site waits for staff

ConsoleMe

The signed-in account, as GET /v1/admin/me and GET /v1/console/me answer it (ADR 0015)

PropertyTypeRequiredDescription
accountIdstring (uuid)yes
namestringyes
emailstring (email)yes
staffbooleanyes
totpEnabledbooleanyes
canCreateGamesbooleanyes
canCreatePortalsbooleanyes
rolesobjectyesThe identity shape of ADR 0014, computed from staff and the memberships
roles.adminbooleanyesTrue for staff with TOTP enabled
roles.editorOfstring[]yesSlugs of the sites the account is a member of
roles.developerOfstring[]yesSlugs of the games the account is a member of
scopesScope[]yes
impersonatedByobject or nullyesThe staff member behind this session; null outside impersonation

SignInResult

PropertyTypeRequiredDescription
totpRequiredbooleanyesTrue when a code is due on POST /v1/console/sign-in/totp; me is then absent
meConsoleMenoThe signed-in account, as GET /v1/admin/me and GET /v1/console/me answer it (ADR 0015)

TotpEnrolment

PropertyTypeRequiredDescription
secretstringyesBase32, for manual entry; shown once, not active until confirmed
otpauthUrlstring (uri)yesotpauth://totp/... for the QR code

ConsoleSessionInfo

PropertyTypeRequiredDescription
idstring (uuid)yes
currentbooleanyesThe session that made this request
impersonationbooleanyesOpened by a staff member on this account
userAgentstring or nullyesFirst 300 characters of the browser’s User-Agent
createdAtstring (date-time)yes
lastSeenAtstring (date-time)yesWritten at most once a minute
expiresAtstring (date-time)yes

InvitationPreview

What the accept page shows before the invitee sets a name and a password

PropertyTypeRequiredDescription
emailMaskedstringyesa***@example.com
inviterNamestring or nullyesNull when the inviter’s account is gone
staffbooleanyes
canCreateGamesbooleanyes
canCreatePortalsbooleanyes
grantsobject[]yes
grants[].kindone of "game", "site"yes
grants[].slugstringyes
grants[].namestringyes
grants[].roleMembershipRoleyesA member has every right of the owner except membership changes
expiresAtstring (date-time)yes

InvitationRequestInput

PropertyTypeRequiredDescription
emailstring (email)yesat most 254 characters
wantsarray of one of "games", "portals"yesWhat they build; 1 to 2 items; unique items
messagestringyesCounted after trim; 1 to 500 characters

InvitationRequestStatus

Type: one of "new", "invited", "dismissed".

InvitationRequest

PropertyTypeRequiredDescription
idstring (uuid)yes
emailMaskedstringyes
emailstring (email)yesIn clear
wantsarray of one of "games", "portals"yes
messagestringyes
statusInvitationRequestStatusyes
handledBystring or nullyesName of the staff member who invited or dismissed
handledAtstring (date-time) or nullyes
createdAtstring (date-time)yes

InvitationRequestPage

PropertyTypeRequiredDescription
itemsInvitationRequest[]yes
nextCursorstring or nullyesNull on the last page
totalintegeryesRows matching the filter

Membership

One right of an account, as the staff account page lists them

PropertyTypeRequiredDescription
idstring (uuid)yes
kindone of "game", "site"yes
targetIdstring (uuid)yes
slugstringyes
namestringyes
roleMembershipRoleyesA member has every right of the owner except membership changes
approvedbooleanyesFalse while the game or site waits for staff

AccountAdmin

PropertyTypeRequiredDescription
idstring (uuid)yes
emailMaskedstringyes
emailstring (email)yesIn clear; staff only
namestringyes
staffbooleanyes
totpEnabledbooleanyes
canCreateGamesbooleanyes
canCreatePortalsbooleanyes
disabledAtstring (date-time) or nullyes
lastSignInAtstring (date-time) or nullyes
createdAtstring (date-time)yes
membershipsMembership[]yes
sessionsintegeryesOpen sessions

AccountPage

PropertyTypeRequiredDescription
itemsAccountAdmin[]yes
nextCursorstring or nullyesNull on the last page
totalintegeryesRows matching the search

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

ImpersonationStarted

PropertyTypeRequiredDescription
consoleUrlstring (uri)yesThe console (CONSOLE_URL), to open in a new tab
expiresAtstring (date-time)yesOne hour after the start

InvitationGrant

PropertyTypeRequiredDescription
kindone of "game", "site"yes
targetIdstring (uuid)yes
slugstringyes
namestringyes
roleMembershipRoleyesA member has every right of the owner except membership changes

Invitation

PropertyTypeRequiredDescription
idstring (uuid)yes
emailMaskedstringyes
staffbooleanyes
canCreateGamesbooleanyes
canCreatePortalsbooleanyes
grantsInvitationGrant[]yes
createdBystring or nullyesName of the inviter; null when the account is gone
expiresAtstring (date-time)yes
acceptedAtstring (date-time) or nullyes
revokedAtstring (date-time) or nullyes
createdAtstring (date-time)yes

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

ApprovalOwner

PropertyTypeRequiredDescription
accountIdstring (uuid)yes
namestringyes
emailstring (email)yes

ApprovalGame

PropertyTypeRequiredDescription
gameIdstring (uuid)yes
slugstringyes
namestringyes
ownersApprovalOwner[]yes
createdAtstring (date-time)yes

ApprovalSite

PropertyTypeRequiredDescription
siteIdstring (uuid)yes
slugstringyes
namestringyes
ownersApprovalOwner[]yes
pendingDomainsstring[]yesThe domains the owner proposed. Approving the site does not approve them; they move to the domains queue, decided one by one
createdAtstring (date-time)yes

ApprovalDomains

The proposed domains of one approved site

PropertyTypeRequiredDescription
siteIdstring (uuid)yes
slugstringyes
namestringyes
domainsstring[]yes

ApprovalVersion

PropertyTypeRequiredDescription
versionIdstring (uuid)yes
gameIdstring (uuid)yes
slugstringyes
versionstringyes
reviewRequestedAtstring (date-time)yes
createdBystringyes

Approvals

Every list is oldest first

PropertyTypeRequiredDescription
gamesApprovalGame[]yes
sitesApprovalSite[]yes
domainsApprovalDomains[]yes
versionsApprovalVersion[]yes

RejectInput

PropertyTypeRequiredDescription
reasonstringyesSent to the owners by email; 1 to 1000 characters

Member

PropertyTypeRequiredDescription
accountIdstring (uuid) or nullyesNull while the invitation is not accepted
invitationIdstring (uuid) or nullyesSet while the invitation is not accepted; DELETE .../members/invitations/{invitationId} withdraws it
emailMaskedstringyes
namestring or nullyesNull while the invitation is not accepted
roleMembershipRoleyesA member has every right of the owner except membership changes
invitedbooleanyesTrue for an invitation not accepted yet
createdAtstring (date-time)yes

MemberInput

PropertyTypeRequiredDescription
emailstring (email)yesat most 254 characters
roleMembershipRoleyesA member has every right of the owner except membership changes

SiteKeyScope

Each /v1/server/* route says which scope it needs

Type: one of "catalog", "players", "tokens", "leaderboards", "stats".

SiteKey

PropertyTypeRequiredDescription
idstring (uuid)yes
namestringyes
prefixstringyesThe first 12 characters of the key, to tell keys apart
scopesSiteKeyScope[]yes
createdBystring or nullyesName of the account that created it
createdAtstring (date-time)yes
lastUsedAtstring (date-time) or nullyesWritten at most once a minute
revokedAtstring (date-time) or nullyes

SiteKeyCreated

Type: SiteKey + object.

PropertyTypeRequiredDescription
idstring (uuid)yes
namestringyes
prefixstringyesThe first 12 characters of the key, to tell keys apart
scopesSiteKeyScope[]yes
createdBystring or nullyesName of the account that created it
createdAtstring (date-time)yes
lastUsedAtstring (date-time) or nullyesWritten at most once a minute
revokedAtstring (date-time) or nullyes
keystringyesfsk_<site slug>_<32 base62>. Shown once; the API stores a hash

SiteKeyInput

PropertyTypeRequiredDescription
namestringyes1 to 60 characters
scopesSiteKeyScope[]yesat least 1 item; unique items

RetentionShare

Share of new players who played again in the window; null below 10 players old enough to be counted

Type: number or null; 0 to 1.

StatsCohort

Players by the ISO week of their first play

PropertyTypeRequiredDescription
weekstringyesISO week; pattern ^\d{4}-W\d{2}$
playersintegeryesPlayers whose first session is in that week
d1RetentionShare or nullyesShare of new players who played again in the window; null below 10 players old enough to be counted; 0 to 1
d7RetentionShare or nullyesShare of new players who played again in the window; null below 10 players old enough to be counted; 0 to 1
d30RetentionShare or nullyesShare of new players who played again in the window; null below 10 players old enough to be counted; 0 to 1

StatsFunnel

Distinct players of the range at each step

PropertyTypeRequiredDescription
loadedintegeryesSent frame_loaded from the hub
startedintegeryesOpened a play session
savedintegeryesWrote a save
scoredintegeryesSent a score
linkedintegeryesLinked an email

ConsoleStatsDay

PropertyTypeRequiredDescription
daystring (date)yes
dauintegeryesDistinct players with a session that day
wauintegeryesDistinct players with a session in the 7 days ending that day
mauintegeryesDistinct players with a session in the 30 days ending that day
newPlayersintegeryesPlayers whose first session on this game is that day
returningPlayersintegeryesPlayers with a session that day and a first session before it
sessionsintegeryes
scoresintegeryes
savesintegeryesSaves written or updated
eventsintegeryes
meanSessionSecnumber or nullyes
medianSessionSecnumber or nullyes

ConsoleStatsTotals

PropertyTypeRequiredDescription
playersintegeryesDistinct players with a session
newPlayersintegeryes
returningPlayersintegeryesPlayers of the range with a session on at least two distinct days
sessionsintegeryes
scoresintegeryes
savesintegeryes
eventsintegeryes
meanSessionSecnumber or nullyes
medianSessionSecnumber or nullyes
retentionD1RetentionShare or nullyesShare of new players who played again in the window; null below 10 players old enough to be counted; 0 to 1
retentionD7RetentionShare or nullyesShare of new players who played again in the window; null below 10 players old enough to be counted; 0 to 1
retentionD30RetentionShare or nullyesShare of new players who played again in the window; null below 10 players old enough to be counted; 0 to 1

ConsoleGameStats

A game’s numbers across every site that lists it (ADR 0015)

PropertyTypeRequiredDescription
gameIdstring (uuid)yes
slugstringyes
fromstring (date)yes
tostring (date)yes
daysConsoleStatsDay[]yes
totalsConsoleStatsTotalsyes
previousConsoleStatsTotalsyes
cohortsStatsCohort[]yes
funnelStatsFunnelyesDistinct players of the range at each step
sitesobject[]yesEvery site that lists the game, most sessions first
sites[].siteIdstring (uuid)yes
sites[].slugstringyes
sites[].namestringyes
sites[].sessionsintegeryes
sites[].playersintegeryesDistinct players
hostsStatsKeyCount[]yesSessions per host
versionsStatsKeyCount[]yesSessions per bundle version
localesStatsKeyCount[]yesSessions per player locale
devicesStatsKeyCount[]yesSessions per device: phone, tablet, desktop, unknown
boardsGameStatsBoard[]yes
eventsStatsKeyCount[]yesPer event name with distinct players, top 20
generatedAtstring (date-time)yes

ServerPlayerInput

PropertyTypeRequiredDescription
externalIdstringyesYour own user id; 1 to 128 characters
nicknamestringno3 to 20 characters; pattern ^[\p{L}\p{N} _.-]+$
localestringnoDefaults to the site’s first locale

ServerPlayer

PropertyTypeRequiredDescription
idstring (uuid)yes
externalIdstringyes
nicknamestringyes
localestringyes
hasAccountbooleanyesTrue once the player linked an email on your site
createdAtstring (date-time)yes
lastSeenAtstring (date-time)yes