Skip to content

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á URLhttps://<vas-server>/api/v1
Interaktívna referenciahttps://<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áciahttps://<vas-server>/api/v1/openapi.json (OpenAPI 3.1) -- pre generátory kódu a API klientov
AutentifikáciaAuthorization: Bearer ak_… (osobný API kľúč)
FormátJSON, 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:

http
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/v1 nefunguje 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í:

RozsahPovoľujeKto ho môže vytvoriť
readČítanie všetkého, čo vaše roly dovoľujúKaždý (Len čítanie v dialógu vytvorenia)
writeVytváranie a úpravu dát podľa vašich rolí; zahŕňa aj readKaždý (Čítanie a zápis)
platformSprávu platformyLen 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:

bash
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:

bash
curl -s -H "Authorization: Bearer $EOSHUB_KEY" "$BASE/me"
json
{
  "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:

bash
curl -s -H "Authorization: Bearer $EOSHUB_KEY" "$BASE/orgs/cmg1a…/teams"
json
{
  "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:

bash
curl -s -H "Authorization: Bearer $EOSHUB_KEY" "$BASE/teams/cmg2b…/tasks?completed=false"
json
{
  "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:

json
{ "data": [ … ], "nextCursor": "eyJrIjoiMjAyNi0xMC0wNlQwODo0MTowMi4wMDBaIiwiaWQiOiJjbWc3dCJ9" }
ParameterPopis
limitVeľkosť stránky, 1--200 (predvolene 50)
cursorHodnota 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:

bash
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
done
js
const 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:

json
{
  "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"
      }
    ]
  }
}
HTTPcodeVýznam
401unauthenticatedChýbajúci, chybný, expirovaný alebo odvolaný API kľúč
403forbiddenVaše roly nepovoľujú prístup k tejto organizácii alebo tímu, alebo túto zmenu
403insufficientScopeRozsahy kľúča túto operáciu nepovoľujú
404notFoundPoložka neexistuje alebo ju nevidíte
409orgSuspendedOrganizácia je pozastavená (len na čítanie) -- každá zmena sa odmietne
409ratingClosedStretnutie 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
422invalidNeplatné parametre alebo telo; pri chybách formátu issues vypisuje problémy po jednotlivých poliach (pozri Validácia)
429rateLimitedPriveľa požiadaviek -- pozri Limit požiadaviek
500internalNeoč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 ​

DruhFormátPríklad
Názvy polícamelCasedueDate, isLeadership
IdNepriehľ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ályYYYY-Qn"2026-Q3"
Hodnoty enumovUPPER_CASEOPEN, ON_TRACK, COMPLETED
Chýbajúce hodnotynull (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).
  • coreValuesScores a gwc hodnotenia ľ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 HubV API
Organizácia, tímorgs, teams
Úloha (To-Do)tasks
Problém (Issue)issues
Rock, míľnikgoals (míľniky sú vnorené v každom cieli)
Ukazovateľ Scorecardu, týždenná hodnotametrics, metrics/{id}/values
L10 stretnutiemeetings (s ratings, segues, headlines, messages)
V/TOvision
Organizačná štruktúra (Accountability Chart)org-chart (pozície)
Hodnotenie ľudí (People Analyzer)people-reviews
Dokumentydocuments

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 ​

EndpointVraciaFiltre
/meVaše konto, organizácie s vašou rolou a rozsahy kľúča--
/orgsVaše organizácie s vašou rolou v každej z nich--
/orgs/{orgId}Jednu organizáciu--
/orgs/{orgId}/membersVš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}/teamsTímy organizácie, ktoré vidíte--

Tímy ​

EndpointVraciaFiltre
/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 ​

EndpointVraciaFiltre
/teams/{teamId}/tasksÚlohy (stránkované)completed (true/false), ownerId
/tasks/{id}Jednu úlohu--
/teams/{teamId}/issuesProblémy (stránkované)status (OPEN, SOLVING, SOLVED), priority (HIGH, MEDIUM, LOW)
/issues/{id}Jeden problém--
/teams/{teamId}/goalsRocks s míľnikmi (stránkované)quarter (2026-Q3), status (ON_TRACK, OFF_TRACK, DONE), level (COMPANY, DEPARTMENT)
/orgs/{orgId}/goalsFiremné 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}/metricsUkazovatele Scorecardu--
/metrics/{id}/valuesTýždenné hodnoty ukazovateľa, od najstaršej (stránkované)from, to (dni, vrátane)
/teams/{teamId}/meetingsStretnutia 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}/visionV/TO tímu (404, ak ho tím ešte nemá)--
/teams/{teamId}/org-chartPozície organizačnej štruktúry; parentId spája každú pozíciu s nadradenou--
/teams/{teamId}/people-reviewsHodnotenia ľudí (stránkované)quarter (2026-Q3)
/teams/{teamId}/documentsDokumenty 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í.

