For years, "build a trivia game" tutorials and bootcamp projects pointed at jservice.io โ a free API serving a huge archive of quiz-show clues. If your quiz app just hung and died, here's why: jservice.io no longer responds at all. The domain still resolves, but every connection times out, on both HTTP and HTTPS (we re-checked while writing this; our status page for it re-checks every 30 minutes and has watched it fail every single check since the end of August):
$ curl https://jservice.io/api/random
curl: (28) Failed to connect to jservice.io port 443 after 10001 ms: Timeout was reached
// browser
Uncaught TypeError: Failed to fetch // the request just never completes
And the community successor many older threads point to, cluebase.lukelav.in, is gone as well โ its DNS no longer resolves.
Why nobody simply rehosts it: jService served real Jeopardy! clues collected from fan archives. That clue text is the show's copyrighted material, which is very likely part of why the mirrors-and-successors story here is so thin compared to other dead beginner APIs. This guide doesn't rehost any of it โ the starter dataset below is 60 general-knowledge clues we wrote ourselves, in the same field shape, so tutorial code runs unchanged while the data is original.
You have three honest options, fastest first.
| API | Status | Notes |
|---|---|---|
Open Trivia DB (opentdb.com/api.php) | โ alive, keyless | Multiple-choice format: {question, correct_answer, incorrect_answers[]} inside a {response_code, results} envelope โ nothing like jservice's shape, so your parsing code changes completely. Rate-limited (one request per 5 seconds per IP โ see our OpenTDB guide for the details and a workaround); HTML entities in questions need decoding. |
| The Trivia API | โ alive, keyless tier | Clean bare-array JSON, camelCase fields (correctAnswer, incorrectAnswers), good tags/difficulty filters. Again a different schema, and the free tier is for non-commercial use. |
| Self-host jService | source exists | The original service's code is open (sottenad/jService on GitHub, Rails) โ but it ships without the clue database, and refilling it means scraping fan archives of copyrighted clues yourself. For a weekend quiz app, that's a lot of yaks. |
We host a starter dataset โ 60 original general-knowledge clues across 10 categories, written by us, in the jservice field shape: clues have answer, question, value (100โ600), airdate, category_id, invalid_count; categories have title and clues_count. Pipe it into the importer:
curl -s https://mockbird.mockbird.workers.dev/data/trivia.db.json \
| curl -s -X POST 'https://mockbird.mockbird.workers.dev/api/projects/import?name=trivia' \
--data-binary @-
The response contains your project id and an adminKey (save it โ it manages the project, and lets you claim it into an account later). Your API is live immediately, no signup, no key, CORS on:
https://mockbird.mockbird.workers.dev/m/YOUR_ID/clues
sortBy=random shuffles before pagination, so limit=1 is one random clue per request โ and ?_expand=category attaches the full category object under a category key, exactly where jservice put it:
| jService | Your Mockbird API |
|---|---|
/api/random | /clues?sortBy=random&limit=1&_expand=category |
/api/random?count=5 | โฆ&limit=5 |
/api/clues?value=400 | /clues?value=400 |
/api/clues?category=3 | /clues?category_id=3 โ or the nested route /categories/3/clues |
/api/clues?min_date=โฆ&max_date=โฆ | /clues?airdate_gte=2026-03-01&airdate_lte=2026-06-01 |
/api/clues?offset=100 | /clues?page=2&limit=100 (page-based; x-total-count header has the total) |
/api/categories?count=10 | /categories |
/api/category?id=3 (category + its clues) | /categories/3?_embed=clues |
POST /api/invalid (flag a bad clue) | PATCH /clues/17 with {"invalid_count":1} โ it's your data, edit it directly |
The classic quiz-game loop becomes:
const res = await fetch(BASE + "/clues?sortBy=random&limit=1&_expand=category");
const [clue] = await res.json();
ask.textContent = clue.question; // "This red planet is the fourth from the Sun"
cat.textContent = clue.category.title; // "space"
points.textContent = "$" + clue.value; // "$200"
// later: check the player's guess against clue.answer ("Mars")
jService was read-only. This is full CRUD โ so the obvious upgrade to the tutorial project is letting players write their own questions:
curl -X POST "https://mockbird.mockbird.workers.dev/m/YOUR_ID/clues" \
-H 'content-type: application/json' \
-d '{"answer":"A 429","question":"This HTTP status tells a client it is sending requests too fast",
"value":700,"airdate":"2026-09-14T12:00:00.000Z","category_id":9,"invalid_count":0}'
The record persists โ GET /clues?value=700 finds it, the random endpoint can serve it, and DELETE removes it when it turns out to be too easy. 60 clues is a seed, not a ceiling: paste a bigger dataset into the dashboard import panel (up to 1,000 records per collection โ write your own questions, or convert a quiz CSV), and the same data also gets GraphQL, delay/error simulation for teaching loading states, and a db.json export so you can leave with your data anytime.
| jservice.io | Open Trivia DB | The Trivia API | Your Mockbird project | |
|---|---|---|---|---|
| Works today | โ times out | โ | โ | โ (~60s setup) |
| Drop-in for old jservice tutorials | โ | โ different schema + envelope | โ different schema | โ new base URL, same field names |
| Dataset | ~200k real show clues | ~4k+ community questions | large curated set | 60 original clues; yours to grow |
| Question style | answer-in-question-form clues | multiple choice | multiple choice | clue-style; add any fields you like |
| Writes | โ | โ | โ | โ full CRUD |
| Key required | no | no (rate-limited) | no (free tier, non-commercial) | no, bounded free limits (10k req/day) |
If you want a big bank of ready-made multiple-choice questions, Open Trivia DB and The Trivia API are genuinely good and deserve the traffic โ use them. Host your own when you want the jservice shape, your own questions, writes, or an API that can't disappear from under your demo.
The one-liner in section 2 is the whole setup โ or open the dashboard and paste the dataset into the import panel. jService has a lot of company in the beginner-API graveyard โ the Bored API's DNS is gone, numbersapi 404s, ICNDb serves gambling spam (the full tour, and the live status board tracking 71 of these). Same fix works for all of them: we keep ready-made quotes, countries, NBA, and number-facts datasets too.