Kioo API

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/v1

Authentication

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.

Conventions

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."
  }
}

AI assistants (MCP)

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/mcp

Add 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.

Structure

GET/organization

The 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
}
GET/me

You — the connected member

The 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" }] }
  ]
}
GET/org-units

The org-unit hierarchy

Every 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" } }
  ]
}
GET/org-unit-types

The named layers of the hierarchy

e.g. Division › Value Stream › Cluster.

{
  "data": [
    { "object": "org_unit_type", "id": "out_1…", "name": "Division", "level": 0 }
  ]
}
GET/team-types

Team type definitions

The team types available in your organization.

{
  "data": [
    { "object": "team_type", "id": "tt_11…", "name": "Product team", "color": "#4f8cff" }
  ]
}
GET/teams

List every team

A 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
}
GET/teams/{teamId}

One team in full

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"] }
  ]
}

People

GET/teams/{teamId}/members

The people on a team

Name, 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" }] }
  ]
}
GET/people

Everyone in the organization

The full member directory.

{
  "data": [
    { "object": "person", "id": "u_5c…", "name": "A. Example", "email": "a.example@…" }
  ],
  "next_cursor": null
}
GET/people/{personId}

One person and every team they’re on

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" }] }
  ]
}
GET/roles

Functional role definitions

e.g. Tech Lead, Product Owner. Referenced by a person’s roles.

{
  "data": [
    { "object": "role", "id": "r_2…", "name": "Tech Lead", "description": null }
  ]
}

Graph

GET/dependencies

The whole dependency graph

Every 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"]
}
GET/teams/{teamId}/dependencies

Dependencies for one team

The 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"] }
  ]
}
Kioo API · read-only · v1