Overview
The Signals API exposes Scrunch’s nightly detection sweep as a queryable feed. Each signal is a statistically-tested movement — a level change or trend — in one of your brand’s AI visibility metrics on a specific slice of your data (a platform, topic, or the account as a whole). Use it to feed alerts into your own tools, drive weekly briefs, or automate follow-up on the same “what changed” events surfaced in the Scrunch dashboard.What the Signals API includes
- Detected level changes and trends on core metrics (
presence_rate,position_top_rate,cited_domain_rate) - A confidence tier for each signal (
high,confident,worth_a_look,provisional), with noise-floor tiers available on request - Human-readable narrative: what happened, why it matters, and what to do
- A stable fingerprint for each underlying issue — the same signal keeps its fingerprint across nightly re-detections, so reactions and downstream state survive
- Reactions (
useful,not_useful,dismissed,actioned) with optional free-text reasons, listable brand-wide for team-level reporting - Anchor dates (distinct detection days) for building date pickers and polling loops
When to use the Signals API
Use the Signals API when you need to:- Post “what changed this week” summaries to Slack, email, or a stakeholder digest
- Route detected drops on a specific platform, topic, or metric into an incident tracker
- Export the team’s reactions on signals for reporting or feedback loops
- Build a custom alerting dashboard that mirrors the Scrunch Signals feed
Endpoints
All endpoints require a bearer token with the
query scope. Reaction writes additionally require a user token (JWT) — API keys have no user identity to attribute a reaction to and receive 403. See Authentication.
Filters
The list endpoint accepts:
The reactions list endpoint supports
fingerprint (all reactions on one signal identity) and reaction (all reactions of a given value).
Example: list recent high-confidence signals
Example: get one signal’s full narrative
getSignal returns 404 for IDs that exist but aren’t user-facing (non-fired detections or cluster-child rows) — the same population rule as the list endpoint.
Example: react to a signal
Reactions are keyed on the signal’s stablefingerprint, so a thumbs-up survives the nightly re-detection of the same underlying issue. This call requires a user token (JWT).
DELETE /v1/{brand_id}/signals/{signal_id}/reaction.
Example: list team reactions
The reactions list is brand-wide — it returns every user’s reactions, not just the caller’s — so an integration can export the team’s aggregate feedback.fingerprint to pull every reaction on one signal identity across re-detections.
Example: poll for new detection dates
URL movers on citation signals
Forcited_domain_rate signals, each response includes a url_movers array — the per-URL citation movers behind the movement. Each mover carries:
url_movers is empty for non-citation metrics and for signals detected before movers were recorded.
Filter signals by mover URL
Usemover_url to narrow the feed to signals whose citation movers touch a specific page or domain fragment. The match is a case-insensitive substring against each mover’s normalized_url.
mover_url, so combine it with metric=cited_domain_rate when you want a citation-focused feed. % and _ in the input are matched literally.
Signal identity and dedupe
Every signal carries afingerprint — a hash over its slice and metric — that stays stable across the nightly re-detection of the same underlying issue. Two implications:
- List responses dedupe to the latest detection. Over a multi-day
anchor_from/anchor_towindow you see one row per fingerprint, not one per day. - Reactions follow the fingerprint, not the row ID. A
usefulset today still applies to tomorrow’s re-detection of the same signal.
fingerprint (not the numeric id) if you need to correlate signals across runs in your own system.
Track one issue over time
Use thefingerprint filter with a wide anchor_from to follow a single issue through remediation. A later detection with the opposite direction on the same fingerprint is the recovery (or regression) of the original movement.
Fetch the original drop:
Best practices
- Poll
/signals/anchorsfirst to check whether a new detection day exists before pulling the full list. - Sort by
detected_descfor “what’s new” digests,score_descfor “what matters most”, anddelta_descwhen ranking by raw movement. - Store the
fingerprintalongside your internal record so reactions and follow-up state survive re-detections. - Use the reactions list to close the loop on “which alerts drove action” — filter by
reaction=actionedfor a running list of resolved signals. - For automated triage from an AI assistant, the same feed is available through the Scrunch MCP server via the
list_signalsandget_signaltools.