LOGOS
The Word of God
/docs

Developer Docs

Scripture, for code.

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.

REST API

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.

Base URL

https://www.logos77.com/api
Authentication: none required. License: the translations served are public domain. This API is free and strictly non-commercial.

Getting started

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"

Response

{
  "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
}

Endpoints

Eight endpoints, each following the same response shape. All return JSON and honor Cache-Control.

GET /api/passage Look up a verse, range, or full chapter
ParameterTypeDefaultDescription
langstringenLanguage code (see table below).
bookstringrequiredBook name in the translation's native language.
chapterintegerrequiredChapter number, 1-based.
versestring(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

GET /api/votd Deterministic verse of the day
ParameterTypeDefaultDescription
langstringenLanguage 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

GET /api/random A random verse
ParameterTypeDefaultDescription
langstringenLanguage code.

Returns a genuinely random verse. Not cached.

curl "https://www.logos77.com/api/random?lang=ta"

Cache: no-store

GET /api/search Search within a translation
ParameterTypeDefaultDescription
qstringrequiredSearch text. Case-insensitive substring match over verse text.
langstringenLanguage code.
limitinteger20Max results, 1–100.
curl "https://www.logos77.com/api/search?q=love&lang=en&limit=5"

Cache: 1 day

GET /api/through Read continuously through a translation
ParameterTypeDefaultDescription
fromstring(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_afterstring—Resume strictly after a reference (or index), e.g. John 3:16. Survives data revisions that shift integer indexes; overrides from.
tostringendEnd bound, same forms, or end.
groupstring—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.
limitinteger(slice caps)Max verses per slice, 1–4096.
langstringenLanguage 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

GET /api/books List the book names of a translation
ParameterTypeDefaultDescription
langstringenLanguage 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

GET /api/languages List translations and their script properties

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

GET /api/groups List canonical book groupings for reading plans
ParameterTypeDefaultDescription
langstringenLanguage 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

Reading the whole Bible (chained requests)

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:

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>.

Reading plans (book groups)

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"

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.

Languages

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.

English (KJV)en
English (Geneva)en-gb
German (Luther)de
French (Martin)fr
Spanish (RVG)es
Russian (Synodal)ru
Chinese Trad. (CKJV)zh-hant
Chinese Simp. (CKJV)zh-hans
Burmese (Judson)my
Arabic (SVD)ar
Tamilta

Non-Latin scripts & embedded / low-memory / small-display clients

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, …).

Glyph ≠ byte

UTF-8 encodes one code point in 1–4 bytes. Your renderer must group bytes into code points before drawing:

LangTranslationScriptDirectionMax bytes/glyphCombining marks
enEnglish (KJV)Latinltr1no
en-gbEnglish (Geneva)Latinltr1no
deGerman (Luther)Latinltr1no
frFrench (Martin)Latinltr1no
esSpanish (RVG)Latinltr1no
ruRussian (Synodal)Cyrillicltr2no
zh-hantChinese Trad. (CKJV)Hanltr3no
zh-hansChinese Simp. (CKJV)Hanltr3no
myBurmese (Judson)Myanmarltr3yes
arArabic (SVD)Arabicrtl2yes
taTamilTamilltr3yes

Rendering on small displays

Minimal UTF-8 → code point

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.

Limits & caching

This API runs on a free tier, so it is designed to be extremely cache-friendly and self-limiting.

MCP server

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.

Endpoint

https://www.logos77.com/mcp

Protocol: MCP Streamable HTTP. Transport over JSON-RPC 2.0.

Tools

fetch_passage Look up a verse, range, or full chapter
ParameterTypeDefaultDescription
bookstringrequiredBook name in the translation's native language.
chapterintegerrequiredChapter number, 1-based.
versestring(whole chapter)A verse (16) or a range (16-18).
langstringenLanguage code (see the REST API languages table).
verse_of_the_day Deterministic verse of the day
ParameterTypeDefaultDescription
langstringenLanguage code.
random_verse A random verse
ParameterTypeDefaultDescription
langstringenLanguage code.
search Search within a translation
ParameterTypeDefaultDescription
qstringrequiredSearch text. Case-insensitive substring match over verse text.
langstringenLanguage code.
limitinteger20Max results, 1–100.
read_through Read continuously through a translation
ParameterTypeDefaultDescription
fromstring(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_afterstring—Resume strictly after a reference (or index), e.g. John 3:16. Survives data revisions that shift integer indexes; overrides from.
tostringendEnd bound, same forms, or end.
groupstring—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.
limitinteger20Max verses per slice, 1–4096.
langstringenLanguage code.
list_books List the books of a translation
ParameterTypeDefaultDescription
langstringenLanguage code.
list_languages List the available translations and their script properties

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.

list_groups List canonical book groupings for reading plans
ParameterTypeDefaultDescription
langstringenLanguage 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).

Connect

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.

Canonical Schema of the Bible (full 23-group reference)

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>.

TagLabelAliasesTestamentRanges (inclusive)BooksChaptersVersesContinuous
Loading the full Canonical Schema from GET /api/groups…