Content Analytics
Not-aired story reason breakdown
Powers 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.
GET
Not-aired story reason breakdown
Authorizations
Enter your JWT token in the format: Bearer
Query Parameters
Period string. Accepted formats:
2026-05— calendar monthQ2-2026— quarter (Q1–Q4)YTD-2026— year to date
Broadcast platform. One of television (default) or radio.
Available options:
radio, television Previous
Content output KPIsPowers the KPI card row on the **Content analytics** screen.
Counts stories at key production milestones for the period:
| Field | Definition |
|---|---|
| `stories_pitched` | All stories created in the period |
| `stories_approved` | Pitched stories not in draft or rejected status |
| `stories_covered` | Stories with ≥1 `StoryAsset` uploaded |
| `stories_scripted` | Stories with ≥1 `StoryScript` submitted |
| `stories_aired_tv` | Stories aired on a Television bulletin (`airing_status = aired`) |
| `stories_aired_radio` | Stories aired on a Radio bulletin (`airing_status = aired`) |
| `stories_not_aired` | Stories scheduled but not aired |
| `stories_published_digital` | Stories linked to a WordPress post published in the period |
| `legal_holds` | Stories created in the period currently in a legal-hold status |
| `approved_pct` | `stories_approved` as % of `stories_pitched` |
| `covered_pct` | `stories_covered` as % of `stories_pitched` |
| `scripted_pct` | `stories_scripted` as % of `stories_pitched` |
| `aired_tv_pct` | `stories_aired_tv` as % of `stories_pitched` |
Next
Not-aired story reason breakdown
