Docs

Quick Start

Wrap your Axios instance and start making resilient requests. The axiosInstance property is a drop-in replacement for direct Axios usage.

Functional API (recommended)

import { createRetryer } from 'axios-retryer';

const retryer = createRetryer({
  retries: 3,
  debug: false,
});

// Drop-in replacement for axios
const { data } = await retryer.axiosInstance.get('https://api.example.com/users');
console.log(data);

Class-based API

import { RetryManager } from 'axios-retryer';

const manager = new RetryManager({ retries: 3 });
const { data } = await manager.axiosInstance.get('/api/users');

With your existing Axios instance

import axios from 'axios';
import { createRetryer } from 'axios-retryer';

const baseAxios = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 5000,
  headers: { 'X-App-Version': '2.0' },
});

const retryer = createRetryer({
  retries: 3,
  axiosInstance: baseAxios,      // uses your existing instance
});

// axiosInstance is the same object — base URL, headers, interceptors all preserved
await retryer.axiosInstance.get('/users');

Add plugins

Start with core, then layer in plugins as your app needs them:

import { createRetryer } from 'axios-retryer';
import { createTokenRefreshPlugin } from 'axios-retryer/plugins/TokenRefreshPlugin';
import { createCircuitBreaker } from 'axios-retryer/plugins/CircuitBreakerPlugin';
import { createCachePlugin } from 'axios-retryer/plugins/CachingPlugin';
import { createMetricsPlugin } from 'axios-retryer/plugins/MetricsPlugin';

// Chain .use() so TypeScript includes every plugin's events on `retryer`
const retryer = createRetryer({ retries: 3, maxConcurrentRequests: 8 })
  .use(
    createTokenRefreshPlugin(async (axiosInstance) => {
      const refreshToken = localStorage.getItem('refreshToken');
      const { data } = await axiosInstance.post('/auth/refresh', { refreshToken });
      localStorage.setItem('accessToken', data.accessToken);
      return { token: data.accessToken };
    }),
  )
  .use(
    createCircuitBreaker({
      failureThreshold: 5,
      openTimeout: 30_000,
    }),
  )
  .use(createCachePlugin({ timeToRevalidate: 60_000, maxItems: 200 }))
  .use(createMetricsPlugin());

retryer.on('onMetricsUpdated', (m) => console.log('retries:', m.successfulRetries));

// Make requests
const { data } = await retryer.axiosInstance.get('/api/products');

Request priorities

import { createRetryer, AXIOS_RETRYER_REQUEST_PRIORITIES } from 'axios-retryer';

const retryer = createRetryer({ maxConcurrentRequests: 3 });

// CRITICAL requests skip the queue ahead of everything else
retryer.axiosInstance.post('/auth/login', creds, {
  __axiosRetryer: { priority: AXIOS_RETRYER_REQUEST_PRIORITIES.CRITICAL },
});

// Background work is processed last
retryer.axiosInstance.post('/analytics/event', eventData, {
  __axiosRetryer: { priority: AXIOS_RETRYER_REQUEST_PRIORITIES.LOW },
});

Cancellation

// Cancel a specific request by ID
const config = await retryer.axiosInstance.get('/api/data', {
  __axiosRetryer: { requestId: 'my-request' },
}).catch(() => {});

retryer.cancelRequest('my-request');

// Cancel everything
retryer.cancelAllRequests();

Try it live

Interactive sandbox — run scenarios in the browser with mocked HTTP (no install).

Configuration → Plugins