> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getsales.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Update sender profile

> Partial edit of a sender profile's config: name, label, avatar_url, assignee_user_sid, linkedin_history_since and linkedin_history_scope (the LinkedIn channel's history window and import scope; an earlier day or a wider scope re-walks the account). Account refs are refused here (the channel verbs own them), and so is the channel state (linkedin_status, a mailbox status): a broken channel is fixed on the account. A sender profile cannot be paused: it has no status.

Contract:
- MCP tool `update_sender_profile`, registry package `mcp.unibox/sender_profiles`, mount `unibox.sender-profiles`.
- Operation `update`, response envelope `update`.
- Flags: none.



## OpenAPI

````yaml /api-reference/unibox/openapi.yaml patch /api/sender-profiles/{sid}
openapi: 3.0.3
info:
  title: 'GetSales public contract: gs.service.unibox'
  description: >-
    The team inbox and the AI SDR: every LinkedIn and email thread in one place
    (conversations, messages, the timeline events), the manual tasks a thread
    spawns, the sender profiles the team speaks through with their LinkedIn
    account and mailboxes, and the one agent per team with its scenarios, plans
    and runs.


    GENERATED. This document is projected from the Zod MCP tool registry in
    `product/mcp/gs.mcp` (one tool per public endpoint, 1:1). Do not edit it by
    hand; edit the tool definition and regenerate with `pnpm openapi:public`.


    Surface: the public `/api` contract of `gs.service.unibox`, 125 operations.
    This is the only OpenAPI document the platform publishes. Internal
    (`/internal`) and health endpoints are deliberately absent: they are not
    part of any contract, they can change without notice, and the service source
    is their only description.


    Conventions:

    - Auth is a bearer JWT, optionally narrowed by the `Team-SID` header.

    - Every success body is an MCP envelope: `success: true` plus one typed
    `operation` shape (`search`, `get`, `create`, `update`, `delete`, `metrics`,
    `group_by`, `action`), and a `meta` block with `trace_id` for support.

    - Every failure is the same `McpError` envelope with a code from a fixed
    16-code taxonomy, so a client maps errors once.

    - Lists page with `page_size` (0 to 500, default 50) plus an opaque forward
    `cursor`; `page_size: 0` returns counts only.

    - On `GET` and `DELETE`, object-valued query parameters (`filter`, `sort`)
    travel as JSON text and array-valued ones repeat as `name[]=value`.

    - The MCP-only `_meta` field (usage analytics) never reaches the backend and
    is not part of this contract.
  version: '1.0'
  contact:
    name: GetSales
    url: https://getsales.io
    email: support@getsales.io
  license:
    name: Proprietary
    url: https://getsales.io/terms
servers:
  - url: https://beta.getsales.io/unibox/v1
    description: >-
      Production (the gateway path on the beta ring; the origin is provisioned
      per DEPLOY_MAP.md)
security:
  - BearerJwt: []
    TeamSid: []
