Developer Docs
The Word of God in 12 translations, readable by machines and agents. A free, non-commercial REST API for any application, and a Model Context Protocol (MCP) server for AI coding assistants. No authentication, no rate limit, no tracking.
The Logos77 API returns Bible passages as JSON. Because scripture does not change, responses are cached at the edge and served in milliseconds from anywhere in the world. Every response includes a deep link back into the reader, so any quote you serve can always be opened in full context.
https://www.logos77.com/api
Every endpoint accepts an optional lang parameter (defaults to English KJV). Here is a first verse.
curl "https://www.logos77.com/api/passage?lang=en&book=John&chapter=3&verse=16"
{
"reference": "John 3:16",
"lang": "en",
"lang_label": "English (KJV)",
"book": "John",
"chapter": 3,
"verses": [
{ "verse": 16, "text": "For God so loved the world, that he gave his only begotten Son..." }
],
"deep_link": "https://logos77.com/#John-3-16",
"total_verses_in_chapter": 36
}
Eight endpoints, each following the same response shape. All return JSON and honor Cache-Control.
| Parameter | Type | Default | Description |
|---|---|---|---|
| lang | string | en | Language code (see table below). |
| book | string | required | Book name in the translation's native language. |
| chapter | integer | required | Chapter number, 1-based. |
| verse | string | (whole chapter) | A verse (16) or a range (16-18). Omit for the full chapter. |
curl "https://www.logos77.com/api/passage?lang=fr&book=Jean&chapter=3&verse=16-18"
Cache: immutable, 1 year
| Parameter | Type | Default | Description |
|---|---|---|---|
| lang | string | en | Language code. |
The same verse is returned everywhere, every day. It advances by one verse per day, so it never repeats within a reading cycle.
curl "https://www.logos77.com/api/votd?lang=en"
Cache: immutable, 1 year
| Parameter | Type | Default | Description |
|---|---|---|---|
| lang | string | en | Language code. |
Returns a genuinely random verse. Not cached.
curl "https://www.logos77.com/api/random?lang=ta"
Cache: no-store
| Parameter | Type | Default | Description |
|---|---|---|---|
| q | string | required | Search text. Case-insensitive substring match over verse text. |
| lang | string | en | Language code. |
| limit | integer | 20 | Max results, 1–100. |
curl "https://www.logos77.com/api/search?q=love&lang=en&limit=5"
Cache: 1 day
| Parameter | Type | Default | Description |
|---|---|---|---|
| from | string | (first verse) | Start bound: whole-Bible 0-based index (bare integer) or native reference (Book, Book Ch, Book Ch:V). May come after to to loop back to Genesis. Omit to start at the first verse. |
| from_after | string | — | Resume strictly after a reference (or index), e.g. John 3:16. Survives data revisions that shift integer indexes; overrides from. |
| to | string | end | End bound, same forms, or end. |
| group | string | — | Read one continuous reading-plan group instead of a manual range — a group tag, label, or alias (OT_LAW, Torah, Pauline Epistles). Mutually exclusive with from/from_after/to. Non-continuous groups error — see Reading plans. |
| limit | integer | (slice caps) | Max verses per slice, 1–4096. |
| lang | string | en | Language code. |
Read scripture in canonical order from from to to, or one canonical group via
group. Omit both to cover the whole Bible
(Genesis 1:1 to Revelation 22:21 in KJV). The canon is a loop:
when from comes after to, reading continues through the end of the Bible back to Genesis
(e.g. from=Psalms 150 to to=Psalms 1). Large ranges auto-slice: follow next_url
(same to) to continue, one slice per call. A whole Bible is exactly 8 requests in every translation.
curl "https://www.logos77.com/api/through"
Cache: immutable, 1 year
| Parameter | Type | Default | Description |
|---|---|---|---|
| lang | string | en | Language code. |
List the 66 books in canonical order with their native names and chapter counts, plus the translation's
script metadata (writing direction, max UTF-8 bytes per glyph, combining marks, and a sample verse). These
native names are the vocabulary accepted by book (/passage) and
from/to (/through) — the canonical way to discover how to reference a
translation.
curl "https://www.logos77.com/api/books?lang=ta"
Cache: immutable, 1 year
Enumerate every translation with its label, subdomain, and script metadata: writing direction
(rtl/ltr), maximum UTF-8 bytes per code point, whether the script uses combining
marks, and a fixed sample verse. Ideal for embedded / small-display / low-memory clients that need to
discover regions and adapt rendering (fonts, RTL, glyph width) before fetching any text. Responses are always
UTF-8 JSON.
curl "https://www.logos77.com/api/languages"
Cache: immutable, 1 year
| Parameter | Type | Default | Description |
|---|---|---|---|
| lang | string | en | Language code. |
List the traditional, overlapping book groupings with per-translation native book names — the Law, History,
Wisdom, Major and Minor Prophets, the Gospels, Paul's Letters, the General Letters, Revelation, cross-cutting
groups (the Hebrew Bible, the whole Bible) and traditional subsets (Synoptics, Johannine writings, Prison and
Pastoral letters, Deuteronomic and Post-exilic histories). Groups are non-exclusive: a book may
appear in several. Every group reports contiguous, inclusive 0-based ranges,
books, book/chapter/verse totals, and a start/end span. Continuous
groups read directly via GET /api/through?group=<tag|label|alias> (e.g.
OT_LAW, Torah, Pauline Epistles).
curl "https://www.logos77.com/api/groups"
Cache: immutable, 1 year
Omit from to start at the first verse, and omit to to read to the end — a bare
GET /api/through covers the entire canon (Genesis 1:1 to Revelation 22:21 in KJV). A whole Bible
never fits in one response (each slice is capped at 4096 verses to stay under platform limits), so you walk it
with next_url:
let url = 'https://www.logos77.com/api/through'; // from/to omitted => the whole Bible
for (;;) {
const r = await fetch(url);
if (!r.ok) { await new Promise((s) => setTimeout(s, 750)); continue; } // re-issue the same URL — deterministic
const s = await r.json();
s.verses.forEach((v, k) => { if (v.index !== s.from_index + k) throw new Error('discontinuity'); }); // optional contiguity check
if (!s.truncated || !s.next_url) break; // else done
url = s.next_url; // self-contained: lang, integer from/to, and limit
}
The chain is failsafe by construction:
(lang, from, to, limit) fully determines the slice, and responses are cached immutable at the edge, so a dropped request can be re-issued with an identical result.next_url/prev_url are self-contained, so you can resume from the last URL at any time and retries are identical.limit mid-walk never gaps or overlaps.truncated is false. A whole Bible is at most 8 requests in every translation.
Indexes are stable within a deployment but can shift if verse data is revised. To resume at a point in a way that
survives that, anchor on a verse's reference instead of its index:
from_after=<reference of your last received verse> starts strictly after that verse. If a stale
index ever returns a gap, re-anchor with from_after rather than restarting — at most one verse is
re-read. A full restart of the remaining range is only needed if the reference itself no longer resolves (a book
renamed or removed). For the canonical book names, see GET /api/books?lang=<lang>.
GET /api/groups provides the traditional, overlapping book groupings so you can build a reading
plan without hand-listing ranges. Group membership is non-exclusive — the same book may belong
to several groups (e.g. Ephesians is in Paul's Letters and in Paul's Prison Letters).
curl "https://www.logos77.com/api/groups?lang=en"
Read one continuous group in a single loop segment by passing its tag, label, or alias to
/api/through:
curl "https://www.logos77.com/api/through?group=Torah&limit=5"
group is mutually exclusive with from/from_after/to — combining them returns a 400.contiguous: false and must be read book by book.group: { tag, label } — useful when the request used an alias.OT_LAW = the Law = Torah in every translation); only the book names inside are localized.
Groups are additive to /api/books — call /api/books for the canonical 66-book
ordering and /api/groups for the reading-plan layers on top. See the full
Canonical Schema table at the bottom of this page for every
group= tag, label, and alias you can use.
The lang parameter selects the translation. Note: book names are in the native
language of each translation. For example, John is John in KJV, Jean in
Martin, and Johannes in Luther. Fetch GET /api/books?lang=<lang> to list the 66
canonical native names, or GET /api/languages to enumerate every translation with its script
properties.
Every response is UTF-8 JSON (Content-Type: application/json; charset=utf-8), has
no BOM, and is uncompressed unless the client asks for it — send
Accept-Encoding: identity on microcontrollers and never request gzip unless you can decompress.
This holds across every transport we expose: REST, MCP, and immutable-cached verses. The guidance below applies
to any display (LCD, OLED, TFT, LED matrix, e-ink, segment displays) and any controller (ESP32/Arduino,
Raspberry Pi Pico, STM32, …).
UTF-8 encodes one code point in 1–4 bytes. Your renderer must group bytes into code points before drawing:
| Lang | Translation | Script | Direction | Max bytes/glyph | Combining marks |
|---|---|---|---|---|---|
en | English (KJV) | Latin | ltr | 1 | no |
en-gb | English (Geneva) | Latin | ltr | 1 | no |
de | German (Luther) | Latin | ltr | 1 | no |
fr | French (Martin) | Latin | ltr | 1 | no |
es | Spanish (RVG) | Latin | ltr | 1 | no |
ru | Russian (Synodal) | Cyrillic | ltr | 2 | no |
zh-hant | Chinese Trad. (CKJV) | Han | ltr | 3 | no |
zh-hans | Chinese Simp. (CKJV) | Han | ltr | 3 | no |
my | Burmese (Judson) | Myanmar | ltr | 3 | yes |
ar | Arabic (SVD) | Arabic | rtl | 2 | yes |
ta | Tamil | Tamil | ltr | 3 | yes |
char[] buffers and byte-offset slicing truncate mid-character and produce mojibake.ar must be laid out right-to-left.my, ta, ar use vowel signs and diacritics that attach to (or appear before) the base letter; render them as a unit, not as glyphs on separate advances.deep_link is pure ASCII — non-Latin book names are percent-encoded
(https://ta.logos77.com/#%E0%AE%86…-10-15); the reader decodes fragments at launch.sample from GET /api/languages (or the script block in /api/books) — a fixed first-verse string for verifying decoding and font coverage before processing real requests.Decode bytes to code points before any layout or rendering work. Sketch in C:
uint32_t utf8_next(const uint8_t **p, const uint8_t *end) {
uint8_t b = *(*p)++;
uint32_t cp = b;
int extra = 0;
if (b >= 0xF0) { cp = b & 0x07; extra = 3; }
else if (b >= 0xE0) { cp = b & 0x0F; extra = 2; }
else if (b >= 0xC0) { cp = b & 0x1F; extra = 1; }
for (int i = 0; i < extra && *p < end; i++) cp = (cp << 6) | (**p++ & 0x3F);
return cp; // code point; look this up in your font (glyph != byte)
}
If text comes back wrong or blank after correct decoding, it is a font/rendering problem on the device — the bytes on the wire are standard UTF-8.
This API runs on a free tier, so it is designed to be extremely cache-friendly and self-limiting.
Logos77 also speaks the Model Context Protocol, so AI coding assistants (Claude, Cursor, others) can read scripture directly. It is a public, stateless, read-only server — no API key required.
https://www.logos77.com/mcp
Protocol: MCP Streamable HTTP. Transport over JSON-RPC 2.0.
| Parameter | Type | Default | Description |
|---|---|---|---|
| book | string | required | Book name in the translation's native language. |
| chapter | integer | required | Chapter number, 1-based. |
| verse | string | (whole chapter) | A verse (16) or a range (16-18). |
| lang | string | en | Language code (see the REST API languages table). |
| Parameter | Type | Default | Description |
|---|---|---|---|
| lang | string | en | Language code. |
| Parameter | Type | Default | Description |
|---|---|---|---|
| lang | string | en | Language code. |
| Parameter | Type | Default | Description |
|---|---|---|---|
| q | string | required | Search text. Case-insensitive substring match over verse text. |
| lang | string | en | Language code. |
| limit | integer | 20 | Max results, 1–100. |
| Parameter | Type | Default | Description |
|---|---|---|---|
| from | string | (first verse) | Start bound: whole-Bible 0-based index (bare integer) or native reference (Book, Book Ch, Book Ch:V). May come after to to read through the end of the Bible back to Genesis. Omit to start at the first verse. |
| from_after | string | — | Resume strictly after a reference (or index), e.g. John 3:16. Survives data revisions that shift integer indexes; overrides from. |
| to | string | end | End bound, same forms, or end. |
| group | string | — | Read one continuous reading-plan group — a group tag, label, or alias (OT_LAW, Torah, Pauline Epistles). Mutually exclusive with from/from_after/to. Non-continuous groups error — see Reading plans. |
| limit | integer | 20 | Max verses per slice, 1–4096. |
| lang | string | en | Language code. |
| Parameter | Type | Default | Description |
|---|---|---|---|
| lang | string | en | Language code. |
Enumerate every translation with its label, subdomain, and script metadata (direction, max UTF-8 bytes per glyph, combining marks, sample verse) — the programmatic way for an embedded or small-display client to discover languages and adapt rendering before fetching any text.
| Parameter | Type | Default | Description |
|---|---|---|---|
| lang | string | en | Language code. |
List the traditional overlapping book groupings with per-translation native book names, inclusive ranges,
totals, and contiguity. Continuous groups read via read_through's group parameter;
non-contiguous groups must be read book by book (see Reading plans).
Point your MCP client at the endpoint above:
{
"mcpServers": {
"logos77": {
"url": "https://www.logos77.com/mcp"
}
}
}
Every tool returns each verse with a canonical deep link back into the reader, e.g.
https://logos77.com/#John-3-16, so any verse an
assistant cites can always be opened in full context.
Book names and totals below are the English (KJV) rendering; every other translation localizes
books — fetch GET /api/groups?lang=<lang>. Tags, labels and aliases are
language-independent; matching is case-, diacritic- and punctuation-insensitive, so
OT_LAW, ot_law, ot law, Torah and
pentateuch all resolve to the same group. Ranges are inclusive 0-based
book indexes into the canonical 66-book order. Every row whose Continuous is yes can be
read in one loop segment via /api/through?group=<tag|label|alias>.
| Tag | Label | Aliases | Testament | Ranges (inclusive) | Books | Chapters | Verses | Continuous |
|---|---|---|---|---|---|---|---|---|
Loading the full Canonical Schema from GET /api/groups… | ||||||||