POST
/
lobbies
/
{id}
/
players
Add a player to a lobby (join)
curl --request POST \
  --url https://api.scale.computeflow.cloud/lobbies/{id}/players \
  --header 'Content-Type: application/json' \
  --data '{
  "playerId": "player123",
  "metadata": {
    "name": "PlayerOne",
    "avatar": "avatar_url",
    "preferences": {
      "team": "red"
    }
  }
}'
{
  "id": "e495d158-5d18-45e4-81b2-384790a8b830",
  "name": "Pro Players Only",
  "host": "player123",
  "maxPlayers": 8,
  "currentPlayers": 3,
  "region": "us-west",
  "status": "waiting",
  "isPrivate": false,
  "useInviteCode": false,
  "inviteCode": "abc123",
  "allowLateJoin": true,
  "settings": {
    "gameMode": "capture-the-flag",
    "timeLimit": 300,
    "teamSize": 4,
    "mapRotation": [
      "map1",
      "map2"
    ]
  },
  "players": [
    "player123",
    "player456",
    "player789"
  ],
  "lobbyStateRealTime": {
    "player123": {
      "position": {
        "x": 100,
        "y": 20
      },
      "health": 80
    },
    "player456": {
      "position": {
        "x": 200,
        "y": 30
      },
      "health": 95
    }
  },
  "gameServer": {
    "instance_id": "srv-a1b2c3d4",
    "name": "lobby-1698754321",
    "network_ports": [
      {
        "name": "game",
        "internal_port": 7777,
        "external_port": 30000,
        "protocol": "udp",
        "host": "203.0.113.42",
        "tls_enabled": false
      },
      {
        "name": "web",
        "internal_port": 8080,
        "external_port": 30001,
        "protocol": "tcp",
        "host": "203.0.113.42",
        "tls_enabled": true
      }
    ],
    "status": "running",
    "startup_args": "--mode capture-the-flag --map castle",
    "service_type": "match_based",
    "compute_size": "small",
    "region": "us-west",
    "version_tag": "v1.0.2",
    "started_at": "2023-10-31T15:30:00Z",
    "stopped_at": null,
    "custom_data": {
      "gameMode": "capture-the-flag",
      "mapName": "castle",
      "teamSize": 4,
      "scoreLimit": 10
    },
    "ttl": 3600
  },
  "timeout": 300,
  "matchmakingMode": "ranked_5v5",
  "matchmakingStartedAt": "2023-08-15T14:30:00.000Z",
  "matchmakingTicketId": "ticket-a1b2c3d4",
  "matchmakingData": {
    "mmr": 1200,
    "tier": "gold"
  },
  "createdAt": "2023-08-15T14:30:00.000Z",
  "updatedAt": "2023-08-15T15:45:00.000Z"
}

Path Parameters

id
string
required

Lobby ID

Query Parameters

name
string
required

Name of the lobby configuration this lobby belongs to

Body

application/json
playerId
string
required

ID of the player to add to the lobby

Example:

"player123"

metadata
object

Optional metadata about the player

Example:
{
"name": "PlayerOne",
"avatar": "avatar_url",
"preferences": { "team": "red" }
}

Response

Player successfully added to the lobby

id
string<uuid>
required

Unique identifier for the lobby

Example:

"e495d158-5d18-45e4-81b2-384790a8b830"

name
string
required

Name of the lobby displayed to players

Maximum length: 255
Example:

"Pro Players Only"

host
string
required

ID of the player who is the current host

Maximum length: 255
Example:

"player123"

maxPlayers
number
default:8
required

Maximum number of players allowed in the lobby

Required range: 1 <= x <= 100
Example:

8

currentPlayers
number
default:0
required

Current number of players in the lobby

Example:

3

region
string
default:us-west
required

Geographic region for the lobby server

Example:

"us-west"

status
enum<string>
default:waiting
required

Current status of the lobby

Available options:
waiting,
in_queue,
match_found,
in_game,
finished
Example:

"waiting"

isPrivate
boolean
default:false
required

Whether the lobby is private (requires invite code to join)

Example:

false

useInviteCode
boolean
default:false
required

Whether to generate an invite code for this lobby (always true for private lobbies)

Example:

false

inviteCode
string | null
required

Invite code for private lobbies or public lobbies with useInviteCode=true

Maximum length: 10
Example:

"abc123"

allowLateJoin
boolean
default:true
required

Whether players can join after the game has started

Example:

true

settings
object | null
required

Custom game settings for this lobby

Example:
{
"gameMode": "capture-the-flag",
"timeLimit": 300,
"teamSize": 4,
"mapRotation": ["map1", "map2"]
}
players
string[] | null
required

Array of player IDs currently in the lobby

Example:
["player123", "player456", "player789"]
lobbyStateRealTime
object | null
required

Real-time state information for each player, indexed by player ID

Example:
{
"player123": {
"position": { "x": 100, "y": 20 },
"health": 80
},
"player456": {
"position": { "x": 200, "y": 30 },
"health": 95
}
}
gameServer
object | null
required

Game server information returned from PlayFlow API when a game is running. Contains all connection details, server state, and metadata.

Example:
{
"instance_id": "srv-a1b2c3d4",
"name": "lobby-1698754321",
"network_ports": [
{
"name": "game",
"internal_port": 7777,
"external_port": 30000,
"protocol": "udp",
"host": "203.0.113.42",
"tls_enabled": false
},
{
"name": "web",
"internal_port": 8080,
"external_port": 30001,
"protocol": "tcp",
"host": "203.0.113.42",
"tls_enabled": true
}
],
"status": "running",
"startup_args": "--mode capture-the-flag --map castle",
"service_type": "match_based",
"compute_size": "small",
"region": "us-west",
"version_tag": "v1.0.2",
"started_at": "2023-10-31T15:30:00Z",
"stopped_at": null,
"custom_data": {
"gameMode": "capture-the-flag",
"mapName": "castle",
"teamSize": 4,
"scoreLimit": 10
},
"ttl": 3600
}
timeout
number
default:300
required

Time in seconds before the lobby auto-closes due to inactivity

Required range: 60 <= x <= 3600
Example:

300

matchmakingMode
string | null
required

Current matchmaking mode for this lobby

Example:

"ranked_5v5"

matchmakingStartedAt
string<date-time> | null
required

Timestamp when matchmaking started

Example:

"2023-08-15T14:30:00.000Z"

matchmakingTicketId
string | null
required

Matchmaking ticket ID from the matchmaking service

Example:

"ticket-a1b2c3d4"

matchmakingData
object | null
required

Data used for matchmaking, such as average skill or rank.

Example:
{ "mmr": 1200, "tier": "gold" }
createdAt
string<date-time>
required

Timestamp when this lobby was created

Example:

"2023-08-15T14:30:00.000Z"

updatedAt
string<date-time>
required

Timestamp when this lobby was last updated

Example:

"2023-08-15T15:45:00.000Z"