> ## 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 signal preferences

> Change your own Signals page settings, a partial update: each field sent replaces the stored value. hidden_types and notify_types are whole lists of signal types: to stop or start hearing of one, read the row and send the list without or with it. sender_profile_scope all | mine | chosen, with sender_profile_sids for chosen; toast_enabled; saved_views, the whole list: stored views keep their ids, a new one gets one. seen_at is mark_signals_seen. Nothing editable is 422 nothing_to_update.

Contract:
- MCP tool `update_signal_preferences`, registry package `mcp.signals/signal_preferences`, mount `signals.website`.
- Operation `update`, response envelope `update`.
- Flags: none.



## OpenAPI

````yaml /api-reference/signals/openapi.yaml patch /api/signal-preferences
openapi: 3.0.3
info:
  title: 'GetSales public contract: gs.service.signals'
  description: >-
    The signals service, its website lane: the team's registered sites with
    their key pages and tracked events, the team switch for the codes in links,
    and what the tracking plane saw: every visit as a session with its pages,
    forms and network, the browsers behind them and the people they were bound
    to; and, since P0 of its LinkedIn leg, who looked at a sender profile's
    LinkedIn profile (the sightings of the premium list, read once a day).


    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.signals`, 30 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/signals/v1
    description: >-
      Production (the gateway path on the beta ring; the origin is provisioned
      per DEPLOY_MAP.md)
security:
  - BearerJwt: []
    TeamSid: []
tags:
  - name: profile_view_sightings
    description: >-
      Registry package `mcp.signals/profile_view_sightings`, served on MCP mount
      `signals.visits`.
  - name: signal_preferences
    description: >-
      Registry package `mcp.signals/signal_preferences`, served on MCP mount
      `signals.website`.
  - name: signal_settings
    description: >-
      Registry package `mcp.signals/signal_settings`, served on MCP mount
      `signals.website`.
  - name: website_key_pages
    description: >-
      Registry package `mcp.signals/website_key_pages`, served on MCP mount
      `signals.website`.
  - name: website_session_owners
    description: >-
      Registry package `mcp.signals/website_session_owners`, served on MCP mount
      `signals.visits`.
  - name: website_sessions
    description: >-
      Registry package `mcp.signals/website_sessions`, served on MCP mount
      `signals.visits`.
  - name: website_sites
    description: >-
      Registry package `mcp.signals/website_sites`, served on MCP mount
      `signals.website`.
  - name: website_tracked_events
    description: >-
      Registry package `mcp.signals/website_tracked_events`, served on MCP mount
      `signals.website`.
  - name: website_visitors
    description: >-
      Registry package `mcp.signals/website_visitors`, served on MCP mount
      `signals.visits`.
paths:
  /api/signal-preferences:
    patch:
      tags:
        - signal_preferences
      summary: Update signal preferences
      description: >-
        Change your own Signals page settings, a partial update: each field sent
        replaces the stored value. hidden_types and notify_types are whole lists
        of signal types: to stop or start hearing of one, read the row and send
        the list without or with it. sender_profile_scope all | mine | chosen,
        with sender_profile_sids for chosen; toast_enabled; saved_views, the
        whole list: stored views keep their ids, a new one gets one. seen_at is
        mark_signals_seen. Nothing editable is 422 nothing_to_update.


        Contract:

        - MCP tool `update_signal_preferences`, registry package
        `mcp.signals/signal_preferences`, mount `signals.website`.

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

        - Flags: none.
      operationId: update_signal_preferences
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSignalPreferencesRequest'
      responses:
        '200':
          description: '`update` success envelope.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpdateSignalPreferencesResponse'
        4XX:
          $ref: '#/components/responses/McpClientError'
        5XX:
          $ref: '#/components/responses/McpServerError'
components:
  schemas:
    UpdateSignalPreferencesRequest:
      type: object
      description: Request body of `update_signal_preferences`.
      properties:
        hidden_types:
          type: array
          items:
            type: string
            enum:
              - website_visited
              - website_key_page_visited
              - website_form_submitted
              - website_event
              - linkedin_connection_request_accepted
              - linkedin_message_replied
              - linkedin_inmail_replied
              - linkedin_invitation_received
              - linkedin_followed
              - linkedin_message_reacted
              - linkedin_message_deleted
              - linkedin_profile_viewed_us
              - linkedin_connection_removed
              - linkedin_blocked
              - linkedin_post_published
              - linkedin_birthday
              - linkedin_work_anniversary
              - linkedin_job_changed
              - email_opened
              - email_link_clicked
              - email_replied
              - email_bounced
              - email_unsubscribed
              - email_complained
            description: >-
              A signal type: a ledger type (the type of search_activities) the
              Signals page lists, the website's first, then LinkedIn's, then
              email's.
          description: >-
            The signal types the feed leaves out. Replaces the stored list as a
            set ([] shows every type); duplicates collapse, stored in the page's
            order.
        notify_types:
          type: array
          items:
            type: string
            enum:
              - website_visited
              - website_key_page_visited
              - website_form_submitted
              - website_event
              - linkedin_connection_request_accepted
              - linkedin_message_replied
              - linkedin_inmail_replied
              - linkedin_invitation_received
              - linkedin_followed
              - linkedin_message_reacted
              - linkedin_message_deleted
              - linkedin_profile_viewed_us
              - linkedin_connection_removed
              - linkedin_blocked
              - linkedin_post_published
              - linkedin_birthday
              - linkedin_work_anniversary
              - linkedin_job_changed
              - email_opened
              - email_link_clicked
              - email_replied
              - email_bounced
              - email_unsubscribed
              - email_complained
            description: >-
              A signal type: a ledger type (the type of search_activities) the
              Signals page lists, the website's first, then LinkedIn's, then
              email's.
          description: >-
            The signal types the user is told about (the badge and the toast).
            Replaces the stored list as a set ([] tells nothing): to add or drop
            one type, read the row and send the whole list.
        sender_profile_scope:
          type: string
          enum:
            - all
            - mine
            - chosen
          description: >-
            all | mine | chosen: whose sender profiles the feed starts on.
            Moving off chosen keeps sender_profile_sids.
        sender_profile_sids:
          type: array
          items:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ub_sp_
          maxItems: 200
          description: >-
            The chosen sender profiles (unibox sender profile sids, ub_sp_...,
            18 characters), at most 200; duplicates collapse. Read when
            sender_profile_scope is chosen, where [] means every sender profile.
        toast_enabled:
          type: boolean
          description: false stops the toasts; the badge still counts.
        saved_views:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                pattern: ^[0-9A-Za-z]{10}$
                description: >-
                  The id of a stored view to keep it (10 base62 characters,
                  unique within the list); absent = the server mints one.
              name:
                type: string
                minLength: 1
                maxLength: 60
                description: 1..60 characters.
              view:
                type: string
                enum:
                  - needs_me
                  - all
                  - posts
                  - moments
                  - website
                  - linkedin
                  - email
                description: all | website | linkedin | email.
              filter:
                type: object
                properties:
                  object_type:
                    type: string
                    nullable: true
                    enum:
                      - person
                      - company
                    description: person | company; null or absent = both.
                  playtable_sid:
                    type: string
                    nullable: true
                    minLength: 18
                    maxLength: 18
                    pattern: ^pt_tb_
                    description: One table (pt_tb_...); null or absent = every table.
                  sender_profile_sids:
                    type: array
                    items:
                      type: string
                      minLength: 18
                      maxLength: 18
                      pattern: ^ub_sp_
                    maxItems: 200
                    description: >-
                      At most 200 sender profiles (unibox sender profile sids,
                      ub_sp_...), duplicates collapse; absent or [] = not
                      filtered.
                  types:
                    type: array
                    items:
                      type: string
                      enum:
                        - website_visited
                        - website_key_page_visited
                        - website_form_submitted
                        - website_event
                        - linkedin_connection_request_accepted
                        - linkedin_message_replied
                        - linkedin_inmail_replied
                        - linkedin_invitation_received
                        - linkedin_followed
                        - linkedin_message_reacted
                        - linkedin_message_deleted
                        - linkedin_profile_viewed_us
                        - linkedin_connection_removed
                        - linkedin_blocked
                        - linkedin_post_published
                        - linkedin_birthday
                        - linkedin_work_anniversary
                        - linkedin_job_changed
                        - email_opened
                        - email_link_clicked
                        - email_replied
                        - email_bounced
                        - email_unsubscribed
                        - email_complained
                      description: >-
                        A signal type: a ledger type (the type of
                        search_activities) the Signals page lists, the website's
                        first, then LinkedIn's, then email's.
                    description: >-
                      Signal types, stored as a set in the page's order; absent
                      or [] = every shown type of the view. Not checked against
                      the view's source.
                  q:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: A name search, up to 128 characters.
                description: >-
                  The view's filter; absent = not filtered. Answered with every
                  key.
            required:
              - name
              - view
          maxItems: 20
          description: >-
            The whole list of saved views, at most 20; replaces the stored one
            ([] clears it). Send the stored views with their ids to keep them.
    UpdateSignalPreferencesResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - update
        item:
          type: object
          properties:
            sid:
              type: string
              description: Signal preference sid (sg_up_...).
            team_sid:
              type: string
              description: 'Owning team (ts_tm_..., external: gs.service.id).'
            user_sid:
              type: string
              description: >-
                The member the row belongs to: the caller's actor sid (an agent
                acting for a member is the member; an api key has a row of its
                own). Exactly one row per team and user.
            hidden_types:
              type: array
              items:
                type: string
              description: >-
                Signal types (SignalFeedType) the feed leaves out, as a set in
                the page's order. Default ["email_bounced"]. Hiding is opt-out,
                so a type added to the list later shows at once. The shown types
                are every SignalFeedType not in this list.
            notify_types:
              type: array
              items:
                type: string
              description: >-
                Signal types the user is told about (the badge on the Signals
                menu entry counts the ones that are also shown, and each raises
                a toast while the user works elsewhere), as a set in the page's
                order. Default: website_key_page_visited,
                website_form_submitted, linkedin_connection_request_accepted,
                linkedin_message_replied, linkedin_inmail_replied,
                linkedin_invitation_received, email_replied. Opt-in, so a type
                added later tells nobody until chosen.
            sender_profile_scope:
              type: string
              enum:
                - all
                - mine
                - chosen
              description: >-
                Whose sender profiles the feed's sender profile filter starts
                on: all (default, no sender profile filter), mine (the user's
                own sender profiles) or chosen (sender_profile_sids). A default
                of the filter and nothing more.
            sender_profile_sids:
              type: array
              items:
                type: string
              description: >-
                The chosen sender profiles (unibox sender profile sids,
                ub_sp_...), at most 200, read when sender_profile_scope is
                chosen (chosen with [] is every sender profile: no sender
                profile filter) and kept when it moves off it, so moving back
                restores the picks. [] by default.
            toast_enabled:
              type: boolean
              description: Whether a notify type raises a toast. Default true.
            seen_at:
              type: string
              description: >-
                ISO 8601 UTC, whole seconds: up to when the user has seen the
                feed. A fact is new when it reached the ledger after this
                (created_at > seen_at in search_activities). Born a day before
                the row, so a first visit shows the last day as new; moved
                forward by mark_signals_seen only, never back.
            saved_views:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                    description: >-
                      10 base62 characters, minted by the server for an item
                      sent without one and kept across writes.
                  name:
                    type: string
                    description: 1..60 characters.
                  view:
                    type: string
                    enum:
                      - needs_me
                      - all
                      - posts
                      - moments
                      - website
                      - linkedin
                      - email
                    description: >-
                      all | website | linkedin | email: the view the saved view
                      opens on.
                  filter:
                    type: object
                    properties:
                      object_type:
                        type: string
                        nullable: true
                        enum:
                          - person
                          - company
                        description: >-
                          person | company: the All / People / Companies switch;
                          null = both.
                      playtable_sid:
                        type: string
                        nullable: true
                        description: The table (pt_tb_...); null = every table.
                      sender_profile_sids:
                        type: array
                        items:
                          type: string
                        description: >-
                          The sender profiles (unibox sender profile sids,
                          ub_sp_...); [] = not filtered.
                      types:
                        type: array
                        items:
                          type: string
                        description: >-
                          The quick filter: signal types (SignalFeedType) in the
                          page's order; [] = every shown type of the view.
                      q:
                        type: string
                        nullable: true
                        description: The name search, up to 128 characters; null = none.
                    required:
                      - object_type
                      - playtable_sid
                      - sender_profile_sids
                      - types
                      - q
                required:
                  - id
                  - name
                  - view
                  - filter
              description: >-
                The saved views of the page, at most 20, ids unique within the
                list. [] by default.
            created_at:
              type: string
              description: ISO 8601 UTC, the first call.
            updated_at:
              type: string
              description: ISO 8601 UTC.
          required:
            - sid
            - team_sid
            - user_sid
            - hidden_types
            - notify_types
            - sender_profile_scope
            - sender_profile_sids
            - toast_enabled
            - seen_at
            - saved_views
            - created_at
            - updated_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.