โ† 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 ยท fetch-mock 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 โ†’