π‘ We check restful-api.dev (and 50+ other public mock/testing services) with a plain GET every 30 minutes β see the live status page.
restful-api.dev deserves real credit before anything else: unlike almost every free fake API, its writes actually persist. POST /objects gives you an id, GET /objects/<id> returns your object, PATCH updates it, DELETE removes it, and CORS is open β no key, no signup. JSONPlaceholder, DummyJSON, and FakeStoreAPI all fake that loop; restful-api.dev does it for real, and it's been quietly reliable for years. Its reserved seed data is a sensible design too: nobody can vandalise the 13 devices every tutorial depends on.
But the moment your tutorial goes past hello-world, you hit walls that are baked into the design. All of this verified hands-on, September 6, 2026:
{"error":"Youβve reached the daily request limit for our public API (50 requests per 24 hours). Create a free account or sign inβ¦"}. Worse for automation: the cap is per IP, so anything calling from a shared egress IP β Cloudflare Workers, serverless functions, CI runners, corporate NAT β shares one pooled 50-request budget with every other tenant on that IP. Our edge-based status checker has been over the pooled quota continuously since ~02:30 UTC on Sep 7; a laptop on a fresh IP still gets through. A React dev server doing hot-reload refetches burns 50 requests in minutes. (Mockbird: 10,000 requests per project per day, and the cap is per project, not per IP.)GET /objects always returns the same 13 seed phones β we created an object, got a 200 with an id, fetched it back fine, and the list still showed exactly 13. The single most common tutorial loop β create a thing, then render the updated list β cannot be built on it. Your object exists only at its id URL; lose the 32-character hex id and it's effectively gone.PUT /objects/1 answers {"error":"1 is a reserved id and the data object of it cannot be overriddenβ¦"}; DELETE likewise. Update/delete flows can only be demoed on objects you created β which, see above, aren't in the list.?limit=2 and ?page=2&limit=5 both returned all 13 objects; ?name=β¦ is ignored. (Their docs describe limit and JWT auth for a signed-in tier.)/objects with {id, name, data} β /users answers 401. No second collection, no relations, no custom fields with types.Mockbird does the same job β free, no signup, writes persist β and the parts restful-api.dev walls off just work: your creates show up in your list, every record (seeds included) is editable, and filters/pagination/sort are real.
# 1. create a project (no account, no key)
curl -X POST https://mockbird.mockbird.workers.dev/api/projects \
-H 'content-type: application/json' -d '{"name":"my objects api"}'
# β {"id":"f3gc8ypggm","adminKey":"β¦"} β save both
# 2. an objects resource, seeded with 13 device-ish records
curl -X POST https://mockbird.mockbird.workers.dev/api/projects/PROJECT_ID/resources \
-H 'content-type: application/json' -H 'x-admin-key: ADMIN_KEY' \
-d '{"name":"objects","seed":13,"fields":[
{"name":"name","type":"title"},
{"name":"color","type":"color"},
{"name":"capacity","type":"oneOf","values":["64 GB","128 GB","256 GB","512 GB"]},
{"name":"price","type":"price"}]}'
Pagination that actually paginates, with a total-count header:
curl "https://mockbird.mockbird.workers.dev/m/PROJECT_ID/objects?limit=2"
# β 2 records (not all 13), header x-total-count: 13
And the loop restful-api.dev can't do β create an object, see it in the list:
curl -X POST https://mockbird.mockbird.workers.dev/m/PROJECT_ID/objects \
-H 'content-type: application/json' \
-d '{"name":"My Own Thing","color":"teal","capacity":"128 GB","price":49.5}'
# β 201 {"id":14,β¦} β a short id, not 32 hex chars
curl https://mockbird.mockbird.workers.dev/m/PROJECT_ID/objects
# β 14 records β yours is right there in the collection
curl "https://mockbird.mockbird.workers.dev/m/PROJECT_ID/objects?price_lte=50"
# β [{"id":14,"name":"My Own Thing",β¦}] β filters work too
Seed records aren't reserved β every record is yours to update or delete:
curl -X PATCH https://mockbird.mockbird.workers.dev/m/PROJECT_ID/objects/1 \
-H 'content-type: application/json' -d '{"name":"Renamed Seed"}'
# β 200 β no "reserved id" error
curl -X DELETE https://mockbird.mockbird.workers.dev/m/PROJECT_ID/objects/14
# β {"ok":true}
{id, name, data} envelope? It round-trips verbatimIf your code is already written against restful-api.dev's nested-data shape, you don't have to flatten anything β nested objects are stored and returned exactly as posted:
curl -X POST https://mockbird.mockbird.workers.dev/m/PROJECT_ID/objects \
-H 'content-type: application/json' \
-d '{"name":"Google Pixel 6 Pro","data":{"color":"Cloudy White","capacity":"128 GB"}}'
# β 201; GET it back and data.color / data.capacity are intact
Every command above was run against a live project before this page was published.
| restful-api.dev | Mockbird |
|---|---|
https://api.restful-api.dev/objects β one shared collection, frozen at 13 seeds | /m/PROJECT_ID/objects β your own project, one curl to create; your writes appear in the list |
POST /objects β 32-char hex id, retrievable by id only | POST β short numeric id, in the collection, filterable |
| Seed ids 1β13 reserved (PUT/PATCH/DELETE β error) | Every record editable and deletable; want a safety net? snapshots save/restore the whole dataset |
| 50 requests/24h per IP anonymous (pooled on shared egress IPs β Workers/serverless/CI) | 10,000 requests/day per project, IP-independent |
?limit=2 / ?page=2 silently ignored (keyless) | ?page=2&limit=5 real pagination + X-Total-Count header (aliases _page/_limit) |
Batch fetch ?id=3&id=5 | ?id=3&id=5 β identical syntax; repeated exact-match params OR together on any field, not just id |
| No field filters, no sort, no search | ?color=teal, ?price_lte=50 (_gte/_gt/_lt/_ne/_like), ?sortBy=price&order=desc, ?q= any-field search, ?select= projection |
One resource (/objects); /users β 401 | Any resources, any fields β or one-click e-commerce / blog / SaaS presets, plus nested routes and ?_expand joins |
| JWT auth on a signed-in tier | Mock JWT auth free on every project: real /auth/login + /auth/register, optional protected mode |
| β | Extras: OpenAPI/Postman/TypeScript+Zod exports, request inspector, mock_delay/mock_status/mock_chaos failure simulation, db.json eject (no lock-in) |
Bias disclosed β this page is written by the Mockbird maker. restful-api.dev's strengths are real: zero setup of any kind β there is no "create a project" step, one well-known URL works in any classroom instantly; the reserved seed data means every student sees the same 13 devices no matter what the previous class did; persisted writes with per-object cleanup make it honestly better than JSONPlaceholder-style write-theater for teaching POST/PATCH/DELETE verbs; and it has been stable for years. If your lesson is just HTTP verbs against one URL, it's a fine choice β though the September 2026 50-requests/24h anonymous cap now bites exactly that classroom scenario: thirty students behind one school NAT share a single pooled budget. The walls above only start to matter when the API is supposed to behave like your backend β lists that include your data, filters, more than one collection.
# one curl β a whole seeded backend (products/orders/customers/reviews):
curl -X POST "https://mockbird.mockbird.workers.dev/api/projects" \
-H 'content-type: application/json' -d '{"name":"my api","preset":"ecommerce"}'
Or try the shared demo with zero setup β real pagination and a real single-object GET, no key:
curl "https://mockbird.mockbird.workers.dev/m/demo/products?limit=2"
curl https://mockbird.mockbird.workers.dev/m/demo/products/1
Facts checked September 6, 2026, hands-on against api.restful-api.dev: POSTβGET-backβPATCHβDELETE on an own object all worked (credit where due); GET /objects returned the same 13 seeds immediately after a successful create (own object absent from the list); PUT /objects/1 and DELETE /objects/2 answered the reserved-id error verbatim; ?limit=2 and ?page=2&limit=5 each returned all 13; /users answered 401; batch ?id=3&id=5 worked. Test objects were deleted after verification. September 7, 2026 update: the 50-requests/24h anonymous cap was verified the day it appeared β a Cloudflare-Worker-originated GET /objects/1 answered HTTP 405 with the daily-limit error verbatim (shared egress IP over the pooled quota) while a direct request from a fresh IP answered 200. If restful-api.dev changes its behavior, re-check their site.
Full API reference in the docs. More guides: JSONPlaceholder alternative Β· CrudCrud alternative Β· DummyJSON alternative Β· GoRest alternative. Create your API β