FLOGVIT.bible

API

Everything this site knows, over HTTP: the Bible text in several editions and versifications, the verse of the day, the study content around a chapter — and, for a signed-in account, the reader’s own notes, lists and reading progress.

Reading is open — no key and no account. The machine-readable description is /api/openapi.json (OpenAPI 3.1); point Swagger UI, Redoc or a client generator straight at it.

Add ?lang=en to any request to pick the language of the content. Without it we read the Referer, then Accept-Language, and fall back to English.

Bible text

Chapters, verses, the original text and word-for-word data.

GET/api/books

All 66 books

Book metadata (id, names, chapter count, testament) with the book summary where we have one. The id is the address every other endpoint uses for a book.

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The books, under books.

  • 500

    Something failed on our side.

GET/api/chapter

One chapter, with everything the reading page shows

Verses, the original text, word-for-word data, cross references and the chapter summary, context and insight. With mapping the verse numbering is remapped from osnb to another system (KVN) — the osnb coordinates stay in the response as osnbChapter/osnbVerse.

NameInTypeDescription
bookrequiredqueryinteger

Book id, 1–66.

Example: 1

chapterrequiredqueryinteger

Chapter number.

Example: 1

biblequerystring

Bible edition id (osnb, osnn, sblgnt, tanach, …).

Example: osnb

mappingquerystring

Verse mapping id to renumber into. See /api/mappings/kvn.

secondaryquerystring

A second edition to include as secondaryVerses.

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The chapter.

  • 400

    Missing or invalid book/chapter, or an unknown mapping.

  • 404

    No such chapter in this edition.

  • 500

    Something failed on our side.

GET/api/verses

Verses from a Norwegian standard reference

Takes a reference the way it is written in Norwegian — Joh 3,16-19, Sal 23, 1 Mos 1,1-3; 2,4 — and returns the verses with the original text alongside.

NameInTypeDescription
refrequiredquerystring

The reference to look up.

Example: Joh 3,16-19

biblequerystring

Bible edition id (osnb, osnn, sblgnt, tanach, …).

Example: osnb

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The verses, in order.

  • 400

    Missing ref, or a reference we cannot read.

  • 500

    Something failed on our side.

POST/api/verses

Verses from explicit coordinates

The batch form: ask for many verses by book/chapter/verse in one request.

Request body

refs is the list of verses; bible picks the edition.

{
  "refs": [
    {
      "bookId": 43,
      "chapter": 3,
      "verse": 16
    }
  ],
  "bible": "osnb"
}

Responses

  • 200

    The verses, in the order they were asked for.

  • 400

    Missing refs array.

  • 500

    Something failed on our side.

GET/api/word4word

Word-for-word data for one verse

Set bible=original to get the Hebrew/Greek word-for-word rows with the gloss in lang.

NameInTypeDescription
bookIdrequiredqueryinteger

Book id, 1–66.

Example: 1

chapterrequiredqueryinteger

Chapter number.

Example: 1

verserequiredqueryinteger

Verse number.

Example: 1

biblequerystring

Bible edition id (osnb, osnn, sblgnt, tanach, …).

Example: osnb

langquerystring

Gloss language for the original text (nb, nn).

Responses

  • 200

    The rows, in word order.

  • 400

    Missing or non-numeric parameters.

GET/api/references

Cross references for one verse

NameInTypeDescription
bookIdrequiredqueryinteger

Book id, 1–66.

Example: 1

chapterrequiredqueryinteger

Chapter number.

Example: 1

verserequiredqueryinteger

Verse number.

Example: 1

langquerystring

Content language (nb, nn, en).

Example: nb

Responses

  • 200

    The references.

  • 400

    Missing or non-numeric parameters.

GET/api/verse-extras

Prayer and sermon for one verse

NameInTypeDescription
bookIdrequiredqueryinteger

Book id, 1–66.

Example: 1

chapterrequiredqueryinteger

Chapter number.

Example: 1

verserequiredqueryinteger

Verse number.

Example: 1

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    { prayer, sermon } — either may be null.

  • 400

    Missing or non-numeric parameters.

