Hoppscotch is the API client that respects how the web works: open source, runs entirely in a browser tab, nothing to install. The price of that honesty is one famous wall β the web app makes requests with the browser's own fetch, so any API that doesn't send CORS headers dies with Network Error, and the fix is installing a browser extension, routing through a proxy, or running their Agent. Most real APIs, and most mock tools, don't send CORS headers.
Every Mockbird endpoint does. That makes this a genuinely useful pair: a live, stateful API you can point the Hoppscotch web tab at with zero setup β paste a URL, hit Send with the default Browser interceptor, get JSON. This guide walks that path end to end: one request, then the whole API imported into Collections from a single OpenAPI URL, stateful CRUD, forced errors and latency, and a real schema for the GraphQL tab. Everything below was performed in hoppscotch.io against production before publishing.
Open hoppscotch.io, paste this into the URL bar, hit Send:
https://mockbird.mockbird.workers.dev/m/demo/products?limit=2
With the stock Browser interceptor (Settings β Interceptor β it's the default) that returns 200 OK with two seeded products. No extension, no proxy privacy-policy to read, no Agent download. If you've only ever seen Hoppscotch's Network Error screen against your own endpoints, that's the difference CORS headers make β we send Access-Control-Allow-Origin: * and answer preflights on every mock endpoint, because a mock API that browsers can't call is half a mock API.
The demo project is public and reseeds daily. Everything on this page also works on your own project β same URLs with your project id.
Every project publishes a live OpenAPI 3.0 spec. Hoppscotch imports it directly:
Collections β Import β Import from OpenAPI β Import from URL:
https://mockbird.mockbird.workers.dev/m/demo/openapi.json
When we did exactly that, Hoppscotch reported 5 collections, 24 requests, 44 response examples imported β a folder per resource (products, orders, customers, reviews) with List / Get one / Create / Replace / Update / Delete requests, every documented query param present with its description (pagination, sorting, per-field filters, and the simulation params below), and response examples attached. Click the imported List products and Send β it returns the live list as-is.
Interop detail we fixed while writing this guide: Hoppscotch (like most importers) pre-fills every documented query param with an empty value (?name=&cursor=&mock_status=β¦). Mockbird treats empty-valued params as absent, so imported requests work verbatim instead of accidentally filtering the list down to nothing. If your own API misbehaves under Hoppscotch imports, check how it handles empty params.
Mid-migration team with Postman collections? Hoppscotch's Postman importer (with experimental script import since v2025.10.0) works too, and every project also exports a native Postman Collection v2.1 at /m/<project>/postman.json β one source of truth, both formats.
Open the imported Create a product (or make a POST request by hand), send a body:
POST https://mockbird.mockbird.workers.dev/m/demo/products
content-type: application/json
{"name": "Hoppscotch test", "price": 9.99}
The response has a new id. Now GET /m/demo/products/<that id> β it's there. PATCH it, DELETE it, watch X-Total-Count move. This is the part example-based mocking can't do: the demo is backed by a real datastore, so the create β read-back β update β delete loop you're teaching your frontend actually round-trips. Filters (?category=β¦, ?price_gte=100), full-text ?search=, sorting, pagination and relations all run against the current data, not a canned response.
The imported requests arrive with the simulation params pre-listed (disabled until you give them a value). Toggle them in the Parameters tab:
| Param | What you get |
|---|---|
mock_status=503 | that status with a JSON error body β build your error branch against a real 503 |
mock_delay=3000 | 3 s of latency β watch your spinner, or set it past your client timeout |
mock_seq=503,503,200 | deterministic sequence: two failures, then success β retry/backoff testing (add mock_seq_key=me to keep your sequence isolated on the shared demo) |
mock_chaos=0.3 | 30% of requests fail with a random 5xx/429 β flaky-API drills |
mock_ratelimit=5 | a real 429 + Retry-After once you exceed 5 req/min |
All of these work on any endpoint and method β full recipes in the loading & error states guide.
Hoppscotch's GraphQL tab wants an endpoint that answers introspection. Connect it to:
https://mockbird.mockbird.workers.dev/m/demo/graphql
The Documentation Explorer fills with the typed schema generated from the same data β Product, Order, Customer, Review, filter inputs, and full Query/Mutation roots. This query (run for real while writing this page) returns the two priciest products plus a count:
{ products(limit: 2, sortBy: "price", order: "desc") { id name price } productsCount }
Mutations work too, and they write the same records the REST endpoints serve β create a product over GraphQL, GET it over REST. (While verifying this we found our depth guard was rejecting Hoppscotch's standard introspection query as "too deep"; introspection is now exempt, so if you tried this before September 2026 and saw No schema found β it works now.)
Since v2025.10.0 Hoppscotch has a built-in Mock Servers feature, and it's a sensible design: save real responses as Examples, turn a Collection into a mock server, refine routes with header/query matchers, delays and template variables ({{uuid}}, {{timestamp}}). If your team lives in Hoppscotch workspaces and wants contract-first mocks derived from saved examples, use it β it's right there.
The boundaries, from their own docs and our hands-on run:
| Hoppscotch mock servers | Mockbird | |
|---|---|---|
| Account | login required (the New button is disabled logged-out) | none β anonymous project, claim later |
| Semantics | example replay: "mocks return predefined responsesβ¦ they don't execute business logic or touch data stores" | stateful CRUD β writes persist, filters/search/pagination compute |
| CORS | you add Access-Control-Allow-Origin headers to each mock response yourself | on by default, everywhere |
| Callers | your app + Hoppscotch requests | anything: browser, curl, CI, mobile, teammates β plus GraphQL, TS/Zod types, MSW export, db.json eject |
| Dynamic bits | {{uuid}}/{{timestamp}}/env vars in bodies | seeded fake data + templated custom routes + simulation params |
They compose, too: point a Hoppscotch mock server's source collection at requests you built against a Mockbird project, or keep design-phase example mocks in Hoppscotch and switch the environment's baseUrl here the day you need writes to stick.
One curl (or one click), no signup:
curl -s -X POST https://mockbird.mockbird.workers.dev/api/projects \
-H "content-type: application/json" \
-d '{"preset":"ecommerce"}'
# β {"id":"abc123xyz9", "adminKey":"β¦", ...}
Then import https://mockbird.mockbird.workers.dev/m/abc123xyz9/openapi.json into Hoppscotch exactly as in Β§2 β same flow, your schema, your data. Define resources by hand, or import an existing OpenAPI spec, db.json, CSV, or HAR recording and get a Hoppscotch-ready spec back out. Projects have a 10,000 requests/day cap β interactive use barely dents it.
1. Open hoppscotch.io
2. Paste https://mockbird.mockbird.workers.dev/m/demo/products?limit=2 β Send
3. Collections β Import β OpenAPI β from URL:
https://mockbird.mockbird.workers.dev/m/demo/openapi.json
Free, no signup required. Full docs Β· machine-readable API index.
Related: the same walkthrough for Bruno, escaping Postman's mock-server limits, Insomnia mock servers compared, the free GraphQL mock API, and testing loading and error states.
Verification: every step on this page was performed in the hoppscotch.io web app (1 Sep 2026) against production with the default Browser interceptor: the direct request returned 200, the OpenAPI URL import reported 5 collections / 24 requests / 44 examples, the imported List products request returned the live list verbatim, and the GraphQL tab loaded the full schema and executed the query shown. Mock-server facts are from Hoppscotch's official docs and blog (v2025.10.0, Oct 30 2025) plus a hands-on check of the logged-out UI. Test records created on the demo were deleted. If a step here doesn't work, that's a bug: tell us.