← All guides

A MockServer alternative for when the mock should just be a URL

Credit where due: MockServer may be the most capable open-source mock toolkit there is. After a quiet stretch, the project is very much alive β€” v7.6.0 shipped August 17, 2026, with commits landing the day we wrote this β€” and version 7 is a monster in the best sense: mock and proxy on one auto-detecting port (HTTP/1.1, HTTPS, HTTP/2, gRPC, gRPC-Web, WebSockets, raw TCP), record-and-replay proxying, request verification, chaos testing, interactive proxy breakpoints, OIDC/OAuth2/SAML identity-provider mocks, OpenAPI import, Pact support, Testcontainers integration, and a deep matcher DSL (JSON, JSONPath, XPath, regex, OpenAPI). The old JVM requirement is gone too: npx -p mockserver-node mockserver run pulls a self-contained native bundle β€” we ran it, it started in seconds, no Java installed. If your job is service virtualization inside infrastructure you already operate, MockServer is a superb choice and this page won't talk you out of it.

This page is about a much smaller, very common job: a data-shaped sandbox API for a frontend, a prototype, or an integration test β€” the "just give me /users that behaves like a real API" job. MockServer 7 added a CRUD data store aimed exactly at this, so we downloaded 7.6.0 and put it through the same drill we use on every tool. It's real β€” and it has walls.

The walls (each one verified on v7.6.0, August 2026)

Setup: mockserver run -p 1080, then PUT /mockserver/crud with {"basePath":"/users", "initialData":[…3 users…]}. Registration works exactly as documented β€” list/get/create/replace/patch/delete endpoints appear instantly, seeded with our records. Then:

Wall 1: the list endpoint has no query semantics. GET /users?role=user returned all three users, including the admin. ?limit=1&page=2 returned all three. ?sortBy=name&order=desc returned all three, in insertion order. Every query param is silently ignored β€” the store gives you "all items" or "one item by id", and pagination, filtering, sorting, and search are your frontend's problem (or another layer of hand-written expectations).

Wall 2: it's in-memory β€” a restart loses everything. We killed the process and started it again: GET /users β†’ 404, empty body. Not just the records β€” the CRUD registration itself was gone. PUT /mockserver/reset wipes it the same way (that one is documented). MockServer does have opt-in file persistence, but it's for expectations; the CRUD store's documentation says plainly that it is backed by an in-memory store. For a personal sandbox that lives exactly as long as one test run, fine; for a mock your team hits for a week, everything rides on one process never restarting.

Wall 3: small data-API details you'd expect from a real backend aren't there. POST with an explicit {"id":50} got renumbered to the next auto-increment (we got id:2). GET /users/1/posts β†’ 404: no nested routes, no relations between stores. And the store describes itself only in its registration response β€” there's no generated OpenAPI spec, Postman collection, or TypeScript types for the resource you just created. (One genuinely good detail, credit due: an unknown id is a clean 404, not an error page.)

Wall 4: there is no hosted option β€” sharing the mock means operating a server. This isn't a defect, it's the deployment model: MockServer runs on your laptop, in Docker, or in Kubernetes via their Helm chart (where surviving pod restarts officially requires configuring PersistentVolumeClaims). The moment a teammate, a phone on another network, a CI job, or a deployed preview needs to hit the mock, you're provisioning, exposing, and babysitting infrastructure. There is no cloud offering to pay for even if you wanted one.

The 60-second switch

Where you'd run a binary and PUT /mockserver/crud, create a hosted project instead β€” nothing to run, nothing to keep alive:

curl -X POST https://mockbird.mockbird.workers.dev/api/projects \
  -H 'content-type: application/json' -d '{"name":"my-api","preset":"ecommerce"}'
# β†’ {"id":"<PID>","adminKey":"…","baseUrl":"https://mockbird.mockbird.workers.dev/m/<PID>",…}
# 4 resources, realistic seeded records, live at a public URL immediately

Your initialData has a direct equivalent: import a db.json β€” {"users":[…your exact records…]} β€” and your records are hosted verbatim, ids preserved. Or import an OpenAPI spec and get typed seed data generated. Either way the data-API behaviors from Wall 1 are just true, on every resource, with zero authoring:

# the params MockServer's CRUD store ignores (ran on the shared demo before publishing):
curl 'https://mockbird.mockbird.workers.dev/m/demo/products?sortBy=price&order=desc&limit=2&select=name,price'
# β†’ the two most expensive products, only the fields you asked for

curl 'https://mockbird.mockbird.workers.dev/m/demo/products?inStock=true&limit=2&page=2'
# β†’ filtered AND paginated

# writes persist β€” and survive every restart we don't have:
curl -X POST https://mockbird.mockbird.workers.dev/m/demo/products \
  -H 'content-type: application/json' -d '{"name":"my product","price":9.99}'
