API Keys
API keys are required to access Enclava's public API endpoints.
Creating an API Key
Via Web Interface
-
Navigate to API Keys in the sidebar
-
Click Create API Key
-
Fill in the configuration form:
Basic Settings:
- Name: Descriptive name (e.g., "Production App", "Dev Bot")
- Description: Optional additional information
- Prefix: Auto-generated prefix (default:
en_)
Model Access:
- Allowed Models: Leave empty for all models, or specify (e.g.,
gpt-4,gpt-3.5-turbo) - Purpose: Restrict key to specific use cases
Budget Limits:
- Daily Spend Limit: Maximum spend per day (e.g., 10.00)
- Monthly Spend Limit: Maximum spend per month (e.g., 300.00)
- Daily Token Limit: Maximum tokens per day (e.g., 100000)
- Alert Threshold: Percentage at which to send alerts (e.g., 0.8 for 80%)
-
Click Create to generate the key
Via API
import requests
response = requests.post(
"http://localhost/api-internal/v1/api-keys",
headers={
"Authorization": "Bearer YOUR_JWT_TOKEN"
},
json={
"name": "Production App",
"description": "API key for production application",
"allowed_models": ["gpt-4", "gpt-3.5-turbo"],
"daily_spend_limit": 50.00,
"monthly_spend_limit": 1500.00,
"daily_token_limit": 500000
}
)
api_key = response.json()["api_key"]
print(f"Your API key: {api_key}")
⚠️ Important: Copy the API key immediately - you won't see it again!
API Key Format
Enclava API keys follow this format:
en_<random-string>
Example: en_8f3d4e2a9b1c6d5f7e8a3b4c9d2f1e6a
The prefix en_ identifies Enclava keys and helps with organization.
Naming Best Practices
Use descriptive names to identify keys easily:
| Purpose | Example Name |
|---|---|
| Development environment | dev-app-v1 |
| Production web app | prod-web-app |
| Chatbot widget | chatbot-widget-frontend |
| Internal tool | internal-data-processor |
| Testing | test-script-automation |
Setting Model Access
All Models (Default)
Leave "Allowed Models" empty:
{
"name": "Full Access Key",
"allowed_models": []
}
This key can access all models available on your platform.
Specific Models
Specify models explicitly:
{
"name": "GPT-4 Only Key",
"allowed_models": ["gpt-4"]
}
This key can only use gpt-4, useful for cost control.
Multiple Models
Specify comma-separated list:
{
"name": "Production Models",
"allowed_models": ["gpt-4", "gpt-3.5-turbo"]
}
Setting Budget Limits
Daily Spend Limit
Prevents unexpected costs on a daily basis:
{
"daily_spend_limit": 25.00
}
After $25 of usage in a day, requests using this key will be rejected.
Monthly Spend Limit
Controls overall monthly spending:
{
"monthly_spend_limit": 750.00
}
Good for predictable monthly budgets.
Token Limits
Control usage by token count:
{
"daily_token_limit": 250000
}
Useful when costs vary by model (e.g., cheaper models can use more tokens).
Alert Threshold
Get notified before limits are reached:
{
"daily_spend_limit": 100.00,
"alert_threshold": 0.8
}
You'll be notified when you reach 80% of your daily limit.
Testing Your New Key
Verify Key Works
import requests
response = requests.get(
"http://localhost/api/v1/models",
headers={"Authorization": "Bearer en_xxxxxxxxxxxxxxx"}
)
if response.status_code == 200:
print("✓ API key is working")
models = response.json()["data"]
print(f"Available models: {[m['id'] for m in models]}")
else:
print(f"✗ Error: {response.status_code}")
print(response.json())
Test Model Access
response = requests.post(
"http://localhost/api/v1/chat/completions",
headers={"Authorization": "Bearer en_xxxxxxxxxxxxxxx"},
json={
"model": "gpt-4",
"messages": [{"role": "user", "content": "Test"}]
}
)
print(response.json()["choices"][0]["message"]["content"])
Common Creation Issues
Key Not Generated
Problem: No API key shown after creation
Solution:
- Refresh the page and check API Keys list
- Keys are only shown once during creation
- If missed, delete and create a new key
Budget Too Low
Problem: Requests fail immediately
Solution:
- Verify budget limits are reasonable
- Start with higher limits for testing
- Monitor usage to set appropriate limits
Model Access Error
Problem: "Model not allowed" error
Solution:
- Check
allowed_modelslist - Verify model name matches exactly (case-sensitive)
- Try without model restrictions to test
Next Steps
After creating your API key: