Bulletin Analytics
Today's bulletin KPI summary
Powers the KPI card row on the Bulletins screen.
Returns a single object with aggregate counts across all bulletins for the requested date:
| Field | Definition |
|---|---|
tv_bulletins | Total TV bulletins scheduled on the date |
radio_bulletins | Total Radio bulletins scheduled on the date |
reports_pending | Bulletins with report_status = awaiting_review |
tv_avg_air_rate | Aired ÷ (aired + not_aired) across all TV slots |
radio_avg_air_rate | Same for Radio |
legal_holds_today | Distinct stories held for legal reasons across all bulletins |
GET
Today's bulletin KPI summary
Authorizations
Enter your JWT token in the format: Bearer
Query Parameters
Calendar date in YYYY-MM-DD format.
Response
200 - application/json
Previous
Not-aired story reason breakdownPowers the **Not-aired reasons** doughnut on the **Content analytics** screen.
Groups `BulletinStory` records where `airing_status = not_aired` by the `not_aired_reason` field added in migration `0041`. Reasons:
| Value | Label |
|---|---|
| `time_constraints` | Time Constraints |
| `legal_hold` | Legal Hold |
| `breaking_news` | Breaking News Displaced |
| `editor_decision` | Editor Decision |
| `technical` | Technical Issue |
| `other` | Other |
| `unknown` | `not_aired_reason` was NULL (pre-migration data) |
`share_pct` sums to 100 across the returned rows.
Next
Today's bulletin KPI summary
