Marca
Entrar, perfil, contacto y alma.
Privacidad y analítica
Utilizamos cookies técnicas necesarias y, solo si das tu consentimiento, analítica y pixels de marketing para mejorar la web y medir campañas.
Entrar, perfil, contacto y alma.
Resumen de la marca (un cliente MCP externo lo llama primero para orientarse): nombre, identificador, plan, Brand Manager, trabajos activos, tareas pendientes y lo que puede hacer quien pregunta.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.overview |
| Herramienta MCP | brand_overview |
| Alcance | brand.read |
| Rol mínimo | Lector |
| Confirmación humana | No |
| Puertas | Nödo, Voz, MCP, API, Chat, Pantallas, Apps |
| Estado | Disponible |
| Widget | record |
Entrada
{}Salida
{
id: string // uuid
shortId: string // Human id such as BRD-8C1TZA.
name: string
plan: string | null
manager: {
id: string // uuid
name: string
avatarUrl: string | null
}
| null
counts: {
activeWorks: integer // -9007199254740991–9007199254740991
pendingTasks: integer // -9007199254740991–9007199254740991
pendingMemory: integer // -9007199254740991–9007199254740991
}
role: string | null // Brand role of the caller, or null for staff.
capabilities: string[] // Capability ids the caller may use here.
}La voz de la marca compilada del Genoma vigente (que puede estar sin confirmar por la marca): tono, arquetipos, vocabulario, límites, idiomas y ejemplos dentro y fuera de marca. Úsala antes de escribir o crear en su nombre; lo que falte aparece en gaps.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.soul.read |
| Herramienta MCP | brand_soul_read |
| Alcance | brand.read |
| Rol mínimo | Lector |
| Confirmación humana | No |
| Puertas | Nödo, Voz, MCP, API, Chat, Pantallas, Apps |
| Estado | Disponible |
Entrada
{}Salida
{
revision: integer // -9007199254740991–9007199254740991
genomeRevision: integer // -9007199254740991–9007199254740991 · Accepted Genome revision it was compiled from.
compiledAt: string
voice: {
summary: string // ≤ 600
tone: Array<{
axis: string
position: number // -2–2
}> // ≤ 6 items · e.g. formal(-2)…casual(+2).
traits: string[] // ≤ 8 items
archetypes: string[] // ≤ 3 items
}
vocabulary: {
use: string[] // ≤ 30 items
avoid: string[] // ≤ 30 items
}
guardrails: string[] // ≤ 15 items
audiences: string[] // ≤ 6 items
locales: Array<{
locale: string
notes: string // ≤ 300
}> // ≤ 8 items
writing: {
address: string // ≤ 300 · How the brand addresses the reader (tú, usted, vos) and its exceptions.
addressConfirmed?: boolean // False while no person has confirmed the form of address (Genome 2.1): it is a proposal, so Nödo says so once instead of assuming it.
sayDontSay: Array<{
say: string
dontSay: string
}> // ≤ 10 items
conventions: string[] // ≤ 8 items
channels: Array<{
channel: string
guidance: string
}> // ≤ 6 items
} // default {"address":"","sayDontSay":[],"conventions":[],"channels":[]}
examples: Array<{
context: string // default ""
onBrand: string
offBrand: string
}> // ≤ 10 items
gaps: string[] // Genome sections missing or unaccepted; Nödo asks instead of guessing.
}Cambia nombre, país, ciudad, tipo de organización o idioma principal. Se guarda en el Genoma con control de revisión.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.profile.update |
| Herramienta MCP | brand_profile_update |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | Nödo, MCP, API, Chat, Pantallas, Apps |
| Estado | Disponible |
| Widget | confirm |
Entrada
{
expectedRevision: integer // -9007199254740991–9007199254740991
displayName?: string // ≤ 120
countryCode?: string // ≤ 2
city?: string // ≤ 120
organizationType?: string // ≤ 40
primaryLanguage?: string // ≤ 12
}Salida
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Canales públicos de la marca: web, email, teléfono y perfiles sociales.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.contacts.list |
| Herramienta MCP | brand_contacts_list |
| Alcance | brand.read |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | Nödo, Voz, MCP, API, Chat, Pantallas, Apps |
| Estado | Disponible |
| Widget | list |
Entrada
{}Salida
{
items: Array<{
id: string // uuid
type: "website" | "email" | "phone" | "whatsapp" | "instagram" | "facebook" | "linkedin" | "tiktok" | "x" | "youtube" | "pinterest" | "other"
value: string
label: string | null
}>
}Añade, cambia o quita un canal público. Valida el formato y los límites por tipo.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.contacts.save |
| Herramienta MCP | brand_contacts_save |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | Nödo, MCP, API, Chat, Pantallas, Apps |
| Estado | Disponible |
| Widget | confirm |
Entrada
{
op: "upsert"
id?: string // uuid
type: "website" | "email" | "phone" | "whatsapp" | "instagram" | "facebook" | "linkedin" | "tiktok" | "x" | "youtube" | "pinterest" | "other"
value: string // ≤ 500
label?: string // ≤ 80
}
| {
op: "delete"
id: string // uuid
}Salida
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Añade o cambia un dato de «Contacto y social», también la dirección. Valida el formato y el límite por tipo.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.connections.save |
| Herramienta MCP | brand_connections_save |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
type: "website" | "instagram" | "facebook" | "twitter" | "linkedin" | "tiktok" | "youtube" | "pinterest" | "whatsapp" | "email" | "phone" | "address" | "other"
value: string // ≤ 2000
label?: string // ≤ 200
connectionId?: string // uuid
}Salida
{
connection: {
id: string // uuid
}
}Guarda a mano el foco de contenido de la marca (redes, tipos de contenido, frecuencia y objetivo) y lo marca como completo.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.content_focus.update |
| Herramienta MCP | brand_content_focus_update |
| Alcance | brand.write |
| Rol mínimo | Miembro |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
content: {
networks: Record<string, unknown>
generalNotes?: string | null
}
}Salida
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Solo el equipo de Nömad: vuelve a escribir con IA el foco de contenido de la marca. Corre en segundo plano.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.content_focus.regenerate |
| Herramienta MCP | brand_content_focus_regenerate |
| Alcance | brand.write |
| Rol mínimo | Miembro |
| Confirmación humana | No |
| Puertas | API, Pantallas, Apps |
| Estado | Disponible |
Entrada
{}Salida
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}«No me interesa» en un producto recomendado a la marca, o deshacerlo.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.recommendations.dismiss |
| Herramienta MCP | brand_recommendations_dismiss |
| Alcance | brand.write |
| Rol mínimo | Lector |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
productId: string // ≤ 120
dismissed: boolean
}Salida
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Anota que la persona abrió un producto del Store en esta marca, para ordenar el lanzador por lo reciente.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.product_visits.record |
| Herramienta MCP | brand_product_visits_record |
| Alcance | brand.write |
| Rol mínimo | Lector |
| Confirmación humana | No |
| Puertas | Pantallas, Apps |
| Estado | Disponible |
Entrada
{
productId: string // ≤ 160
}Salida
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Los elementos de la marca que la persona marcó como favoritos, de un tipo (productos, trabajos, archivos…), del más reciente al más antiguo.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.favorites.list |
| Herramienta MCP | brand_favorites_list |
| Alcance | brand.read |
| Rol mínimo | Lector |
| Confirmación humana | No |
| Puertas | Pantallas, Apps, API |
| Estado | Disponible |
Entrada
{
entityType: string // ≤ 60
entityIds?: string[] // ≤ 500 items
}Salida
{
ids: string[]
}Marca como favorito de la persona un elemento de la marca (un archivo, un trabajo…) o lo quita si ya lo era.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.favorites.toggle |
| Herramienta MCP | brand_favorites_toggle |
| Alcance | brand.write |
| Rol mínimo | Lector |
| Confirmación humana | No |
| Puertas | Pantallas, Apps |
| Estado | Disponible |
Entrada
{
entityType: string // ≤ 60
entityId: string // ≤ 200
}Salida
{
isFavorite: boolean
}Marca o quita como favoritos de la persona varios elementos de la marca a la vez. Devuelve los que cambiaron.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.favorites.set |
| Herramienta MCP | brand_favorites_set |
| Alcance | brand.write |
| Rol mínimo | Lector |
| Confirmación humana | No |
| Puertas | Pantallas, Apps |
| Estado | Disponible |
Entrada
{
entityType: string // ≤ 60
entityIds: string[] // ≤ 200 items
favorite: boolean
}Salida
{
changed: string[]
}Crea un producto o servicio de la marca con su precio, rasgos y portada (un archivo de la Biblioteca de la marca).
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.offerings.create |
| Herramienta MCP | brand_offerings_create |
| Alcance | brand.write |
| Rol mínimo | Miembro |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
title: string // ≤ 500
description?: string | null
short_description?: string | null
category?: string | null
category_id?: string | null
type: "product" | "service"
status?: string // ≤ 40
price?: number | null
currency?: string // ≤ 3
sale_price?: number | null
price_unit?: string // ≤ 40
features?: string[] // ≤ 100 items
sku?: string | null
is_recurring?: boolean
recurring_interval?: "weekly" | "monthly" | "quarterly" | "annual" | null
sort_order?: integer // -9007199254740991–9007199254740991
image_asset_id?: string | null
}Salida
{
offering: {
id: string // uuid
brand_id: string // uuid
}
}Cambia los campos de una oferta de la marca. La portada se reconstruye desde su archivo de la Biblioteca.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.offerings.update |
| Herramienta MCP | brand_offerings_update |
| Alcance | brand.write |
| Rol mínimo | Miembro |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
offeringId: string // uuid
changes: {
title?: string // ≤ 500
description?: string | null
short_description?: string | null
category?: string | null
category_id?: string | null
type?: "product" | "service"
status?: string // ≤ 40
price?: number | null
currency?: string // ≤ 3
sale_price?: number | null
price_unit?: string // ≤ 40
features?: string[] // ≤ 100 items
sku?: string | null
is_recurring?: boolean
recurring_interval?: "weekly" | "monthly" | "quarterly" | "annual" | null
sort_order?: integer // -9007199254740991–9007199254740991
image_asset_id?: string | null
}
}Salida
{
offering: {
id: string // uuid
brand_id: string // uuid
}
}Borra para siempre un producto o servicio de la marca con sus imágenes.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.offerings.delete |
| Herramienta MCP | brand_offerings_delete |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, Pantallas, Apps |
| Estado | Disponible |
Entrada
{
offeringId: string // uuid
}Salida
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}Añade a una oferta una imagen de la Biblioteca de la marca; la primera pasa a ser su portada.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.offerings.add_image |
| Herramienta MCP | brand_offerings_add_image |
| Alcance | brand.write |
| Rol mínimo | Miembro |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
offeringId: string // uuid
assetId: string // uuid
sortOrder?: integer // -9007199254740991–9007199254740991
}Salida
{
image: {
id: string // uuid
}
}Activa o desactiva los avisos periódicos de Nödo en la marca y elige su hora local.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.heartbeat.update |
| Herramienta MCP | brand_heartbeat_update |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
enabled: boolean
localHour: integer // 0–23
}Salida
{
enabled: boolean
localHour: integer // -9007199254740991–9007199254740991
}«Ya tengo un nombre»: da nombre a una marca que se creó sin él (Genoma primero) y devuelve los pasos de identidad.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.name.set |
| Herramienta MCP | brand_name_set |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
name: string // ≤ 200
}Salida
{
name: string
}«Aún no tengo nombre»: la marca lleva un código de trabajo en lugar de nombre y el perfil responde lo que eso implica (sin web, marca que empieza).
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.start_unnamed |
| Herramienta MCP | brand_setup_start_unnamed |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{}Salida
{
name: string
naming: {
status: string
code: string
since: string | null
namedAt: string | null
}
}Los logos encontrados en la web quedan como propuesta en la Biblioteca, salen del Kit y del Genoma, y el logo de la marca se quita si solo venía de ellos.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.logo_skip |
| Herramienta MCP | brand_setup_logo_skip |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{}Salida
{
ok: true
}Empieza a leer el logo, los colores y las tipografías de la web de la marca en cuanto se escribe, para que estén listos al llegar a esos pasos.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.extraction_start |
| Herramienta MCP | brand_setup_extraction_start |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
website: string // ≤ 200
}Salida
{
ok: true
}Lee la portada de la web (solo direcciones públicas, sin credenciales) y dice si tiene contenido propio y, si lo tiene, qué hace la marca en una o dos frases. Con eso el alta no vuelve a preguntar la descripción. Una página aparcada, en venta o en construcción no cuenta. No guarda nada.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.setup.website_read |
| Herramienta MCP | brand_setup_website_read |
| Alcance | brand.read |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
website: string // ≤ 200
}Salida
{
readable: boolean
summary: string | null
}Anota en el setup que el logo ya está elegido (tras subir un archivo propio, que ya es el logo de la marca).
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.logo_accept |
| Herramienta MCP | brand_setup_logo_accept |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{}Salida
{
ok: true
}Confirma un logo de la Biblioteca como logo de la marca y lo anota como decisión del setup. Una propuesta de la web pasa a aprobada.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.logo_choose |
| Herramienta MCP | brand_setup_logo_choose |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
assetId: string // uuid
}Salida
{
ok: true
}Publica en el Kit solo los colores extraídos que la persona marcó; los demás quedan fuera sin borrarse. Los colores añadidos a mano no se tocan.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.colors_decide |
| Herramienta MCP | brand_setup_colors_decide |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
decision: "accepted" | "skipped"
colorIds?: string[] // ≤ 48 items
}Salida
{
ok: true
}Publica en el Kit las tipografías confirmadas: las de Google con todos sus pesos; las propias con los archivos de su web si se aceptaron, o solo por nombre.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.typography_decide |
| Herramienta MCP | brand_setup_typography_decide |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
decision: "accepted" | "skipped"
fonts?: Array<{
family: string // ≤ 80
role: "heading" | "body"
acceptSiteFiles?: boolean
}> // ≤ 3 items · default []
}Salida
{
ok: true
}Pone en marcha el Genoma de la marca con lo leído y respondido. Un Genoma parado se cierra antes. Las preguntas que bloquean lo impiden.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.genome_start |
| Herramienta MCP | brand_setup_genome_start |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{}Salida
{
ok: true
}Vuelve a lanzar el análisis de la marca desde el primer documento sin terminar, sin duplicar uno que siga en marcha. Una vez por minuto.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.analysis_retry |
| Herramienta MCP | brand_setup_analysis_retry |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{}Salida
{
ok: true
}Recuerda que la persona cerró la ventana del setup, la tarjeta del panel o el aviso de setup completado en este punto.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.dismiss |
| Herramienta MCP | brand_setup_dismiss |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
checkpoint: string // ≤ 60
target?: "flow" | "card" | "completion" // default "flow"
}Salida
{
ok: true
}Nödo propone la descripción de la marca con todo lo que sabe del perfil y de los archivos adjuntos, y dice qué leyó para escribirla. No guarda nada.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.setup.description_draft |
| Herramienta MCP | brand_setup_description_draft |
| Alcance | brand.read |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
description: string // ≤ 4000
without?: string[] // ≤ 12 items · default []
}Salida
{
draft: string
sources: Array<{
key: string
}>
}Deja un archivo fuera de lo que Nödo lee para la descripción de la marca. El archivo sigue en la Biblioteca.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.attachment_remove |
| Herramienta MCP | brand_setup_attachment_remove |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
assetId: string // uuid
}Salida
{
ok: true
}Envía todas las respuestas del asistente para generar el Genoma de la marca en segundo plano.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.wizard.feedback_submit |
| Herramienta MCP | brand_wizard_feedback_submit |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
wizardSession?: integer // 1–100 · default 1
}Salida
{
ok: true
}Pone en cola la generación de las tarjetas del asistente de la marca a partir de su investigación. Repetirla en cinco minutos no la duplica.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.wizard.cards_generate |
| Herramienta MCP | brand_wizard_cards_generate |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{}Salida
{
ok: true
runId: string
}«Salir del proceso»: lleva a la papelera las marcas a medio crear de la persona, cancela lo que pusieron en marcha y dice adónde ir.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.onboarding.abandon |
| Herramienta MCP | brand_onboarding_abandon |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, Pantallas, Apps |
| Estado | Disponible |
Entrada
{}Salida
{
destination: "/brands" | "/account"
failed: integer // -9007199254740991–9007199254740991
}Ajustes › General como los pinta la app: identidad, ubicación, idioma de comunicación, versión, lo que puedes hacer ahí y cuántas personas, conexiones y archivos en la papelera tiene.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.settings.read |
| Herramienta MCP | brand_settings_read |
| Alcance | brand.read |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | Pantallas, Apps, API |
| Estado | Disponible |
Entrada
{}Salida
{
brand: {
id: string
shortId: string | null
name: string
logoAssetId: string | null
logoUrl: string | null
country: string | null
city: string | null
version: integer | null
updatedAt: string | null
communicationLanguage: string | null
}
permissions: {
canEditSettings: boolean
canViewTeam: boolean
canManageTeam: boolean
canViewConnections: boolean
canCloseBrand: boolean
}
communicationLanguages: Array<{
code: string
name: string
nativeName: string | null
sortOrder: number | null
}>
counts: {
members: integer // -9007199254740991–9007199254740991
connections: integer // -9007199254740991–9007199254740991
trash: integer // -9007199254740991–9007199254740991
}
}Ajustes › General: guarda nombre, país, ciudad, tipo, idiomas y descripción. Se escriben en el Genoma cuando existe. Pide la versión leída.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.settings.update |
| Herramienta MCP | brand_settings_update |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
name: string // ≤ 200
country?: string | null
city?: string | null
description?: string | null
age?: string | null
brandType?: string | null
organizationType?: string | null
defaultLocale?: "es" | "en" | null
communicationLanguage?: string | null
expectedVersion?: integer | null
}Salida
{
ok: true
}Elige un archivo de la Biblioteca de la marca como su logo; la cabecera y la barra lateral lo muestran.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.logo.set |
| Herramienta MCP | brand_logo_set |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
assetId: string // uuid
}Salida
{
url: string
assetId: string
}La zona de la marca: la que usan sus planes editoriales, el latido de Nödo y el compositor de publicaciones.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.time_zone.set |
| Herramienta MCP | brand_time_zone_set |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{
timeZone: string | null // IANA zone (`Europe/Madrid`), or null to fall back.
}Salida
{
timeZone: string | null
}«Crear marca»: una marca nueva y provisional, activa desde ya, cuyo perfil se completa después. Va al workspace que indicas (si eres su propietario), al tuyo, o a uno nuevo. Si ya tienes una marca nueva sin tocar, se reutiliza.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.create |
| Herramienta MCP | brand_setup_create |
| Alcance | brand.write |
| Rol mínimo | self |
| Confirmación humana | No |
| Puertas | API, Pantallas, Apps |
| Estado | Disponible |
Entrada
{
workspaceId?: string | null
newWorkspace?: boolean
}Salida
{
id: string
shortId: string
name: string
created: boolean // False when an untouched provisional brand of the person was reused.
}Lo respondido del perfil de una marca nueva (nombre, web, edad, idioma, sede, descripción), el paso donde seguir y los idiomas de comunicación.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.setup.profile_read |
| Herramienta MCP | brand_setup_profile_read |
| Alcance | brand.read |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | Pantallas, Apps, API |
| Estado | Disponible |
Entrada
{}Salida
{
setup: {
brand: {
id: string
shortId: string
name: string
onboardingStep: integer // -9007199254740991–9007199254740991 · The step to resume on.
hasWebsite: boolean | null
website: string | null
age: string | null // new_brand or existing_brand.
communicationLanguage: string | null
country: string | null
city: string | null
description: string | null
}
profileSetup: {
status: string // required, in_progress or completed.
currentStep: integer // -9007199254740991–9007199254740991
provisionalName: boolean
completedAt: string | null
}
}
| null
languages: Array<{
code: string
name: string
nativeName: string | null
flag: string | null
}> // Communication languages to choose from, in the catalogue order.
}Guarda la respuesta de un paso del perfil de una marca nueva y el paso al que sigue. El nombre pasa a ser el de la marca en el momento.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.profile_save |
| Herramienta MCP | brand_setup_profile_save |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | Pantallas, Apps, API |
| Estado | Disponible |
Entrada
{
step: integer // 1–9
age?: "new_brand" | "existing_brand"
city?: string // ≤ 100
communicationLanguage?: string // ≤ 5
country?: string // ≤ 100
description?: string // ≤ 4000
hasWebsite?: boolean
name?: string // ≤ 160
website?: string | null
}Salida
{
brand: {
id: string
shortId: string
name: string
onboardingStep: integer // -9007199254740991–9007199254740991 · The step to resume on.
hasWebsite: boolean | null
website: string | null
age: string | null // new_brand or existing_brand.
communicationLanguage: string | null
country: string | null
city: string | null
description: string | null
}
profileSetup: {
status: string // required, in_progress or completed.
currentStep: integer // -9007199254740991–9007199254740991
provisionalName: boolean
completedAt: string | null
}
}Termina el perfil de una marca nueva con todas sus respuestas: pone en marcha la investigación, la preparación de la marca y la lectura de su web. Aplica el plan elegido antes del alta.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.setup.profile_complete |
| Herramienta MCP | brand_setup_profile_complete |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | Pantallas, Apps, API |
| Estado | Disponible |
Entrada
{
age: "new_brand" | "existing_brand"
city: string // ≤ 100
communicationLanguage: string // ≤ 5
country: string // ≤ 100
description: string // ≤ 4000
hasWebsite: boolean
name: string // ≤ 160
website: string | null
}Salida
{
brand: {
id: string
shortId: string
name: string
onboardingStep: integer // -9007199254740991–9007199254740991 · The step to resume on.
hasWebsite: boolean | null
website: string | null
age: string | null // new_brand or existing_brand.
communicationLanguage: string | null
country: string | null
city: string | null
description: string | null
}
profileSetup: {
status: string // required, in_progress or completed.
currentStep: integer // -9007199254740991–9007199254740991
provisionalName: boolean
completedAt: string | null
}
pendingCheckout: {
productId: string
interval: "month" | "year"
}
| null
}Lo respondido de una marca empezada en el asistente antiguo, para terminarla: nombre, web, edad, idioma, sede y descripción, y los idiomas de comunicación.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.onboarding.read |
| Herramienta MCP | brand_onboarding_read |
| Alcance | brand.read |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | Pantallas, Apps, API |
| Estado | Disponible |
Entrada
{}Salida
{
brand: {
id: string
shortId: string
name: string
onboardingStep: integer // -9007199254740991–9007199254740991 · The step to resume on.
hasWebsite: boolean | null
website: string | null
age: string | null // new_brand or existing_brand.
communicationLanguage: string | null
country: string | null
city: string | null
description: string | null
}
languages: Array<{
code: string
name: string
nativeName: string | null
flag: string | null
}> // Communication languages to choose from, in the catalogue order.
}Guarda un paso de una marca empezada en el asistente antiguo. Con una web, empieza a leer su logo, colores y tipografías.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.onboarding.step_save |
| Herramienta MCP | brand_onboarding_step_save |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | Pantallas, Apps, API |
| Estado | Disponible |
Entrada
{
step: integer // -9007199254740991–9007199254740991
age?: string // ≤ 40
city?: string // ≤ 100
communicationLanguage?: string // ≤ 5
country?: string // ≤ 100
hasWebsite?: boolean
name?: string // ≤ 50
website?: string // ≤ 200
}Salida
{
ok: true
}Termina una marca empezada en el asistente antiguo con su edad y descripción: queda activa y empieza su investigación.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.onboarding.complete |
| Herramienta MCP | brand_onboarding_complete |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | Pantallas, Apps, API |
| Estado | Disponible |
Entrada
{
age: string // ≤ 40
description: string // ≤ 4000
platform?: "ios" | "android"
}Salida
{
brandId: string
shortId: string
createdAt: string
}Decide si los agentes conectados solo leen, piden aprobación o escriben directamente en esta marca; sin valor, sigue al workspace.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.agent_policy.set |
| Herramienta MCP | brand_agent_policy_set |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | Pantallas, Apps |
| Estado | Disponible |
Entrada
{
policy: "read_only" | "approval" | "direct" | null
}Salida
{
ok: true
}La descripción, los productos y la web de la marca, como los muestra su inicio, la moneda en la que factura quien la paga y, si el plan se paga en App Store o Google Play, esa tienda y su precio.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.summary |
| Herramienta MCP | brand_summary |
| Alcance | brand.read |
| Rol mínimo | Lector |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{}Salida
{
description: string | null
products: unknown
website: string | null
billingCurrency: string // default "EUR"
planStore: {
provider: "apple" | "google"
grossMinor: integer | null
currency: string | null
interval: "month" | "year" | null
}
| null // default null
}Lo que una marca sabe de su Brand Manager: su tarjeta pública (nombre, foto y puesto), su estado en directo y la tarjeta de quién le cubre si está fuera. Nunca correo, teléfono, notas ni registro.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.manager.presence |
| Herramienta MCP | brand_manager_presence |
| Alcance | brand.read |
| Rol mínimo | Lector |
| Confirmación humana | No |
| Puertas | API, MCP, Pantallas, Apps, Nödo |
| Estado | Disponible |
Entrada
{}Salida
{
presence: Record<string, unknown> | null
}Qué pasaría ahora si cierras la marca: trabajos, personas, plan y conexiones, qué lo impide, si se cierra ya o al terminar lo pagado y qué escribir para confirmar. No cambia nada.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.close.review |
| Herramienta MCP | brand_close_review |
| Alcance | brand.read |
| Rol mínimo | Propietario |
| Confirmación humana | No |
| Puertas | Pantallas, Apps |
| Estado | Disponible |
Entrada
{}Salida
{
version: 1
operation: "account.delete" | "workspace.close" | "workspace.transfer" | "workspace.leave" | "workspace.member.remove" | "brand.close" | "brand.leave" | "brand.member.remove" | "brand.reopen" | "workspace.reopen"
subject: {
type: "account" | "workspace" | "brand"
id: string // uuid
name: string | null
email?: string | null
state?: "active" | "closing" | "closed"
workspace?: {
id: string // uuid
name: string | null
}
}
actor: {
id: string // uuid
role: string | null
}
target: {
id: string // uuid
name: string | null
email: string | null
avatar_url?: string | null
role?: string | null
scope?: string | null
}
| null
allowed: boolean
requires: {
reauth: boolean
typed: string | null
}
blockers: Array<{
code: string
workspace?: {
id: string // uuid
name: string | null
}
}>
decisions: Array<{
code: "workspace_successor"
workspace: {
id: string // uuid
name: string | null
}
options: Array<"transfer" | "close">
close_available: boolean
candidates: Array<{
id: string // uuid
name: string | null
email: string | null
avatar_url?: string | null
role?: string | null
scope?: string | null
}>
default: "transfer" | "close"
}
| {
code: "close_when"
options: Array<"now" | "when_commitments_end">
now_available: boolean
default: "now" | "when_commitments_end"
paid_works: integer // -9007199254740991–9007199254740991
plan_ends_at: string | null
}
| {
code: "new_owner"
candidates: Array<{
id: string // uuid
name: string | null
email: string | null
avatar_url?: string | null
role?: string | null
scope?: string | null
}>
previous_owner_options: Array<"admin" | "leave">
default: "admin" | "leave"
}>
workspaces: Array<{
id: string // uuid
name: string | null
role: string | null
outcome: "leave" | "close" | "decide" | "transfer" | "member_removed" | "stays" | "reopen"
people: Array<{
id: string // uuid
name: string | null
email: string | null
avatar_url?: string | null
role?: string | null
scope?: string | null
}>
brands: Array<{
id: string // uuid
name: string | null
workspace_id: string // uuid
state: "active" | "closing" | "closed"
works_open: integer // -9007199254740991–9007199254740991
tasks_open: integer // -9007199254740991–9007199254740991
tasks_assigned: integer // -9007199254740991–9007199254740991
files: integer // -9007199254740991–9007199254740991
connections: integer // -9007199254740991–9007199254740991
connections_authorized: integer // -9007199254740991–9007199254740991
conversations: integer // -9007199254740991–9007199254740991
invoices: integer // -9007199254740991–9007199254740991
orders: integer // -9007199254740991–9007199254740991
people: Array<{
id: string // uuid
name: string | null
email: string | null
avatar_url?: string | null
role?: string | null
scope?: string | null
}>
commitments: {
paid_works: Array<{
id: string // uuid
name: string | null
status: string
delivery_at: string | null
}>
plan_works: integer // -9007199254740991–9007199254740991
plans: Array<{
id: string
name: string | null
store: "stripe"
status: string
period_end: string | null
renewal_cancelled: boolean
}>
agreements: Array<{
id: string
name: string | null
status: string
}>
unsettled_orders: integer // -9007199254740991–9007199254740991
unsettled_payments: integer // -9007199254740991–9007199254740991
unsettled_quotes: integer // -9007199254740991–9007199254740991
reconciliation: integer // -9007199254740991–9007199254740991
}
| null
}>
access?: "narrowed" | "brand"
billing?: {
name: string | null
tax_id: string | null
}
| null
}>
fingerprint: string
}Cierra la marca tal y como la revisaste: queda como archivo de solo lectura, ahora o al terminar lo pagado. El dinero no se borra y el equipo de Nömad puede reabrirla. Solo quien es propietario, con un inicio de sesión reciente.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.close |
| Herramienta MCP | brand_close |
| Alcance | brand.write |
| Rol mínimo | Propietario |
| Confirmación humana | Sí |
| Puertas | Pantallas, Apps |
| Estado | Disponible |
Entrada
{
fingerprint: string // ≤ 64 · The `fingerprint` of the review the person saw; a changed situation answers `conflict` `review_changed`.
confirmation?: string // ≤ 320 · What the person typed when the review asks for it (`requires.typed`).
closeWhen?: "now" | "when_commitments_end"
}Salida
{
operation: "account.delete" | "workspace.close" | "workspace.transfer" | "workspace.leave" | "workspace.member.remove" | "brand.close" | "brand.leave" | "brand.member.remove" | "brand.reopen" | "workspace.reopen"
signedOut: boolean // The person no longer has a session (account deleted): end it on the device.
next: "stay" | "workspace" | "brands" | "signed_out" // Where the person lands next.
operationId: string | null
}Todas las personas que llegan a la marca (propietarios y accesos del workspace incluidos) con su papel, y las invitaciones pendientes.
| Campo | Valor |
|---|---|
| Tipo | Lectura |
| Método HTTP | POST /api/v1/brand.team.read |
| Herramienta MCP | brand_team_read |
| Alcance | brand.read |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | Pantallas, Apps, API |
| Estado | Disponible |
Entrada
{}Salida
{
currentUserId: string
members: Array<{
userId: string
role: string // owner, admin, billing, member, viewer or brand_manager.
since: string | null
profile: {
id: string
fullName: string | null
avatarUrl: string | null
email: string | null
}
| null
}>
invitations: Array<{
id: string
email: string
role: string // owner, admin, billing, member, viewer or brand_manager.
expiresAt: string | null
createdAt: string | null
}>
}Quita a una persona de la marca (aunque su acceso venga del workspace): sus tareas abiertas quedan sin asignar y se le avisa. Con tu propio id, sales de la marca. Nadie quita al propietario.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.member.remove |
| Herramienta MCP | brand_member_remove |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | Sí |
| Puertas | Pantallas, Apps |
| Estado | Disponible |
Entrada
{
userId: string // uuid
}Salida
{
ok: true
left: boolean // The caller left the brand: it is not theirs to open any more.
}Cambia el papel de una persona en esta marca (administración, facturación, miembro, lector). Solo el propietario del workspace; el propietario de la marca se traspasa en la web.
| Campo | Valor |
|---|---|
| Tipo | Escritura |
| Método HTTP | POST /api/v1/brand.member.role.set |
| Herramienta MCP | brand_member_role_set |
| Alcance | brand.write |
| Rol mínimo | Admin |
| Confirmación humana | No |
| Puertas | Pantallas, Apps, API |
| Estado | Disponible |
Entrada
{
userId: string // uuid
role: "admin" | "billing" | "member" | "viewer"
}Salida
{
userId: string
role: string
changed: boolean
}Actualizado el 1 de enero de 1970