For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://modelgates.ai/docs/_mcp/server.

Management API Keys

ModelGates provides endpoints to programmatically manage your API keys, enabling key creation and management for applications that need to distribute or rotate keys automatically.

Creating a Management API Key

To use the key management API, you first need to create a Management API key:

  1. Go to the Management API Keys page
  2. Click "Create New Key"
  3. Complete the key creation process

Management keys cannot be used to make API calls to ModelGates's completion endpoints - they are exclusively for administrative operations.

Use Cases

Common scenarios for programmatic key management include:

  • SaaS Applications: Automatically create unique API keys for each customer instance
  • Key Rotation: Regularly rotate API keys for security compliance
  • Usage Monitoring: Track key usage and automatically disable keys that exceed limits (with optional daily/weekly/monthly limit resets)

Example Usage

All key management endpoints are under /api/v1/keys and require a Management API key in the Authorization header.

typescript
import { ModelGates } from '@modelgates/sdk'; const modelgates = new ModelGates({  apiKey: 'your-management-key', // Use your Management API key}); // List the most recent 100 API keysconst keys = await modelgates.apiKeys.list(); // You can paginate using the offset parameterconst keysPage2 = await modelgates.apiKeys.list({ offset: 100 }); // Create a new API keyconst newKey = await modelgates.apiKeys.create({  name: 'Customer Instance Key',  limit: 1000, // Optional credit limit}); // Get a specific keyconst keyHash = '<YOUR_KEY_HASH>';const key = await modelgates.apiKeys.get(keyHash); // Update a keyconst updatedKey = await modelgates.apiKeys.update(keyHash, {  name: 'Updated Key Name',  disabled: true, // Optional: Disable the key  includeByokInLimit: false, // Optional: control BYOK usage in limit  limitReset: 'daily', // Optional: reset limit every day at midnight UTC}); // Delete a keyawait modelgates.apiKeys.delete(keyHash);
python
import requests MANAGEMENT_API_KEY = "your-management-key"BASE_URL = "https://modelgates.ai/api/v1/keys" # List the most recent 100 API keysresponse = requests.get(    BASE_URL,    headers={        "Authorization": f"Bearer {MANAGEMENT_API_KEY}",        "Content-Type": "application/json"    }) # You can paginate using the offset parameterresponse = requests.get(    f"{BASE_URL}?offset=100",    headers={        "Authorization": f"Bearer {MANAGEMENT_API_KEY}",        "Content-Type": "application/json"    }) # Create a new API keyresponse = requests.post(    f"{BASE_URL}/",    headers={        "Authorization": f"Bearer {MANAGEMENT_API_KEY}",        "Content-Type": "application/json"    },    json={        "name": "Customer Instance Key",        "limit": 1000  # Optional credit limit    }) # Get a specific keykey_hash = "<YOUR_KEY_HASH>"response = requests.get(    f"{BASE_URL}/{key_hash}",    headers={        "Authorization": f"Bearer {MANAGEMENT_API_KEY}",        "Content-Type": "application/json"    }) # Update a keyresponse = requests.patch(    f"{BASE_URL}/{key_hash}",    headers={        "Authorization": f"Bearer {MANAGEMENT_API_KEY}",        "Content-Type": "application/json"    },    json={        "name": "Updated Key Name",        "disabled": True,  # Optional: Disable the key        "include_byok_in_limit": False,  # Optional: control BYOK usage in limit        "limit_reset": "daily"  # Optional: reset limit every day at midnight UTC    }) # Delete a keyresponse = requests.delete(    f"{BASE_URL}/{key_hash}",    headers={        "Authorization": f"Bearer {MANAGEMENT_API_KEY}",        "Content-Type": "application/json"    })
typescript
const MANAGEMENT_API_KEY = 'your-management-key';const BASE_URL = 'https://modelgates.ai/api/v1/keys'; // List the most recent 100 API keysconst listKeys = await fetch(BASE_URL, {  headers: {    Authorization: `Bearer ${MANAGEMENT_API_KEY}`,    'Content-Type': 'application/json',  },}); // You can paginate using the `offset` query parameterconst listKeys = await fetch(`$?offset=100`, {  headers: {    Authorization: `Bearer ${MANAGEMENT_API_KEY}`,    'Content-Type': 'application/json',  },}); // Create a new API keyconst createKey = await fetch(`$`, {  method: 'POST',  headers: {    Authorization: `Bearer ${MANAGEMENT_API_KEY}`,    'Content-Type': 'application/json',  },  body: JSON.stringify({    name: 'Customer Instance Key',    limit: 1000, // Optional credit limit  }),}); // Get a specific keyconst keyHash = '<YOUR_KEY_HASH>';const getKey = await fetch(`$/$`, {  headers: {    Authorization: `Bearer ${MANAGEMENT_API_KEY}`,    'Content-Type': 'application/json',  },}); // Update a keyconst updateKey = await fetch(`$/$`, {  method: 'PATCH',  headers: {    Authorization: `Bearer ${MANAGEMENT_API_KEY}`,    'Content-Type': 'application/json',  },  body: JSON.stringify({    name: 'Updated Key Name',    disabled: true, // Optional: Disable the key    include_byok_in_limit: false, // Optional: control BYOK usage in limit    limit_reset: 'daily', // Optional: reset limit every day at midnight UTC  }),}); // Delete a keyconst deleteKey = await fetch(`$/$`, {  method: 'DELETE',  headers: {    Authorization: `Bearer ${MANAGEMENT_API_KEY}`,    'Content-Type': 'application/json',  },});

Response Format

API responses return JSON objects containing key information:

json
{  "data": [    {      "created_at": "2025-02-19T20:52:27.363244+00:00",      "updated_at": "2025-02-19T21:24:11.708154+00:00",      "hash": "<YOUR_KEY_HASH>",      "label": "sk-mg-v1-abc...123",      "name": "Customer Key",      "disabled": false,      "limit": 10,      "limit_remaining": 10,      "limit_reset": null,      "include_byok_in_limit": false,      "usage": 0,      "usage_daily": 0,      "usage_weekly": 0,      "usage_monthly": 0,      "byok_usage": 0,      "byok_usage_daily": 0,      "byok_usage_weekly": 0,      "byok_usage_monthly": 0    }  ]}

When creating a new key, the response will include the key string itself. Read more in the API reference.