async function callAPIWithRetry(url, data, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_KEY}`
},
body: JSON.stringify(data)
});
if (!response.ok) {
const error = await response.json();
if (response.status === 429) {
// Rate limited
const retryAfter = response.headers.get('Retry-After') || 60;
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
continue;
}
if (response.status >= 500 && attempt < maxRetries - 1) {
// Server error - retry with exponential backoff
await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));
continue;
}
throw new Error(error.error.message);
}
return await response.json();
} catch (error) {
if (attempt === maxRetries - 1) throw error;
// Network error - retry
await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));
}
}
}