๐ก We check opentdb.com (and 70+ other public dev APIs) with a plain GET every 30 minutes โ see the live status page. As of publishing it's up and answering fast.
Open Trivia DB is the trivia API behind most quiz-app tutorials โ thousands of user-contributed questions, no key required, CORS open, free. It's a genuinely nice community project, and with jService dead it's the last big free trivia API standing. If you're building a quiz UI, its data is the draw.
But building against it hurts in four specific ways (all checked live on September 16, 2026):
HTTP 429. In dev that means every hot-reload, every double-render (hello React StrictMode), every quick refresh is an error. Behind a campus or office NAT, everyone shares the same 5-second bucket.{"response_code":5,"result":[]} โ result, singular. Tutorial code does data.results.map(โฆ) โ TypeError: Cannot read properties of undefined (reading 'map'). The error page crashes the error handling.", “, '. Render them as text and your quiz shows Rem's. You either decode manually or discover encode=url3986 โ and decode that instead.amount=0 answers 200 {"response_code":2,"results":[]} โ the status code says fine, the body says error, and only the docs explain codes 1โ5. (It's also read-only: contributing questions happens on the website, not the API.)For the app you're building, the fix is a dataset in the same field shape on an API you control โ no rate limit, plain text, real writes. One curl, no signup:
curl -s https://mockbird.mockbird.workers.dev/data/quizquestions.db.json \
| curl -s -X POST 'https://mockbird.mockbird.workers.dev/api/projects/import?name=trivia' \
-H 'content-type: application/json' --data-binary @-
# โ {"id":"YOUR_ID","adminKey":"โฆ"} โ save both
The dataset is 40 original questions we wrote for this guide (free to use however you like) in OpenTDB's exact field shape โ type, difficulty, category, question, correct_answer, incorrect_answers[] โ across 7 familiar categories, easy/medium/hard, multiple-choice and true/false. The incorrect_answers arrays come back verbatim, and everything is plain text: no entities, nothing to decode.
| Open Trivia DB | Your Mockbird project |
|---|---|
api.php?amount=10 | /questions?limit=10 |
| random draw | /questions?sortBy=random&limit=10 |
&difficulty=easy | ?difficulty=easy โ same values |
&category=18 (numeric id) | ?category=Science%3A%20Computers โ by name, no id lookup table |
&type=boolean | ?type=boolean โ same values |
&encode=url3986 + decode step | โ not needed; responses are plain text |
| session tokens (no repeats) | page instead: ?page=2&limit=10 + X-Total-Count |
| 1 request / 5 s / IP | no per-second limit (10k requests/day per project) |
curl "https://mockbird.mockbird.workers.dev/m/YOUR_ID/questions?sortBy=random&limit=1&select=question,correct_answer"
curl "https://mockbird.mockbird.workers.dev/m/YOUR_ID/questions?difficulty=easy&category=Geography"
Tutorial code reads data.results after checking data.response_code. One query param reproduces that envelope exactly, so your fetch code doesn't change:
curl "https://mockbird.mockbird.workers.dev/m/YOUR_ID/questions?mock_envelope=%7B%22response_code%22%3A0%2C%22results%22%3A%22%24data%22%7D&difficulty=easy&limit=10"
# โ {"response_code":0,"results":[โฆ]} โ OpenTDB's shape, your data
# no match? {"response_code":0,"results":[]} โ always an array, never the
# singular-"result" surprise from their 429 body.
Set it once as the project default (PUT /api/projects/:id/settings {"envelope":โฆ}) and every GET answers in that shape. Details in docs โ envelope.
curl -X POST https://mockbird.mockbird.workers.dev/m/YOUR_ID/questions \
-H 'content-type: application/json' \
-d '{"type":"multiple","difficulty":"easy","category":"House Rules",
"question":"Which room is the couch in?","correct_answer":"Living room",
"incorrect_answers":["Kitchen","Garage","Attic"]}'
# โ 201 {"id":41,โฆ} โ and GET /questions/41 returns it. It persists.
That turns a fetch-and-render demo into a real product: a pub-quiz builder, a classroom review tool, a party game with an "add your own question" form. OpenTDB's contribution flow lives on their website; yours is a POST.
If you ship against the real OpenTDB, your app will meet the 429. Rehearse it deterministically instead of by refreshing fast:
# two rate-limited responses, then success โ exercise your retry/backoff
curl "https://mockbird.mockbird.workers.dev/m/YOUR_ID/questions?mock_seq=429,429,200"
# slow response for your loading spinner
curl "https://mockbird.mockbird.workers.dev/m/YOUR_ID/questions?mock_delay=2000"
More recipes in testing loading & error states and simulating rate limits.
Credit where due: OpenTDB's catalogue is the product โ thousands of community-contributed questions across 24 categories, moderated for years, still free and keyless, and it answered our checks fast. Our dataset is 40 questions; theirs is thousands. The rate limit exists so the free service survives, which is fair โ it's just brutal to develop against. The honest split: production quiz content at human pace โ OpenTDB (their questions are also exportable under CC BY-SA if you want to self-host). Development, tests, CI, demos, and apps that need writes, plain text, or more than one request per 5 seconds โ your own project. Many apps sensibly do both: develop against Mockbird, ship against OpenTDB with a well-tested retry.
The one-curl import in section 1, or zero setup at all:
curl https://mockbird.mockbird.workers.dev/m/demo/products?limit=3
Facts checked live on September 16, 2026: two api.php?amount=3 requests back-to-back โ the second answered HTTP 429 with body {"response_code":5,"result":[]} (key is result, singular); 6 of 10 questions in a default-encoding batch contained HTML entities (", “, '); api.php?amount=0 answered HTTP 200 with {"response_code":2,"results":[]}; api_token.php?command=request issued a session token normally. Every Mockbird command on this page was run against a live project before publishing.
Full API reference in the docs. More guides: jService alternative ยท Numbers API alternative ยท TheMealDB alternative ยท Host a JSON file as an API ยท Simulate rate limits. Create your API โ