{"openapi":"3.1.0","info":{"title":"VineVerse API","version":"1.2.0","description":"Read access to the Bible as a knowledge graph, built from public-domain Scripture and openly licensed scholarship. Every endpoint is a GET and needs no key.\n\nWHAT IS IN IT:\n  • People (type \"Person\", path people/)\n  • Places (type \"Place\", path places/)\n  • Themes (type \"Theme\", path themes/)\n  • Lexemes (type \"Lexeme\", path lexemes/)\n  • Commandments (type \"Commandment\", path commandments/)\n  • Events (type \"Event\", path sa/events/)\n  • Epochs (type \"Epoch\", path epochs/)\n  • Books (type \"Book\", path bible/)\n  • Chapters (type \"Chapter\", path bible/)\n  • Sources (type \"Source\", path sources/)\n  • Datasets (type \"Dataset\", path references/)\n  • Schema (type \"Relation Vocabulary\", path schema/)\n\nStart with GET /stats for the catalogue and exact counts, or GET /list?type=… to page through any collection — those are how you find out what exists rather than looking one thing up.\n\nTwo things to respect. Cross references carry no relationship type — the corpus records that two passages are connected, not why — so do not present a connection as a claim the data does not make. And typed relations are stored one-directional: `parent-of` on a person names their CHILDREN, which is why GET /family exists.\n\nThe data is CC BY 4.0, and events under sa/ are CC BY-SA 4.0, which is viral. If you surface it to a user, the attribution travels with it.","license":{"name":"CC BY 4.0","url":"https://creativecommons.org/licenses/by/4.0/"}},"servers":[{"url":"https://vineverse.bible/api/v1","description":"VineVerse read API, v1"}],"security":[],"paths":{"/stats":{"get":{"operationId":"get_stats","summary":"What is in the knowledge base","description":"The catalogue: every collection with its document count, folder, example path and a description of what it holds, plus graph totals and the most common tags. Call this first if you do not know what the knowledge base contains — it is the map to every other endpoint.","responses":{"200":{"description":"Collections, counts, tags and provenance.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Stats"}}}}}}},"/list":{"get":{"operationId":"list_documents","summary":"List documents in a collection","description":"Browse or page through any collection. Use this to answer \"what exists\" — \"what events are recorded\", \"list the epochs in order\", \"show me the 613 commandments\" — rather than to look one thing up.\n\nEpochs and events default to chronological order, so one call answers \"what happened, in sequence\". Everything else defaults to alphabetical.","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["Person","Place","Theme","Lexeme","Commandment","Event","Epoch","Book","Chapter","Source","Dataset","Relation Vocabulary"]},"description":"Restrict to one collection. Plurals and folder names also resolve (\"themes\", \"sa/events\")."},{"name":"tag","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to documents carrying this tag. See GET /tags for the vocabulary."},{"name":"folder","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict by bundle folder prefix, e.g. \"bible/john\"."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["title","degree","canonical","chronological"]},"description":"title = alphabetical; degree = most-connected first; canonical = Bible order; chronological = by start year (epochs) or narrative order (events)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Skip this many results. Compare with `total` in the response to page."}],"responses":{"200":{"description":"One page of the collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Listing"}}}},"400":{"description":"The reference or parameter could not be parsed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/vocabulary":{"get":{"operationId":"get_vocabulary","summary":"Relation vocabulary and canon table","description":"The closed predicate set every typed edge is drawn from — what `develops`, `narrated-in`, `involves`, `stated-in` and `named-by` mean, their inverses, the types they connect and how many edges use each. Also the 66-book canon table with OSIS ids, slugs and chapter counts, which is how you learn that Song of Songs is \"Song\" before building a reference.","responses":{"200":{"description":"Predicates and the canon table.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Vocabulary"}}}}}}},"/tags":{"get":{"operationId":"get_tags","summary":"Tag vocabulary","description":"Every tag with the number of documents carrying it, most common first. Tags cut across collections — `positive-commandment`, `epoch-judge`, `river`, `share-alike` — and any tag here can be passed to /search or /list.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":200}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Skip this many results. Compare with `total` in the response to page."}],"responses":{"200":{"description":"The tag vocabulary with counts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tags"}}}}}}},"/search":{"get":{"operationId":"search","summary":"Search concepts","description":"Search every document by name, description, tag, path and type — people, places, themes, lexemes, commandments, events, epochs, books, chapters, sources and datasets alike. All terms must match (AND), so adding a word narrows the result.\n\nUse `type` to stop one collection swamping another: there are ~3,000 people AND ~3,000 themes, so an unfiltered name query is a coin flip between a person and a topic.\n\nThis searches concept metadata. For a phrase in the text of Scripture use /scripture.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"},"example":"sea galilee","description":"One or more words, e.g. \"sea galilee\" or \"zechariah king\"."},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["Person","Place","Theme","Lexeme","Commandment","Event","Epoch","Book","Chapter","Source","Dataset","Relation Vocabulary"]},"description":"Restrict to one collection. Plurals and folder names also resolve (\"themes\", \"sa/events\")."},{"name":"tag","in":"query","required":false,"schema":{"type":"string"},"description":"Restrict to documents carrying this tag. See GET /tags for the vocabulary."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Skip this many results. Compare with `total` in the response to page."}],"responses":{"200":{"description":"Matching concepts, best match first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResults"}}}},"400":{"description":"The reference or parameter could not be parsed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scripture":{"get":{"operationId":"search_scripture","summary":"Search the text of Scripture","description":"Full-text search across all 31,102 verses of the Berean Standard Bible — how you find a passage you can half-remember but cannot cite.\n\nAll words must appear in the same verse. Wrap words in double quotes to require them adjacent as a phrase (\"a still small voice\"). Results rank by how much of the verse is your query, so short exact matches come first.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"},"example":"still small voice","description":"Words to find. Double quotes require adjacency."},{"name":"book","in":"query","required":false,"schema":{"type":"string"},"example":"john","description":"Restrict to one book, by slug or OSIS id. See /vocabulary."},{"name":"testament","in":"query","required":false,"schema":{"type":"string","enum":["OT","NT"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Skip this many results. Compare with `total` in the response to page."}],"responses":{"200":{"description":"Matching verses, best match first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptureResults"}}}},"400":{"description":"The reference or parameter could not be parsed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/passage/{osis}":{"get":{"operationId":"get_passage","summary":"Get a passage","description":"A verse, a verse range or a whole chapter by OSIS reference. One verse: \"John.3.16\". A range: \"John.3.16-18\". A chapter: \"John.3\" — which returns the Chapter shape rather than the Passage shape.\n\nA verse or range comes back with its context: who is speaking, the people and places each verse names, the THEMES it develops, its cross references, and what points at it — the commandments stated there, the events and epochs narrated there, the lexemes first attested there. That context is the main route from a passage into the topical side of the graph.\n\nText is the Berean Standard Bible. Sixteen verses are intentionally empty where the Berean edition omits them on manuscript grounds; the verse number is still present so numbering matches other translations.","parameters":[{"name":"osis","in":"path","required":true,"schema":{"type":"string"},"example":"John.3.16","description":"OSIS reference, e.g. \"John.3.16\", \"John.3.16-18\", \"Ps.23\" or \"1Sam.17.45\"."}],"responses":{"200":{"description":"A verse or range, or a whole chapter when the reference has two parts.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Passage"},{"$ref":"#/components/schemas/Chapter"}]}}}},"400":{"description":"The reference or parameter could not be parsed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/interlinear/{osis}":{"get":{"operationId":"get_interlinear","summary":"Get the original-language words behind a passage","description":"The Hebrew, Aramaic or Greek behind the English, word by word, for one verse or a whole chapter. A REVERSE interlinear: entries are in English order and each carries the range of English words it produced, so a word in the translation can be traced to the word it renders. `lexeme` is present only where the bundle carries a document for that Strong number — the lexicon holds the words that spell a biblical name plus their roots, and there is no Greek lexicon at all. Five verses carry no data because the two Berean editions disagree about their wording. Returns 503 when the artefact has not been built for the deployment.","parameters":[{"name":"osis","in":"path","required":true,"schema":{"type":"string"},"example":"John.3.16"}],"responses":{"200":{"description":"The words of the passage"},"404":{"description":"No interlinear data for that reference"},"503":{"description":"The interlinear artefact has not been built"}}}},"/xrefs/{osis}":{"get":{"operationId":"find_cross_references","summary":"Find cross references","description":"Cross references for a verse or chapter, ordered by crowd support. These carry no relationship type — the corpus records THAT two passages are connected but never WHY, so do not infer one. Chapter documents materialise only references at or above 20 votes, so a lower minVotes does not widen the result; the complete 341,289-row corpus ships as a dataset at /entity/references/cross-references.","parameters":[{"name":"osis","in":"path","required":true,"schema":{"type":"string"},"example":"John.3.16"},{"name":"minVotes","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":200,"default":0},"description":"Minimum crowd support. Nothing below 20 votes is in the bundle, so a lower value changes nothing, and support saturates at 200."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100}}],"responses":{"200":{"description":"Cross references, most-supported first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrossReferences"}}}},"400":{"description":"The reference or parameter could not be parsed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/connections":{"get":{"operationId":"get_connections","summary":"The cross-reference corpus in aggregate","description":"Questions about the SHAPE of the cross-reference corpus rather than about one verse: which chapters are the hubs, which books lean on which, how much referencing crosses between the testaments.\n\nWith no argument, returns the totals plus the most-connected chapters and the strongest book-to-book pairs. Pass `book` for one book’s own incoming and outgoing rows, or `osis` for a single chapter’s rank and vote weight. Use /xrefs when you want the actual references for a passage.\n\nAnswers 503 when the aggregate has not been built — it is a build artefact, and a fresh checkout running `next dev` genuinely does not have it yet.","parameters":[{"name":"book","in":"query","required":false,"schema":{"type":"string"},"example":"John","description":"One book, by OSIS id or slug."},{"name":"osis","in":"query","required":false,"schema":{"type":"string"},"example":"Ps.119","description":"One chapter."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":20}}],"responses":{"200":{"description":"Corpus totals, plus whichever slice was requested.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Connections"}}}},"400":{"description":"The reference or parameter could not be parsed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The connections aggregate has not been built.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/nearby":{"get":{"operationId":"find_places_near","summary":"Find places near a location","description":"Biblical places within a radius, nearest first, with the distance in kilometres. Anchor on a place already in the knowledge base, or on a bare latitude and longitude when asking about a modern location that has no document here.\n\n~1,300 places carry coordinates. Many sites are identified only tentatively — check `contested` and `identifications` on the place document before treating a position as settled.","parameters":[{"name":"place","in":"query","required":false,"schema":{"type":"string"},"example":"places/jerusalem","description":"Anchor place path. Give this, or both lat and lon."},{"name":"lat","in":"query","required":false,"schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","required":false,"schema":{"type":"number","minimum":-180,"maximum":180}},{"name":"radius","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":20000,"default":50},"description":"Kilometres."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":25}}],"responses":{"200":{"description":"Places within the radius, nearest first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Nearby"}}}},"400":{"description":"The reference or parameter could not be parsed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/changelog":{"get":{"operationId":"get_changelog","summary":"Bundle log and generation time","description":"The knowledge base's own log file, plus `bundleGenerated` — when the data was actually ingested. That is the timestamp you want for cache validation or citation; the `generated` field on /stats is when THIS SERVER built its in-memory index and changes on every restart.","responses":{"200":{"description":"The log and the real generation timestamps.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Changelog"}}}}}}},"/entity/{path}":{"get":{"operationId":"get_entity","summary":"Get a document","description":"Any document by path:\n  • People — people/moses\n  • Places — places/bethel-1\n  • Themes — themes/faith\n  • Lexemes — lexemes/h430\n  • Commandments — commandments/001-know-there-is-a-g-d\n  • Events — sa/events/exodus-from-egypt\n  • Epochs — epochs/david-reigns-in-jerusalem\n  • Books — bible/john\n  • Chapters — bible/john/3\n  • Sources — sources/bibledata\n  • Datasets — references/cross-references\n  • Schema — schema/relations\n\nReturns the document's structured fields, its typed relations in BOTH directions, what links to it, and optionally its full text. The inbound direction matters: the corpus stores each relation once, on one side only, so a person's parents live on their parents' documents and only `relations.inbound` recovers them.\n\nSet body=true for the prose — a lexeme's Strong's definition, a commandment's Hebrew and a theme's outline of verses live in the body and nowhere else.\n\nWhere several people or places share a name the path is disambiguated with a number (people/zechariah-14, places/bethel-1) — search first if unsure. A collection path such as \"themes\" or \"sources\" returns what that collection holds.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"example":"people/moses","description":"Document path spanning one to three segments. Slashes may be sent raw or percent-encoded; both resolve."},{"name":"body","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Include the full markdown body."},{"name":"backlinks","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":500,"default":100},"description":"How many backlinks to return. `backlinkCount` always reports the true total."}],"responses":{"200":{"description":"The document, its relations, links and backlinks.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entity"}}}},"400":{"description":"The reference or parameter could not be parsed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/family/{path}":{"get":{"operationId":"get_family","summary":"Get a person's family and line of descent","description":"Parents, children, siblings and spouses for any person, and with `generations` above 1 the line of descent — ancestors and descendants gathered one generation at a time. This is the endpoint for a genealogy, lineage or ancestry question: \"who were Boaz's ancestors\", \"trace David's line\", \"who did Ruth marry\".\n\nUse this rather than reading relations off /entity. The corpus contains no `child-of` edge at all — parentage is recorded only on the parent's document — so a person's own `parent-of` relations are their CHILDREN, and reading them as parents inverts the family tree. This endpoint does the inversion.\n\nCalled family rather than genealogy because it returns kinship as well as descent, and because two other things here own that word. The 680 `ancestor-of` edges assert descent across an unknown number of generations, so they cannot be composed into a generation-by-generation tree and are excluded from this one — read them off /entity if you want them. And the genealogy PASSAGES — Genesis 5 and 10, Ruth 4, Matthew 1, Luke 3 — are indexed as a theme at /entity/themes/genealogy.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"example":"people/moses"},{"name":"generations","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":10,"default":1},"description":"Above 1, also returns ancestors and descendants generation by generation."}],"responses":{"200":{"description":"The person and their immediate family.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Family"}}}},"400":{"description":"The reference or parameter could not be parsed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/graph/{path}":{"get":{"operationId":"get_graph_neighborhood","summary":"Get a graph neighbourhood","description":"Everything within N hops of a document, WITH the edges that connect them and the predicate on each. Useful for asking what a passage, person or theme is connected to without fetching each document.\n\nFilter with `type` to ask a shaped question — the places near an event, the people in an epoch — and with `predicate` to keep only one kind of edge. Depth 1 is direct links; depth 3 gets large quickly and is capped by limit. See /vocabulary for what each predicate means.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"example":"people/david"},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":3,"default":1}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["Person","Place","Theme","Lexeme","Commandment","Event","Epoch","Book","Chapter","Source","Dataset","Relation Vocabulary"]},"description":"Restrict to one collection. Plurals and folder names also resolve (\"themes\", \"sa/events\")."},{"name":"predicate","in":"query","required":false,"schema":{"type":"string"},"example":"develops","description":"Keep only edges with this predicate."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":600,"default":200}}],"responses":{"200":{"description":"Nodes and edges within the requested radius.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Neighbourhood"}}}},"400":{"description":"The reference or parameter could not be parsed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Licence":{"type":"object","description":"Carried on every response. The obligation is inherited by anyone who redistributes the data, not discharged by us. `document` is the licence of the specific document fetched, which is CC-BY-SA-4.0 for anything under sa/ and is the value to honour over the blanket statement.","properties":{"text":{"type":"string"},"data":{"type":"string"},"document":{"type":"string","description":"SPDX-style id for this document, e.g. \"CC-BY-4.0\"."},"shareAlike":{"type":"string"},"reason":{"type":"string"},"attribution":{"type":"string","format":"uri"}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"available":{"type":"array","items":{"type":"string"},"description":"Valid values, when the failure was an unrecognised enum."}}},"NodeSummary":{"type":"object","required":["id","title","type","degree"],"properties":{"id":{"type":"string","description":"Site route, e.g. \"/people/moses\". Strip the leading slash to use it as a path."},"title":{"type":"string"},"type":{"type":"string","enum":["Person","Place","Theme","Lexeme","Commandment","Event","Epoch","Book","Chapter","Source","Dataset","Relation Vocabulary"],"description":"Which collection the document belongs to."},"description":{"type":"string"},"degree":{"type":"integer","description":"Number of graph edges touching this document."},"lat":{"type":"number","description":"Places only."},"lon":{"type":"number","description":"Places only."},"strongs":{"type":"string","description":"Lexemes only, e.g. \"H430\"."},"osis":{"type":"string","description":"Scripture documents and commandments only."},"shareAlike":{"type":"boolean","description":"Present, and always true, only on CC BY-SA 4.0 documents. A listing has one licence block for many documents and cannot say which are viral, so it says it here instead. Filtering on the \"/sa/\" id prefix is NOT equivalent — it misses /sources/theographic."}}},"Verse":{"type":"object","required":["verse","osis","text"],"properties":{"verse":{"type":"integer"},"osis":{"type":"string"},"text":{"type":"string","description":"Empty when the Berean edition omits the verse."},"omitted":{"type":"boolean","description":"Present, and always true, only for omitted verses."},"speaker":{"type":"string","description":"Attributed speaker, where the corpus records one."}}},"Relation":{"type":"object","description":"An outbound typed edge. Predicates are defined at GET /vocabulary.","properties":{"predicate":{"type":"string"},"from":{"type":"string","description":"The verse the edge is anchored to, for chapter documents."},"target":{"type":"string"},"targetType":{"type":"string"},"title":{"type":"string"},"surface":{"type":"string","description":"The exact words in the verse that name the target, e.g. \"Rabbi\"."},"note":{"type":"string","description":"The source's own sub-heading for the connection."},"verses":{"type":"integer"},"source":{"type":"string","description":"Which upstream dataset asserted this edge."}},"additionalProperties":true},"InboundRelation":{"type":"object","description":"An edge asserted by another document about this one, restated from this end. `predicate` is the inverse; `statedAs` is how the other document wrote it.","properties":{"predicate":{"type":"string","example":"child-of"},"statedAs":{"type":"string","example":"parent-of"},"source":{"type":"string","description":"Route of the document that asserts the edge."},"title":{"type":"string"},"sourceType":{"type":"string"},"from":{"type":"string"},"surface":{"type":"string"},"note":{"type":"string"}}},"Source":{"type":"object","required":["resource"],"properties":{"id":{"type":"string"},"resource":{"type":"string"},"title":{"type":"string"},"author":{"type":"string"},"usage_count":{"type":"integer"},"last_modified":{"type":"string"}}},"Passage":{"type":"object","required":["osis","reference","url","verses","chapter","licence"],"properties":{"osis":{"type":"string"},"reference":{"type":"string","description":"Human-readable, e.g. \"John 3:16\" or \"John 3:16-18\"."},"url":{"type":"string","description":"Site route with a verse anchor."},"book":{"type":"object","additionalProperties":true},"text":{"type":"string","description":"Single-verse requests only; use `verses` in general."},"omitted":{"type":"boolean"},"verses":{"type":"array","items":{"$ref":"#/components/schemas/Verse"}},"context":{"type":"object","description":"What the requested verses touch, and what touches them.","properties":{"people":{"type":"array","items":{"type":"object","additionalProperties":true}},"places":{"type":"array","items":{"type":"object","additionalProperties":true}},"themes":{"type":"array","items":{"type":"object","additionalProperties":true}},"crossReferences":{"type":"array","items":{"type":"object","additionalProperties":true}},"referencedBy":{"type":"array","description":"Documents that point AT these verses — commandments stated here, events and epochs narrated here, lexemes first attested here.","items":{"type":"object","additionalProperties":true}}}},"chapter":{"type":"object","properties":{"osis":{"type":"string"},"url":{"type":"string"},"verseCount":{"type":"integer"},"previous":{"type":["string","null"]},"next":{"type":["string","null"]}}},"licence":{"$ref":"#/components/schemas/Licence"}}},"Chapter":{"type":"object","required":["id","osis","book","chapter","verses","licence"],"properties":{"id":{"type":"string"},"osis":{"type":"string"},"book":{"type":"object","properties":{"id":{"type":"string","description":"OSIS book id, e.g. \"John\"."},"name":{"type":"string"},"slug":{"type":"string"},"testament":{"type":"string","enum":["OT","NT"]},"chapters":{"type":"integer"}}},"chapter":{"type":"integer"},"translation":{"type":"string","const":"BSB"},"versification":{"type":"string","const":"kjv"},"verseCount":{"type":"integer"},"verses":{"type":"array","items":{"$ref":"#/components/schemas/Verse"}},"speakers":{"type":"array","items":true},"omittedVerses":{"type":"array","items":true},"previous":{"type":["string","null"],"description":"OSIS id of the previous chapter."},"next":{"type":["string","null"]},"relations":{"type":"array","items":{"$ref":"#/components/schemas/Relation"}},"backlinkCount":{"type":"integer","description":"True total, before the cap."},"backlinksTruncated":{"type":"boolean"},"backlinks":{"type":"array","items":{"$ref":"#/components/schemas/NodeSummary"},"description":"Capped at 100, ranked so non-chapter documents survive the cut."},"licence":{"$ref":"#/components/schemas/Licence"}}},"Entity":{"allOf":[{"$ref":"#/components/schemas/NodeSummary"},{"type":"object","properties":{"collection":{"type":"object","properties":{"type":{"type":"string"},"label":{"type":"string"},"route":{"type":"string"}}},"tags":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["draft","stable","deprecated"]},"trustTier":{"type":"string","enum":["unverified","machine-confirmed","human-reviewed"]},"stale":{"type":"boolean"},"words":{"type":"integer"},"sources":{"type":"array","items":{"$ref":"#/components/schemas/Source"}},"generated":{"type":"object","properties":{"by":{"type":"string"},"at":{"type":"string"}}},"extension":{"type":"object","description":"The x-bk block: the type-specific structured fields. Places carry lat, lon, identifications[] and name_variants; lexemes carry strongs, word, part_of_speech, occurrences and first_occurrence; epochs carry start_year_ah, end_year_ah, length_years and epoch_type; commandments carry commandment_number, polarity, osis and parashah; people carry sex, tribe, verse_count, first_reference and last_reference. `relations` here is the raw outbound mirror — prefer the resolved `relations` field above it.","additionalProperties":true},"relations":{"type":"object","properties":{"outbound":{"type":"array","items":{"$ref":"#/components/schemas/Relation"}},"inbound":{"type":"array","items":{"$ref":"#/components/schemas/InboundRelation"}}}},"linkCount":{"type":"integer"},"links":{"type":"array","items":{"$ref":"#/components/schemas/NodeSummary"}},"backlinkCount":{"type":"integer","description":"True total, before the cap."},"backlinksTruncated":{"type":"boolean"},"backlinks":{"type":"array","items":{"$ref":"#/components/schemas/NodeSummary"}},"body":{"type":"string","description":"Markdown source. Only when body=true."},"licence":{"$ref":"#/components/schemas/Licence"}}}]},"Listing":{"type":"object","required":["total","count","results"],"properties":{"type":{"type":"string"},"collection":{"type":"string","description":"Site route for the browse page."},"tag":{"type":"string"},"sort":{"type":"string"},"total":{"type":"integer","description":"How many documents matched, before paging."},"offset":{"type":"integer"},"count":{"type":"integer","description":"How many are in this page."},"hasMore":{"type":"boolean"},"results":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/NodeSummary"},{"type":"object","description":"Plus the sortable fields of the collection being listed.","properties":{"startYearAH":{"type":"integer"},"endYearAH":{"type":"integer"},"lengthYears":{"type":"integer"},"epochType":{"type":"string"},"number":{"type":"integer","description":"Commandment number."},"polarity":{"type":"string","enum":["positive","negative"]},"verseCount":{"type":"integer"},"occurrences":{"type":"integer"}}}]}},"licence":{"$ref":"#/components/schemas/Licence"}}},"CrossReferences":{"type":"object","required":["osis","count","references","licence"],"properties":{"osis":{"type":"string"},"minVotes":{"type":"integer"},"count":{"type":"integer"},"note":{"type":"string","description":"Scope caveat: only materialised references are returned."},"threshold":{"type":"integer","description":"Vote floor applied when the bundle was built."},"references":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","description":"The verse the reference is anchored to."},"target":{"type":"string","description":"Site route of the referenced passage."},"votes":{"type":"integer","description":"Approximate crowd support, recovered from stored confidence."}}}},"licence":{"$ref":"#/components/schemas/Licence"}}},"SearchResults":{"type":"object","required":["query","total","count","results"],"properties":{"query":{"type":"string"},"type":{"type":"string"},"tag":{"type":"string"},"total":{"type":"integer","description":"How many matched, before paging."},"offset":{"type":"integer"},"count":{"type":"integer"},"results":{"type":"array","items":{"$ref":"#/components/schemas/NodeSummary"}},"licence":{"$ref":"#/components/schemas/Licence"}}},"ScriptureResults":{"type":"object","required":["query","total","count","hits"],"properties":{"query":{"type":"string"},"total":{"type":"integer"},"offset":{"type":"integer"},"count":{"type":"integer"},"terms":{"type":"array","items":{"type":"string"},"description":"How the query was tokenised."},"phrases":{"type":"array","items":{"type":"string"},"description":"Quoted runs, required adjacent."},"translation":{"type":"string","const":"BSB"},"hits":{"type":"array","items":{"type":"object","properties":{"osis":{"type":"string"},"reference":{"type":"string"},"url":{"type":"string"},"text":{"type":"string"},"book":{"type":"string"},"testament":{"type":"string","enum":["OT","NT"]}}}},"licence":{"$ref":"#/components/schemas/Licence"}}},"Family":{"type":"object","required":["person","parents","children","siblings","spouses"],"properties":{"person":{"$ref":"#/components/schemas/NodeSummary"},"parents":{"type":"array","items":{"$ref":"#/components/schemas/NodeSummary"}},"children":{"type":"array","items":{"$ref":"#/components/schemas/NodeSummary"}},"siblings":{"type":"array","items":{"$ref":"#/components/schemas/NodeSummary"}},"spouses":{"type":"array","items":{"$ref":"#/components/schemas/NodeSummary"}},"ancestors":{"type":"array","description":"Only when generations > 1. One entry per generation above.","items":{"type":"object","properties":{"generation":{"type":"integer"},"people":{"type":"array","items":{"$ref":"#/components/schemas/NodeSummary"}}}}},"descendants":{"type":"array","items":{"type":"object","additionalProperties":true}},"note":{"type":"string"},"licence":{"$ref":"#/components/schemas/Licence"}}},"Connections":{"type":"object","properties":{"totals":{"type":"object","properties":{"references":{"type":"integer","description":"Rows in the corpus that resolved to a chapter pair."},"distinctPairs":{"type":"integer"},"arcs":{"type":"integer","description":"Drawable arcs — pairs minus self-pairs."},"selfPairs":{"type":"integer","description":"A chapter referencing itself."},"crossTestament":{"type":"integer"},"chapters":{"type":"integer"},"generated":{"type":"string","format":"date-time"},"source":{"type":"string"}}},"topChapters":{"type":"array","items":{"type":"object","additionalProperties":true}},"topBookPairs":{"type":"array","items":{"type":"object","additionalProperties":true}},"book":{"type":"object","additionalProperties":true,"description":"Only when book= was given."},"referencesOut":{"type":"array","description":"This book citing others, strongest first. Only when book= was given.","items":{"type":"object","additionalProperties":true}},"referencesIn":{"type":"array","items":{"type":"object","additionalProperties":true}},"chapter":{"type":"object","additionalProperties":true,"description":"Only when osis= was given."},"note":{"type":"string"},"licence":{"$ref":"#/components/schemas/Licence"}}},"Nearby":{"type":"object","required":["centre","radiusKm","total","results"],"properties":{"origin":{"$ref":"#/components/schemas/NodeSummary"},"centre":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}}},"radiusKm":{"type":"integer"},"total":{"type":"integer","description":"How many places fell inside the radius, before the limit."},"count":{"type":"integer"},"results":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/NodeSummary"},{"type":"object","properties":{"distanceKm":{"type":"number"}}}]}},"note":{"type":"string"},"licence":{"$ref":"#/components/schemas/Licence"}}},"Changelog":{"type":"object","properties":{"bundleGenerated":{"type":"string","format":"date-time","description":"When the knowledge base was last ingested. The timestamp to cite or cache on."},"indexBuilt":{"type":"string","format":"date-time","description":"When this server process built its index. Changes on every restart."},"okfVersion":{"type":"string"},"log":{"type":["string","null"],"description":"Markdown source of the bundle log."},"note":{"type":"string"},"url":{"type":"string"},"licence":{"$ref":"#/components/schemas/Licence"}}},"Neighbourhood":{"type":"object","required":["root","depth","count","nodes","edges","licence"],"properties":{"root":{"type":"string"},"depth":{"type":"integer"},"count":{"type":"integer"},"truncated":{"type":"boolean","description":"True when limit cut the walk short."},"nodes":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/NodeSummary"},{"type":"object","properties":{"distance":{"type":"integer","description":"Hops from root."}}}]}},"edgeCount":{"type":"integer"},"edges":{"type":"array","description":"Only edges with both ends inside the returned node set.","items":{"type":"object","properties":{"source":{"type":"string"},"target":{"type":"string"},"predicate":{"type":"string","description":"Absent for untyped body links."},"kind":{"type":"string","enum":["relation","link","source"]}}}},"licence":{"$ref":"#/components/schemas/Licence"}}},"Vocabulary":{"type":"object","properties":{"predicates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"heading":{"type":"string"},"inverse":{"type":"string"},"symmetric":{"type":"boolean"},"domain":{"type":"string"},"range":{"type":"string"},"edges":{"type":"integer","description":"How many edges in the bundle use it."}}}},"undeclared":{"type":"array","description":"Predicates present in the data but absent from the published vocabulary.","items":{"type":"object","additionalProperties":true}},"note":{"type":"string"},"books":{"type":"array","items":{"type":"object","properties":{"osisId":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"testament":{"type":"string","enum":["OT","NT"]},"order":{"type":"integer"},"chapters":{"type":"integer"},"path":{"type":"string"}}}},"licence":{"$ref":"#/components/schemas/Licence"}}},"Tags":{"type":"object","properties":{"total":{"type":"integer"},"offset":{"type":"integer"},"count":{"type":"integer"},"tags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"count":{"type":"integer"}}}},"note":{"type":"string"},"licence":{"$ref":"#/components/schemas/Licence"}}},"Stats":{"type":"object","properties":{"okfVersion":{"type":"string"},"notes":{"type":"integer"},"edges":{"type":"integer"},"tags":{"type":"integer"},"words":{"type":"integer"},"orphans":{"type":"integer"},"brokenLinks":{"type":"integer"},"verses":{"type":"integer"},"chapters":{"type":"integer"},"books":{"type":"integer"},"collections":{"type":"array","description":"Every collection, its size and how to page through it.","items":{"type":"object","properties":{"type":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"},"folder":{"type":"string"},"route":{"type":"string"},"example":{"type":"string"},"description":{"type":"string"}}}},"types":{"type":"array","items":{"type":"string"}},"topTags":{"type":"array","items":{"type":"object","additionalProperties":true}},"generated":{"type":"string","format":"date-time"},"generatedNote":{"type":"string"},"licence":{"$ref":"#/components/schemas/Licence"}}}}},"x-licence":{"text":"Berean Standard Bible (public domain)","data":"CC BY 4.0 — see /attribution for the full source list and required credits","shareAlike":"Documents under /sa/ are CC BY-SA 4.0; anything derived from them inherits share-alike.","attribution":"https://vineverse.bible/attribution"},"x-mcp":"https://vineverse.bible/api/mcp"}