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
API/Brand API
Reference3 min read

Sync

Your own copy of what you can see: groups, bootstrap, records by id and each group's changes in order.

On this page
  • sync.deltas · Group deltas
  • sync.groups.list · Your sync groups
  • sync.bootstrap · Bootstrap a sync group
  • sync.records.read · Records by id

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
    • 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
    • Events

MCP

  • MCP server

Connectors

  • Brand connectors

Nödo and agents

  • Nödo in the brand

Genome

  • Genome specification
Русский
한국어
日本語
中文
हिन्दी
Open the app

Updated on January 1, 1970

PreviousBillingNextWebsite and domains

In this section

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

  • sync.deltas · Group deltas
  • sync.groups.list · Your sync groups
  • sync.bootstrap · Bootstrap a sync group
  • sync.records.read · Records by id
Genome
  • Brand Kit
  • Library
  • Works
  • Read-only in every door.

    sync.deltas · Group deltas

    The frames of one sync group after a cursor, in order and contiguous (seq). cursor_expired means bootstrap the group again; group_forbidden means you may not hold it (any more): drop it locally. The server decides group membership.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/sync.deltas
    MCP toolsync_deltas
    Scopesync.read
    Minimum roleself
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {
      group: string  // `<kind>:<uuid>` (person, workspace, brand, brand-staff, conversation, team, team-space, mailbox).
      after?: integer  // 0–9007199254740991 · default 0 · The last `seq` applied; 0 right after a bootstrap at seq 0.
      limit?: integer  // 1–500 · default 200
      shapes?: Record<string, integer>  // Shape versions the client understands (served N and N-1).
    }

    Output

    {
      group: string
      frames: Array<{
        type: "delta"
        group: string
        seq: integer  // 1–9007199254740991
        event: {
          id: string
          type: string
          occurredAt: string
          actor?: {
            kind: "person" | "agent" | "system" | "service"
            id: string | null
          }
          idempotencyKey?: string | null
        }
        changes: Array<{
          op: "put" | "patch" | "delete" | "stale"
          entity: string
          id: string
          version: string
        }>
      }>
      head: integer  // 0–9007199254740991
      hasMore: boolean
    }

    sync.groups.list · Your sync groups

    The sync groups the person may hold now (their own inbox, their workspaces and brands) with each group's policy: whether a copy may be kept on the device and how many records fit. Conversations open from a list the person already reads. The database decides membership; the client never infers it.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/sync.groups.list
    MCP toolsync_groups_list
    Scopesync.read
    Minimum roleself
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {}

    Output

    {
      groups: Array<{
        group: string
        persist: boolean
        maxRecords: integer  // -9007199254740991–9007199254740991
      }>
    }

    sync.bootstrap · Bootstrap a sync group

    One page of a group's records and its sequence number, read in the same database snapshot. Page with nextPageToken; the group's cursor is the lowest seq of all pages, after which sync.deltas follows. Refused (forbidden, detail group_forbidden) when the person is not in the group.

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/sync.bootstrap
    MCP toolsync_bootstrap
    Scopesync.read
    Minimum roleself
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {
      group: string  // A sync group: `<kind>:<uuid>` (person, workspace, brand, brand-staff, conversation, team, team-space, mailbox).
      pageToken?: string | null  // `nextPageToken` of the previous page; absent for the first.
      shapes?: Record<string, integer>  // Shape versions the client understands, by entity. A version the server no longer serves answers `shape_unsupported`.
      limit?: integer  // 1–1000 · Records per page (500 by default).
    }

    Output

    {
      group: string
      seq: integer  // 0–9007199254740991
      records: Array<{
        entity: string
        id: string  // uuid
        version: string
        data: Record<string, unknown>
      }>
      nextPageToken: string | null
      shapes: Record<string, integer>
      bytes?: integer  // -9007199254740991–9007199254740991
    }

    sync.records.read · Records by id

    Current records of one entity by id, only those the person may read: missing ids are gone or hidden. Used for stale changes (too large, or fields that differ per reader).

    FieldValue
    KindRead
    HTTP methodPOST /api/v1/sync.records.read
    MCP toolsync_records_read
    Scopesync.read
    Minimum roleself
    Human confirmationNo
    DoorsScreens, Apps, API
    StatusAvailable

    Input

    {
      entity: "notification" | "read_mark" | "conversation" | "message" | "inbox_item" | "work" | "task" | "calendar_event" | "library_asset" | "internal_note" | "team_space" | "team_message" | "mail_thread" | "person"
      ids: string[]  // ≤ 200 items
      group?: string  // The group the ids belong to, when the caller knows it: refused unless the person is in it.
    }

    Output

    {
      records: Array<{
        entity: string
        id: string  // uuid
        version: string
        data: Record<string, unknown>
      }>
    }