JSONPlaceholder is brilliant for getting started: instant fake endpoints, predictable JSON, zero setup. At some point, though, your app stops being a demo, and a fake API starts getting in the way. This guide covers when that happens, the best JSONPlaceholder alternatives for each situation, and how to switch without rewriting your frontend.
What JSONPlaceholder does well
- Instant, free, no-signup endpoints for posts, comments, users, todos, albums and photos
- Related resources, such as
/posts/1/comments - Fast, predictable responses that never change
- Nothing to install
For tutorials, quick demos and unblocking UI work, it is hard to beat.
Where it stops working
Writes are faked. A POST to /posts returns 201 with id: 101, but nothing is saved. Request /posts/101 straight after and you get a 404. PUT and DELETE work the same way. So any flow that creates something and reads it back cannot work.
That leads to the other gaps:
- No persistence. Refresh the page and your "new" data is gone.
- No real users. Everyone sees the same records, and there is no login.
- No auth flows. You cannot test a login screen, a session or a 401.
- No request logs. When something breaks, you cannot see what your app sent.
- No failures. Every request succeeds, so error handling never gets tested.
If any of those sound familiar, you have outgrown a pure fake API.
The best JSONPlaceholder alternatives
| Tool | Hosted? | Data persists? | Auth | Best when you need |
|---|---|---|---|---|
| ReqRes | Yes | Yes, in projects | Real app users | Persistence, logins and logs, no setup |
| DummyJSON | Yes | No (simulated) | JWT demo login | Richer fake data and a token flow |
| json-server | No, runs locally | Yes, to a local file | None | An offline fake API from your own JSON |
| Mockoon | Locally (cloud paid) | In memory, resets | Simulated | Detailed local mocks kept in Git |
| Beeceptor | Yes | Capped per endpoint | Header matching | Rule-based mocks, wider protocol support |
ReqRes
A hosted REST API with two layers. The free demo endpoints (https://reqres.in/api/users, /api/login) work with no signup, like JSONPlaceholder, but include realistic errors and a ?delay= parameter. When you need more, a free project gives you:
- Collections that store data, so a POST today is still there tomorrow
- App users with magic-code login, sessions and per-user records
- Request logs for every call
- Failure scenarios to test error handling (429, 422 and malformed JSON are free)
Your code stays fetch(). See ReqRes vs json-server and ReqRes vs Mockoon for detailed comparisons.
DummyJSON
Like JSONPlaceholder with more realistic data (products, carts, recipes, users), search and pagination, and a JWT login you can use to practise protected routes. Writes are simulated, so it has the same persistence limit.
json-server
Point it at a db.json file and get full CRUD on localhost:3000, with changes written back to the file. Great offline, but it runs on your machine, so others cannot reach it unless you host it. Version 1 is still in beta. Full comparison.
Mockoon
A free, open-source mock server with a desktop app and CLI, strong rules and templating, and OpenAPI import. CRUD data lives in memory and resets on restart; hosted mocks start at $100/month billed annually. Full comparison.
Beeceptor
A hosted, rule-based mock server with REST, GraphQL, SOAP and gRPC support. Its free tier is 50 requests a day, and CRUD storage is capped per endpoint (oldest records are removed first). Full comparison.
Which one should you pick?
- You just need fake data for a tutorial: stay on JSONPlaceholder, or use the ReqRes demo API if you also want error responses and delays.
- Your app creates data and reads it back: ReqRes (hosted) or json-server (local).
- You need login and per-user data: ReqRes app users.
- You need to see what your app sent: ReqRes request logs.
- You need to test error handling: ReqRes failure scenarios, or build them yourself in Mockoon or Beeceptor.
- You must work offline: json-server or Mockoon.
Switching from JSONPlaceholder to ReqRes
Your components barely change. The URL gains a collection path, you add a key header, and request bodies go inside data.
Before (JSONPlaceholder):
await fetch('https://jsonplaceholder.typicode.com/todos', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title: 'Ship onboarding', completed: false }),
});
After (ReqRes project):
await fetch('https://reqres.in/api/collections/todos/records', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': 'YOUR_MANAGE_KEY', // pro_* key for writes, keep it server-side
},
body: JSON.stringify({ data: { title: 'Ship onboarding', completed: false } }),
});
// This time the todo is really there
const { data } = await fetch('https://reqres.in/api/collections/todos/records', {
headers: { 'x-api-key': 'YOUR_PUBLIC_KEY' }, // pub_* key, safe in the browser
}).then((r) => r.json());
To move over:
- Create a free project at app.reqres.in.
- Add a collection for each resource you use (
todos,postsand so on). - Swap the base URL and add the key header.
- Wrap request bodies in
{ "data": ... }.
Common questions
Is there a JSONPlaceholder alternative that saves data?
Yes. ReqRes projects store records until you delete them, hosted and free to start. json-server saves to a local file on your machine. JSONPlaceholder and DummyJSON return realistic responses but do not store writes.
Is there a JSONPlaceholder alternative with authentication?
ReqRes has real app users with magic-code login and per-user data. DummyJSON has a demo JWT login. JSONPlaceholder and json-server have none built in.
Does JSONPlaceholder save POST requests?
No. It returns a successful response with a new id, but the resource is not created, so a follow-up GET for that id returns 404.
Is JSONPlaceholder still free?
Yes, and it remains a great choice for learning and demos. The alternatives above are for when your app needs more than fixed fake data.
Try it
- Call the ReqRes demo API - no signup
- Create a free project - persistent collections, auth and logs
- 10 free public APIs to practise API testing