Errors & Status Codes

Complete guide to error handling and HTTP status codes

Error Object Format

All error responses follow a consistent format:

{
  "error": true,
  "error_code": "ERROR_CODE",
  "message": "Human-readable error message",
  "details": {
    // Optional additional error details
  }
}

HTTP Status Codes

Status CodeMeaningCommon Causes
200SuccessRequest completed successfully
400Bad RequestInvalid parameters, missing required fields
401UnauthorizedInvalid or missing API key, invalid signature
403ForbiddenAPI key lacks required permissions
404Not FoundInvalid endpoint or resource not found
429Too Many RequestsRate limit exceeded
500Internal Server ErrorServer-side error, try again later
503Service UnavailableService temporarily unavailable, maintenance

Common Error Codes

LIMIT_MIN

The requested amount is below the minimum exchange limit for this currency pair.

{
  "error": true,
  "error_code": "LIMIT_MIN",
  "message": "Amount is below minimum limit",
  "min_amount": 0.01,
  "requested_amount": 0.005
}

LIMIT_MAX

The requested amount exceeds the maximum exchange limit for this currency pair.

{
  "error": true,
  "error_code": "LIMIT_MAX",
  "message": "Amount exceeds maximum limit",
  "max_amount": 1000.0,
  "requested_amount": 1500.0
}

OFFLINE

The requested currency pair is temporarily unavailable for exchange.

{
  "error": true,
  "error_code": "OFFLINE",
  "message": "Currency pair BTC/USDT is temporarily offline"
}

RESERVE

Insufficient reserves to complete the exchange. The requested amount exceeds available liquidity.

{
  "error": true,
  "error_code": "RESERVE",
  "message": "Insufficient reserves for this exchange",
  "available_amount": 500.0,
  "requested_amount": 1000.0
}

MAINTENANCE

The service is undergoing scheduled maintenance. Check status page for updates.

{
  "error": true,
  "error_code": "MAINTENANCE",
  "message": "Service is under maintenance",
  "estimated_resume": "2025-01-27T12:00:00Z"
}

INVALID_ADDRESS

The provided destination address is invalid for the specified network.

{
  "error": true,
  "error_code": "INVALID_ADDRESS",
  "message": "Destination address is invalid for network ERC20"
}

RATE_EXPIRED

The fixed rate has expired. Request a new rate before creating the order.

{
  "error": true,
  "error_code": "RATE_EXPIRED",
  "message": "Fixed rate has expired. Please request a new rate."
}

INVALID_SIGNATURE

The request signature is invalid. Check your signature generation algorithm.

{
  "error": true,
  "error_code": "INVALID_SIGNATURE",
  "message": "Request signature is invalid"
}

TIMESTAMP_EXPIRED

The request timestamp is too old or too far in the future. Ensure your server clock is synchronized.

{
  "error": true,
  "error_code": "TIMESTAMP_EXPIRED",
  "message": "Request timestamp is outside acceptable range"
}

Best Practices for Error Handling

  • Check error_code, not just HTTP status - The error_code provides specific information about what went wrong
  • Handle rate limits gracefully - Implement exponential backoff when receiving 429 responses
  • Validate before sending - Check amounts against min/max limits before creating orders
  • Log errors for debugging - Include error_code and message in your error logs
  • Provide user-friendly messages - Translate technical error codes into user-friendly messages
  • Retry transient errors - Retry 500 and 503 errors with exponential backoff

Error Handling Example

async function handleApiError(response) {
  if (!response.ok) {
    const error = await response.json();
    
    switch (error.error_code) {
      case 'LIMIT_MIN':
      case 'LIMIT_MAX':
        // Show user-friendly message with limits
        return `Amount must be between ${error.min_amount} and ${error.max_amount}`;
      
      case 'RATE_EXPIRED':
        // Request a new rate
        return 'Rate expired. Please try again.';
      
      case 'INVALID_ADDRESS':
        // Ask user to check address
        return 'Invalid destination address. Please check and try again.';
      
      case 'RESERVE':
        // Suggest lower amount
        return `Insufficient liquidity. Maximum available: ${error.available_amount}`;
      
      case 'OFFLINE':
      case 'MAINTENANCE':
        // Show maintenance message
        return 'Service temporarily unavailable. Please try again later.';
      
      case 'RATE_LIMIT_EXCEEDED':
        // Implement backoff
        const retryAfter = error.retry_after || 60;
        await sleep(retryAfter * 1000);
        return null; // Retry
      
      default:
        return error.message || 'An unexpected error occurred';
    }
  }
  
  return null;
}