Name check: this page is about DummyAPI at dummyapi.io โ the one with the app-id header. If you're after DummyJSON (dummyjson.com), that's a different service: we compare it here.
Credit first: DummyAPI earned its place in tutorials. Its dataset is genuinely rich โ over 100 fake users, 800+ posts with real photographs, 1,000+ comments, tags, and varied field types including images, links, datetimes and map location data โ connected by real relations. It speaks both REST and GraphQL, and it does something most fake APIs fake: with your app-id, writes actually persist in your own environment (there's even a created=1 parameter to list only what you created). That's more than JSONPlaceholder, FakeStoreAPI or DummyJSON give you, and it's free.
The friction is at the front door. Three things to know, all from DummyAPI's own site or verified hands-on (September 2026):
app-id Header for each request", and the app-id comes from your account page. Hands-on: a keyless GET /data/v1/user answers HTTP 403 {"error":"APP_ID_MISSING"} โ reads included โ and an invented app-id answers {"error":"APP_ID_NOT_EXIST"}. For a service whose job is "try things instantly", the first step is a signup form.user, post, comment, tag โ no way to add an invoices collection or reshape a model. Pagination is capped at limit=50 per page (docs: limit range 5โ50, page 0โ999), and there are no failure-simulation controls (no delay, no forced 500s) for testing error paths.Rebuild DummyAPI's shape as your own project โ every command below ran against production before this page was published. No signup, no header:
P=$(curl -s -X POST https://mockbird.mockbird.workers.dev/api/projects \
-H 'content-type: application/json' -d '{"name":"my-dummy","blank":true}')
ID=$(echo "$P" | grep -o '"id": *"[^"]*"' | head -1 | cut -d'"' -f4)
KEY=$(echo "$P" | grep -o '"adminKey": *"[^"]*"' | cut -d'"' -f4)
curl -s -X POST "https://mockbird.mockbird.workers.dev/api/projects/$ID/resources" \
-H "x-admin-key: $KEY" -H 'content-type: application/json' -d '{
"name":"users","seed":12,"fields":[
{"name":"title","type":"oneOf","values":["mr","ms","mrs","miss","dr"]},
{"name":"firstName","type":"firstName"},{"name":"lastName","type":"lastName"},
{"name":"email","type":"email"},{"name":"picture","type":"avatar"}]}'
curl -s -X POST "https://mockbird.mockbird.workers.dev/api/projects/$ID/resources" \
-H "x-admin-key: $KEY" -H 'content-type: application/json' -d '{
"name":"posts","seed":20,"fields":[
{"name":"text","type":"sentence"},{"name":"image","type":"image"},
{"name":"likes","type":"number"},{"name":"userId","type":"refId"}]}'
curl -s -X POST "https://mockbird.mockbird.workers.dev/api/projects/$ID/resources" \
-H "x-admin-key: $KEY" -H 'content-type: application/json' -d '{
"name":"comments","seed":15,"fields":[
{"name":"message","type":"sentence"},
{"name":"userId","type":"refId"},{"name":"postId","type":"refId"}]}'
(DummyAPI's owner relation becomes a userId field โ that naming convention is what powers the nested routes and joins below. Prefer clicking? One-click blog preset gives you posts/comments/authors instantly.)
curl 'https://mockbird.mockbird.workers.dev/m/<ID>/users?page=1&limit=10' # same page/limit params (ours is 1-based)
curl 'https://mockbird.mockbird.workers.dev/m/<ID>/users/2' # single user by id
curl 'https://mockbird.mockbird.workers.dev/m/<ID>/users/2/posts' # their /post/user/:id
curl 'https://mockbird.mockbird.workers.dev/m/<ID>/posts/1/comments' # their /comment/post/:id
curl 'https://mockbird.mockbird.workers.dev/m/<ID>/posts?_expand=user&likes_gte=500&sortBy=likes&order=desc'
curl -X POST 'https://mockbird.mockbird.workers.dev/m/<ID>/users' \
-H 'content-type: application/json' \
-d '{"title":"dr","firstName":"Grace","lastName":"Hopper","email":"grace@example.com"}'
# โ {"id":13} โ and GET /users/13 returns it: writes persist here too, no app-id needed
GraphQL rides along on the same data โ queries and mutations both (DummyAPI's own site describes its GraphQL as access to static fake data):
curl -X POST 'https://mockbird.mockbird.workers.dev/m/<ID>/graphql' \
-H 'content-type: application/json' \
-d '{"query":"{ posts(limit:2, sortBy:\"likes\", order:\"desc\") { id likes user { firstName } } }"}'
| On dummyapi.io | On Mockbird |
|---|---|
Sign up โ copy app-id โ -H 'app-id: โฆ' on every request | no header, no signup โ the project URL is the whole story |
GET /data/v1/user?page=0&limit=10 | GET /m/<id>/users?page=1&limit=10 (same params; ours starts at 1, no 50 cap) |
GET /data/v1/user/:id | GET /m/<id>/users/:id |
GET /data/v1/post/user/:id | GET /m/<id>/users/:id/posts (nested route) |
GET /data/v1/comment/post/:id | GET /m/<id>/posts/:id/comments |
POST /data/v1/user/create (persists in your env โ credit where due) | POST /m/<id>/users โ persists, and it's your whole project |
created=1 to see only your items | everything is your environment โ no flag needed |
| Fixed models: user / post / comment / tag | any collections, any typed fields (oneOf enums, refId relations, 35+ types) |
| GraphQL ("static fake data", per their site) | GraphQL queries and mutations, same data as REST |
| Error testing: none | ?mock_status=503, ?mock_delay=2000, chaos injection |
| 500 requests/day free | 10,000 requests per project per day |
| DummyAPI | Mockbird | |
|---|---|---|
| First request | signup + app-id header | keyless curl |
| Free cap | 500 requests/day (beta; Patreon for unlimited) | 10,000/day per project |
| Writes | real, in your app-id environment โ better than most fake APIs | real, full CRUD |
| Dataset out of the box | 100+ users, 800+ posts with real photos, map data โ richer than our generated seeds | faker-style seeds; your schema, your sizes |
| Own schema | no โ 4 fixed models | yes โ any collections + custom routes |
| Page size | limit 5โ50 | your call |
| Failure simulation | โ | status/delay/chaos per request |
| Exports | โ | OpenAPI, Postman, TypeScript/Zod, db.json eject |
| Multiple environments | yes โ parallel app-ids (nice touch) | parallel projects, plus snapshots per project |
Where DummyAPI wins, plainly: if what you want is a large, ready-made, realistic social dataset โ real photographs with metadata, map locations, a populated comment graph โ and you don't mind the signup, its seeded content is more lifelike than generated data. This page is for the moment the app-id header, the 500/day meter, or the fixed models get in the way of just building.
curl 'https://mockbird.mockbird.workers.dev/m/demo/products?limit=2&sortBy=price&order=desc'
curl -X POST https://mockbird.mockbird.workers.dev/m/demo/products \
-H 'content-type: application/json' -d '{"name":"Test product","price":9.99}'
# โ it persists โ GET it back by the id you received. No app-id, no account.
This page is written by the Mockbird maker โ bias disclosed. DummyAPI facts verified September 4, 2026: the required app-id header, limit 5โ50 / page 0โ999 ranges, and the created=1 parameter are from dummyapi.io's own documentation; the 100 users / 800+ posts / 1k+ comments dataset sizes, the 500 requests/day beta cap and Patreon upsell are from its homepage; the keyless-GET โ 403 APP_ID_MISSING and bogus-key โ APP_ID_NOT_EXIST responses were verified hands-on with curl (read-only requests; we touched no one's data). Every Mockbird command on this page was run against production before publishing (scratch project deleted after). Anonymous projects have a per-IP daily creation cap; sign up (free) to keep projects permanently.
Full API reference in the docs. More guides: DummyJSON alternative ยท JSONPlaceholder alternative ยท FakeStoreAPI alternative ยท GoRest alternative. Create your API โ