signals

List detected signals for a brand — statistically-tested movements (level changes and trends) in AI-visibility metrics, produced by the nightly detection sweep.

Population

By default only user-facing signals are returned: the confidence tiers high, confident, worth_a_look, and provisional. Pass an explicit tier to select a single tier, including the noise-floor tiers. An ongoing signal is re-detected daily under the same fingerprint; a multi-day date range returns only the latest detection per signal identity, so you never see day-by-day duplicates of the same issue.

Date range

anchor_from and anchor_to filter on detected_for_date, the day the nightly detection ran for, and both ends are inclusive: anchor_from=2026-09-27&anchor_to=2026-10-04 covers 8 days. They do not filter on the days the metric moved. To match the app's 7-day view, use anchor_from = today minus 6 days and anchor_to = today.

Charting a signal

Each signal's query is the request the app sends to draw its chart. POST it unchanged to queryDataV2 (/v2/query/{brand_id}) to get the same smoothed series; drop its transform for raw daily values. The chart always covers the 60 days before detected_for_date through detected_for_date, whatever anchor_from/anchor_to you listed with. Competitor signals carry the competitor's name in subject_name, and their query is already scoped to that competitor. query is null when no chart query was stored for the signal.

Tracking one issue over time

A signal's fingerprint is its durable identity: it survives nightly re-detections and direction flips of the same underlying issue. The brand's and competitors' signals on one slice share it, so also match subject_kind, competitor_id, alert_type and scope_qualifier. To follow an issue after remediation, filter by fingerprint with a wide anchor_from — a later detection in the opposite direction on the same fingerprint is the recovery (or regression) of the original movement. Combine with direction to fetch each side separately.

Sorting

sort=score_desc (default) orders by engine priority, delta_desc by largest absolute change, detected_desc by newest detection date.

get/{brand_id}/signals

Request

  • Base URL
    https://api.scrunchai.com/v1
  • Auth
    HTTP bearer

Path parameters

brand_idinteger required

Query parameters

scope'account' | 'account_platform' | 'topic' | 'topic_platform' nullable

Slice granularity the signal was detected on: account (whole brand), account_platform (brand on one AI platform), topic, or topic_platform.

platformstring nullable

AI platform the signal was detected on (e.g. OpenAI). Multi-platform signals carry the (multi) sentinel; the response slice.platforms lists the real platforms.

metricstring nullable

Metric the signal fired on. Known values: presence_rate, position_top_rate, cited_domain_rate (new metrics may be added).

alert_type'level_change' | 'trend' | 'level' nullable

Detection kind: level_change (step shift) or trend (sustained drift).

direction'up' | 'down' | 'none' nullable

Direction of the movement: up, down, or none.

tier'high' | 'confident' | 'worth_a_look' | 'provisional' | 'low_confidence' | 'underpowered' | 'untested' nullable

Confidence tier. When omitted, only the default user-facing tiers are returned (high, confident, worth_a_look, provisional); pass an explicit tier to see a single tier, including the noise-floor tiers (low_confidence, underpowered, untested).

subject_kind'brand' | 'competitor' nullable

Whose movement the signal describes: your brand or a competitor.

anchor_fromstring date nullable

Earliest detected_for_date to include (inclusive, YYYY-MM-DD).

anchor_tostring date nullable

Latest detected_for_date to include (inclusive, YYYY-MM-DD).

fingerprintstring nullable

Only signals with this stable identity (fingerprint). A fingerprint survives nightly re-detections and direction flips of the same underlying issue, so filtering on one — with a wide anchor_from — tracks how that issue evolved after remediation. Combine with direction to separate the original movement from its recovery.

mover_urlstring nullable

Case-insensitive substring matched against the URLs in the signal's url_movers evidence (per-URL citation movers, emitted for cited_domain_rate signals). Only signals with at least one matching mover URL are returned; signals without URL movers never match.

sort'score_desc' | 'delta_desc' | 'detected_desc'

Sort order: score_desc (engine priority, default), delta_desc (largest absolute change first), or detected_desc (newest first).

limitinteger

Maximum number of signals to return.

offsetinteger

Number of signals to skip (pagination).

Response

Successful Response

totalinteger required
offsetinteger
limitinteger nullable

Changes

    • info

      added the optional property // to the response with the status

    • info

      added the optional property // to the response with the status

    • info

      added the optional property // to the response with the status

    • info

      added the required property // to the response with the status