Overview
The Teams API enables programmatic management of teams, members, invitations, usage tracking, and access control. Base URL:/api/teams
Authentication: All endpoints require session authentication unless otherwise noted.
Team Identifiers: Endpoints accept either UUID (550e8400-e29b-xxxx-xxxxx-xxxxx) or numeric ID (123).
Error Response Format
All errors return JSON in this format:| Code | Status | Description |
|---|---|---|
UNAUTHORIZED | 401 | Session required |
FORBIDDEN | 403 | Insufficient permissions |
NOT_FOUND | 404 | Resource not found |
CONFLICT | 409 | Resource conflict (duplicate, wrong state) |
INVALID_INPUT | 422 | Validation failed |
RATE_LIMITED | 429 | Too many requests |
INTERNAL_ERROR | 500 | Server error |
Teams
List Teams
Returns all teams the authenticated user belongs to.Create Team
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | 2-50 characters. Letters, numbers, spaces, hyphens, underscores. |
409 CONFLICT: You already have a team with this name
Get Team Details
balancesshows the team owner’s account balanceroleis the requesting user’s role in this team
Update Team
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | 2-50 characters |
status | string | No | active, paused, or suspended |
Delete Team
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Must exactly match team name (confirmation) |
Members
List Members
| Parameter | Type | Default | Description |
|---|---|---|---|
page | number | 1 | Page number |
limit | number | all | Results per page (max 100) |
Update Member Role
| Field | Type | Required | Description |
|---|---|---|---|
sessionId | number | Yes | Target member’s session ID |
role | string | Yes | admin or member (cannot set owner) |
403 FORBIDDEN: Cannot change the owner’s role400 INVALID_INPUT: Cannot change your own role
Update Member Usage Limits
| Field | Type | Required | Description |
|---|---|---|---|
sessionId | number | Yes | Target member’s session ID |
usage_limit_usd | number|null | No | Monthly limit in USD, or null to use team default |
usage_limit_enforced | boolean | No | Hard-enforce the limit (blocks usage when exceeded) |
Remove Member
403 FORBIDDEN: Cannot remove the team owner400 INVALID_INPUT: Cannot remove yourself (use/leave)
Get Own Preferences
Returns the authenticated user’s preferences for this team.effective_*fields show the resolved limit (member override or team default)
Update Own Preferences
| Field | Type | Required | Description |
|---|---|---|---|
bill_to_team | boolean | No | Bill usage to team or personal account |
name | string | No | Display name (1-100 characters) |
Leave Team
403 FORBIDDEN: Owner must transfer ownership before leaving
Invitations
List Pending Invitations
Send Invitation
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Valid email address |
role | string | No | admin or member (default: member) |
Revoke Invitation
| Field | Type | Required | Description |
|---|---|---|---|
action | string | No | Must be revoke (default) |
id | string | No* | Invitation UUID |
token | string | No* | Invitation token (min 16 chars) |
id or token
Response:
Accept Invitation
| Field | Type | Required | Description |
|---|---|---|---|
token | string | Yes | Invitation token (min 16 characters) |
409 CONFLICT: Invitation is not pending409 CONFLICT: Invitation has expired
Lookup Invitation
Public endpoint to check invitation details before accepting.Invite Links
Get Invite Link Status
Enable/Disable Invite Link
| Field | Type | Required | Description |
|---|---|---|---|
action | string | No | enable (default) or disable |
Send Invite Link via Email
| Field | Type | Required | Description |
|---|---|---|---|
emails | string[] | Yes | 1-10 valid email addresses |
403 FORBIDDEN: Invite link is disabled429 RATE_LIMITED: Too many emails
Join via Invite Link
Cancel Join Request
Join Requests
List Join Requests
Accept/Reject Join Request
| Field | Type | Required | Description |
|---|---|---|---|
action | string | No | accept (default) or reject |
id | string | Yes | Join request UUID |
Delete Join Request
Delete a processed (non-pending) join request.409 CONFLICT: Cannot delete a pending request (must accept/reject first)
Usage & Billing
Get Team Usage
| Parameter | Type | Default | Description |
|---|---|---|---|
from | string | - | Start date (ISO format) |
to | string | - | End date (ISO format) |
Settings
Update Team Settings
| Field | Type | Required | Description |
|---|---|---|---|
default_member_usage_limit_usd | number|null | No | Default monthly limit for members |
team_usage_limit_usd | number|null | No | Team-wide spending limit |
usage_limit_enforced | boolean | No | Hard-enforce limits |
Model Access Control
Get Allowed Models
Update Allowed Models
| Field | Type | Required | Description |
|---|---|---|---|
allowed_models | object|null | Yes | Map of model keys to boolean, or null for all |
- Models not listed in the map are allowed by default
- Set a model to
falseto explicitly restrict it - Set
allowed_modelstonullto allow all models
Ownership
Transfer Ownership
| Field | Type | Required | Description |
|---|---|---|---|
sessionId | number | Yes | New owner’s session ID |
- Current owner becomes admin
- Target member becomes owner
409 CONFLICT: Target is already the owner400 INVALID_INPUT: Cannot transfer ownership to yourself
Role Reference
| Role | Create Team | View Team | Manage Members | Manage Settings | Delete Team |
|---|---|---|---|---|---|
| Owner | - | Yes | Yes | Yes | Yes |
| Admin | - | Yes | Yes | Yes | No |
| Member | - | Yes | No | No | No |
Rate Limits
| Endpoint | Limit |
|---|---|
POST /api/teams/{teamUuid}/invite-link/email | 5 emails per minute |
Webhooks (Coming Soon)
Future webhook events:team.member.joinedteam.member.removedteam.usage.limit_reachedteam.status.changed