Genome
Who the brand is, what it thinks, how it looks.
Privacy and analytics
We use necessary technical cookies and, only with your consent, analytics and marketing pixels to improve the website and measure campaigns.
Who the brand is, what it thinks, how it looks.
Who the brand is, what it thinks and how it looks (Genome v2). Ask only for the sections you need; omit sections for a short summary of all of them.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/genome.read |
| MCP tool | genome_read |
| Scope | genome.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API, Chat, Screens, Apps |
| Status | Available |
| Widget | record |
Input
{
sections?: Array<"metadata" | "visualIdentity" | "executiveSummary" | "identity" | "positioning" | "audiences" | "archetypes" | "verbalSystem" | "messageArchitecture" | "marketLandscape" | "customerJourney" | "creativeTerritories" | "commercial" | "guardrails" | "localization" | "brandMemory" | "diagnosticPlan"> // ≤ 8 items
format?: "concise" | "detailed" // default "concise" · `concise` returns names and states only; `detailed` adds ids and full fields.
}Output
{
revision: integer // -9007199254740991–9007199254740991
generatedAt: string
sections: Record<string, unknown>
provenance: {
confidence: "high" | "medium" | "low" | "unknown"
researchAsOf: string
}
}Files a proposed value for one Genome field (key is the field path inside the section, e.g. purpose in identity or headquarters.city in metadata), citing where it comes from. Text fields only; the Kit is edited in the Kit. Nothing changes until a person accepts it in Genome › Memory, which then writes the field, so it needs no confirmation.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.propose |
| MCP tool | genome_propose |
| Scope | genome.write |
| Minimum role | Member |
| Human confirmation | No |
| Doors | Nödo, MCP, API, Chat, Screens, Apps |
| Status | Available |
Input
{
section: "metadata" | "visualIdentity" | "executiveSummary" | "identity" | "positioning" | "audiences" | "archetypes" | "verbalSystem" | "messageArchitecture" | "marketLandscape" | "customerJourney" | "creativeTerritories" | "commercial" | "guardrails" | "localization" | "brandMemory" | "diagnosticPlan"
key: string
value: string // ≤ 2000
reason: string // ≤ 500
citation: {
conversationId?: string // uuid
messageSequence?: integer // -9007199254740991–9007199254740991
url?: string // uri
}
}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Checks a text against the brand rules in the Genome (forbidden words, don't-say swaps, forbidden claims, form of address, emojis) and the advertising rules of its sector (food, health, finance, gambling, environmental claims). Model-free: same answer every time. Also answers the rule part of the brand checklist (yes/no questions compiled from the brand brief) with a score of questions passed over evaluated. Use it when the person asks to check a text, or before saving copy into a draft or a work; it flags, a person decides.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/genome.check_copy |
| MCP tool | genome_check_copy |
| Scope | genome.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API, Chat, Screens, Apps |
| Status | Available |
| Widget | review |
Input
{
text: string // ≤ 8000
}Output
{
ok: boolean // False when any finding is blocking.
findings: Array<{
ruleId: string
source: string // `brand` for the Genome rules, otherwise the sector pack.
severity: "block" | "warn"
match: string
index: integer // -9007199254740991–9007199254740991
message: {
es: string
en: string
}
suggestion?: string
reference: string // Genome path or norm the rule comes from.
}>
packs: Array<{
id: string
law: string
}>
checklist: Array<{
id: string // Stable id of the question within this Genome, e.g. `address`, `forbidden_words`, `pack.food`.
question: {
es: string
en: string
} // Yes/no question compiled from the brand brief.
decidedBy: "rule" // Answered without a model by the checker.
path: string // Genome path or norm the question comes from.
passed: boolean
severity?: "block" | "warn" // Strongest finding behind a failure.
reasons: Array<{
match: string
message: {
es: string
en: string
}
suggestion?: string
}>
}> // The rule-decidable part of the brand checklist, answered for this text. Questions that need a model (voice, tone, proof) are not answered here.
score: {
passed: integer // 0–9007199254740991
evaluated: integer // 0–9007199254740991
value: number // 0–1 · passed / evaluated; 1 when nothing could be evaluated.
} // Checklist questions passed over questions evaluated, for this text only.
}The part of the brand checklist a rule cannot answer (whether it sounds like the brand, tone, writing rules, what the brand stays clear of, proof and invention), answered by a model reading the brand brief: yes or no per question, with the words of the text that decide it and why. One model call charged to the brand's AI budget; use genome.check_copy first for the free rule part, and this one when the person wants the voice checked too.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/genome.judge_copy |
| MCP tool | genome_judge_copy |
| Scope | genome.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API, Chat, Screens, Apps |
| Status | Available |
Input
{
text: string // ≤ 8000
}Output
{
judged: Array<{
id: string // Stable id of the question within this Genome, e.g. `voice_signature`, `writing_rule.0`, `no_invention`.
question: {
es: string
en: string
}
decidedBy: "judge"
path: string // Genome path the question comes from.
passed: boolean
quote: string // Words of the text the answer rests on; empty when it is about something missing.
reason: string // Why yes or no, in the brand's language.
}> // Judge questions answered, in checklist order. A question the model left unanswered is not listed.
asked: integer // 0–9007199254740991 · Judge questions put to the model.
score: {
passed: integer // 0–9007199254740991
evaluated: integer // 0–9007199254740991
value: number // 0–1
}
}The brand as a file for other tools: BRAND.md (how to write as the brand, for any AI agent or writer), DESIGN.md (how it looks, with accessible colour pairs), brand.json (stable machine projection) or W3C design tokens (DTCG 2025.10).
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/genome.export |
| MCP tool | genome_export |
| Scope | genome.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API, Chat, Screens, Apps |
| Status | Available |
| Widget | file |
Input
{
format: "brand_md" | "design_md" | "brand_json" | "tokens"
}Output
{
filename: string
mimeType: string
content: string
}What a strategist would object to before trusting the Genome, model-free: contradictions (its own examples or claims breaking its rules or its sector's), placeholders and filler, an advertising register where analysis belongs, the same few words saturating the whole document, missing parts, unclassified sector, data nobody confirmed, a changed homepage and old research. Use it to decide what to ask or propose; the score is a trend, never a grade to show the brand.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/genome.audit |
| MCP tool | genome_audit |
| Scope | genome.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API, Chat, Screens, Apps |
| Status | Available |
| Widget | review |
Input
{}Output
{
score: integer // 0–100
issues: Array<{
kind: "contradiction" | "placeholder" | "filler" | "ornament" | "fixation" | "repetition" | "missing_part" | "unclassified" | "unconfirmed" | "undecided_tone" | "website_changed" | "refresh_due"
severity: "high" | "medium" | "low"
path: string
detail: string
}>
}The latest review of what an AI assistant with web search answers when a customer asks about the brand, compared with the Genome: what it gets right, wrong and misses. Paid plans get it monthly (ai_visibility_audits_per_month); free plans once, as a welcome. Use it to propose content or Genome fixes that close the gaps.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/genome.ai_visibility |
| MCP tool | genome_ai_visibility |
| Scope | genome.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API, Chat, Screens, Apps |
| Status | Available |
| Widget | review |
Input
{}Output
{
audit: {
assistant: string
createdAt: string
question: string
recognized: boolean
accuracy: integer | null
summary: string
correct: string[]
wrong: Array<{
claim: string
genomeSays: string
}>
missing: string[]
sourceDomains: string[]
}
| null
monthlyAllowance: integer // -9007199254740991–9007199254740991 · Reviews per month on the current plan; 0 means only the welcome review.
}The brand's competitors as light Genomes: what they sell, how they position themselves, how they talk, their prices, recent moves and how they differ from the brand. Paid plans keep them current monthly (competitor_genomes); free plans get a welcome look at two. Use it for positioning, content angles and pricing conversations.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/genome.competitors |
| MCP tool | genome_competitors |
| Scope | genome.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API, Chat, Screens, Apps |
| Status | Available |
| Widget | list |
Input
{}Output
{
competitors: Array<{
name: string
website: string | null
origin: "genome" | "discovered"
researchedAt: string
whatItSells: string
positioning: string
voice: string[]
priceSignal: string
strengths: string[]
weaknesses: string[]
recentMoves: string[]
differenceVsBrand: string
}>
tracked: integer // -9007199254740991–9007199254740991 · Competitors the plan keeps current; 0 means only the welcome look.
}Reads a brand manual (PDF) from the Library and files, in Genome › Memory, one proposal per Genome field the manual defines (voice, rules, form of address, positioning, limits…), citing the page and the exact sentence. Runs in the background; nothing changes until a person accepts each proposal, so it needs no confirmation. fileId is a Library document id.
Consumes the brand AI budget.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.import_manual |
| MCP tool | genome_import_manual |
| Scope | genome.write |
| Minimum role | Admin |
| Human confirmation | No |
| Doors | Nödo, MCP, API, Chat, Screens, Apps |
| Status | Available |
| Widget | progress |
Input
{
fileId: string // uuid
}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Queues the research run that writes the brand report. It runs in the background and a repeat within five minutes is not queued twice. Returns as soon as it is queued.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.report.generate |
| MCP tool | genome_report_generate |
| Scope | genome.write |
| Minimum role | Admin |
| Human confirmation | No |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Changes the brand display name in the Genome and its brand projection, recording it in the activity. Brands without a Genome yet change the brand record directly.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.name.update |
| MCP tool | genome_name_update |
| Scope | genome.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
name: string // ≤ 200
}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Sets one Genome field by its dot path (for example strategy.identity.essence) and saves a new revision. Fails on an unknown path, an invalid value or a section inherited from a parent brand.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.field.update |
| MCP tool | genome_field_update |
| Scope | genome.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
path: string // ≤ 200
value: unknown
}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Confirms up to 40 Genome fields as they are (what research proposed) without changing their value. Same revision rules as an edit.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.fields.confirm |
| MCP tool | genome_fields_confirm |
| Scope | genome.write |
| Minimum role | Admin |
| Human confirmation | No |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
paths: string[] // ≤ 40 items
}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Every state the brand Genome reached (edits, confirmations, regenerations, restores), newest first, with who made it and which strategy sections changed against the one before. The baseline is the snapshot taken before Genome v3. Content is not returned.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/genome.versions.list |
| MCP tool | genome_versions_list |
| Scope | genome.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
limit?: integer // 1–60
}Output
{
versions: Array<{
id: string // uuid
revision: integer // -9007199254740991–9007199254740991
reason: "baseline" | "edit" | "generation" | "restore" | "sync"
label: string | null
createdAt: string
author: string | null // Display name of who made the change; null for research and automation.
restoredFrom: string | null
changedSections: string[] // Strategy sections that changed against the version before it.
current: boolean
}>
}The Genome fields a version changed against the version before it (same brand): each leaf path with the page section that shows it and the value before and after as short text. Use genome.versions.list for the version ids. The first version has no previous one: every field reads as added.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/genome.version.diff |
| MCP tool | genome_version_diff |
| Scope | genome.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
versionId: string // uuid
}Output
{
versionId: string // uuid
previousId: string | null
changes: Array<{
path: string // Leaf path in the Genome document, e.g. `strategy.verbalSystem.toneSliders.formality`.
section: string | null // Section of the Genome page that shows it (`voice`, `positioning`, `overview`…); null when the page does not draw it.
field: string // The field that names the change: the key under the chapter or under `metadata`.
detail: string // What lies below that field on the path; empty for the field itself.
before: string // The value before, as short text (lists joined, records by their main text); empty when there was none.
after: string // The value after, as short text; empty when it was removed.
change: "added" | "removed" | "changed"
}>
truncated: boolean // True when more fields changed than the 200 returned.
}Writes the strategy and confirmations of an earlier version back as a new revision. Nothing is lost: the current one stays in the history. The profile (name, place, language), the Kit and sections inherited from a parent brand stay as they are now.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.version.restore |
| MCP tool | genome_version_restore |
| Scope | genome.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
versionId: string // uuid
}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Fills with AI the completable parts a Genome section lacks (positioning, verbalSystem, commercial or localization). Returns the completed paths and their sources; an already complete section returns an empty list.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.section.complete |
| MCP tool | genome_section_complete |
| Scope | genome.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
section: "positioning" | "verbalSystem" | "commercial" | "localization"
}Output
{
completed: string[]
sources: Record<string, unknown>[]
}Turns the brand public schema.org profile on or off. Returns the profile that is (or would be) published, or null when it cannot be composed.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.public_profile.set |
| MCP tool | genome_public_profile_set |
| Scope | genome.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
enabled: boolean
}Output
{
profile: Record<string, unknown> | null
}Records that the person looked at the detected change of the brand homepage against the Genome, so it stops being flagged.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.website_change.review |
| MCP tool | genome_website_change_review |
| Scope | genome.write |
| Minimum role | Admin |
| Human confirmation | No |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}This brand inherits some Genome sections from another brand of its organization. The caller needs Genome edit rights in both brands; status says why a link did not happen.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.inheritance.link |
| MCP tool | genome_inheritance_link |
| Scope | genome.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
parentBrandId: string // uuid
sections: string[] // ≤ 40 items
}Output
{
status: string
}The brand stops inheriting its Genome: it keeps the Genome as it is and can edit it again.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/genome.inheritance.unlink |
| MCP tool | genome_inheritance_unlink |
| Scope | genome.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{}Output
{
unlinked: boolean
}The Genome's state and a few lines of it: industry, essence, positioning, personality and organisation facts (type, city, country, founding year, language). toConfirm lists the core data no person has confirmed yet (path, current value, review when someone disputed it), without what the brand inherits; confirm them with genome.fields.confirm or correct them with genome.field.update. For the whole document use genome.read.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/genome.summary |
| MCP tool | genome_summary |
| Scope | genome.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{}Output
{
status: string
toConfirm?: Array<{
path: string
review: boolean
}>
}Updated on January 1, 1970