tags:
  - name: agent_answers
    description: >-
      Registry package `mcp.unibox/agent_answers`, served on MCP mount
      `unibox.knowledge`.
  - name: agent_conversation_uploads
    description: >-
      Registry package `mcp.unibox/agent_conversation_uploads`, served on MCP
      mount `unibox.agent-memory`.
  - name: agent_examples
    description: >-
      Registry package `mcp.unibox/agent_examples`, served on MCP mount
      `unibox.agent-memory`.
  - name: agent_hints
    description: >-
      Registry package `mcp.unibox/agent_hints`, served on MCP mount
      `unibox.agent-memory`.
  - name: agent_plans
    description: >-
      Registry package `mcp.unibox/agent_plans`, served on MCP mount
      `unibox.agent`.
  - name: agent_runs
    description: >-
      Registry package `mcp.unibox/agent_runs`, served on MCP mount
      `unibox.agent-memory`.
  - name: agent_scenarios
    description: >-
      Registry package `mcp.unibox/agent_scenarios`, served on MCP mount
      `unibox.agent`.
  - name: agent_source_parses
    description: >-
      Registry package `mcp.unibox/agent_source_parses`, served on MCP mount
      `unibox.knowledge`.
  - name: agent_sources
    description: >-
      Registry package `mcp.unibox/agent_sources`, served on MCP mount
      `unibox.knowledge`.
  - name: agent_tests
    description: >-
      Registry package `mcp.unibox/agent_tests`, served on MCP mount
      `unibox.agent-memory`.
  - name: agents
    description: >-
      Registry package `mcp.unibox/agents`, served on MCP mount
      `unibox.website`.
  - name: conversation_events
    description: >-
      Registry package `mcp.unibox/conversation_events`, served on MCP mount
      `unibox.inbox`.
  - name: conversations
    description: >-
      Registry package `mcp.unibox/conversations`, served on MCP mount
      `unibox.inbox`.
  - name: messages
    description: >-
      Registry package `mcp.unibox/messages`, served on MCP mount
      `unibox.inbox`.
  - name: sender_profiles
    description: >-
      Registry package `mcp.unibox/sender_profiles`, served on MCP mount
      `unibox.sender-profiles`.
  - name: tasks
    description: Registry package `mcp.unibox/tasks`, served on MCP mount `unibox.inbox`.
  - name: timeline
    description: >-
      Registry package `mcp.unibox/timeline`, served on MCP mount
      `unibox.inbox`.
