

```json
{
  "openapi": "3.0.1",
  "info": {
    "title": "Lobby",
    "contact": {
      "name": "Unity",
      "email": "multiplayer-suite-devs@unity3d.com",
      "url": "https://unity.com"
    },
    "description": "The Lobby service is a flexible system for games to enable different styles of multiplayer experiences quickly and easily.  A lobby provides a way to browse and join public games, create private games that can be easily joined by others using a code, gather a group together in a party before matchmaking as a group, and more!",
    "version": "v1",
    "termsOfService": "https://unity3d.com/legal/terms-of-service"
  },
  "servers": [
    {
      "url": "https://lobby.services.api.unity.com/v1",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Lobby",
      "description": "Create, manage, and interact with lobbies."
    }
  ],
  "paths": {
    "/query": {
      "post": {
        "summary": "Query public lobbies",
        "description": "Query all of the public lobbies for a title and filter them down according to parameters provided by the client.",
        "operationId": "queryLobbies",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QueryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QueryResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        }
      ]
    },
    "/create": {
      "post": {
        "summary": "Create a lobby",
        "description": "Create a new lobby and return the lobby metadata.",
        "operationId": "createLobby",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lobby"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        }
      ]
    },
    "/joinbycode": {
      "post": {
        "summary": "Join a lobby with lobby code",
        "description": "Join an existing lobby using the lobby code if there is space available (i.e. total number of players is less than the value of `MaxPlayers`).",
        "operationId": "joinLobbyByCode",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JoinByCodeRequest"
              },
              "example": {
                "lobbyCode": "XYZ123",
                "player": {
                  "data": {
                    "role": {
                      "visibility": "member",
                      "value": "tank"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lobby"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        }
      ]
    },
    "/{lobbyId}/join": {
      "post": {
        "summary": "Join a lobby with lobby ID",
        "description": "Join an existing lobby using the lobby ID if there is space available (i.e. total number of players is less than the value of `MaxPlayers`).",
        "operationId": "joinLobbyById",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JoinByIdRequest"
              },
              "examples": {
                "join-with-id": {
                  "summary": "Join with lobby ID",
                  "value": {
                    "password": "lobby_password",
                    "player": {
                      "id": "player_id",
                      "data": {
                        "role": {
                          "visibility": "member",
                          "value": "tank"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/ifMatch"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lobby"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        },
        {
          "$ref": "#/components/parameters/lobbyId"
        }
      ]
    },
    "/{lobbyId}/createorjoin": {
      "post": {
        "summary": "Create or join a lobby with lobby ID",
        "description": "CreateOrJoin will attempt to create a lobby with a specific ID.  If a Lobby with that ID already exists, we will attempt to join the Lobby.  Joining the Lobby may fail the same way as the regular Join Lobby call (e.g. lobby is full, lobby is password protected) and may even fail with Not Found if the Lobby happens to get deleted part way through the request. You should handle these failures the same way you would handle any Lobby join failure.",
        "operationId": "createOrJoinLobby",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successfully joined",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lobby"
                }
              }
            }
          },
          "201": {
            "description": "Successfully created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lobby"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        },
        {
          "$ref": "#/components/parameters/lobbyId"
        }
      ]
    },
    "/{lobbyId}/reconnect": {
      "post": {
        "summary": "Reconnect to a lobby after disconnecting",
        "description": "Reconnect a disconnected player to a lobby using the lobby ID. A disconnected player remains in the lobby but must reconnect in order to avoid being automatically removed after a configurable period of time. The duration can be set by the developer in the Lobby service configuration.",
        "operationId": "reconnect",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lobby"
                }
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        },
        {
          "$ref": "#/components/parameters/lobbyId"
        }
      ]
    },
    "/quickjoin": {
      "post": {
        "summary": "Query available lobbies and join a random one",
        "description": "Query all of the available lobbies for a title and filter them down according to parameters provided by the client.  If possible, join one and return its information.",
        "operationId": "quickJoinLobby",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuickJoinRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lobby"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        }
      ]
    },
    "/{lobbyId}": {
      "get": {
        "summary": "Get lobby details",
        "description": "Get the full details for a lobby including the game-specific metadata and player details.",
        "operationId": "getLobby",
        "tags": [
          "Lobby"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lobby"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/ifNoneMatch"
          }
        ]
      },
      "delete": {
        "summary": "Delete a lobby",
        "description": "Delete a lobby so it's no longer discoverable/joinable.",
        "operationId": "deleteLobby",
        "tags": [
          "Lobby"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ifMatch"
          }
        ],
        "responses": {
          "204": {
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "post": {
        "summary": "Update lobby data",
        "description": "Update the properties of a lobby.  This could include the lobby name, number of max players, the lobby's `data` property, etc.",
        "operationId": "updateLobby",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRequest"
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/ifMatch"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lobby"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        },
        {
          "$ref": "#/components/parameters/lobbyId"
        }
      ]
    },
    "/{lobbyId}/players/{playerId}": {
      "delete": {
        "summary": "Remove a player",
        "description": "Remove an individual player from a lobby.  If the player being removed is the host, a random player is chosen as the new host.  Hosts can avoid this by changing the `hostId` to another player using the **Update Lobby** API before leaving.",
        "operationId": "removePlayer",
        "tags": [
          "Lobby"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ifMatch"
          }
        ],
        "responses": {
          "204": {
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "post": {
        "summary": "Update player data",
        "description": "Update the properties of a player.  Only the player matching the player ID can perform this action.  This could include updating the `data` property for an individual player to include game-specific metadata.  The index data property is not allowed on player data objects at this time.",
        "operationId": "updatePlayer",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlayerUpdateRequest"
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/ifMatch"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lobby"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        },
        {
          "$ref": "#/components/parameters/lobbyId"
        },
        {
          "$ref": "#/components/parameters/playerId"
        }
      ]
    },
    "/{lobbyId}/bulkupdate": {
      "post": {
        "summary": "Bulk update",
        "description": "Apply a bulk update to a lobby. This can modify the lobby's metadata, add players, update players, and remove players. This operation is only allowed for service accounts.",
        "operationId": "bulkUpdateLobby",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkUpdateRequest"
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/ifMatch"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lobby"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        },
        {
          "$ref": "#/components/parameters/lobbyId"
        }
      ]
    },
    "/{lobbyId}/heartbeat": {
      "post": {
        "summary": "Heartbeat a lobby",
        "description": "Heartbeat a lobby, updating its `LastUpdated` property, to signify that the lobby is not stale.",
        "operationId": "heartbeat",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "Success"
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        },
        {
          "$ref": "#/components/parameters/lobbyId"
        }
      ]
    },
    "/{lobbyId}/tokens": {
      "post": {
        "summary": "Authentication token request",
        "description": "Request authentication tokens for use with other services that interact with Lobby.",
        "operationId": "requestTokens",
        "tags": [
          "Lobby"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/TokenRequest"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenMap"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        },
        {
          "$ref": "#/components/parameters/lobbyId"
        }
      ]
    },
    "/joined": {
      "get": {
        "summary": "Get a player's joined lobbies",
        "description": "Get a list of lobby IDs that the player is currently a member of.",
        "operationId": "getJoinedLobbies",
        "tags": [
          "Lobby"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        }
      ]
    },
    "/hosted": {
      "get": {
        "summary": "Get a player/service's hosted lobbies",
        "description": "Get a list of lobby IDs that are currently hosted by the player/service.",
        "operationId": "getHostedLobbies",
        "tags": [
          "Lobby"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        }
      ]
    },
    "/{lobbyId}/migrationdatainfo": {
      "get": {
        "summary": "Get migration data information for a host's lobby",
        "description": "Get the migration data information of a lobby that the player is the current host.",
        "operationId": "getMigrationDataInfo",
        "tags": [
          "Lobby"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MigrationDataInfo"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/serviceId"
        },
        {
          "$ref": "#/components/parameters/impersonatedUserId"
        },
        {
          "$ref": "#/components/parameters/lobbyId"
        }
      ]
    }
  },
  "components": {
    "schemas": {
      "Lobby": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "lobbyCode": {
            "description": "A short code that can be used to join a lobby.  This is only visible to lobby members.  Typically this is displayed to the user so they can share it with other players out-of-game.  Users with the code can join a lobby even when it is private.",
            "type": "string",
            "nullable": true
          },
          "upid": {
            "type": "string",
            "description": "The Unity project ID of the game."
          },
          "environmentId": {
            "type": "string",
            "description": "The ID of the environment this lobby exists in."
          },
          "name": {
            "type": "string",
            "nullable": true,
            "description": "The name of the lobby.  Typically this is shown in game UI to represent the lobby."
          },
          "maxPlayers": {
            "type": "integer",
            "format": "int32",
            "minimum": 1,
            "maximum": 150,
            "description": "The maximum number of players that can be members of the lobby."
          },
          "availableSlots": {
            "description": "The number of remaining open slots for players before the lobby becomes full.",
            "type": "integer",
            "format": "int32"
          },
          "isPrivate": {
            "type": "boolean",
            "description": "Whether or not the lobby is private.  Private lobbies do not appear in query results and cannot be fetched by non-members using the GetLobby API.  If the lobby is not publicly visible, the creator can share the `lobbyCode` with other users who can use it to join this lobby."
          },
          "isLocked": {
            "type": "boolean",
            "description": "Whether or not the lobby is locked.  If true, new players will not be able to join."
          },
          "hasPassword": {
            "type": "boolean",
            "description": "Indicates whether or not a password is required to join the lobby. Players wishing to join must provide the matching password or will be rejected."
          },
          "players": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Player"
            },
            "description": "The members of the lobby."
          },
          "data": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/DataObject"
            },
            "nullable": true,
            "description": "Properties of the lobby set by the host."
          },
          "hostId": {
            "type": "string",
            "description": "The ID of the player that is the lobby host."
          },
          "created": {
            "type": "string",
            "format": "date-time",
            "description": "When the lobby was created.  The timestamp is in UTC and conforms to ISO 8601."
          },
          "lastUpdated": {
            "type": "string",
            "format": "date-time",
            "description": "When the lobby was last updated.  The timestamp is in UTC and conforms to ISO 8601."
          },
          "version": {
            "type": "integer",
            "format": "int32",
            "description": "The current version of the lobby. Incremented when any non-private lobby data changes."
          }
        },
        "additionalProperties": false,
        "description": "Data about an individual lobby.",
        "example": {
          "id": "ABC123",
          "upid": "00000000-0000-0000-0000-000000000000",
          "environmentId": "00000000-0000-0000-0000-000000000000",
          "hostId": "VrFPilrfaCNovALjrjOXxS7luGxN",
          "name": "Noobs Only",
          "maxPlayers": 8,
          "availableSlots": 7,
          "isPrivate": false,
          "created": "2021-06-10T20:48:25.433Z",
          "lastUpdated": "2021-06-10T20:48:25.433Z",
          "version": 2,
          "players": [
            {
              "id": "VrFPilrfaCNovALjrjOXxS7luGxN",
              "profile": {
                "name": "ColorfulFlickeringHat#9"
              },
              "data": {
                "skin": {
                  "value": "Lance",
                  "visibility": "member"
                },
                "role": {
                  "value": "Gunner",
                  "visibility": "public"
                },
                "preferedLane": {
                  "value": "Mid",
                  "visibility": "public"
                }
              }
            }
          ],
          "data": {
            "mydata": {
              "visibility": "public",
              "value": "{somejson}"
            },
            "mydata2": {
              "visibility": "private",
              "value": "{somejson}"
            },
            "gameMode": {
              "visibility": "public",
              "value": "CTF",
              "index": "S1"
            },
            "indexedfield": {
              "visibility": "public",
              "value": "{somejson}",
              "index": "S2"
            },
            "trackLength": {
              "visibility": "public",
              "value": "32",
              "index": "N1"
            }
          }
        }
      },
      "DataObject": {
        "type": "object",
        "nullable": true,
        "properties": {
          "value": {
            "type": "string",
            "nullable": true,
            "maxLength": 2048,
            "description": "The value of the custom property.  This property can be set to null or an empty string.  If this property is indexed (by setting the `index` field) then the length of the value must be less than 128 bytes."
          },
          "visibility": {
            "type": "string",
            "enum": [
              "public",
              "member",
              "private"
            ],
            "x-go-enum-ci": true,
            "description": "Indicates for whom the property should be visible.  If `public`, the property will be visible to everyone and will be included in query results.  If `member`, the data will only be visible to users who are members of the lobby (i.e. those who have successfully joined).  If `private`, the metadata will only be visible to the host."
          },
          "index": {
            "description": "The name of the column to index this property value under, either `S#` for strings or `N#` for numeric values.  If an index is specified on a property, then you can use that index name in a `QueryFilter` to filter results by that property.  You will not be prevented from indexing multiple objects having properties with different names but the same index, but you will likely receive unexpected results from a query.",
            "type": "string",
            "enum": [
              "S1",
              "S2",
              "S3",
              "S4",
              "S5",
              "N1",
              "N2",
              "N3",
              "N4",
              "N5"
            ],
            "x-go-enum-ci": true,
            "nullable": true
          }
        },
        "required": [
          "visibility"
        ],
        "description": "Custom data property for a lobby.",
        "example": {
          "visibility": "public",
          "value": "CTF",
          "index": "S1"
        },
        "additionalProperties": false
      },
      "Player": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true,
            "description": "The unique identifier for the player.  If not provided for a create or join request, it will be set to the ID of the caller."
          },
          "profile": {
            "$ref": "#/components/schemas/PlayerProfile",
            "nullable": true,
            "description": "The profile information for the player from the Social Profile service. This field will only be present if the feature is enabled and profile information is available at the time of response. A prior response with profile information does not guarantee profile information will be included in subsequent responses."
          },
          "connectionInfo": {
            "type": "string",
            "nullable": true,
            "description": "Connection information for connecting to a relay with this player.",
            "deprecated": true
          },
          "data": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/PlayerDataObject"
            },
            "nullable": true,
            "maxProperties": 10,
            "description": "Custom game-specific properties that apply to an individual player (e.g. `role` or `skill`)."
          },
          "allocationId": {
            "type": "string",
            "nullable": true,
            "description": "The `allocationId` from the Relay service which associates this player in this lobby with a persistent connection.  When a disconnect notification is received, this value is used to identify the associated player in a lobby to mark them as disconnected."
          },
          "joined": {
            "type": "string",
            "format": "date-time",
            "description": "The time at which the player joined the lobby."
          },
          "lastUpdated": {
            "type": "string",
            "format": "date-time",
            "description": "The last time the metadata for this player was updated."
          }
        },
        "additionalProperties": false,
        "description": "Information about a specific player creating, joining, or already in a lobby."
      },
      "PlayerDataObject": {
        "type": "object",
        "nullable": true,
        "properties": {
          "value": {
            "type": "string",
            "nullable": true,
            "maxLength": 2048,
            "description": "The value of the custom property.  This property can be set to null or an empty string."
          },
          "visibility": {
            "type": "string",
            "enum": [
              "public",
              "member",
              "private"
            ],
            "x-go-enum-ci": true,
            "description": "Indicates for whom the property should be visible.  If `public`, the property will be visible to everyone and will be included in query results.  If `member`, the data will only be visible to users who are members of the lobby (i.e. those who have successfully joined).  If `private`, the metadata will only be visible to the player."
          }
        },
        "required": [
          "visibility"
        ],
        "description": "Custom data property for a player.",
        "example": {
          "visibility": "public",
          "value": "CTF"
        },
        "additionalProperties": false
      },
      "PlayerUpdateRequest": {
        "type": "object",
        "properties": {
          "connectionInfo": {
            "type": "string",
            "nullable": true,
            "description": "Connection information for connecting to a relay with this player.",
            "deprecated": true
          },
          "data": {
            "type": "object",
            "additionalProperties": {
              "type": "object",
              "nullable": true,
              "$ref": "#/components/schemas/PlayerDataObject"
            },
            "nullable": true,
            "description": "Custom game-specific properties to add, update, or remove from the player (e.g. `role` or `skill`).  To remove an existing property, include it in `data` but set the property object to `null`.  To update the value to `null`, set the `value` property of the object to `null`."
          },
          "allocationId": {
            "type": "string",
            "nullable": true,
            "description": "The `allocationId` from the Relay service which associates this player in this lobby with a persistent connection.  When a disconnect notification is received, this value is used to identify the associated player in a lobby to mark them as disconnected."
          }
        },
        "additionalProperties": false,
        "description": "The body of an Update Player Data request."
      },
      "BulkUpdateRequest": {
        "type": "object",
        "properties": {
          "lobbyUpdate": {
            "type": "object",
            "nullable": true,
            "$ref": "#/components/schemas/UpdateRequest",
            "description": "The update request for the lobby metadata."
          },
          "playerUpdates": {
            "type": "object",
            "nullable": true,
            "additionalProperties": {
              "type": "object",
              "$ref": "#/components/schemas/PlayerUpdateRequest"
            },
            "description": "A mapping from player IDs to player update requests."
          },
          "playersToAdd": {
            "type": "array",
            "nullable": true,
            "items": {
              "$ref": "#/components/schemas/Player"
            },
            "description": "An array of players to add to the lobby."
          },
          "playersToRemove": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "string"
            },
            "description": "An array of player IDs to remove from the lobby."
          },
          "ignoreIneffectualUpdates": {
            "type": "boolean",
            "nullable": true,
            "description": "Whether or not to silently ignore ineffectual updates (i.e. removing or updating players who are not in the lobby) instead of failing.",
            "default": false
          }
        },
        "additionalProperties": false,
        "description": "The body of a Bulk Update request."
      },
      "CreateRequest": {
        "type": "object",
        "required": [
          "name",
          "maxPlayers"
        ],
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 256,
            "description": "The name of the lobby that should be displayed to users.  All whitespace will be trimmed from the name."
          },
          "maxPlayers": {
            "type": "integer",
            "format": "int32",
            "description": "The maximum number of players that can be members of the lobby.",
            "minimum": 1,
            "maximum": 150
          },
          "isPrivate": {
            "type": "boolean",
            "nullable": true,
            "default": false,
            "description": "Whether or not the lobby is private.  Private lobbies do not appear in query results and cannot be fetched by non-members using the GetLobby API.  If the lobby is not publicly visible, the creator can share the `lobbyCode` with other users who can use it to join this lobby."
          },
          "isLocked": {
            "type": "boolean",
            "nullable": true,
            "default": false,
            "description": "Whether or not the lobby is locked.  If true, new players will not be able to join."
          },
          "player": {
            "$ref": "#/components/schemas/Player"
          },
          "password": {
            "type": "string",
            "minLength": 8,
            "maxLength": 64,
            "nullable": true,
            "description": "The password for this lobby. If specified, the lobby will be created with HasPassword set to true. All joins will be rejected unless provided password matches."
          },
          "data": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/DataObject"
            },
            "nullable": true,
            "maxProperties": 20,
            "description": "Custom game-specific properties that apply to the lobby (e.g. `mapName` or `gameType`)."
          }
        },
        "description": "The body of a Create Lobby request.",
        "example": {
          "name": "Example Lobby",
          "maxPlayers": 4,
          "isPrivate": false,
          "data": {
            "gameType": {
              "value": "KingOfTheHill",
              "index": "S1"
            },
            "targetPoints": {
              "value": "500",
              "index": "N1"
            },
            "mapTheme": {
              "value": "SummerHoliday",
              "visibility": "public"
            },
            "region": {
              "value": "USWest",
              "visibility": "private"
            }
          },
          "player": {
            "id": "VrFPilrfaCNovALjrjOXxS7luGxN",
            "data": {
              "preferredRole": {
                "value": "Support",
                "visibility": "member"
              },
              "preferredSkin": {
                "value": "BlueWhale",
                "visibility": "private"
              }
            }
          }
        }
      },
      "JoinByCodeRequest": {
        "type": "object",
        "properties": {
          "lobbyCode": {
            "type": "string",
            "minLength": 1,
            "pattern": "\\w+",
            "description": "The lobby code of the lobby to join.  Mutually exclusive with `id`.  This is used to join a private lobby where the lobby code was shared to other users manually."
          },
          "password": {
            "type": "string",
            "minLength": 8,
            "maxLength": 64,
            "nullable": true,
            "description": "The password to the target lobby. If target lobby HasPassword is true, this password must match or the request is denied."
          },
          "player": {
            "$ref": "#/components/schemas/Player"
          }
        },
        "required": [
          "lobbyCode"
        ],
        "description": "The body of a Join Lobby request using lobby code.",
        "additionalProperties": false
      },
      "JoinByIdRequest": {
        "type": "object",
        "properties": {
          "password": {
            "type": "string",
            "minLength": 8,
            "maxLength": 64,
            "nullable": true,
            "description": "The password to the target lobby. If target lobby HasPassword is true, this password must match or the request is denied."
          },
          "player": {
            "$ref": "#/components/schemas/Player"
          }
        },
        "description": "The body of a Join request",
        "additionalProperties": false
      },
      "QueryRequest": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "minimum": 1,
            "maximum": 100,
            "default": 10,
            "description": "The number of results to return.",
            "example": 25
          },
          "skip": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "minimum": 0,
            "maximum": 1000,
            "default": 0,
            "description": "The number of results to skip before selecting results to return.",
            "example": 20
          },
          "sampleResults": {
            "type": "boolean",
            "default": false,
            "description": "Whether a random sample of results that match the search filter should be returned."
          },
          "filter": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QueryFilter"
            },
            "description": "A list of filters which can be used to narrow down which lobbies to return."
          },
          "order": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QueryOrder"
            },
            "description": "A list of orders which define how the results should be ordered in the response.",
            "example": {
              "order": [
                {
                  "field": "MaxPlayers",
                  "asc": true
                },
                {
                  "field": "Name",
                  "asc": false
                }
              ]
            }
          },
          "continuationToken": {
            "type": "string",
            "nullable": true,
            "description": "A continuation token that can be passed to subsequent query requests to fetch the next page of results."
          }
        },
        "description": "The body of a Query request which defines how to sort and filter results, how many results to return, etc.",
        "example": {
          "filter": [
            {
              "field": "s1",
              "op": "EQ",
              "value": "rim_world"
            },
            {
              "field": "maxPlayers",
              "op": "GT",
              "value": "5"
            },
            {
              "field": "name",
              "op": "CONTAINS",
              "value": "steve's game"
            }
          ],
          "order": [
            {
              "field": "MaxPlayers",
              "asc": true
            },
            {
              "field": "Name",
              "asc": false
            }
          ]
        }
      },
      "PlayerProfile": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The player's name."
          }
        },
        "description": "A player's profile data from the Social Profile service.",
        "readOnly": true
      },
      "QueryFilter": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "enum": [
              "MaxPlayers",
              "AvailableSlots",
              "Name",
              "Created",
              "LastUpdated",
              "S1",
              "S2",
              "S3",
              "S4",
              "S5",
              "N1",
              "N2",
              "N3",
              "N4",
              "N5",
              "IsLocked",
              "HasPassword"
            ],
            "x-go-enum-ci": true,
            "description": "The name of the field to filter on.  For custom data fields, the name of the index must be used instead of the field name."
          },
          "value": {
            "type": "string",
            "description": "The value to compare to the field being filtered.  This value must be a string and it must be parsable as the same type as `field` (e.g. `integer` for MaxPlayers, `datetime` for Created, etc.).  The value for `datetime` fields (Created, LastUpdated) must be in RFC3339 format.  For example, in C# this can be achieved using the \"o\" format specifier: `return dateTime.ToString(\"o\", DateTimeFormatInfo.InvariantInfo);`.  Refer to your language documentation for other methods to generate RFC3339-compatible datetime strings."
          },
          "op": {
            "type": "string",
            "enum": [
              "CONTAINS",
              "EQ",
              "NE",
              "LT",
              "LE",
              "GT",
              "GE"
            ],
            "x-go-enum-ci": true,
            "description": "The operator used to compare the field to the filter value.  Supports `CONTAINS` (only on the `Name` field), `EQ` (Equal), `NE` (Not Equal), `LT` (Less Than), `LE` (Less Than or Equal), `GT` (Greater Than), and `GE` (Greater Than or Equal)."
          }
        },
        "required": [
          "field",
          "op",
          "value"
        ],
        "description": "A filter for an individual field that is applied to a query.",
        "example": {
          "field": "name",
          "op": "CONTAINS",
          "value": "steve's game"
        }
      },
      "QueryOrder": {
        "type": "object",
        "properties": {
          "asc": {
            "description": "Whether to sort in ascending or descending order.",
            "type": "boolean",
            "example": true
          },
          "field": {
            "description": "The name of the field to order on.",
            "type": "string",
            "enum": [
              "Name",
              "MaxPlayers",
              "AvailableSlots",
              "Created",
              "LastUpdated",
              "ID",
              "S1",
              "S2",
              "S3",
              "S4",
              "S5",
              "N1",
              "N2",
              "N3",
              "N4",
              "N5"
            ],
            "x-go-enum-ci": true,
            "example": "MaxPlayers"
          }
        },
        "description": "An order for an individual field that is applied to a query."
      },
      "QueryResponse": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Lobby"
            }
          },
          "continuationToken": {
            "type": "string",
            "nullable": true
          }
        },
        "description": "A list of lobbies that matched the specified query.  Only the public top-level data and player data properties are returned."
      },
      "QuickJoinRequest": {
        "type": "object",
        "properties": {
          "filter": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QueryFilter"
            },
            "description": "A list of filters which can be used to narrow down which lobbies to attempt to join."
          },
          "player": {
            "$ref": "#/components/schemas/Player"
          }
        },
        "description": "The body of a QuickJoin request.",
        "example": {
          "filter": [
            {
              "field": "s1",
              "op": "EQ",
              "value": "rim_world"
            },
            {
              "field": "maxPlayers",
              "op": "GT",
              "value": "5"
            },
            {
              "field": "name",
              "op": "CONTAINS",
              "value": "steve's game"
            }
          ],
          "player": {
            "id": "ExamplePlayerId"
          }
        }
      },
      "UpdateRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true,
            "minLength": 1,
            "maxLength": 256,
            "description": "The name of the lobby that should be displayed to users.  All whitespace will be trimmed from the name."
          },
          "maxPlayers": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "The maximum number of players that can be members of the lobby.  Must be greater than or equal to the current number of players in the lobby.",
            "minimum": 1,
            "maximum": 150
          },
          "isPrivate": {
            "type": "boolean",
            "nullable": true,
            "description": "Whether or not the lobby is private.  Private lobbies do not appear in query results and cannot be fetched by non-members using the GetLobby API.  If the lobby is not publicly visible, the creator can share the `lobbyCode` with other users who can use it to join this lobby."
          },
          "isLocked": {
            "type": "boolean",
            "nullable": true,
            "description": "Whether or not the lobby is locked.  If true, new players will not be able to join."
          },
          "password": {
            "type": "string",
            "minLength": 8,
            "maxLength": 64,
            "nullable": true,
            "description": "Updates the password for this lobby. If previously unspecified, HasPassword set to true. If becoming null, HasPassword will be set to false. All future joins will be rejected unless provided password matches."
          },
          "data": {
            "type": "object",
            "additionalProperties": {
              "type": "object",
              "nullable": true,
              "$ref": "#/components/schemas/DataObject"
            },
            "nullable": true,
            "description": "Custom game-specific properties to add, update, or remove from the lobby (e.g. `mapName` or `gameType`).  To remove an existing property, include it in `data` but set the property object to `null`.  To update the value to `null`, set the `value` property of the object to `null`."
          },
          "hostId": {
            "type": "string",
            "nullable": true,
            "description": "The ID of the player to make the host of the lobby.  As soon as this is updated, the current host will no longer have permission to modify the lobby."
          }
        },
        "additionalProperties": false,
        "description": "The body of an Update Lobby request.",
        "example": {
          "maxPlayers": 4,
          "data": {
            "keyToUpdate": {
              "visibility": "public",
              "value": "ctf"
            },
            "keyToGiveNullValue": {
              "visibility": "public",
              "value": null
            },
            "keyToRemove": null
          }
        }
      },
      "ErrorStatus": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "A URI that identifies the problem type and should provide documentation for the problem."
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "description": "The HTTP status code of the response."
          },
          "title": {
            "type": "string",
            "description": "A short, human-readable summary of the problem type.  It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization."
          },
          "detail": {
            "type": "string",
            "description": "A human-readable explanation specific to this occurrence of the problem."
          },
          "code": {
            "type": "integer",
            "format": "int32",
            "description": "An integer in the range 16000-16999 that uniquely identifies an error type.  This can be used to programmatically identify the type of error."
          },
          "details": {
            "type": "array",
            "description": "A list of additional details about specific errors.",
            "items": {
              "$ref": "#/components/schemas/Detail"
            }
          }
        },
        "description": "The body that will be returned for any failing request.  We are using the [RFC 7807 Error Format](https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1).",
        "example": {
          "status": 400,
          "title": "Invalid Lobby Object",
          "details": [
            {
              "errorType": "InvalidLobbyId",
              "message": "Lobby ID is invalid"
            },
            {
              "errorType": "InvalidLobbyPlayers",
              "message": "One or more of the players is invalid"
            }
          ]
        }
      },
      "Detail": {
        "type": "object",
        "properties": {
          "errorType": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "description": "Additional detail about an error.  This may include detailed validation failure messages, debugging information, troubleshooting steps, or more."
      },
      "TokenRequest": {
        "type": "object",
        "required": [
          "tokenType"
        ],
        "properties": {
          "tokenType": {
            "type": "string",
            "enum": [
              "vivoxJoin",
              "wireJoin"
            ],
            "x-go-enum-ci": true
          }
        },
        "description": "Details about a token being requested."
      },
      "TokenMap": {
        "type": "object",
        "description": "The map of token types to token data.",
        "additionalProperties": {
          "$ref": "#/components/schemas/TokenData"
        }
      },
      "TokenData": {
        "type": "object",
        "properties": {
          "tokenValue": {
            "type": "string",
            "description": "The value of the token."
          },
          "uri": {
            "type": "string",
            "description": "The URI of the token, if applicable."
          }
        },
        "description": "The data associated with the token.",
        "additionalProperties": false
      },
      "MigrationDataInfo": {
        "type": "object",
        "properties": {
          "write": {
            "type": "string",
            "description": "The migration data write url."
          },
          "read": {
            "type": "string",
            "description": "The migration data read url."
          },
          "expires": {
            "type": "string",
            "format": "date-time",
            "description": "When the urls will expire. The timestamp is in UTC and conforms to ISO 8601."
          },
          "maxSize": {
            "type": "integer",
            "description": "The max size of migration data in bytes."
          }
        },
        "description": "The migration data information of a lobby.",
        "additionalProperties": false
      }
    },
    "parameters": {
      "lobbyId": {
        "name": "lobbyId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "The ID of the lobby to execute the request against. It should be composed of 64 characters or less, and only have dashes, underscores and alphanumeric characters.",
        "example": "{{lobbyId}}"
      },
      "playerId": {
        "name": "playerId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "The ID of the player to execute the request against.",
        "example": "{{playerId}}"
      },
      "serviceId": {
        "name": "service-id",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "When service authentication is used, this provides a logical identity for the service",
        "example": "28081b0e-75b6-48a5-9c85-c11104e84055"
      },
      "impersonatedUserId": {
        "name": "impersonated-user-id",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "When service authentication is used, this provides a 'playerId' to execute as. If this header is detected, the service request will be identical to a request from the specified player.",
        "example": "4309750e-acb6-abcd-3565-b12201e67044"
      },
      "ifNoneMatch": {
        "name": "if-none-match",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The etag of the record being requested. Results/actions are only returned/executed when the current record version does not match the provided value.",
        "example": "42"
      },
      "ifMatch": {
        "name": "if-match",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The etag of the record being requested. Results/actions are only returned/executed when the current record version matches the provided value.",
        "example": "42"
      }
    },
    "responses": {
      "400": {
        "description": "Bad Request",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorStatus"
            },
            "example": {
              "status": 400,
              "title": "Invalid Lobby Object",
              "details": [
                {
                  "errorType": "InvalidLobbyId",
                  "message": "Lobby ID is invalid"
                },
                {
                  "errorType": "InvalidLobbyPlayers",
                  "message": "One or more of the players is invalid"
                }
              ]
            }
          }
        }
      },
      "403": {
        "description": "Forbidden",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorStatus"
            },
            "examples": {
              "NoPermission": {
                "value": {
                  "status": 403,
                  "title": "You do not have permission to perform that action"
                }
              }
            }
          }
        }
      },
      "404": {
        "description": "Not Found",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorStatus"
            },
            "examples": {
              "LobbyNotFound": {
                "value": {
                  "status": 404,
                  "title": "Lobby Not Found"
                }
              },
              "PlayerNotFound": {
                "value": {
                  "status": 404,
                  "title": "Player Not Found"
                }
              }
            }
          }
        }
      },
      "409": {
        "description": "Conflict",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorStatus"
            },
            "examples": {
              "LobbyFull": {
                "value": {
                  "status": 409,
                  "title": "Lobby is Full"
                }
              }
            }
          }
        }
      },
      "412": {
        "description": "Precondition Failed",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorStatus"
            },
            "examples": {
              "LobbyVersionDoesNotMatch": {
                "value": {
                  "status": 412,
                  "title": "Lobby version does not match"
                }
              }
            }
          }
        }
      },
      "429": {
        "description": "Too Many Requests",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorStatus"
            }
          }
        }
      },
      "500": {
        "description": "Internal Server Error",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorStatus"
            }
          }
        }
      }
    },
    "securitySchemes": {
      "Client": {
        "type": "http",
        "scheme": "bearer",
        "description": "To get started with Authentication, please visit the [Client Authentication section](https://services.docs.unity.com/docs/client-auth)."
      },
      "ServiceAccount": {
        "type": "http",
        "scheme": "bearer",
        "description": "To get started with Authentication, please visit the [Service Account Authentication section](https://services.docs.unity.com/docs/service-account-auth). When using a Service Account, these APIs require exchanging Service Account credentials for an access token; please see the section about the [Token Exchange API](https://services.docs.unity.com/docs/service-account-auth/index.html#extra-step-use-the-token-exchange-api)."
      }
    }
  },
  "security": [
    {
      "Client": []
    },
    {
      "ServiceAccount": []
    }
  ]
}
```