Open specification, version 0.1

The Kingdom Protocol

The Kingdom Protocol is an open, public description of the things the Body of Christ does together: a gathering, a church, a ministry, a need, a testimony, a prayer answered. It gives each one a stable name, a shape any machine can read, and rules about consent that travel with it, so a church website, a smart display, an assistant or another app can help a person find their family in Christ without anyone's private life leaving the room.

Why a protocol, and why now

When one member of the Body of Christ needs another, the question is how quickly they can find each other. Most of the answer is not on any one website. A church posts its prayer night on its own page, a ministry in Rwanda needs school supplies, a believer in Seattle would gladly pray with a stranger, and a person in a hard season asks an assistant at two in the morning whether anyone is gathering tonight. Each of those facts lives somewhere, in a shape only one system understands.

The Kingdom Protocol is a small, honest vocabulary for those facts. It names thirteen objects, gives each a stable identifier that survives a renamed page or a new website, describes each field a machine may read, and states, in the same document, the consent each object carries. The Living Bread implements it first, on its own public data, so the protocol is never a promise on paper: every object below is readable today through a live door on discover.living-bread.org, and every rule below is enforced in the database function that serves it, not only in this text.

It is deliberately small. Version 0.1 is read only. It does not move private prayer between systems, it does not let a stranger write into anyone's church, and it does not try to be a social network. It is a way for the public good news of what Christ is doing among His people to be found, quoted rightly, and answered in person.

The thirteen objects

Each object has a JSON Schema (draft 2020-12) at a permanent address, a stable identifier, and a mapping to a schema.org type so search engines and assistants that already understand schema.org understand it too.

ObjectIdentifierschema.orgSchema
Gatheringlb:gathering:<uuid>schema:Eventgathering.schema.json
Churchlb:church:<uuid> (a church on the app) or lb:church:<slug> and lb:church:<country>/<slug> (the open directory)schema:Churchchurch.schema.json
Ministrylb:ministry:<slug>schema:NGOministry.schema.json
Communitylb:community:<uuid>schema:Organizationcommunity.schema.json
Needlb:need:<uuid>schema:Demandneed.schema.json
ServiceOpportunitylb:service:<uuid>schema:Demandservice-opportunity.schema.json
Offeringlb:offering:<handle>/<slug>schema:Thingoffering.schema.json
Personlb:profile:<handle>schema:Personperson.schema.json
Testimonylb:testimony:<uuid>schema:CreativeWorktestimony.schema.json
Prayerlb:prayer:<uuid>schema:CreativeWorkprayer.schema.json
ScriptureReferencelb:scripture:verse-<book>-<chapter>-<verse>schema:Quotationscripture-reference.schema.json
Placelb:place:gh-<geohash3> (prayer regions) and lb:city:<region>-<city> (the registry)schema:Placeplace.schema.json
Responselb:response:<kind>/<uuid>schema:InteractionCounterresponse.schema.json

The JSON-LD context at /protocol/v0.1/context.jsonld maps the plain field names to schema.org terms, so the plain JSON every door returns is already linked data. The manifest at /protocol/v0.1/index.json lists every schema, the context, and the doors.

Identifiers that do not break

Every object is named by a URN in the lb: namespace, the same namespace as the Kingdom Graph registry that already names churches, cities, regions and the people and places of the Bible. A URN is independent of any URL: a church may move its website and a page may be renamed, and the name stays the same. Alongside the URN, every object has a canonical data URL on discover.living-bread.org, and where a human page exists, a page on living-bread.org.

Resolve any of them with GET https://discover.living-bread.org/api/resolve/{urn}. Gatherings, app churches, communities, needs, testimonies and prayers use their database id; ministries use their slug; a public profile uses its handle. Two names deserve care. A believer's public profile is lb:profile:, never lb:person, because the registry uses lb:person for the people of Scripture. And a gathering is lb:gathering, never lb:event, because the registry uses lb:event for events of sacred history, such as the Resurrection.

Consent travels with the object

A protocol that only described shapes would be dangerous here, because some of the most intimate words a person ever writes are prayers. So every object carries its visibility rule, and the database function that serves it enforces that rule before anything leaves the house:

Attribution, provenance and license

Directory data (churches, gatherings, needs, ministries) is offered under Creative Commons Attribution 4.0: use it, build on it, and say where it came from. Words written by people, a testimony, a prayer, a bio, remain theirs. You may quote them with attribution, as a reader quotes a letter, but you may not train a model on them, sell them, or use them to target anyone, in keeping with the Data Covenant.

Where a fact came from somewhere else, the object says so. A gathering mirrored from a church's own public calendar carries a source with its name, its URL and the moment it was last verified. A field nobody knows is null, never a guess.

