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

# Get the channel performance report

> Returns the cross-channel totals, the per-channel comparison and, for each channel, its KPIs and top three campaigns by click rate. Every configured channel is reported, including those never sent on, which come back with zeroed KPIs; a channel whose `sent` is zero has nothing measured rather than a measured zero. `totals` is the same aggregation left unscoped, since rates are ratios and do not add. Requires the `analytics:read` scope.



## OpenAPI

````yaml /api-reference/openapi.json get /api/v1/user/reports/channel-performance
openapi: 3.0.0
info:
  title: Brudcast API
  version: 1.0.0
servers:
  - url: https://core-service.prod.brudcast.com
    description: Production
security: []
tags:
  - name: Analytics
    x-displayName: Analytics
  - name: Campaigns
    x-displayName: Campaigns
  - name: Contacts
    x-displayName: Contacts
  - name: Mailboxes
    x-displayName: Mailboxes
  - name: Messages
    x-displayName: Messages
  - name: Sender Identities
    x-displayName: Sender Identities
  - name: Sending Domains
    x-displayName: Sending Domains
  - name: Templates
    x-displayName: Templates
  - name: Webhooks
    x-displayName: Webhooks
paths:
  /api/v1/user/reports/channel-performance:
    get:
      tags:
        - Analytics
      summary: Get the channel performance report
      description: >-
        Returns the cross-channel totals, the per-channel comparison and, for
        each channel, its KPIs and top three campaigns by click rate. Every
        configured channel is reported, including those never sent on, which
        come back with zeroed KPIs; a channel whose `sent` is zero has nothing
        measured rather than a measured zero. `totals` is the same aggregation
        left unscoped, since rates are ratios and do not add. Requires the
        `analytics:read` scope.
      parameters:
        - in: header
          name: X-Organization-Id
          required: false
          description: >-
            Required when authenticating with an access token. Optional with an
            API key, whose own organization binding is authoritative; a value
            contradicting it is refused with 403.
          schema:
            type: string
            format: uuid
        - in: query
          name: from
          required: false
          schema:
            type: string
        - in: query
          name: to
          required: false
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReportChannelPerformanceResponse'
        '401':
          description: The credential is missing, malformed, revoked or expired
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            The key lacks the scope the endpoint requires, or the organization
            does not match the credential
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: The payload or query string failed validation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
        '429':
          description: >-
            Rate limit exceeded; retry after the number of seconds in
            `retryAfter`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
      security:
        - apiKey: []
        - apiKeyBearer: []
