DummyJSON deserves its popularity: a free fake REST API with rich datasets (products with images, users, carts, todos), pagination, sorting, search, delay simulation, even working JWT auth β no signup, no key. But everyone building anything that isn't a phone shop hits the same wall twice. The dataset is fixed β 194 products, someone else's users, and if your app has invoices or listings there's no endpoint for them (GET /invoices is a 404). And writes are faked: POST /products/add returns {"id":195}, but GET /products/195 is a 404, and a PUT changes only the response, never the data β so create-then-list flows, optimistic-update rollbacks, and delete confirmations can't be tested for real. (Both behaviors verified live, July 2026. The same two walls apply to FakeStoreAPI β covered in its own guide.)
Mockbird keeps the parts that made DummyJSON great β free, keyless, CORS on, familiar query params, simulation flags, JWT auth β and removes the walls: your own resources, realistic seeded data, and full CRUD that actually persists.
The shared demo project is live right now, and sortBy/order work exactly like DummyJSON's:
curl "https://HOST/m/demo/products?sortBy=price&order=asc&limit=3"
Realistic product names, prices, image URLs, categories. (The demo is shared and resets daily; make your own project below.)
One request creates a whole seeded store backend (the ecommerce preset: 30 products, 25 orders, 20 customers, 40 reviews with foreign keys):
curl -X POST https://HOST/api/projects \
-H 'content-type: application/json' \
-d '{"name":"my-shop","preset":"ecommerce"}'
# β {"id":"abc123","adminKey":"KEY","baseUrl":"https://HOST/m/abc123", ...}
| DummyJSON | Mockbird |
|---|---|
/products?limit=10&skip=20 | /products?limit=10&page=3 (page-based; _page/_limit also work) |
?sortBy=price&order=asc | ?sortBy=price&order=asc β identical |
?select=title,price | ?select=title,price β identical (id always included; works on single records and joined fields too) |
/products/search?q=phone | /products?q=phone |
/products/category/beauty | /products?category=beauty (filter by any field) |
?delay=2000 | ?mock_delay=2000 |
/http/503 (bare status endpoint) | /products?mock_status=503 β error simulation on your real routes, so your error handling is tested where it actually runs |
/auth/login (fixed usernames like emilys) | /auth/login β any email works, or use a seeded users resource as the roster; real signed JWTs, configurable expiry |
/users/1/carts (fixed relations) | /customers/1/orders β nested routes from your own <singular>Id foreign keys, plus ?_expand/?_embed joins |
curl -X POST "https://HOST/m/abc123/products" \
-H 'content-type: application/json' \
-d '{"name":"My Actual Product","price":19.99}'
# β 201 {"id":31, ...}
curl "https://HOST/m/abc123/products/31"
# β 200 β it's really there. PUT/PATCH/DELETE stick too.
Broke the data experimenting? Save a snapshot and restore it in one call (great in a test beforeEach), or reseed the resource fresh.
curl -X POST https://HOST/api/projects/abc123/resources \
-H 'X-Admin-Key: KEY' -H 'content-type: application/json' \
-d '{"name":"invoices","fields":[
{"name":"number","type":"uuid"},
{"name":"customer","type":"fullName"},
{"name":"amount","type":"price"},
{"name":"status","type":"status"},
{"name":"dueDate","type":"futureDate"}
],"seed":25}'
Or import an OpenAPI spec or a json-server db.json and your exact data is hosted.
| DummyJSON | Mockbird | |
|---|---|---|
| Signup needed | no | no (optional, to keep projects) |
| Resources | ~10, fixed (products, carts, users, posts, todosβ¦) | your own, any schema, or presets |
| Data | rich but fixed (194 products, with images) | realistic seeded, reseedable, or your imported records |
| Writes | simulated β response only, nothing stored | persist (snapshot/reseed to reset) |
| Auth | real JWTs, fixed user roster | real JWTs, any email or your users resource; register persists; protected mode |
| Simulation | ?delay=, /http/:code | ?mock_delay=, ?mock_status= on your real routes |
| GraphQL / snapshots / webhooks / exports | β | included, free |
| Limits | informal fair use | 10,000 requests/day per project, generous free caps |
Where DummyJSON still wins: its fixed datasets are hand-crafted and deep β product photos on a CDN, users with addresses and crypto wallets, recipes, quotes β and Mockbird's generated seed data won't match that richness (no hosted product photos here, just placeholder image URLs). If someone else's rich catalog is exactly what you want, keep using it. Reach for Mockbird when the schema needs to be yours or writes need to stick. Written by the Mockbird maker β bias disclosed; DummyJSON behavior re-verified July 2026.
Full API reference in the docs. More guides: JSONPlaceholder alternative Β· fake e-commerce API Β· 5 free mock-API tools compared. Create your API β