Deletion and moderation

When a person withdraws something, or a moderator hides it, it disappears from every door at the next read. There is no copy to chase: the doors read the live database. Responses are cached for at most an hour for objects and five minutes for lists, so a withdrawn object is gone everywhere within that window. A webhook that already delivered a payload never resends it, and the protocol asks every consumer to honour a 404 by deleting what it holds.

Requests that arrive through the Pray for Me button on a church or ministry website are held for that church's leaders to read before anyone else sees them, unless the church or ministry is verified and chose to publish without review. Every email sent to a person who asked carries a link that withdraws the request.

Federation, honestly

Version 0.1 is read only. Prayer moves between a church website and the prayer network in exactly one way: a person types a request into a Pray for Me button on that church's own site, with their own hands, knowing it goes to that church's people. Private prayer is never federated. A future version may let two systems exchange public objects in both directions; it will be built only when the consent model for it is as strong as this one.

The doors

Every object is served as JSON, and as JSON-LD with ?format=jsonld or an Accept: application/ld+json header, from https://discover.living-bread.org/api. Lists, objects and the device payload carry ETags and Cache-Control, CORS is open for GET, and each network address may make 120 requests a minute. Feeds in RSS, Atom and JSON Feed, and ICS calendars for gatherings, are under /feeds. The full reference, with examples in curl, JavaScript and Python, is on the developers page, and the live public map built only from these doors is Praying now.

An example: one gathering

The plain JSON a door returns for a public gathering:

{
  "id": "a0ece2e5-1ed7-4565-9963-15fc16b6a6c0",
  "title": "Prayer night",
  "kind": "prayer",
  "starts_at": "2026-10-10T01:00:00Z",
  "timezone": "America/Los_Angeles",
  "is_online": false,
  "place_name": "Fellowship hall",
  "city": "Seattle",
  "region": "WA",
  "country": "US",
  "lat": 47.61,
  "lon": -122.33,
  "host": {
    "kind": "church",
    "name": "A church",
    "verified": true
  },
  "status": "scheduled",
  "updated_at": "2026-10-05T08:00:00Z"
}

And the same gathering as JSON-LD, which a search engine or assistant reads as a schema.org Event:

{
  "@context": "https://schema.org",
  "@type": "Event",
  "@id": "https://discover.living-bread.org/api/gathering/<uuid>",
  "identifier": "lb:gathering:<uuid>",
  "additionalType": "https://living-bread.org/protocol/v0.1/gathering.schema.json",
  "name": "Prayer night",
  "startDate": "2026-10-10T01:00:00Z",
  "eventStatus": "https://schema.org/EventScheduled",
  "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
  "location": {
    "@type": "Place",
    "name": "Fellowship hall",
    "address": {
      "@type": "PostalAddress",
      "addressLocality": "Seattle",
      "addressRegion": "WA",
      "addressCountry": "US"
    }
  },
  "organizer": {
    "@type": "Church",
    "name": "A church"
  }
}

Every object, field by field

Gathering

A public Christian gathering: a service, a prayer night, a Bible study, a meal, a day of service. Only gatherings their host made public. A gathering that hides its address hides its city too.

Identifier: lb:gathering:<uuid>. Read through: /api/gathering/{uuid}, /api/gatherings, the feeds and ICS calendars. Linked data type: schema.org Event.

FieldTypeMeaning
idstringStable id
slugstringReadable slug
titlestringWhat it is called
descriptionstringUp to 4,000 characters
kindstringservice, study, outreach, prayer or other
categorystringThe host's category
starts_atstringStart, UTC
ends_atstringEnd, UTC
timezonestringIANA time zone when the host gave one
attendance_modestringIn person, online or both
is_onlinebooleanOnline gathering
place_namestringVenue name, never a private home
neighborhoodstringNeighborhood
citystringCity (null when the address is private)
regionstringState or region
countrystringISO country code
latnumberLatitude, three decimals, null when private
lonnumberLongitude, three decimals, null when private
online_urlstringJoin or livestream link when online
external_urlstringHost's own page
image_urlstringImage
is_freebooleanFree to attend
cost_labelstringCost in the host's words
languagestringLanguage
beginner_friendlybooleanWelcoming to newcomers
childcarebooleanChildcare offered
accessibilityarrayAccessibility notes
scripture_refstringA Scripture reference the host chose
hostobjectkind (church, community or believer), id, name, verified; a person host is only ever A believer
sourceobjectname, url, last_verified_at when mirrored from a church's own calendar
statusstringscheduled, published or cancelled
updated_atstringLast change

Church

