Retries
Configure retries via retry on request options (or globally in the client constructor). Default retriable codes: 408, 429, 500-504.
Be careful enabling retries on non-idempotent verbs (POST/PATCH/PUT/DELETE) to avoid duplicate side effects.
Options
retry can be a number (just a limit), or an object:
ts
{
limit?: number; // How many times to retry (total attempts = limit + 1)
timeout?: number; // Ms between retries
statusCodes?: number[]; // Only retry these statuses (defaults to 408, 429, 500-504 when omitted)
ignoreStatusCodes?: number[]; // Never retry these statuses (wins over statusCodes)
}Rules
ignoreStatusCodeswins overstatusCodes(if a status appears in both, retries stop).- If
statusCodesis omitted, WireTyped retries on its default set (408, 429, 500-504). - Timeouts are always retried (up to your retry limit).
- If an abort signal aborts, retries stop immediately (no subsequent attempts).
Examples
Number only:
ts
const [err, data] = await client.get('/users', params, { retry: 3 });Custom object:
ts
const [err, data] = await client.get('/users', params, {
retry: {
limit: 5,
statusCodes: [429, 500],
ignoreStatusCodes: [404],
timeout: 500,
},
});statusCodes + ignoreStatusCodes interaction
Ignore a status even if it’s normally retried:
ts
const [err, data] = await client.get('/users', params, {
retry: { limit: 2, ignoreStatusCodes: [429] }, // 429 is in the default retriable set, but this suppresses retries
});Ignore takes precedence if both lists include the same status:
ts
const [err, data] = await client.get('/users', params, {
retry: { limit: 5, statusCodes: [404], ignoreStatusCodes: [404] }, // will NOT retry
});Timeout-focused:
ts
const [err, res] = await client.post('/users', null, body, {
timeout: 10_000,
retry: { limit: 2, statusCodes: [408], timeout: 1000 },
});What's next
- Learn SSE reconnection behavior and type narrowing in
/guide/sse. - Learn error helpers (
isErrorType,unwrapErrorType) in/guide/errors.
