API Authentication
Complete guide to authenticating with Bastio's API endpoints.
API Authentication
Bastio uses API keys for authentication. All API requests must include a valid API key in the Authorization header.
API Key Format
Bastio API keys follow this format:
bastio_sk_[random_string]Authentication Methods
1. Bearer Token (Recommended)
Include your API key in the Authorization header:
Authorization: Bearer bastio_sk_your_api_key_here2. Header Authentication
Alternative header format:
X-Bastio-API-Key: bastio_sk_your_api_key_hereCreating API Keys
Via Dashboard
- Navigate to Dashboard > API Keys
- Click "Generate New Key"
- Configure key settings:
- Name: Descriptive name for the key
- Environment: Production, Staging, or Development
- Permissions: Select allowed endpoints
- Rate Limits: Set request limits
- IP Restrictions: Whitelist specific IPs (recommended)
 
API Key Configuration
Permissions
Configure specific permissions for each API key:
- ✅ Chat Completions - /v1/chat/completions
- ✅ Completions - /v1/completions
- ✅ Embeddings - /v1/embeddings
- ✅ Images - /v1/images/generations
- ✅ Audio - /v1/audio/transcriptions
- ✅ Analytics - Access to usage analytics
- ⚠️ Admin - Full account access (use sparingly)
Rate Limits
Set appropriate limits based on your usage:
{
  "rateLimit": {
    "requests": 1000,
    "period": "hour",
    "burst": 100
  }
}IP Restrictions
Enhance security by restricting API key usage to specific IP addresses:
{
  "ipWhitelist": [
    "203.0.113.0/24",
    "198.51.100.42"
  ]
}Request Examples
cURL
curl -X POST https://api.bastio.com/v1/chat/completions \
  -H "Authorization: Bearer bastio_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4",
    "messages": [
      {"role": "user", "content": "Hello!"}
    ]
  }'Python
import openai
# Using OpenAI client with Bastio
client = openai.OpenAI(
    api_key="bastio_sk_your_api_key_here",
    base_url="https://api.bastio.com/v1"
)
response = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "Hello!"}]
)JavaScript
import OpenAI from 'openai';
const client = new OpenAI({
  apiKey: 'bastio_sk_your_api_key_here',
  baseURL: 'https://api.bastio.com/v1'
});
const completion = await client.chat.completions.create({
  model: 'gpt-4',
  messages: [{ role: 'user', content: 'Hello!' }]
});Go
import "github.com/sashabaranov/go-openai"
config := openai.DefaultConfig("bastio_sk_your_api_key_here")
config.BaseURL = "https://api.bastio.com/v1"
client := openai.NewClientWithConfig(config)Environment Variables
Store API keys securely using environment variables:
Development
# .env file
BASTIO_API_KEY=bastio_sk_your_development_key_here
BASTIO_BASE_URL=https://api.bastio.com/v1Production
# Set in your deployment environment
export BASTIO_API_KEY="bastio_sk_your_production_key_here"
export BASTIO_BASE_URL="https://api.bastio.com/v1"Security Best Practices
1. Key Management
- 🔐 Never commit API keys to version control
- 🔄 Rotate keys regularly (every 90 days recommended)
- 🏷️ Use descriptive names to identify key usage
- 🗑️ Delete unused keys immediately
2. Environment Separation
Use different API keys for different environments:
# Development
BASTIO_API_KEY=bastio_sk_dev_12345...
# Staging  
BASTIO_API_KEY=bastio_sk_staging_67890...
# Production
BASTIO_API_KEY=bastio_sk_prod_abcdef...3. IP Whitelisting
Restrict API key usage to known IP addresses:
{
  "name": "Production Server",
  "permissions": ["chat_completions"],
  "ipWhitelist": ["203.0.113.10", "203.0.113.11"],
  "rateLimit": {
    "requests": 10000,
    "period": "hour"
  }
}4. Minimal Permissions
Grant only the permissions needed:
{
  "name": "Chat Bot API Key",
  "permissions": ["chat_completions"],
  "excludePermissions": ["admin", "analytics"]
}Error Handling
Authentication Errors
401 Unauthorized
{
  "error": {
    "message": "Invalid API key provided",
    "type": "authentication_error",
    "code": "invalid_api_key"
  }
}Common causes:
- Missing Authorization header
- Incorrect API key format
- Expired or revoked API key
403 Forbidden
{
  "error": {
    "message": "API key does not have permission for this endpoint",
    "type": "permission_error", 
    "code": "insufficient_permissions"
  }
}Common causes:
- API key lacks required permissions
- Request from non-whitelisted IP address
- Endpoint requires admin privileges
429 Rate Limited
{
  "error": {
    "message": "Rate limit exceeded",
    "type": "rate_limit_error",
    "code": "rate_limit_exceeded",
    "details": {
      "limit": 1000,
      "remaining": 0,
      "resetTime": "2024-01-15T10:30:00Z"
    }
  }
}Error Handling Code
import openai
from openai import AuthenticationError, PermissionDeniedError, RateLimitError
try:
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": "Hello!"}]
    )