components:
  schemas:
    ReportChannelPerformanceResponse:
      type: object
      properties:
        success:
          type: boolean
          example: true
        message:
          type: string
        data:
          $ref: '#/components/schemas/ReportChannelPerformance'
      required:
        - success
        - message
        - data
    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        message:
          type: string
          example: Resource not found
        code:
          type: string
          enum:
            - E_VALIDATION_ERROR
            - E_UNAUTHORIZED_ACCESS
            - E_UNAUTHORIZED
            - E_FORBIDDEN
            - E_INSUFFICIENT_SCOPE
            - E_ROW_NOT_FOUND
            - E_TOO_MANY_REQUESTS
            - E_BUSINESS_RULE_VIOLATION
            - E_CAMPAIGN_NOT_SENDABLE
            - INSUFFICIENT_CREDITS
            - SUBSCRIPTION_REQUIRED
          example: E_ROW_NOT_FOUND
      required:
        - success
        - message
        - code
    ValidationErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        message:
          type: string
          example: The payload is invalid
        code:
          type: string
          enum:
            - E_VALIDATION_ERROR
            - E_UNAUTHORIZED_ACCESS
            - E_UNAUTHORIZED
            - E_FORBIDDEN
            - E_INSUFFICIENT_SCOPE
            - E_ROW_NOT_FOUND
            - E_TOO_MANY_REQUESTS
            - E_BUSINESS_RULE_VIOLATION
            - E_CAMPAIGN_NOT_SENDABLE
            - INSUFFICIENT_CREDITS
            - SUBSCRIPTION_REQUIRED
          example: E_VALIDATION_ERROR
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ValidationErrorItem'
      required:
        - success
        - message
        - code
        - errors
    RateLimitErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        message:
          type: string
          example: Too many requests
        code:
          type: string
          enum:
            - E_VALIDATION_ERROR
            - E_UNAUTHORIZED_ACCESS
            - E_UNAUTHORIZED
            - E_FORBIDDEN
            - E_INSUFFICIENT_SCOPE
            - E_ROW_NOT_FOUND
            - E_TOO_MANY_REQUESTS
            - E_BUSINESS_RULE_VIOLATION
            - E_CAMPAIGN_NOT_SENDABLE
            - INSUFFICIENT_CREDITS
            - SUBSCRIPTION_REQUIRED
          example: E_TOO_MANY_REQUESTS
        retryAfter:
          type: number
          example: 60
      required:
        - success
        - message
        - code
        - retryAfter
    ReportChannelPerformance:
      type: object
      properties:
        totals:
          $ref: '#/components/schemas/ReportKpis'
          description: The same aggregation left unscoped by channel
        comparison:
          type: array
          items:
            $ref: '#/components/schemas/ReportChannelComparisonRow'
        channels:
          type: array
          items:
            $ref: '#/components/schemas/ReportChannelDetail'
          description: >-
            Every configured channel, including those never sent on, which
            report zeroed KPIs
      required:
        - totals
        - comparison
        - channels
    ValidationErrorItem:
      type: object
      properties:
        field:
          type: string
          example: emailAddress
        rule:
          type: string
          example: email
        message:
          type: string
          example: The emailAddress field must be a valid email address
      required:
        - field
        - rule
        - message
    ReportKpis:
      type: object
      properties:
        totalSent:
          type: number
        totalDelivered:
          type: number
        totalOpened:
          type: number
        totalClicked:
          type: number
        totalBounced:
          type: number
        totalUnconfirmed:
          type: number
          description: >-
            Messages sent whose outcome is not yet known, that is still in
            flight
        totalUnsubscribed:
          type: number
        avgDeliveryRate:
          type: number
          example: 98.1
        avgOpenRate:
          type: number
          example: 41.3
          description: >-
            Opens over deliveries across every channel. Only email emits an open
            event, so this is deflated whenever another channel sent; read the
            email-scoped block instead.
        avgClickRate:
          type: number
          example: 8.7
        avgBounceRate:
          type: number
          example: 0.4
        trends:
          $ref: '#/components/schemas/ReportVolumeTrends'
      required:
        - totalSent
        - totalDelivered
        - totalOpened
        - totalClicked
        - totalBounced
        - totalUnconfirmed
        - totalUnsubscribed
        - avgDeliveryRate
        - avgOpenRate
        - avgClickRate
        - avgBounceRate
        - trends
    ReportChannelComparisonRow:
      type: object
      properties:
        channel:
          type: string
          enum:
            - email
            - sms
            - whatsapp
            - push
        sent:
          type: number
        delivered:
          type: number
        opened:
          type: number
        clicked:
          type: number
        bounced:
          type: number
        unconfirmed:
          type: number
        deliveryRate:
          type: number
        openRate:
          type: number
          description: Meaningless outside email, which emits the only open event
        clickRate:
          type: number
        bounceRate:
          type: number
      required:
        - channel
        - sent
        - delivered
        - opened
        - clicked
        - bounced
        - unconfirmed
        - deliveryRate
        - openRate
        - clickRate
        - bounceRate
    ReportChannelDetail:
      type: object
      properties:
        channel:
          type: string
          enum:
            - email
            - sms
            - whatsapp
            - push
        kpis:
          $ref: '#/components/schemas/ReportKpis'
        topCampaigns:
          type: array
          items:
            $ref: '#/components/schemas/ReportChannelTopCampaign'
          description: At most three campaigns, ranked by unique click rate
      required:
        - channel
        - kpis
        - topCampaigns
    ReportVolumeTrends:
      type: object
      properties:
        sent:
          $ref: '#/components/schemas/ReportTrend'
        delivered:
          $ref: '#/components/schemas/ReportTrend'
        opened:
          $ref: '#/components/schemas/ReportTrend'
        clicked:
          $ref: '#/components/schemas/ReportTrend'
      required:
        - sent
        - delivered
        - opened
        - clicked
    ReportChannelTopCampaign:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        sent:
          type: number
        delivered:
          type: number
        openRate:
          type: number
        clickRate:
          type: number
      required:
        - id
        - name
        - sent
        - delivered
        - openRate
        - clickRate
    ReportTrend:
      type: object
      properties:
        direction:
          type: string
          enum:
            - up
            - down
            - flat
            - new
          description: How the figure moved against the preceding period of equal length
        value:
          type: number
          example: 12.5
          description: Magnitude of the change, as a percentage
      required:
        - direction
        - value
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        An organization API key, prefixed `bk_live_`. Takes precedence over
        `Authorization` when both are sent. The key is bound to one
        organization, and the scopes it was issued with are enforced per
        endpoint.
    apiKeyBearer:
      type: http
      scheme: bearer
      bearerFormat: bk_live_...
      description: >-
        The same organization API key sent as `Authorization: Bearer
        bk_live_...`. Accepted only when the value begins with `bk_` and no
        `X-API-Key` header is present.

````