Help & Security
Error Codes
This reference documents all error codes returned by the Apertis API, along with their meanings and recommended solutions.
On this page
Error Response Format
All API errors follow this structure:
{
"error": {
"message": "Human-readable error description",
"type": "error_category",
"code": "specific_error_code",
"param": "parameter_name" // Optional: which parameter caused the error
}
}HTTP Status Codes
Quick Reference
| Status | Meaning | Action |
|---|---|---|
| 200 | Success | Request completed |
| 400 | Bad Request | Fix request parameters |
| 401 | Unauthorized | Check API key |
| 402 | Payment Required | Add quota/funds |
| 403 | Forbidden | Check permissions |
| 404 | Not Found | Check endpoint/model |
| 429 | Too Many Requests | Reduce request rate |
| 500 | Server Error | Retry or contact support |
| 502 | Bad Gateway | Retry request |
| 503 | Service Unavailable | Check status page |
Authentication Errors (401)
invalid_api_key
{
"error": {
"message": "Invalid API key provided",
"type": "authentication_error",
"code": "invalid_api_key"
}
}Causes:
- API key doesn't exist
- API key was deleted
- Typo in API key
Solutions:
- Verify key in dashboard
- Create a new key if needed
- Check for copy/paste errors
missing_api_key
{
"error": {
"message": "API key is missing",
"type": "authentication_error",
"code": "missing_api_key"
}
}Solution: Add the Authorization header:
-H "Authorization: Bearer sk-your-api-key"expired_api_key
{
"error": {
"message": "API key has expired",
"type": "authentication_error",
"code": "expired_api_key"
}
}Solution: Create a new API key or extend the expiration date.
Billing Errors (402)
quota_exceeded
{
"error": {
"message": "You have exceeded your quota",
"type": "billing_error",
"code": "quota_exceeded"
}
}Causes:
- API key quota exhausted
- Account balance depleted
- Subscription quota used up
Solutions:
- Top up account balance
- Enable PAYG fallback (for subscriptions)
- Upgrade subscription plan
- Wait for quota reset (subscription)
insufficient_balance
{
"error": {
"message": "Insufficient account balance",
"type": "billing_error",
"code": "insufficient_balance"
}
}Solution: Add funds to your account via the dashboard.
subscription_expired
{
"error": {
"message": "Your subscription has expired",
"type": "billing_error",
"code": "subscription_expired"
}
}Solution: Renew your subscription or switch to PAYG.
payment_failed
{
"error": {
"message": "Payment processing failed",
"type": "billing_error",
"code": "payment_failed"
}
}Solutions:
- Check payment method is valid
- Ensure sufficient funds on card
- Try a different payment method
Permission Errors (403)
access_denied
{
"error": {
"message": "Access denied to this resource",
"type": "permission_error",
"code": "access_denied"
}
}Causes:
- Account suspended
- Resource access restricted
- IP not in whitelist
model_access_denied
{
"error": {
"message": "Your API key does not have access to this model",
"type": "permission_error",
"code": "model_access_denied"
}
}Solutions:
- Check API key model restrictions
- Use a different API key
- Update key permissions
ip_not_allowed
{
"error": {
"message": "Request from this IP is not allowed",
"type": "permission_error",
"code": "ip_not_allowed"
}
}Solution: Add your IP address to the API key's whitelist.
account_suspended
{
"error": {
"message": "Your account has been suspended",
"type": "permission_error",
"code": "account_suspended"
}
}Solution: Contact support at hi@apertis.ai
Not Found Errors (404)
model_not_found
{
"error": {
"message": "The model 'xyz' does not exist",
"type": "invalid_request_error",
"code": "model_not_found"
}
}Solutions:
- Check model name spelling
- List available models:
GET /v1/models - Model may be deprecated
endpoint_not_found
{
"error": {
"message": "The requested endpoint does not exist",
"type": "invalid_request_error",
"code": "endpoint_not_found"
}
}Solution: Check the API endpoint path.
Validation Errors (400)
invalid_request
{
"error": {
"message": "Invalid request format",
"type": "invalid_request_error",
"code": "invalid_request"
}
}Common causes:
- Malformed JSON
- Invalid Content-Type
- Missing required fields
invalid_parameter
{
"error": {
"message": "Invalid value for parameter 'temperature'",
"type": "invalid_request_error",
"code": "invalid_parameter",
"param": "temperature"
}
}Solution: Check parameter constraints:
| Parameter | Valid Range |
|---|---|
| temperature | 0.0 - 2.0 |
| top_p | 0.0 - 1.0 |
| max_tokens | 1 - model limit |
| n | 1 - 128 |
missing_parameter
{
"error": {
"message": "Missing required parameter 'messages'",
"type": "invalid_request_error",
"code": "missing_parameter",
"param": "messages"
}
}Solution: Include all required parameters in your request.
context_length_exceeded
{
"error": {
"message": "Maximum context length exceeded",
"type": "invalid_request_error",
"code": "context_length_exceeded"
}
}Solutions:
- Reduce prompt length
- Use a model with larger context
- Summarize previous messages
| Model | Context Limit |
|---|---|
| GPT-3.5 Turbo | 16K tokens |
| GPT-5.5 | 128K tokens |
| Claude Sonnet 4.6 | 200K tokens |
invalid_image
{
"error": {
"message": "Invalid image format or size",
"type": "invalid_request_error",
"code": "invalid_image"
}
}Solutions:
- Use supported formats (PNG, JPEG, WebP, GIF)
- Reduce image size (max 20MB)
- Check base64 encoding
Rate Limit Errors (429)
rate_limit_exceeded
{
"error": {
"message": "Rate limit exceeded. Please wait before making more requests.",
"type": "rate_limit_error",
"code": "rate_limit_exceeded"
}
}Response Headers:
X-RateLimit-Limit: 1500
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1703894400
Retry-After: 45Solutions:
- Wait for
Retry-Afterseconds - Implement exponential backoff
- Reduce request frequency
- Upgrade plan for higher limits
Server Errors (5xx)
internal_error (500)
{
"error": {
"message": "An internal server error occurred",
"type": "server_error",
"code": "internal_error"
}
}Solutions:
- Retry the request
- Check status page
- Contact support if persistent
service_unavailable (503)
{
"error": {
"message": "Service temporarily unavailable",
"type": "server_error",
"code": "service_unavailable"
}
}Solutions:
- Wait a few minutes
- Check status page
- Retry with exponential backoff
model_overloaded (503)
{
"error": {
"message": "The model is currently overloaded",
"type": "server_error",
"code": "model_overloaded"
}
}Solutions:
- Use fallback models
- Retry after a delay
- Try a different model
upstream_error (502)
{
"error": {
"message": "Error communicating with upstream provider",
"type": "server_error",
"code": "upstream_error"
}
}Solutions:
- Retry the request
- Enable fallback models
- Check provider status
Model-Specific Errors
content_policy_violation
{
"error": {
"message": "Content violates usage policies",
"type": "content_policy_error",
"code": "content_policy_violation"
}
}Solution: Review and modify your prompt to comply with usage policies.
output_length_exceeded
{
"error": {
"message": "Output exceeds maximum length",
"type": "invalid_request_error",
"code": "output_length_exceeded"
}
}Solution:
Set a lower max_tokens value or request shorter responses.
Error Handling Best Practices
Python Example
from openai import OpenAI, APIError, RateLimitError, AuthenticationError
client = OpenAI(
api_key="sk-your-api-key",
base_url="https://api.apertis.ai/v1"
)
try:
response = client.chat.completions.create(
model="gpt-5.5",
messages=[{"role": "user", "content": "Hello"}]
)
except AuthenticationError as e:
print(f"Authentication failed: {e}")
# Check API key
except RateLimitError as e:
print(f"Rate limited: {e}")
# Implement retry with backoff
except APIError as e:
print(f"API error: {e.status_code} - {e.message}")
# Handle other errorsNode.js Example
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'sk-your-api-key',
baseURL: 'https://api.apertis.ai/v1'
});
try {
const response = await client.chat.completions.create({
model: 'gpt-5.5',
messages: [{ role: 'user', content: 'Hello' }]
});
} catch (error) {
if (error.status === 401) {
console.error('Authentication failed');
} else if (error.status === 429) {
console.error('Rate limited, retrying...');
} else if (error.status >= 500) {
console.error('Server error, please retry');
} else {
console.error(`Error: ${error.message}`);
}
}Retry with Exponential Backoff
import time
import random
def make_request_with_retry(func, max_retries=5):
for attempt in range(max_retries):
try:
return func()
except RateLimitError:
if attempt == max_retries - 1:
raise
wait_time = (2 ** attempt) + random.uniform(0, 1)
time.sleep(wait_time)
except APIError as e:
if e.status_code >= 500 and attempt < max_retries - 1:
time.sleep(2 ** attempt)
continue
raiseRelated Topics
- Troubleshooting - Common issues and solutions
- Rate Limits - Understanding rate limits
- API Keys - API key management