MNTR API
Intelligence infrastructure

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.

Base URLhttps://api.mntr.ai/v1
01

A key

Issued by MNTR. It starts with mntr_ and decides which minds you can call. Keep it server-side.

02

A mind

Call /v1/brains to see the minds your key reaches. Every key reaches Musey, so every example here works on day one.

03

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

shell
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"
response
{
  "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"

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.

KeyReachesFor
adminEvery mind on the platform, every draft, and the admin-only endpoints.MNTR's own team and systems.
memberThe 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.
partnerA 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.

Getting a key. Your MNTR contact issues it and sends it to you privately. The secret is shown once and never stored by MNTR, so if you lose it, it is revoked and a new one issued. Keys can be revoked at any time.
Keep it server-side. Never put a key in a browser, a mobile app, a public repository or a shared document. Store it as an environment variable or in your platform's secret store. Anyone holding it reads every mind it reaches.

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)

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.

tool definition
{
  "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.

instructions
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.

MethodGET
URLhttps://api.mntr.ai/v1/narrative-dna
Querycommunity, brain, and optionally specialty, q
HeaderAuthorization = Bearer mntr_… (store it as a credential, not in the step)
Useprompt 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.

FormWhat it is
brand-guideThirteen pages: cover, story, beliefs, audience, positioning, method, messaging, voice, language, colour, type, imagery, applications.
filmmaker-landing-pageNine 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"

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 URLhttps://os.mntr.ai/mcp
In ClaudeSettings → Connectors → Add custom connector. Name it MNTR.
In ChatGPTSettings → Connectors → Create, with the same URL.
Sign inYour 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.

GET/v1/brains

The minds this key can call, each with reach: admin, owned, shared or granted. Start here.

GET/v1/narrative-dna

One mind's NarrativeDNA, as data and as a prompt block.

QueryMeaning
brainThe mind's slug or id. With only community, the community's default mind answers.
communityThe community slug. Needed with a slug that several communities share.
specialtyThe lane to read the mind through: marketing, creative, sales, mntr (default).
surfacefounding (default) for the founder's own team, or community for the people the mind mentors.
qWhat you are making. Returns the frameworks and stories that bear on it, and adds them to prompt.
kHow many of each to retrieve, 1 to 8. Default 5.
response (abridged)
{
  "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"
}
GET/v1/asset-forms

The deliverable forms, each with its sections and current version.

GET/v1/asset-forms/{slug}

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.

POST/v1/asset-drafts

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.

GET/v1/asset-drafts/{id}

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.

GET/v1/asset-drafts

Recent drafts, newest first. ?form= and ?brain= narrow them.

GET/v1/user-context admin

A member's dossier by ?email=. Admin keys only.

GET/v1/doorway-brain admin

A community's current identity core for a doorway page, by ?community=. Admin keys only.

Using the DNA well

Errors and limits

StatusMeans
400A parameter is missing or out of range. error names it.
401No key, or a key that is wrong or revoked.
403The endpoint needs an admin key.
404No such mind, form or draft, or one outside your key's reach.
429Over the rate limit: 100 requests an hour from one address. Wait and retry.
500Something failed on MNTR's side. Retry once; if it persists, tell your MNTR contact the time and endpoint.