Finds queries or pages losing traffic between a baseline (earlier) period and a recent period, bucketed by severity of click loss (severe > 50%, moderate 20-50%, mild < 20%). Only keys with a meaningful baseline (clicks > 0 and impressions >= minImpressions) are considered. startDate/endDate is the RECENT period; comparisonStartDate/comparisonEndDate is the BASELINE period. For a full period-by-period matrix (clicks/impressions/position per month or week, like the app's Query Decay / Content Decay pages) use get_decay_overview instead. Returns at most limit rows (default 100, max 1000), worst decliners first. The baseline is scanned for its top scanLimit keys by clicks (warehouse: max(limit*10, 1000), capped at 50000; live API: 25000 rows per period). On the warehouse every scanned key's recent figure is exact. On the live API the recent period is its own top 25000, so a key missing from a full recent read is not known to be at zero: its recent clicks are at most the smallest count that read kept. When that ceiling is still below the key's baseline, the row is reported with recentIsUpperBound: true: recentClicks is the ceiling, the real loss is AT LEAST |clickChangePct|, severity is a floor, and its recent impressions and position are unknown (0). When the ceiling shows no loss, the key is left out and counted in unresolvedKeys. When the baseline window has a different length than the recent one, the comparison is per day: baseline clicks are scaled to the recent window's length (windowNormalization says so, and each row adds baselineClicksScaled; baselineClicks stays the raw total). positionDelta is 0 for a key with no recent row. truncated: true means a read hit its cap, so counts are measured within the scan, not across the whole property. Served from the GSC Wizard ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).