---
title: "Get Signal"
method: GET
path: "/{brand_id}/signals/{signal_id}"
tags: ["signals"]
---

# Get Signal

`GET /{brand_id}/signals/{signal_id}`

Fetch one signal by ID, including its full narrative (what happened, why it matters, what to do) when available. Returns 404 for IDs that exist but are not user-facing (non-fired or cluster-child rows) — the same population rule as `listSignals`.

## Path parameters

- `brand_id` integer, required
- `signal_id` integer, required

## Response `200`

Successful Response

- APISignal — A detected, statistically-tested movement in an AI-visibility metric.
  - `id` integer, required — Signal ID. Stable within one detection; use for `getSignal`.
  - `detected_for_date` string, date, required — Anchor date the nightly detection ran for (YYYY-MM-DD).
  - `fingerprint` string, required — Stable identity of the underlying issue across nightly re-detections (hash of the slice + metric). An ongoing signal is re-raised daily under the same fingerprint; reactions are keyed on it.
  - `subject_kind` 'brand' | 'competitor', required — Whose movement the signal describes: your `brand` or a `competitor`.
  - `alert_type` 'level_change' | 'trend', required — Detection kind: `level_change` (step shift) or `trend` (sustained drift).
  - `scope` 'account' | 'account_platform' | 'topic' | 'topic_platform', required — Slice granularity: `account`, `account_platform`, `topic`, or `topic_platform`.
  - `metric` string, required — Metric the signal fired on (e.g. `presence_rate`, `position_top_rate`, `cited_domain_rate`).
  - `platform` string, required — AI platform the signal was detected on. `(multi)` means the slice spans several platforms — see `slice.platforms` for the real list.
  - `direction` 'up' | 'down' | 'none', required — Direction of the movement: `up`, `down`, `none`.
  - `tier` 'high' | 'confident' | 'worth_a_look' | 'provisional' | 'low_confidence' | 'underpowered' | 'untested', required — Confidence tier, best first: `high`, `confident`, `worth_a_look`, `provisional`, then noise-floor tiers `low_confidence`, `underpowered`, `untested` (hidden by default).
  - `current_value` number, required — Metric value over the current window (0-1 rate).
  - `baseline_value` number, required — Metric value over the baseline window (0-1 rate).
  - `delta_absolute` number, required — `current_value - baseline_value` (positive = up).
  - `score` number, nullable — Engine priority score used for the default sort; null for legacy rows.
  - `narrative_what` string, required — One-line headline of what changed.
  - `narrative` APISignalNarrative — Engine-generated narrative for a signal.
    - `what_happened` string, nullable — Plain-language description of the detected change.
    - `why_it_matters` string, nullable — Why the change is significant for the brand.
    - `what_to_do` string, nullable — Suggested next step or investigation.
  - `slice` APISignalSlice, required — The data slice a signal was detected on.
    - `platforms` string[] — AI platforms the slice covers. Empty means all platforms.
    - `topic_labels` string[] — Topic labels the slice covers. Empty means all topics.
    - `geo_country` string, nullable — Country the slice is restricted to, when geo-scoped.
  - `window_current_start` string, date, nullable — Start of the current comparison window.
  - `window_current_end` string, date, nullable — End of the current comparison window.
  - `baseline_definition` string, nullable — Human-readable definition of the baseline window.
  - `url_movers` APISignalUrlMover[] — Per-URL citation movers behind the signal: the brand/competitor URLs whose distinct-response citation counts moved most between the baseline and current windows. Emitted for `cited_domain_rate` signals; empty for other metrics and older signals. Filterable via `mover_url`.
    - `normalized_url` string, required — Normalized cited URL (scheme and tracking params stripped).
    - `owner` 'brand' | 'competitor', required — Whose domain the URL belongs to: `brand` or `competitor`.
    - `competitor_id` integer, nullable — Competitor ID for `competitor`-owned URLs.
    - `competitor_name` string, nullable — Competitor name for `competitor`-owned URLs.
    - `current_responses` integer, required — Distinct responses citing the URL in the current window.
    - `baseline_responses` integer, required — Distinct responses citing the URL in the baseline window.
    - `current_prompts` integer, required — Distinct prompts whose responses cite the URL in the current window.
    - `baseline_prompts` integer, required — Distinct prompts whose responses cite the URL in the baseline window.
    - `contribution` number, nullable — Exact share of the signal's metric delta attributed to this URL. Brand-owned URLs only; null on competitor entries and older signals.
  - `created_at` string, date-time, required — When the signal row was created (UTC).

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/scrunchai/apis/scrunch-data-api.md) · [All operations](https://skmtc.net/scrunchai/apis/scrunch-data-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/scrunchai/scrunch-data-api/revisions/c4fe20c603a3/schema)
