---
title: "Get Marketing Feedback Risk Groups"
method: GET
path: "/internal/reliability/marketing/feedback/risks/groups"
tags: ["internal"]
---

# Get Marketing Feedback Risk Groups

`GET /internal/reliability/marketing/feedback/risks/groups`

## Request

- Base URL: `https://api.kobaltlabs.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.kobaltlabs.com/internal/reliability/marketing/feedback/risks/groups`
- Auth: none declared

Synchronous SQL group-by counts over the full filtered feedback week.

Same week / company / team / toggle filters as
``GET .../feedback/risks``. Aggregation is inline (no Hatchet / LLM) so the
UI can show ranked category counts on click. ``source_family`` is a cheap
CASE over ``source_clause`` (Marketing standards vs Regulatory).
``disclosure`` recovers the standards filename from a structured or legacy
``source_clause`` prefix.

## Query parameters

- `week_start` string, date, required: ISO week start (Monday) to drill into
- `dimension` 'source_clause' | 'short_text' | 'ignore_comment' | 'source_family' | 'disclosure': Group-by dimensions for the marketing feedback week drill-down. ``source_family`` is a coarse rollup derived from ``source_clause`` text (Marketing standards vs Regulatory) — not a stored column. ``disclosure`` recovers a Chime DL_ID (``Disclosure CG 23`` → ``cg23``) or the standards filename from a structured / legacy ``source_clause``.
- `company_id` string, uuid, nullable
- `team_id` string, uuid, nullable
- `flagged` boolean: Only risks a reviewer flagged
- `outdated` boolean: Only risks superseded by a re-run
- `reviewer_added` boolean: Only reviewer-added risks
- `dismissed` boolean: Only risks a reviewer dismissed
- `over_flagged` boolean: Only dismissals the reviewer marked as an over-flag / false positive (reason incorrect / out_of_scope / already_met)
- `reason` 'valid_ok' | 'already_met' | 'incorrect' | 'out_of_scope' | 'pre_approved' | 'other': Why a reviewer dismissed a marketing risk (status=dismissed).
- `ignored` boolean: Only risks with an ignore comment
- `actioned` boolean: Only risks dispositioned (status set or outdated)
- `not_actioned` boolean: Only risks never dispositioned (no status, not outdated)
- `source_clause` string[], nullable: Narrow before aggregating (same semantics as the list endpoint; repeat param to OR)
- `short_text` string[], nullable
- `ignore_comment` string[], nullable
- `source_family` string[], nullable
- `disclosure` string[], nullable

## Response `200`

Successful Response

- FeedbackRiskGroupsResponse: Server-side group counts over the full filtered feedback week (not just the paginated list page). `dimension` is the grouping key; `groups` are ranked by count descending. Empty / null values are bucketed under the literal key ``(none)``. For ``dimension=disclosure``, multi-id attributions are expanded so each DL id gets a count (group ``total`` may exceed distinct risk rows).
  - `week_start` string, date, required
  - `dimension` string, required
  - `total` integer, required
  - `groups` FeedbackGroupCount[], required
    - `key` string, required
    - `count` integer, required

## Other responses

- `422`: Validation Error

---

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