GET/api/important-words

Key words in a chapter

NameInTypeDescription
bookIdrequiredqueryinteger

Book id, 1–66.

Example: 1

chapterrequiredqueryinteger

Chapter number.

Example: 1

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The words.

  • 400

    Missing or non-numeric parameters.

  • 500

    Something failed on our side.

POST/api/chapter-context

Summaries and context for up to 20 chapters

The batch form used when a list of chapters needs its headings — book summary, chapter summary, context and the timeline events that belong to the chapter.

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Request body

Up to 20 {bookId, chapter} pairs.

{
  "chapters": [
    {
      "bookId": 1,
      "chapter": 1
    },
    {
      "bookId": 43,
      "chapter": 3
    }
  ]
}

Responses

  • 200

    One result per chapter, in the order asked. An unusable pair gets an error field of its own.

  • 400

    Empty list, or more than 20 chapters.

  • 500

    Something failed on our side.

POST/api/favorites

Verse text for a list of favourites

Read-only: it takes coordinates and returns the text, so a client that stores favourites locally can render them. It does not store anything — see POST /api/sync for that.

Request body

The verses to resolve.

{
  "favorites": [
    {
      "bookId": 43,
      "chapter": 3,
      "verse": 16
    }
  ]
}

Responses

  • 200

    The verses that exist; the rest are dropped.

  • 500

    Something failed on our side.

GET/api/statistics

Bible statistics

NameInTypeDescription
biblequerystring

Bible edition id (osnb, osnn, sblgnt, tanach, …).

Example: osnb

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    Counts of books, chapters, verses and words.

  • 500

    Something failed on our side.

GET/api/statistics/top-words

Most frequent words in the translation

NameInTypeDescription
limitqueryinteger

How many words, max 500.

Example: 25

allqueryboolean

Include stop words (true).

biblequerystring

Bible edition id (osnb, osnn, sblgnt, tanach, …).

Example: osnb

Responses

  • 200

    The words with their counts.

  • 500

    Something failed on our side.

GET/api/statistics/top-words/hebrew

Most frequent Hebrew words

NameInTypeDescription
limitqueryinteger

How many words, max 500.

Example: 25

Responses

  • 200

    The words with their counts.

  • 500

    Something failed on our side.

GET/api/statistics/top-words/greek

Most frequent Greek words

NameInTypeDescription
limitqueryinteger

How many words, max 500.

Example: 25

Responses

  • 200

    The words with their counts.

  • 500

    Something failed on our side.

Daily verse

The verse of the day, with its full text.

GET/api/daily-verse

Today’s verse

The reference, the full verse text and the note that goes with it.

NameInTypeDescription
biblequerystring

Bible edition id (osnb, osnn, sblgnt, tanach, …).

Example: osnb

Responses

  • 200

    Today’s verse.

  • 404

    No verse is set for today.

  • 500

    Something failed on our side.

GET/api/daily-verse/{date}

The verse for a given date

NameInTypeDescription
daterequiredpathstring

Date as YYYY-MM-DD.

Example: 2026-12-25

biblequerystring

Bible edition id (osnb, osnn, sblgnt, tanach, …).

Example: osnb

Responses

  • 200

    The verse for that date.

  • 400

    The date is not YYYY-MM-DD.

  • 404

    No verse for that date.

  • 500

    Something failed on our side.

Study content

Stories, themes, number symbolism, prophecies, the timeline and gospel parallels.

GET/api/stories

All Bible stories

