> ## Documentation Index
> Fetch the complete documentation index at: https://docs.capedigital.co.ke/llms.txt
> Use this file to discover all available pages before exploring further.

# 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 |



## OpenAPI

````yaml /openapi/content.yaml get /api/v1/analytics/bulletins/today-summary
openapi: 3.0.3
info:
  title: Content Service API
  version: 1.0.0
  description: |2-

        **Content Service API** - Comprehensive content(story) and management system.
        
servers:
  - url: https://api.capedigital.co.ke/content
    description: Production
  - url: http://localhost:8000
    description: Local
security: []
paths:
  /api/v1/analytics/bulletins/today-summary:
    get:
      tags:
        - Bulletin Analytics
      summary: Today's bulletin KPI summary
      description: >-
        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 |
      operationId: analytics_bulletins_today_summary_retrieve
      parameters:
        - in: query
          name: date
          schema:
            type: string
          description: Calendar date in `YYYY-MM-DD` format.
          required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulletinTodaySummary'
              examples:
                25May2026:
                  value:
                    tv_bulletins: 6
                    radio_bulletins: 19
                    reports_pending: 2
                    tv_avg_air_rate: '67.0'
                    radio_avg_air_rate: '88.0'
                    legal_holds_today: 1
                  summary: 25 May 2026
          description: ''
      security:
        - bearerAuth: []
components:
  schemas:
    BulletinTodaySummary:
      type: object
      properties:
        tv_bulletins:
          type: integer
        radio_bulletins:
          type: integer
        reports_pending:
          type: integer
        tv_avg_air_rate:
          type: string
          format: decimal
          pattern: ^-?\d{0,4}(?:\.\d{0,1})?$
          nullable: true
        radio_avg_air_rate:
          type: string
          format: decimal
          pattern: ^-?\d{0,4}(?:\.\d{0,1})?$
          nullable: true
        legal_holds_today:
          type: integer
      required:
        - legal_holds_today
        - radio_avg_air_rate
        - radio_bulletins
        - reports_pending
        - tv_avg_air_rate
        - tv_bulletins
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: 'Enter your JWT token in the format: Bearer <token>'

````