# β†’ {"name":"my product","price":9.99,"id":31}
curl https://mockbird.mockbird.workers.dev/m/demo/products/31   # β†’ same record, tomorrow too

MockServer concepts β†’ Mockbird

MockServerMockbirdNotes
mockserver run + PUT /mockserver/crudPOST /api/projectshosted URL instead of localhost:1080; nothing to operate
initialData seed recordsdb.json importrecords hosted verbatim, ids preserved; or generate typed fakes with ?seed=N
GET {basePath} (all items, params ignored)list endpoints with the full toolkitfilter, _gte/_lte/_ne/_like, sort, pagination, search, ?select= β€” always on
in-memory store, wiped on restart/resetpersistent storage by defaultrecords live in a real database; deliberate resets via snapshots
PUT /mockserver/resetsnapshot save / restorenamed states; pin one per request with X-Mockbird-Snapshot for parallel tests
expectation with a delay?mock_delay=2000per-request query param β€” measured 2.4 s on the demo
chaos testing?mock_chaos=0.3, ?mock_jitter=800honest: theirs is free too, and richer (proxy-level, K8s recipes); ours is one query param
fixed error responses?mock_status=503, ?mock_seq=502,502,200any endpoint, no expectation authored β€” verified 503 on the demo
retrieve recorded requests / verificationrequest inspectorlast 50 with headers + bodies; theirs adds order/count assertions β€” richer
OpenAPI β†’ expectationsOpenAPI β†’ live seeded resourcesboth import; we also export OpenAPI, Postman, and TS types from the live schema
GraphQL mocking (schema you define)generated GraphQL endpointours is derived from your data automatically β€” queries, mutations, relations
proxy / record-and-replayno equivalenthonest: MockServer's superpower stays MockServer's
gRPC, WebSockets, raw TCP, HTTP/2no equivalent (REST + GraphQL + SSE + WS echo)honest: their protocol breadth is unmatched
10,000 items per store1,000 records per resourcehonest: their in-memory cap is larger than our per-resource cap

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

# everything the CRUD store ignores, working on a shared hosted URL:
curl 'https://mockbird.mockbird.workers.dev/m/demo/products?sortBy=price&order=desc&limit=2'

# failure and latency simulation without an expectation:
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'

# create your own β€” one click, no terminal:
# https://mockbird.mockbird.workers.dev/app#new=ecommerce

Use both β€” they compose

The clean split: MockServer for the services you operate and virtualize, Mockbird for the backend that doesn't exist yet. Keep MockServer in CI where its proxy, verification, gRPC support, and chaos tooling earn their keep; point the frontend, the prototype, and the teammate's phone at a Mockbird project β€” a persistent, data-shaped API that's a URL, not a process.

Honest comparison

MockServer 7 (OSS)Mockbird
Pricefree, Apache-2.0free while in beta
Hosted URL others can hitno β€” self-host (Docker/Helm) to shareyes β€” 10,000 requests/project/day, no signup
Stateful CRUDyes (7.x data store) β€” in-memory, wiped on restart/resetyes β€” persistent database, snapshots, restore
Pagination/filter/sort/search on listsno β€” all items in insertion order (verified)always on, every resource
Relations / nested routesno (between CRUD stores)_expand/_embed + nested routes
Generated OpenAPI/Postman/types of your mockno (imports OpenAPI; doesn't export the store)yes β€” all three, from the live schema
Proxy, record & replay, verificationexcellent β€” the whole pointnone
Protocols beyond HTTP/1.1HTTP/2, gRPC, WS, TCP, HTTP/3 (exp.)REST, GraphQL, SSE, WS echo
Identity-provider mocks (OIDC/OAuth/SAML)yes β€” dedicated mocksJWT mock auth (simpler: login/register/me)
Works offline / no request capsyesno
Install footprintone command (native bundle, ~seconds to start)zero β€” it's a URL
Maintenancevery active β€” v7.6.0 Aug 2026actively developed

Written by the Mockbird maker β€” bias disclosed. Where MockServer genuinely wins: proxying and record-and-replay, request verification, protocol breadth (gRPC, WebSockets, raw TCP, HTTP/2/3), chaos tooling with Kubernetes recipes, identity-provider mocks, a matcher DSL we don't approach, Testcontainers integration, offline use with no caps β€” and it's free and Apache-licensed. Every behavioral claim above was verified by us on August 26, 2026 against MockServer v7.6.0 run via the official mockserver-node launcher (CRUD store registered per their docs; query params, restart wipe, reset wipe, id renumbering, and 404s all observed directly; the in-memory design and reset behavior are also stated in their CRUD documentation). If any of this changes, we'll update the page.

Full API reference in the docs. More guides: stubby4j alternative Β· WireMock Cloud alternative Β· Hoverfly alternative Β· mountebank alternative Β· Prism alternative Β· Karate mock server alternative Β· free mock API tools compared. Create your API β†’