except AuthenticationError as e:
    print(f"Authentication failed: {e}")
except PermissionDeniedError as e:
    print(f"Permission denied: {e}")
except RateLimitError as e:
    print(f"Rate limit exceeded: {e}")Testing Authentication
Test Script
#!/bin/bash
API_KEY="bastio_sk_your_api_key_here"
BASE_URL="https://api.bastio.com/v1"
# Test authentication
echo "Testing API authentication..."
response=$(curl -s -w "%{http_code}" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-3.5-turbo","messages":[{"role":"user","content":"test"}],"max_tokens":5}' \
  "$BASE_URL/chat/completions")
http_code="${response: -3}"
if [ "$http_code" -eq 200 ]; then
    echo "✅ Authentication successful"
else
    echo "❌ Authentication failed (HTTP $http_code)"
fiTest with Multiple Keys
def test_api_keys():
    keys = [
        ("development", "bastio_sk_dev_123..."),
        ("production", "bastio_sk_prod_abc...")
    ]
    
    for env, key in keys:
        client = openai.OpenAI(
            api_key=key,
            base_url="https://api.bastio.com/v1"
        )
        
        try:
            response = client.chat.completions.create(
                model="gpt-3.5-turbo",
                messages=[{"role": "user", "content": "test"}],
                max_tokens=5
            )
            print(f"✅ {env}: Authentication successful")
        except Exception as e:
            print(f"❌ {env}: Authentication failed - {e}")Monitoring API Keys
Usage Analytics
Monitor API key usage in the dashboard:
- Request Count: Total requests per key
- Error Rate: Authentication and permission errors
- Geographic Usage: Requests by location
- Timestamp Analysis: Usage patterns over time
Alerts
Set up alerts for:
- High error rates (>5% authentication failures)
- Unusual geographic usage
- Rate limit approaches
- New IP addresses (if using IP restrictions)
Migration from Other Providers
From OpenAI
- const client = new OpenAI({
-   apiKey: process.env.OPENAI_API_KEY
- });
+ const client = new OpenAI({
+   apiKey: process.env.BASTIO_API_KEY,
+   baseURL: 'https://api.bastio.com/v1'
+ });From Anthropic
- const client = new Anthropic({
-   apiKey: process.env.ANTHROPIC_API_KEY
- });
+ const client = new Anthropic({
+   apiKey: process.env.BASTIO_API_KEY,
+   baseURL: 'https://api.bastio.com/v1'
+ });Advanced Authentication
Custom Headers
Pass additional context for enhanced security:
const completion = await client.chat.completions.create({
  model: 'gpt-4',
  messages: [{ role: 'user', content: 'Hello!' }]
}, {
  headers: {
    'X-User-ID': 'user_123',
    'X-Session-ID': 'session_456',
    'X-App-Version': '1.2.3'
  }
});Webhook Authentication
For webhook endpoints, Bastio includes signature verification:
import hmac
import hashlib
def verify_webhook_signature(payload, signature, secret):
    expected_signature = hmac.new(
        secret.encode(),
        payload.encode(),
        hashlib.sha256
    ).hexdigest()
    
    return hmac.compare_digest(f"sha256={expected_signature}", signature)