---
title: "Aggregated Agent Floor state (teams, agents, members)"
method: GET
path: "/floor/state"
tags: ["Floor"]
---

# Aggregated Agent Floor state (teams, agents, members)

`GET /floor/state`

## Request

- Base URL: `https://api.atako.ai`
- URL: `https://api.atako.ai/floor/state`
- Auth: HTTP bearer

Single-shot read for the Agent Floor 3D scene: your company's teams (with org-chart positions), non-completed agents (with a derived managerHumanId), and members. Open to any company member — admin and member get the exact same shape. 404 (not 403) when you have no company, so the route is invisible rather than merely blocked. The floor is open to every company.

## Response `200`

- FloorState: GET /floor/state — single-shot aggregated read for the Agent Floor 3D scene. Nothing stored anew: teams/positions and members come from getTeamsByCompanyId/listCompanyMembers, agents from a floor-specific minimal query.
  - `teams` FloorTeam[], required
    - `id` string, uuid, required
    - `name` string, required
    - `parentId` string, uuid, nullable, required
    - `companyId` string, uuid, nullable, required
    - `lead` FloorTeamLead, required: The team's accountable lead, already resolved through the organisation cascade (explicit lead, else the company's root admin) and named — never the raw lead_user_id/lead_agent_id columns.
      - `kind` 'human' | 'agent', required
      - `id` string, uuid, required
      - `name` string, required
    - `leadIsDefault` boolean, required: true when the team has no lead of its own and therefore falls back on the company's root manager — the same warning the org chart shows.
  - `agents` FloorAgent[], required
    - `id` string, uuid, required
    - `name` string, required
    - `status` 'active' | 'completed' | 'paused' | 'provisioning' | 'unresponsive' | 'failed', required
    - `teamId` string, uuid, nullable, required
    - `avatarSeed` string, required: agents.image — mascot filename in apps/web/public/aiygents.
    - `createdAt` string, date-time, required
    - `lastActivityAt` string, date-time, nullable, required: agents.lastHeartbeatAt.
    - `clientId` string, uuid, required: Owner — needed client-side to gate the Retry action to the owner.
    - `managerHumanId` string, uuid, nullable, required: Unique human holder of the parent teamPositions row of this agent's own position; null when the agent holds 0 or several positions, its position is a root, or its parent is vacant/agent-held.
    - `managerSource` 'own' | 'team' | 'company', nullable, required: Where managerHumanId comes from: an individual override on the agent (own), its team lead or team position (team), or the company root manager as a fallback (company).
    - `engine` 'openclaw' | 'hermes' | 'opencode', required: agents.engine — same value GET /agents serves, added here so the web no longer needs a parallel GET /agents call just for the floor’s harness chip.
  - `members` FloorMember[], required
    - `id` string, uuid, required
    - `name` string, required
    - `title` string, nullable, required
    - `teamId` string, uuid, nullable, required
    - `positions` FloorPosition[], required: Every position this member holds (a member may hold several, unlike an agent).
      - `teamId` string, uuid, required
      - `positionId` string, uuid, required
      - `title` string, required
    - `image` string, nullable, required: The member's own photograph (users.photo, a public Supabase Storage URL), or null when they never uploaded one — the client then draws their monogram.
  - `layout` FloorLayout, required: Stored floor arrangement (AF-41). Only what the automatic layout cannot infer: where each team platform sits, and which desk of its own team an occupant stands at. Reconciled at read time — entries whose id is no longer on the floor are stripped from the served document (never from the stored row).
    - `pods` object[], required
      - `teamId` string, uuid, required
      - `x` number, required: Pod centre, world units.
      - `z` number, required
    - `agents` object[], required: id = agentId, slot = desk index inside the pod of ITS OWN team (slot 0 of team A and slot 0 of team B are different desks).
      - `id` string, uuid, required
      - `slot` integer, required
    - `members` object[], required: id = userId, same slot semantics as `agents`.
      - `id` string, uuid, required
      - `slot` integer, required
  - `layoutVersion` integer, nullable, required: Optimistic version of the stored layout; null when there is none.

## Other responses

- `401`: Missing, malformed, or invalid bearer token / API key, or revoked session (SESSION_REVOKED).
- `404`: Not found, or the caller is not authorized to access this resource.

---

[API](https://skmtc.dev/atako/apis/atako-api.md) · [All operations](https://skmtc.dev/atako/apis/atako-api/llms.txt) · [OpenAPI document](https://skmtc.dev/atako/apis/atako-api/revisions/aa555c56fbd7?raw)