EndpointVraciaFiltre
/platform/orgsVšetky organizácie s ich stavom a počtom členov a tímov--
/platform/usersVšetky kontá s počtom organizácií a aktívnych API kľúčov, od najstaršieho (stránkované)--
/platform/users/{id}/api-keysAPI kľúče jedného konta, od najnovšieho -- len údaje o kľúči, nikdy kľúč samotný--
/platform/aiAI 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ódaPoužitieÚspešná odpoveď
POSTVytvorenie položky201 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 hodnoty200 OK s upravenou položkou
PUTVytvorenie 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
DELETEZmazanie položky204 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áciaKto 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íľnikyVlastní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ť ukazovateleAdministrá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 stretnutiaAdministrá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ýchAdministrá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ávKtorýkoľvek člen organizácie, do ktorej správa patrí
Upravovať V/TO; pridávať a upravovať pozície organizačnej štruktúryAdministrá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 dokumentyAdministrá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 v GET /teams/{teamId}/members); inak API odpovie 422 invalid. Ostatné úpravy fungujú, aj keď súčasný vlastník z tímu odišiel.
  • Jedna požiadavka, jedna zmena. PATCH s 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é meetingId novej ú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ľa week, deň stretnutia date) prijímajú len formát YYYY-MM-DD. Časový okamih ako 2026-10-14T00:00:00Z alebo neexistujúci deň ako 2026-02-30 API odmietne s 422 invalid.
  • Časové okamihy (startedAt stretnutia) potrebujú ISO 8601 s časovým pásmom: 2026-10-05T09:00:00+02:00 alebo 2026-10-05T07:00:00Z. Čas bez pásma, napríklad 2026-10-05T09:00:00, API odmietne s 422 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 v issues s 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 bez issues.

Úlohy (tasks) ​

EndpointÚčelOdpoveď
POST /teams/{teamId}/tasksVytvorenie úlohy201 Task
PATCH /tasks/{id}Úprava, dokončenie alebo znovuotvorenie úlohy200 Task
DELETE /tasks/{id}Zmazanie úlohy204

Telo pri vytvorení:

PoleTypPovinnéPoznámka
titlereťazecáno1--500 znakov
ownerIdreťazecánoČlen tímu
dueDatedeňánoYYYY-MM-DD
meetingIdreťazecnieStretnutie toho istého tímu, z ktorého úloha vzišla

Telo pri úprave -- všetky polia sú nepovinné, aspoň jedno je potrebné:

PoleTypPoznámka
titlereťazec1--500 znakov
ownerIdreťazecČlen tímu
dueDatedeňYYYY-MM-DD
completedbooleantrue úlohu dokončí a nastaví completedAt; false ju znovu otvorí a completedAt vymaže

Problémy (issues) ​

EndpointÚčelOdpoveď
POST /teams/{teamId}/issuesVytvorenie problému201 Issue
PATCH /issues/{id}Úprava problému alebo zmena jeho stavu200 Issue
DELETE /issues/{id}Zmazanie problému204

Telo pri vytvorení:

PoleTypPovinnéPoznámka
titlereťazecáno1--500 znakov
descriptionreťazecnieNajviac 5 000 znakov
priorityHIGH | MEDIUM | LOWniePredvolene MEDIUM
meetingIdreťazecnieStretnutie 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é:

PoleTypPoznámka
titlereťazec1--500 znakov
descriptionreťazecNajviac 5 000 znakov; "" popis vymaže
priorityHIGH | MEDIUM | LOW
statusOPEN | SOLVING | SOLVEDSOLVED nastaví resolvedAt na aktuálny čas; OPEN a SOLVING ho vymažú

Rocks (goals) a míľniky ​

