---
title: "Update signal preferences"
method: PATCH
path: "/api/signal-preferences"
tags: ["signal_preferences"]
---

# Update signal preferences

`PATCH /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`

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.

## Request body

- UpdateSignalPreferencesRequest: Request body of `update_signal_preferences`.
  - `hidden_types` string[]: 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` string[]: 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` 'all' | 'mine' | 'chosen': all | mine | chosen: whose sender profiles the feed starts on. Moving off chosen keeps sender_profile_sids.
  - `sender_profile_sids` string[]: 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` boolean: false stops the toasts; the badge still counts.
  - `saved_views` object[]: 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.
    - `id` string: The id of a stored view to keep it (10 base62 characters, unique within the list); absent = the server mints one.
    - `name` string, required: 1..60 characters.
    - `view` 'needs_me' | 'all' | 'posts' | 'moments' | 'website' | 'linkedin' | 'email', required: all | website | linkedin | email.
    - `filter` object: The view's filter; absent = not filtered. Answered with every key.
      - `object_type` 'person' | 'company', nullable: person | company; null or absent = both.
      - `playtable_sid` string, nullable: One table (pt_tb_...); null or absent = every table.
      - `sender_profile_sids` string[]: At most 200 sender profiles (unibox sender profile sids, ub_sp_...), duplicates collapse; absent or [] = not filtered.
      - `types` string[]: 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` string, nullable: A name search, up to 128 characters.

## Response `200`

`update` success envelope.

- UpdateSignalPreferencesResponse
  - `success` true, required
  - `operation` 'update', 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.
  - `updated_fields` string[], required
  - `previous_values` object, required
  - `kept_fields` string[]: 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` 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)
