For years, reqres.in was the answer to "I need a fake API to test my login form / HTTP client / users list right now." Then it started changing. In July 2026 every request suddenly required an x-api-key header โ the famous tutorial curl returned 401 missing_api_key, and so did every code sample in a decade of blog posts, courses, and Stack Overflow answers (we verified it live at the time). By late August 2026 the wall was gone again โ keyless requests work โ but the responses came back different:
curl -X POST https://reqres.in/api/login \
-H 'content-type: application/json' \
-d '{"email":"eve.holt@reqres.in","password":"cityslicka"}'
# โ 200 {"token":"QpwL5tke4Pnpja7X4",
# "_meta":{"powered_by":"ReqRes","upgrade_url":"...","cta":{...},
# "message":"This is a read-only demo endpoint. Sign up to ..."}}
Every JSON response now carries an injected _meta marketing object โ upgrade URLs, a CTA, an A/B-test variant tag (verified live Aug 30, 2026). Lenient parsers shrug it off; exact-shape snapshot tests, strict decoders (Zod .strict(), serde deny_unknown_fields), and response-schema assertions all break. Writes are still theater โ POST /api/users answers 201 with an id, but GETting that id is a 404. And requests from cloud/CI IPs get aggressively rate-limited: our uptime tracker, probing just once every 30 minutes from a datacenter IP, was 429'd on roughly two-thirds of its checks over the last day (residential browsers seem fine โ your CI may not be).
An API you test against shouldn't be a moving target. Here's how to get the same thing on Mockbird โ no API key, no signup, CORS on, no ads in your JSON โ plus a few things reqres never did, like tokens that are real signed JWTs and writes that actually persist.
Two requests: create a project, add a seeded users resource.
curl -X POST https://mockbird.mockbird.workers.dev/api/projects \
-H 'content-type: application/json' -d '{"name":"my-fake-api"}'
# โ {"id":"abc123","adminKey":"KEY","baseUrl":"https://mockbird.mockbird.workers.dev/m/abc123", ...}
curl -X POST https://mockbird.mockbird.workers.dev/api/projects/abc123/resources \
-H 'X-Admin-Key: KEY' -H 'content-type: application/json' \
-d '{"name":"users","fields":[
{"name":"firstName","type":"firstName"},
{"name":"lastName","type":"lastName"},
{"name":"email","type":"email"},
{"name":"avatar","type":"avatar"}
],"seed":12}'
You now have 12 realistic users (names, emails, avatar URLs served by your own project โ initials SVGs, no third-party image service) at your own base URL. No header needed on any request that follows.
| You used to call | Now call |
|---|---|
GET /api/users?page=2 | GET /users?_page=2&_limit=6 (total in X-Total-Count header) |
GET /api/users/2 | GET /users/2 |
GET /api/users/23 โ 404 | GET /users/23 โ 404, same |
POST /api/login | POST /auth/login โ any email + password works |
POST /api/register | POST /auth/register โ creates a real user record |
GET /api/users?delay=3 | GET /users?mock_delay=3000 |
| magic emails for 400 errors | ?mock_status=400 (or 401, 500, โฆ) on any endpoint |
curl "https://mockbird.mockbird.workers.dev/m/abc123/users?_page=2&_limit=6"
curl -X POST "https://mockbird.mockbird.workers.dev/m/abc123/auth/login" \
-H 'content-type: application/json' \
-d '{"email":"eve.holt@reqres.in","password":"cityslicka"}'
# โ {"token":"eyJhbGciOiJIUzI1NiIs...","tokenType":"Bearer","expiresIn":3600,"user":{...}}
The token is a real signed JWT, not reqres's fixed QpwL5tke4Pnpja7X4 string. It has iat/exp claims, and you control the lifetime โ pass "expiresIn": 5 at login and you can watch your app handle token expiry five seconds later, without waiting an hour or faking clocks. There's a whole guide on the mock-auth endpoints.
Login as a seeded user returns that user. If the email you log in with matches a record in your users resource, the response's user object (and GET /auth/me with the token) is that live record โ password-ish fields stripped. Registration inserts a real record:
curl -X POST "https://mockbird.mockbird.workers.dev/m/abc123/auth/register" \
-H 'content-type: application/json' \
-d '{"email":"new.user@example.com","password":"pistol"}'
# โ token + {"user":{"email":"new.user@example.com","id":13}}
curl "https://mockbird.mockbird.workers.dev/m/abc123/users/13" # โ 200, it's really in the list
Reqres's register was response-only theater โ the user never existed afterwards. Here your list view, your "welcome" flow, and your test assertions all see the same data.
Optional protected mode: flip one setting and every endpoint returns a proper 401 without a Bearer token โ so you can test your interceptors and redirect-to-login logic against a server that actually enforces auth. And unlike reqres's fixed user roster, the schema is yours: add role, plan, whatever fields your UI needs, or go beyond users entirely โ any resource, GraphQL, generated TypeScript types, Postman collections, snapshots for deterministic tests.
| reqres.in | Mockbird | |
|---|---|---|
| Works without an API key | currently yes โ but it required one for part of 2026, and cloud/CI IPs get 429-rate-limited | yes |
| Clean JSON responses | no โ injected _meta upsell object on every response | yes โ your schema, nothing else |
| Users + pagination | fixed 12-user roster | your own seeded roster, any size/schema |
| Login / register | fixed token string, magic emails only | any credentials, real signed JWT, configurable expiry |
| Registered users persist | no | yes โ visible via REST/GraphQL |
| Delay / error simulation | ?delay= only | ?mock_delay= + ?mock_status= on any endpoint |
| Auth enforcement to test against | no | optional protected mode (401 without Bearer) |
| Limits | free key tier | 10,000 requests/day per project, free |
Where reqres still wins: it's a well-known URL with a hosted UI, and the fixed dataset means everyone sees identical data โ that predictability is genuinely useful in classrooms (when the response shape isn't mid-migration). This page is written by the Mockbird maker โ bias disclosed. Reqres behavior verified live: 401 missing_api_key on all unauthenticated requests in July 2026; keyless access restored but with injected _meta objects, faked writes (POST 201 โ GET 404), and datacenter-IP 429s as of Aug 30, 2026 โ see live status. Anonymous Mockbird projects have a per-IP daily creation cap; sign up (free) to keep projects permanently.
Full API reference in the docs. More guides: mock JWT auth in depth ยท fake user API (randomuser.me alternative) ยท JSONPlaceholder alternative ยท 5 free mock-API tools compared. Create your API โ
/auth/login in the dashboard โ real URL, data browser already open, no signup. Or import your own OpenAPI spec, db.json, CSV, Postman collection, or HAR and mock your exact shapes.