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?
  • Messages: 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

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
  • 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
  • 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
    • 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
    • Website and domains

MCP

  • MCP server

Connectors

  • Brand connectors

Nödo and agents

  • Nödo in the brand

Genome

  • Genome specification
API/Brand API
Reference16 min read

Workspace

The organisation: people and access, settings, company and brands.

On this page
  • workspace.agent_policy.set · What agents may change in the workspace
  • workspace.service_accounts.create · Create a service account
  • workspace.service_accounts.disable · Disable a service account
Русский
한국어
日本語
中文
हिन्दी
Open the app
  • workspace.service_tokens.create · Create a service token
  • workspace.service_tokens.rotate · Rotate a service token
  • workspace.service_tokens.revoke · Revoke a service token
  • workspace.requests.submit · Request a workspace
  • workspace.rename · Rename the workspace
  • workspace.company.save · Paying company
  • workspace.brand_billing.set · How a brand is billed
  • workspace.members.brand_roles.set · Roles per brand
  • workspace.members.all_brands.set · Every brand with one role
  • workspace.invites.all_brands.send · Invite to every brand
  • workspace.brand_transfers.request · Request a brand transfer
  • workspace.brand_transfers.decide · Decide a brand transfer
  • workspace.people.org_role.set · Role in the organisation
  • workspace.people.org_role.set_many · Organisation role for several people
  • workspace.people.access.set · Which brands a person reaches
  • workspace.people.access.set_many · Brand reach for several people
  • workspace.invites.send · Invite people
  • workspace.invites.resend · Resend an invitation
  • workspace.invites.resend_many · Resend several invitations
  • workspace.invites.copy_link · Copy an invitation link
  • workspace.invites.revoke · Revoke an invitation
  • workspace.invites.revoke_many · Revoke several invitations
  • workspace.invites.decline · Decline an invitation
  • workspace.access_requests.create · Request access
  • workspace.access_requests.cancel · Cancel an access request
  • workspace.access_requests.decide · Decide an access request
  • workspace.join_domains.read · Join domains
  • workspace.join_domains.set · Join with the domain
  • workspace.join_domains.remove · Remove a join domain
  • workspace.join · Join an organisation
  • workspace.people.handover · Hand over someone's work
  • workspace.reconnect_requests.dismiss · Dismiss a reconnect request
  • workspace.agent_policy.set · What agents may change in the workspace

    Sets the agent write policy every brand of the workspace follows unless it has its own: read_only, approval or direct. null goes back to the default (approval).

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.agent_policy.set
    MCP toolworkspace_agent_policy_set
    Scopeworkspace.write
    Minimum roleworkspace.settings.edit
    Human confirmationNo
    DoorsScreens, Apps
    StatusAvailable

    Input

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

    Output

    {
      ok: true
    }

    workspace.service_accounts.create · Create a service account

    Creates a workspace service account: an identity for integrations with one brand role (admin, member, viewer) on every brand or on chosen ones. Needs a recent sign-in on the screen. Its tokens are created with workspace.service_tokens.create.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.service_accounts.create
    MCP toolworkspace_service_accounts_create
    Scopeworkspace.write
    Minimum roleworkspace.api_keys.manage
    Human confirmationNo
    DoorsScreens
    StatusAvailable

    Input

    {
      name: string  // ≤ 80
      description?: string | null
      scope: "all_brands" | "selected_brands"
      role: "admin" | "member" | "viewer"
      brandIds?: string[]  // ≤ 200 items · default []
    }

    Output

    {
      id: string  // uuid
    }

    workspace.service_accounts.disable · Disable a service account

    Disables a workspace service account and every token it holds. Needs a recent sign-in on the screen.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.service_accounts.disable
    MCP toolworkspace_service_accounts_disable
    Scopeworkspace.write
    Minimum roleworkspace.api_keys.manage
    Human confirmationYes
    DoorsScreens
    StatusAvailable

    Input

    {
      serviceAccountId: string  // uuid
    }

    Output

    {
      ok: true
    }

    workspace.service_tokens.create · Create a service token

    Issues a token (nmw_) for one of the workspace's service accounts with scopes, expiry and optionally some of its brands. Needs a recent sign-in on the screen. Returned once.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.service_tokens.create
    MCP toolworkspace_service_tokens_create
    Scopeworkspace.write
    Minimum roleworkspace.api_keys.manage
    Human confirmationNo
    DoorsScreens
    StatusAvailable

    Input

    {
      serviceAccountId: string  // uuid
      name: string  // ≤ 80
      expiresAt?: string | null  // ISO date; empty takes the default lifetime.
      scopes: string[]  // ≤ 200 items
      brandIds?: string[]  // ≤ 200 items · default []
    }

    Output

    {
      token: string
      credential: {
        id: string  // uuid
        kind: string
        name: string
        prefix: string
        scopes: string[]
        brandIds: string[] | null
        createdAt: string
        expiresAt: string
        lastUsedAt: string | null
        revokedAt: string | null
        revokedSource: string | null
        legacy: boolean
        serviceAccountId: string | null
      }
    }

    workspace.service_tokens.rotate · Rotate a service token

    Issues a replacement for a service token of the workspace; the old one keeps working for the grace hours given. Needs a recent sign-in on the screen.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.service_tokens.rotate
    MCP toolworkspace_service_tokens_rotate
    Scopeworkspace.write
    Minimum roleworkspace.api_keys.manage
    Human confirmationNo
    DoorsScreens
    StatusAvailable

    Input

    {
      id: string  // uuid
      graceHours: integer  // 0–720
    }

    Output

    {
      token: string
      credential: {
        id: string  // uuid
        kind: string
        name: string
        prefix: string
        scopes: string[]
        brandIds: string[] | null
        createdAt: string
        expiresAt: string
        lastUsedAt: string | null
        revokedAt: string | null
        revokedSource: string | null
        legacy: boolean
        serviceAccountId: string | null
      }
    }

    workspace.service_tokens.revoke · Revoke a service token

    Ends a service token of the workspace now. Needs a recent sign-in on the screen.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.service_tokens.revoke
    MCP toolworkspace_service_tokens_revoke
    Scopeworkspace.write
    Minimum roleworkspace.api_keys.manage
    Human confirmationYes
    DoorsScreens
    StatusAvailable

    Input

    {
      id: string  // uuid
    }

    Output

    {
      ok: true
    }

    workspace.requests.submit · Request a workspace

    Submits a request for an agency or group workspace (name, contact, website, expected brands, intended use). Nömad reviews it before the workspace exists; returns the request id.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.requests.submit
    MCP toolworkspace_requests_submit
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      name: string  // ≤ 120
      workspaceType: "agency" | "group"
      companyWebsite: string | null
      contactEmail: string  // email · ≤ 180
      expectedBrands: integer  // 1–10000
      intendedUse: string  // ≤ 2000
    }

    Output

    {
      requestId: string
    }

    workspace.rename · Rename the workspace

    Renames a workspace. Only its owner, or Nömad staff who manage workspaces, may: the database decides and answers forbidden (workspace_owner_required) otherwise.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.rename
    MCP toolworkspace_rename
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      name: string  // ≤ 120
    }

    Output

    {
      ok: true
    }

    workspace.company.save · Paying company

    Saves the workspace's paying company (legal name, tax id, billing email, phone and address) and mirrors it into every open brand billed with the workspace; returns how many were synced. Owner or Nömad staff only (the database decides).

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.company.save
    MCP toolworkspace_company_save
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      company: {
        legalName: string  // ≤ 200
        taxId: string  // ≤ 32
        billingEmail: string  // ≤ 180
        billingPhone: string  // ≤ 40
        address: Record<string, string>  // line1, line2, city, state, postal_code and the ISO country code.
      }
    }

    Output

    {
      brandAccountsSynced: integer  // -9007199254740991–9007199254740991
    }

    workspace.brand_billing.set · How a brand is billed

    Sets whether one brand is billed with its workspace's company (workspace, mirrored from then on) or with its own (own, with the company). Owner of the workspace or Nömad staff only (the database decides).

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.brand_billing.set
    MCP toolworkspace_brand_billing_set
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      brandId: string  // uuid
      source: "workspace" | "own"
      company: {
        legalName: string  // ≤ 200
        taxId: string  // ≤ 32
        billingEmail: string  // ≤ 180
        billingPhone: string  // ≤ 40
        address: Record<string, string>  // line1, line2, city, state, postal_code and the ISO country code.
      }
      | null
    }

    Output

    {
      source: "workspace" | "own"
    }

    workspace.members.brand_roles.set · Roles per brand

    Sets one member's role in each brand of the workspace (brand id → admin, billing, member or viewer). Owner or Nömad staff only (the database decides). The person hears what changed.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.members.brand_roles.set
    MCP toolworkspace_members_brand_roles_set
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      userId: string  // uuid
      roles: Record<string, "admin" | "billing" | "member" | "viewer">
    }

    Output

    {
      ok: true
    }

    workspace.members.all_brands.set · Every brand with one role

    Gives one member every brand of the workspace, present and future, with one role. Owner or Nömad staff only (the database decides). The person hears what changed.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.members.all_brands.set
    MCP toolworkspace_members_all_brands_set
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

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

    Output

    {
      ok: true
    }

    workspace.invites.all_brands.send · Invite to every brand

    Invites one email address to every brand of the workspace with one role and sends the invitation email. Owner only (the database decides who anchors it and that the person is not in the workspace yet).

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.invites.all_brands.send
    MCP toolworkspace_invites_all_brands_send
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      email: string  // email · ≤ 320
      role: "admin" | "billing" | "member" | "viewer"
      anchorBrandId?: string | null
    }

    Output

    {
      ok: true
    }

    workspace.brand_transfers.request · Request a brand transfer

    Proposes moving a brand to another workspace: who carries over with which role, when the subscription changes hands and the day billing moves. The target workspace's owner accepts or declines with workspace.brand_transfers.decide.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.brand_transfers.request
    MCP toolworkspace_brand_transfers_request
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      brandId: string  // uuid
      sourceWorkspaceId: string  // uuid
      targetWorkspaceId: string  // uuid
      carryMembers: Record<string, "admin" | "billing" | "member" | "viewer">
      subscriptionHandover: "next_renewal" | "immediate"
      billingEffectiveOn: string
      note: string | null
    }

    Output

    {
      transferId: string
    }

    workspace.brand_transfers.decide · Decide a brand transfer

    Accepts, declines or cancels a pending brand transfer between workspaces. Returns what happens to the source workspace when it was its last brand.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.brand_transfers.decide
    MCP toolworkspace_brand_transfers_decide
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      transferId: string  // uuid
      decision: "accept" | "decline" | "cancel"
      carryMembers?: Record<string, "admin" | "billing" | "member" | "viewer"> | null
      note?: string | null
      workspaceIds: string[]  // ≤ 2 items · The two workspaces of the transfer, to refresh their pages.
    }

    Output

    {
      sourceWorkspaceOutcome: string | null
    }

    workspace.people.org_role.set · Role in the organisation

    Sets one person's role in the organisation (admin, member, billing, viewer). Ownership only moves by transfer. Needs workspace.members.manage (or Nömad staff who manage workspaces); nobody gives more than they hold (forbidden, detail grant_exceeds_actor:<keys>). changed is false when it already was that role.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.people.org_role.set
    MCP toolworkspace_people_org_role_set
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      role: "admin" | "member" | "billing" | "viewer"
      reason?: string  // ≤ 500
      userId: string  // uuid
    }

    Output

    {
      changed: boolean
    }

    workspace.people.org_role.set_many · Organisation role for several people

    The same organisation role for up to 100 people, each through the same check and audit row as one person, so a refusal leaves the others done. Returns which were done and why the rest failed.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.people.org_role.set_many
    MCP toolworkspace_people_org_role_set_many
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      role: "admin" | "member" | "billing" | "viewer"
      reason?: string  // ≤ 500
      userIds: string[]  // ≤ 100 items
    }

    Output

    {
      done: string[]
      failed: Array<{
        id: string
        error: string
        missing?: string[]
      }>
    }

    workspace.people.access.set · Which brands a person reaches

    Sets one person's brand reach: every brand with one role, chosen brands with a role each, or none. Needs workspace.members.manage (or Nömad staff who manage workspaces). The person hears what changed.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.people.access.set
    MCP toolworkspace_people_access_set
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      access: {
        scope: "all" | "selected" | "none"
        allRole: "admin" | "member" | "viewer" | "billing" | null
        brandRoles: Record<string, "admin" | "member" | "viewer" | "billing">
      }
      reason?: string  // ≤ 500
      brandIds?: string[]  // ≤ 500 items · Brands whose pages refresh afterwards.
      userId: string  // uuid
    }

    Output

    {
      ok: true
    }

    workspace.people.access.set_many · Brand reach for several people

    The same brand reach for up to 100 people, each through the same check as one person. Returns which were done and why the rest failed.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.people.access.set_many
    MCP toolworkspace_people_access_set_many
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      access: {
        scope: "all" | "selected" | "none"
        allRole: "admin" | "member" | "viewer" | "billing" | null
        brandRoles: Record<string, "admin" | "member" | "viewer" | "billing">
      }
      reason?: string  // ≤ 500
      brandIds?: string[]  // ≤ 500 items · Brands whose pages refresh afterwards.
      userIds: string[]  // ≤ 100 items
    }

    Output

    {
      done: string[]
      failed: Array<{
        id: string
        error: string
        missing?: string[]
      }>
    }

    workspace.invites.send · Invite people

    Invites up to 50 email addresses to the organisation and its brands: role in the organisation, every brand with one role or chosen brands, an optional note and link validity (1, 7 or 30 days). One link per person, emailed now. Returns who was sent and why the rest failed.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.invites.send
    MCP toolworkspace_invites_send
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      emails: string[]  // ≤ 50 items
      orgRole: "admin" | "member" | "billing" | "viewer"
      scope: "all" | "selected"
      allRole: "admin" | "member" | "viewer" | "billing" | null
      brandRoles: Record<string, "admin" | "member" | "viewer" | "billing">
      message?: string  // ≤ 500
      validDays?: 1 | 7 | 30  // default 7
    }

    Output

    {
      sent: string[]
      failed: Array<{
        email: string
        error: string
        missing?: string[]
      }>
    }

    workspace.invites.resend · Resend an invitation

    Mints a new link for a pending invitation (the old one stops working), with the same validity counted from now, and emails it again. Returns the new expiry.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.invites.resend
    MCP toolworkspace_invites_resend
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      inviteId: string  // uuid
    }

    Output

    {
      expiresAt: string
    }

    workspace.invites.resend_many · Resend several invitations

    Resends up to 100 pending invitations, each with a new link and the email again. Returns which were done and why the rest failed.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.invites.resend_many
    MCP toolworkspace_invites_resend_many
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      inviteIds: string[]  // ≤ 100 items
    }

    Output

    {
      done: string[]
      failed: Array<{
        id: string
        error: string
        missing?: string[]
      }>
    }

    workspace.invites.copy_link · Copy an invitation link

    Mints a new link for a pending invitation to share by another channel; the emailed one stops working. Returns the link and its expiry. Links are only stored hashed.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.invites.copy_link
    MCP toolworkspace_invites_copy_link
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsScreens, Apps
    StatusAvailable

    Input

    {
      inviteId: string  // uuid
    }

    Output

    {
      url: string
      expiresAt: string
    }

    workspace.invites.revoke · Revoke an invitation

    Ends a pending invitation now so its link opens nothing; the history keeps it with the reason. Needs brand.team.manage on its brand (brand action invite.revoke) and the database's own check.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.invites.revoke
    MCP toolworkspace_invites_revoke
    Scopeworkspace.write
    Minimum roleself
    Human confirmationYes
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      inviteId: string  // uuid
      reason?: string  // ≤ 500
    }

    Output

    {
      ok: true
    }

    workspace.invites.revoke_many · Revoke several invitations

    Revokes up to 100 pending invitations, each through the same check as one. Returns which were done and why the rest failed.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.invites.revoke_many
    MCP toolworkspace_invites_revoke_many
    Scopeworkspace.write
    Minimum roleself
    Human confirmationYes
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      inviteIds: string[]  // ≤ 100 items
      reason?: string  // ≤ 500
    }

    Output

    {
      done: string[]
      failed: Array<{
        id: string
        error: string
        missing?: string[]
      }>
    }

    workspace.invites.decline · Decline an invitation

    Declines an invitation addressed to the signed-in person, by its link token: it ends for good, the history keeps it and the inviter is told.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.invites.decline
    MCP toolworkspace_invites_decline
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsScreens, Apps
    StatusAvailable

    Input

    {
      token: string  // ≤ 512
    }

    Output

    {
      ok: true
    }

    workspace.access_requests.create · Request access

    Asks for access to a brand (short id) with an optional message and role (viewer or member). Asking again returns the pending request. Whoever decides is told.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.access_requests.create
    MCP toolworkspace_access_requests_create
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      brand: string  // ≤ 64
      message?: string  // ≤ 500
      requestedRole?: "viewer" | "member" | null
    }

    Output

    {
      requestId: string | null
    }

    workspace.access_requests.cancel · Cancel an access request

    Withdraws the signed-in person's own pending access request.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.access_requests.cancel
    MCP toolworkspace_access_requests_cancel
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      requestId: string  // uuid
    }

    Output

    {
      ok: true
    }

    workspace.access_requests.decide · Decide an access request

    Approves an access request with a role and brand reach, or denies it with an optional note. People who manage the organisation's people or the brand's team decide. The requester reads the outcome where they asked.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.access_requests.decide
    MCP toolworkspace_access_requests_decide
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      requestId: string  // uuid
      workspaceId: string  // uuid
      brandId: string | null
      decision: "approve" | "deny"
      orgRole?: "admin" | "member" | "billing" | "viewer" | null
      access?: {
        scope: "all" | "selected" | "none"
        allRole: "admin" | "member" | "viewer" | "billing" | null
        brandRoles: Record<string, "admin" | "member" | "viewer" | "billing">
      }
      note?: string  // ≤ 500
    }

    Output

    {
      status: "approved" | "denied"
    }

    workspace.join_domains.read · Join domains

    Lists the email domains people can join the organisation with (mode, role, brand reach) and the owner's domains that can still be added. People managers and Nömad staff only.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/workspace.join_domains.read
    MCP toolworkspace_join_domains_read
    Scopeworkspace.read
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
    }

    Output

    {
      can_manage: boolean
      domains: Record<string, unknown>[]
      available: string[]
    }

    workspace.join_domains.set · Join with the domain

    Adds or changes a join domain: people with a confirmed address there join directly or ask, with which organisation role and brand reach. The domain must be the owner's (the database checks).

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.join_domains.set
    MCP toolworkspace_join_domains_set
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      domain: string  // ≤ 260
      mode: "join" | "request"
      orgRole: "member" | "viewer"
      brandScope: "none" | "all"
      brandRole: "member" | "viewer" | null
      reason?: string  // ≤ 500
    }

    Output

    {
      domain: string
    }

    workspace.join_domains.remove · Remove a join domain

    Removes a join domain: nobody else joins with it; people who already joined stay.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.join_domains.remove
    MCP toolworkspace_join_domains_remove
    Scopeworkspace.write
    Minimum roleself
    Human confirmationYes
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      domain: string  // ≤ 260
      reason?: string  // ≤ 500
    }

    Output

    {
      ok: true
    }

    workspace.join · Join an organisation

    Joins an organisation the signed-in person may join with their confirmed company email, with the domain's role, or opens a request to join when the domain asks for one. Returns joined, pending or member.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.join
    MCP toolworkspace_join
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsScreens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      message?: string  // ≤ 500
    }

    Output

    {
      status: "joined" | "pending" | "member"
    }

    workspace.people.handover · Hand over someone's work

    Hands one person's open tasks, approver seats and pending invitations to a successor, and asks who connects again each connection that would stop working (tokens never change hands). The first half of removing someone; the successor is told once.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.people.handover
    MCP toolworkspace_people_handover
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      workspaceId: string  // uuid
      brandId?: string | null
      from: string  // uuid
      choice: {
        to: string  // uuid
        tasks: boolean
        approvals: boolean
        invites: boolean
        reconnect?: Record<string, string>
      }
      reason?: string  // ≤ 500
    }

    Output

    {
      tasks_moved: number
      tasks_left: number
      approvals_moved: number
      approvals_left: number
      invites_moved: number
    }

    workspace.reconnect_requests.dismiss · Dismiss a reconnect request

    Closes a «connect it again» request addressed to the signed-in person.

    FieldValue
    KindWrite
    HTTP methodPOST /api/v1/workspace.reconnect_requests.dismiss
    MCP toolworkspace_reconnect_requests_dismiss
    Scopeworkspace.write
    Minimum roleself
    Human confirmationNo
    DoorsAPI, Screens, Apps
    StatusAvailable

    Input

    {
      requestId: string  // uuid
    }

    Output

    {
      ok: true
    }

    Updated on January 1, 1970

    PreviousActivityNextYour account

    In this section

    • Errors
    • Permissions and roles
    • Brand
    • 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

    • workspace.agent_policy.set · What agents may change in the workspace
    • workspace.service_accounts.create · Create a service account
    • workspace.service_accounts.disable · Disable a service account
    • workspace.service_tokens.create · Create a service token
    • workspace.service_tokens.rotate · Rotate a service token
    • workspace.service_tokens.revoke · Revoke a service token
    • workspace.requests.submit · Request a workspace
    • workspace.rename · Rename the workspace
    • workspace.company.save · Paying company
    • workspace.brand_billing.set · How a brand is billed
    • workspace.members.brand_roles.set · Roles per brand
    • workspace.members.all_brands.set · Every brand with one role
    • workspace.invites.all_brands.send · Invite to every brand
    • workspace.brand_transfers.request · Request a brand transfer
    • workspace.brand_transfers.decide · Decide a brand transfer
    • workspace.people.org_role.set · Role in the organisation
    • workspace.people.org_role.set_many · Organisation role for several people
    • workspace.people.access.set · Which brands a person reaches
    • workspace.people.access.set_many · Brand reach for several people
    • workspace.invites.send · Invite people
    • workspace.invites.resend · Resend an invitation
    • workspace.invites.resend_many · Resend several invitations
    • workspace.invites.copy_link · Copy an invitation link
    • workspace.invites.revoke · Revoke an invitation
    • workspace.invites.revoke_many · Revoke several invitations
    • workspace.invites.decline · Decline an invitation
    • workspace.access_requests.create · Request access
    • workspace.access_requests.cancel · Cancel an access request
    • workspace.access_requests.decide · Decide an access request
    • workspace.join_domains.read · Join domains
    • workspace.join_domains.set · Join with the domain
    • workspace.join_domains.remove · Remove a join domain
    • workspace.join · Join an organisation
    • workspace.people.handover · Hand over someone's work
    • workspace.reconnect_requests.dismiss · Dismiss a reconnect request