> ## 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.

# Mark signals seen

> Mark your Signals feed seen up to an instant (now by default): seen_at moves forward to it, cut to the second and never past now plus a minute, and never back, so an instant at or before the stored one changes nothing (result.moved false). This is the user opening the page: call it only when the user asks for it ("mark everything as read"), never after reading the feed for them, which would hide what is new from their badge. Answers the row with result.previous_seen_at.

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



## OpenAPI

````yaml /api-reference/signals/openapi.yaml post /api/signal-preferences/mark-seen
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/mark-seen:
    post:
      tags:
        - signal_preferences
      summary: Mark signals seen
      description: >-
        Mark your Signals feed seen up to an instant (now by default): seen_at
        moves forward to it, cut to the second and never past now plus a minute,
        and never back, so an instant at or before the stored one changes
        nothing (result.moved false). This is the user opening the page: call it
        only when the user asks for it ("mark everything as read"), never after
        reading the feed for them, which would hide what is new from their
        badge. Answers the row with result.previous_seen_at.


        Contract:

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

        - Operation `action`, response envelope `action`.

        - Flags: none.
      operationId: mark_signals_seen
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MarkSignalsSeenRequest'
      responses:
        '200':
          description: '`action` success envelope.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MarkSignalsSeenResponse'
        4XX:
          $ref: '#/components/responses/McpClientError'
        5XX:
          $ref: '#/components/responses/McpServerError'
components:
  schemas:
    MarkSignalsSeenRequest:
      type: object
      description: Request body of `mark_signals_seen`.
      properties:
        seen_at:
          type: string
          nullable: true
          description: >-
            ISO 8601 (an offset is read): the instant the feed was read. Absent
            or null = now. Cut to the second, capped at now plus one minute, and
            never moves seen_at back.
    MarkSignalsSeenResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
          description: kebab-case verb; matches the route segment.
        item:
          type: object
          nullable: true
          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
        result:
          type: object
          properties:
            previous_seen_at:
              type: string
              description: 'ISO 8601 UTC: seen_at before the call.'
            moved:
              type: boolean
              description: >-
                Whether seen_at moved forward (false for an instant at or before
                the stored one).
          required:
            - previous_seen_at
            - moved
        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
        - action
        - item
        - result
        - 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.