EndpointÚčelOdpoveď
POST /teams/{teamId}/goalsVytvorenie Rocku201 Goal
PATCH /goals/{id}Úprava Rocku alebo nahlásenie jeho stavu200 Goal
DELETE /goals/{id}Zmazanie Rocku aj s míľnikmi204
POST /goals/{id}/milestonesPridanie míľnika k Rocku201 Milestone
PATCH /milestones/{id}Úprava, dokončenie alebo znovuotvorenie míľnika200 Milestone
DELETE /milestones/{id}Zmazanie míľnika204

Id míľnikov nájdete v poli milestones každého Rocku (GET /goals/{id}).

Telo pri vytvorení Rocku:

PoleTypPovinnéPoznámka
titlereťazecáno1--300 znakov
descriptionreťazecnieNajviac 5 000 znakov
ownerIdreťazecánoČlen tímu
quarterreťazecánoYYYY-Qn, napr. "2026-Q4" (roky 2000--2100)
levelCOMPANY | DEPARTMENTniePredvolene 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é:

PoleTypPoznámka
titlereťazec1--300 znakov
descriptionreťazecNajviac 5 000 znakov; "" popis vymaže
ownerIdreťazecČlen tímu
quarterreťazecYYYY-Qn
levelCOMPANY | DEPARTMENTCOMPANY len v leadership tíme
statusON_TRACK | OFF_TRACK | DONEJediné pole, ktoré smie zmeniť vlastník Rocku; ostatné polia potrebujú Administrátora tímu

Telá míľnikov:

PoleTypVytvorenieÚpravaPoznámka
titlereťazecpovinnénepovinné1--300 znakov
dueDatedeň alebo nullnepovinné, predvolene nullnepovinnéYYYY-MM-DD; null termín odstráni
completedboolean--nepovinnétrue míľnik dokončí, false ho znovu otvorí. Nové míľniky nie sú dokončené

Ukazovatele Scorecardu (metrics) ​

EndpointÚčelOdpoveď
POST /teams/{teamId}/metricsPridanie ukazovateľa na koniec Scorecardu tímu201 Metric
PATCH /metrics/{id}Úprava alebo presun ukazovateľa200 Metric
DELETE /metrics/{id}Zmazanie ukazovateľa so všetkými jeho hodnotami204
PUT /metrics/{id}/values/{week}Nastavenie hodnoty za jeden týždeň200 MetricValue

Telo pri vytvorení:

PoleTypPovinnéPoznámka
titlereťazecáno1--200 znakov
goalreťazecáno1--200 znakov. Cieľ s operátorom porovnania >, >=, <, <= alebo =, napr. ">=10" alebo "<5"; samotné číslo, napr. "10", znamená aspoň (>=)
ownerIdreťazecánoČlen tímu
unitreťazecnieNajviac 20 znakov, napr. "€" alebo "%"
descriptionreťazecnieNajviac 5 000 znakov

Telo pri úprave -- všetky polia sú nepovinné, aspoň jedno je potrebné:

PoleTypPoznámka
title, goal, ownerIdreťazecRovnako ako pri vytvorení
unit, descriptionreťazecRovnako 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áte YYYY-MM-DD. Akýkoľvek iný deň vráti 422 invalid („Weeks start on Monday“).
  • Požiadavka funguje ako upsert: hodnotu týždňa vytvorí alebo nahradí. Jej opakovanie dá rovnaký výsledok. enteredById si 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).
PoleTypPovinnéPoznámka
valuereťazecánoNajviac 50 znakov. Čísla posielajte ako reťazce: "12", nie 12
onTrackbooleannieČ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ÚčelOdpoveď
POST /teams/{teamId}/meetingsNaplánovanie stretnutia alebo zaznamenanie stretnutia, ktoré už prebehlo201 Meeting
PATCH /meetings/{id}Spustenie alebo ukončenie stretnutia, alebo oprava časov ukončeného stretnutia200 Meeting
PUT /meetings/{id}/ratings/meVaše vlastné hodnotenie stretnutia200 Rating
PUT /meetings/{id}/ratings/{userId}Nastavenie alebo vymazanie hodnotenia člena, alebo jeho označenie ako neprítomného200 Rating, pri vymazaní 204
POST /meetings/{id}/seguesPridanie vášho segue (dobrej správy)201 Segue
POST /meetings/{id}/headlinesPridanie novinky (headline) o zákazníkoch alebo zamestnancoch201 Headline
POST /meetings/{id}/messagesPridanie kaskádovej správy201 CascadingMessage
DELETE /messages/{id}Zmazanie kaskádovej správy204
POST /messages/acknowledgePotvrdenie prečítania kaskádových správ204

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:

