โ† All guides

An axios-mock-adapter alternative when you need a real URL

Honest split first: axios-mock-adapter earned its ~2.8M weekly downloads. mock.onGet("/users").reply(200, users) is about as pleasant as stubbing gets, and for fast offline unit tests of axios-based code it's still a fine choice. This page is not going to pretend otherwise.

First, the gotchas that send people searching

We verified all of these the week of writing (Aug 2026, axios-mock-adapter v2.1.0, axios v1, Node 22) โ€” every snippet on this page was actually run:

If the first two bullets are your actual problem, no adapter option fixes them โ€” the mock needs to be somewhere every client can reach:

The mock only exists inside your JS process

Mockbird is the other half: a hosted mock REST API on a real URL. Define resources (or pick a preset, or import an OpenAPI spec / db.json / CSV / Postman collection), get realistic seeded data and full stateful CRUD โ€” reachable from axios, fetch, a browser, curl, a phone, another service, CI, or a teammate. No adapter code, no signup.

The 60-second version

# one curl, no signup โ€” a whole seeded e-commerce backend
curl -X POST https://mockbird.mockbird.workers.dev/api/projects \
  -H 'content-type: application/json' -d '{"name":"shop","preset":"ecommerce"}'
# โ†’ {"id":"abc123","adminKey":"KEY", ...}   โ† save both

curl https://mockbird.mockbird.workers.dev/m/abc123/products?limit=3
# โ†’ 3 seeded products, CORS on, writes persist

Then in your app, nothing changes but the base URL:

const api = axios.create({ baseURL: process.env.API_URL });
// dev/test: API_URL=https://mockbird.mockbird.workers.dev/m/abc123
// prod:     API_URL=https://api.yourapp.com

Prefer clicking? This link creates the same project in your browser โ€” no account. Have an OpenAPI spec? Paste it at /app#import and get a live seeded mock of your actual API shape.

axios-mock-adapter concepts โ†’ Mockbird

axios-mock-adapterMockbirdNotes
new AxiosMockAdapter(client)no code โ€” point baseURL at the mockno wrapped-instance boundary: fetch, SDKs, curl, teammates all see the same mock
onGet("/products").reply(200, data)a products resourcelist/get/create/update/delete generated, plus filtering, sorting, pagination, relations
Hand-rolled reply dataseeded realistic recordsfaker-style names/emails/prices/dates; or import your exact records from db.json/CSV
reply(500)?mock_status=500 on any URLno adapter edit โ€” error/loading states guide
networkError() / flaky-API simulation?mock_chaos=0.3fails a random fraction with real 5xx/429 responses โ€” point your retry logic at it (honest note: that's HTTP-level failure, not a socket-level network error)
timeout() / delayResponse?mock_delay=3000real time passes, so a 1s axios timeout genuinely fires โ€” plus ?mock_jitter=100-1500 random latency
Exact-param matching misses โ†’ 404not neededany query composes: filters, ?select=, sort, pagination โ€” no "why is this 404ing"
mock.history.getrequest inspectorlast 50 requests: method, path, query, headers, body โ€” assert what was actually sent
reset() / resetHistory() between testssnapshot pinningsave named data states; each parallel test pins one via X-Mockbird-Snapshot โ€” no reset races
restore()flip the env var backyour app code never knew the difference

Try it in 10 seconds (shared demo, no setup)

# seeded data with field projection
curl 'https://mockbird.mockbird.workers.dev/m/demo/products?limit=2&select=name,price'

# the states you'd write adapter handlers for โ€” as query params
curl -i 'https://mockbird.mockbird.workers.dev/m/demo/products?mock_status=503'
curl 'https://mockbird.mockbird.workers.dev/m/demo/products/1?mock_delay=2000'

# stateful: the write persists (the thing the adapter can't do)
curl -X POST https://mockbird.mockbird.workers.dev/m/demo/products \
  -H 'content-type: application/json' -d '{"name":"proof","price":9.99}'
# โ†’ returns {"id":31,โ€ฆ} โ€” and GET /m/demo/products/31 now works

All against the shared demo project (resets daily).

Or use both โ€” they compose

Honest comparison

axios-mock-adapterMockbird
What it isfree OSS library (axios only)free hosted service
Reachable fromthe axios instance you wrapanything with HTTP: fetch, browser, curl, Postman, mobile, backend, CI, agents
fetch / other HTTP clientsnot intercepted (verified)it's a real URL โ€” every client works by definition
Setupwrite + maintain handlersone curl or one click; no code
Mock datayou write itseeded realistic data, or import your own
Stateful CRUDDIYdefault โ€” writes persist
Error/latency simulationper-handler code; timeout() is instant?mock_status / ?mock_delay / ?mock_chaos / ?mock_jitter on any URL, real time passes
Unmatched requestsynthesized 404 (default) โ€” looks like a backend bugn/a โ€” real endpoints answer real queries
Works offlineyesno โ€” it's a real network call
Latencyzero (in-process)real network latency
Request assertionsmock.history, preciserequest inspector (last 50, with headers/body)
Last releasev2.1.0, Oct 2024 (npm registry, as of Aug 2026)actively developed
Request capnone10,000/project/day

Written by the Mockbird maker โ€” bias disclosed. Where axios-mock-adapter genuinely wins: in-process interception means zero latency, zero network flakiness, tests that run on a plane; networkError() is a true request-level failure with no HTTP response, which we can't produce; mock.history assertions are more precise than any log-based check; and a reply function is arbitrary JavaScript. For offline unit tests of axios-only code, keep it. When the thing you need is a URL โ€” for fetch, a browser, a prototype, a teammate, a mobile client, or CI hitting a deployed build โ€” that's us.

Full API reference in the docs. More guides: mock API for Node.js ยท nock alternative ยท MSW alternative ยท mock APIs in Jest ยท mock APIs in Vitest ยท free mock API tools compared ยท deterministic test data ยท testing loading & error states. Create your API โ†’