paths:
  /api/sender-profiles/{sid}:
    patch:
      tags:
        - sender_profiles
      summary: Update sender profile
      description: >-
        Partial edit of a sender profile's config: name, label, avatar_url,
        assignee_user_sid, linkedin_history_since and linkedin_history_scope
        (the LinkedIn channel's history window and import scope; an earlier day
        or a wider scope re-walks the account). Account refs are refused here
        (the channel verbs own them), and so is the channel state
        (linkedin_status, a mailbox status): a broken channel is fixed on the
        account. A sender profile cannot be paused: it has no status.


        Contract:

        - MCP tool `update_sender_profile`, registry package
        `mcp.unibox/sender_profiles`, mount `unibox.sender-profiles`.

        - Operation `update`, response envelope `update`.

        - Flags: none.
      operationId: update_sender_profile
      parameters:
        - name: sid
          in: path
          required: true
          description: Sender profile sid (ub_sp_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ub_sp_
            description: Sender profile sid (ub_sp_…).
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSenderProfileRequest'
      responses:
        '200':
          description: '`update` success envelope.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpdateSenderProfileResponse'
        4XX:
          $ref: '#/components/responses/McpClientError'
        5XX:
          $ref: '#/components/responses/McpServerError'
components:
  schemas:
    UpdateSenderProfileRequest:
      type: object
      description: Request body of `update_sender_profile`.
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
          description: >-
            New display persona name (1..255); connecting an account never
            renames the profile.
        label:
          type: string
          nullable: true
          maxLength: 255
          description: null or an empty string clears the label.
        avatar_url:
          type: string
          nullable: true
          maxLength: 2048
          description: >-
            Display photo URL; on a sender profile with a LinkedIn account, the
            account's photo takes its place again at the next read.
        assignee_user_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          description: null unassigns the operator.
        linkedin_history_since:
          type: string
          nullable: true
          pattern: ^(now|\d{4}-\d{2}-\d{2})$
          description: >-
            The LinkedIn history window; present with null = all history, now =
            only what arrives from this change on. An earlier day, or null,
            re-walks the account down to it (history_sync pending); a later day,
            or now, deletes nothing, only bounds later runs.
        linkedin_history_scope:
          type: string
          nullable: true
          enum:
            - all
            - playtable_people
          description: >-
            The LinkedIn import scope; present with null = playtable_people, the
            default. Back to all re-walks the account (history_sync pending) so
            the conversations the people-only scope kept out come in;
            playtable_people deletes nothing and narrows later runs.
    UpdateSenderProfileResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - update
        item:
          type: object
          properties:
            sid:
              type: string
              description: Sender profile sid (ub_sp_…).
            team_sid:
              type: string
              description: Owning team (ts_tm_…, external - gs.service.id).
            name:
              type: string
              description: >-
                Display persona name (1..255). The profile is the person:
                connecting an account never renames it.
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: >-
                    The OAuth client that acted ("Claude", "n8n"); null for a
                    user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: >-
                    Why a system actor wrote the row (snapshot_capture_job,
                    ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: >-
                    Internal audit context: the grant set the actor held at
                    write time. Not a contract.
                cluster_id:
                  type: integer
                  nullable: true
                  description: 'Internal audit context: the cluster that served the write.'
                trace_id:
                  type: string
                  nullable: true
                  description: >-
                    Internal audit context: the trace id of the request that
                    wrote the row.
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
              description: Actor that created the sender profile (AccessIdentityValue).
            label:
              type: string
              nullable: true
              description: >-
                The free text under the name in the sender profile list
                ("Outbound EU"), max 255; null = none.
            linkedin_account_sid:
              type: string
              nullable: true
              description: >-
                The gtm-api LinkedIn account this sender profile speaks through
                (ln_ac_…); null = no LinkedIn channel. Bound by the channel
                verbs only, never by update_sender_profile.
            linkedin_source:
              type: string
              nullable: true
              enum:
                - cloud
                - own_proxy
                - gologin
                - attached
              description: >-
                How that account came in (the page's session badge): cloud |
                own_proxy | gologin (the per-sender-profile connect flows) |
                attached (an account gtm-api already held). Read-only.
            linkedin_status:
              type: string
              nullable: true
              enum:
                - active
                - reconnect_required
                - stalled
                - disconnected
                - stopped
              description: >-
                The LinkedIn channel as gtm-api reports it: active sends,
                reconnect_required = the browser is signed out, stalled = the
                account did nothing through a full day of its sync hours, or its
                browser failed a start gtm-api still retries (sends are still
                tried, nothing to sign in to; linkedin_status_reason says
                which), disconnected = the account is gone, refused or its
                browser parked after the retries. null = no LinkedIn account
                bound. Read-only. The sender profile has no status of its own: a
                mailbox carries its state on its own mailboxes[] row.
            linkedin_status_reason:
              type: string
              nullable: true
              description: >-
                gtm-api's cause token behind a non-active linkedin_status; null
                while active. Read-only. Login: logged_out, login_failed.
                Silence: heartbeat_stale (no cause known). browser_unreachable
                (stalled, ours: the platform could not run the browser, behind a
                silence or on a failed start still retried). A browser fault the
                team fixes, parked (disconnected) or not parked yet (stalled: a
                failed start gtm-api still retries, or a silence):
                browser_proxy_failed (the proxy does not answer),
                browser_profile_unavailable (the GoLogin profile is deleted or
                unreadable), browser_linkedin_session (LinkedIn wants a sign-in
                or a check), browser_linkedin_restricted,
                browser_other_workspace (the member is connected in another
                workspace), browser_client_investigation (theirs, cause not
                named). Ours, parked: browser_support_investigation,
                sync_failed. Also gtm_connection_revoked, gtm_access_lost,
                account_deleted, subscription_required, browser_stopped.
            linkedin_has_sn:
              type: boolean
              description: >-
                Whether the LinkedIn account holds a Sales Navigator licence, as
                gtm-api reports it. Read-only, and mirrored to playtables, where
                a data source whose link opens in Sales Navigator may only name
                a sender profile with this set (the save answers 422
                sales_nav_required otherwise). false on a sender profile with no
                LinkedIn account.
            linkedin_recruiter_status:
              type: string
              nullable: true
              enum:
                - active
                - signed_out
              description: >-
                Whether the LinkedIn account holds a Recruiter licence and its
                session is alive: active | signed_out, null = no Recruiter
                licence. Read-only, and mirrored to playtables, where a
                Recruiter data source needs active (422 recruiter_required on
                null, recruiter_signed_out on signed_out).
            linkedin_history_since:
              type: string
              nullable: true
              description: >-
                The LinkedIn history window; present with null = all history,
                now = only what arrives from this change on. An earlier day, or
                null, re-walks the account down to it (history_sync pending); a
                later day, or now, deletes nothing, only bounds later runs.
            linkedin_history_scope:
              type: string
              enum:
                - all
                - playtable_people
              description: >-
                The LinkedIn import scope; present with null = playtable_people,
                the default. Back to all re-walks the account (history_sync
                pending) so the conversations the people-only scope kept out
                come in; playtable_people deletes nothing and narrows later
                runs.
            email_account_sid:
              type: string
              nullable: true
              description: >-
                The PRIMARY mailbox (em_ac_…), the one `mailboxes` marks
                is_primary; null = no mailbox.
            avatar_url:
              type: string
              nullable: true
              description: >-
                Display photo (max 2048): the bound LinkedIn account's photo,
                which the sender profile follows. Taken at the attach, read
                again when gtm-api reports the account created, restored or
                through its first sync, and by the nightly sweep; the detach
                removes it. gtm-api deletes a photo it replaced, so an old URL
                can be gone.
            assignee_user_sid:
              type: string
              nullable: true
              description: >-
                Operator of the sender profile (external user sid,
                gs.service.id): the default assignee of the tasks its threads
                spawn; null = unassigned.
            history_sync:
              type: object
              nullable: true
              properties:
                status:
                  type: string
                  enum:
                    - pending
                    - running
                    - completed
                    - failed
                  description: >-
                    pending | running | completed | failed. Non-terminal states
                    are polled; sync_sender_profile_history returns the
                    in-flight one instead of starting a second walk.
                requested_at:
                  type: string
                  description: ISO 8601 UTC, when the walk was asked for.
                started_at:
                  type: string
                  nullable: true
                finished_at:
                  type: string
                  nullable: true
                threads_seen:
                  type: integer
                  minimum: 0
                  description: gtm threads walked, skipped ones included.
                threads_imported:
                  type: integer
                  minimum: 0
                  description: Local conversations created or grown by the walk.
                messages_imported:
                  type: integer
                  minimum: 0
                  description: New local message rows.
                skipped:
                  type: integer
                  minimum: 0
                  description: >-
                    Rows the walk could not map: group threads with no single
                    counterpart, recalled or attachment-only messages, unknown
                    kinds.
                synced_through:
                  type: string
                  nullable: true
                  description: >-
                    ISO 8601 UTC watermark (the gtm-side updated_at) a delta run
                    resumes from; null after a full walk that never completed.
                error:
                  type: string
                  nullable: true
                  description: >-
                    Reason token on a failed run: gtm_read_failed |
                    gtm_bridge_unavailable | no_channel_account.
              required:
                - status
                - requested_at
                - started_at
                - finished_at
                - threads_seen
                - threads_imported
                - messages_imported
                - skipped
                - synced_through
                - error
              description: >-
                State of the account history walk; null = never requested.
                Written by the backfill job only.
            mailboxes:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  email_account_sid:
                    type: string
                    description: >-
                      The gtm.service.email mailbox this entry mirrors
                      (em_ac_…).
                  address:
                    type: string
                    nullable: true
                    description: >-
                      The mailbox address as gtm holds it; null until the first
                      mirror read.
                  display_name:
                    type: string
                    nullable: true
                    description: The From name gtm sends under; null = the account default.
                  provider:
                    type: string
                    nullable: true
                    description: >-
                      google | microsoft | imap_smtp | gtm_hosted; null while
                      unknown.
                  status:
                    type: string
                    description: >-
                      gtm's own words, mirrored by the health webhook and every
                      re-read: active | reconnect_required | disconnected |
                      subscription_required | sending_paused | deleted. gtm
                      keeps a sending pause next to an active status; the mirror
                      reads such a mailbox as sending_paused. Only active is
                      sendable.
                  status_reason:
                    type: string
                    nullable: true
                    description: >-
                      The cause behind a non-active status; null otherwise. On
                      sending_paused it is the pause's cause: manual
                      (pause_sender_profile_mailbox_sending), or a guardrail of
                      gtm's (bounce_rate, complaint_rate, provider_block,
                      warmup_guard), which resume_sender_profile_mailbox_sending
                      lifts only with a reason.
                  is_primary:
                    type: boolean
                    description: >-
                      Exactly one mailbox is primary while any exists: the one
                      the sender profile's email_account_sid points at (the
                      composer default). A detached primary hands the role on.
                  sending_limits:
                    type: object
                    nullable: true
                    properties:
                      daily_limit:
                        type: integer
                      min_interval_seconds:
                        type: integer
                      sending_window:
                        anyOf:
                          - type: object
                            additionalProperties: {}
                          - type: array
                            items: {}
                          - {}
                    description: >-
                      Mirrored from gtm: the mailbox's daily cap, its minimum
                      gap between sends and its own window. Edited through
                      update_sender_profile_mailbox.
                  warmup_config:
                    type: object
                    nullable: true
                    properties:
                      enabled:
                        type: boolean
                      ramp_start_daily:
                        type: integer
                      ramp_step_per_day:
                        type: integer
                      target_daily:
                        type: integer
                    description: >-
                      Mirrored from gtm: the warm-up ramp (start volume, daily
                      step, target).
                  signature_html:
                    type: string
                    nullable: true
                    description: HTML signature appended by gtm on send; null = none.
                  bcc:
                    type: array
                    nullable: true
                    items:
                      type: string
                    description: >-
                      The mailbox's standing blind copies. LOCAL to this sender
                      profile (gtm has no bcc on the account); at most 5
                      addresses.
                  track_opens:
                    type: boolean
                    nullable: true
                  track_clicks:
                    type: boolean
                    nullable: true
                  email_tracking_domain_sid:
                    type: string
                    nullable: true
                    description: >-
                      The gtm tracking domain used for open and click links
                      (em_td_…); null = none.
                  history_since:
                    type: string
                    nullable: true
                    description: >-
                      The mailbox's history window, LOCAL to the sender profile;
                      present with null = all history, now = from this change
                      on. An earlier day, or null, re-walks this mailbox down to
                      it (the people's activity too); a later day, or now,
                      deletes nothing.
                  history_scope:
                    type: string
                    enum:
                      - all
                      - playtable_people
                    description: >-
                      The mailbox's import scope, LOCAL to this sender profile
                      like bcc: all = every thread of the mailbox reaches the
                      inbox, playtable_people = only the threads whose
                      counterpart is a person in one of the workspace's
                      playtables (a thread that exists keeps syncing; a person
                      added to a playtable later brings its threads in);
                      playtable_people is the default. Changed through
                      update_sender_profile_mailbox: back to all re-walks the
                      mailbox.
                  connected_at:
                    type: string
                    nullable: true
                    description: ISO 8601 UTC, when the mailbox was connected on gtm.
                  synced_at:
                    type: string
                    nullable: true
                    description: ISO 8601 UTC, when this mirror last read gtm.
                required:
                  - email_account_sid
                  - address
                  - display_name
                  - provider
                  - status
                  - status_reason
                  - is_primary
                  - sending_limits
                  - warmup_config
                  - signature_html
                  - bcc
                  - track_opens
                  - track_clicks
                  - email_tracking_domain_sid
                  - history_since
                  - history_scope
                  - connected_at
                  - synced_at
              description: >-
                The sender profile's mailboxes, the primary one first in meaning
                (is_primary); null = none. A sender profile holds several and an
                email step rotates across the sendable ones.
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: >-
                    The OAuth client that acted ("Claude", "n8n"); null for a
                    user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: >-
                    Why a system actor wrote the row (snapshot_capture_job,
                    ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: >-
                    Internal audit context: the grant set the actor held at
                    write time. Not a contract.
                cluster_id:
                  type: integer
                  nullable: true
                  description: 'Internal audit context: the cluster that served the write.'
                trace_id:
                  type: string
                  nullable: true
                  description: >-
                    Internal audit context: the trace id of the request that
                    wrote the row.
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
              description: Actor that soft-deleted the sender profile; null while live.
            created_at:
              type: string
              description: ISO 8601 UTC.
            updated_at:
              type: string
              description: >-
                ISO 8601 UTC; bumped by config edits AND by channel state
                changes, the health-mirror ones included.
            deleted_at:
              type: string
              nullable: true
              description: ISO 8601 UTC; null = live (mandatory soft delete).
          required:
            - sid
            - team_sid
            - name
            - created_by
            - label
            - linkedin_account_sid
            - linkedin_source
            - linkedin_status
            - linkedin_status_reason
            - linkedin_has_sn
            - linkedin_recruiter_status
            - linkedin_history_since
            - linkedin_history_scope
            - email_account_sid
            - avatar_url
            - assignee_user_sid
            - history_sync
            - mailboxes
            - deleted_by
            - created_at
            - updated_at
            - deleted_at
        updated_fields:
          type: array
          items:
            type: string
        previous_values:
          type: object
          additionalProperties: {}
        kept_fields:
          type: array
          items:
            type: string
          description: >-
            The fields this write did not change because the person's own value
            stands on them (stamped person); read the item for what landed.
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              description: >-
                The team this call ran in (the token team, or the team_sid
                override). Null when unauthenticated; absent from pre-2026-08-20
                backends.
            actor_type:
              type: string
              nullable: true
              description: >-
                user | agent | api_key | system. Null when unauthenticated;
                absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - item
        - updated_fields
        - previous_values
        - meta
    McpError:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - false
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - validation_failed
                - nothing_to_update
                - not_found
                - relation_not_found
                - invalid_transition
                - limit_exceeded
                - payment_required
                - duplicate_rejected
                - conflict
                - delete_blocked
                - unauthorized
                - forbidden
                - rate_limited
                - internal_error
                - service_unavailable
                - not_implemented
            message:
              type: string
            recoverable:
              type: boolean
            suggestion:
              type: string
            field_errors:
              type: object
              additionalProperties:
                type: array
                items:
                  type: object
                  properties:
                    rule:
                      type: string
                    message:
                      type: string
                  required:
                    - rule
                    - message
            blockers:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                    description: >-
                      Machine-readable blocker type (active_flow, pending_tasks,
                      …).
                  severity:
                    type: string
                    enum:
                      - hard
                      - soft
                    description: >-
                      hard = external action required; soft = acknowledge is
                      enough.
                  description:
                    type: string
                  entity_sid:
                    type: string
                    nullable: true
                  count:
                    type: integer
                  resolution:
                    type: string
                    description: 'Hard: tool name to call. Soft: code for acknowledge[].'
                  resolution_hint:
                    type: string
                required:
                  - type
                  - severity
                  - description
                  - entity_sid
                  - resolution
                  - resolution_hint
            context:
              type: object
              additionalProperties: {}
          required:
            - code
            - message
            - recoverable
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              description: >-
                The team this call ran in (the token team, or the team_sid
                override). Null when unauthenticated; absent from pre-2026-08-20
                backends.
            actor_type:
              type: string
              nullable: true
              description: >-
                user | agent | api_key | system. Null when unauthenticated;
                absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - error
  responses:
    McpClientError:
      description: >-
        MCP error envelope. `error.code` is one of validation_failed,
        nothing_to_update, not_found, relation_not_found, invalid_transition,
        limit_exceeded, payment_required, duplicate_rejected, conflict,
        delete_blocked, unauthorized, forbidden, rate_limited, not_implemented.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/McpError'
    McpServerError:
      description: >-
        MCP error envelope with `error.code` internal_error or
        service_unavailable.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/McpError'
  securitySchemes:
    BearerJwt:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Access token issued by gs.service.id. Its `access_identity` claim
        carries `team_sid`, `actor_sid` and `actor_type`, and that team scope is
        authoritative.
    TeamSid:
      type: apiKey
      in: header
      name: Team-SID
      description: >-
        Team scope for tokens that do not carry one. Ignored when the token
        already names a team.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.