Skip to content

Error Handling

Understanding and handling GateFlow API errors.

Error Format

All errors follow a consistent format:

json
{
  "error": {
    "message": "Human-readable error description",
    "type": "error_category",
    "code": "specific_error_code",
    "param": "problematic_parameter",
    "doc_url": "https://gateflow.ai/docs/api-reference/errors/..."
  }
}

Error Fields

FieldTypeDescription
messagestringHuman-readable description
typestringError category
codestringSpecific error code
paramstringParameter that caused error (if applicable)
doc_urlstringLink to documentation

Error Types

Authentication Errors

HTTP 401 - Invalid or missing credentials.

json
{
  "error": {
    "message": "Invalid API key provided",
    "type": "authentication_error",
    "code": "invalid_api_key"
  }
}

See Auth Errors for details.

Permission Errors

HTTP 403 - Valid credentials but insufficient permissions.

json
{
  "error": {
    "message": "Model 'gpt-4o' not allowed for this API key",
    "type": "permission_error",
    "code": "model_not_allowed"
  }
}

Rate Limit Errors

HTTP 429 - Too many requests.

json
{
  "error": {
    "message": "Rate limit exceeded. Please retry after 60 seconds.",
    "type": "rate_limit_error",
    "code": "rate_limit_exceeded"
  }
}

Headers:

Retry-After: 60
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1705123516

See Rate Limit Errors for details.

Invalid Request Errors

HTTP 400 - Malformed or invalid request.

json
{
  "error": {
    "message": "Invalid value for 'temperature': must be between 0 and 2",
    "type": "invalid_request_error",
    "code": "invalid_parameter",
    "param": "temperature"
  }
}

Provider Errors

HTTP 502/503 - Upstream provider issues.

json
{
  "error": {
    "message": "Provider 'openai' is temporarily unavailable",
    "type": "provider_error",
    "code": "provider_unavailable",
    "provider": "openai"
  }
}

See Provider Errors for details.

HTTP Status Codes

CodeDescription
200Success
400Bad Request - Invalid parameters
401Unauthorized - Invalid API key
403Forbidden - Insufficient permissions
404Not Found - Resource doesn't exist
429Too Many Requests - Rate limited
500Internal Server Error - GateFlow issue
502Bad Gateway - Provider unreachable
503Service Unavailable - Temporary outage

Handling Errors

Python

python
from openai import OpenAI, APIError, RateLimitError, AuthenticationError

client = OpenAI(
    base_url="https://api.gateflow.ai/v1",
    api_key="gw_prod_..."
)

try:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": "Hello"}]
    )
except AuthenticationError as e:
    print(f"Invalid API key: {e}")
except RateLimitError as e:
    print(f"Rate limited. Retry after: {e.response.headers.get('Retry-After')}")
except APIError as e:
    print(f"API error: {e.code} - {e.message}")

TypeScript

typescript
import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://api.gateflow.ai/v1',
  apiKey: 'gw_prod_...',
});

try {
  const response = await client.chat.completions.create({
    model: 'gpt-4o',
    messages: [{ role: 'user', content: 'Hello' }],
  });
} catch (error) {
  if (error instanceof OpenAI.AuthenticationError) {
    console.log('Invalid API key');
  } else if (error instanceof OpenAI.RateLimitError) {
    console.log('Rate limited');
  } else if (error instanceof OpenAI.APIError) {
    console.log(`API error: ${error.code} - ${error.message}`);
  }
}

cURL

bash
response=$(curl -s -w "\n%{http_code}" \
  https://api.gateflow.ai/v1/chat/completions \
  -H "Authorization: Bearer gw_prod_..." \
  -H "Content-Type: application/json" \
  -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]}')

http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | sed '$d')

if [ "$http_code" != "200" ]; then
  echo "Error $http_code: $body"
fi

Retry Strategy

Exponential Backoff

python
import time
import random

def call_with_retry(func, max_retries=3):
    for attempt in range(max_retries):
        try:
            return func()
        except RateLimitError as e:
            if attempt == max_retries - 1:
                raise
            # Exponential backoff with jitter
            delay = (2 ** attempt) + random.uniform(0, 1)
            time.sleep(delay)

Retry-After Header

python
except RateLimitError as e:
    retry_after = int(e.response.headers.get('Retry-After', 60))
    time.sleep(retry_after)

Retryable Errors

ErrorRetry?Strategy
429 Rate LimitYesWait for Retry-After
500 Internal ErrorYesExponential backoff
502 Bad GatewayYesExponential backoff
503 UnavailableYesExponential backoff
400 Bad RequestNoFix request
401 UnauthorizedNoFix credentials
403 ForbiddenNoCheck permissions

Error Codes Reference

Authentication (authentication_error)

CodeDescription
invalid_api_keyAPI key doesn't exist
expired_api_keyAPI key has expired
revoked_api_keyAPI key was revoked
missing_api_keyNo API key provided

Permission (permission_error)

CodeDescription
model_not_allowedAPI key can't use this model
ip_not_allowedRequest from unauthorized IP
cost_limit_exceededBudget limit reached
insufficient_quotaAccount quota exhausted

Rate Limit (rate_limit_error)

CodeDescription
rate_limit_exceededToo many requests
tokens_limit_exceededToo many tokens per minute

Invalid Request (invalid_request_error)

CodeDescription
invalid_parameterParameter value invalid
missing_parameterRequired parameter missing
invalid_modelModel doesn't exist
context_length_exceededToo many input tokens
content_policy_violationContent blocked

Provider (provider_error)

CodeDescription
provider_unavailableProvider is down
provider_rate_limitProvider's rate limit hit
provider_timeoutProvider didn't respond
provider_errorProvider returned error

Debugging

Request ID

Every response includes a request ID:

X-Request-Id: req_abc123xyz

Include this when contacting support.

Verbose Errors

Enable verbose errors in development:

python
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[...],
    extra_body={
        "gateflow": {
            "verbose_errors": True
        }
    }
)

Returns additional debugging info:

json
{
  "error": {
    "message": "...",
    "debug": {
      "request_id": "req_abc123",
      "timestamp": "2024-01-15T10:30:00Z",
      "provider_response": {...}
    }
  }
}

Built with reliability in mind.