Error Codes
This document provides a comprehensive reference for all error codes returned by the Cloakr.ai API.
Error Response Format
All API errors follow a consistent format:
{
"error": {
"type": "error_type",
"message": "Human-readable error message",
"code": "machine_readable_code",
"param": "parameter_name", // Optional
"retry_after": 60, // Optional, seconds
"details": {} // Optional, additional context
}
}
HTTP Status Codes
Status Code | Description |
---|---|
200 | Success |
400 | Bad Request - Invalid parameters |
401 | Unauthorized - Invalid API key |
403 | Forbidden - Insufficient permissions |
404 | Not Found - Resource doesn't exist |
429 | Too Many Requests - Rate limit exceeded |
500 | Internal Server Error - Server error |
502 | Bad Gateway - Upstream service error |
503 | Service Unavailable - Service temporarily unavailable |
Authentication Errors
401 Unauthorized
invalid_api_key
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key"
}
}
Resolution: Check your API key in the Cloakr Dashboard and ensure it's correctly set in your environment variables.
api_key_expired
{
"error": {
"type": "authentication_error",
"message": "API key has expired",
"code": "api_key_expired"
}
}
Resolution: Generate a new API key from the dashboard.
insufficient_permissions
{
"error": {
"type": "authentication_error",
"message": "API key lacks required permissions",
"code": "insufficient_permissions",
"details": {
"required_permissions": ["chat:write", "models:read"]
}
}
}
Resolution: Contact your administrator to grant the required permissions.
Rate Limiting Errors
429 Too Many Requests
rate_limit_exceeded
{
"error": {
"type": "rate_limit_error",
"message": "Rate limit exceeded",
"code": "rate_limit_exceeded",
"retry_after": 60
}
}
Resolution: Wait for the specified time before retrying, or upgrade your plan for higher limits.
quota_exceeded
{
"error": {
"type": "rate_limit_error",
"message": "Monthly quota exceeded",
"code": "quota_exceeded"
}
}
Resolution: Upgrade your plan or wait for the next billing cycle.
Request Validation Errors
400 Bad Request
invalid_model
{
"error": {
"type": "invalid_request_error",
"message": "Invalid model specified",
"code": "invalid_model",
"param": "model"
}
}
Resolution: Use the Models endpoint to get a list of available models.
invalid_prompt
{
"error": {
"type": "invalid_request_error",
"message": "Prompt cannot be empty",
"code": "invalid_prompt",
"param": "prompt"
}
}
Resolution: Ensure the prompt field is not empty and contains valid text.
invalid_temperature
{
"error": {
"type": "invalid_request_error",
"message": "Temperature must be between 0 and 2",
"code": "invalid_temperature",
"param": "temperature"
}
}
Resolution: Set temperature to a value between 0.0 and 2.0.
invalid_max_tokens
{
"error": {
"type": "invalid_request_error",
"message": "Max tokens exceeds model limit",
"code": "invalid_max_tokens",
"param": "max_tokens",
"details": {
"model_limit": 128000,
"requested": 150000
}
}
}
Resolution: Reduce max_tokens to within the model's limit.
invalid_encryption
{
"error": {
"type": "invalid_request_error",
"message": "Invalid encryption format",
"code": "invalid_encryption",
"param": "prompt"
}
}
Resolution: Ensure encrypted prompts use the correct AES-256-GCM format.
Content Policy Errors
400 Bad Request
content_policy_violation
{
"error": {
"type": "content_policy_error",
"message": "Content violates usage policies",
"code": "content_policy_violation",
"details": {
"violation_type": "harmful_content",
"flagged_content": "specific text that was flagged"
}
}
}
Resolution: Review and modify your prompt to comply with our content policies.
pii_detection_failed
{
"error": {
"type": "content_policy_error",
"message": "PII detection failed",
"code": "pii_detection_failed",
"details": {
"detected_pii": ["email", "phone_number"],
"redaction_required": true
}
}
}
Resolution: Remove or redact the detected PII before sending the request.
Server Errors
500 Internal Server Error
internal_error
{
"error": {
"type": "server_error",
"message": "An internal error occurred",
"code": "internal_error"
}
}
Resolution: Retry the request. If the error persists, contact support.
model_unavailable
{
"error": {
"type": "server_error",
"message": "Model is temporarily unavailable",
"code": "model_unavailable",
"param": "model"
}
}
Resolution: Try a different model or retry later.
502 Bad Gateway
upstream_error
{
"error": {
"type": "server_error",
"message": "Upstream service error",
"code": "upstream_error",
"details": {
"upstream_service": "openai",
"upstream_error": "service_unavailable"
}
}
}
Resolution: Retry the request. The error is temporary.
503 Service Unavailable
maintenance_mode
{
"error": {
"type": "server_error",
"message": "Service is under maintenance",
"code": "maintenance_mode",
"retry_after": 3600
}
}
Resolution: Wait for maintenance to complete and retry.
SDK-Specific Errors
Encryption Errors
encryption_failed
{
"error": {
"type": "encryption_error",
"message": "Failed to encrypt request",
"code": "encryption_failed",
"details": {
"reason": "invalid_key_format"
}
}
}
Resolution: Check your encryption key format and ensure it's properly configured.
decryption_failed
{
"error": {
"type": "encryption_error",
"message": "Failed to decrypt response",
"code": "decryption_failed"
}
}
Resolution: Ensure your encryption keys are synchronized between client and server.
Error Handling Best Practices
1. Implement Retry Logic
async function makeRequestWithRetry(client, request, maxRetries = 3) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await client.chat(request);
} catch (error) {
if (error.code === 'rate_limit_exceeded') {
const retryAfter = error.retry_after || 60;
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
continue;
}
if (error.code === 'internal_error' && attempt < maxRetries) {
await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));
continue;
}
throw error;
}
}
}
2. Handle Rate Limits
async function handleRateLimit(error) {
if (error.code === 'rate_limit_exceeded') {
const retryAfter = error.retry_after || 60;
console.log(`Rate limited. Retrying in ${retryAfter} seconds...`);
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
return true; // Retry the request
}
return false; // Don't retry
}
3. Validate Requests
function validateChatRequest(request) {
const errors = [];
if (!request.model) {
errors.push('model is required');
}
if (!request.prompt) {
errors.push('prompt is required');
}
if (request.temperature && (request.temperature < 0 || request.temperature > 2)) {
errors.push('temperature must be between 0 and 2');
}
return errors;
}
4. Log Errors Appropriately
function logError(error, context) {
console.error('Cloakr API Error:', {
code: error.code,
message: error.message,
type: error.type,
context: context,
timestamp: new Date().toISOString()
});
}
Getting Help
If you encounter an error not covered in this documentation:
- Check the error code and message for specific guidance
- Review your request for common issues
- Contact support at support@cloakr.ai with:
- Error code and message
- Request details (without sensitive data)
- SDK version and language
- Steps to reproduce
Next Steps
- Chat Endpoint - Send requests to the API
- Models Endpoint - List available models
- SDK Tutorials - Learn advanced error handling