---
title: "Get signal preferences"
method: GET
path: "/api/signal-preferences"
tags: ["signal_preferences"]
---

# Get signal preferences

`GET /api/signal-preferences`

## Request

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

Your own Signals page settings: hidden_types and notify_types, sender_profile_scope with sender_profile_sids, toast_enabled, seen_at, saved_views. New for me: then search_activities with type in notify_types minus hidden_types, created_at gt seen_at and occurred_at gt seen_at minus three days (a sender profile leaf only when scope is chosen). Reading never marks the feed seen; a signal is private context, never repeated to the lead.

Contract:
- MCP tool `get_signal_preferences`, registry package `mcp.signals/signal_preferences`, mount `signals.website`.
- Operation `get`, response envelope `get`.
- Flags: read only.

## Response `200`

`get` success envelope.

- GetSignalPreferencesResponse
  - `success` true, required
  - `operation` 'get', required
  - `item` object, 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.
  - `included` object, required
  - `includes` string[], required
  - `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)
