Skip to main content
🎉 GP CONF 2026: WEB Games Market Conference 👾 September 23 | Details

Feedback

Route public feedback forms through your own backend. The backend validates and rate-limits the form, then calls the platform API. This keeps the platform API key and feedback data—including email addresses and message text—out of public client code.

Execution context: platform server. Send Content-Type, X-Game-Platform-Api-Key, and X-Game-Platform-ID. Do not send the API key or raw feedback list to the browser.

Create feedback

mutation CreatePlatformFeedback($input: PlatformCreateFeedbackInput!) {
result: PlatformCreateFeedback(input: $input) {
__typename
... on Problem {
message
}
... on Feedback {
id
gameViewId
type
status
platformStatus
createdAt
}
}
}

Variables:

{
"input": {
"platformId": 42,
"gameViewId": 101,
"playerPlatformId": "platform-player-id",
"playerId": 9001,
"playerEmail": "player@example.com",
"text": "The game does not start",
"type": "ERROR",
"files": []
}
}

Only platformId, gameViewId, text, and type are required. Send player identifiers or email only when the player supplied them and your privacy policy permits it. The files field accepts URLs of files that your backend has already uploaded; it does not accept binary data.

Feedback types, statuses, message authors, and the shared feedback model are described in Feedbacks. The operations on this page are the platform-specific GraphQL interface for that model.

Successful response:

{
"data": {
"result": {
"__typename": "Feedback",
"id": "feedback-id",
"gameViewId": 101,
"type": "ERROR",
"status": "NEW",
"platformStatus": "NEW",
"createdAt": "2026-08-17T10:00:00Z"
}
}
}

List feedback

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: EN)
}
}
}
}
}

Variables:

{
"input": {
"gamePlatformId": 42,
"limit": 20,
"offset": 0,
"filter": {
"platformStatus": "NEW",
"type": "ERROR"
}
}
}

Successful response shape:

{
"data": {
"result": {
"__typename": "FeedbacksList",
"totalCount": 1,
"feedbacks": [
{
"id": "feedback-id",
"gameViewId": 101,
"playerEmail": "player@example.com",
"text": "The game does not start",
"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": "Example Game"
}
}
]
}
}
}

Increase offset by limit until the API returns fewer than limit feedbacks. The filter also supports status, provider, and search.

Load a feedback thread

Use gameViewId from the list result when opening a feedback item. Keep its projectProvider: subsequent reply, status-update, and message-deletion mutations pass that value as 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": "The problem is still present",
"files": [],
"time": "2026-08-17T10:10:00Z",
"hiddenForPlayer": false
}
]
}
}
}

Reply to feedback

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": "Thank you. We are investigating the problem.",
"provider": "GAMEPUSH",
"files": [],
"hiddenForPlayer": false
}
}

Pass the feedback's projectProvider as provider. Set hiddenForPlayer: true only for an internal note that must remain visible to the platform and developer but not to the player.

Update platform status

mutation UpdatePlatformFeedbackStatus(
$input: PlatformUpdateFeedbackStatusInput!
) {
result: PlatformUpdateFeedbackStatus(input: $input) {
__typename
... on Problem {
message
}
... on Feedback {
id
status
platformStatus
updatedAt
}
}
}

Variables and successful response:

{
"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"
}
}
}

Platform statuses are NEW, IN_PROGRESS, RESOLVED, and UNRESOLVED. Pass the feedback's projectProvider as provider. A successful PlatformUpdateFeedbackStatus mutation sets both platformStatus and status to the requested value. A status change made by the game developer does not change platformStatus.

Mark as seen or delete a message

Mark feedback as seen after the platform operator opens it:

mutation MarkPlatformFeedbackSeen($input: MarkFeedbacksAsSeenInput!) {
result: markFeedbacksAsSeen(input: $input) {
__typename
... on Problem {
message
}
... on Success {
success
}
}
}
{
"input": {
"feedbacksToMark": [
{
"id": "feedback-id",
"provider": "GAMEPUSH"
}
]
}
}

If your interface allows a platform message to be removed, use:

mutation DeletePlatformFeedbackMessage(
$input: PlatformDeleteFeedbackMessageInput!
) {
result: PlatformDeleteFeedbackMessage(input: $input) {
__typename
... on Problem {
message
}
... on Success {
success
}
}
}
{
"input": {
"feedbackId": "feedback-id",
"messageId": "message-id",
"provider": "GAMEPUSH"
}
}

Both successful mutations return {"__typename":"Success","success":true}.