Privacy and analytics

We use necessary technical cookies and, only with your consent, analytics and marketing pixels to improve the website and measure campaigns.

Privacy policyCookie policy
Docs
English
EspañolEnglishFrançaisDeutschItalianoPortuguês

Getting started

  • What is Nömad?
  • Getting started with Nömad
  • Create your brand and complete the Genome
  • Invite your team
  • Glossary

Brand OS

  • What is inside Brand OS
  • What is the Genome?
  • Who is Nödo?
  • Talk to Nödo: voice, cards and ordering from the Store
  • Conversations: your team and Nödo
  • What does a Brand Manager do?
  • Brand Kit and Library
  • Posts and calendar
  • Connections
  • Meetings
  • Files we send you with NödoTransfer
  • Your quotes

Work

  • Work and tasks
  • Ordering work
  • Following, reviewing and approving deliveries
  • Approving the posts Nömad prepares
  • Custom quotes
  • Brand history
  • Yes, there are humans behind it

Account and billing

  • Plans and pricing
  • Billing and payments
  • Paying from the apps (iPhone and Android)
  • People and access
  • Organization and brand roles
  • Workspaces and multiple brands
  • Your name and @username
  • Languages, apps and data
  • Leave, close or delete: account, brands and workspaces
  • Delete and restore: what goes and what stays
  • Inbox and notifications: how we let you know
  • Push notifications on your phone and browser
  • Nömad emails and your preferences

Help

  • How to get help

API

  • Brand API
    • Errors
    • Permissions and roles
    • Events and webhooks
    • Brand
    • Genome
    • Brand Kit
    • Library
    • Works
    • Calendar
    • Connections
    • Publishing
    • Inbox
    • Team
    • Account and team
    • Conversation
    • Memory
    • Questions
    • Media
    • Store
    • Plan
    • Orders
    • Activity
    • Workspace
    • Your account
    • Billing
    • Sync
    • Website and domains
    • Statistics
    • Events

MCP

  • MCP server

Connectors

  • Brand connectors

Nödo and agents

  • Nödo in the brand

Genome

  • Genome specification
API/Brand API
Reference32 min read

Brand

Entry point, profile, contact and soul.

On this page
  • brand.overview · Enter the brand
  • brand.soul.read · Read the brand soul
  • brand.profile.update · Update the profile
  • brand.contacts.list · Contact and social
