REST API
EOS Hub má REST API pre integrácie -- automatizačné nástroje ako n8n alebo Zapier, skripty na reporty, tabuľky alebo vlastné aplikácie. Vracia tie isté dáta, aké vidíte vo webovej aplikácii, vo formáte JSON.
Rozsah
Všetko, čo môžete robiť vo webovej aplikácii, je dostupné aj cez API:
- Dáta tímu -- čítanie aj zápis úloh, problémov, Rocks s ich míľnikmi, ukazovateľov Scorecardu s ich týždennými hodnotami, stretnutí s hodnoteniami, segue, novinkami (headlines) a kaskádovými správami, V/TO, organizačnej štruktúry, hodnotení ľudí a odkazov v dokumentoch -- pozri Endpointy a Zápis dát.
- Správa organizácie a tímov -- nastavenia organizácie, jej členovia, tímy a členovia tímov -- pozri Správa organizácie.
- Správa platformy -- organizácie, kontá, API kľúče používateľov a nastavenia AI pre prevádzkovateľa platformy -- pozri Správa platformy.
Jedinou výnimkou je správa vašich vlastných API kľúčov: tie vytvárate a odvolávate len v prihlásenej webovej aplikácii (pozri API kľúče).
| Základná URL | https://<vas-server>/api/v1 |
| Interaktívna referencia | https://<vas-server>/api/v1/docs -- prehľad všetkých endpointov s možnosťou vyskúšať volania s vlastným kľúčom |
| OpenAPI špecifikácia | https://<vas-server>/api/v1/openapi.json (OpenAPI 3.1) -- pre generátory kódu a API klientov |
| Autentifikácia | Authorization: Bearer ak_… (osobný API kľúč) |
| Formát | JSON, názvy polí v tvare camelCase |
<vas-server> je adresa vašej inštalácie EOS Hub -- tá istá, ktorú otvárate v prehliadači.
Autentifikácia a API kľúče
Každá požiadavka potrebuje osobný API kľúč v hlavičke Authorization:
Authorization: Bearer ak_k3m7q2xa_Vq0…Kľúče vytvoríte vo webovej aplikácii v Nastavenia > API kľúče -- podrobný postup nájdete na stránke API kľúče. Stručne:
- Celý kľúč sa zobrazí iba raz, hneď po vytvorení. EOS Hub si ukladá len jeho odtlačok (hash), takže stratený kľúč sa nedá obnoviť -- odvolajte ho a vytvorte nový.
- Prijímajú sa iba API kľúče. Prihlásenie v prehliadači pre
/api/v1nefunguje a kľúče sa dajú vytvoriť alebo odvolať len v prihlásenej webovej aplikácii, nikdy cez API. - Na chýbajúci, chybný, expirovaný alebo odvolaný kľúč API odpovie
401 unauthenticated.
Kľúč koná vo vašom mene
Kľúč nemá vlastné oprávnenia. Koná v mene svojho vlastníka s jeho aktuálnymi rolami v organizáciách a tímoch, ktoré sa overujú pri každej požiadavke:
- API vráti presne to, čo by ste videli vo webovej aplikácii -- Člen organizácie len svoje tímy, Vlastníci, Administrátori a Implementátori všetky tímy organizácie.
- Ak vás odoberú z organizácie alebo tímu, vaše kľúče k nim okamžite stratia prístup.
- V pozastavenej organizácii môžu kľúče naďalej čítať, ale každú zmenu API odmietne s
409 orgSuspended. - Ani kľúče prevádzkovateľa platformy nemajú automatický prístup k údajom zákazníkov -- rovnako ako vo webovej aplikácii vidí organizáciu len vtedy, ak je jej členom.
Rozsahy (scopes)
Rozsahy kľúča obmedzujú, čo smie robiť, nad rámec vašich rolí:
| Rozsah | Povoľuje | Kto ho môže vytvoriť |
|---|---|---|
read | Čítanie všetkého, čo vaše roly dovoľujú | Každý (Len čítanie v dialógu vytvorenia) |
write | Vytváranie a úpravu dát podľa vašich rolí; zahŕňa aj read | Každý (Čítanie a zápis) |
platform | Správu platformy | Len prevádzkovatelia platformy (SUPERADMIN); platnosť najviac 90 dní |
Ak kľúču chýba potrebný rozsah, API odpovie 403 insufficientScope. Kľúč s rozsahom platform prestane pre správu platformy fungovať, keď jeho vlastník prestane byť prevádzkovateľom platformy. Čítanie potrebuje read; vytváranie, zmeny a mazanie dát potrebujú write (kľúč Čítanie a zápis).
Prvé volania
Kľúč si uložte do premennej prostredia namiesto toho, aby ste ho písali do každého príkazu. read -s kľúč nezobrazí a neuloží ho do histórie príkazov:
read -rsp "API kľúč: " EOSHUB_KEY && export EOSHUB_KEY # vložte kľúč a stlačte Enter
export BASE="https://<vas-server>/api/v1"1. Kto som? GET /me vráti vaše konto, vaše organizácie s vašou rolou v každej z nich a rozsahy použitého kľúča:
curl -s -H "Authorization: Bearer $EOSHUB_KEY" "$BASE/me"{
"user": { "id": "cmg4x…", "email": "jana@acme.com", "name": "Jana Nováková", "timezone": null },
"orgs": [{ "id": "cmg1a…", "name": "Acme Corp", "status": "ACTIVE", "role": "OWNER" }],
"scopes": ["read"],
"key": { "id": "cmg9k…", "name": "n8n reporty", "expiresAt": "2027-01-04T09:12:44.000Z" }
}2. Tímy organizácie. Z odpovede si vezmite id organizácie:
curl -s -H "Authorization: Bearer $EOSHUB_KEY" "$BASE/orgs/cmg1a…/teams"{
"data": [
{ "id": "cmg2b…", "name": "Vedenie", "slug": "vedenie", "isLeadership": true },
{ "id": "cmg2c…", "name": "Marketing", "slug": "marketing", "isLeadership": false }
],
"nextCursor": null
}3. Otvorené úlohy tímu. Úlohy (To-Dos) sa v API volajú tasks:
curl -s -H "Authorization: Bearer $EOSHUB_KEY" "$BASE/teams/cmg2b…/tasks?completed=false"{
"data": [
{
"id": "cmg7t…",
"teamId": "cmg2b…",
"title": "Poslať cenovú ponuku na Q3",
"ownerId": "cmg4x…",
"dueDate": "2026-10-13",
"completed": false,
"completedAt": null,
"meetingId": "cmg6m…",
"createdAt": "2026-10-06T08:41:02.000Z"
}
],
"nextCursor": null
}TIP
Interaktívna referencia ukazuje úplnú schému odpovede každého endpointu. Keď v nej zadáte svoj kľúč, môžete volania skúšať priamo v prehliadači.
Stránkovanie
Zoznamy sa vracajú po stránkach:
{ "data": [ … ], "nextCursor": "eyJrIjoiMjAyNi0xMC0wNlQwODo0MTowMi4wMDBaIiwiaWQiOiJjbWc3dCJ9" }| Parameter | Popis |
|---|---|
limit | Veľkosť stránky, 1--200 (predvolene 50) |
cursor | Hodnota nextCursor z predchádzajúcej stránky; pri prvej stránke ho vynechajte |
Keď je nextCursor rovný null, ste na poslednej stránke.
API používa stránkovanie kurzorom: kurzor označuje poslednú položku, ktorú ste dostali, a ďalšia stránka pokračuje hneď za ňou. Na rozdiel od čísel stránok zostáva stabilné, aj keď počas prechádzania niekto položky pridáva alebo maže -- nedostanete duplicity ani nevynecháte položky. Na druhej strane nemôžete skočiť priamo na N-tú stránku; stránky prechádzate postupne. Kurzor berte ako nepriehľadný reťazec a pri všetkých stránkach používajte rovnaké filtre.
Niekoľko malých zoznamov -- organizácie, tímy organizácie, ukazovatele Scorecardu, pozície organizačnej štruktúry a na platforme API kľúče používateľa -- vždy vráti všetko naraz s nextCursor: null.
Načítanie všetkých stránok:
cursor=""
while :; do
page=$(curl -s -H "Authorization: Bearer $EOSHUB_KEY" \
"$BASE/teams/$TEAM_ID/tasks?limit=200${cursor:+&cursor=$cursor}")
echo "$page" | jq -r '.data[] | "\(.dueDate) \(.title)"'
cursor=$(echo "$page" | jq -r '.nextCursor // empty')
[ -z "$cursor" ] && break
doneconst BASE = "https://<vas-server>/api/v1"
async function* listAll(path, params = {}) {
let cursor = null
do {
const url = new URL(BASE + path)
for (const [k, v] of Object.entries({ ...params, limit: 200 })) url.searchParams.set(k, v)
if (cursor) url.searchParams.set("cursor", cursor)
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.EOSHUB_KEY}` } })
const body = await res.json()
if (!res.ok) throw new Error(`${res.status} ${body.error.code}: ${body.error.message}`)
yield* body.data
cursor = body.nextCursor
} while (cursor)
}
for await (const task of listAll(`/teams/${teamId}/tasks`, { completed: "false" })) {
console.log(task.dueDate, task.title)
}Chyby
Chyby používajú štandardné HTTP stavové kódy a JSON telo so strojovo čitateľným code. Texty message sú vždy v angličtine:
{
"error": {
"code": "invalid",
"message": "The request is invalid",
"issues": [
{
"origin": "number",
"code": "too_big",
"maximum": 200,
"inclusive": true,
"path": ["limit"],
"message": "Too big: expected number to be <=200"
}
]
}
}| HTTP | code | Význam |
|---|---|---|
| 401 | unauthenticated | Chýbajúci, chybný, expirovaný alebo odvolaný API kľúč |
| 403 | forbidden | Vaše roly nepovoľujú prístup k tejto organizácii alebo tímu, alebo túto zmenu |
| 403 | insufficientScope | Rozsahy kľúča túto operáciu nepovoľujú |
| 404 | notFound | Položka neexistuje alebo ju nevidíte |
| 409 | orgSuspended | Organizácia je pozastavená (len na čítanie) -- každá zmena sa odmietne |
| 409 | ratingClosed | Stretnutie sa teraz nedá hodnotiť: ešte nezačalo (SCHEDULED -- platí pre všetkých vrátane Administrátorov tímu), alebo sa pre vaše vlastné hodnotenie zatvorilo okno na hodnotenie (členovia tímu, ktorí nie sú jeho Administrátormi). Pozri Stretnutia |
| 422 | invalid | Neplatné parametre alebo telo; pri chybách formátu issues vypisuje problémy po jednotlivých poliach (pozri Validácia) |
| 429 | rateLimited | Priveľa požiadaviek -- pozri Limit požiadaviek |
| 500 | internal | Neočakávaná chyba servera (bez podrobností) |
Položky, ku ktorým nemáte prístup. Zoznamy pod tímom alebo organizáciou, ku ktorým nemáte prístup -- napríklad /teams/{teamId}/tasks -- vrátia 403 forbidden. Jednotlivé položky podľa id -- /tasks/{id}, /issues/{id}, /goals/{id}, /meetings/{id}, /metrics/{id}/values -- naopak vrátia 404 notFound, aby id z iných organizácií nič neprezradili.
Pri zmenách je to inak: PATCH, PUT alebo DELETE existujúcej položky, ktorú nesmiete meniť -- napríklad úlohy tímu, v ktorom ste Pozorovateľ -- vráti 403 forbidden. Id, ktoré neexistuje, vráti 404 notFound.
Každá odpoveď vrátane chýb obsahuje hlavičku X-Request-Id. Uveďte ju pri nahlasovaní problému -- prevádzkovateľ podľa nej nájde požiadavku v logoch servera.
Limit požiadaviek
Každý API kľúč smie poslať 120 požiadaviek za minútu. Nad tento limit API odpovie 429 rateLimited s hlavičkou Retry-After -- počtom sekúnd do začiatku ďalšej minúty. Toľko počkajte a pokračujte. Limit platí pre každý kľúč zvlášť, preto by rôzne integrácie mali používať rôzne kľúče.
TIP
Ak potrebujete celé zoznamy, použite limit=200 -- jedna požiadavka na 200 položiek namiesto štyroch.
Formáty dát
| Druh | Formát | Príklad |
|---|---|---|
| Názvy polí | camelCase | dueDate, isLeadership |
| Id | Nepriehľadné reťazce | "cmg7t…" |
| Časové okamihy (vytvorenie, dokončenie, začiatok …) | ISO 8601, UTC | "2026-10-06T14:30:00.000Z" |
| Kalendárne dni (termíny, deň stretnutia, týždeň ukazovateľa) | YYYY-MM-DD, bez časového pásma | "2026-10-07" |
| Kvartály | YYYY-Qn | "2026-Q3" |
| Hodnoty enumov | UPPER_CASE | OPEN, ON_TRACK, COMPLETED |
| Chýbajúce hodnoty | null (polia sú vždy prítomné) | "completedAt": null |
Kalendárne dni sa medzi časovými pásmami neposúvajú -- úloha s termínom 2026-10-07 má termín v ten deň všade. Filtre from, to a quarter používajú rovnaké formáty.
Niektoré polia sa vracajú tak, ako sú uložené v aplikácii:
- Cieľ ukazovateľa si zachováva operátor porovnania, napr.
">100000"alebo"<5", a hodnoty ukazovateľov sú reťazce. - Polia V/TO majú každé pevný tvar: zoznam textov, objekt alebo text (pozri V/TO).
coreValuesScoresagwchodnotenia ľudí sú JSON objekty.
Verzia API je súčasťou URL (/v1). Do odpovedí môžu pribudnúť nové polia bez novej verzie, preto by vaša integrácia mala neznáme polia ignorovať.
EOS pojmy v API
Webová aplikácia používa EOS terminológiu. API používa neutrálne názvy, aby boli integrácie zrozumiteľné aj vývojárom, ktorí EOS nepoznajú:
| V EOS Hub | V API |
|---|---|
| Organizácia, tím | orgs, teams |
| Úloha (To-Do) | tasks |
| Problém (Issue) | issues |
| Rock, míľnik | goals (míľniky sú vnorené v každom cieli) |
| Ukazovateľ Scorecardu, týždenná hodnota | metrics, metrics/{id}/values |
| L10 stretnutie | meetings (s ratings, segues, headlines, messages) |
| V/TO | vision |
| Organizačná štruktúra (Accountability Chart) | org-chart (pozície) |
| Hodnotenie ľudí (People Analyzer) | people-reviews |
| Dokumenty | documents |
Endpointy
Endpointy v tejto časti dáta čítajú: používajú GET a potrebujú rozsah read -- okrem endpointov platformy, ktoré potrebujú platform. Stránkované zoznamy okrem uvedených filtrov prijímajú aj limit a cursor. Endpointy, ktoré dáta menia, nájdete v častiach Zápis dát, Správa organizácie a Správa platformy.
Konto a organizácie
| Endpoint | Vracia | Filtre |
|---|---|---|
/me | Vaše konto, organizácie s vašou rolou a rozsahy kľúča | -- |
/orgs | Vaše organizácie s vašou rolou v každej z nich | -- |
/orgs/{orgId} | Jednu organizáciu | -- |
/orgs/{orgId}/members | Všetkých členov organizácie s ich rolou v organizácii (stránkované). Len pre Vlastníkov a Administrátorov organizácie -- ostatní členovia vidia členov svojich tímov cez /teams/{teamId}/members | -- |
/orgs/{orgId}/teams | Tímy organizácie, ktoré vidíte | -- |
Tímy
| Endpoint | Vracia | Filtre |
|---|---|---|
/teams/{teamId} | Jeden tím vrátane nastavení dĺžky stretnutí | -- |
/teams/{teamId}/members | Členov tímu s ich tímovou rolou (stránkované) | -- |
Dáta tímu
| Endpoint | Vracia | Filtre |
|---|---|---|
/teams/{teamId}/tasks | Úlohy (stránkované) | completed (true/false), ownerId |
/tasks/{id} | Jednu úlohu | -- |
/teams/{teamId}/issues | Problémy (stránkované) | status (OPEN, SOLVING, SOLVED), priority (HIGH, MEDIUM, LOW) |
/issues/{id} | Jeden problém | -- |
/teams/{teamId}/goals | Rocks s míľnikmi (stránkované) | quarter (2026-Q3), status (ON_TRACK, OFF_TRACK, DONE), level (COMPANY, DEPARTMENT) |
/orgs/{orgId}/goals | Firemné Rocks organizácie, viditeľné pre všetkých jej členov (stránkované) | quarter, status |
/goals/{id} | Jeden Rock s míľnikmi (firemné Rocks môže čítať každý člen organizácie) | -- |
/teams/{teamId}/metrics | Ukazovatele Scorecardu | -- |
/metrics/{id}/values | Týždenné hodnoty ukazovateľa, od najstaršej (stránkované) | from, to (dni, vrátane) |
/teams/{teamId}/meetings | Stretnutia od najnovšieho, každé so súhrnom hodnotenia (stránkované) | status (SCHEDULED, IN_PROGRESS, COMPLETED) |
/meetings/{id} | Jedno stretnutie s poznámkami, hodnoteniami, segue, novinkami (headlines), kaskádovými správami a oknom na hodnotenie | -- |
/teams/{teamId}/vision | V/TO tímu (404, ak ho tím ešte nemá) | -- |
/teams/{teamId}/org-chart | Pozície organizačnej štruktúry; parentId spája každú pozíciu s nadradenou | -- |
/teams/{teamId}/people-reviews | Hodnotenia ľudí (stránkované) | quarter (2026-Q3) |
/teams/{teamId}/documents | Dokumenty a odkazy (stránkované) | -- |
Hodnotenia stretnutí sa riadia rovnakými pravidlami ako v aplikácii: rating.average nezahŕňa neprítomných ani tých, ktorí nehodnotili (pozri L10 stretnutia), a ratingWindow hovorí, či členovia tímu ešte môžu hodnotiť.
Platforma
Pre prevádzkovateľa platformy, s kľúčom s rozsahom platform -- pozri Správa platformy. Tieto endpointy nevracajú žiadne dáta organizácií.
| Endpoint | Vracia | Filtre |
|---|---|---|
/platform/orgs | Všetky organizácie s ich stavom a počtom členov a tímov | -- |
/platform/users | Všetky kontá s počtom organizácií a aktívnych API kľúčov, od najstaršieho (stránkované) | -- |
/platform/users/{id}/api-keys | API kľúče jedného konta, od najnovšieho -- len údaje o kľúči, nikdy kľúč samotný | -- |
/platform/ai | AI poskytovateľov (API kľúče maskované) a vlastné systémové prompty | -- |
Zápis dát
Úlohy, problémy, Rocks s ich míľnikmi, ukazovatele Scorecardu s ich týždennými hodnotami, stretnutia, V/TO, organizačnú štruktúru, hodnotenia ľudí a dokumenty môžete cez API zapisovať. Každá zmena potrebuje kľúč s rozsahom write (Čítanie a zápis v dialógu vytvorenia) -- kľúč Len čítanie dostane 403 insufficientScope. Nastavenia organizácie, jej členov a tímy meníte endpointmi v časti Správa organizácie.
Metódy
| Metóda | Použitie | Úspešná odpoveď |
|---|---|---|
POST | Vytvorenie položky | 201 Created s vytvorenou položkou (POST /messages/acknowledge: 204 No Content) |
PATCH | Čiastočná úprava -- pošlite len polia, ktoré chcete zmeniť; vynechané polia si ponechajú svoje hodnoty | 200 OK s upravenou položkou |
PUT | Vytvorenie alebo nahradenie: hodnota ukazovateľa za jeden týždeň, hodnotenie stretnutia, vaše hodnotenie v People Analyzer -- idempotentné, opakovanie tej istej požiadavky nič nezmení | 200 OK s uloženou položkou |
DELETE | Zmazanie položky | 204 No Content, bez tela |
Telo posielajte ako JSON s hlavičkou Content-Type: application/json. Odpovede majú rovnaký tvar ako príslušný GET -- vytvorená úloha vyzerá presne ako úloha z GET /tasks/{id}.
Telo PATCH musí meniť aspoň jedno pole: prázdne telo {} API odmietne s 422 invalid („Nothing to update“). Polia, ktoré API nepozná, sa ignorujú -- telo len s neznámymi poliami sa považuje za prázdne. Výnimkou sú telá stretnutí (POST /teams/{teamId}/meetings, PATCH /meetings/{id}, PUT /meetings/{id}/ratings/{userId}): prijímajú len tvary uvedené v časti Stretnutia a neznáme alebo nadbytočné pole odmietnu s 422 invalid.
Oprávnenia
Pre zápis platia rovnaké pravidlá ako vo webovej aplikácii (pozri Roly a oprávnenia). Rozhoduje vaša rola v tíme, do ktorého položka patrí; Vlastníci, Administrátori a Implementátori organizácie vystupujú v každom tíme ako tímoví Administrátori.
| Operácia | Kto smie |
|---|---|
| Vytvárať, upravovať, dokončovať a znovu otvárať úlohy (akékoľvek, nielen svoje) | Členovia tímu a vyššie roly |
| Vytvárať a upravovať problémy, meniť ich stav | Členovia tímu a vyššie roly |
| Zadávať týždenné hodnoty ukazovateľov | Členovia tímu a vyššie roly |
| Meniť stav Rocku; pridávať, upravovať, dokončovať a mazať jeho míľniky | Vlastník Rocku (Člen alebo vyššia rola) a Administrátori tímu |
| Vytvárať Rocks; meniť ich názov, popis, vlastníka, kvartál alebo úroveň | Administrátori a Vlastníci tímu |
| Pridávať, upravovať a presúvať ukazovatele | Administrátori a Vlastníci tímu |
| Plánovať a dodatočne zaznamenávať stretnutia, spúšťať a ukončovať ich, opravovať časy ukončeného stretnutia | Administrátori a Vlastníci tímu |
| Sám ohodnotiť stretnutie | Členovia tímu a vyššie roly, ktorí sú v tíme -- nie Implementátori a nie Vlastníci či Administrátori organizácie, ktorí nie sú členmi tímu. V rámci okna na hodnotenie, ak nie ste Administrátor tímu |
| Nastaviť alebo vymazať hodnotenie člena, označiť členov ako neprítomných | Administrátori a Vlastníci tímu |
| Pridávať segue, novinky (headlines) a kaskádové správy | Členovia tímu a vyššie roly |
| Potvrdiť prečítanie kaskádových správ | Ktorýkoľvek člen organizácie, do ktorej správa patrí |
| Upravovať V/TO; pridávať a upravovať pozície organizačnej štruktúry | Administrátori a Vlastníci tímu |
| Zapisovať hodnotenia v People Analyzer (hodnotiteľom ste vždy vy) | Členovia tímu a vyššie roly |
| Pridávať odkazy do dokumentov | Členovia tímu a vyššie roly |
| Mazať úlohy, problémy, Rocks, ukazovatele, kaskádové správy, pozície organizačnej štruktúry a dokumenty | Administrátori a Vlastníci tímu |
Napríklad: Pozorovateľ nemôže meniť nič; Člen môže dokončiť úlohu kolegu, ale nemôže ju zmazať; vlastník Rocku môže nastaviť jeho stav na OFF_TRACK a odškrtávať jeho míľniky, ale nemôže ho premenovať, odovzdať niekomu inému ani presunúť do iného kvartálu; Implementátor vedie stretnutia a zapisuje hodnotenia členov ako Administrátor tímu, sám však stretnutie nikdy nehodnotí. Odmietnutá zmena vráti 403 forbidden.
Ďalšie pravidlá:
- Vlastníci musia byť členmi tímu.
ownerId, ktoré pošlete pre úlohu, Rock alebo ukazovateľ, musí byť členom tímu, do ktorého položka patrí (id nájdete vGET /teams/{teamId}/members); inak API odpovie422 invalid. Ostatné úpravy fungujú, aj keď súčasný vlastník z tímu odišiel. - Jedna požiadavka, jedna zmena.
PATCHs viacerými poľami (napríklad nový názov a stav) sa uplatní celý alebo vôbec. - Malé telá požiadaviek. Telo požiadavky môže mať najviac 64 KB (inak
413). - Stretnutia musia patriť tímu. Nepovinné
meetingIdnovej úlohy alebo problému musí byť stretnutím toho istého tímu. - Pozastavené organizácie sú len na čítanie. Každá zmena v pozastavenej organizácii vráti
409 orgSuspended. - Kalendárne dni (
dueDate, týždeň ukazovateľaweek, deň stretnutiadate) prijímajú len formátYYYY-MM-DD. Časový okamih ako2026-10-14T00:00:00Zalebo neexistujúci deň ako2026-02-30API odmietne s422 invalid. - Časové okamihy (
startedAtstretnutia) potrebujú ISO 8601 s časovým pásmom:2026-10-05T09:00:00+02:00alebo2026-10-05T07:00:00Z. Čas bez pásma, napríklad2026-10-05T09:00:00, API odmietne s422 invalid. - Text sa orezáva. Medzery na začiatku a na konci sa odstránia; názov, ktorý je po orezaní prázdny, je neplatný.
Validácia
Neplatný vstup vráti 422 invalid a nič nezmení. Rozlišujeme dva druhy:
- Chyby formátu -- chýbajúce povinné pole, nesprávny typ (napríklad číslo namiesto reťazca), neznáma hodnota enumu, chybný deň alebo kvartál, prázdne telo
PATCH. Odpoveď vypíše každý problém vissuess cestou k poľu (path). - Porušenia pravidiel -- text dlhší ako povolený limit (pozri tabuľky nižšie), vlastník, ktorý nie je členom tímu, stretnutie iného tímu, firemný Rock mimo leadership tímu, začiatok stretnutia v budúcnosti, krok stavu stretnutia späť, hodnotenie, ktoré nie je celé číslo od 1 do 10. Odpoveď má kód
invalid, ale bezissues.
Úlohy (tasks)
| Endpoint | Účel | Odpoveď |
|---|---|---|
POST /teams/{teamId}/tasks | Vytvorenie úlohy | 201 Task |
PATCH /tasks/{id} | Úprava, dokončenie alebo znovuotvorenie úlohy | 200 Task |
DELETE /tasks/{id} | Zmazanie úlohy | 204 |
Telo pri vytvorení:
| Pole | Typ | Povinné | Poznámka |
|---|---|---|---|
title | reťazec | áno | 1--500 znakov |
ownerId | reťazec | áno | Člen tímu |
dueDate | deň | áno | YYYY-MM-DD |
meetingId | reťazec | nie | Stretnutie toho istého tímu, z ktorého úloha vzišla |
Telo pri úprave -- všetky polia sú nepovinné, aspoň jedno je potrebné:
| Pole | Typ | Poznámka |
|---|---|---|
title | reťazec | 1--500 znakov |
ownerId | reťazec | Člen tímu |
dueDate | deň | YYYY-MM-DD |
completed | boolean | true úlohu dokončí a nastaví completedAt; false ju znovu otvorí a completedAt vymaže |
Problémy (issues)
| Endpoint | Účel | Odpoveď |
|---|---|---|
POST /teams/{teamId}/issues | Vytvorenie problému | 201 Issue |
PATCH /issues/{id} | Úprava problému alebo zmena jeho stavu | 200 Issue |
DELETE /issues/{id} | Zmazanie problému | 204 |
Telo pri vytvorení:
| Pole | Typ | Povinné | Poznámka |
|---|---|---|---|
title | reťazec | áno | 1--500 znakov |
description | reťazec | nie | Najviac 5 000 znakov |
priority | HIGH | MEDIUM | LOW | nie | Predvolene MEDIUM |
meetingId | reťazec | nie | Stretnutie toho istého tímu, z ktorého problém vzišiel |
Nové problémy majú stav OPEN; ako createdById sa zaznamenáte vy.
Telo pri úprave -- všetky polia sú nepovinné, aspoň jedno je potrebné:
| Pole | Typ | Poznámka |
|---|---|---|
title | reťazec | 1--500 znakov |
description | reťazec | Najviac 5 000 znakov; "" popis vymaže |
priority | HIGH | MEDIUM | LOW | |
status | OPEN | SOLVING | SOLVED | SOLVED nastaví resolvedAt na aktuálny čas; OPEN a SOLVING ho vymažú |
Rocks (goals) a míľniky
| Endpoint | Účel | Odpoveď |
|---|---|---|
POST /teams/{teamId}/goals | Vytvorenie Rocku | 201 Goal |
PATCH /goals/{id} | Úprava Rocku alebo nahlásenie jeho stavu | 200 Goal |
DELETE /goals/{id} | Zmazanie Rocku aj s míľnikmi | 204 |
POST /goals/{id}/milestones | Pridanie míľnika k Rocku | 201 Milestone |
PATCH /milestones/{id} | Úprava, dokončenie alebo znovuotvorenie míľnika | 200 Milestone |
DELETE /milestones/{id} | Zmazanie míľnika | 204 |
Id míľnikov nájdete v poli milestones každého Rocku (GET /goals/{id}).
Telo pri vytvorení Rocku:
| Pole | Typ | Povinné | Poznámka |
|---|---|---|---|
title | reťazec | áno | 1--300 znakov |
description | reťazec | nie | Najviac 5 000 znakov |
ownerId | reťazec | áno | Člen tímu |
quarter | reťazec | áno | YYYY-Qn, napr. "2026-Q4" (roky 2000--2100) |
level | COMPANY | DEPARTMENT | nie | Predvolene DEPARTMENT. COMPANY len v leadership tíme, inak 422 invalid |
Nové Rocks majú stav ON_TRACK a žiadne míľniky.
Telo pri úprave -- všetky polia sú nepovinné, aspoň jedno je potrebné:
| Pole | Typ | Poznámka |
|---|---|---|
title | reťazec | 1--300 znakov |
description | reťazec | Najviac 5 000 znakov; "" popis vymaže |
ownerId | reťazec | Člen tímu |
quarter | reťazec | YYYY-Qn |
level | COMPANY | DEPARTMENT | COMPANY len v leadership tíme |
status | ON_TRACK | OFF_TRACK | DONE | Jediné pole, ktoré smie zmeniť vlastník Rocku; ostatné polia potrebujú Administrátora tímu |
Telá míľnikov:
| Pole | Typ | Vytvorenie | Úprava | Poznámka |
|---|---|---|---|---|
title | reťazec | povinné | nepovinné | 1--300 znakov |
dueDate | deň alebo null | nepovinné, predvolene null | nepovinné | YYYY-MM-DD; null termín odstráni |
completed | boolean | -- | nepovinné | true míľnik dokončí, false ho znovu otvorí. Nové míľniky nie sú dokončené |
Ukazovatele Scorecardu (metrics)
| Endpoint | Účel | Odpoveď |
|---|---|---|
POST /teams/{teamId}/metrics | Pridanie ukazovateľa na koniec Scorecardu tímu | 201 Metric |
PATCH /metrics/{id} | Úprava alebo presun ukazovateľa | 200 Metric |
DELETE /metrics/{id} | Zmazanie ukazovateľa so všetkými jeho hodnotami | 204 |
PUT /metrics/{id}/values/{week} | Nastavenie hodnoty za jeden týždeň | 200 MetricValue |
Telo pri vytvorení:
| Pole | Typ | Povinné | Poznámka |
|---|---|---|---|
title | reťazec | áno | 1--200 znakov |
goal | reťazec | áno | 1--200 znakov. Cieľ s operátorom porovnania >, >=, <, <= alebo =, napr. ">=10" alebo "<5"; samotné číslo, napr. "10", znamená aspoň (>=) |
ownerId | reťazec | áno | Člen tímu |
unit | reťazec | nie | Najviac 20 znakov, napr. "€" alebo "%" |
description | reťazec | nie | Najviac 5 000 znakov |
Telo pri úprave -- všetky polia sú nepovinné, aspoň jedno je potrebné:
| Pole | Typ | Poznámka |
|---|---|---|
title, goal, ownerId | reťazec | Rovnako ako pri vytvorení |
unit, description | reťazec | Rovnako ako pri vytvorení; "" pole vymaže |
direction | "up" | "down" | Presunie ukazovateľ v Scorecarde o jedno miesto vyššie alebo nižšie. Na začiatku alebo na konci sa nič nepresunie |
Týždenná hodnota -- PUT /metrics/{id}/values/{week}:
{week}je pondelok, ktorým týždeň začína, vo formáteYYYY-MM-DD. Akýkoľvek iný deň vráti422 invalid(„Weeks start on Monday“).- Požiadavka funguje ako upsert: hodnotu týždňa vytvorí alebo nahradí. Jej opakovanie dá rovnaký výsledok.
enteredByIdsi ponechá toho, kto hodnotu zadal ako prvý. - V aplikácii sa hodnoty zadané počas L10 stretnutia uložia do týždňa, ktorý Scorecard ukazuje ako aktuálny vo vašom časovom pásme (z vášho profilu, inak z organizácie).
| Pole | Typ | Povinné | Poznámka |
|---|---|---|---|
value | reťazec | áno | Najviac 50 znakov. Čísla posielajte ako reťazce: "12", nie 12 |
onTrack | boolean | nie | Či týždeň splnil cieľ. Ak ho vynecháte, vypočíta sa podľa cieľa (cieľ ">=10", hodnota "12" → true; hodnota "8" → false). Ak sa hodnota nedá posúdiť -- text alebo nejednoznačné číslo ako "1.234,5" -- onTrack je povinný (inak 422) |
Čísla môžu mať desatinnú čiarku aj bodku ("3,5" aj "3.5" je 3,5), skupiny tisícov ("1.000" aj "1,000" je 1000), medzery a % na konci. Číslo, ktoré mieša oba oddeľovače ("1.234,5"), sa nehádže.
Stretnutia
| Endpoint | Účel | Odpoveď |
|---|---|---|
POST /teams/{teamId}/meetings | Naplánovanie stretnutia alebo zaznamenanie stretnutia, ktoré už prebehlo | 201 Meeting |
PATCH /meetings/{id} | Spustenie alebo ukončenie stretnutia, alebo oprava časov ukončeného stretnutia | 200 Meeting |
PUT /meetings/{id}/ratings/me | Vaše vlastné hodnotenie stretnutia | 200 Rating |
PUT /meetings/{id}/ratings/{userId} | Nastavenie alebo vymazanie hodnotenia člena, alebo jeho označenie ako neprítomného | 200 Rating, pri vymazaní 204 |
POST /meetings/{id}/segues | Pridanie vášho segue (dobrej správy) | 201 Segue |
POST /meetings/{id}/headlines | Pridanie novinky (headline) o zákazníkoch alebo zamestnancoch | 201 Headline |
POST /meetings/{id}/messages | Pridanie kaskádovej správy | 201 CascadingMessage |
DELETE /messages/{id} | Zmazanie kaskádovej správy | 204 |
POST /messages/acknowledge | Potvrdenie prečítania kaskádových správ | 204 |
Meeting v odpovedi má rovnaký tvar ako v GET /teams/{teamId}/meetings vrátane súhrnu hodnotenia. Úlohy a problémy, ktoré vzídu zo stretnutia, vytvoríte cez endpointy úloh a problémov -- id stretnutia pošlite ako meetingId (stretnutie toho istého tímu).
Vytvorenie -- pošlite presne jeden z dvoch tvarov, nikdy nie polia oboch:
| Tvar | Pole | Typ | Poznámka |
|---|---|---|---|
| Naplánovanie | date | deň | Deň stretnutia, YYYY-MM-DD. Stretnutie začína v stave SCHEDULED |
| Zaznamenanie minulého stretnutia | startedAt | časový okamih | Kedy stretnutie začalo, s posunom časového pásma. Nie v budúcnosti |
durationMin | celé číslo | Dĺžka v celých minútach, 1--600 |
Dodatočne zaznamenané stretnutie sa vytvorí v stave COMPLETED s endedAt = startedAt + durationMin. Jeho date je deň startedAt vo vašom časovom pásme (z vášho profilu, inak z organizácie) -- stretnutie, ktoré začalo 2026-10-05T23:30:00Z, pripadne v strednej Európe na 2026-10-06.
Úprava -- opäť presne jeden z dvoch tvarov:
| Tvar | Pole | Typ | Poznámka |
|---|---|---|---|
| Posun stavu | status | IN_PROGRESS | COMPLETED | Len dopredu, vždy o jeden krok: SCHEDULED → IN_PROGRESS → COMPLETED. Akýkoľvek iný krok (späť, ten istý stav alebo zo SCHEDULED rovno na COMPLETED) vráti 422 invalid |
| Oprava časov | startedAt | časový okamih | Len ukončené stretnutia (inak 422). Nie v budúcnosti |
durationMin | celé číslo | Celé minúty, 1--600 |
Spustenie stretnutia (IN_PROGRESS) nastaví startedAt na aktuálny čas. Ukončenie nastaví endedAt na aktuálny čas a zaznamená durationMin -- počet minút od začiatku. Oprava časov znovu vypočíta endedAt a date stretnutia sa riadi novým začiatkom, rovnako ako pri zaznamenaní.
Hodnotenia. Hodnotenia sú celé čísla od 1 do 10, rovnako ako v aplikácii (pozri L10 stretnutia).
PUT /meetings/{id}/ratings/mes{ "rating": 8 }uloží vaše vlastné hodnotenie a označí vás ako prítomného. Musíte byť členom tímu, do ktorého stretnutie patrí. Implementátori nikdy nehodnotia a Vlastníci či Administrátori organizácie hodnotia len v tímoch, ktorých sú členmi (inak403 forbidden).- Okno na hodnotenie. Stretnutie, ktoré ešte nezačalo (
SCHEDULED), nemôže hodnotiť nikto --409 ratingClosed. Členovia tímu môžu hodnotiť počas stretnutia aj po jeho skončení -- až do začiatku ďalšieho stretnutia tímu, najviac však 7 dní. Pri dodatočne zaznamenanom stretnutí sa 7 dní počíta od jeho zadania, nie od jeho konania. Potom členovia dostanú409 ratingClosed. Administrátori tímu môžu hodnotiť kedykoľvek.GET /meetings/{id}ukazuje okno v poliachratingWindow.openaratingWindow.closesAt. PUT /meetings/{id}/ratings/{userId}je pre Administrátorov tímu (a Implementátorov) a okno na hodnotenie ho neobmedzuje, iba stavSCHEDULED.userIdmusí byť členom tímu (inak422 invalid).
Telo musí mať presne jeden z týchto tvarov:
| Telo | Účinok | Odpoveď |
|---|---|---|
{ "rating": 8 } | Nastaví hodnotenie člena (1--10) a označí ho ako prítomného | 200 Rating |
{ "rating": 0 } | Vymaže hodnotenie člena: počíta sa ako prítomný, ale nehodnotil | 204 No Content |
{ "absent": true } | Označí člena ako neprítomného a uloží hodnotenie 0. Neprítomní sa do priemeru nezapočítavajú | 200 Rating |
{ "rating": 8, "absent": false } | To isté ako { "rating": 8 }, len s výslovne uvedeným absent ("rating": 0 hodnotenie vymaže) | 200 Rating alebo 204 |
Predvolené hodnoty neexistujú: prázdne telo {}, { "absent": false } bez hodnotenia, neznáme pole alebo rating spolu s "absent": true vráti 422 invalid.
Segue, novinky a kaskádové správy. Telá:
| Endpoint | Pole | Typ | Poznámka |
|---|---|---|---|
segues, messages | content | reťazec | 1--1 000 znakov |
headlines | type | CUSTOMER | EMPLOYEE | |
content | reťazec | 1--1 000 znakov |
Ako autor (userId) sa zaznamenáte vy. Segue a novinky sa cez API nedajú upraviť ani zmazať. Kaskádová správa je určená celej organizácii; Administrátori tímu ju môžu zmazať cez DELETE /messages/{id}. Id správ nájdete v poli messages v GET /meetings/{id}.
Potvrdenie prečítania -- POST /messages/acknowledge s { "ids": ["…", "…"] } (1--500 id) označí správy ako prečítané vami. Smie to ktorýkoľvek člen organizácie, do ktorej správa patrí, nielen členovia tímu, ktorý ju napísal. Opakovanie nič nezmení a neexistujúce id sa preskočia. Ak niektorá zo správ patrí organizácii, ktorej nie ste členom, požiadavka vráti 403 forbidden a nepotvrdí nič.
V/TO (vision)
| Endpoint | Účel | Odpoveď |
|---|---|---|
POST /teams/{teamId}/vision | Vytvorenie V/TO tímu, ak ešte neexistuje (bez tela) | 201 Vision |
PATCH /teams/{teamId}/vision | Nastavenie jedného poľa V/TO | 200 Vision |
POST pre tím, ktorý V/TO už má, nič nezmení a vráti aktuálne V/TO, aj tak so 201. PATCH V/TO vytvorí, ak chýba. Každý PATCH nastaví jedno pole:
| Pole | Typ | Poznámka |
|---|---|---|
field | reťazec | Jedno z coreValues, coreFocus, tenYearTarget, marketingStrategy, threeYearPicture, oneYearPlan, quarterlyRocks, issuesList |
value | podľa field | Pozri nasledujúcu tabuľku. Najviac 20 000 znakov v uloženej podobe |
Každé pole prijíma jeden tvar:
| Polia | value |
|---|---|
coreValues, quarterlyRocks, issuesList | Zoznam textov: najviac 100 položiek, každá 1--1 000 znakov (orezáva sa) |
coreFocus, marketingStrategy | Objekt s najviac 30 kľúčmi (každý 1--100 znakov); každá hodnota je text (najviac 5 000 znakov) alebo zoznam textov ako vyššie |
tenYearTarget, threeYearPicture, oneYearPlan | Text, uloží sa tak, ako ho pošlete (neorezáva sa) |
Čokoľvek iné -- text pre pole so zoznamom alebo objektom, zoznam alebo objekt pre textové pole, číslo, boolean, null -- vráti 422 invalid. Jedno ukážkové telo pre každý tvar:
{ "field": "coreValues", "value": ["Zákazník na prvom mieste", "Zodpovednosť", "Jednoduchosť"] }
{ "field": "marketingStrategy", "value": { "targetMarket": "B2B firmy s 10-250 ľuďmi", "threeUniques": ["Postavené pre EOS", "L10 stretnutia", "Funguje aj v mobile"] } }
{ "field": "tenYearTarget", "value": "1 000 firiem používa EOS Hub" }Odpoveďou je celé V/TO v rovnakom tvare ako z GET /teams/{teamId}/vision: polia so zoznamom a objektom sa vrátia rozparsované, textové polia vždy ako text -- text, ktorý vyzerá ako JSON (napríklad "[1, 2]"), zostane reťazcom. Pole so zoznamom alebo objektom, v ktorom je ešte starší voľný text z aplikácie, sa vráti ako tento text.
Organizačná štruktúra (org-chart)
| Endpoint | Účel | Odpoveď |
|---|---|---|
POST /teams/{teamId}/org-chart/seats | Pridanie pozície | 201 Seat |
PATCH /org-chart/seats/{id} | Premenovanie pozície, jej obsadenie alebo uvoľnenie, zmena zodpovedností | 200 Seat |
DELETE /org-chart/seats/{id} | Zmazanie pozície aj všetkých pozícií pod ňou | 204 |
| Pole | Typ | Vytvorenie | Úprava | Poznámka |
|---|---|---|---|---|
title | reťazec | povinné | nepovinné | 1--200 znakov |
parentId | reťazec | nepovinné | -- | Nadradená pozícia, pozícia toho istého tímu (inak 422). Pre pozíciu na najvyššej úrovni ho vynechajte. Pozíciu neskôr nemožno presunúť |
userId | reťazec | nepovinné | nepovinné alebo null | Osoba na pozícii, člen tímu. null pozíciu uvoľní |
responsibilities | reťazec | nepovinné | nepovinné | Najviac 5 000 znakov; "" ich vymaže |
Nová pozícia sa zaradí za existujúce pozície na tej istej úrovni.
Hodnotenie ľudí (people-reviews)
PUT /teams/{teamId}/people-reviews vytvorí alebo nahradí vaše hodnotenie jedného člena tímu za jeden kvartál a vráti ho (200 PeopleReview). Hodnotiteľom (evaluatorId) ste vždy vy. Pre každého člena, hodnotiteľa a kvartál existuje jedno hodnotenie -- ak ho pre toho istého člena a kvartál pošlete znova, nahradí predchádzajúce.
| Pole | Typ | Povinné | Poznámka |
|---|---|---|---|
userId | reťazec | áno | Hodnotená osoba, člen tímu |
quarter | reťazec | áno | YYYY-Qn, napr. "2026-Q4" (roky 2000--2100) |
coreValuesScores | objekt | áno | Základná hodnota → či ju osoba žije, napr. {"Zákazník na prvom mieste": true, "Zodpovednosť": false}. Najviac 50 hodnôt, názvy najviac 200 znakov |
gwc | objekt | áno | {"getsIt": true, "wantsIt": true, "capacityToDoIt": false} -- všetky tri booleany sú povinné |
notes | reťazec | nie | Najviac 5 000 znakov |
Dokumenty
| Endpoint | Účel | Odpoveď |
|---|---|---|
POST /teams/{teamId}/documents | Pridanie odkazu do dokumentov tímu | 201 Document |
DELETE /documents/{id} | Zmazanie dokumentu alebo odkazu | 204 |
| Pole | Typ | Povinné | Poznámka |
|---|---|---|---|
name | reťazec | áno | 1--200 znakov |
url | reťazec | áno | Adresa http:// alebo https://, najviac 2 000 znakov |
API pridáva odkazy (type: "LINK"); súbory nenahráva.
Príklady
Príklady používajú premenné z časti Prvé volania a id z predchádzajúcich odpovedí.
Vytvorenie úlohy:
curl -s -X POST "$BASE/teams/$TEAM_ID/tasks" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"title": "Zavolať novému dodávateľovi", "ownerId": "cmg4x…", "dueDate": "2026-10-14"}'{
"id": "cmg7u…",
"teamId": "cmg2b…",
"title": "Zavolať novému dodávateľovi",
"ownerId": "cmg4x…",
"dueDate": "2026-10-14",
"completed": false,
"completedAt": null,
"meetingId": null,
"createdAt": "2026-10-07T09:15:31.000Z"
}Dokončenie úlohy:
curl -s -X PATCH "$BASE/tasks/cmg7u…" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"completed": true}'Odpoveďou je úloha s "completed": true a vyplneným completedAt. Ak pošlete {"completed": false}, úloha sa znovu otvorí.
Zadanie hodnoty ukazovateľa za tento týždeň. Týždne sa označujú svojím pondelkom:
MONDAY=$(date -d "-$(( $(date +%u) - 1 )) days" +%F) # GNU date; na macOS: date -v-$(( $(date +%u) - 1 ))d +%F
curl -s -X PUT "$BASE/metrics/$METRIC_ID/values/$MONDAY" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"value": "12"}'{ "week": "2026-10-05", "value": "12", "onTrack": true, "enteredById": "cmg4x…" }Pri cieli ">=10" hodnota "12" cieľ spĺňa, preto je onTrack rovné true. Opätovné spustenie toho istého príkazu nič nezmení; iná hodnota nahradí hodnotu týždňa.
Označenie problému ako vyriešeného:
curl -s -X PATCH "$BASE/issues/cmg8i…" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "SOLVED"}'Odpoveďou je problém so "status": "SOLVED" a vyplneným resolvedAt. Návrat do stavu OPEN alebo SOLVING resolvedAt vymaže.
Zaznamenanie minulého stretnutia a jeho hodnotenie. Pondelkové L10 začalo o 9:00 bratislavského času a trvalo 90 minút (zaznamenanie potrebuje Administrátora tímu):
curl -s -X POST "$BASE/teams/$TEAM_ID/meetings" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"startedAt": "2026-10-05T09:00:00+02:00", "durationMin": 90}'{
"id": "cmg6n…",
"teamId": "cmg2b…",
"date": "2026-10-05",
"status": "COMPLETED",
"startedAt": "2026-10-05T07:00:00.000Z",
"endedAt": "2026-10-05T08:30:00.000Z",
"durationMin": 90,
"createdById": "cmg4x…",
"rating": { "average": null, "ratedCount": 0, "absentCount": 0 }
}Ohodnoťte ho sami a kolegu, ktorý nebol prítomný, označte ako neprítomného:
curl -s -X PUT "$BASE/meetings/cmg6n…/ratings/me" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"rating": 9}'
curl -s -X PUT "$BASE/meetings/cmg6n…/ratings/cmg4y…" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"absent": true}'{ "userId": "cmg4x…", "rating": 9, "absent": false }
{ "userId": "cmg4y…", "rating": 0, "absent": true }Ostatní členovia môžu stretnutie ohodnotiť svojimi kľúčmi do 7 dní odteraz -- ak skôr nezačne ďalšie stretnutie tímu.
Pridanie kaskádovej správy a potvrdenie jej prečítania. Člen tímu pridá správu k stretnutiu:
curl -s -X POST "$BASE/meetings/cmg6n…/messages" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"content": "Od 1. novembra sa cestovné náhrady schvaľujú v novom portáli."}'{
"id": "cmgam…",
"meetingId": "cmg6n…",
"userId": "cmg4x…",
"content": "Od 1. novembra sa cestovné náhrady schvaľujú v novom portáli.",
"createdAt": "2026-10-07T10:02:17.000Z"
}Ktokoľvek z organizácie -- napríklad kolega z iného tímu so svojím kľúčom -- ju označí ako prečítanú:
curl -s -o /dev/null -w "%{http_code}\n" -X POST "$BASE/messages/acknowledge" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"ids": ["cmgam…"]}'Príkaz vypíše 204. Opätovné potvrdenie tej istej správy nič nezmení.
Správa organizácie
Endpointy stránky Nastavenia organizácie vo webovej aplikácii: názov, časové pásmo a jazyk organizácie, jej členovia, tímy a členovia jednotlivých tímov (pozri Nastavenia organizácie).
Kto smie. Vlastníci a Administrátori organizácie -- nie Členovia organizácie (ani keď sú Vlastníkmi či Administrátormi niektorého tímu) a nie Implementátori; tí dostanú 403 forbidden. Zmeny potrebujú kľúč s rozsahom write; v pozastavenej organizácii vrátia 409 orgSuspended. Aj zoznam členov GET /orgs/{orgId}/members je len pre Vlastníkov a Administrátorov (s rozsahom read).
| Endpoint | Účel | Odpoveď |
|---|---|---|
PATCH /orgs/{orgId} | Zmena názvu, časového pásma alebo predvoleného jazyka organizácie | 200 Organization |
POST /orgs/{orgId}/members | Pridanie člena -- existujúceho konta alebo nového konta s prihlásením cez Google | 201 člen s created |
PATCH /orgs/{orgId}/members/{userId} | Zmena roly člena v organizácii | 200 OrganizationMember |
DELETE /orgs/{orgId}/members/{userId} | Odobratie člena z organizácie a zo všetkých jej tímov | 204 |
POST /orgs/{orgId}/teams | Vytvorenie tímu | 201 Team |
PATCH /teams/{teamId} | Premenovanie tímu, príznak leadership tímu, nastavenia stretnutí | 200 Team |
DELETE /teams/{teamId} | Zmazanie tímu so všetkými jeho dátami | 204 |
POST /teams/{teamId}/members | Pridanie člena organizácie do tímu | 201 TeamMember |
PATCH /teams/{teamId}/members/{userId} | Zmena tímovej roly člena | 200 TeamMember |
DELETE /teams/{teamId}/members/{userId} | Odobratie člena z tímu | 204 |
Odpovede majú rovnaký tvar ako GET /orgs/{orgId}, GET /orgs/{orgId}/members, GET /teams/{teamId} a GET /teams/{teamId}/members.
Nastavenia organizácie
PATCH /orgs/{orgId} -- všetky polia sú nepovinné, aspoň jedno je potrebné:
| Pole | Typ | Poznámka |
|---|---|---|
name | reťazec | 1--200 znakov |
timezone | reťazec | Časové pásmo IANA, napr. "Europe/Bratislava"; neznáme pásmo vráti 422 invalid |
defaultLocale | en | sk | Jazyk nových kont vytvorených v tejto organizácii |
Členovia organizácie
POST /orgs/{orgId}/members pridá človeka podľa e-mailu:
| Pole | Typ | Povinné | Poznámka |
|---|---|---|---|
email | reťazec | áno | E-mailová adresa človeka |
role | OWNER | ADMIN | MEMBER | IMPLEMENTER | áno | Jeho rola v organizácii |
name | reťazec | nie | Najviac 200 znakov; použije sa len pri vytvorení nového konta |
googleOnly | boolean | pri novom konte | Musí byť true, ak k e-mailu ešte neexistuje konto |
- Existujúce konto s týmto e-mailom sa pridá do organizácie. Jeho meno a spôsob prihlásenia sa nemenia.
- Neznámy e-mail vytvorí nové konto, ktoré sa prihlasuje cez Google týmto e-mailom -- pošlite
"googleOnly": true, inak API odpovie422 invalid. Konto začne v predvolenom jazyku organizácie. - Žiadne heslá. API heslo nikdy nenastavuje, rovnako ako Nastavenia organizácie v aplikácii. Telo je striktné: akékoľvek iné pole vrátane
passwordvráti422 invalid. - Odpoveďou je člen a
"created": true, ak sa vytvorilo nové konto, alebofalse, ak sa pridalo existujúce. Človek, ktorý už je členom, vráti422 invalid.
PATCH /orgs/{orgId}/members/{userId} s { "role": "ADMIN" } zmení rolu; DELETE /orgs/{orgId}/members/{userId} odoberie človeka z organizácie aj zo všetkých jej tímov. Jeho história -- úlohy, problémy, hodnotenia -- zostáva a jeho API kľúče okamžite stratia prístup k organizácii. userId, ktoré nie je členom organizácie, vráti 404 notFound.
Pravidlá, rovnako ako v aplikácii:
- Vlastníkov a Administrátorov mení len Vlastník. Udeliť rolu
OWNERaleboADMIN, ako aj zmeniť či odobrať člena, ktorý je Vlastníkom alebo Administrátorom, môže len Vlastník organizácie; Administrátor dostane403 forbidden. - Posledný Vlastník zostáva. Zmena roly alebo odobratie posledného Vlastníka organizácie vráti
422 invalid.
Správa tímov
POST /orgs/{orgId}/teams s { "name": "Predaj" } (1--100 znakov) vytvorí tím. slug sa vygeneruje z názvu ("Predaj" → predaj, alebo predaj-2, ak je už obsadený). Nový tím nie je leadership tímom, má predvolené nastavenia stretnutí (90 minút, varovanie od 80. minúty) a zatiaľ nemá žiadnych členov.
PATCH /teams/{teamId} -- všetky polia sú nepovinné, aspoň jedno je potrebné:
| Pole | Typ | Poznámka |
|---|---|---|
name | reťazec | 1--100 znakov. slug sa nemení |
isLeadership | boolean | Leadership tímy spravujú firemné Rocks |
meetingDurationMin | celé číslo | Dĺžka stretnutia v minútach, udržiava sa medzi 10 a 300 |
meetingWarningMin | celé číslo | Minúta, od ktorej odpočet varuje, udržiava sa medzi 1 a minútou pred koncom stretnutia |
Nastavenia stretnutí sa upravia rovnako ako v aplikácii, namiesto toho, aby sa odmietli: dĺžka 400 sa uloží ako 300 a minúta varovania, ktorá je rovná dĺžke alebo väčšia, sa posunie tesne pod ňu -- {"meetingDurationMin": 60} v tíme, ktorý varuje od 80. minúty, uloží varovanie od 59. minúty. Odpoveď ukazuje uložené hodnoty.
DELETE /teams/{teamId} zmaže tím so všetkými jeho dátami -- úlohami, problémami, Rocks, Scorecardom, stretnutiami, V/TO a všetkým ostatným. Nedá sa to vrátiť späť.
Neznáme teamId vráti 404 notFound; tím organizácie, v ktorej nie ste Vlastníkom ani Administrátorom, vráti 403 forbidden.
Členovia tímu
| Endpoint | Telo | Poznámka |
|---|---|---|
POST /teams/{teamId}/members | userId, role (nepovinné, predvolene MEMBER) | Človek musí byť členom organizácie, do ktorej tím patrí (inak 422 invalid -- najprv ho pridajte cez POST /orgs/{orgId}/members). Človek, ktorý už v tíme je, vráti 422 invalid |
PATCH /teams/{teamId}/members/{userId} | role | 404 notFound, ak človek nie je v tíme |
DELETE /teams/{teamId}/members/{userId} | -- | Odoberie človeka len z tohto tímu (404 notFound, ak v ňom nie je) |
Tímové roly sú OWNER, ADMIN, MEMBER a VIEWER (pozri Roly a oprávnenia).
Príklad: pridanie člena tímu
Pridajte existujúceho kolegu do organizácie a potom do tímu Predaj ako Administrátora tímu:
curl -s -X POST "$BASE/orgs/$ORG_ID/members" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "peter@acme.com", "role": "MEMBER"}'{ "userId": "cmg4z…", "email": "peter@acme.com", "name": "Peter Kováč", "role": "MEMBER", "joinedAt": "2026-10-07T11:20:05.000Z", "created": false }curl -s -X POST "$BASE/teams/$TEAM_ID/members" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"userId": "cmg4z…", "role": "ADMIN"}'{ "userId": "cmg4z…", "email": "peter@acme.com", "name": "Peter Kováč", "role": "ADMIN" }Pre človeka bez konta pridajte do prvej požiadavky "googleOnly": true (a voliteľne name) -- odpoveď potom obsahuje "created": true a človek sa prihlasuje cez Google týmto e-mailom.
Správa platformy
Endpointy stránky Platforma vo webovej aplikácii (pozri Správa platformy) pre prevádzkovateľa platformy.
Kto smie. Funguje tu len kľúč s rozsahom platform, a to len dovtedy, kým jeho vlastník je prevádzkovateľom platformy (SUPERADMIN). Takéto kľúče môžu vytvárať len prevádzkovatelia platformy, s platnosťou najviac 90 dní (pozri Kľúče platformy). Akýkoľvek iný kľúč dostane 403.
Žiadne dáta organizácií
Endpointy platformy spravujú organizácie ako zákazníkov, kontá a nastavenia AI. Dáta organizácií nikdy nevracajú -- žiadne tímy, úlohy, Rocks, stretnutia ani členov organizácie, len názvy a počty. Rovnako ako vo webovej aplikácii vidí prevádzkovateľ platformy dáta organizácie len ako jej člen, s kľúčom read alebo write a so svojou rolou v organizácii.
| Endpoint | Účel | Odpoveď |
|---|---|---|
GET /platform/orgs | Všetky organizácie | 200 zoznam PlatformOrganization |
POST /platform/orgs | Vytvorenie organizácie s prvým Vlastníkom | 201 PlatformOrganization |
PATCH /platform/orgs/{id} | Pozastavenie alebo obnovenie organizácie | 200 PlatformOrganization |
GET /platform/users | Všetky kontá s počtami (stránkované) | 200 zoznam PlatformUser |
GET /platform/users/{id}/api-keys | API kľúče jedného konta (len údaje o kľúči) | 200 zoznam ApiKeyInfo |
DELETE /platform/api-keys/{id} | Odvolanie API kľúča ktoréhokoľvek používateľa | 204 |
GET /platform/ai | AI poskytovatelia (kľúče maskované) a systémové prompty | 200 AiConfig |
PUT /platform/ai/providers/{type} | Nastavenie API kľúča a predvoleného modelu poskytovateľa | 200 AiProvider |
PATCH /platform/ai/providers/{type} | Zapnutie alebo vypnutie poskytovateľa | 200 AiProvider |
DELETE /platform/ai/providers/{type} | Zmazanie poskytovateľa | 204, alebo 404, ak neexistuje |
PUT /platform/ai/prompts/{inputType} | Nastavenie systémového promptu pre typ vstupu | 200 AiPrompt |
DELETE /platform/ai/prompts/{inputType} | Zmazanie systémového promptu -- znovu platí predvolený | 204, alebo 404, ak neexistuje |
Organizácie
PlatformOrganization obsahuje id, name, slug, status (ACTIVE alebo SUSPENDED), members a teams (počty) a createdAt.
POST /platform/orgs vytvorí organizáciu a jej prvého Vlastníka:
| Pole | Typ | Povinné | Poznámka |
|---|---|---|---|
name | reťazec | áno | 1--200 znakov; vygeneruje sa z neho slug |
timezone | reťazec | áno | Časové pásmo IANA, napr. "Europe/Bratislava" |
defaultLocale | en | sk | áno | |
owner | objekt | áno | email a pri novom konte name (nepovinné) a buď password (8--200 znakov), alebo "googleOnly": true |
Existujúce konto s e-mailom vlastníka sa stane Vlastníkom bez zmeny; neznámy e-mail bez hesla aj bez googleOnly vráti 422 invalid.
PATCH /platform/orgs/{id} s { "status": "SUSPENDED" } prepne organizáciu len na čítanie -- jej členovia môžu naďalej čítať a každá zmena vráti 409 orgSuspended, v aplikácii aj v API. { "status": "ACTIVE" } ju obnoví.
Používatelia a ich API kľúče
GET /platform/users vypíše všetky kontá od najstaršieho: id, email, name, systemRole (SUPERADMIN alebo USER), orgCount, activeApiKeys a createdAt -- len počty, nie to, o ktoré organizácie ide.
GET /platform/users/{id}/api-keys vypíše kľúče jedného konta s id, name, prefix (viditeľný začiatok, napr. ak_k3m7q2xa), scopes, status (active, expired, revoked), expiresAt, lastUsedAt a createdAt. Samotný kľúč sa neukladá, preto sa ani nikdy nevracia.
DELETE /platform/api-keys/{id} kľúč odvolá -- napríklad taký, ktorý mohol uniknúť. Integrácie, ktoré ho používajú, okamžite prestanú fungovať. Odvolanie už odvolaného kľúča nič nezmení. Kľúče za iných vytvárať nemožno.
AI
GET /platform/ai vráti providers -- id, type, defaultModel, isActive a apiKeyMasked -- a prompts -- id, inputType, systemPrompt, providerId, modelOverride a isActive. Uvedené sú len vlastné prompty; typy vstupu bez vlastného promptu používajú vstavaný predvolený prompt.
| Endpoint | Telo | Poznámka |
|---|---|---|
PUT /platform/ai/providers/{type} | apiKey (8--500 znakov), defaultModel (1--200 znakov) | {type} je ANTHROPIC alebo OPENROUTER. Vytvorí poskytovateľa alebo nahradí jeho kľúč a model. Kľúč sa uloží šifrovaný a nikdy sa nevracia -- odpovede ho ukazujú maskovaný. Nový poskytovateľ je zapnutý |
PATCH /platform/ai/providers/{type} | isActive (boolean) | Zapne alebo vypne poskytovateľa |
DELETE /platform/ai/providers/{type} | -- | Prompty, ktoré ho používali, prejdú na prvého zapnutého poskytovateľa |
PUT /platform/ai/prompts/{inputType} | systemPrompt (1--20 000 znakov), providerId (nepovinné), modelOverride (nepovinné, najviac 200 znakov) | Vytvorí alebo nahradí prompt. providerId je id poskytovateľa z GET /platform/ai (pri neznámom 422); ak ho vynecháte, pošlete null alebo je poskytovateľ vypnutý, použije sa prvý zapnutý poskytovateľ. Ak modelOverride vynecháte alebo pošlete null či "", použije sa predvolený model poskytovateľa |
DELETE /platform/ai/prompts/{inputType} | -- | Typ vstupu znovu používa predvolený prompt |
Typy vstupu sú TODO_TITLE, ISSUE_TITLE, ISSUE_DESCRIPTION, ROCK_TITLE, ROCK_DESCRIPTION, MEASURABLE_TITLE, HEADLINE, CASCADING_MESSAGE a VTO_CONTENT (pozri AI Integrácia).
Príklad: pozastavenie organizácie
S kľúčom platformy v EOSHUB_KEY nájdite organizáciu a pozastavte ju:
curl -s -H "Authorization: Bearer $EOSHUB_KEY" "$BASE/platform/orgs" | jq -r '.data[] | "\(.id) \(.status) \(.name)"'
curl -s -X PATCH "$BASE/platform/orgs/cmg1a…" \
-H "Authorization: Bearer $EOSHUB_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "SUSPENDED"}'{ "id": "cmg1a…", "name": "Acme Corp", "slug": "acme-corp", "status": "SUSPENDED", "members": 5, "teams": 2, "createdAt": "2026-05-04T08:00:00.000Z" }Členovia organizácie môžu naďalej čítať, ale každá zmena teraz vráti 409 orgSuspended. Ak ju chcete obnoviť, pošlite {"status": "ACTIVE"}.
Interaktívna referencia
Na adrese https://<vas-server>/api/v1/docs nájdete interaktívnu referenciu API. Obsahuje všetky endpointy s parametrami a úplnou schémou odpovedí a po zadaní API kľúča z nej môžete posielať skutočné požiadavky priamo z prehliadača.
Ten istý popis je dostupný ako dokument OpenAPI 3.1 na https://<vas-server>/api/v1/openapi.json. Môžete ho importovať do Postmanu, Insomnie alebo generátora klientskeho kódu.
Ďalšie kroky
- API kľúče -- vytváranie, odvolávanie a zabezpečenie kľúčov
- Roly a oprávnenia -- čo ktorá rola vidí a môže
- Organizácie a tímy -- ako fungujú organizácie a tímy