π‘ We check dummy.restapiexample.com (and 70+ other public dev APIs) with a plain GET every 30 minutes β see the live status page.
dummy.restapiexample.com is the employee API baked into thousands of Java, Spring Boot, RestAssured, Postman, and Selenium tutorials β Tiger Nixon and his 23 colleagues are probably the most-asserted-on payroll in test automation. If a course told you to hit /api/v1/employees, it meant this service.
Here's what actually happened when we ran the canonical calls, live, on September 16, 2026:
GET /api/v1/employees three times in a row: 200, 429, 429. And the 429 body is an HTML error page ("Too Many Requests"), so every tutorial's response.json() / Jackson deserialization throws on top of the failure.x-ratelimit-limit: 60 and x-ratelimit-remaining: 57 β the headers say you have 57 calls left; the status code says you have zero. retry-after said 38 seconds. In practice you get roughly one request a minute.POST /api/v1/create answered 200 {"status":"success","data":{β¦,"id":4443},"message":"Successfully! Record has been added."}. Then GET /api/v1/employee/4443 (after waiting out the throttle) answered {"status":"success","data":null,"message":"Successfully! Record has been fetched."} β a null gift-wrapped in a success envelope. data.employee_name β crash.employee_name, employee_salary, employee_age, and a profile_image that's always ""). No filters, pagination, sorting, or search are offered.A test suite against this API can run one request per minute. Below: the same employee API on Mockbird β free, no signup β with their exact roster, their exact response envelope if you want it, writes that persist, and 10,000 requests/day.
Spend your one-request-a-minute allowance once, and keep the data:
# 1. grab the roster (their envelope: {"status","data":[β¦],"message"}) and
# shape it as a db.json β one key = one collection
curl -s https://dummy.restapiexample.com/api/v1/employees \
| jq '{employees: .data}' > db.json
# 2. import it β no account needed
curl -s -X POST "https://mockbird.mockbird.workers.dev/api/projects/import?name=employees" \
-H 'content-type: application/json' --data-binary @db.json
# β {"id":"PROJECT_ID","adminKey":"β¦"} β save both
Your copy is live immediately, ids preserved:
curl "https://mockbird.mockbird.workers.dev/m/PROJECT_ID/employees?limit=100"
# β all 24 records (default page size is 20 β pass ?limit= to raise it)
curl https://mockbird.mockbird.workers.dev/m/PROJECT_ID/employees/1
# β {"id":1,"employee_name":"Tiger Nixon","employee_salary":320800,"employee_age":61,β¦}
Run it 10,000 times a day if you like. No 429, no HTML error pages mid-test-suite. (Prefer their exact field shapes without copying their data? Create the resource yourself with fullName/number/age field types β see docs β resources.)
Tutorial code written for restapiexample reads res.data.data β the payload lives inside {"status":"success","data":β¦,"message":β¦}. Mockbird returns plain arrays by default, but the envelope reshaper can reproduce their shape exactly β per request or as a project-wide default:
# project-wide default: every GET now answers in restapiexample's envelope
curl -X PUT https://mockbird.mockbird.workers.dev/api/projects/PROJECT_ID/settings \
-H 'x-admin-key: ADMIN_KEY' -H 'content-type: application/json' \
-d '{"envelope":"{\"status\":\"success\",\"data\":\"$data\",\"message\":\"Successfully! All records has been fetched.\"}"}'
curl https://mockbird.mockbird.workers.dev/m/PROJECT_ID/employees/2
# β {"status":"success","data":{"id":2,"employee_name":"Garrett Winters",β¦},"message":"Successfully! β¦"}
Your res.data.data code path keeps working, byte-shape identical. Add ?mock_envelope=none to any request to see the bare records.
The part their API only pretends to do:
curl -X POST https://mockbird.mockbird.workers.dev/m/PROJECT_ID/employees \
-H 'content-type: application/json' \
-d '{"employee_name":"Ada Lovelace","employee_salary":424242,"employee_age":36,"profile_image":""}'
# β 201 {"id":25,β¦}
curl https://mockbird.mockbird.workers.dev/m/PROJECT_ID/employees/25
# β the record. Not null. No success-wrapped lie.
PUT/PATCH/DELETE work the same way and persist β so your createβassertβupdateβassertβdelete test sequence tests something real.
# who earns β₯ 300k?
curl "https://mockbird.mockbird.workers.dev/m/PROJECT_ID/employees?employee_salary_gte=300000&limit=100"
# top 3 salaries
curl "https://mockbird.mockbird.workers.dev/m/PROJECT_ID/employees?sortBy=employee_salary&order=desc&limit=3"
# β Paul Byrd (725000), Yuri Berry (675000), Charde Marshall (470600)
# any-field search
curl "https://mockbird.mockbird.workers.dev/m/PROJECT_ID/employees?q=nixon"
Plus ?page=/?limit= pagination with an X-Total-Count header, ?select= field projection, _like/_ne/range filters, GraphQL on the same data, and OpenAPI/Postman/TypeScript exports of your schema.
Their throttle is a bug in your test suite but a feature in your retry logic. Simulate it deliberately:
# always 429 (proper JSON body + retry-after header, not an HTML page)
curl "https://mockbird.mockbird.workers.dev/m/PROJECT_ID/employees?mock_status=429"
# or a realistic sequence: fail, fail, succeed β point your backoff code at it
curl "https://mockbird.mockbird.workers.dev/m/PROJECT_ID/employees?mock_seq=429,429,200"
| dummy.restapiexample.com | Mockbird |
|---|---|
GET /api/v1/employees | GET /m/PROJECT_ID/employees?limit=100 |
GET /api/v1/employee/1 | GET /m/PROJECT_ID/employees/1 |
POST /api/v1/create (returns an id whose GET is null) | POST /m/PROJECT_ID/employees β persists, GET it back for real |
PUT /api/v1/update/21 Β· DELETE /api/v1/delete/2 | PUT/PATCH/DELETE /m/PROJECT_ID/employees/21 β persists |
{"status":"success","data":β¦,"message":β¦} envelope, always | Plain JSON by default; same envelope on demand (?mock_envelope= or project default) |
| ~1 request/minute in practice (429 + HTML body past it, while headers claim 57 remaining) | 10,000 requests/day per project; JSON errors with correct headers |
| Fixed 24-employee roster, 4 fixed fields | Their roster imported verbatim β or any resources/fields you want |
| No filters / sort / search / pagination | All of them, json-server-style, plus GraphQL |
Bias disclosed β this page is written by the Mockbird maker. Fair is fair: dummy.restapiexample.com is the literal URL printed in your course PDF, and for following along with a video one read at a time, it works with absolutely zero setup β no project to create, nothing to import. It has been serving Tiger Nixon for the better part of a decade, and its parent site pairs the API with written tutorials. If your only need is one GET per minute to see what JSON looks like, it still does that. The walls above start mattering the moment you write a loop, a test suite, or a second curl within 60 seconds.
# the two-curl migration from the top of this page, or an instant seeded backend:
curl -X POST "https://mockbird.mockbird.workers.dev/api/projects" \
-H 'content-type: application/json' -d '{"name":"my api","preset":"ecommerce"}'
Or zero setup: curl https://mockbird.mockbird.workers.dev/m/demo/products/1
Facts checked live on September 16, 2026: three consecutive GET /api/v1/employees β 200, 429, 429 (HTML body); the 429 carried x-ratelimit-limit: 60, x-ratelimit-remaining: 57, retry-after: 38; POST /api/v1/create β 200 success with "id":4443; GET /api/v1/employee/4443 β "data":null inside a "status":"success" envelope. Every Mockbird command on this page was run against a live project before publishing. If their behavior changes, re-check β the status page probes it every 30 minutes.
Full API reference in the docs. More guides: Mock API for Java Β· Spring Boot Β· JSONPlaceholder alternative Β· GoRest alternative Β· CSV β REST API. Create your API β