Русский
한국어
日本語
中文
हिन्दी
Open the app
brand.contacts.save · Save a channel
  • brand.connections.save · Save a contact entry
  • brand.content_focus.update · Edit the content focus
  • brand.content_focus.regenerate · Regenerate the content focus
  • brand.recommendations.dismiss · Dismiss a recommendation
  • brand.product_visits.record · Record a product visit
  • brand.favorites.list · Your favourites of one kind
  • brand.favorites.toggle · Toggle a favourite
  • brand.favorites.set · Set several favourites
  • brand.offerings.create · Create an offering
  • brand.offerings.update · Edit an offering
  • brand.offerings.delete · Delete an offering
  • brand.offerings.add_image · Add an image to an offering
  • brand.heartbeat.update · Set Nödo check-ins
  • brand.name.set · Name the brand
  • brand.setup.start_unnamed · Start without a name
  • brand.setup.logo_skip · Skip the logo step
  • brand.setup.extraction_start · Read the brand's website
  • brand.setup.website_read · Check whether the website says what the brand does
  • brand.setup.logo_accept · Mark the logo as chosen
  • brand.setup.logo_choose · Choose the logo
  • brand.setup.colors_decide · Decide the palette
  • brand.setup.typography_decide · Decide the typefaces
  • brand.setup.genome_start · Generate the Genome
  • brand.setup.analysis_retry · Retry the analysis
  • brand.setup.dismiss · Dismiss the setup for now
  • brand.setup.description_draft · Draft the description
  • brand.setup.attachment_remove · Remove a description file
  • brand.wizard.feedback_submit · Submit the wizard answers
  • brand.wizard.cards_generate · Prepare the wizard questions
  • brand.onboarding.abandon · Leave the onboarding
  • brand.settings.read · Brand settings
  • brand.settings.update · Save the brand settings
  • brand.logo.set · Set the logo from the Library
  • brand.time_zone.set · Set the brand's time zone
  • brand.setup.create · Create a brand
  • brand.setup.profile_read · Brand profile setup
  • brand.setup.profile_save · Save a profile step
  • brand.setup.profile_complete · Complete the brand profile
  • brand.onboarding.read · Unfinished brand draft
  • brand.onboarding.step_save · Save a step of an unfinished draft
  • brand.onboarding.complete · Finish an unfinished draft
  • brand.agent_policy.set · What agents may change
  • brand.summary · Brand summary
  • brand.manager.presence · Your Brand Manager now
  • brand.close.review · Review closing the brand
  • brand.close · Close the brand
  • brand.team.read · Brand team
  • brand.member.remove · Remove someone from the brand
  • brand.member.role.set · Change a role in the brand
  • brand.overview · Enter the brand

    Brand summary; an external MCP client calls it first to orient itself. Returns the brand name and short id, plan, Brand Manager, active work and pending task counts, and the capabilities the caller may use in this brand. Inside a conversation the brand is already known: call it only when the person asks how the brand is doing.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.overview
    MCP toolbrand_overview
    Scopebrand.read
    Minimum roleViewer
    Human confirmationNo
    DoorsNödo, Voice, MCP, API, Chat, Screens, Apps
    StatusAvailable
    Widgetrecord

    Input

    {}

    Output

    {
      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.
    }

    brand.soul.read · Read the brand soul

    The brand voice compiled from the current Genome (which the brand may not have confirmed yet): tone, archetypes, vocabulary, guardrails, locales and on/off-brand examples. Use it before longer or public-facing writing on behalf of the brand when the voice already in context is not enough; missing sections are listed in gaps so you ask instead of guessing.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.soul.read
    MCP toolbrand_soul_read
    Scopebrand.read
    Minimum roleViewer
    Human confirmationNo
    DoorsNödo, Voice, MCP, API, Chat, Screens, Apps
    StatusAvailable

    Input

    {}

    Output

    {
      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.
    }

    brand.profile.update · Update the profile

    Changes display name, country, city, organization type or primary language. Written to the Genome with an optimistic revision check; send expectedRevision from genome.read.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.profile.update
    MCP toolbrand_profile_update
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsNödo, MCP, API, Chat, Screens, Apps
    StatusAvailable
    Widgetconfirm

    Input

    {
      expectedRevision: integer  // -9007199254740991–9007199254740991
      displayName?: string  // ≤ 120
      countryCode?: string  // ≤ 2
      city?: string  // ≤ 120
      organizationType?: string  // ≤ 40
      primaryLanguage?: string  // ≤ 12
    }

    Output

    {
      ok: true
      id?: string
      revision?: integer  // -9007199254740991–9007199254740991
    }

    brand.contacts.list · Contact and social

    Public channels of the brand: website, email, phone and social profiles.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.contacts.list
    MCP toolbrand_contacts_list
    Scopebrand.read
    Minimum roleAdmin
    Human confirmationNo
    DoorsNödo, Voice, MCP, API, Chat, Screens, Apps
    StatusAvailable
    Widgetlist

    Input

    {}

    Output

    {
      items: Array<{
        id: string  // uuid
        type: "website" | "email" | "phone" | "whatsapp" | "instagram" | "facebook" | "linkedin" | "tiktok" | "x" | "youtube" | "pinterest" | "other"
        value: string
        label: string | null
      }>
    }

    brand.contacts.save · Save a channel

    Adds, changes or removes one public channel. Values are normalized and checked per type; duplicates are rejected.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.contacts.save
    MCP toolbrand_contacts_save
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsNödo, MCP, API, Chat, Screens, Apps
    StatusAvailable
    Widgetconfirm

    Input

    {
      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
    }

    Output

    {
      ok: true
      id?: string
      revision?: integer  // -9007199254740991–9007199254740991
    }

    brand.connections.save · Save a contact entry

    Adds or changes one «Contact and social» entry, address included, and returns the stored row. Values are normalized and checked per type; duplicates and entries over the per-type limit are rejected.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.connections.save
    MCP toolbrand_connections_save
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      type: "website" | "instagram" | "facebook" | "twitter" | "linkedin" | "tiktok" | "youtube" | "pinterest" | "whatsapp" | "email" | "phone" | "address" | "other"
      value: string  // ≤ 2000
      label?: string  // ≤ 200
      connectionId?: string  // uuid
    }

    Output

    {
      connection: {
        id: string  // uuid
      }
    }

    brand.content_focus.update · Edit the content focus

    Saves the brand content focus edited by hand (networks, content types, frequency, objective) and marks it completed. Replaces the whole document.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.content_focus.update
    MCP toolbrand_content_focus_update
    Scopebrand.write
    Minimum roleMember
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      content: {
        networks: Record<string, unknown>
        generalNotes?: string | null
      }
    }

    Output

    {
      ok: true
      id?: string
      revision?: integer  // -9007199254740991–9007199254740991
    }

    brand.content_focus.regenerate · Regenerate the content focus

    Nömad team only: rewrites the brand content focus with AI in the background. The document shows generating until the run ends; a failure to queue marks it failed.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.content_focus.regenerate
    MCP toolbrand_content_focus_regenerate
    Scopebrand.write
    Minimum roleMember
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {}

    Output

    {
      ok: true
      id?: string
      revision?: integer  // -9007199254740991–9007199254740991
    }

    brand.recommendations.dismiss · Dismiss a recommendation

    Hides one recommended Store product for the brand («not interested»), or brings it back with dismissed: false.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.recommendations.dismiss
    MCP toolbrand_recommendations_dismiss
    Scopebrand.write
    Minimum roleViewer
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      productId: string  // ≤ 120
      dismissed: boolean
    }

    Output

    {
      ok: true
      id?: string
      revision?: integer  // -9007199254740991–9007199254740991
    }

    brand.product_visits.record · Record a product visit

    Records that the caller opened one Store product in this brand, so the product launcher can sort by recency. Personal; never visible to others.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.product_visits.record
    MCP toolbrand_product_visits_record
    Scopebrand.write
    Minimum roleViewer
    Human confirmationNo
    DoorsScreens, Apps
    StatusAvailable

    Input

    {
      productId: string  // ≤ 160
    }

    Output

    {
      ok: true
      id?: string
      revision?: integer  // -9007199254740991–9007199254740991
    }

    brand.favorites.list · Your favourites of one kind

    The ids of the brand items the caller marked as favourites, of one entityType (product, work, file…), newest first; with entityIds, only which of those are favourites.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.favorites.list
    MCP toolbrand_favorites_list
    Scopebrand.read
    Minimum roleViewer
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {
      entityType: string  // ≤ 60
      entityIds?: string[]  // ≤ 500 items
    }

    Output

    {
      ids: string[]
    }

    brand.favorites.toggle · Toggle a favourite

    Marks one item of the brand (a file, a work…) as the caller's own favourite, or removes it when it already was. Returns the new state.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.favorites.toggle
    MCP toolbrand_favorites_toggle
    Scopebrand.write
    Minimum roleViewer
    Human confirmationNo
    DoorsScreens, Apps
    StatusAvailable

    Input

    {
      entityType: string  // ≤ 60
      entityId: string  // ≤ 200
    }

    Output

    {
      isFavorite: boolean
    }

    brand.favorites.set · Set several favourites

    Marks or unmarks up to 200 items of the brand as the caller's favourites in one write. Returns the ids that changed.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.favorites.set
    MCP toolbrand_favorites_set
    Scopebrand.write
    Minimum roleViewer
    Human confirmationNo
    DoorsScreens, Apps
    StatusAvailable

    Input

    {
      entityType: string  // ≤ 60
      entityIds: string[]  // ≤ 200 items
      favorite: boolean
    }

    Output

    {
      changed: string[]
    }

    brand.offerings.create · Create an offering

    Creates one product or service of the brand with its price, features and cover. The cover is a Library file of the same brand; its URL is taken from the file, never from the caller.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.offerings.create
    MCP toolbrand_offerings_create
    Scopebrand.write
    Minimum roleMember
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      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
    }

    Output

    {
      offering: {
        id: string  // uuid
        brand_id: string  // uuid
      }
    }

    brand.offerings.update · Edit an offering

    Changes the given fields of one brand offering. The cover URL is rebuilt from image_asset_id; a category must belong to the same brand.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.offerings.update
    MCP toolbrand_offerings_update
    Scopebrand.write
    Minimum roleMember
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      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
      }
    }

    Output

    {
      offering: {
        id: string  // uuid
        brand_id: string  // uuid
      }
    }

    brand.offerings.delete · Delete an offering

    Deletes one brand offering and its images for good. There is no undo.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.offerings.delete
    MCP toolbrand_offerings_delete
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      offeringId: string  // uuid
    }

    Output

    {
      ok: true
      id?: string
      revision?: integer  // -9007199254740991–9007199254740991
    }

    brand.offerings.add_image · Add an image to an offering

    Adds a Library file of the same brand to an offering gallery (at the end unless sortOrder is given). The first image also becomes the cover.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.offerings.add_image
    MCP toolbrand_offerings_add_image
    Scopebrand.write
    Minimum roleMember
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      offeringId: string  // uuid
      assetId: string  // uuid
      sortOrder?: integer  // -9007199254740991–9007199254740991
    }

    Output

    {
      image: {
        id: string  // uuid
      }
    }

    brand.heartbeat.update · Set Nödo check-ins

    Turns Nödo's periodic check-ins for the brand on or off and picks their local hour (one of the allowed hours). Returns the stored settings.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.heartbeat.update
    MCP toolbrand_heartbeat_update
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      enabled: boolean
      localHour: integer  // 0–23
    }

    Output

    {
      enabled: boolean
      localHour: integer  // -9007199254740991–9007199254740991
    }

    brand.name.set · Name the brand

    Names a brand, the way «Ya tengo un nombre» does on the domain step: the Genome first, then the operational row, and a brand created without a name gets its identity steps back. 2 to 80 characters; the placeholder code is refused (invalid_name).

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.name.set
    MCP toolbrand_name_set
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      name: string  // ≤ 200
    }

    Output

    {
      name: string
    }

    brand.setup.start_unnamed · Start without a name

    Sets the brand up without a name yet: it carries a working code instead (its short id, unique and neutral) and the profile answers what that implies (no website yet, a brand that is starting). The identity steps return once the brand is named.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.start_unnamed
    MCP toolbrand_setup_start_unnamed
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {}

    Output

    {
      name: string
      naming: {
        status: string
        code: string
        since: string | null
        namedAt: string | null
      }
    }

    brand.setup.logo_skip · Skip the logo step

    Skips the setup's logo step: logos found on the website stay in the Library as proposals, leave the Brand Kit and the Genome, and the brand logo is cleared when it only came from them.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.logo_skip
    MCP toolbrand_setup_logo_skip
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {}

    Output

    {
      ok: true
    }

    brand.setup.extraction_start · Read the brand's website

    Starts reading the logo, colours and typefaces of the brand's website as soon as it is typed, so they are ready by the time the setup reaches them. Completing the profile joins this run instead of starting another.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.extraction_start
    MCP toolbrand_setup_extraction_start
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      website: string  // ≤ 200
    }

    Output

    {
      ok: true
    }

    brand.setup.website_read · Check whether the website says what the brand does

    Reads the website's home page (public addresses only, no credentials) and says whether it has content of its own and, when it does, what the brand does in one or two sentences (summary), so the setup does not ask for the description again. A parked, for-sale or under-construction page does not count. Saves nothing.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.setup.website_read
    MCP toolbrand_setup_website_read
    Scopebrand.read
    Minimum roleAdmin
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      website: string  // ≤ 200
    }

    Output

    {
      readable: boolean
      summary: string | null
    }

    brand.setup.logo_accept · Mark the logo as chosen

    Records in the setup that the logo is chosen, after the person uploaded their own file (the upload already made it the brand logo). Changes nothing else.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.logo_accept
    MCP toolbrand_setup_logo_accept
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {}

    Output

    {
      ok: true
    }

    brand.setup.logo_choose · Choose the logo

    Confirms one logo of the Library (assetId, a logo or icon) as the brand logo and records the setup decision. A candidate proposed from the website becomes approved. Also needs brand.kit.manage.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.logo_choose
    MCP toolbrand_setup_logo_choose
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      assetId: string  // uuid
    }

    Output

    {
      ok: true
    }

    brand.setup.colors_decide · Decide the palette

    Publishes in the Kit only the extracted colours the person ticked (colorIds; all of them when absent) and keeps the rest out of the Kit and the Genome without deleting them. Colours added by hand are never withdrawn. skipped withdraws every extracted one.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.colors_decide
    MCP toolbrand_setup_colors_decide
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      decision: "accepted" | "skipped"
      colorIds?: string[]  // ≤ 48 items
    }

    Output

    {
      ok: true
    }

    brand.setup.typography_decide · Decide the typefaces

    Publishes the confirmed typefaces in the Kit (up to 3): a Google family with every weight Google serves; one of the brand's own with the files copied from its website when acceptSiteFiles, otherwise by name. Families the Kit already has are left alone.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.typography_decide
    MCP toolbrand_setup_typography_decide
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      decision: "accepted" | "skipped"
      fonts?: Array<{
        family: string  // ≤ 80
        role: "heading" | "body"
        acceptSiteFiles?: boolean
      }>  // ≤ 3 items · default []
    }

    Output

    {
      ok: true
    }

    brand.setup.genome_start · Generate the Genome

    Starts writing the brand's Genome (Brand DNA) from what was read and answered. A run that stopped moving is closed first. Blocking brand questions refuse it with questions_required.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.genome_start
    MCP toolbrand_setup_genome_start
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {}

    Output

    {
      ok: true
    }

    brand.setup.analysis_retry · Retry the analysis

    Restarts the brand analysis from its first unfinished document (research, then wizard cards) without duplicating a live run; a run that stopped moving is closed first. Once a minute (cooldown). Trashed or closing brands start nothing.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.analysis_retry
    MCP toolbrand_setup_analysis_retry
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {}

    Output

    {
      ok: true
    }

    brand.setup.dismiss · Dismiss the setup for now

    Remembers that the setup window (flow), the panel card (card) or the completed-setup moment (completion) was dismissed at this checkpoint, so it does not come back until something changes.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.dismiss
    MCP toolbrand_setup_dismiss
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      checkpoint: string  // ≤ 60
      target?: "flow" | "card" | "completion"  // default "flow"
    }

    Output

    {
      ok: true
    }

    brand.setup.description_draft · Draft the description

    Nödo drafts the brand description from the saved profile, the naming state and the files attached to the setup, with what it read to write it (sources). without leaves files out (the keys of their source chips). Saves nothing.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.setup.description_draft
    MCP toolbrand_setup_description_draft
    Scopebrand.read
    Minimum roleAdmin
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      description: string  // ≤ 4000
      without?: string[]  // ≤ 12 items · default []
    }

    Output

    {
      draft: string
      sources: Array<{
        key: string
      }>
    }

    brand.setup.attachment_remove · Remove a description file

    Leaves one file out of what Nödo reads for the brand description and the research. The file stays in the Library.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.attachment_remove
    MCP toolbrand_setup_attachment_remove
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      assetId: string  // uuid
    }

    Output

    {
      ok: true
    }

    brand.wizard.feedback_submit · Submit the wizard answers

    Sends every answer of the brand wizard to the pipeline that writes the Genome (Brand DNA) in the background. Blocking brand questions refuse it with brand_questions_require_answers.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.wizard.feedback_submit
    MCP toolbrand_wizard_feedback_submit
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      wizardSession?: integer  // 1–100 · default 1
    }

    Output

    {
      ok: true
    }

    brand.wizard.cards_generate · Prepare the wizard questions

    Queues the run that writes the brand wizard's question cards from its research, in the background. A repeat within five minutes is not queued twice. Returns the queued run id.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.wizard.cards_generate
    MCP toolbrand_wizard_cards_generate
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {}

    Output

    {
      ok: true
      runId: string
    }

    brand.onboarding.abandon · Leave the onboarding

    Trashes (soft delete) every half-made onboarding brand the signed-in person created, cancels the runs they started and says where to land (/brands with an organization, /account otherwise). One that cannot be abandoned does not stop the others (failed).

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.onboarding.abandon
    MCP toolbrand_onboarding_abandon
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {}

    Output

    {
      destination: "/brands" | "/account"
      failed: integer  // -9007199254740991–9007199254740991
    }

    brand.settings.read · Brand settings

    The brand's general settings as the apps draw them: identity (name, short id, logo), country, city, communication language and version (send it back as expectedVersion to brand.settings.update), the languages to choose from, what the reader may do there and the counts of members, connections and trashed files.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.settings.read
    MCP toolbrand_settings_read
    Scopebrand.read
    Minimum roleAdmin
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {}

    Output

    {
      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
      }
    }

    brand.settings.update · Save the brand settings

    Saves the brand's general settings (name, ISO country, city, organization type, languages, age, description) into the Genome when it exists, else the operational row. Send expectedVersion; a brand changed elsewhere answers revision_conflict. Only a request that sends description changes it.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.settings.update
    MCP toolbrand_settings_update
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      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
    }

    Output

    {
      ok: true
    }

    brand.logo.set · Set the logo from the Library

    Makes one file of the brand's Library its logo (assetId); the header, the sidebar and the brand switcher show it. Returns the delivered address.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.logo.set
    MCP toolbrand_logo_set
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      assetId: string  // uuid
    }

    Output

    {
      url: string
      assetId: string
    }

    brand.time_zone.set · Set the brand's time zone

    Sets the brand's time zone, the one its editorial plans, Nödo's heartbeat and the posts composer fall back to. Null clears it. An unknown zone is invalid_input.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.time_zone.set
    MCP toolbrand_time_zone_set
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {
      timeZone: string | null  // IANA zone (`Europe/Madrid`), or null to fall back.
    }

    Output

    {
      timeZone: string | null
    }

    brand.setup.create · Create a brand

    Creates one more provisional brand for the signed-in person, active at once; its profile is answered next with brand.setup.profile_save and brand.setup.profile_complete. With workspaceId (its owner) the brand is born there; newWorkspace starts a workspace of its own; otherwise it goes to the workspace the person owns. An untouched provisional brand of theirs is reused (created: false). Refusals: conflict brand_create_limit_reached, rate_limited brand_create_rate_limited, forbidden staff_account.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.create
    MCP toolbrand_setup_create
    Scopebrand.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId?: string | null
      newWorkspace?: boolean
    }

    Output

    {
      id: string
      shortId: string
      name: string
      created: boolean  // False when an untouched provisional brand of the person was reused.
    }

    brand.setup.profile_read · Brand profile setup

    The profile answers of a new brand (name, website, age, communication language, country, city, description), the step to resume on and the communication languages to choose from. setup is null when the brand has no profile to answer (it was not created as a provisional brand).

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.setup.profile_read
    MCP toolbrand_setup_profile_read
    Scopebrand.read
    Minimum roleAdmin
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {}

    Output

    {
      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.
    }

    brand.setup.profile_save · Save a profile step

    Saves the answers of one profile step of a new brand and the step it moves to (step: 1, 2, 3, 5, 6, 7, 8 or 9). A name becomes the brand's name at once (sidebar, switcher, every open tab). Returns the saved profile. An invalid step or website answers invalid_input.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.profile_save
    MCP toolbrand_setup_profile_save
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {
      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
    }

    Output

    {
      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
      }
    }

    brand.setup.profile_complete · Complete the brand profile

    Completes a new brand's profile with every answer: starts the research, the brand provisioning and (with a website) the Brand Kit reading, and applies a plan picked before sign-up. pendingCheckout is that plan when it still needs its checkout. The description needs 30 characters for a new brand without website, else 10.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.setup.profile_complete
    MCP toolbrand_setup_profile_complete
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {
      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
    }

    Output

    {
      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
    }

    brand.onboarding.read · Unfinished brand draft

    A brand started in the old onboarding wizard, to finish it: its answers (name, website, age, communication language, country, city, description), the step to resume on and the communication languages. New brands use brand.setup.profile_read.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.onboarding.read
    MCP toolbrand_onboarding_read
    Scopebrand.read
    Minimum roleAdmin
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {}

    Output

    {
      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.
    }

    brand.onboarding.step_save · Save a step of an unfinished draft

    Saves one step of a brand started in the old onboarding wizard (step: 2, 3, 4, 5, 6, 7 or 8 of that wizard). A website starts the Brand Kit reading. invalid_input with invalid_step, invalid_age or invalid_website.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.onboarding.step_save
    MCP toolbrand_onboarding_step_save
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {
      step: integer  // -9007199254740991–9007199254740991
      age?: string  // ≤ 40
      city?: string  // ≤ 100
      communicationLanguage?: string  // ≤ 5
      country?: string  // ≤ 100
      hasWebsite?: boolean
      name?: string  // ≤ 50
      website?: string  // ≤ 200
    }

    Output

    {
      ok: true
    }

    brand.onboarding.complete · Finish an unfinished draft

    Finishes a brand started in the old onboarding wizard with its age and description: it becomes the person's active brand and its research and provisioning start. platform names the client for the brand's history.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.onboarding.complete
    MCP toolbrand_onboarding_complete
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {
      age: string  // ≤ 40
      description: string  // ≤ 4000
      platform?: "ios" | "android"
    }

    Output

    {
      brandId: string
      shortId: string
      createdAt: string
    }

    brand.agent_policy.set · What agents may change

    Sets what outside agents connected to this brand may write: read_only, approval (each write waits for the person) or direct. null follows the workspace policy.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.agent_policy.set
    MCP toolbrand_agent_policy_set
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsScreens, Apps
    StatusAvailable

    Input

    {
      policy: "read_only" | "approval" | "direct" | null
    }

    Output

    {
      ok: true
    }

    brand.summary · Brand summary

    The brand's description, products and website, as its home shows them, the currency its payer is billed in and, when App Store or Google Play collects the plan, that store with the price it charged.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.summary
    MCP toolbrand_summary
    Scopebrand.read
    Minimum roleViewer
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {}

    Output

    {
      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
    }

    brand.manager.presence · Your Brand Manager now

    What a brand may know about its Brand Manager: their public card (name, photo, job title; docs/public-person-card.md), live state (available, break, out of office…) and the public card of who covers while they are out. Never an email, phone, notes or log. presence is null when the brand has none to show.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.manager.presence
    MCP toolbrand_manager_presence
    Scopebrand.read
    Minimum roleViewer
    Human confirmationNo
    DoorsAPI, MCP, Screens, Apps, Nödo
    StatusAvailable

    Input

    {}

    Output

    {
      presence: Record<string, unknown> | null
    }

    brand.close.review · Review closing the brand

    What closing this brand would do right now (the tenancy review): open works and tasks, people, plan and connections, blockers, whether it closes now or when what was paid ends (close_when), and what to type to confirm (requires.typed, the brand name). Changes nothing; pass its fingerprint to brand.close.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.close.review
    MCP toolbrand_close_review
    Scopebrand.read
    Minimum roleOwner
    Human confirmationNo
    DoorsScreens, Apps
    StatusAvailable

    Input

    {}

    Output

    {
      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
    }

    brand.close · Close the brand

    Closes this brand exactly as reviewed with brand.close.review: it becomes a read-only archive now or when what was paid ends (closeWhen, default the review's). Money records are kept; Nömad staff can reopen it. Owner only, with a sign-in from the last 10 minutes and the typed brand name. Refusals: forbidden with reauthentication_required (sign in again first) or permission_denied; conflict with blocked (the blocker codes after a colon), review_changed, confirmation_mismatch, decision_required, paid_work_pending, successor_required or staff_account; not_found.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.close
    MCP toolbrand_close
    Scopebrand.write
    Minimum roleOwner
    Human confirmationYes
    DoorsScreens, Apps
    StatusAvailable

    Input

    {
      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"
    }

    Output

    {
      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
    }

    brand.team.read · Brand team

    Everyone who reaches this brand (the workspace owner, all-brands and per-brand workspace grants and direct members), with role and profile, oldest first, and its pending invitations, newest first. currentUserId is the reader. Brand owners and admins read the whole team; others the direct members.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/brand.team.read
    MCP toolbrand_team_read
    Scopebrand.read
    Minimum roleAdmin
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {}

    Output

    {
      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
      }>
    }

    brand.member.remove · Remove someone from the brand

    Removes one person from this brand, also when their access comes from the workspace (the tenancy brand.member.remove): their open tasks are unassigned and they are told. Passing the caller's own id leaves the brand (brand.leave), which only needs to reach it; removing anyone else needs brand.team.manage. The owner is never removed (conflict protected_member); any other blocker answers conflict remove_blocked with the reason after a colon. Refusals: forbidden with reauthentication_required (sign in again first) or permission_denied; conflict with blocked (the blocker codes after a colon), review_changed, confirmation_mismatch, decision_required, paid_work_pending, successor_required or staff_account; not_found.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.member.remove
    MCP toolbrand_member_remove
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationYes
    DoorsScreens, Apps
    StatusAvailable

    Input

    {
      userId: string  // uuid
    }

    Output

    {
      ok: true
      left: boolean  // The caller left the brand: it is not theirs to open any more.
    }

    brand.member.role.set · Change a role in the brand

    Changes one person's role in this brand (admin, billing, member, viewer) in their workspace brand map, leaving their other brands as they are. Only the workspace owner may (forbidden workspace_owner_required); conflict with protected_member, all_brands_member or direct_brand_owner_requires_transfer for people whose role is decided elsewhere; not_found member_not_found.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/brand.member.role.set
    MCP toolbrand_member_role_set
    Scopebrand.write
    Minimum roleAdmin
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {
      userId: string  // uuid
      role: "admin" | "billing" | "member" | "viewer"
    }

    Output

    {
      userId: string
      role: string
      changed: boolean
    }

    Updated on January 1, 1970

    PreviousEvents and webhooksNextGenome

    In this section

    • Errors
    • Permissions and roles
    • Events and webhooks
    • Genome
    • Brand Kit
    • Library
    • Works
    • Calendar
    Can't find what you need? Write to usWrite to usGo to the app
    © 2026 Nömad · Nömad documentationLinkedInInstagramThreadsFacebookTikTokYouTubeX
    Go to nomad.oooBack to top

    On this page

    • brand.overview · Enter the brand
    • brand.soul.read · Read the brand soul
    • brand.profile.update · Update the profile
    • brand.contacts.list · Contact and social
    • brand.contacts.save · Save a channel
    • brand.connections.save · Save a contact entry
    • brand.content_focus.update · Edit the content focus
    • brand.content_focus.regenerate · Regenerate the content focus
    • brand.recommendations.dismiss · Dismiss a recommendation
    • brand.product_visits.record · Record a product visit
    • brand.favorites.list · Your favourites of one kind
    • brand.favorites.toggle · Toggle a favourite
    • brand.favorites.set · Set several favourites
    • brand.offerings.create · Create an offering
    • brand.offerings.update · Edit an offering
    • brand.offerings.delete · Delete an offering
    • brand.offerings.add_image · Add an image to an offering
    • brand.heartbeat.update · Set Nödo check-ins
    • brand.name.set · Name the brand
    • brand.setup.start_unnamed · Start without a name
    • brand.setup.logo_skip · Skip the logo step
    • brand.setup.extraction_start · Read the brand's website
    • brand.setup.website_read · Check whether the website says what the brand does
    • brand.setup.logo_accept · Mark the logo as chosen
    • brand.setup.logo_choose · Choose the logo
    • brand.setup.colors_decide · Decide the palette
    • brand.setup.typography_decide · Decide the typefaces
    • brand.setup.genome_start · Generate the Genome
    • brand.setup.analysis_retry · Retry the analysis
    • brand.setup.dismiss · Dismiss the setup for now
    • brand.setup.description_draft · Draft the description
    • brand.setup.attachment_remove · Remove a description file
    • brand.wizard.feedback_submit · Submit the wizard answers
    • brand.wizard.cards_generate · Prepare the wizard questions
    • brand.onboarding.abandon · Leave the onboarding
    • brand.settings.read · Brand settings
    • brand.settings.update · Save the brand settings
    • brand.logo.set · Set the logo from the Library
    • brand.time_zone.set · Set the brand's time zone
    • brand.setup.create · Create a brand
    • brand.setup.profile_read · Brand profile setup
    • brand.setup.profile_save · Save a profile step
    • brand.setup.profile_complete · Complete the brand profile
    • brand.onboarding.read · Unfinished brand draft
    • brand.onboarding.step_save · Save a step of an unfinished draft
    • brand.onboarding.complete · Finish an unfinished draft
    • brand.agent_policy.set · What agents may change
    • brand.summary · Brand summary
    • brand.manager.presence · Your Brand Manager now
    • brand.close.review · Review closing the brand
    • brand.close · Close the brand
    • brand.team.read · Brand team
    • brand.member.remove · Remove someone from the brand
    • brand.member.role.set · Change a role in the brand