Skip to content
Open Markdown

List published games ​

GET /v1/public/store/games

  • Operation ID: listPublicStoreGames
  • Tags: Public store
  • Base URL: http://localhost:8787

Public catalog of all published games with genre/company ids and art URLs, ordered by title. Not paginated. Runs as the anonymous role so row security limits it to published games. Cached for 60s (Cache-Control: public, max-age=60).

Workflow: Integration guide.

Authentication: none (public).

Authentication ​

  • Auth: none (public endpoint, no token required).

Responses ​

200 ​

Published games.

  • Header x-request-id: Request identifier; quote it when reporting an error.
  • Header Cache-Control: Public cache lifetime. Example: "public, max-age=60". Content type: application/json

Schema: object

FieldTypeRequiredDescription
data(object (StorePublicGame))[]yes-
data[].idintegeryes-
data[].slugstringyes-
data[].titlestringyes-
data[].summarystring | nullyes-
data[].descriptionstring | nullyes-
data[].game_typestringyesOne of: "app", "game", "launcher"
data[].statusstringyesOne of: "draft", "published", "hidden"
data[].release_datestring | nullyesDate, YYYY-MM-DD.
data[].controller_supportstringyesOne of: "none", "partial", "full"
data[].websitestring | nullyes-
data[].required_ageintegeryes-
data[].legal_noticestring | nullyes-
data[].license_requiredbooleanyes-
data[].content_descriptionstring | nullyes-
data[].metadataobjectyes-
data[].created_atstringyesISO 8601 timestamp.
data[].updated_atstringyesISO 8601 timestamp.
data[].genre_idsinteger[]yes-
data[].developer_idsinteger[]yes-
data[].publisher_idsinteger[]yes-
data[].media(object (StoreGameMedia))[]yes-
data[].media[].idstring<uuid>yes-
data[].media[].kindstringyesOne of: "header", "main_capsule", "small_capsule", "hero_capsule", "library_capsule", "library_hero"
data[].media[].widthinteger | nullyes-
data[].media[].heightinteger | nullyes-
data[].media[].updated_atstringyesISO 8601 timestamp.
data[].media[].urlstringyesPublic asset URL (cache-busted with ?t=).
data[].screenshots(object (StoreGameScreenshot))[]yes-
data[].screenshots[].idstring<uuid>yes-
data[].screenshots[].widthinteger | nullyes-
data[].screenshots[].heightinteger | nullyes-
data[].screenshots[].updated_atstringyesISO 8601 timestamp.
data[].screenshots[].urlstringyes-
data[].screenshots[].thumbnail_urlstringyes-

Errors ​

500 ​

Unexpected server error (internal). No details are returned.

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object (ErrorBody)

FieldTypeRequiredDescription
errorstringyesStable machine-readable error code, e.g. forbidden, not_found.
detailsanynoOptional structured context. For 403 it is { perm }.

Error response

json
{
  "error": "internal"
}

Examples ​

curl ​

bash
curl -X GET 'http://localhost:8787/v1/public/store/games'

TypeScript ​

ts
const response = await fetch("http://localhost:8787/v1/public/store/games", {
  method: "GET",
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const data = response.status === 204 || response.status === 205
  ? undefined
  : response.headers.get("content-type")?.includes("json")
    ? await response.json()
    : await response.text();

Try this endpoint

Requests go directly from your browser to the API. Send request executes this endpoint against the selected server.

GET/v1/public/store/games

Your token stays in this tab's memory and is sent only when you press Send request.

Built for developers. Ready for agents.