Skip to content

Error Handling

Handle API errors gracefully in your integrations.

Error Response Format

All errors return a consistent JSON structure:

json
{
  "success": false,
  "error": "Not Found",
  "message": "The requested product was not found"
}

Validation errors include field-specific details:

json
{
  "success": false,
  "error": "Validation Error",
  "message": "The given data was invalid",
  "errors": {
    "url": ["The url field is required"],
    "events": ["The events field must be an array"]
  }
}

HTTP Status Codes

Success Codes

CodeDescription
200Request succeeded
201Resource created
204Request succeeded, no content

Client Error Codes

CodeErrorDescription
400Bad RequestMalformed request syntax
401UnauthorizedInvalid or missing API token
403ForbiddenToken lacks required scope
404Not FoundResource doesn't exist
422Unprocessable EntityValidation failed
429Too Many RequestsRate limit exceeded

Server Error Codes

CodeErrorDescription
500Internal Server ErrorSomething went wrong on our end
502Bad GatewayUpstream service error
503Service UnavailableTemporarily unavailable

Common Errors

401 Unauthorized

json
{
  "success": false,
  "error": "Unauthorized",
  "message": "Invalid or missing API token"
}

Causes:

  • Missing Authorization header
  • Malformed header (should be Bearer {token})
  • Invalid or expired token
  • Revoked token

Solution: Check your token and header format.

403 Forbidden

json
{
  "success": false,
  "error": "Forbidden",
  "message": "Token does not have required scope: orders:write"
}

Cause: Token lacks the permission needed for this endpoint.

Solution: Create a new token with required scopes.

404 Not Found

json
{
  "success": false,
  "error": "Not Found",
  "message": "Product not found"
}

Cause: The requested resource doesn't exist.

Solution: Verify the ID or identifier is correct.

422 Validation Error

json
{
  "success": false,
  "error": "Validation Error",
  "message": "The given data was invalid",
  "errors": {
    "url": ["The url must be a valid URL"],
    "events": ["The selected events.0 is invalid"]
  }
}

Cause: Request data didn't pass validation.

Solution: Fix the indicated fields and retry.

429 Rate Limited

json
{
  "success": false,
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Retry after 60 seconds",
  "retry_after": 60
}

Cause: Too many requests in the time window.

Solution: Implement backoff and respect retry_after.

Best Practices

1. Always Check Status Codes

javascript
const response = await client.get('/products');

if (response.status !== 200) {
    handleError(response);
    return;
}

// Process success response

2. Handle Specific Errors

javascript
switch (response.status) {
    case 401:
        // Re-authenticate or refresh token
        break;
    case 403:
        // Check permissions
        break;
    case 404:
        // Resource not found - handle gracefully
        break;
    case 429:
        // Implement exponential backoff
        await sleep(response.data.retry_after * 1000);
        break;
    case 500:
        // Log and retry with backoff
        break;
}

3. Log Errors

Always log API errors for debugging:

javascript
console.error('API Error:', {
    status: response.status,
    error: response.data.error,
    message: response.data.message,
    endpoint: endpoint,
    timestamp: new Date().toISOString()
});

4. Implement Retries

For transient errors (5xx), implement retry with exponential backoff:

javascript
async function fetchWithRetry(endpoint, maxRetries = 3) {
    for (let i = 0; i < maxRetries; i++) {
        const response = await client.get(endpoint);

        if (response.status < 500) {
            return response;
        }

        // Exponential backoff: 1s, 2s, 4s
        await sleep(Math.pow(2, i) * 1000);
    }
    throw new Error('Max retries exceeded');
}

5. Validate Before Sending

Reduce errors by validating data before making requests:

javascript
function createWebhook(url, events) {
    if (!url.startsWith('https://')) {
        throw new Error('URL must use HTTPS');
    }
    if (!Array.isArray(events) || events.length === 0) {
        throw new Error('Events must be a non-empty array');
    }
    return client.post('/webhooks', { url, events });
}

Built for game developers, by game developers.