← All guides

πŸ“‘ 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 alternative β€” a mock objects API where your objects actually appear in the list

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:

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.

The same objects API in 60 seconds β€” but the list is yours

# 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}

Want the exact {id, name, data} envelope? It round-trips verbatim

If 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 translation

restful-api.devMockbird
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 onlyPOST β†’ 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 β†’ 401Any resources, any fields β€” or one-click e-commerce / blog / SaaS presets, plus nested routes and ?_expand joins
JWT auth on a signed-in tierMock 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)

Where restful-api.dev genuinely wins

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.

Start now

# 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 β†’

⚑ Skip the terminal: this link creates a live, seeded e-commerce backend in the dashboard β€” products, orders, customers, real URL, no signup, and the list is yours.