---
title: "Replace the stored floor arrangement"
method: PUT
path: "/floor/layout"
tags: ["Floor"]
---

# Replace the stored floor arrangement

`PUT /floor/layout`

## Request

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

Replaces the whole document, creating the row on the company's first edit (version 1). Every id must belong to the caller's company and two occupants of the SAME team cannot share a `slot` — either breach is a 400 with an explicit message, never a silent drop. `version` is an optional optimistic lock: when given and no longer current, 409 Version conflict rather than overwriting a colleague's whole rearrangement.

## Request body

- object
  - `pods` object[]
    - `teamId` string, uuid, required
    - `x` number, required
    - `z` number, required
  - `agents` object[]
    - `id` string, uuid, required
    - `slot` integer, required: Desk index inside the pod of the occupant's own team.
  - `members` object[]
    - `id` string, uuid, required
    - `slot` integer, required: Desk index inside the pod of the occupant's own team.
  - `version` integer: Expected current version. Omit for last-writer-wins.

## Response `200`

- object
  - `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
  - `version` integer, required

## Other responses

- `400`: Malformed body, or an id/slot the company cannot accept.
- `401`: Missing, malformed, or invalid bearer token / API key, or revoked session (SESSION_REVOKED).
- `403`: Admin only — every floor write is reserved to a company admin.
- `404`: Not found, or the caller is not authorized to access this resource.
- `409`: Version conflict

---

[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)
