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

# Get Signal

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

## Request

- Base URL: `https://api.scrunchai.com/v1`
- URL: `https://api.scrunchai.com/v1/{brand_id}/signals/{signal_id}`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/scrunch/apis/scrunch-data-api/docs/:brand_id/signals/:signal_id/get.ts> (a function with typed inputs; its response is checked against the schema)

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

## Changes

- **2026-11-03** `e37811b6bc07`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/scrunch/apis/scrunch-data-api/changes/:brand_id/signals/:signal_id/get.md)

---

[API](https://skmtc.dev/scrunch/apis/scrunch-data-api.md) - [All operations](https://skmtc.dev/scrunch/apis/scrunch-data-api/llms.txt) - [OpenAPI document](https://skmtc.dev/scrunch/apis/scrunch-data-api/revisions/e28a10a186bf?raw)
