API

Scripture API

A free, read-only JSON API for looking up Bible verses — no API key, no signup. Built for AI assistants, tools, and anyone who needs scripture text by reference. All three translations are in the public domain (see attribution notes below).

Machine-readable summary at /llms.txt.

Base URL

https://bible49.com/api/bible

Query styles

1. Book + chapter (+ optional verse or range)

GET /api/bible?b={book}&c={chapter}&v={verse}&t={translation}
  • b — a USFM code (JHN), full English name (John), or common abbreviation (Jn). Case-insensitive.
  • c — chapter number.
  • v — optional. A single verse (16) or a range within that chapter (4-7). Omit for the whole chapter.
  • t — optional, default web. See Translations below.
curl "https://bible49.com/api/bible?b=gen&c=1&v=1&t=web"
curl "https://bible49.com/api/bible?b=psa&c=117"          # whole chapter
curl "https://bible49.com/api/bible?b=1cor&c=13&v=4-7"    # range

2. Free-form reference

GET /api/bible?ref={reference}&t={translation}

Accepts things like John 3:16, Jn 3.16,1 Cor 13:4-7, Psalm 23,Gen 1:1-3 — case-insensitive, common abbreviations, en-dash or hyphen ranges.

curl "https://bible49.com/api/bible?ref=John+3:16&t=bsb"

Ranges are capped at one chapter per request — no bulk or whole-book dumps. A multi-chapter reference (e.g.Genesis 1-3) returns a 400.

Translations (t=)

t=TranslationLicense
web (default)World English BiblePublic domain
bsbBerean Standard BiblePublic domain
kjvKing James Version (1769, protocanon)Public domain outside the UK; UK printing/import governed by Crown letters patent

Every response includes the exact attribution wording to display alongside quoted text.

Response schema

Example: GET /api/bible?ref=John+3:16&t=web

{
  "translation": { "id": "eng-web", "abbreviation": "WEB", "name": "World English Bible" },
  "reference": "John 3:16",
  "verses": [
    {
      "verse_id": 43003016,
      "book": "JHN",
      "chapter": 3,
      "verse": 16,
      "text": "For God so loved the world, that he gave his one and only Son, that whoever believes in him should not perish, but have eternal life."
    }
  ],
  "attribution": "The World English Bible is in the Public Domain. \"World English Bible\" is a trademark of eBible.org.",
  "app_url": "https://bible49.com/jhn/3/16"
}
  • verse_id — canonical id, stable across translations and requests (book_id * 1,000,000 + chapter * 1,000 + verse).
  • book — USFM book code (e.g. JHN).
  • display_verse — present only for a merged verse bridge (a printed range like "15-16" that's one verse of running text in the source); omitted otherwise.
  • app_url — deep link to this passage in the Bible49 app.

Verse bridges

Some verses are printed merged with the next ("\\v 15-16" in the source text). Querying either verse number returns the same single entry, at the bridge's first verse number, withdisplay_verse set to the printed label:

{
  "translation": { "id": "eng-web", "abbreviation": "WEB", "name": "World English Bible" },
  "reference": "Sirach 11:15-16",
  "verses": [
    {
      "verse_id": 71011015,
      "book": "SIR",
      "chapter": 11,
      "verse": 15,
      "display_verse": "15-16",
      "text": "Do not marvel at a sinner's works, but trust in the Lord and abide in your labor..."
    }
  ],
  "attribution": "...",
  "app_url": "https://bible49.com/sir/11/15"
}

Errors

Errors are JSON: { "error": "..." }.

  • 400 — unknown book, unknown t=, a malformed or multi-chapter reference, or an out-of-range chapter/ verse number. The message names valid forms.
  • 404 — the reference parsed fine, but that translation has no verses there (e.g. a book the translation doesn't include, or a chapter number it doesn't have).

Rate expectations

No API key required. Be reasonable — this is a small, single-developer service. Responses carry a long-livedCache-Control header (verse text for a given translation never changes), so cache what you can. Heavy or automated scraping may get rate-limited or blocked.

All three translations are public domain scripture text — see theattribution field in each response for the exact wording to display.