Deploy a mind's NarrativeDNA into any system.
The MNTR API hands any AI system the judgment of a mind you have access to: who it is, how it decides, the frameworks it built, the stories it lived, and the person it serves. As structured data, and as one prompt block ready to run. It also drafts finished deliverables from that DNA.
https://api.mntr.ai/v1A key
Issued by MNTR. It starts with mntr_ and decides which minds you can call. Keep it server-side.
A mind
Call /v1/brains to see the minds your key reaches. Every key reaches Musey, so every example here works on day one.
Your system
Claude, OpenAI, any agent, an automation tool, or your own code. Put the DNA's prompt first and build on it.
Quickstart
Three calls: see your minds, read one, use it. Set your key once.
1. Set your key
export MNTR_API_KEY="mntr_your_key_here"2. See which minds you can call
curl https://api.mntr.ai/v1/brains \
-H "Authorization: Bearer $MNTR_API_KEY"
import os, requests
r = requests.get(
"https://api.mntr.ai/v1/brains",
headers={"Authorization": f"Bearer {os.environ['MNTR_API_KEY']}"},
timeout=30,
)
for mind in r.json()["brains"]:
print(mind["community"], mind["slug"], mind["name"], mind["reach"])
const r = await fetch("https://api.mntr.ai/v1/brains", {
headers: { Authorization: `Bearer ${process.env.MNTR_API_KEY}` },
});
const { brains } = await r.json();
console.table(brains.map(({ community, slug, name, reach }) => ({ community, slug, name, reach })));{
"success": true,
"caller": { "role": "member", "label": "Vincent Laforet" },
"brains": [
{ "id": "3d2d94d9-…", "slug": "vincent-laforet", "name": "Vincent Laforet", "kind": "studio", "community": "filmmakers", "reach": "owned" },
{ "id": "7a2fe9e8-…", "slug": "musey", "name": "Musey", "kind": "founder", "community": "filmmakers", "reach": "shared" }
]
}3. Read a mind's NarrativeDNA
Name the mind by community and brain slug (or the brain's id). Add q with what you are making, and the frameworks and stories that bear on it come back too.
curl -G https://api.mntr.ai/v1/narrative-dna \
-H "Authorization: Bearer $MNTR_API_KEY" \
--data-urlencode "community=filmmakers" \
--data-urlencode "brain=musey" \
--data-urlencode "specialty=marketing" \
--data-urlencode "q=a landing page for a documentary filmmaker"
import os, requests
dna = requests.get(
"https://api.mntr.ai/v1/narrative-dna",
headers={"Authorization": f"Bearer {os.environ['MNTR_API_KEY']}"},
params={
"community": "filmmakers",
"brain": "musey",
"specialty": "marketing",
"q": "a landing page for a documentary filmmaker",
},
timeout=60,
).json()
print(dna["brain"]["name"])
print(dna["prompt"][:500])
const params = new URLSearchParams({
community: "filmmakers",
brain: "musey",
specialty: "marketing",
q: "a landing page for a documentary filmmaker",
});
const dna = await fetch(`https://api.mntr.ai/v1/narrative-dna?${params}`, {
headers: { Authorization: `Bearer ${process.env.MNTR_API_KEY}` },
}).then((r) => r.json());
console.log(dna.brain.name);
console.log(dna.prompt.slice(0, 500));The response carries the mind, its brand facts, every layer of the DNA, the map of its principles, frameworks, tactics and stories, what bears on q, and prompt: all of it rendered in assembly order. See the reference for the full shape.
Access
A key decides which minds you can call. Reach is read at the moment you call, so when a mind is handed to you, your key reaches it at once.
| Key | Reaches | For |
|---|---|---|
| admin | Every mind on the platform, every draft, and the admin-only endpoints. | MNTR's own team and systems. |
| member | The minds the key's person owns, the shared minds (Musey), and any mind granted to the key. | A thought leader reading their own NarrativeDNA. Vincent Laforet's key reaches Vincent Laforet and Musey. |
| partner | A member key with no person behind it: the shared minds, plus the minds MNTR grants it by name. | An agency or a partner's system working on specific minds. |
A mind outside your reach answers 404, exactly as a mind that does not exist. That is deliberate: reach is not something the API discloses.
Use it in any AI system
The pattern is always the same: fetch the DNA, put its prompt where the model reads its instructions, then ask for the work.
# pip install anthropic requests
import os, requests, anthropic
dna = requests.get(
"https://api.mntr.ai/v1/narrative-dna",
headers={"Authorization": f"Bearer {os.environ['MNTR_API_KEY']}"},
params={"community": "filmmakers", "brain": "musey",
"specialty": "marketing", "q": "a launch email for the new cohort"},
timeout=60,
).json()
client = anthropic.Anthropic()
reply = client.messages.create(
model="claude-opus-5-5",
max_tokens=2000,
system=dna["prompt"],
messages=[{"role": "user", "content": "Write the launch email for the new cohort."}],
)
print(reply.content[0].text)
# pip install openai requests
import os, requests
from openai import OpenAI
dna = requests.get(
"https://api.mntr.ai/v1/narrative-dna",
headers={"Authorization": f"Bearer {os.environ['MNTR_API_KEY']}"},
params={"community": "filmmakers", "brain": "musey",
"specialty": "marketing", "q": "a launch email for the new cohort"},
timeout=60,
).json()
client = OpenAI()
reply = client.chat.completions.create(
model="gpt-5",
messages=[
{"role": "system", "content": dna["prompt"]},
{"role": "user", "content": "Write the launch email for the new cohort."},
],
)
print(reply.choices[0].message.content)
# pip install google-genai requests
import os, requests
from google import genai
from google.genai import types
dna = requests.get(
"https://api.mntr.ai/v1/narrative-dna",
headers={"Authorization": f"Bearer {os.environ['MNTR_API_KEY']}"},
params={"community": "filmmakers", "brain": "musey",
"specialty": "marketing", "q": "a launch email for the new cohort"},
timeout=60,
).json()
client = genai.Client()
reply = client.models.generate_content(
model="gemini-2.5-pro",
config=types.GenerateContentConfig(system_instruction=dna["prompt"]),
contents="Write the launch email for the new cohort.",
)
print(reply.text)
// npm i @anthropic-ai/sdk
import Anthropic from "@anthropic-ai/sdk";
const params = new URLSearchParams({
community: "filmmakers", brain: "musey",
specialty: "marketing", q: "a launch email for the new cohort",
});
const dna = await fetch(`https://api.mntr.ai/v1/narrative-dna?${params}`, {
headers: { Authorization: `Bearer ${process.env.MNTR_API_KEY}` },
}).then((r) => r.json());
const client = new Anthropic();
const reply = await client.messages.create({
model: "claude-opus-5-5",
max_tokens: 2000,
system: dna.prompt,
messages: [{ role: "user", content: "Write the launch email for the new cohort." }],
});
console.log(reply.content[0].text);Give an agent the DNA as a tool
For an agent that decides for itself when it needs a mind's judgment: register this tool and answer it with a call to /v1/narrative-dna. The schema is plain JSON Schema, so it drops into Claude's tools, OpenAI's functions, or any framework that takes one.
{
"name": "get_narrative_dna",
"description": "Read the NarrativeDNA of an MNTR mind: its identity, judgment, frameworks, stories and the person it serves, plus a prompt block that carries all of it. Call it before writing, deciding or advising in that mind's voice or judgment. Facts the DNA does not hold must stay as [brackets] in your output.",
"input_schema": {
"type": "object",
"properties": {
"community": { "type": "string", "description": "The mind's community slug, from /v1/brains." },
"brain": { "type": "string", "description": "The mind's slug or id, from /v1/brains." },
"specialty": { "type": "string", "description": "The lane to read it through: marketing, creative, sales, mntr. Default mntr." },
"q": { "type": "string", "description": "What is being made, so the frameworks and stories that bear on it come back." }
},
"required": ["brain"]
}
}Paste into any assistant's instructions
For a custom GPT, a Claude Project, a Cursor or Claude Code rule, or any agent that can make HTTP calls.
You can read the NarrativeDNA of the MNTR minds my key reaches.
- To see which minds: GET https://api.mntr.ai/v1/brains
- To read one: GET https://api.mntr.ai/v1/narrative-dna?community=COMMUNITY&brain=BRAIN&q=WHAT_YOU_ARE_MAKING
- Send the header: Authorization: Bearer $MNTR_API_KEY (from the environment; never print it)
Before you write, decide or advise in a mind's voice or judgment, read its DNA and treat the `prompt` field as that mind's charter: follow it over your own defaults. Quote its frameworks and stories by name when they bear on the work. Never invent names, numbers, results or testimonials the DNA does not hold; leave them as [brackets] for a person to fill.Automation tools: n8n, Make, Zapier
Use an HTTP request step, then pass the prompt field to your AI step as its system message.
| Method | GET |
| URL | https://api.mntr.ai/v1/narrative-dna |
| Query | community, brain, and optionally specialty, q |
| Header | Authorization = Bearer mntr_… (store it as a credential, not in the step) |
| Use | prompt as the system message; brain.name and brand for anything visual |
Drafting from a form
MNTR keeps the story-science shape of common deliverables as forms: what each section and block must do, in order, with its word budget. Name a form and a mind, and that mind drafts the deliverable from its own DNA.
| Form | What it is |
|---|---|
brand-guide | Thirteen pages: cover, story, beliefs, audience, positioning, method, messaging, voice, language, colour, type, imagery, applications. |
filmmaker-landing-page | Nine sections in story order: hero, problem, guide, work, plan, offer, questions, what changes, final call. |
Call /v1/asset-forms for the current list. Forms are versioned; a published version never changes.
# Start the draft and wait up to two minutes for it
curl https://api.mntr.ai/v1/asset-drafts \
-H "Authorization: Bearer $MNTR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"form": "brand-guide",
"community": "filmmakers",
"brain": "musey",
"brief": "The brand guide for our 2027 relaunch.",
"wait": 120
}'
# Read it back as a document
curl "https://api.mntr.ai/v1/asset-drafts/DRAFT_ID?format=markdown" \
-H "Authorization: Bearer $MNTR_API_KEY"
import os, time, requests
H = {"Authorization": f"Bearer {os.environ['MNTR_API_KEY']}"}
API = "https://api.mntr.ai/v1"
draft = requests.post(f"{API}/asset-drafts", headers=H, json={
"form": "brand-guide",
"community": "filmmakers",
"brain": "musey",
"brief": "The brand guide for our 2027 relaunch.",
}, timeout=30).json()["draft"]
while draft["status"] == "writing":
time.sleep(5)
draft = requests.get(f"{API}/asset-drafts/{draft['id']}", headers=H, timeout=30).json()["draft"]
print(draft["status"], draft["problems"])
print(requests.get(f"{API}/asset-drafts/{draft['id']}", headers=H,
params={"format": "markdown"}, timeout=30).text)A draft is ready when every block meets its form, partial when some still miss it (listed in problems), or failed. Anything the mind's record does not hold comes back as a [bracket] for a person to fill, never invented. A draft takes about a minute.
Claude and ChatGPT apps
For people rather than code: MNTR is also a connector. Add it once, sign in with your MNTR account, and ask your minds directly inside Claude or ChatGPT.
| Connector URL | https://os.mntr.ai/mcp |
| In Claude | Settings → Connectors → Add custom connector. Name it MNTR. |
| In ChatGPT | Settings → Connectors → Create, with the same URL. |
| Sign in | Your MNTR email and password. No API key is needed; the connector reaches the minds your account reaches. |
Reference
Every endpoint takes Authorization: Bearer <key> (or X-API-Key: <key>) and answers JSON with success.
The minds this key can call, each with reach: admin, owned, shared or granted. Start here.
One mind's NarrativeDNA, as data and as a prompt block.
| Query | Meaning |
|---|---|
brain | The mind's slug or id. With only community, the community's default mind answers. |
community | The community slug. Needed with a slug that several communities share. |
specialty | The lane to read the mind through: marketing, creative, sales, mntr (default). |
surface | founding (default) for the founder's own team, or community for the people the mind mentors. |
q | What you are making. Returns the frameworks and stories that bear on it, and adds them to prompt. |
k | How many of each to retrieve, 1 to 8. Default 5. |
{
"success": true,
"community": { "id": "…", "slug": "filmmakers", "name": "Musey" },
"brain": { "id": "…", "slug": "musey", "name": "Musey", "kind": "founder", "essence": "…", "ethos": "…", "avatarUrl": "…" },
"founderName": "Patrick Moreau",
"brand": { "osName": "Musey", "heroMission": "…", "logoUrl": "…", "markUrl": "…", "wordmarkUrl": "…",
"canvas": { "ink": "#131A08", "accent": "#CEEA36" } },
"surface": "founding",
"layers": {
"trustSafety": "…",
"identityAssertion": "…",
"identity": "…the identity core, in markdown…",
"specialty": { "slug": "marketing", "body": "…", "overridden": true },
"icp": "…the person across the table…"
},
"map": {
"principles": [{ "stableId": "…", "name": "Story First", "kind": "Master principle", "summary": "…" }],
"frameworks": [ … ], "tactics": [ … ], "stories": [ … ]
},
"relevant": {
"query": "a landing page for a documentary filmmaker",
"frameworks": [{ "name": "…", "level": "P1", "summary": "…", "body": "…", "score": 0.71 }],
"stories": [{ "name": "…", "chunkType": "story", "delivery": "…", "lesson": "…" }]
},
"prompt": "…every layer above, in assembly order, ready to be a system prompt…",
"updatedAt": "2026-10-29T12:00:00.000Z"
}The deliverable forms, each with its sections and current version.
One form's full structure: every section and block, its story job, the DNA it draws on, and its budget. ?version=N for an earlier version.
A mind fills a form. Body: form, brain and/or community, optional brief (up to 6,000 characters), version, and wait (0 to 120 seconds to hold the request for the result). Answers 202 while writing, 200 when it finished inside wait.
One draft: status, output keyed by section and block, problems, the model and token counts. ?format=markdown for the document. A member key reads only the drafts it made.
Recent drafts, newest first. ?form= and ?brain= narrow them.
A member's dossier by ?email=. Admin keys only.
A community's current identity core for a doorway page, by ?community=. Admin keys only.
Using the DNA well
- Put
promptfirst and keep it whole. It is the mind's charter, assembled in a fixed order. Summarising it loses the judgment, which is the part that matters. - Say what you are making in
q. The same mind returns different frameworks and stories for a pricing page than for a keynote. - Choose the lane.
specialty=marketingfor copy,creativefor creative direction,salesfor offers and calls. - Fetch per session, not per message. The DNA changes when the mind is tuned, not between turns. Cache it for the length of a task.
- Hold the line on facts. Names, numbers, results and testimonials come only from the DNA or your own brief. Everything else stays a bracket.
- Brand is a starting point.
brandcarries the colours and marks in use today. A logo is always a person's work.
Errors and limits
| Status | Means |
|---|---|
400 | A parameter is missing or out of range. error names it. |
401 | No key, or a key that is wrong or revoked. |
403 | The endpoint needs an admin key. |
404 | No such mind, form or draft, or one outside your key's reach. |
429 | Over the rate limit: 100 requests an hour from one address. Wait and retry. |
500 | Something failed on MNTR's side. Retry once; if it persists, tell your MNTR contact the time and endpoint. |