TvarPoleTypPoznámka
NaplánovaniedatedeňDeň stretnutia, YYYY-MM-DD. Stretnutie začína v stave SCHEDULED
Zaznamenanie minulého stretnutiastartedAtčasový okamihKedy stretnutie začalo, s posunom časového pásma. Nie v budúcnosti
durationMincelé čísloDĺž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:

TvarPoleTypPoznámka
Posun stavustatusIN_PROGRESS | COMPLETEDLen 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 časovstartedAtčasový okamihLen ukončené stretnutia (inak 422). Nie v budúcnosti
durationMincelé čísloCelé 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/me s { "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 (inak 403 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 poliach ratingWindow.open a ratingWindow.closesAt.
  • PUT /meetings/{id}/ratings/{userId} je pre Administrátorov tímu (a Implementátorov) a okno na hodnotenie ho neobmedzuje, iba stav SCHEDULED. userId musí byť členom tímu (inak 422 invalid).

Telo musí mať presne jeden z týchto tvarov:

TeloÚčinokOdpoveď
{ "rating": 8 }Nastaví hodnotenie člena (1--10) a označí ho ako prítomného200 Rating
{ "rating": 0 }Vymaže hodnotenie člena: počíta sa ako prítomný, ale nehodnotil204 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á:

EndpointPoleTypPoznámka
segues, messagescontentreťazec1--1 000 znakov
headlinestypeCUSTOMER | EMPLOYEE
contentreťazec1--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ÚčelOdpoveď
POST /teams/{teamId}/visionVytvorenie V/TO tímu, ak ešte neexistuje (bez tela)201 Vision
PATCH /teams/{teamId}/visionNastavenie jedného poľa V/TO200 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:

PoleTypPoznámka
fieldreťazecJedno z coreValues, coreFocus, tenYearTarget, marketingStrategy, threeYearPicture, oneYearPlan, quarterlyRocks, issuesList
valuepodľa fieldPozri nasledujúcu tabuľku. Najviac 20 000 znakov v uloženej podobe

Každé pole prijíma jeden tvar:

Poliavalue
coreValues, quarterlyRocks, issuesListZoznam textov: najviac 100 položiek, každá 1--1 000 znakov (orezáva sa)
coreFocus, marketingStrategyObjekt 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, oneYearPlanText, 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:

json
{ "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ÚčelOdpoveď
POST /teams/{teamId}/org-chart/seatsPridanie pozície201 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 ňou204
PoleTypVytvorenieÚpravaPoznámka
titlereťazecpovinnénepovinné1--200 znakov
parentIdreťazecnepovinné--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úť
userIdreťazecnepovinnénepovinné alebo nullOsoba na pozícii, člen tímu. null pozíciu uvoľní
responsibilitiesreťazecnepovinné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.

PoleTypPovinnéPoznámka
userIdreťazecánoHodnotená osoba, člen tímu
quarterreťazecánoYYYY-Qn, napr. "2026-Q4" (roky 2000--2100)
coreValuesScoresobjektánoZá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
gwcobjektáno{"getsIt": true, "wantsIt": true, "capacityToDoIt": false} -- všetky tri booleany sú povinné
notesreťazecnieNajviac 5 000 znakov

Dokumenty ​

EndpointÚčelOdpoveď
POST /teams/{teamId}/documentsPridanie odkazu do dokumentov tímu201 Document
DELETE /documents/{id}Zmazanie dokumentu alebo odkazu204
PoleTypPovinnéPoznámka
namereťazecáno1--200 znakov
urlreťazecánoAdresa 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:

bash
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"}'
json
{
  "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:

bash
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:

bash
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"}'
json
{ "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:

bash
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):

bash
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}'
json
{
  "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:

bash
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}'
json
{ "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:

bash
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."}'
json
{
  "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ú:

bash
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ÚčelOdpoveď
PATCH /orgs/{orgId}Zmena názvu, časového pásma alebo predvoleného jazyka organizácie200 Organization
POST /orgs/{orgId}/membersPridanie člena -- existujúceho konta alebo nového konta s prihlásením cez Google201 člen s created
PATCH /orgs/{orgId}/members/{userId}Zmena roly člena v organizácii200 OrganizationMember
DELETE /orgs/{orgId}/members/{userId}Odobratie člena z organizácie a zo všetkých jej tímov204
POST /orgs/{orgId}/teamsVytvorenie tímu201 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átami204
POST /teams/{teamId}/membersPridanie člena organizácie do tímu201 TeamMember
PATCH /teams/{teamId}/members/{userId}Zmena tímovej roly člena200 TeamMember
DELETE /teams/{teamId}/members/{userId}Odobratie člena z tímu204

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é:

PoleTypPoznámka
namereťazec1--200 znakov
timezonereťazecČasové pásmo IANA, napr. "Europe/Bratislava"; neznáme pásmo vráti 422 invalid
defaultLocaleen | skJazyk nových kont vytvorených v tejto organizácii

Členovia organizácie ​

POST /orgs/{orgId}/members pridá človeka podľa e-mailu:

PoleTypPovinnéPoznámka
emailreťazecánoE-mailová adresa človeka
roleOWNER | ADMIN | MEMBER | IMPLEMENTERánoJeho rola v organizácii
namereťazecnieNajviac 200 znakov; použije sa len pri vytvorení nového konta
googleOnlybooleanpri novom konteMusí 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 odpovie 422 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 password vráti 422 invalid.
  • Odpoveďou je člen a "created": true, ak sa vytvorilo nové konto, alebo false, ak sa pridalo existujúce. Človek, ktorý už je členom, vráti 422 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 OWNER alebo ADMIN, ako aj zmeniť či odobrať člena, ktorý je Vlastníkom alebo Administrátorom, môže len Vlastník organizácie; Administrátor dostane 403 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é:

PoleTypPoznámka
namereťazec1--100 znakov. slug sa nemení
isLeadershipbooleanLeadership tímy spravujú firemné Rocks
meetingDurationMincelé čísloDĺžka stretnutia v minútach, udržiava sa medzi 10 a 300
meetingWarningMincelé čísloMinú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 ​

EndpointTeloPoznámka
POST /teams/{teamId}/membersuserId, 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}role404 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:

bash
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"}'
json
{ "userId": "cmg4z…", "email": "peter@acme.com", "name": "Peter Kováč", "role": "MEMBER", "joinedAt": "2026-10-07T11:20:05.000Z", "created": false }
bash
curl -s -X POST "$BASE/teams/$TEAM_ID/members" \
  -H "Authorization: Bearer $EOSHUB_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId": "cmg4z…", "role": "ADMIN"}'
json
{ "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ÚčelOdpoveď
GET /platform/orgsVšetky organizácie200 zoznam PlatformOrganization
POST /platform/orgsVytvorenie organizácie s prvým Vlastníkom201 PlatformOrganization
PATCH /platform/orgs/{id}Pozastavenie alebo obnovenie organizácie200 PlatformOrganization
GET /platform/usersVšetky kontá s počtami (stránkované)200 zoznam PlatformUser
GET /platform/users/{id}/api-keysAPI 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ľa204
GET /platform/aiAI poskytovatelia (kľúče maskované) a systémové prompty200 AiConfig
PUT /platform/ai/providers/{type}Nastavenie API kľúča a predvoleného modelu poskytovateľa200 AiProvider
PATCH /platform/ai/providers/{type}Zapnutie alebo vypnutie poskytovateľa200 AiProvider
DELETE /platform/ai/providers/{type}Zmazanie poskytovateľa204, alebo 404, ak neexistuje
PUT /platform/ai/prompts/{inputType}Nastavenie systémového promptu pre typ vstupu200 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:

PoleTypPovinnéPoznámka
namereťazecáno1--200 znakov; vygeneruje sa z neho slug
timezonereťazecánoČasové pásmo IANA, napr. "Europe/Bratislava"
defaultLocaleen | skáno
ownerobjektánoemail 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.

EndpointTeloPozná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:

bash
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"}'
json
{ "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 ​

Built with VitePress