Release Notes for v2.0.0-beta-54
What’s shipped since the beta-1 soft launch
v2.0.0-beta-54 · everything worth calling out between beta-2 and beta-54
We opened the IQ Bible API v2 beta quietly on August 18 — a soft launch for the developers already in our corner, ahead of the public beta. Since then we’ve shipped on a near-daily cadence: new endpoints and parameters, a rebuilt names dataset, full coverage across every canon, a proper docs site, and a long tail of correctness fixes. None of it is a version-number story. It’s the API getting deeper in the two directions that matter — study depth and AI-readiness — plus the developer surface around it getting genuinely usable. Here’s what you’d actually notice.
The short version
- Every canon is covered — people, chronology, citation parsing, and verse resolution now handle the books whose canonical status varies by tradition, steered by
?canon=. - Bible Characters was rebuilt on TIPNR (STEPBible/Tyndale House, CC BY 4.0), with real homonym disambiguation — eleven distinct people named “Michael” no longer collapse into one.
- New reference endpoints for chapter-level summaries, per-book commentary coverage, geographic place descriptions, chapter chronology, daily devotionals, and morphology decoding.
- Verse-card images render every script — Arabic, Hebrew, and CJK come out shaped and correctly laid out instead of as boxes.
- Search and error handling got tighter — phrase and prefix search behave, and a missing chapter is a real 404 instead of an empty 200.
- The docs and portal got a real overhaul — a landing page, a searchable
/docswith a glossary, hover-definitions, dark mode, and a mobile contents drawer.
Coverage for every canon
A cluster of books — Tobit, Judith, Wisdom, Sirach, Baruch, 1–2 Maccabees, the additions to Daniel and Esther, and more — sits differently in each tradition: Scripture in the Catholic, Eastern Orthodox, and Anglican canons (which call them deuterocanonical), set apart or outside the canon in the Protestant and Jewish traditions (which call them the Apocrypha). Until recently the API really only handled the books every canon shares. Those chapters returned empty People results, the timeline had no reference for the Maccabean period, and the citation parser didn’t recognize “1 Maccabees 1:10” or “Sirach 2:4” as references at all.
That’s closed. GET /bible-people and GET /bible-characters/{name} now cover Tobit, Judith, Sirach, Baruch, Susanna, 1–2 Maccabees, 1–2 Esdras, and the rest — 175 curated individuals plus 54 links attaching appearances in those books to people already in the dataset (Nebuchadnezzar, Cyrus, Daniel, Ezra). GET /parse/citations detects the spelled-out book names, and a new ?canon= parameter (catholic, eastern orthodox, anglican, protestant, …) on the parse endpoints controls how references to them resolve — including automatic version fallback, so a 1 Maccabees citation hydrates its text from a translation whose canon includes the book instead of coming back empty under one that doesn’t.
GET /chronology is canon-aware too: the Maccabean sequence and other intertestamental events carry their 1–2 Maccabees citation when you ask for a canon that includes them, and a caller on a canon that doesn’t still correctly gets no reference. And ?contains= on GET /bibles answers the practical question directly — which translations actually carry Wisdom, or a chapter of Daniel only some canons include, or a specific verse — so your app can offer a one-tap switch when a reader follows a reference their translation can’t show.
Bible Characters, rebuilt on a real names dataset
The People data now comes from TIPNR — Translators Individualised Proper Names with all References, from STEPBible and Tyndale House Cambridge, CC BY 4.0 (the same source behind our Greek lexicons). That brought real identity resolution to a place that badly needed it: a name is not unique, and the endpoint used to return whichever match had the lowest id. Follow a relationship link from Noah to his wife “Naamah” and you’d land on a different Naamah entirely.
Now every people-list row and relationship edge carries a disambiguated uStrong code, and GET /bible-characters/by-ustrong/{ustrong} resolves the exact person. For the name route, a new ?ref=BOOK.CHAPTER[.VERSE] picks the individual who actually appears at that reference — ?ref=REV.12.7 gets you the archangel Michael, not the spy from Numbers 13. Every response also carries resolved_by and, when the name is shared, a namesakes[] array listing every other person of that name with their own uStrong and appearance range, so a client holding only a bare name can show a “did you mean…?” without one call per candidate. first_appearance and last_appearance are now the real canonical-order first and last verse that mention the resolved person, taken from their own citations.
More endpoints for study depth
GET /books/{book}/chapters/{chapter}/info— a version-independent chapter reference summary (the book-level counterpart already existed). There’s no bundled per-chapter dataset, so this surfaces the “argument of the chapter” a public-domain commentary carries, picking the source server-side (Matthew Henry, then Gill, then first available) so you don’t have to.GET /books/{book}/commentaries— which of the 326 commentary sources actually have something for a given book, now down to the chapter numbers each one covers and whether it has a book introduction. Optional?chapter=/?verse=filters narrow the list to sources with an entry right there, so a commentary picker only shows what’s relevant.GET /geo/places/{id}now carries adescription— the best-matching entry from five bundled public-domain Bible dictionaries (Easton’s, Hastings’, Smith’s, Schaff’s, Hitchcock’s), paired to each place offline by scoring the dictionary entry’s own scripture citations against the place’s verses. That’s what tells Ai-in-Joshua from Ai-in-Jeremiah.GET /chronology/for/{book}/{chapter}— where a single chapter sits on the timeline, with a guaranteed non-empty answer: a dated event if one covers the chapter, else a Bible-story anchor, else the book’s era, with anapproximateflag so a client never shows false precision.GET /devotionals/todayandGET /devotionals/{month}/{day}— Charles Spurgeon’s Morning and Evening (1866, public domain), a morning and an evening reading for every day of the year.GET /morphology/{code}— decode a raw morphology tag exactly as it comes back from the original-language endpoints (V-AAI-3S,TH8804) into a plain-language part of speech and parse.
Responses also do more of the work for you now: commentary, dictionary, character-definition, and devotional responses carry a citations array — every scripture reference detected in the prose, already resolved to book/chapter/verse with a ready URL. And GET /parse/citations no longer rejects long input: it scans a window at a time and hands back a next_offset to continue from, so you can run it over a whole document.
Verse-card images now render every script
GET /image/verse was rendering non-Latin verse text — Arabic, Chinese, Korean, Syriac, everything — as tofu boxes, because the raster renderer had no fonts for those scripts and no text shaping. The card’s text layout now runs through the go-text/typesetting stack (pure Go, no cgo): real shaping, bidirectional reordering, and line-breaking. Arabic and Persian join and align right-to-left, Hebrew vowel marks attach correctly, and CJK wraps properly. The format=svg path emits direction="rtl" and lets the browser shape. Latin, Hebrew, CJK, and Thai cards that already looked right are unchanged.
Search and error handling, tightened
Phrase search (match=phrase) was silently dropping stop-words — ?q=are sanctified&match=phrase collapsed to a bare sanctified search — because MySQL’s full-text index never stores common words or very short tokens. Phrase mode now re-checks the exact wording after the index narrows the candidates, so a phrase search actually contains your phrase. Prefix search (match=prefix) now works for stems under three characters. Both search responses gained an ignored_terms array and a plain-language notice naming any query word the index can’t match, so you always know what was set aside.
On the error side: GET /bibles/{version}/{book}/{chapter} now returns 404 chapter_not_found for a chapter that doesn’t exist in that version, and 404 verse_not_found for a missing verse in a real chapter — previously both came back as 200 with an empty list, indistinguishable from a typo. A non-numeric or zero chapter is a 400. This lets your app tell “this chapter doesn’t exist here” from “empty” and decide whether to offer a version switch.
The docs and the portal you actually work in
api.iqbible.com/ is a real landing page now, not a JSON index (that moved to GET /status). The public docs at /docs got a full rework: GLOSSARY.md, LICENSING.md, and CREDITS.md are tabs alongside the API reference, each with its own deep-linkable route; a header search box indexes every endpoint, section, and glossary term together with ranked snippet previews; and the first mention of a glossary term inside the reference is a hover-definition link. Every one of the 70 glossary terms is individually addressable at /glossary#term. The site also carries Open Graph and Twitter Card metadata, JSON-LD, robots.txt, and sitemap.xml.
The developer portal got a day/night mode — a toggle in the top bar plus a Light / Dark / System control in Settings, remembered per browser. The API Docs panel gained a category rail built from the reference’s own headings, with search and scroll-spy, and it now works on a phone: the rail opens as a drawer from a sticky “Contents” button instead of stacking on top of the document.
A pass on data quality
A running theme this cycle was correcting content, not just adding it. The Anderson 1864 New Testament had been imported once over a mis-configured connection years ago, so every curly quote and dash in it served as mojibake (Jacob’s well) — repaired in place across all 233 affected verses. Two dozen translations carried the ingest source in their display name (“Amharic Bible (wordproject.org)”) where clients show it in a version picker — stripped. TIPNR had the archangel Michael filed as an exile-era man because it dates every figure by the surrounding narrative — corrected. Small things individually; the point is that the corpus gets audited, not just grown.
What’s next
We’re heading back to the reference-app side for a cycle — the full study reader we built entirely on these public endpoints, to prove the API is deep enough to build a real product on. When 2.0.0 is feature-complete we’ll cut a release candidate; until then the beta keeps moving.
We build the biblical data infrastructure. You build the tools that help people encounter God’s Word. Build boldly, build well.