Skip to main content

Overview

Team management endpoints allow you to create and manage teams with shared budgets, model access, and rate limits.

Create Team

POST /team/new

Create a new team.

Request Body

team_id
string
required
Unique identifier for the team.
team_alias
string
Human-readable name for the team.
models
array
Models this team can access.
{"models": ["gpt-4", "gpt-3.5-turbo", "claude-2"]}
max_budget
number
Maximum spending limit for the team in USD.
tpm_limit
integer
Team-wide tokens per minute limit.
rpm_limit
integer
Team-wide requests per minute limit.
budget_duration
string
Budget reset period.Examples: "1d" (daily), "30d" (monthly), null (never resets)
metadata
object
Custom metadata for the team.
blocked
boolean
default:"false"
Whether the team is blocked.

Response

team_id
string
The created team ID.
team_alias
string
Team name.
models
array
Accessible models.
max_budget
number
Budget limit.
spend
number
Current spend (starts at 0).

Example

curl -X POST http://localhost:4000/team/new \
  -H "Authorization: Bearer sk-admin-xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "team_id": "engineering-team",
    "team_alias": "Engineering Team",
    "models": ["gpt-4", "gpt-3.5-turbo"],
    "max_budget": 1000.0,
    "tpm_limit": 1000000,
    "rpm_limit": 10000,
    "budget_duration": "30d",
    "metadata": {
      "department": "Engineering",
      "cost_center": "CC-123"
    }
  }'
import requests

response = requests.post(
    "http://localhost:4000/team/new",
    headers={"Authorization": "Bearer sk-admin-xxx"},
    json={
        "team_id": "engineering-team",
        "team_alias": "Engineering Team",
        "models": ["gpt-4", "gpt-3.5-turbo"],
        "max_budget": 1000.0,
        "tpm_limit": 1000000,
        "rpm_limit": 10000,
        "budget_duration": "30d"
    }
)

team = response.json()
print(f"Created team: {team['team_id']}")

List Teams

GET /team/list

List all teams.

Response

Returns array of team objects:
teams
array
Array of team objects.

Example

curl -X GET 'http://localhost:4000/team/list' \
  -H "Authorization: Bearer sk-admin-xxx"
import requests

response = requests.get(
    "http://localhost:4000/team/list",
    headers={"Authorization": "Bearer sk-admin-xxx"}
)

teams = response.json()["teams"]
for team in teams:
    print(f"Team: {team['team_alias']}")
    print(f"  Spend: ${team['spend']:.2f} / ${team['max_budget']:.2f}")
    print(f"  Models: {', '.join(team['models'])}")

Get Team Info

GET /team/info

Get detailed information about a specific team.

Query Parameters

team_id
string
required
The team ID to query.

Response

team_id
string
Team identifier.
team_alias
string
Team name.
models
array
Accessible models.
spend
number
Current spend.
max_budget
number
Budget limit.
metadata
object
Custom metadata.
members
array
Team members (keys and users).

Example

curl -X GET 'http://localhost:4000/team/info?team_id=engineering-team' \
  -H "Authorization: Bearer sk-admin-xxx"
import requests

response = requests.get(
    "http://localhost:4000/team/info",
    headers={"Authorization": "Bearer sk-admin-xxx"},
    params={"team_id": "engineering-team"}
)

team = response.json()
print(f"Team: {team['team_alias']}")
print(f"Budget: ${team['spend']:.2f} / ${team['max_budget']:.2f}")
print(f"Members: {len(team['members'])}")

Update Team

POST /team/update

Update an existing team.

Request Body

team_id
string
required
The team ID to update.
team_alias
string
Update team name.
models
array
Update accessible models.
max_budget
number
Update budget limit.
tpm_limit
integer
Update TPM limit.
rpm_limit
integer
Update RPM limit.
metadata
object
Update metadata.
blocked
boolean
Block or unblock the team.

Example

curl -X POST http://localhost:4000/team/update \
  -H "Authorization: Bearer sk-admin-xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "team_id": "engineering-team",
    "max_budget": 2000.0,
    "models": ["gpt-4", "gpt-3.5-turbo", "claude-2"]
  }'
import requests

response = requests.post(
    "http://localhost:4000/team/update",
    headers={"Authorization": "Bearer sk-admin-xxx"},
    json={
        "team_id": "engineering-team",
        "max_budget": 2000.0,
        "tpm_limit": 2000000
    }
)

Delete Team

POST /team/delete

Delete a team.

Request Body

team_ids
array
required
Array of team IDs to delete.
{"team_ids": ["team-1", "team-2"]}

Example

