Обратная связь
Отправляйте публичные формы обратной связи через собственный backend. Он проверяет данные, ограничивает частоту запросов и вызывает API площадки. Так API-ключ и данные обращений, включая email и текст сообщения, не попадают в публичный клиентский код.
Контекст выполнения: сервер площадки. Передавайте Content-Type, X-Game-Platform-Api-Key и X-Game-Platform-ID. Не передавайте API-ключ или необработанный список обращений браузеру.
Создание обращения
mutation CreatePlatformFeedback($input: PlatformCreateFeedbackInput!) {
result: PlatformCreateFeedback(input: $input) {
__typename
... on Problem {
message
}
... on Feedback {
id
gameViewId
type
status
platformStatus
createdAt
}
}
}
Переменные:
{
"input": {
"platformId": 42,
"gameViewId": 101,
"playerPlatformId": "platform-player-id",
"playerId": 9001,
"playerEmail": "player@example.com",
"text": "Игра не запускается",
"type": "ERROR",
"files": []
}
}
Обязательны только platformId, gameViewId, text и type. Передавайте идентификаторы игрока и email только с его согласия и если это разрешает ваша политика конфиденциальности. Поле files принимает URL файлов, которые ваш backend уже загрузил в хранилище; бинарные данные в него передавать нельзя.
Типы и статусы обращений, авторы сообщений и общая модель обратной связи описаны в разделе «Обратная связь». На этой странице приведён специфичный для площадки GraphQL-интерфейс этой модели.
Успешный ответ:
{
"data": {
"result": {
"__typename": "Feedback",
"id": "feedback-id",
"gameViewId": 101,
"type": "ERROR",
"status": "NEW",
"platformStatus": "NEW",
"createdAt": "2026-08-17T10:00:00Z"
}
}
}
Получение списка обращений
query PlatformFeedbacks($input: PlatformFetchFeedbacksInput!) {
result: PlatformFetchFeedbacks(input: $input) {
__typename
... on Problem {
message
}
... on FeedbacksList {
totalCount
feedbacks {
id
gameViewId
playerEmail
text
type
status
platformStatus
projectProvider
files
createdAt
updatedAt
gameView {
id
name(lang: RU)
}
}
}
}
}
Переменные:
{
"input": {
"gamePlatformId": 42,
"limit": 20,
"offset": 0,
"filter": {
"platformStatus": "NEW",
"type": "ERROR"
}
}
}
Структура успешного ответа:
{
"data": {
"result": {
"__typename": "FeedbacksList",
"totalCount": 1,
"feedbacks": [
{
"id": "feedback-id",
"gameViewId": 101,
"playerEmail": "player@example.com",
"text": "Игра не запускается",
"type": "ERROR",
"status": "NEW",
"platformStatus": "NEW",
"projectProvider": "GAMEPUSH",
"files": [],
"createdAt": "2026-08-17T10:00:00Z",
"updatedAt": "2026-08-17T10:00:00Z",
"gameView": {
"id": 101,
"name": "Пример игры"
}
}
]
}
}
}
Увеличивайте offset на limit, пока API не вернёт меньше limit обращений. Фильтр также поддерживает status, provider и search.
Получение обращения и переписки
При открытии обращения используйте gameViewId из результата списка. Сохраните его projectProvider: последующие мутации ответа, изменения статуса и удаления сообщения передают это значение в поле provider.
query PlatformFeedback($input: PlatformFetchFeedbackInput!) {
result: PlatformFetchFeedback(input: $input) {
__typename
... on Problem {
message
}
... on Feedback {
id
gameViewId
text
type
status
platformStatus
projectProvider
files
hasSeen
createdAt
updatedAt
messages {
id
feedbackId
author
text
files
time
hiddenForPlayer
}
}
}
}
{
"input": {
"id": "feedback-id",
"gameViewId": 101,
"gamePlatformId": 42
}
}
{
"data": {
"result": {
"__typename": "Feedback",
"id": "feedback-id",
"projectProvider": "GAMEPUSH",
"hasSeen": false,
"messages": [
{
"id": "message-id",
"feedbackId": "feedback-id",
"author": "PLAYER",
"text": "Проблема всё ещё воспроизводится",
"files": [],
"time": "2026-08-17T10:10:00Z",
"hiddenForPlayer": false
}
]
}
}
}
Ответ на обращение
mutation SendPlatformFeedbackMessage(
$input: PlatformSendFeedbackMessageInput!
) {
result: PlatformSendFeedbackMessage(input: $input) {
__typename
... on Problem {
message
}
... on FeedbackMessage {
id
feedbackId
author
text
files
time
hiddenForPlayer
}
}
}
{
"input": {
"feedbackId": "feedback-id",
"author": "PLATFORM",
"text": "Спасибо. Мы разбираемся с проблемой.",
"provider": "GAMEPUSH",
"files": [],
"hiddenForPlayer": false
}
}
В поле provider передавайте projectProvider обращения. Устанавливайте hiddenForPlayer: true только для внутреннего комментария, который должен быть виден площадке и разработчику, но не игроку.
Обновление статуса площадки
mutation UpdatePlatformFeedbackStatus(
$input: PlatformUpdateFeedbackStatusInput!
) {
result: PlatformUpdateFeedbackStatus(input: $input) {
__typename
... on Problem {
message
}
... on Feedback {
id
status
platformStatus
updatedAt
}
}
}
Переменные и успешный ответ:
{
"input": {
"id": "feedback-id",
"platformStatus": "IN_PROGRESS",
"provider": "GAMEPUSH"
}
}
{
"data": {
"result": {
"__typename": "Feedback",
"id": "feedback-id",
"status": "IN_PROGRESS",
"platformStatus": "IN_PROGRESS",
"updatedAt": "2026-08-17T10:15:00Z"
}
}
}
Статусы площадки: NEW, IN_PROGRESS, RESOLVED и UNRESOLVED. В поле provider передавайте projectProvider обращения. Успешная мутация PlatformUpdateFeedbackStatus устанавливает переданное значение одновременно в platformStatus и status. Изменение статуса разработчиком игры не меняет platformStatus.
Отметка просмотра или удаление сообщения
После открытия обращения оператором площадки отметьте его просмотренным:
mutation MarkPlatformFeedbackSeen($input: MarkFeedbacksAsSeenInput!) {
result: markFeedbacksAsSeen(input: $input) {
__typename
... on Problem {
message
}
... on Success {
success
}
}
}
{
"input": {
"feedbacksToMark": [
{
"id": "feedback-id",
"provider": "GAMEPUSH"
}
]
}
}
Если интерфейс позволяет удалить сообщение площадки, используйте:
mutation DeletePlatformFeedbackMessage(
$input: PlatformDeleteFeedbackMessageInput!
) {
result: PlatformDeleteFeedbackMessage(input: $input) {
__typename
... on Problem {
message
}
... on Success {
success
}
}
}
{
"input": {
"feedbackId": "feedback-id",
"messageId": "message-id",
"provider": "GAMEPUSH"
}
}
Обе успешные мутации возвращают {"__typename":"Success","success":true}.