Skip to content

/v1/me now returns the org's teams

Released: June 14, 2026

The introspection endpoint now returns the list of teams under the calling organization alongside the existing organization, api_key, and rate_limits blocks. Each entry surfaces the internal id you must pass as team_id on team-scoped writes.

{
"data": {
"organization": { "id": "org_…", "object": "organization", "name": "Acme" },
"api_key": { "id": "key_…", "object": "api_key", "label": "prod", "last4": "abcd" },
"rate_limits": { "tier": "default", "write_per_minute": 60, "read_per_minute": 600 },
"teams": [
{ "id": "team_01H…", "object": "team", "name": "Default", "slug": "default" },
{ "id": "team_01J…", "object": "team", "name": "Sales", "slug": "sales" }
]
},
"request_id": "req_…"
}

POST /v1/customers (and other team-scoped writes) requires a team_id whenever the org has more than one team. Until now there was no programmatic way to enumerate those ids — integrators had to copy them out of the dashboard. /me is the natural discovery point and now makes onboarding flows fully self-service.

Behaviour matrix for team_id resolution stays the same:

Org hasteam_id omittedteam_id provided
1 teamAuto-selectedValidated; rejected if cross-org
2+ teams400 missing_required_field, param: team_idValidated; rejected if cross-org
0 teams400 invalid_field_value(same)

@kirimdev/sdk ≥ 3.5.0 exposes the new array on the typed MeContext returned by kirim.me():

const ctx = await kirim.me()
const teamId =
ctx.teams.length === 1
? ctx.teams[0]!.id
: promptUserToPickATeam(ctx.teams)
await kirim.customers.create({ name: 'Acme', team_id: teamId })

A new exported type MePublicTeam covers the per-entry shape if you need to pass the list around in your own code.

This change is purely additive. Existing consumers ignoring the extra field continue to work without modification — no breaking changes to any other field on the /me response.

Read the Authentication docs →