Skip to main content

Handle Errors

Proper error handling ensures a smooth experience for your users.

Check Status Codes

Always check the HTTP status code before processing the response:
const response = await fetch(url, { headers });

if (!response.ok) {
  const { error } = await response.json();

  switch (response.status) {
    case 400:
      console.error('Bad request:', error);
      break;
    case 401:
      console.error('Unauthorized — check your API key');
      break;
    case 404:
      console.error('Resource not found');
      break;
    case 429:
      console.error('Rate limited — slow down');
      break;
    default:
      console.error('Unexpected error:', error);
  }
  return;
}

const data = await response.json();

Retry on Transient Errors

For 429 (rate limited) and 5xx (server errors), implement retry with exponential backoff:
async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const response = await fetch(url, options);

    if (response.ok) return response.json();
    if (response.status === 429 || response.status >= 500) {
      await new Promise(resolve => setTimeout(resolve, Math.pow(2, i) * 1000));
      continue;
    }

    throw new Error(`API error: ${response.status}`);
  }
  throw new Error('Max retries exceeded');
}

Validate Before Sending

Reduce errors by validating data before making API calls:
  • Check required fields are present
  • Validate data types match your cube schema
  • Ensure values are within allowed ranges
See Error Codes for the full list.