Skip to main content

API Key Management

Manage your existing API keys to maintain security and control costs.

Viewing API Keys​

Via Web Interface​

  1. Navigate to API Keys in the sidebar
  2. View all keys with:
    • Name and description
    • Creation date
    • Last used timestamp
    • Usage statistics
    • Budget status

Via API​

import requests

response = requests.get(
"http://localhost/api-internal/v1/api-keys",
headers={"Authorization": "Bearer YOUR_JWT_TOKEN"}
)

keys = response.json()["keys"]
for key in keys:
print(f"Name: {key['name']}")
print(f"Created: {key['created_at']}")
print(f"Last Used: {key['last_used']}")
print(f"Total Cost: ${key['total_spend']:.2f}")
print("-" * 40)

Updating API Keys​

Update Permissions​

response = requests.put(
"http://localhost/api-internal/v1/api-keys/{key_id}",
headers={"Authorization": "Bearer YOUR_JWT_TOKEN"},
json={
"allowed_models": ["gpt-4"], # Restrict to GPT-4 only
"daily_spend_limit": 50.00 # Increase daily limit
}
)

Update Budget Limits​

response = requests.put(
f"http://localhost/api-internal/v1/api-keys/{key_id}/budget",
headers={"Authorization": "Bearer YOUR_JWT_TOKEN"},
json={
"daily_spend_limit": 100.00,
"monthly_spend_limit": 3000.00,
"daily_token_limit": 1000000,
"alert_threshold": 0.75 # Alert at 75%
}
)

Rotating API Keys​

Why Rotate Keys?​

  • Security: Regular rotation reduces risk of compromised keys
  • Compliance: Many security standards require periodic rotation
  • Access Control: Revoke old keys when team members leave

Rotation Process​

  1. Create New Key
response = requests.post(
"http://localhost/api-internal/v1/api-keys",
headers={"Authorization": "Bearer YOUR_JWT_TOKEN"},
json={
"name": "Production App v2",
"description": "Replacement for old key",
"allowed_models": ["gpt-4"],
"daily_spend_limit": 100.00
}
)

new_key = response.json()["api_key"]
  1. Update Application

Update your application configuration to use the new key:

# Old key
API_KEY = "en_old_key_xxxxxxxx"

# New key
API_KEY = "en_new_key_yyyyyyyy"
  1. Test New Key
response = requests.get(
"http://localhost/api/v1/models",
headers={"Authorization": "Bearer en_new_key_yyyyyyyy"}
)

assert response.status_code == 200
  1. Delete Old Key
requests.delete(
f"http://localhost/api-internal/v1/api-keys/{old_key_id}",
headers={"Authorization": "Bearer YOUR_JWT_TOKEN"}
)

Revoking API Keys​

Immediate Revocation​

requests.delete(
f"http://localhost/api-internal/v1/api-keys/{key_id}",
headers={"Authorization": "Bearer YOUR_JWT_TOKEN"}
)

All requests using this key will immediately fail with 401 Unauthorized.

Revoke via Web Interface​

  1. Navigate to API Keys
  2. Find the key to revoke
  3. Click Delete button
  4. Confirm deletion

Monitoring Key Usage​

Check Current Usage​

response = requests.get(
f"http://localhost/api-internal/v1/api-keys/{key_id}/usage",
headers={"Authorization": "Bearer YOUR_JWT_TOKEN"}
)

usage = response.json()
print(f"Requests today: {usage['requests_today']}")
print(f"Tokens used today: {usage['tokens_today']}")
print(f"Cost today: ${usage['cost_today']:.2f}")
print(f"Budget remaining: ${usage['budget_remaining']:.2f}")

Usage by Model​

response = requests.get(
f"http://localhost/api-internal/v1/api-keys/{key_id}/usage",
headers={"Authorization": "Bearer YOUR_JWT_TOKEN"},
params={"breakdown": "by_model"}
)

for model_usage in response.json()["by_model"]:
model = model_usage["model"]
requests = model_usage["requests"]
cost = model_usage["cost"]
print(f"{model}: {requests} requests, ${cost:.2f}")

Budget Alerts​

Setting Up Alerts​

response = requests.put(
f"http://localhost/api-internal/v1/api-keys/{key_id}/budget",
headers={"Authorization": "Bearer YOUR_JWT_TOKEN"},
json={
"alert_threshold": 0.8,
"alert_email": "team@company.com"
}
)

Alert Types​

  • Threshold Reached: When usage hits alert percentage
  • Budget Exceeded: When limit is hit
  • Daily Summary: Daily usage summary (optional)

Best Practices​

Key Organization​

StrategyDescriptionUse Case
Environment-basedSeparate keys per environmentdev/staging/prod
Application-basedSeparate keys per applicationweb-app/mobile-app/backend
Team-basedSeparate keys per teamteam-a/team-b/shared
Feature-basedSeparate keys per featurechatbot/rag/agents

Rotation Schedule​

FrequencyRecommended For
WeeklyHigh-security environments
MonthlyStandard production environments
QuarterlyLower-risk applications

Monitoring Frequency​

  • Daily: Review usage for critical production keys
  • Weekly: Check all keys for unusual activity
  • Monthly: Comprehensive budget review and adjustment

Troubleshooting​

Key Not Working After Update​

Problem: 401 errors after updating permissions

Solution:

# Clear any cached credentials
# In your application:
API_KEY = "en_new_key_xxxxxxxx"

Can't Find Key ID​

Problem: Need key ID but don't have it

Solution:

# List all keys to find the ID
response = requests.get(
"http://localhost/api-internal/v1/api-keys",
headers={"Authorization": "Bearer YOUR_JWT_TOKEN"}
)

for key in response.json()["keys"]:
if key["name"] == "Production App":
print(f"Key ID: {key['id']}")

Budget Not Enforcing​

Problem: Spending exceeds limit without rejection

Solution:

  • Check budget enforcement is enabled in platform settings
  • Verify budget values are correct (no typos like 10.00 vs 100.00)
  • Ensure correct key ID is being used

Next Steps​