curl --request PUT \
--url https://api.atako.ai/floor/layout \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"pods": [
{
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"x": 123,
"z": 123
}
],
"agents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 99
}
],
"members": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 99
}
],
"version": 1
}
'import requests
url = "https://api.atako.ai/floor/layout"
payload = {
"pods": [
{
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"x": 123,
"z": 123
}
],
"agents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 99
}
],
"members": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 99
}
],
"version": 1
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
pods: [{teamId: '3c90c3cc-0d44-4b50-8888-8dd25736052a', x: 123, z: 123}],
agents: [{id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', slot: 99}],
members: [{id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', slot: 99}],
version: 1
})
};
fetch('https://api.atako.ai/floor/layout', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.atako.ai/floor/layout",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'pods' => [
[
'teamId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'x' => 123,
'z' => 123
]
],
'agents' => [
[
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'slot' => 99
]
],
'members' => [
[
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'slot' => 99
]
],
'version' => 1
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.atako.ai/floor/layout"
payload := strings.NewReader("{\n \"pods\": [\n {\n \"teamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"x\": 123,\n \"z\": 123\n }\n ],\n \"agents\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"members\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"version\": 1\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.atako.ai/floor/layout")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"pods\": [\n {\n \"teamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"x\": 123,\n \"z\": 123\n }\n ],\n \"agents\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"members\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"version\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atako.ai/floor/layout")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"pods\": [\n {\n \"teamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"x\": 123,\n \"z\": 123\n }\n ],\n \"agents\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"members\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"version\": 1\n}"
response = http.request(request)
puts response.read_body{
"layout": {
"pods": [
{
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"x": 123,
"z": 123
}
],
"agents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 123
}
],
"members": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 123
}
]
},
"version": 123
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}Replace the stored floor arrangement
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.
curl --request PUT \
--url https://api.atako.ai/floor/layout \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"pods": [
{
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"x": 123,
"z": 123
}
],
"agents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 99
}
],
"members": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 99
}
],
"version": 1
}
'import requests
url = "https://api.atako.ai/floor/layout"
payload = {
"pods": [
{
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"x": 123,
"z": 123
}
],
"agents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 99
}
],
"members": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 99
}
],
"version": 1
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
pods: [{teamId: '3c90c3cc-0d44-4b50-8888-8dd25736052a', x: 123, z: 123}],
agents: [{id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', slot: 99}],
members: [{id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', slot: 99}],
version: 1
})
};
fetch('https://api.atako.ai/floor/layout', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.atako.ai/floor/layout",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'pods' => [
[
'teamId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'x' => 123,
'z' => 123
]
],
'agents' => [
[
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'slot' => 99
]
],
'members' => [
[
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'slot' => 99
]
],
'version' => 1
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.atako.ai/floor/layout"
payload := strings.NewReader("{\n \"pods\": [\n {\n \"teamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"x\": 123,\n \"z\": 123\n }\n ],\n \"agents\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"members\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"version\": 1\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.atako.ai/floor/layout")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"pods\": [\n {\n \"teamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"x\": 123,\n \"z\": 123\n }\n ],\n \"agents\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"members\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"version\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atako.ai/floor/layout")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"pods\": [\n {\n \"teamId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"x\": 123,\n \"z\": 123\n }\n ],\n \"agents\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"members\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"slot\": 99\n }\n ],\n \"version\": 1\n}"
response = http.request(request)
puts response.read_body{
"layout": {
"pods": [
{
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"x": 123,
"z": 123
}
],
"agents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 123
}
],
"members": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slot": 123
}
]
},
"version": 123
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}Authorizations
An aik_… programmatic API key (app.atako.ai → Settings → API keys) or a Supabase session JWT.
Body
Response
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).
Show child attributes
Show child attributes