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.
| Object | Identifier | schema.org | Schema |
|---|---|---|---|
| Gathering | lb:gathering:<uuid> | schema:Event | gathering.schema.json |
| Church | lb:church:<uuid> (a church on the app) or lb:church:<slug> and lb:church:<country>/<slug> (the open directory) | schema:Church | church.schema.json |
| Ministry | lb:ministry:<slug> | schema:NGO | ministry.schema.json |
| Community | lb:community:<uuid> | schema:Organization | community.schema.json |
| Need | lb:need:<uuid> | schema:Demand | need.schema.json |
| ServiceOpportunity | lb:service:<uuid> | schema:Demand | service-opportunity.schema.json |
| Offering | lb:offering:<handle>/<slug> | schema:Thing | offering.schema.json |
| Person | lb:profile:<handle> | schema:Person | person.schema.json |
| Testimony | lb:testimony:<uuid> | schema:CreativeWork | testimony.schema.json |
| Prayer | lb:prayer:<uuid> | schema:CreativeWork | prayer.schema.json |
| ScriptureReference | lb:scripture:verse-<book>-<chapter>-<verse> | schema:Quotation | scripture-reference.schema.json |
| Place | lb:place:gh-<geohash3> (prayer regions) and lb:city:<region>-<city> (the registry) | schema:Place | place.schema.json |
| Response | lb:response:<kind>/<uuid> | schema:InteractionCounter | response.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:
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:
- A gathering appears only when its host made it public. A gathering that keeps its address private keeps its city private too, and a private home is never published at any zoom.
- A community appears only when it is discoverable and is a prayer, discipleship or mission group. Recovery, grief, youth and every other kind of group never appear, whatever their settings.
- A person appears only when they made their profile public, and only the fields they left on. A minor never appears. Neither does anyone suspended or banned.
- A testimony appears only when its author's profile is public or they chose to be anonymous, and never when it was written inside a private group.
- A prayer is readable only by its id, and only when it already has a public door at /pray/
. Open prayer requests are never listed in bulk, by anyone, for any reason. Answered prayers are listed because the Wall of Answered Prayer already lists them. - A need appears only after The Living Bread reviewed and verified it, with a city and a country and never coordinates.
- A place is a region of about 150 km, shown only when three or more different people prayed there.
- Nothing at all is published from a land where following Jesus is dangerous. The protocol uses the same whole country list as the church directory, and when in doubt a country stays out.
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.
| Field | Type | Meaning |
|---|---|---|
id | string | Stable id |
slug | string | Readable slug |
title | string | What it is called |
description | string | Up to 4,000 characters |
kind | string | service, study, outreach, prayer or other |
category | string | The host's category |
starts_at | string | Start, UTC |
ends_at | string | End, UTC |
timezone | string | IANA time zone when the host gave one |
attendance_mode | string | In person, online or both |
is_online | boolean | Online gathering |
place_name | string | Venue name, never a private home |
neighborhood | string | Neighborhood |
city | string | City (null when the address is private) |
region | string | State or region |
country | string | ISO country code |
lat | number | Latitude, three decimals, null when private |
lon | number | Longitude, three decimals, null when private |
online_url | string | Join or livestream link when online |
external_url | string | Host's own page |
image_url | string | Image |
is_free | boolean | Free to attend |
cost_label | string | Cost in the host's words |
language | string | Language |
beginner_friendly | boolean | Welcoming to newcomers |
childcare | boolean | Childcare offered |
accessibility | array | Accessibility notes |
scripture_ref | string | A Scripture reference the host chose |
host | object | kind (church, community or believer), id, name, verified; a person host is only ever A believer |
source | object | name, url, last_verified_at when mirrored from a church's own calendar |
status | string | scheduled, published or cancelled |
updated_at | string | Last 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.
| Field | Type | Meaning |
|---|---|---|
id | string | Stable id |
name | string | Name |
denomination | string | Tradition or denomination |
city | string | City |
region | string | State or region |
country | string | Country |
lat | number | Latitude, four decimals (a public building) |
lon | number | Longitude, four decimals |
website | string | Website |
description | string | The church's own words |
service_times | array | Service times as the church wrote them |
languages | array | Languages of worship |
accessibility | string | Accessibility |
logo_url | string | Logo |
cover_url | string | Cover image |
social_links | object | Where its people already talk (WhatsApp group, Telegram, and the rest) |
verified | boolean | Verified church on The Living Bread |
claimed | boolean | Claimed by its leaders |
upcoming_gatherings | integer | How many public gatherings are ahead |
updated_at | string | Last 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.
| Field | Type | Meaning |
|---|---|---|
id | string | Stable id |
slug | string | Slug |
name | string | Name |
mission | string | Its mission in its own words |
city | string | City |
region | string | Region |
country | string | Country |
website | string | Website |
logo_url | string | Logo |
banner_url | string | Banner |
verified_level | string | unverified, organization_verified or living_bread_partner |
verified | boolean | Verified |
causes | array | Causes it serves |
work | array | Kinds of work |
social_links | object | Where its people already talk |
open_needs | integer | Verified open needs |
updated_at | string | Last 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.
| Field | Type | Meaning |
|---|---|---|
id | string | Stable id |
name | string | Name |
kind | string | prayer, discipleship or mission |
description | string | Up to 2,000 characters |
city | string | City |
country | string | Country |
is_global | boolean | Open to anyone anywhere |
member_count | integer | Members |
verified | boolean | Verified |
join_policy | string | How a person joins |
social_links | object | Where it already talks |
created_at | string | Created |
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.
| Field | Type | Meaning |
|---|---|---|
id | string | Stable id |
title | string | What is needed |
description | string | Up to 3,000 characters |
category | string | Category |
urgency | string | Urgency |
city | string | City |
region | string | Region |
country | string | Country |
local | boolean | Can be met in person |
remote | boolean | Can be met from anywhere |
funding | boolean | Can be met by giving |
quantity | integer | How many are needed |
fulfilled_count | integer | How many are met |
status | string | open, matching, in_progress or fulfilled |
verification | string | Always verified in the protocol |
created_at | string | Created |
fulfilled_at | string | Met |
updated_at | string | Last change |
ministry | object | id, 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.
| Field | Type | Meaning |
|---|---|---|
id | string | The need's id |
title | string | What is needed |
description | string | Details |
category | string | Category |
urgency | string | Urgency |
city | string | City |
region | string | Region |
country | string | Country |
local | boolean | Serve in person |
remote | boolean | Serve from anywhere |
status | string | Status |
ministry | object | id, 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.
| Field | Type | Meaning |
|---|---|---|
label | string | What is offered, in the person's words |
handle | string | The public profile it belongs to |
urn | string | lb: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.
| Field | Type | Meaning |
|---|---|---|
handle | string | Handle |
name | string | Name as shown |
avatar_url | string | Avatar |
is_pastor | boolean | A verified pastor |
bio | string | Bio |
scripture_ref | string | A Scripture reference they carry |
church_name | string | Church |
city | string | City, when shown |
country | string | Country, when shown |
gifts | array | Gifts |
offerings | array | What they offer (each an Offering) |
links | object | Their links |
updated_at | string | Last 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.
| Field | Type | Meaning |
|---|---|---|
id | string | Stable id |
body | string | The testimony in the author's words |
scripture_ref | string | Reference the author attached |
testimony_type | string | Type |
journey | string | Journey |
author | object | name (first name) and handle, or A believer |
city | string | City when the author is public |
responses | object | prayed, amen, encouraged (counts) |
created_at | string | Told |
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.
| Field | Type | Meaning |
|---|---|---|
id | string | Stable id |
kind | string | prayer or answered |
body | string | The words |
scripture_ref | string | Reference attached |
author | object | name: a first name, or A believer |
city | string | City unless anonymous |
answered | boolean | Answered |
responses | object | prayed, encouraged (counts) |
created_at | string | Asked |
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.
| Field | Type | Meaning |
|---|---|---|
ref | string | Human reference, e.g. John 3:16 |
book | string | Book |
chapter | integer | Chapter |
verses | array | Verse numbers and words |
text | string | The words, from the stored KJV |
translation | string | KJV |
url | string | A 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.
| Field | Type | Meaning |
|---|---|---|
cell | string | Geohash, three characters |
lat | number | Region centre, one decimal |
lon | number | Region centre, one decimal |
people | integer | Distinct people, three or more |
prayers | integer | Prayers left |
last_at | string | Most 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.
| Field | Type | Meaning |
|---|---|---|
subject_kind | string | prayer, testimony or gathering |
subject_id | string | The object |
prayed | integer | People who prayed |
amen | integer | Amens |
encouraged | integer | Encouragements |
present | integer | Distinct people present with it |
going | integer | People going to a gathering, when the host shows it |
What the protocol will not carry
- Open prayer requests as a list, or any private prayer, ever.
- Precise locations of people, homes, or prayers left at places.
- Anyone under eighteen.
- Anything from a closed land.
- Private groups, and recovery, grief, youth, family and support groups of any visibility.
- Email addresses, phone numbers, or any contact detail of a person.
- Scores, rankings, or any measure of a person's faith. The protocol counts acts, never people's worth.
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
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).