A local church. The app's churches carry what a verified church said about itself; the open directory carries public data from OpenStreetMap and Wikidata. Verified and unclaimed listings are always distinguished.

Identifier: lb:church:<uuid> (a church on the app) or lb:church:<slug> and lb:church:<country>/<slug> (the open directory). Read through: /api/church/{uuid}, /api/church/{country}/{slug}, /api/nearby. Linked data type: schema.org Church.

FieldTypeMeaning
idstringStable id
namestringName
denominationstringTradition or denomination
citystringCity
regionstringState or region
countrystringCountry
latnumberLatitude, four decimals (a public building)
lonnumberLongitude, four decimals
websitestringWebsite
descriptionstringThe church's own words
service_timesarrayService times as the church wrote them
languagesarrayLanguages of worship
accessibilitystringAccessibility
logo_urlstringLogo
cover_urlstringCover image
social_linksobjectWhere its people already talk (WhatsApp group, Telegram, and the rest)
verifiedbooleanVerified church on The Living Bread
claimedbooleanClaimed by its leaders
upcoming_gatheringsintegerHow many public gatherings are ahead
updated_atstringLast change

Ministry

A ministry or mission organization on The Living Bread. Public profile fields only: never contact details, never its people.

Identifier: lb:ministry:<slug>. Read through: /api/ministry/{slug}, /api/ministries. Linked data type: schema.org NGO.

FieldTypeMeaning
idstringStable id
slugstringSlug
namestringName
missionstringIts mission in its own words
citystringCity
regionstringRegion
countrystringCountry
websitestringWebsite
logo_urlstringLogo
banner_urlstringBanner
verified_levelstringunverified, organization_verified or living_bread_partner
verifiedbooleanVerified
causesarrayCauses it serves
workarrayKinds of work
social_linksobjectWhere its people already talk
open_needsintegerVerified open needs
updated_atstringLast change

Community

A discoverable group of the kinds already public on the web: prayer, discipleship and mission. Recovery, grief, youth and every other group stay out of the protocol.

Identifier: lb:community:<uuid>. Read through: /api/community/{uuid}, /api/communities. Linked data type: schema.org Organization.

FieldTypeMeaning
idstringStable id
namestringName
kindstringprayer, discipleship or mission
descriptionstringUp to 2,000 characters
citystringCity
countrystringCountry
is_globalbooleanOpen to anyone anywhere
member_countintegerMembers
verifiedbooleanVerified
join_policystringHow a person joins
social_linksobjectWhere it already talks
created_atstringCreated

Need

A real need a ministry published and The Living Bread reviewed and verified. A city and a country, never coordinates.

Identifier: lb:need:<uuid>. Read through: /api/need/{uuid}, /api/needs. Linked data type: schema.org Demand.

FieldTypeMeaning
idstringStable id
titlestringWhat is needed
descriptionstringUp to 3,000 characters
categorystringCategory
urgencystringUrgency
citystringCity
regionstringRegion
countrystringCountry
localbooleanCan be met in person
remotebooleanCan be met from anywhere
fundingbooleanCan be met by giving
quantityintegerHow many are needed
fulfilled_countintegerHow many are met
statusstringopen, matching, in_progress or fulfilled
verificationstringAlways verified in the protocol
created_atstringCreated
fulfilled_atstringMet
updated_atstringLast change
ministryobjectid, slug, name, verified

ServiceOpportunity

A verified need that asks for people, in person or from anywhere. The same record as its Need, seen from the side of the one who wants to serve.

Identifier: lb:service:<uuid>. Read through: /api/service-opportunities. Linked data type: schema.org Demand.

FieldTypeMeaning
idstringThe need's id
titlestringWhat is needed
descriptionstringDetails
categorystringCategory
urgencystringUrgency
citystringCity
regionstringRegion
countrystringCountry
localbooleanServe in person
remotebooleanServe from anywhere
statusstringStatus
ministryobjectid, slug, name, verified

Offering

Something a believer offers to the Body (prayer, listening, hospitality, a skill), only when their profile is public and they left offerings visible. Never transactional, so never a schema.org Offer. No standalone listing in v0.1: a list of people by what they offer is a privacy decision for a later version.

Identifier: lb:offering:<handle>/<slug>. Read through: inside /api/person/{handle}. Linked data type: schema.org Thing.

FieldTypeMeaning
labelstringWhat is offered, in the person's words
handlestringThe public profile it belongs to
urnstringlb:offering:<handle>/<slug>

Person

A believer's public profile, only when they made it public, only the fields they left on, never a minor, never anyone in a closed land. lb:profile is used, not lb:person, because the Kingdom Graph uses lb:person for the people of the Bible.

