---
title: "Mark signals seen"
method: POST
path: "/api/signal-preferences/mark-seen"
tags: ["signal_preferences"]
---

# Mark signals seen

`POST /api/signal-preferences/mark-seen`

## Request

- Base URL: `https://beta.getsales.io/signals/v1`
- URL: `https://beta.getsales.io/signals/v1/api/signal-preferences/mark-seen`
- Auth: HTTP bearer and API key in header `Team-SID`

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.

## Request body

- MarkSignalsSeenRequest: Request body of `mark_signals_seen`.
  - `seen_at` string, nullable: 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.

## Response `200`

`action` success envelope.

- MarkSignalsSeenResponse
  - `success` true, required
  - `operation` 'action', required
  - `action` string, required: kebab-case verb; matches the route segment.
  - `item` object, nullable, required
    - `sid` string, required: Signal preference sid (sg_up_...).
    - `team_sid` string, required: Owning team (ts_tm_..., external: gs.service.id).
    - `user_sid` string, required: 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` string[], required: 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` string[], required: 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` 'all' | 'mine' | 'chosen', required: 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` string[], required: 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` boolean, required: Whether a notify type raises a toast. Default true.
    - `seen_at` string, required: 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` object[], required: The saved views of the page, at most 20, ids unique within the list. [] by default.
      - `id` string, required: 10 base62 characters, minted by the server for an item sent without one and kept across writes.
      - `name` string, required: 1..60 characters.
      - `view` 'needs_me' | 'all' | 'posts' | 'moments' | 'website' | 'linkedin' | 'email', required: all | website | linkedin | email: the view the saved view opens on.
      - `filter` object, required
        - `object_type` 'person' | 'company', nullable, required: person | company: the All / People / Companies switch; null = both.
        - `playtable_sid` string, nullable, required: The table (pt_tb_...); null = every table.
        - `sender_profile_sids` string[], required: The sender profiles (unibox sender profile sids, ub_sp_...); [] = not filtered.
        - `types` string[], required: The quick filter: signal types (SignalFeedType) in the page's order; [] = every shown type of the view.
        - `q` string, nullable, required: The name search, up to 128 characters; null = none.
    - `created_at` string, required: ISO 8601 UTC, the first call.
    - `updated_at` string, required: ISO 8601 UTC.
  - `result` object, required
    - `previous_seen_at` string, required: ISO 8601 UTC: seen_at before the call.
    - `moved` boolean, required: Whether seen_at moved forward (false for an instant at or before the stored one).
  - `meta` object, required
    - `trace_id` string, required: UUID v7; same 128-bit value as the X-Trace-Id header.
    - `span_id` string, required: 16 hex chars, root span of this request.
    - `timestamp` string, required: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
    - `duration_ms` integer, required: Server-side wall clock.
    - `team_sid` string, nullable: 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` string, nullable: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.

## Other responses

- `4XX`: 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.
- `5XX`: MCP error envelope with `error.code` internal_error or service_unavailable.

---

[API](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-signals.md) - [All operations](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-signals/llms.txt) - [OpenAPI document](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-signals/revisions/310ca5d2219d?raw)
