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

# Content output KPIs

> Powers 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` |



## OpenAPI

````yaml /openapi/content.yaml get /api/v1/analytics/content/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/content/summary:
    get:
      tags:
        - Content Analytics
      summary: Content output KPIs
      description: >-
        Powers 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` |
      operationId: analytics_content_summary_retrieve
      parameters:
        - in: query
          name: period
          schema:
            type: string
          description: |-
            Period string. Accepted formats:
            - `2026-05` — calendar month
            - `Q2-2026` — quarter (Q1–Q4)
            - `YTD-2026` — year to date
          required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContentSummary'
              examples:
                May2026:
                  value:
                    stories_pitched: 412
                    stories_approved: 346
                    stories_covered: 324
                    stories_scripted: 312
                    stories_aired_tv: 256
                    stories_aired_radio: 19
                    stories_not_aired: 56
                    stories_published_digital: 38
                    legal_holds: 4
                    approved_pct: '84.0'
                    covered_pct: '78.6'
                    scripted_pct: '75.7'
                    aired_tv_pct: '62.1'
                  summary: May 2026
          description: ''
      security:
        - bearerAuth: []
components:
  schemas:
    ContentSummary:
      type: object
      properties:
        stories_pitched:
          type: integer
        stories_approved:
          type: integer
        stories_covered:
          type: integer
        stories_scripted:
          type: integer
        stories_aired_tv:
          type: integer
        stories_aired_radio:
          type: integer
        stories_not_aired:
          type: integer
        stories_published_digital:
          type: integer
        legal_holds:
          type: integer
        approved_pct:
          type: string
          format: decimal
          pattern: ^-?\d{0,4}(?:\.\d{0,1})?$
        covered_pct:
          type: string
          format: decimal
          pattern: ^-?\d{0,4}(?:\.\d{0,1})?$
        scripted_pct:
          type: string
          format: decimal
          pattern: ^-?\d{0,4}(?:\.\d{0,1})?$
        aired_tv_pct:
          type: string
          format: decimal
          pattern: ^-?\d{0,4}(?:\.\d{0,1})?$
      required:
        - aired_tv_pct
        - approved_pct
        - covered_pct
        - legal_holds
        - scripted_pct
        - stories_aired_radio
        - stories_aired_tv
        - stories_approved
        - stories_covered
        - stories_not_aired
        - stories_pitched
        - stories_published_digital
        - stories_scripted
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: 'Enter your JWT token in the format: Bearer <token>'

````