/organizationThe organization this token belongs to
Your organization, with total team and people counts.
{
"object": "organization",
"id": "o_1a…",
"name": "Acme",
"slug": "acme",
"team_count": 24,
"people_count": 88
}A read-only HTTP API over your organization’s team graph — teams, their mandates, the people on them and their roles, and the dependencies between teams. It exposes only what a member already sees inside Kioo.
Base URL
https://api.kioo.app/v1Authentication
Send your key as a bearer token. Create one in Kioo under Settings → Integration.curl https://api.kioo.app/v1/teams \ -H "Authorization: Bearer kioo_…"
The full machine-readable spec lives at /openapi.yaml.
Every request is scoped to your organization by the key. The API is read-only (GET only) and rate-limited to roughly 600 requests per minute per key.
IDs are opaque strings and timestamps are ISO-8601 UTC. A single resource carries an object field; lists are wrapped in a cursor envelope:
{ "data": [ … ], "next_cursor": null }Errors return a consistent shape with a real HTTP status — 401 (missing / invalid / expired key), 404 (no such resource in your organization), 429 (rate limited; see the Retry-After header):
{
"error": {
"type": "invalid_token",
"message": "Missing, invalid, expired, or revoked API token."
}
}Kioo speaks the Model Context Protocol (MCP), so you can point an AI assistant — Claude, Cursor, and other MCP-capable tools — straight at your team graph and just ask it questions. Same data as the API above, same read-only, org-scoped access; the assistant calls it as tools on your behalf.
Server URL
https://mcp.kioo.app/mcpAdd that URL to your assistant — it opens a Kioo page asking you to allow read-only access, you click Allow, and you’re connected. No key to create or paste. For Claude Code:
claude mcp add --transport http kioo https://mcp.kioo.app/mcp
Prefer a static key (CI, a headless agent)? Create one under Settings → Integration and pass it as a header instead: --header "Authorization: Bearer kioo_…".
Once connected, the assistant can call these read-only tools: get_current_user, get_organization, list_teams, get_team, get_team_members, get_team_dependencies, list_people, get_person, list_roles, list_org_units, list_org_unit_types, list_team_types and list_dependencies — each returning exactly what the matching endpoint above does.
/organizationYour organization, with total team and people counts.
{
"object": "organization",
"id": "o_1a…",
"name": "Acme",
"slug": "acme",
"team_count": 24,
"people_count": 88
}/meThe member this token belongs to (the one who connected the app, or minted the key) and every team they’re on, with roles. The one-call answer to “my teams”. 404 for a platform-minted token with no member.
{
"object": "person",
"id": "u_5c…",
"name": "A. Example",
"email": "a.example@…",
"memberships": [
{ "team": { "id": "t_9f2a…", "name": "Payments Platform" },
"team_role": "admin",
"roles": [{ "id": "r_2…", "name": "Tech Lead" }] }
]
}/org-unitsEvery org unit, each with its parent and the layer it sits at.
{
"data": [
{ "object": "org_unit", "id": "ou_03…", "name": "Consumer",
"parent_id": null,
"type": { "id": "out_1…", "name": "Division" } }
]
}/org-unit-typese.g. Division › Value Stream › Cluster.
{
"data": [
{ "object": "org_unit_type", "id": "out_1…", "name": "Division", "level": 0 }
]
}/team-typesThe team types available in your organization.
{
"data": [
{ "object": "team_type", "id": "tt_11…", "name": "Product team", "color": "#4f8cff" }
]
}/teamsA summary per team — including each team’s purpose, so you rarely need to fetch teams one by one. Filter with ?org_unit_id= and/or ?team_type_id=.
{
"data": [
{ "object": "team", "id": "t_9f2a…", "name": "Payments Platform",
"type": { "id": "tt_11…", "name": "Product team" },
"org_unit": { "id": "ou_03…", "name": "Consumer" },
"purpose": "Own the shared payments rails…",
"member_count": 7 }
],
"next_cursor": null
}/teams/{teamId}The team’s profile (purpose, scope, …), the people on it with their roles, its links, and the dependencies touching it.
{
"object": "team",
"id": "t_9f2a…",
"name": "Payments Platform",
"type": { "id": "tt_11…", "name": "Product team" },
"org_unit": { "id": "ou_03…", "name": "Consumer" },
"profile": {
"purpose": "Own the shared payments rails…",
"scope": "All card and account-to-account flows…",
"work_style": "mix"
},
"members": [
{ "id": "u_5c…", "name": "A. Example",
"email": "a.example@…", "team_role": "admin",
"roles": [{ "id": "r_2…", "name": "Tech Lead" }] }
],
"dependencies": [
{ "counterpart_team": { "id": "t_04b…", "name": "Identity" },
"direction": "we_depend_on_them", "modes": ["x_as_a_service"] }
]
}/teams/{teamId}/membersName, email, team role (admin / coach / member) and functional roles.
{
"data": [
{ "id": "u_5c…", "name": "A. Example",
"email": "a.example@…", "team_role": "admin",
"roles": [{ "id": "r_2…", "name": "Tech Lead" }] }
]
}/peopleThe full member directory.
{
"data": [
{ "object": "person", "id": "u_5c…", "name": "A. Example", "email": "a.example@…" }
],
"next_cursor": null
}/people/{personId}Their memberships across the org, with roles on each team.
{
"object": "person",
"id": "u_5c…",
"name": "A. Example",
"email": "a.example@…",
"memberships": [
{ "team": { "id": "t_9f2a…", "name": "Payments Platform" },
"team_role": "admin",
"roles": [{ "id": "r_2…", "name": "Tech Lead" }] }
]
}/rolese.g. Tech Lead, Product Owner. Referenced by a person’s roles.
{
"data": [
{ "object": "role", "id": "r_2…", "name": "Tech Lead", "description": null }
]
}/dependenciesEvery dependency between teams, in absolute terms.
{
"object": "dependency",
"id": "dep_7a…",
"team_a": { "id": "t_9f2a…", "name": "Payments Platform" },
"team_b": { "id": "t_04b…", "name": "Identity" },
"direction": "a_depends_on_b",
"a_modes": ["x_as_a_service"]
}/teams/{teamId}/dependenciesThe edges touching a single team, framed relative to it.
{
"data": [
{ "object": "dependency", "id": "dep_7a…",
"counterpart_team": { "id": "t_04b…", "name": "Identity" },
"direction": "we_depend_on_them",
"modes": ["x_as_a_service"] }
]
}