Retry strategies
The API responds with transient codes (429, 5xx) and permanent ones (4xx except 429). Only the transient codes and network errors are worth retrying, always with exponential backoff and jitter.
Quick decision
function shouldRetry(err) {
if (!err.response) return true; // network error
const status = err.response.status;
if (status === 429) return true;
if (status >= 500 && status < 600) return true;
return false;
}Exponential backoff with jitter
const backoffMs = (intento) => {
const base = Math.min(1000 * Math.pow(2, intento), 30000);
const jitter = Math.random() * 1000;
return base + jitter;
};Complete pattern
async function callWithRetry(fn, maxRetries = 5) {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (err) {
if (!shouldRetry(err) || i === maxRetries - 1) throw err;
// If there's a Retry-After, respect it
const retryAfter = err.response?.headers['retry-after'];
const waitMs = retryAfter ? parseInt(retryAfter) * 1000 : backoffMs(i);
await sleep(waitMs);
}
}
}