id is the slug — the address /api/stories/{slug} serves (#61).

NameInTypeDescription
categoryquerystring

Filter by category.

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The stories, under stories.

  • 500

    Something failed on our side.

GET/api/stories/{slug}

One story

NameInTypeDescription
slugrequiredpathstring

The story slug, as handed out in id.

Example: daniel-i-lovehulen

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The story.

  • 404

    No such story.

  • 500

    Something failed on our side.

GET/api/themes

All themes

id is the theme name — the address /api/themes/{id} serves (#61).

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The themes, under themes.

  • 500

    Something failed on our side.

GET/api/themes/{id}

One theme

NameInTypeDescription
idrequiredpathstring

The theme name, as handed out in id.

Example: abraham

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The theme.

  • 404

    No such theme.

  • 500

    Something failed on our side.

GET/api/number-symbolism

Number symbolism

id is the number itself — the address /api/number-symbolism/{number} serves (#61).

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The entries, under symbolisms.

  • 500

    Something failed on our side.

GET/api/number-symbolism/{number}

One number

NameInTypeDescription
numberrequiredpathinteger

The number.

Example: 7

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The entry.

  • 400

    Not a number.

  • 404

    Nothing for that number.

  • 500

    Something failed on our side.

GET/api/days

Days of the church year

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The days, under days.

  • 500

    Something failed on our side.

GET/api/days/today

The days that match today’s date

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The days, possibly none.

  • 500

    Something failed on our side.

GET/api/days/{id}

One day

NameInTypeDescription
idrequiredpathstring

The day id, as handed out in id.

Example: julaften

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The day.

  • 404

    No such day.

  • 500

    Something failed on our side.

GET/api/timeline

The biblical timeline

Periods and events. With bookId and chapter the response also names the events that belong to that chapter.

NameInTypeDescription
bookIdqueryinteger

Book id, 1–66.

Example: 1

chapterqueryinteger

Chapter number.

Example: 12

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    { periods, events, chapterEventIds? }.

  • 500

    Something failed on our side.

GET/api/timeline/multi

All three timelines

The biblical, the world and the book timelines side by side.

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The three timelines.

  • 500

    Something failed on our side.

GET/api/prophecies

Prophecies and their fulfilments

Without parameters: every category and every prophecy. With book, chapter and verse: only the ones that touch that verse.

NameInTypeDescription
bookqueryinteger

Book id, 1–66.

Example: 23

chapterqueryinteger

Chapter number.

Example: 53

versequeryinteger

Verse number.

Example: 5

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    { categories, prophecies }, or { prophecies } for a verse.

  • 500

    Something failed on our side.

GET/api/parallels

Gospel parallels

Sections and parallels. sections[].id is a grouping key (parallels[].section_id), not an address — there is no detail route for a section (#61).

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    { sections, parallels }.

  • 500

    Something failed on our side.

GET/api/parallels/chapter/{bookId}/{chapter}

Parallels that touch a chapter

NameInTypeDescription
bookIdrequiredpathinteger

Book id, 1–66.

Example: 40

chapterrequiredpathinteger

Chapter number.

Example: 1

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The parallels, under parallels.

  • 400

    Non-numeric book id or chapter.

  • 500

    Something failed on our side.

GET/api/parallels/{id}

One parallel

NameInTypeDescription
idrequiredpathstring

The parallel id, as handed out in id.

Example: jesu-dap

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The parallel.

  • 404

    No such parallel.

  • 500

    Something failed on our side.

POST/api/parallels/{id}/verses

The verses of a parallel

The passages of the parallel, resolved to verse text, keyed by gospel.

NameInTypeDescription
idrequiredpathstring

The parallel id.

Example: jesu-dap

Request body

Optional edition.

{
  "bible": "osnb"
}

Responses

  • 200

    { verses } keyed by gospel.

  • 404

    No such parallel.

  • 500

    Something failed on our side.

People

The people of the Bible, their family graph and where they appear.

GET/api/persons

The people of the Bible

NameInTypeDescription
rolequerystring

Filter by role.

eraquerystring

Filter by era.

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The people. id is the address /api/persons/{id} serves.

  • 500

    Something failed on our side.

GET/api/persons/{id}

One person, with family and mentions

Old spellings are redirected rather than 404-ed: an id with ø/æ/å, and the 68 corrected ids, answer 301 to the canonical address with the query kept (#61).

NameInTypeDescription
idrequiredpathstring

The person id, as handed out in id.

Example: abraham

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The person.

  • 301

    An older spelling — follow Location.

  • 404

    No such person.

  • 500

    Something failed on our side.

Reading

Reading plans and the lectionary (reading texts per date).

GET/api/reading-plans

All reading plans

The list, without the day-by-day readings.

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The plans.

  • 500

    Something failed on our side.

GET/api/reading-plans/{id}

One plan, with its readings

NameInTypeDescription
idrequiredpathstring

The plan id, as handed out in id.

Example: romerne

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The plan.

  • 404

    No such plan.

  • 500

    Something failed on our side.

GET/api/reading-texts

The lectionary

The light list: every reading day with its date. The reading texts are Norwegian-only content (#26), so this list is empty in other languages.

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The reading days, under readingTexts.

  • 500

    Something failed on our side.

GET/api/reading-texts/today

Today’s reading texts

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The reading days for today, possibly none.

  • 500

    Something failed on our side.

GET/api/reading-texts/{date}

The readings for a date, with verse text

The date is the stable address (#40): several reading days can share one date, so the answer is a list.

NameInTypeDescription
daterequiredpathstring

Date as YYYY-MM-DD.

Example: 2026-12-25

biblequerystring

Bible edition id (osnb, osnn, sblgnt, tanach, …).

Example: osnb

mappingquerystring

Verse mapping id to renumber into.

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The readings for that date.

  • 404

    No readings for that date.

  • 500

    Something failed on our side.

GET/api/reading-texts/{id}

One reading day by row id

The row id is renumbered by every content import (#40) — store the date instead. Kept because clients still hold old ids.

NameInTypeDescription
idrequiredpathinteger

The row id.

Example: 165

biblequerystring

Bible edition id (osnb, osnn, sblgnt, tanach, …).

Example: osnb

mappingquerystring

Verse mapping id to renumber into.

langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The reading day.

  • 400

    Not a number.

  • 404

    No such row.

  • 500

    Something failed on our side.

Verse numbering

Verse mappings (KVN) between editions with different versification.

GET/api/mappings

Verse mappings in the database

NameInTypeDescription
langquerystring

Content language for the response (nb, nn, en, de, fr, es, sv, fi). Without it we read the Referer, then Accept-Language, and fall back to English.

Example: en

Responses

  • 200

    The mappings, under mappings.

  • 500

    Something failed on our side.

GET/api/mappings/{id}

One mapping, with the full verse map

NameInTypeDescription
idrequiredpathstring

The mapping id.

Example: kjv

Responses

  • 200

    The mapping.

  • 404

    No such mapping.

  • 500

    Something failed on our side.

GET/api/mappings/kvn

The KVN mappings we ship

One entry per mapping file — the versification systems mapping= accepts.

Responses

  • 200

    The mappings, under mappings.

  • 500

    Something failed on our side.

GET/api/mappings/kvn/{id}

One KVN mapping

NameInTypeDescription
idrequiredpathstring

The mapping id, as handed out by /api/mappings/kvn.

Example: kjv

Responses

  • 200

    { bookNames, verseMap }.

  • 404

    No such mapping.

  • 500

    Something failed on our side.

GET/api/mappings/kvn/all

Every KVN mapping in one response

Around 73 MB, streamed one mapping at a time. Meant for a client that wants the whole set once — ask for /api/mappings/kvn/{id} if you need one.

Responses

  • 200

    A JSON object keyed by mapping id.

Your data

Notes, highlights, lists, favourites and reading progress — the signed-in user’s own data.

POST/api/sync

Notes, highlights, lists and reading progress

Requires: FLOGVIT.plus account

The signed-in user’s own data lives behind one endpoint, as a delta sync rather than one resource per type. Send lastSyncAt: 0 and an empty changes array to pull everything.

Data types: notes, favorites, verseLists, devotionals (manuscripts), topics, settings, readingPosition, verseVersions, activePlan, planProgress, readingProgress.

Newest updatedAt wins, except for readingProgress and planProgress, which are merged both ways so an offline device can never delete progress. Rate limit: 30 requests per minute.

Request body

deviceId identifies the client; changes are the items it has changed since lastSyncAt.

{
  "deviceId": "my-client",
  "lastSyncAt": 0,
  "changes": []
}

Responses

  • 200

    { syncedAt, changes } — the server’s side of the delta.

  • 400

    Missing deviceId.

  • 401

    Not signed in.

  • 402

    FLOGVIT.plus required — cloud storage is part of the subscription.

  • 429

    Too many requests.

  • 500

    Something failed on our side.

POST/api/sync/user-bibles

Sync your own Bible editions

Requires: FLOGVIT.plus account

Metadata only — the chapters go through the two endpoints below.

Request body

The client’s editions.

{
  "bibles": []
}

Responses

  • 200

    { bibles } — the server’s full set afterwards.

  • 401

    Not signed in.

  • 402

    FLOGVIT.plus required.

  • 500

    Something failed on our side.

POST/api/sync/user-bible-chapters/{id}

Upload chapters for your own edition

Requires: FLOGVIT.plus account

NameInTypeDescription
idrequiredpathstring

The edition id.

Example: min-bibel

Request body

Chapters, in chunks.

{
  "chapters": []
}

Responses

  • 200

    { ok, count }.

  • 401

    Not signed in.

  • 402

    FLOGVIT.plus required.

  • 404

    Not your edition.

  • 500

    Something failed on our side.

GET/api/sync/user-bible-chapters/{id}

Download the chapters of your own edition

Requires: FLOGVIT.plus account

NameInTypeDescription
idrequiredpathstring

The edition id.

Example: min-bibel

Responses

  • 200

    { chapters }.

  • 401

    Not signed in.

  • 402

    FLOGVIT.plus required.

  • 404

    Not your edition.

  • 500

    Something failed on our side.

Sharing

Share links for manuscripts, and the open catalogue.

GET/api/shares

Your share links

Requires: FLOGVIT.plus account

Responses

  • 200

    { shares }.

  • 401

    Not signed in.

  • 402

    FLOGVIT.plus required.

POST/api/shares

Share a manuscript

Requires: FLOGVIT.plus account

Idempotent: an existing link comes back unchanged. regenerate: true issues a new token and revokes the old one — there is only ever one live link per manuscript.

Request body

The sync item id of the manuscript.

{
  "itemId": "dev-1750000000000"
}

Responses

  • 200

    { share }.

  • 400

    itemId missing.

  • 401

    Not signed in.

  • 402

    FLOGVIT.plus required.

  • 404

    Unknown manuscript, or not yours.

DELETE/api/shares/{itemId}

Revoke a share link

Requires: FLOGVIT.plus account

NameInTypeDescription
itemIdrequiredpathstring

The sync item id of the manuscript.

Example: dev-1750000000000

Responses

  • 200

    { revoked }.

  • 401

    Not signed in.

  • 402

    FLOGVIT.plus required.

GET/api/publications

Your catalogue entries

Requires: FLOGVIT.plus account

Responses

  • 200

    { publications } — yours, whatever their review status.

  • 401

    Not signed in.

  • 402

    FLOGVIT.plus required.

POST/api/publications

Submit a manuscript to the open catalogue

Requires: FLOGVIT.plus account

The text is frozen at submission and goes to review. Re-submitting an approved entry sends it back to pending with the new text.

Request body

The sync item id of the manuscript.

{
  "itemId": "dev-1750000000000"
}

Responses

  • 200

    { publication }.

  • 400

    itemId missing.

  • 401

    Not signed in.

  • 402

    FLOGVIT.plus required.

  • 404

    Unknown or empty manuscript, or not yours.

  • 429

    Too many requests.

DELETE/api/publications/{itemId}

Withdraw a catalogue entry

Requires: FLOGVIT.plus account

NameInTypeDescription
itemIdrequiredpathstring

The sync item id of the manuscript.

Example: dev-1750000000000

Responses

  • 200

    { withdrawn }.

  • 401

    Not signed in.

  • 402

    FLOGVIT.plus required.

POST/api/publications/report/{slug}

Report a catalogue entry

Open — no account. The answer is the same for a known and an unknown slug, so the button cannot be used to map the catalogue. Rate limit: 5 per minute per client.

NameInTypeDescription
slugrequiredpathstring

The catalogue address.

Example: nytt-liv-a1b2c3

Responses

  • 200

    { reported: true }.

  • 429

    Too many requests.

GET/api/publications/pending

The review queue

Requires: x-review-token header

The transport for scripts/publications-review.ts. Both queues are paginated and carry total (#81).

NameInTypeDescription
sidequeryinteger

Page number, from 1.

Example: 1

Responses

  • 200

    { pending, reported }.

  • 403

    Wrong token.

  • 404

    The service has no REVIEW_TOKEN, so the endpoint does not exist.

GET/api/publications/review/{slug}

One entry for review, wherever it sits in the queue

Requires: x-review-token header

NameInTypeDescription
slugrequiredpathstring

The catalogue address.

Example: nytt-liv-a1b2c3

Responses

  • 200

    { publication } with the full text.

  • 403

    Wrong token.

  • 404

    Unknown slug — or the service has no REVIEW_TOKEN.

POST/api/publications/decide

Approve or reject an entry

Requires: x-review-token header

Request body

status is approved or rejected; note is the reason shown to the author.

{
  "slug": "nytt-liv-a1b2c3",
  "status": "approved"
}

Responses

  • 200

    { decided: true }.

  • 400

    Missing slug or a status that is neither.

  • 403

    Wrong token.

  • 404

    Unknown slug — or the service has no REVIEW_TOKEN.

Contributions

Reader-submitted works with verse references.

POST/api/contrib

Submit a work with verse references

Requires: Signed-in account

An account is enough — contributions are never behind the paywall. Give raw and context_translation; the KVN coordinates are filled in by review (see ../free-bible/contrib/README.md). Rate limit: 10 per minute.

Request body

The submission.

{
  "kind": "article",
  "payload": {}
}

Responses

  • 201

    { id, status: "pending" }.

  • 400

    The submission did not validate.

  • 401

    Not signed in.

  • 429

    Too many requests.

  • 500

    Something failed on our side.

GET/api/contrib/mine

Your own submissions

Requires: Signed-in account

Responses

  • 200

    { submissions }, newest first.

  • 401

    Not signed in.

  • 500

    Something failed on our side.

POST/api/contrib/{id}/respond

Answer a reviewer who asked for more

Requires: Signed-in account

NameInTypeDescription
idrequiredpathinteger

The submission id.

Example: 12

Request body

Up to 2000 characters.

{
  "message": "The quote is from the 1978 edition."
}

Responses

  • 200

    { id, status: "pending" }.

  • 400

    Bad id or missing message.

  • 401

    Not signed in.

  • 404

    Not your submission.

  • 500

    Something failed on our side.

GET/api/contrib/pending

The submission queue

Requires: x-contrib-token header

The transport for scripts/contrib-pull.ts.

Responses

  • 200

    { submissions }.

  • 403

    Wrong token.

  • 404

    The service has no CONTRIB_TOKEN, so the endpoint does not exist.

POST/api/contrib/apply

Write reviewed submissions back

Requires: x-contrib-token header

The transport for scripts/contrib-apply.ts.

Request body

The reviewed payloads.

{
  "updates": []
}

Responses

  • 200

    { applied, failed }.

  • 400

    Missing updates array.

  • 403

    Wrong token.

  • 404

    The service has no CONTRIB_TOKEN.

Service

Health, versions and this documentation.

GET/api/health

Is the app up

Responses

  • 200

    { ok: true }.

GET/api/version

Content version

When the content was last imported, and the sync version that invalidates client caches.

Responses

  • 200

    { version, importedAt, syncVersion }.

  • 500

    The same shape, with the epoch as the version.

GET/api/minne

Memory accounting

Aggregate counters for our own caches — no user data. Public on purpose: a number nobody can read at three in the morning is a number that does not exist.

Responses

  • 200

    The counters.

GET/api/openapi.json

This specification

OpenAPI 3.1. Point Swagger UI, Redoc or a client generator straight at it.

Responses

  • 200

    The OpenAPI document.

GET/api/docs

The API explorer

This page: every endpoint, its parameters and a request you can run.

Responses

  • 200

    The HTML page.