# Lobby Fields for AI Agents

> Lobby field ids for AI agents: the /play lobby's owner settings, game picker, setup options, deck picks, bots and the list of open tables to join.

- Question: Which lobby fields and buttons can an agent use?
- Source: https://diceytable.com/docs/ai-agents/reference/fields/lobby
- Last verified: 2026-10-09

These are the fields and buttons of a /play lobby. They cover the owner's settings and the game picker. They also cover setup options, deck picks, bots and the list of open tables.

## Panels in this group

8 panels, with the id prefix `lobby`. The [field catalogue](https://diceytable.com/docs/ai-agents/reference/fields) lists every group.

| Panel | Label | Tab | Fields | Actions |
|---|---|---|---|---|
| [`lobby.tables`](https://diceytable.com/docs/ai-agents/reference/fields/lobby#lobbytables) | Open tables | `lobby` | 1 | 7 |
| [`lobby.game-picker`](https://diceytable.com/docs/ai-agents/reference/fields/lobby#lobbygame-picker) | Game picker | `lobby` | 1 | 1 |
| [`lobby.room`](https://diceytable.com/docs/ai-agents/reference/fields/lobby#lobbyroom) | Lobby | `lobby` | 1 | 4 |
| [`lobby.owner`](https://diceytable.com/docs/ai-agents/reference/fields/lobby#lobbyowner) | Lobby owner settings | `lobby` | 8 | 3 |
| [`lobby.requirements`](https://diceytable.com/docs/ai-agents/reference/fields/lobby#lobbyrequirements) | Deck picks | `lobby` | 0 | 0 |
| [`lobby.setup-options`](https://diceytable.com/docs/ai-agents/reference/fields/lobby#lobbysetup-options) | Game setup options | `lobby` | 0 | 2 |
| [`lobby.bots`](https://diceytable.com/docs/ai-agents/reference/fields/lobby#lobbybots) | Lobby bots | `lobby` | 1 | 3 |
| [`lobby.bots.add`](https://diceytable.com/docs/ai-agents/reference/fields/lobby#lobbybotsadd) | Add bot | `lobby` | 2 | 1 |

## `lobby.tables`

**Open tables** · surface `lobby` · singleton (no target)

How it opens: /play/tables.

**Fields** (1)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `lobby.tables.search` | Search tables | `text` | — | — | W | — | Filter the open-tables list by table, game or host name (client-side, as typed). |

**Actions** (7)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `lobby.tables.refresh` | Refresh | R | — | Reload the open-tables list. |
| `lobby.tables.start-lobby` | Start a lobby | R | — | Go to the game picker (/play/lobby). Nothing is created until a game is picked. |
| `lobby.tables.my-tables-refresh` | Refresh | R | — | Reload the list of tables this user owns. |
| `lobby.tables.my-tables-more` | Show more | R | — | Load the next page of this user's tables. |
| `lobby.tables.delete.ask` | Delete… | R | `room` | Owner: open the delete-table dialog. Nothing is deleted yet. Target: the table's room id. |
| `lobby.tables.delete.cancel` | Cancel | R | `room` | Close the delete-table dialog without deleting. Target: the table's room id. |
| `lobby.tables.delete.confirm` | Delete table | H | `room` | Requires the user's confirmation in the DiceyTable tab. Owner: delete the table and every saved snapshot of it for everyone, permanently; invites to it stop working. Refused while players are at the table unless the human ticked the acknowledgement. Target: the table's room id. |

## `lobby.game-picker`

**Game picker** · surface `lobby` · singleton (no target)

How it opens: /play/tables ▸ Create lobby.

**Fields** (1)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `lobby.game-picker.search` | Search games | `text` | — | — | W | — | Search every published game pack; results show as tiles below (picking one is lobby_create). |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `lobby.game-picker.start-blank` | Start a blank table | W | — | Create a lobby with no game chosen yet (a game can still be picked inside it), and open it. |

## `lobby.room`

**Lobby** · surface `lobby` · target `lobby`

How it opens: /play/lobby/:id — roster, ready, role, Start.

**Fields** (1)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `lobby.room.invite-link` | Invite link | `text` | — | `lobby` | W | — | The lobby's share link (read-only). The same URL keeps working after Start. |

**Actions** (4)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `lobby.room.play` | Play | W | `lobby` | Take a player seat in this lobby. |
| `lobby.room.spectate` | Spectate | W | `lobby` | Take a spectator seat (disabled when the room is closed to spectators). |
| `lobby.room.ready` | I'm ready | W | `lobby` | Toggle this user's ready flag. Advisory: Start never waits on it. |
| `lobby.room.start` | Start the game | W | `lobby` | Start the game (owner only). Disabled while a required lobby choice is outstanding; everyone is then taken into the table. |

## `lobby.owner`

**Lobby owner settings** · surface `lobby` · target `lobby`

How it opens: The lobby's owner panel (owner only).

**Fields** (8)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `lobby.owner.name` | Room name | `text` | — | `lobby` | W | — | The lobby's display name (a draft until Save — `lobby.owner.save`). Owner only. |
| `lobby.owner.max-players` | Player seats | `integer` | — | `lobby` | W | ≥ 1, ≤ 10, step 1 | Seat cap (a draft until Save — `lobby.owner.save`). The server also enforces the game's own declared bounds and names them when it refuses. Owner only. |
| `lobby.owner.spectators-allowed` | Allow spectators | `boolean` | — | `lobby` | W | — | Whether members may take a spectator seat. Saved immediately; closing it demotes any seated spectator. Owner only. |
| `lobby.owner.seat-selection` | Seat selection | `select` | — | `lobby` | W | `choice`, `random` | How players get their seats at the table: `choice` — each player picks a free seat; `random` — the host deals each player a random free seat and players cannot change it (the host still can). Saved immediately; locked once the game has started. Owner only. |
| `lobby.owner.visibility` | Who can see this lobby | `select` | — | `lobby` | H | `public`, `friends`, `private` | Room visibility, saved immediately. H: the user confirms in the tab. Friends-only and private need a membership; the server refuses otherwise. |
| `lobby.owner.variant` | Variant | `select` | — | `lobby` | W | — | Which of the game's declared variants this lobby will start. Saved immediately; the server may clear a seat cap the variant cannot seat. Shown only when the game declares two or more variants; locked once the game has started. Owner only (lobby_set_variant is the same write). |
| `lobby.ranked` | Ranked | `boolean` | — | `lobby` | W | — | Whether this lobby starts a RANKED match (game-ratings plan §4.8). Saved immediately. Shown only when the chosen variant offers Ranked; locked once the game has started. The server refuses it for a variant without ranking, for an owner without a Player or Game Master membership (ranked play is a paid feature), and for a trust-locked owner. Turning it on does not start anything: Start then refuses while any member or table blocker remains. Owner only. |
| `lobby.owner.game-search` | Search games | `text` | — | `lobby` | W | — | Search box of the owner's Change game chooser (open it with `lobby.owner.change-game`). Picking a result is lobby_set_game. |

**Actions** (3)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `lobby.owner.save` | Save | W | `lobby` | Save the room name and seat cap drafts. |
| `lobby.owner.change-game` | Change game | R | `lobby` | Open (or close) the owner's game chooser. Changing the game itself is lobby_set_game. |
| `lobby.owner.password-remove` | Remove password | H | `lobby` | Requires the user's confirmation in the DiceyTable tab. Remove the lobby's join password, so anyone with the link can join. |

## `lobby.requirements`

**Deck picks** · surface `lobby` · target `lobby`

How it opens: The lobby's per-player requirements panel.

_No field or action is registered on this panel yet. `panel_open` can still open it, and `describe_panel` / `screenshot_panel` can read it._

## `lobby.setup-options`

**Game setup options** · surface `lobby` · target `lobby`

How it opens: The lobby's setup-options panel.

**Per-instance field families**

| Id pattern | Materialised from |
|---|---|
| `lobby.setup.<key>` | One field per setup option the chosen game's manifest declares (`setupOptions[].key`), bound per lobby. Values are checked with the lobby's own rule; the draft is saved by `lobby.setup-options.save`, or in one step by `lobby_setup_options_set`. |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `lobby.setup-options.save` | Save options | W | `lobby` | Save the game's setup options as edited in the form (owner only). |
| `lobby.setup-options.discard` | Discard | W | `lobby` | Throw away unsaved edits in the setup-options form. |

## `lobby.bots`

**Lobby bots** · surface `lobby` · target `lobby`

How it opens: The lobby's Bots block under the roster (shown when the game declares bots, or a bot is seated).

**Fields** (1)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `lobby.bots.difficulty` | Difficulty | `select` | — | `peer` | W | — | How strong one seated bot plays. Saved immediately. Target: the bot's peer id (`bot:<id>`, from lobby_state's bots). Shown only for a bot that declares difficulties; owner only, before Start (lobby_bot_set_difficulty is the same write). |

**Actions** (3)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `lobby.bots.open-add` | Add bot | R | `lobby` | Open the Add bot dialog (owner only; shown when the lobby's game declares bots). Nothing is added until `lobby.bots.add.confirm` — or use lobby_bot_add. |
| `lobby.bots.remove` | Remove bot | W | `peer` | Remove one bot from the lobby (owner only, before Start). Target: the bot's peer id (`bot:<id>`). The bot can be added again; no person is affected. |
| `lobby.bots.retest-device` | Re-test device | W | `lobby` | Measure again what this device can do for an AI bot, and report the result to the lobby. Runs a short benchmark; the first run downloads about 14 MB (more with a graphics card). Read the result with hardware_tier_get. |

## `lobby.bots.add`

**Add bot** · surface `lobby` · target `lobby`

How it opens: Lobby ▸ Bots ▸ Add bot (owner only, before Start); a dialog.

**Fields** (2)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `lobby.bots.add.bot` | Bot | `select` | — | `lobby` | W | — | Which of the game's declared bots to add (a draft until `lobby.bots.add.confirm`). Each option says whether the bot is scripted or runs an AI model, and what device an AI one needs. Owner only. |
| `lobby.bots.add.difficulty` | Difficulty | `select` | — | `lobby` | W | — | The difficulty the new bot starts at (a draft until `lobby.bots.add.confirm`); defaults to the bot's own default. Shown only when the chosen bot declares difficulties. Owner only. |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `lobby.bots.add.confirm` | Add | W | `lobby` | Add the bot chosen in the Add bot dialog, at the chosen difficulty (owner only). The server refuses a bot the game does not declare, one bot too many, or a lobby with no seat left, and says why. |