Identifier: lb:profile:<handle>. Read through: /api/person/{handle}. Linked data type: schema.org Person.

FieldTypeMeaning
handlestringHandle
namestringName as shown
avatar_urlstringAvatar
is_pastorbooleanA verified pastor
biostringBio
scripture_refstringA Scripture reference they carry
church_namestringChurch
citystringCity, when shown
countrystringCountry, when shown
giftsarrayGifts
offeringsarrayWhat they offer (each an Offering)
linksobjectTheir links
updated_atstringLast change

Testimony

What Christ has done in someone's life, told by them, when the author's profile is public or they chose to be anonymous. Never a private group's post.

Identifier: lb:testimony:<uuid>. Read through: /api/testimony/{uuid}, /api/testimonies, /feeds/testimonies. Linked data type: schema.org CreativeWork.

FieldTypeMeaning
idstringStable id
bodystringThe testimony in the author's words
scripture_refstringReference the author attached
testimony_typestringType
journeystringJourney
authorobjectname (first name) and handle, or A believer
citystringCity when the author is public
responsesobjectprayed, amen, encouraged (counts)
created_atstringTold

Prayer

A prayer request or an answered prayer that already has a public door at /pray/<id>. Readable by id only. The answered ones are listed because the Wall of Answered Prayer lists them. Open prayer requests are never listed in bulk.

Identifier: lb:prayer:<uuid>. Read through: /api/prayer/{uuid} (by id only), /api/answered, /feeds/answered. Linked data type: schema.org CreativeWork.

FieldTypeMeaning
idstringStable id
kindstringprayer or answered
bodystringThe words
scripture_refstringReference attached
authorobjectname: a first name, or A believer
citystringCity unless anonymous
answeredbooleanAnswered
responsesobjectprayed, encouraged (counts)
created_atstringAsked

ScriptureReference

A passage of the Bible by reference, with its words read from the stored King James Version (public domain). The words are never typed by hand.

Identifier: lb:scripture:verse-<book>-<chapter>-<verse>. Read through: /api/scripture/{ref}. Linked data type: schema.org Quotation.

FieldTypeMeaning
refstringHuman reference, e.g. John 3:16
bookstringBook
chapterintegerChapter
versesarrayVerse numbers and words
textstringThe words, from the stored KJV
translationstringKJV
urlstringA page to read it in context

Place

A region where prayers were left at public places: a three character geohash cell, about 150 km across, shown only when three or more different people prayed there, never in a closed land, never a point.

Identifier: lb:place:gh-<geohash3> (prayer regions) and lb:city:<region>-<city> (the registry). Read through: /api/places. Linked data type: schema.org Place.

FieldTypeMeaning
cellstringGeohash, three characters
latnumberRegion centre, one decimal
lonnumberRegion centre, one decimal
peopleintegerDistinct people, three or more
prayersintegerPrayers left
last_atstringMost recent

Response

How the Body has answered a public object, as counts. Never names.

Identifier: lb:response:<kind>/<uuid>. Read through: /api/response/{kind}/{uuid}. Linked data type: schema.org InteractionCounter.

FieldTypeMeaning
subject_kindstringprayer, testimony or gathering
subject_idstringThe object
prayedintegerPeople who prayed
amenintegerAmens
encouragedintegerEncouragements
presentintegerDistinct people present with it
goingintegerPeople going to a gathering, when the host shows it

What the protocol will not carry

How a church website takes part

A church can take part today without writing any code. Its leaders open their dashboard in the app, add a Pray for Me button for their website, and paste one line into their site. A visitor who is carrying something can ask for prayer there; the request waits for the church's leaders, enters the church's own prayer network, and the person who asked can hear, later, how many people prayed. The same church's public gatherings are already a calendar any phone can subscribe to, and a feed any reader can follow.

A developer can read every public object, subscribe to feeds, put the current day's bread and the next gathering on a smart display through /api/now, or connect an assistant through the Model Context Protocol server. A verified church or ministry can receive signed webhooks about its own requests, gatherings and needs once webhooks open; they are built and not yet open.

Versioning

This is version 0.1. Fields may be added within a version; a field is never removed or renamed within a version, and a change of meaning is a new version at a new address. Schemas live at /protocol/v/ and old versions stay published.

Why this matters

The Living Bread exists so that people meet Christ, meet His family, pray, gather, serve, and then go and live it. A protocol is only plumbing. But plumbing decides whether water reaches a house. If a person asks a machine where to find others who will pray with them tonight, the right answer should be findable, true, and safe, and it should point past the machine to people and, through them, to Jesus Christ, who is God, who said that His disciples would be known by their love for one another (John 13:35).