curl -X POST http://localhost:4000/team/delete \
  -H "Authorization: Bearer sk-admin-xxx" \
  -H "Content-Type: application/json" \
  -d '{"team_ids": ["engineering-team"]}'
import requests

response = requests.post(
    "http://localhost:4000/team/delete",
    headers={"Authorization": "Bearer sk-admin-xxx"},
    json={"team_ids": ["engineering-team"]}
)

Block/Unblock Team

POST /team/block

Block a team from making requests.
curl -X POST http://localhost:4000/team/block \
  -H "Authorization: Bearer sk-admin-xxx" \
  -H "Content-Type: application/json" \
  -d '{"team_id": "engineering-team"}'

POST /team/unblock

Unblock a previously blocked team.
curl -X POST http://localhost:4000/team/unblock \
  -H "Authorization: Bearer sk-admin-xxx" \
  -H "Content-Type: application/json" \
  -d '{"team_id": "engineering-team"}'

Team Member Management

Add Member to Team

Create a key associated with a team:
curl -X POST http://localhost:4000/key/generate \
  -H "Authorization: Bearer sk-admin-xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "team_id": "engineering-team",
    "models": ["gpt-4"],
    "duration": "30d"
  }'
The key will inherit the team’s model access and contribute to the team’s budget/rate limits.

List Team Members

Get team info to see all members:
import requests

response = requests.get(
    "http://localhost:4000/team/info",
    headers={"Authorization": "Bearer sk-admin-xxx"},
    params={"team_id": "engineering-team"}
)

team = response.json()
for member in team['members']:
    print(f"Member: {member['user_id']}, Key: {member['key']}")

Complete Example

import requests
import json

BASE_URL = "http://localhost:4000"
ADMIN_KEY = "sk-admin-xxx"

headers = {
    "Authorization": f"Bearer {ADMIN_KEY}",
    "Content-Type": "application/json"
}

# 1. Create a team
team_response = requests.post(
    f"{BASE_URL}/team/new",
    headers=headers,
    json={
        "team_id": "data-science-team",
        "team_alias": "Data Science Team",
        "models": ["gpt-4", "claude-2"],
        "max_budget": 500.0,
        "tpm_limit": 500000,
        "budget_duration": "30d",
        "metadata": {"department": "Data Science"}
    }
)
print(f"Created team: {team_response.json()['team_id']}")

# 2. Create keys for team members
for i in range(3):
    key_response = requests.post(
        f"{BASE_URL}/key/generate",
        headers=headers,
        json={
            "team_id": "data-science-team",
            "user_id": f"ds-user-{i+1}",
            "models": ["gpt-4"],
            "duration": "30d"
        }
    )
    print(f"Created key for user {i+1}")

# 3. Get team info
info_response = requests.get(
    f"{BASE_URL}/team/info",
    headers=headers,
    params={"team_id": "data-science-team"}
)
team = info_response.json()
print(f"\nTeam Info:")
print(f"  Name: {team['team_alias']}")
print(f"  Budget: ${team['spend']:.2f} / ${team['max_budget']:.2f}")
print(f"  Members: {len(team['members'])}")

# 4. Update team budget
update_response = requests.post(
    f"{BASE_URL}/team/update",
    headers=headers,
    json={
        "team_id": "data-science-team",
        "max_budget": 1000.0
    }
)
print("\nUpdated team budget to $1000")

# 5. List all teams
list_response = requests.get(
    f"{BASE_URL}/team/list",
    headers=headers
)
teams = list_response.json()["teams"]
print(f"\nTotal teams: {len(teams)}")
for team in teams:
    print(f"  - {team['team_alias']}: ${team['spend']:.2f} / ${team['max_budget']:.2f}")

Team Budgets and Rate Limits

How Team Budgets Work

  1. Shared budget: All keys in a team share the same budget
  2. Budget tracking: Spending is tracked at the team level
  3. Budget enforcement: Requests are rejected when team budget is exceeded
  4. Budget reset: Budgets can reset daily, monthly, or never

How Team Rate Limits Work

  1. Shared limits: TPM/RPM limits are shared across all team members
  2. Real-time tracking: Limits are enforced in real-time
  3. 429 responses: Rate limit exceeded returns 429 error

Example: Team with Budget and Limits

# Create team with strict limits
team_response = requests.post(
    "http://localhost:4000/team/new",
    headers={"Authorization": "Bearer sk-admin-xxx"},
    json={
        "team_id": "startup-team",
        "max_budget": 50.0,        # $50 budget
        "tpm_limit": 100000,       # 100K tokens/min
        "rpm_limit": 1000,         # 1K requests/min
        "budget_duration": "30d"   # Resets monthly
    }
)

# All team members share these limits

Build docs developers (and LLMs) love