Reference
What you can license
137 components across three funnels, and 53 endpoints. Every table on this page is generated from the same registry the engine authorises against, so a documented tier cannot drift from an enforced one.
A route declared before its handler exists answers 501 and says so, rather than 404 — there are none of those right now.
Three funnels, derived rather than chosen
What a component costs to buy is decided by whether using it involves personal data, and how. Not by its price and not by its tier — a tier says how dangerous a capability is to hand over, which is a different question from what paperwork it needs.
Card, no conversation 47 components
No personal data in, none out. Sellable to a stranger with a card, instantly.
Card and a click-through agreement 53 components
Personal data goes in and nothing about a person is read from or written to the ledger. A data-processing agreement is needed and a capsule is not, because there is no stored model to project: you already have the words and are asking us about them. One thing is kept: a stateless turn your canon could not answer leaves the question on your coverage list, with nobody attached, for 90 days unless you change it — then the words are deleted and only the count stays.
Contract, and the person's own authorisation 37 components
Reads or writes a person's model. Needs a capsule, and a capsule needs that person to authorise it. Not self-serve at any price, which is the argument of the architecture rather than a policy somebody set.
Endpoints
Each names the component it authorises against. That is not documentation of the implementation — it is the implementation: the middleware reads the component off the route rather than from anything a handler passed, so a handler cannot check the wrong one.
adaptations
GET /v1/adaptations | Published adaptations of approved canon, for a channel to show. | marketing.adaptations.read | |
Examplescurl curl -X GET https://api.boethios.ai/v1/adaptations \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/adaptations", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/adaptations",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
canon
POST /v1/canon/search | Fused retrieval over your corpus, with provenance. | retrieval.search | |
Examplescurl curl -X POST https://api.boethios.ai/v1/canon/search \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"annual leave entitlement","limit":5}'TypeScript const response = await fetch("https://api.boethios.ai/v1/canon/search", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"query": "annual leave entitlement",
"limit": 5
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/canon/search",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"query": "annual leave entitlement",
"limit": 5,
},
)
print(response.status_code, response.json()) | |||
POST /v1/canon/sources | Add a source to your corpus. | knowledge.claims.propose | |
Examplescurl curl -X POST https://api.boethios.ai/v1/canon/sources \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Staff handbook 2026","publisher":"Your organisation","authorityTier":"institutional","reviewBy":"2027-10-01"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/canon/sources", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"title": "Staff handbook 2026",
"publisher": "Your organisation",
"authorityTier": "institutional",
"reviewBy": "2027-10-01"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/canon/sources",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"title": "Staff handbook 2026",
"publisher": "Your organisation",
"authorityTier": "institutional",
"reviewBy": "2027-10-01",
},
)
print(response.status_code, response.json()) | |||
POST /v1/canon/claims | Propose a claim for approval. Pending claims never reach an answer. | knowledge.claims.propose | |
Examplescurl curl -X POST https://api.boethios.ai/v1/canon/claims \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"source":"<source id from POST /v1/canon/sources>","text":"Full-time staff receive 28 days of paid annual leave, including bank holidays.","authorityDomain":["employment"],"authorityTier":"institutional","reviewBy":"2027-10-01","moduleTags":["work"]}'TypeScript const response = await fetch("https://api.boethios.ai/v1/canon/claims", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"source": "<source id from POST /v1/canon/sources>",
"text": "Full-time staff receive 28 days of paid annual leave, including bank holidays.",
"authorityDomain": [
"employment"
],
"authorityTier": "institutional",
"reviewBy": "2027-10-01",
"moduleTags": [
"work"
]
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/canon/claims",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"source": "<source id from POST /v1/canon/sources>",
"text": "Full-time staff receive 28 days of paid annual leave, including bank holidays.",
"authorityDomain": [
"employment",
],
"authorityTier": "institutional",
"reviewBy": "2027-10-01",
"moduleTags": [
"work",
],
},
)
print(response.status_code, response.json()) | |||
GET /v1/canon/claims/:id | One claim, with its authority and review date. | knowledge.claims.read | |
Examplescurl curl -X GET https://api.boethios.ai/v1/canon/claims/<id> \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/canon/claims/<id>", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/canon/claims/<id>",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
POST /v1/canon/documents | Upload a PDF, scan or text file. Stored now, read by a worker. | knowledge.uploads | |
Examplescurl curl -X POST https://api.boethios.ai/v1/canon/documents \ -H "Authorization: Bearer $BOETHIOS_KEY" \ -F "title=Staff handbook 2026" \ -F "publisher=Your organisation" \ -F "authorityTier=institutional" \ -F "moduleTags=work" \ -F "authorityDomain=employment" \ -F "reviewBy=2027-10-01" \ -F "file=@handbook.pdf" TypeScript import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("title", "Staff handbook 2026");
form.append("publisher", "Your organisation");
form.append("authorityTier", "institutional");
form.append("moduleTags", "work");
form.append("authorityDomain", "employment");
form.append("reviewBy", "2027-10-01");
form.append("file", new Blob([await readFile("handbook.pdf")]), "handbook.pdf");
const response = await fetch("https://api.boethios.ai/v1/canon/documents", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
body: form,
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/canon/documents",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
data={
"title": "Staff handbook 2026",
"publisher": "Your organisation",
"authorityTier": "institutional",
"moduleTags": "work",
"authorityDomain": "employment",
"reviewBy": "2027-10-01",
},
files={"file": open("handbook.pdf", "rb")},
)
print(response.status_code, response.json()) | |||
GET /v1/canon/documents | Your uploads, and how many are waiting or failed. | knowledge.uploads | |
Examplescurl curl -X GET https://api.boethios.ai/v1/canon/documents \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/canon/documents", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/canon/documents",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
GET /v1/canon/documents/:id | One upload: its state, and the reason if it failed. | knowledge.uploads | |
Examplescurl curl -X GET https://api.boethios.ai/v1/canon/documents/<id> \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/canon/documents/<id>", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/canon/documents/<id>",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
DELETE /v1/canon/documents/:id | Delete the file. The claims it produced remain. | knowledge.uploads | |
Examplescurl curl -X DELETE https://api.boethios.ai/v1/canon/documents/<id> \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/canon/documents/<id>", {
method: "DELETE",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.delete(
"https://api.boethios.ai/v1/canon/documents/<id>",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
GET /v1/canon/review | What in your corpus is going stale. | knowledge.claims.read | |
Examplescurl curl -X GET https://api.boethios.ai/v1/canon/review \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/canon/review", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/canon/review",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
capsules
POST /v1/capsules | Request a capsule. The person authorises it, not you. | licensing.request | the person |
Examplescurl curl -X POST https://api.boethios.ai/v1/capsules \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"ref":"your-user-123","purpose":"tailoring onboarding steps to what they told us they want","attributes":["goal.care_work"],"scope":"module:work","days":30}'TypeScript const response = await fetch("https://api.boethios.ai/v1/capsules", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"ref": "your-user-123",
"purpose": "tailoring onboarding steps to what they told us they want",
"attributes": [
"goal.care_work"
],
"scope": "module:work",
"days": 30
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/capsules",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"ref": "your-user-123",
"purpose": "tailoring onboarding steps to what they told us they want",
"attributes": [
"goal.care_work",
],
"scope": "module:work",
"days": 30,
},
)
print(response.status_code, response.json()) | |||
GET /v1/capsules | The capsules you hold, and where each one stands. | licensing.use | the person |
Examplescurl curl -X GET https://api.boethios.ai/v1/capsules \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/capsules", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/capsules",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
GET /v1/capsules/:id | One capsule: requested, link opened, answered, reads, revoked. | licensing.use | the person |
Examplescurl curl -X GET https://api.boethios.ai/v1/capsules/<id> \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/capsules/<id>", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/capsules/<id>",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
DELETE /v1/capsules/:id | Revoke one you hold. | licensing.use | the person |
Examplescurl curl -X DELETE https://api.boethios.ai/v1/capsules/<id> \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/capsules/<id>", {
method: "DELETE",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.delete(
"https://api.boethios.ai/v1/capsules/<id>",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
POST /v1/capsules/:id/link | A fresh consent link for a capsule nobody has answered yet. | licensing.request | the person |
Examplescurl curl -X POST https://api.boethios.ai/v1/capsules/<id>/link \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"return_url":"https://your-app.example/welcome"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/capsules/<id>/link", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"return_url": "https://your-app.example/welcome"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/capsules/<id>/link",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"return_url": "https://your-app.example/welcome",
},
)
print(response.status_code, response.json()) | |||
catalogue
GET /v1/catalogue | What you may call, at what tier, and what each refuses. | licensing.registry | |
Examplescurl curl -X GET https://api.boethios.ai/v1/catalogue \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/catalogue", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/catalogue",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
character
GET /v1/character | The persona as declared, with its registers and commitments. | persona.read | |
Examplescurl curl -X GET https://api.boethios.ai/v1/character \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/character", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/character",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
POST /v1/character/validate | Run the scenario suite against a candidate persona. | persona.consistency | |
Examplescurl curl -X POST https://api.boethios.ai/v1/character/validate \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{}'TypeScript const response = await fetch("https://api.boethios.ai/v1/character/validate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/character/validate",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={},
)
print(response.status_code, response.json()) | |||
events
GET /v1/events | Your events, oldest first after a cursor. The feed behind your webhooks. | events.feed | |
Examplescurl curl -X GET https://api.boethios.ai/v1/events \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/events", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/events",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
live
POST /v1/live/session | Open a voice call with a person: a room, and a token for their browser to join it. | live.capsule | the person |
Examplescurl curl -X POST https://api.boethios.ai/v1/live/session \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"ref":"your-user-123","register":"default"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/live/session", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"ref": "your-user-123",
"register": "default"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/live/session",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"ref": "your-user-123",
"register": "default",
},
)
print(response.status_code, response.json()) | |||
notices
GET /v1/notices | Correction notices owed to you: something you read about a person has changed. | state.notices.integrator | |
Examplescurl curl -X GET https://api.boethios.ai/v1/notices \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/notices", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/notices",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
POST /v1/notices/:id/ack | Say you have been told. Marks the notice delivered. | state.notices.integrator | |
Examplescurl curl -X POST https://api.boethios.ai/v1/notices/<id>/ack \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/notices/<id>/ack", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/notices/<id>/ack",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
outcomes
GET /v1/outcomes/measures | The measures you may record against: the catalogue and your own. | outcomes.outcomes | |
Examplescurl curl -X GET https://api.boethios.ai/v1/outcomes/measures \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/outcomes/measures", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/outcomes/measures",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
POST /v1/outcomes/measures | Declare a measure for your own people, before any reading exists. | outcomes.outcomes | |
Examplescurl curl -X POST https://api.boethios.ai/v1/outcomes/measures \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"key":"work.settled","scope":"module:work","question":"How settled do you feel about work this week, from 0 to 10?","unit":"points","direction":"higher_is_better","sources":["self_reported"]}'TypeScript const response = await fetch("https://api.boethios.ai/v1/outcomes/measures", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"key": "work.settled",
"scope": "module:work",
"question": "How settled do you feel about work this week, from 0 to 10?",
"unit": "points",
"direction": "higher_is_better",
"sources": [
"self_reported"
]
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/outcomes/measures",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"key": "work.settled",
"scope": "module:work",
"question": "How settled do you feel about work this week, from 0 to 10?",
"unit": "points",
"direction": "higher_is_better",
"sources": [
"self_reported",
],
},
)
print(response.status_code, response.json()) | |||
POST /v1/outcomes | Record a reading against a declared measure. | outcomes.outcomes | the person |
Examplescurl curl -X POST https://api.boethios.ai/v1/outcomes \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"ref":"your-user-123","measure":"ucla3","value":5,"source":"self_reported"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/outcomes", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"ref": "your-user-123",
"measure": "ucla3",
"value": 5,
"source": "self_reported"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/outcomes",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"ref": "your-user-123",
"measure": "ucla3",
"value": 5,
"source": "self_reported",
},
)
print(response.status_code, response.json()) | |||
GET /v1/outcomes/cohort/:measure | Cohort report for your population, or a refusal below the floor. | outcomes.outcomes | the person |
Examplescurl curl -X GET https://api.boethios.ai/v1/outcomes/cohort/ucla3 \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/outcomes/cohort/ucla3", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/outcomes/cohort/ucla3",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
GET /v1/outcomes/experiments | Your experiments, with each arm's size above the cohort floor. | outcomes.experiments | the person |
Examplescurl curl -X GET https://api.boethios.ai/v1/outcomes/experiments \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/outcomes/experiments", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/outcomes/experiments",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
POST /v1/outcomes/experiments | Start an experiment on your own people for one module. | outcomes.experiments | |
Examplescurl curl -X POST https://api.boethios.ai/v1/outcomes/experiments \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"key":"work.state_q4","scope":"module:work","question":"Do work answers help more when they draw on what the person told us?"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/outcomes/experiments", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"key": "work.state_q4",
"scope": "module:work",
"question": "Do work answers help more when they draw on what the person told us?"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/outcomes/experiments",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"key": "work.state_q4",
"scope": "module:work",
"question": "Do work answers help more when they draw on what the person told us?",
},
)
print(response.status_code, response.json()) | |||
POST /v1/outcomes/experiments/:key/end | Stop drawing arms. Arms already drawn, and readings in them, stay. | outcomes.experiments | |
Examplescurl curl -X POST https://api.boethios.ai/v1/outcomes/experiments/<key>/end \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/outcomes/experiments/<key>/end", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/outcomes/experiments/<key>/end",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
pathways
POST /v1/pathways/steps | Count a pathway step for the code somebody arrived through. Never who. | marketing.pathways | |
Examplescurl curl -X POST https://api.boethios.ai/v1/pathways/steps \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"entry":"<code from a campaign entry point>","step":"asked_to_continue"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/pathways/steps", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"entry": "<code from a campaign entry point>",
"step": "asked_to_continue"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/pathways/steps",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"entry": "<code from a campaign entry point>",
"step": "asked_to_continue",
},
)
print(response.status_code, response.json()) | |||
people
POST /v1/people | Onboard one of your users as a subject you own. | subject.subjects | the person |
Examplescurl curl -X POST https://api.boethios.ai/v1/people \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"ref":"your-user-123","ageBand":"age_25_39"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/people", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"ref": "your-user-123",
"ageBand": "age_25_39"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/people",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"ref": "your-user-123",
"ageBand": "age_25_39",
},
)
print(response.status_code, response.json()) | |||
GET /v1/people/:ref | Read through a capsule. The only person read there is. | licensing.use | the person |
Examplescurl curl -X GET https://api.boethios.ai/v1/people/your-user-123 \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/people/your-user-123", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/people/your-user-123",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
GET /v1/people/:ref/pending | What has been inferred about them and not confirmed. | state.confirm.read | the person |
Examplescurl curl -X GET https://api.boethios.ai/v1/people/your-user-123/pending \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/people/your-user-123/pending", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/people/your-user-123/pending",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
POST /v1/people/:ref/records | Bring across what your own system held about them before. Inferences arrive unconfirmed. | subject.subjects | the person |
Examplescurl curl -X POST https://api.boethios.ai/v1/people/your-user-123/records \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"source":"yourapp.user_notes","records":[{"id":"note-1","at":"2026-09-01T10:00:00Z","kind":"inference","scope":"module:work","attribute":"pref.step_by_step","class":"PREFERENCE","value":"prefers things one step at a time"}]}'TypeScript const response = await fetch("https://api.boethios.ai/v1/people/your-user-123/records", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"source": "yourapp.user_notes",
"records": [
{
"id": "note-1",
"at": "2026-09-01T10:00:00Z",
"kind": "inference",
"scope": "module:work",
"attribute": "pref.step_by_step",
"class": "PREFERENCE",
"value": "prefers things one step at a time"
}
]
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/people/your-user-123/records",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"source": "yourapp.user_notes",
"records": [
{
"id": "note-1",
"at": "2026-09-01T10:00:00Z",
"kind": "inference",
"scope": "module:work",
"attribute": "pref.step_by_step",
"class": "PREFERENCE",
"value": "prefers things one step at a time",
},
],
},
)
print(response.status_code, response.json()) | |||
persona
GET /v1/persona | Your published persona, and every version of it. | persona.author | |
Examplescurl curl -X GET https://api.boethios.ai/v1/persona \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/persona", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/persona",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
POST /v1/persona | Publish a persona. Runs the consistency probes and refuses a failure. | persona.author | |
Examplescurl curl -X POST https://api.boethios.ai/v1/persona \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"persona":"You are Ada, an onboarding guide for new staff…","sourceRef":"persona-v3","name":"Ada"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/persona", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"persona": "You are Ada, an onboarding guide for new staff…",
"sourceRef": "persona-v3",
"name": "Ada"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/persona",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"persona": "You are Ada, an onboarding guide for new staff…",
"sourceRef": "persona-v3",
"name": "Ada",
},
)
print(response.status_code, response.json()) | |||
POST /v1/persona/check | The same probes, no row written. | persona.author | |
Examplescurl curl -X POST https://api.boethios.ai/v1/persona/check \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"persona":"You are Ada, an onboarding guide for new staff…"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/persona/check", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"persona": "You are Ada, an onboarding guide for new staff…"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/persona/check",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"persona": "You are Ada, an onboarding guide for new staff…",
},
)
print(response.status_code, response.json()) | |||
DELETE /v1/persona | Withdraw it, with a reason. Your users hear the declared character again. | persona.author | |
Examplescurl curl -X DELETE https://api.boethios.ai/v1/persona \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"reason":"replaced by a new version"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/persona", {
method: "DELETE",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"reason": "replaced by a new version"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.delete(
"https://api.boethios.ai/v1/persona",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"reason": "replaced by a new version",
},
)
print(response.status_code, response.json()) | |||
presence
GET /v1/presence/visemes | The fifteen speech visemes a rig must expose, and the ARPAbet they map from. | embodiment.visemes | |
Examplescurl curl -X GET https://api.boethios.ai/v1/presence/visemes \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/presence/visemes", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/presence/visemes",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
POST /v1/presence/rig | Check a .glb against the fifteen, and against your last export. | embodiment.rig | |
Examplescurl curl -X POST https://api.boethios.ai/v1/presence/rig \ -H "Authorization: Bearer $BOETHIOS_KEY" \ -F "file=@character.glb" TypeScript import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("file", new Blob([await readFile("character.glb")]), "character.glb");
const response = await fetch("https://api.boethios.ai/v1/presence/rig", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
body: form,
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/presence/rig",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
data={},
files={"file": open("character.glb", "rb")},
)
print(response.status_code, response.json()) | |||
GET /v1/presence/rig | Your validation history. Two exports are what catch a lost target. | embodiment.rig | |
Examplescurl curl -X GET https://api.boethios.ai/v1/presence/rig \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/presence/rig", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/presence/rig",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
GET /v1/presence/rig/:id | One validation: the manifest we kept, and the report you were shown. | embodiment.rig | |
Examplescurl curl -X GET https://api.boethios.ai/v1/presence/rig/<id> \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/presence/rig/<id>", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/presence/rig/<id>",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
POST /v1/presence/timeline | Phoneme spans to viseme cues and expression tracks, for a caller who aligns their own audio. | embodiment.visemes | |
Examplescurl curl -X POST https://api.boethios.ai/v1/presence/timeline \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Take your time.","audio":"https://your-cdn.example/speech.wav","phonemes":[{"phoneme":"T","start":0,"end":0.08},{"phoneme":"EY1","start":0.08,"end":0.22},{"phoneme":"K","start":0.22,"end":0.3},{"phoneme":"Y","start":0.3,"end":0.36},{"phoneme":"AO1","start":0.36,"end":0.52},{"phoneme":"R","start":0.52,"end":0.6},{"phoneme":"T","start":0.6,"end":0.68},{"phoneme":"AY1","start":0.68,"end":0.98},{"phoneme":"M","start":0.98,"end":1.12}],"durationSeconds":1.4,"register":"default"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/presence/timeline", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"text": "Take your time.",
"audio": "https://your-cdn.example/speech.wav",
"phonemes": [
{
"phoneme": "T",
"start": 0,
"end": 0.08
},
{
"phoneme": "EY1",
"start": 0.08,
"end": 0.22
},
{
"phoneme": "K",
"start": 0.22,
"end": 0.3
},
{
"phoneme": "Y",
"start": 0.3,
"end": 0.36
},
{
"phoneme": "AO1",
"start": 0.36,
"end": 0.52
},
{
"phoneme": "R",
"start": 0.52,
"end": 0.6
},
{
"phoneme": "T",
"start": 0.6,
"end": 0.68
},
{
"phoneme": "AY1",
"start": 0.68,
"end": 0.98
},
{
"phoneme": "M",
"start": 0.98,
"end": 1.12
}
],
"durationSeconds": 1.4,
"register": "default"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/presence/timeline",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"text": "Take your time.",
"audio": "https://your-cdn.example/speech.wav",
"phonemes": [
{
"phoneme": "T",
"start": 0,
"end": 0.08,
},
{
"phoneme": "EY1",
"start": 0.08,
"end": 0.22,
},
{
"phoneme": "K",
"start": 0.22,
"end": 0.3,
},
{
"phoneme": "Y",
"start": 0.3,
"end": 0.36,
},
{
"phoneme": "AO1",
"start": 0.36,
"end": 0.52,
},
{
"phoneme": "R",
"start": 0.52,
"end": 0.6,
},
{
"phoneme": "T",
"start": 0.6,
"end": 0.68,
},
{
"phoneme": "AY1",
"start": 0.68,
"end": 0.98,
},
{
"phoneme": "M",
"start": 0.98,
"end": 1.12,
},
],
"durationSeconds": 1.4,
"register": "default",
},
)
print(response.status_code, response.json()) | |||
sessions
POST /v1/sessions | Open a conversation with a person, so turns carry context. | reason.loop | the person |
Examplescurl curl -X POST https://api.boethios.ai/v1/sessions \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"ref":"your-user-123"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/sessions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"ref": "your-user-123"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/sessions",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"ref": "your-user-123",
},
)
print(response.status_code, response.json()) | |||
POST /v1/sessions/:id/end | End a conversation. Its working note goes unless the person kept it. | reason.loop | the person |
Examplescurl curl -X POST https://api.boethios.ai/v1/sessions/<id>/end \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"ref":"your-user-123"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/sessions/<id>/end", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"ref": "your-user-123"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/sessions/<id>/end",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"ref": "your-user-123",
},
)
print(response.status_code, response.json()) | |||
story
GET /v1/story/works | Your published narrative works: series, investigations, quests, curricula. | story.works.read | |
Examplescurl curl -X GET https://api.boethios.ai/v1/story/works \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/story/works", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/story/works",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
GET /v1/story/works/:id | One work's structure, as somebody at a given reveal stage may be shown it. | story.works.read | |
Examplescurl curl -X GET https://api.boethios.ai/v1/story/works/<id> \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/story/works/<id>", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/story/works/<id>",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
turn
POST /v1/turn | The twelve layers, with the person's context. Needs a capsule. | reason.loop | the person |
Examplescurl curl -X POST https://api.boethios.ai/v1/turn \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"ref":"your-user-123","text":"I want to move into care work. Where do I start?","register":"default"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/turn", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"ref": "your-user-123",
"text": "I want to move into care work. Where do I start?",
"register": "default"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/turn",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"ref": "your-user-123",
"text": "I want to move into care work. Where do I start?",
"register": "default",
},
)
print(response.status_code, response.json()) | |||
POST /v1/turn/stateless | The twelve layers, grounded in canon only. Reads no ledger. | reason.canon | |
Examplescurl curl -X POST https://api.boethios.ai/v1/turn/stateless \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"What does the handbook say about annual leave?","module":"work"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/turn/stateless", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"text": "What does the handbook say about annual leave?",
"module": "work"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/turn/stateless",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"text": "What does the handbook say about annual leave?",
"module": "work",
},
)
print(response.status_code, response.json()) | |||
usage
GET /v1/usage | Calls and distinct people per day. What a dispute is settled with. | licensing.use | |
Examplescurl curl -X GET https://api.boethios.ai/v1/usage \ -H "Authorization: Bearer $BOETHIOS_KEY" TypeScript const response = await fetch("https://api.boethios.ai/v1/usage", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.get(
"https://api.boethios.ai/v1/usage",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
)
print(response.status_code, response.json()) | |||
voice
POST /v1/voice/speak | Synthesis. Text in, audio out, in the register you name. | voice.voice | |
Examplescurl curl -X POST https://api.boethios.ai/v1/voice/speak \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Take your time.","register":"default"}'TypeScript import { writeFile } from "node:fs/promises";
const response = await fetch("https://api.boethios.ai/v1/voice/speak", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"text": "Take your time.",
"register": "default"
}),
});
await writeFile("speech.wav", Buffer.from(await response.arrayBuffer()));Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/voice/speak",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"text": "Take your time.",
"register": "default",
},
)
open("speech.wav", "wb").write(response.content) | |||
POST /v1/voice/speak/aligned | Synthesis with ARPAbet phoneme spans, which is what drives a face. | voice.aligned | |
Examplescurl curl -X POST https://api.boethios.ai/v1/voice/speak/aligned \
-H "Authorization: Bearer $BOETHIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Take your time.","register":"default","language":"en"}'TypeScript const response = await fetch("https://api.boethios.ai/v1/voice/speak/aligned", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOETHIOS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"text": "Take your time.",
"register": "default",
"language": "en"
}),
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/voice/speak/aligned",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
json={
"text": "Take your time.",
"register": "default",
"language": "en",
},
)
print(response.status_code, response.json()) | |||
POST /v1/voice/hear | Transcription, with its disclosure. | voice.hearing | |
Examplescurl curl -X POST https://api.boethios.ai/v1/voice/hear \ -H "Authorization: Bearer $BOETHIOS_KEY" \ -F "file=@utterance.webm" TypeScript import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("file", new Blob([await readFile("utterance.webm")]), "utterance.webm");
const response = await fetch("https://api.boethios.ai/v1/voice/hear", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BOETHIOS_KEY}` },
body: form,
});
console.log(response.status, await response.json());Python import os
import requests
response = requests.post(
"https://api.boethios.ai/v1/voice/hear",
headers={"Authorization": f"Bearer {os.environ['BOETHIOS_KEY']}"},
data={},
files={"file": open("utterance.webm", "rb")},
)
print(response.status_code, response.json()) | |||
Every component
137 of 159. The other 22 are never exposed — not expensive, not available — and are absent from this page rather than listed with “contact us” beside them. The policy kernel, the raw connection, the migration runner and the training-snapshot export are among them. A reference page that advertised those would be inviting a conversation we will refuse.
| Component | What it is | Tier | How you buy it | Endpoints |
|---|---|---|---|---|
audit.audit | Audit trail | T3 | contract | |
consent.consent.read | Consent — read | T1 | contract | |
consent.consent.write | Consent — write | T3 | contract | |
console.members | Console membership | T3 | agreement | |
context.assemble | Context assembly | T2 | contract | |
context.tokens | Token budget | T1 | agreement | |
crisis.authoring | Crisis taxonomy authoring | T3 | agreement | |
crisis.draft-taxonomy | Draft crisis taxonomy | T1 | card | |
crisis.escalation | Escalations | T3 | contract | |
crisis.gateundeclinable | Crisis gate | T1 | agreement | |
crisis.readiness | Release readiness | T3 | agreement | |
crisis.rota | Escalation rota | T3 | agreement | |
domain.errors | Vocabulary and errors | T1 | card | |
domain.lifecycle | The state lifecycle, described | T1 | card | |
domain.types | Vocabulary and decay constants | T1 | card | |
embodiment.character | Renderer command vocabulary | T1 | card | |
embodiment.expression | Nonverbal expression tracks | T1 | card | |
embodiment.rig | Rig validation | T2 | agreement | 3 |
embodiment.visemes | Phoneme to viseme, and the timeline | T1 | card | 2 |
erasure.rights | Rights and erasure | T3 | contract | |
eval.account-eval | Account eval cases | T1 | card | |
eval.admissionundeclinable | Queue admission | T1 | card | |
eval.character | Character evals and the regression gate | T1 | card | |
eval.latency | Latency measurement | T2 | agreement | |
eval.module-eval | Module evaluation | T1 | card | |
eval.work-cases | Work eval cases | T1 | card | |
events.events | The event log | T3 | contract | |
events.feed | Event feed and webhook signatures | T1 | card | 1 |
identity.devices | Identity keys, attestation and migration | T3 | contract | |
identity.enneagram | Declared Enneagram type and its register hints | T3 | contract | |
knowledge.claims.propose | Claims — propose | T2 | agreement | 2 |
knowledge.claims.read | Claims — read | T1 | card | 2 |
knowledge.claims.write | Claims — write | T3 | agreement | |
knowledge.coverage | Coverage of the corpus | T3 | contract | |
knowledge.discovery | Discovery planner | T3 | agreement | |
knowledge.documents | Document and image reading | T2 | agreement | |
knowledge.ingest | Claim ingest | T2 | agreement | |
knowledge.positions | Scholars' positions and disputes | T3 | agreement | |
knowledge.preview | Retrieval preview | T2 | agreement | |
knowledge.review | Reviewer queue | T3 | agreement | |
knowledge.storyworld | Storyworld staging | T3 | agreement | |
knowledge.structure | Story structure over claims | T3 | agreement | |
knowledge.uploads | Document upload and ingest | T2 | agreement | 4 |
knowledge.work-corpus | Work source manifest | T1 | card | |
licensing.registry | Component registry, read | T1 | card | 1 |
licensing.releases | Release manifests and diffs | T1 | card | |
licensing.request | Capsule requests | T2 | contract | 2 |
licensing.use | Capsule read and introspection | T1 | contract | 5 |
live.audio | Voice activity from PCM frames | T1 | agreement | |
live.capsule | Live call through a capsule | T2 | contract | 1 |
live.clock | Live call clock | T1 | card | |
live.face | Estimated visemes for a live sentence | T1 | card | |
live.hearing-stream | Streaming transcription for a live call | T2 | agreement | |
live.load | First-audio load harness | T2 | agreement | |
live.pipeline | Streaming model to voice to face | T2 | agreement | |
live.prosody | Prosody, held for one turn | T2 | agreement | |
live.transport | Live call data channel | T1 | agreement | |
live.turn-taking | End of turn and barge-in | T1 | agreement | |
live.voice | Sentence voice for a live call | T2 | agreement | |
live.worker | Live session worker | T2 | agreement | |
marketing.adaptations | Adaptations of approved canon | T3 | agreement | |
marketing.adaptations.read | Adaptations, read and checked | T1 | card | 1 |
marketing.entry-points | Campaign entry points | T1 | card | |
marketing.pathways | Audience pathways | T1 | card | 1 |
marketing.performance | Pathway performance and segments | T1 | card | |
memory.brief | Profile brief | T2 | contract | |
memory.episode | Episodic memory | T2 | contract | |
modules.elder | Elder module | T1 | card | |
modules.lanes | Answerable-lane gates | T1 | card | |
modules.module | Purpose module declaration | T1 | card | |
modules.registry | Module registry | T1 | card | |
modules.work | Work module | T1 | card | |
observability.telemetry | Telemetry | T1 | card | |
outcomes.experiments | Outcome experiments | T3 | contract | 3 |
outcomes.outcomes | Outcome recording | T3 | contract | 4 |
outcomes.ucla3 | Loneliness instrument | T1 | card | |
persona.author | Persona authoring | T3 | agreement | 4 |
persona.consistency | Persona consistency harness | T1 | card | 1 |
persona.read | Persona — read | T1 | card | 1 |
persona.scenario-set | Scenario sets | T1 | card | |
persona.scenarios | Persona scenarios | T1 | card | |
policy.catalogue | Question catalogue (seed) | T1 | card | |
policy.dependency | Anti-dependency prohibitions, and what keeps each | T1 | card | |
policy.restraint | Restraint ladder | T1 | card | |
policy.routing | Who answers — Boethios, the person, or a human | T2 | agreement | |
presence.access | Communication needs — the director's third refusal | T1 | contract | |
presence.director | The presence director | T1 | card | |
presence.reveal | Reveal state — the shared ladder | T1 | card | |
realtime.livekit | Realtime transport | T2 | agreement | |
reason.aws-credentials | AWS credential chain | T2 | agreement | |
reason.bedrock | Bedrock client | T2 | agreement | |
reason.build | Building a provider from a configuration | T2 | agreement | |
reason.canon | Reasoning loop, canon only | T2 | agreement | 1 |
reason.citations | Citation resolution | T1 | card | |
reason.config | Provider configuration | T2 | agreement | |
reason.declines | Decline vocabulary | T1 | card | |
reason.fake | Scripted provider, for tests | T2 | agreement | |
reason.guardsundeclinable | Input and output guards | T1 | agreement | |
reason.loop | Reasoning loop, with the person | T2 | contract | 3 |
reason.openai-compatible | OpenAI-compatible client | T2 | agreement | |
reason.provider | Model provider contract | T2 | agreement | |
reason.routing | Per-role provider routing | T2 | agreement | |
reason.sigv4 | AWS request signing | T2 | agreement | |
reason.style | Register style pass | T2 | agreement | |
retrieval.embed-claims | Claim embedding | T1 | card | |
retrieval.fuse | Rank fusion | T1 | card | |
retrieval.search | Grounded retrieval | T1 | agreement | 1 |
slow.after-turn | The after-turn clock | T2 | contract | |
slow.extract | Extraction, the slow path | T2 | contract | |
slow.extraction-quality | Extraction quality measure | T1 | card | |
slow.reflect | Reflection without a model | T2 | contract | |
state.ask.propose | Confirm-and-correct loop — propose | T2 | contract | |
state.ask.write | Confirm-and-correct loop — write | T3 | contract | |
state.confirm.propose | Confirmation gate — propose | T2 | contract | |
state.confirm.read | Confirmation gate — read | T1 | contract | 1 |
state.confirm.write | Confirmation gate — write | T3 | contract | |
state.factors.propose | Factor chains — effects drawn from factors | T2 | contract | |
state.notices.deliver | Correction notices — deliver | T3 | contract | |
state.notices.integrator | Correction notices — your own | T1 | contract | 2 |
state.notices.owe | Correction notices — owe | T2 | contract | |
state.notices.read | Correction notices — the person's own view | T1 | contract | |
state.repair.read | Downstream repair — read | T1 | contract | |
state.repair.run | Downstream repair — re-derive | T2 | contract | |
state.state.read | Person ledger — read | T1 | contract | |
state.state.write | Person ledger — write | T3 | contract | |
store.objects | Object storage | T2 | agreement | |
story.works.author | Narrative layer structure, authored | T3 | agreement | |
story.works.read | Narrative layer structure, read | T1 | card | 2 |
subject.subjects | Subjects and releases | T3 | contract | 2 |
training.layers | Trainable layers | T3 | agreement | |
training.metrics | Agreement metrics | T1 | card | |
voice.aligned | Aligned voice | T1 | agreement | 1 |
voice.hearing | Transcription | T1 | agreement | 1 |
voice.reference-quality | Reference recording checks | T1 | card | |
voice.rights | Custom voice rights and references | T3 | agreement | |
voice.training | Custom voice training and checkpoints | T3 | agreement | |
voice.voice | Speech synthesis | T1 | agreement | 1 |
What the tiers mean
T1 65 components
Read own-subject, or no personal data at all. Reading a person's own model on their behalf, and everything that touches no person: the retrieval stack, the module declarations, the persona scenarios, the pure measures.
T2 41 components
Propose only. Can produce candidates and cannot make them authoritative. Extraction and reflection both live here, and the confirmation gate is why that is safe: what they write is an interpretation, and an interpretation is not readable until the person confirms it.
T3 31 components
Governed write. Writes that need a verified role behind them: declarations on somebody's behalf, consent, erasure, the event log, console membership, the trainable layers.
crisis.gate, eval.admission, reason.guards. They are T1, which is the point: they cost nothing and they are not optional. A tier is about how dangerous a capability is to hand over — these are dangerous to take away.
Create an account to switch any of the card-and-agreement components on, or sign in.