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.
Name
In
Type
Description
lang
query
string
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.
Name
In
Type
Description
bookrequired
query
integer
Book id, 1–66.
Example: 1
chapterrequired
query
integer
Chapter number.
Example: 1
bible
query
string
Bible edition id (osnb, osnn, sblgnt, tanach, …).
Example: osnb
mapping
query
string
Verse mapping id to renumber into. See /api/mappings/kvn.
secondary
query
string
A second edition to include as secondaryVerses.
lang
query
string
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.
Name
In
Type
Description
refrequired
query
string
The reference to look up.
Example: Joh 3,16-19
bible
query
string
Bible edition id (osnb, osnn, sblgnt, tanach, …).
Example: osnb
lang
query
string
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.
Set bible=original to get the Hebrew/Greek word-for-word rows with the gloss in lang.
Name
In
Type
Description
bookIdrequired
query
integer
Book id, 1–66.
Example: 1
chapterrequired
query
integer
Chapter number.
Example: 1
verserequired
query
integer
Verse number.
Example: 1
bible
query
string
Bible edition id (osnb, osnn, sblgnt, tanach, …).
Example: osnb
lang
query
string
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
Name
In
Type
Description
bookIdrequired
query
integer
Book id, 1–66.
Example: 1
chapterrequired
query
integer
Chapter number.
Example: 1
verserequired
query
integer
Verse number.
Example: 1
lang
query
string
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
Name
In
Type
Description
bookIdrequired
query
integer
Book id, 1–66.
Example: 1
chapterrequired
query
integer
Chapter number.
Example: 1
verserequired
query
integer
Verse number.
Example: 1
lang
query
string
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
Name
In
Type
Description
bookIdrequired
query
integer
Book id, 1–66.
Example: 1
chapterrequired
query
integer
Chapter number.
Example: 1
lang
query
string
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.
Name
In
Type
Description
lang
query
string
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.
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.
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
Name
In
Type
Description
limit
query
integer
How many words, max 500.
Example: 25
all
query
boolean
Include stop words (true).
bible
query
string
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
Name
In
Type
Description
limit
query
integer
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
Name
In
Type
Description
limit
query
integer
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.
Name
In
Type
Description
bible
query
string
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
Name
In
Type
Description
daterequired
path
string
Date as YYYY-MM-DD.
Example: 2026-12-25
bible
query
string
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).
Name
In
Type
Description
category
query
string
Filter by category.
lang
query
string
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/search
Search the stories
Name
In
Type
Description
qrequired
query
string
At least two characters.
Example: josef
lang
query
string
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
Matching stories; an empty list for a query under two characters.
500
Something failed on our side.
GET/api/stories/{slug}
One story
Name
In
Type
Description
slugrequired
path
string
The story slug, as handed out in id.
Example: daniel-i-lovehulen
lang
query
string
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).
Name
In
Type
Description
lang
query
string
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
Name
In
Type
Description
idrequired
path
string
The theme name, as handed out in id.
Example: abraham
lang
query
string
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).
Name
In
Type
Description
lang
query
string
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
Name
In
Type
Description
numberrequired
path
integer
The number.
Example: 7
lang
query
string
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
Name
In
Type
Description
lang
query
string
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
Name
In
Type
Description
lang
query
string
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
Name
In
Type
Description
idrequired
path
string
The day id, as handed out in id.
Example: julaften
lang
query
string
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.
Name
In
Type
Description
bookId
query
integer
Book id, 1–66.
Example: 1
chapter
query
integer
Chapter number.
Example: 12
lang
query
string
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.
Name
In
Type
Description
lang
query
string
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.
Name
In
Type
Description
book
query
integer
Book id, 1–66.
Example: 23
chapter
query
integer
Chapter number.
Example: 53
verse
query
integer
Verse number.
Example: 5
lang
query
string
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).
Name
In
Type
Description
lang
query
string
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
Name
In
Type
Description
bookIdrequired
path
integer
Book id, 1–66.
Example: 40
chapterrequired
path
integer
Chapter number.
Example: 1
lang
query
string
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
Name
In
Type
Description
idrequired
path
string
The parallel id, as handed out in id.
Example: jesu-dap
lang
query
string
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.
Name
In
Type
Description
idrequired
path
string
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
Name
In
Type
Description
role
query
string
Filter by role.
era
query
string
Filter by era.
lang
query
string
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).
Name
In
Type
Description
idrequired
path
string
The person id, as handed out in id.
Example: abraham
lang
query
string
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.
Search
Free-text search and reference parsing.
GET/api/search
Search the Bible text
Name
In
Type
Description
qrequired
query
string
At least two characters.
Example: kjærlighet
limit
query
integer
Page size (default 50).
Example: 10
offset
query
integer
Offset into the result set.
bible
query
string
Bible edition id (osnb, osnn, sblgnt, tanach, …).
Example: osnb
Responses
200
{ results, total, hasMore }.
500
Something failed on our side.
GET/api/search/all
Search everything except the Bible text
Stories, themes, people, prophecies, timeline events, parallels, plans, key words, number symbolism, days and reading texts in one response.
Name
In
Type
Description
qrequired
query
string
At least two characters, or a number.
Example: josef
lang
query
string
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
One list per resource type.
500
Something failed on our side.
GET/api/search/chapter-resources
Everything that belongs to one chapter
People, prophecies, numbers, themes, stories, reading texts, parallels and key words — each with the verses in this chapter they touch.
Name
In
Type
Description
bookIdrequired
query
integer
Book id, 1–66.
Example: 1
chapterrequired
query
integer
Chapter number.
Example: 12
lang
query
string
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 resources. Empty lists when the parameters are missing.
500
Something failed on our side.
GET/api/search/original
Search the Hebrew and Greek text
Name
In
Type
Description
qrequired
query
string
The word to look for.
Example: אלהים
limit
query
integer
Page size (default 50).
Example: 10
offset
query
integer
Offset into the result set.
Responses
200
{ results, total, hasMore }.
500
Something failed on our side.
GET/api/reference
Parse a Bible reference
Turns what a reader typed into a book, chapter and verse range, with the canonical URL. Error texts come back in the language of the request (#71).
Name
In
Type
Description
qrequired
query
string
The text to parse.
Example: sal 23
lang
query
string
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
{ success, reference }, or { success: false, error } with suggestions.
GET/api/reference/suggest
Autocomplete a reference
With book and chapter it answers { verseCount } instead — the number of verses to offer.
Name
In
Type
Description
q
query
string
What has been typed so far.
Example: joh
book
query
integer
Book id, when asking for the verse count.
chapter
query
integer
Chapter number, when asking for the verse count.
lang
query
string
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
{ suggestions }, or { verseCount }.
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.
Name
In
Type
Description
lang
query
string
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
Name
In
Type
Description
idrequired
path
string
The plan id, as handed out in id.
Example: romerne
lang
query
string
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.
Name
In
Type
Description
lang
query
string
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
Name
In
Type
Description
lang
query
string
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.
Name
In
Type
Description
daterequired
path
string
Date as YYYY-MM-DD.
Example: 2026-12-25
bible
query
string
Bible edition id (osnb, osnn, sblgnt, tanach, …).
Example: osnb
mapping
query
string
Verse mapping id to renumber into.
lang
query
string
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.
Name
In
Type
Description
idrequired
path
integer
The row id.
Example: 165
bible
query
string
Bible edition id (osnb, osnn, sblgnt, tanach, …).
Example: osnb
mapping
query
string
Verse mapping id to renumber into.
lang
query
string
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
Name
In
Type
Description
lang
query
string
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
Name
In
Type
Description
idrequired
path
string
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
Name
In
Type
Description
idrequired
path
string
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.
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.
{ 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
Name
In
Type
Description
idrequired
path
string
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
Name
In
Type
Description
idrequired
path
string
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
Name
In
Type
Description
itemIdrequired
path
string
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
Name
In
Type
Description
itemIdrequired
path
string
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.
Name
In
Type
Description
slugrequired
path
string
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).
Name
In
Type
Description
side
query
integer
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
Name
In
Type
Description
slugrequired
path
string
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.
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
Name
In
Type
Description
idrequired
path
integer
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.