Home › API Mocking › JSONPlaceholder

JSONPlaceholder Review 2026: The Fastest Way to Get a Fake REST API

A free hosted fake API that gets you from zero to fetching JSON in about ten seconds — and then politely runs out of road.

Frontend developers and workshop instructors who need realistic-looking REST endpoints instantly, with no signup, no key, and no local server to babysit.
7.6
Editor score · 10
Base URL
https://jsonplaceholder.typicode.com
Resources
posts, comments, albums, photos, todos, users (6 collections, ~500 records total)
Supported Methods
GET, POST, PUT, PATCH, DELETE (writes are simulated)
Authentication
None
Persistence
None — state resets to seed data on every request
License / Cost
Free, open dataset, MIT-licensed tooling lineage

Overview

Setup is a curl command, not an install. There is no signup, no API key, no dashboard, no SDK to pin. You point a client at https://jsonplaceholder.typicode.com and immediately get six resources: posts, comments, albums, photos, todos, and users. CORS is open, so a browser fetch from localhost:3000 works on the first try. The first response you will see is the famous lorem-ipsum post body, which is a feature — the payload shape is realistic enough that your rendering code exercises real nested objects instead of the word "test" repeated twelve times.

A concrete use case I keep coming back to: a dashboard UI whose backend is still three sprints out. Wire your data layer against /users, then /users/1/todos, then /posts?userId=3 — the query filter actually works server-side, so you can build and demo the filtering logic before a single real endpoint exists. The same URLs double as fixtures for Storybook and as smoke tests in CI. Because the ids are stable and the dataset never changes, a snapshot test written today still passes in six months.

The pros are boring in the best way. Deterministic ids from 1 to 100, predictable relations between resources, real 404s on ids outside the range, and correct status codes on writes. It also does the unglamorous things right: HTTPS, permissive CORS, sensible Content-Type handling, and no rate-limit friction during normal development. You can hand the base URL to a junior engineer and they will be productive in ninety seconds. For pure read-path prototyping, nothing else has a lower activation energy.

The cons bite the moment your feature needs state. POST returns 201 with a synthetic id and stores nothing; PUT, PATCH, and DELETE return 200 with an empty-ish body and change nothing. Build a create-then-read flow and you will chase a ghost for an hour. There is also no auth, no pagination envelope, no rate-limit headers, no versioning, no OpenAPI schema, and unknown query params are silently ignored rather than rejected. It is a shared public resource with no SLA, so putting it in a CI pipeline is a bet you will eventually lose.

My verdict: JSONPlaceholder is the fastest way to prove a read-only client works, and a poor fit for anything that implies persistence. Use it to demo, to teach HTTP verbs, and to unblock a frontend before the contract exists. The moment you need writes, auth, or error injection, swap to a local JSON Server seeded with your own fixtures, or MSW if you want mocks inside the test process. Treat it as scaffolding, not as an environment — and never let it survive into a staging config.

How we scored it

Time to First Request 10/10
Data Shape & Realism 8/10
Write & State Behavior 3/10
Failure & Edge Simulation 2/10
Public Instance Reliability 8/10

Pricing

Public Hosted Instance
$0
The canonical jsonplaceholder.typicode.com endpoint. No account, no API key, no quota dashboard. Shared by the entire internet, so treat it as best-effort and never point a demo you care about at it during a conference talk.
Self-Hosted via json-server
$0 + your compute
Clone the dataset, run it under json-server or a tiny Express shim, and you get real POST/PUT/DELETE persistence, custom routes, middleware-injected latency, and deterministic data you can reset between test runs. This is what the public instance should have been.
Managed Mock Hosting
~$10–20/mo
Any of the hosted mock providers if you need the same dataset with auth, per-environment URLs, and an SLA. You are paying for guarantees and CI integration, not for the JSON itself.

In practice

bash
# Create a record, then immediately try to read it back
curl -s -X POST https://jsonplaceholder.typicode.com/users \
  -H 'Content-Type: application/json' \
  -d '{"name":"Dana Ruiz","email":"[email protected]"}' | jq '{id, name}'

# id comes back as 11 -- a number that was never written anywhere
curl -s -o /dev/null -w '%{http_code}\n' \
  https://jsonplaceholder.typicode.com/users/11

This two-line probe exposes the API's central limitation: writes are echoed, not persisted, so any create-then-read flow must be designed around a mocked store instead.

Quick verdict

Use JSONPlaceholder for read-only prototyping, HTTP verb demos, and frontend scaffolding while a real contract is being negotiated. Skip it for anything stateful, authenticated, or pipeline-critical.

The tradeoff is simple: you get instant access and a realistic payload shape, and in exchange you give up persistence, control over error responses, and any guarantee the service is up when your build runs.

Best-fit alternatives by need: local JSON Server for stateful writes, MSW for in-process mocks, WireMock or Mockoon for contract-level stubbing with fault injection.

Pricing breakdown

Free, unconditionally. No tiers, no seat count, no usage meter, no paid plan hiding behind a features table. It is a public good maintained as a demo of JSON Server, and it has stayed free for years.

There is no SLA, no support channel, and no uptime commitment. That is the actual price: you are paying in reliability risk rather than dollars, and the invoice arrives on the day a flaky network turns your CI red.

Hidden cost to budget for: the migration. Teams that wire fixtures directly against the public host often discover halfway through that they need writes and must swap the base URL, the fixture loader, and any snapshot expectations at once. Vendor a local copy early and the migration is a one-line config change.

Verdict

JSONPlaceholder is the Switzerland of test APIs: neutral, always available, and boring in the best way. It nails the first hour of prototyping — posts, users, comments, todos, all with relational IDs that actually make sense. But it is a read-mostly sandbox with no auth, no persistence, and no failure simulation, so any team testing real write flows or error handling will outgrow it by lunchtime.

DevKit Central is editor-independent. Some links are affiliate links; we may earn a recurring commission if you subscribe. This never affects our verdicts.

How the field scores

WireMock
8.6
Mockoon
8.6
Postman
8.0
Prism
8.4
Apidog
8.4
MockServer
8.4
Bruno
8.2
Hoppscotch
8.2
Insomnia
8.2
Swagger UI
7.6
JSONPlaceholder
7.6
HTTPie
8.4
SoapUI
7.3
Can I use JSONPlaceholder for POST and PUT tests?
You can send them and you will get back a 201 with an id, but nothing is stored. The next GET returns the original seed data. If your test asserts that a created record shows up in a subsequent list request, it will fail — and it will fail confusingly, because the POST looked successful. For any stateful flow, run the dataset locally under json-server.
Is there a rate limit?
Nothing documented or enforced with hard quotas, but you are sharing one origin with every tutorial, bootcamp, and CI pipeline on earth. Treat it as polite-use-only. If you are going to hammer it in a load test or a nightly build, self-host — both out of courtesy and because your results will be garbage otherwise.
Does it support authentication testing?
No. There is no auth layer, no token issuance, no 401 path. You can stub a fake Authorization header in your client and the server will ignore it entirely. That is fine for demoing a request interceptor, useless for verifying that your refresh-token logic actually works.
What is the fastest way to get persistence and custom endpoints?
Pull the JSONPlaceholder dataset, drop it into a json-server config, and add middleware for artificial latency and error injection. You keep the familiar resource shapes while gaining real writes, custom routes, and the ability to run the whole thing in a container as a CI service.