Перейти к основному содержимому
🎉 GP CONF 2026: Конференция о рынке WEB-игр 👾 23 сентября | Подробнее

Страницы

Страницы задают маршруты и упорядоченные блоки контента. В конфигурации площадки находятся mainPageId и ID юридических страниц; меню также может ссылаться на сущности страниц.

Контекст выполнения: браузер витрины или сервер площадки. Браузер передаёт Content-Type, X-Game-Platform-ID, совпадающий Origin и credentials: 'include'. Сервер дополнительно передаёт X-Game-Platform-Api-Key. Не раскрывайте этот ключ браузеру.

Определение сущности по URL витрины

Перед загрузкой контента определите сущность запрошенного URL. Ответ подсказывает роутеру, какой запрос выполнить, и содержит редирект, локализованные альтернативы и SEO текущего маршрута.

query ResolvePlatformSiteRoute(
$input: GetGamePlatformEntityByUrlInput!
$lang: Lang
) {
result: GetGamePlatformEntityByUrl(input: $input) {
__typename
... on Problem {
message
}
... on GamePlatformEntity {
type
entityId
platformId
lang
redirectUrl
disablePageBanners
alternateUrls {
en
ru
}
seoSettings {
ogTitle(lang: $lang)
ogDescription(lang: $lang)
ogImage(lang: $lang)
}
}
}
}

Переменные:

{
"lang": "RU",
"input": {
"url": "https://games.example.com/ru/popular/"
}
}

Передавайте полный публичный URL без query string. Добавьте в alternateUrls поля языков, которые поддерживает ваша площадка; используйте их для переключения языка и ссылок hreflang.

  • Если redirectUrl не пуст, выполните постоянный редирект.
  • Направляйте PAGE и MAIN_PAGE в FetchGamePlatformPage.
  • Направляйте GAME на публичную страницу игры, а GAME_FRAME — в режим iframe через API игр.
  • Направляйте COLLECTION в API подборок. Для CATEGORY, CATEGORIES, TAG и TAGS используйте ключи и URL из запроса площадки.
  • Направляйте SEARCH на поиск по каталогу с withMetrics: false и filter.searchFilter из API игр.
  • Обрабатывайте Problem с сообщением page_not_found как ответ 404.

Получение списка страниц

query PlatformPages($input: FetchGamePlatformPagesInput!, $lang: Lang) {
result: FetchGamePlatformPages(input: $input) {
__typename
... on Problem {
message
}
... on GamePlatformPagesList {
count
items {
id
platformId
isActive
slug(lang: $lang)
name(lang: $lang)
disablePageBanners
useCustomTitleInMetaTags
}
}
}
}

Переменные:

{
"lang": "RU",
"input": {
"platformId": 42
}
}

Успешный ответ:

{
"data": {
"result": {
"__typename": "GamePlatformPagesList",
"count": 2,
"items": [
{
"id": "home",
"platformId": 42,
"isActive": true,
"slug": "home",
"name": "Главная",
"disablePageBanners": false,
"useCustomTitleInMetaTags": false
}
]
}
}
}

Чтобы отфильтровать список по названию, передайте необязательное поле search. Не создавайте маршруты для неактивных страниц.

Получение страницы и её блоков

query PlatformPage(
$input: FetchGamePlatformPageInput!
$lang: Lang
) {
result: FetchGamePlatformPage(input: $input) {
__typename
... on Problem {
message
}
... on GamePlatformPage {
id
isActive
slug(lang: $lang)
name(lang: $lang)
description(lang: $lang)
disablePageBanners
useCustomTitleInMetaTags
seoSettings {
ogTitle(lang: $lang)
ogDescription(lang: $lang)
ogImage(lang: $lang)
}
blocks {
type
entityId
collectionDisplayType
collectionHideTitle
collectionWrapper {
wrapIcon
hideIcon
iconColor
hideTitle
showAllCards
sort
}
content(lang: $lang) {
__typename
... on ContentTypeBlock {
content
}
... on GamePlatformCollection {
id
name(lang: $lang)
slug(lang: $lang)
icon(lang: $lang)
games(length: 0) {
count
items {
id
name(lang: $lang)
icon(lang: $lang)
platformUrl(lang: $lang)
}
}
}
... on GamePlatformCategory {
key
name
url
games(length: 0) {
count
items {
id
name(lang: $lang)
icon(lang: $lang)
platformUrl(lang: $lang)
}
}
}
... on GamePlatformTag {
key
name
url
games(length: 0) {
count
items {
id
name(lang: $lang)
icon(lang: $lang)
platformUrl(lang: $lang)
}
}
}
}
}
}
}
}

Для содержимого внутри блока страницы API выбирает размер встроенного превью игр по collectionDisplayType. Обязательный аргумент games(length: ...) не переопределяет уже загруженное превью, поэтому в примере передаётся 0 как формальное значение. Если нужен явный размер страницы и пагинация, используйте API подборок.

Переменные:

{
"lang": "RU",
"input": {
"id": "home",
"targetOS": "Desktop"
}
}

Структура успешного ответа:

{
"data": {
"result": {
"__typename": "GamePlatformPage",
"id": "home",
"isActive": true,
"slug": "home",
"name": "Главная",
"blocks": [
{
"type": "COLLECTION",
"entityId": "7",
"collectionDisplayType": "LARGE_HORIZONTAL_TILES",
"content": {
"__typename": "GamePlatformCollection",
"id": 7,
"name": "Популярное",
"slug": "popular"
}
}
]
}
}
}

Отображайте блоки в полученном порядке. Для макета используйте collectionDisplayType и collectionWrapper. Для блока MY_GAMES получите playedGames авторизованного игрока, как описано в разделе «Игрок». Если при showAllCards нужна пагинация, продолжайте загрузку через API подборок, а не только через встроенное превью.

Тип блокаПоведение витрины
CONTENTОтобразите ContentTypeBlock.content. Очищайте HTML перед вставкой в страницу.
CUSTOMВыберите специальный компонент витрины по entityId. Если интерфейс не поддерживает этот идентификатор, пропустите блок или покажите безопасную заглушку: поле content не содержит данные специального компонента.
COLLECTIONОтобразите подборку и встроенное превью игр.
CATEGORY или TAGОтобразите категорию или тег и встроенное превью игр.
MY_GAMESЗагрузите игры авторизованного игрока; для остальных покажите пустое состояние или предложение войти.