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

# Estimate campaign reach and cost

> Counts and prices an audience selection without saving anything, so the cost of a send is known while the campaign is still being composed. Returns the reachable recipients overall and per channel, plus the credits the selection would cost and whether the wallet balance covers them. This is a POST and so requires the `campaigns:write` scope even though it changes nothing.



## OpenAPI

````yaml /api-reference/openapi.json post /api/v1/user/campaigns/estimate-recipients
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/campaigns/estimate-recipients:
    post:
      tags:
        - Campaigns
      summary: Estimate campaign reach and cost
      description: >-
        Counts and prices an audience selection without saving anything, so the
        cost of a send is known while the campaign is still being composed.
        Returns the reachable recipients overall and per channel, plus the
        credits the selection would cost and whether the wallet balance covers
        them. This is a POST and so requires the `campaigns:write` scope even
        though it changes nothing.
      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
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                listIds:
                  type: array
                  items:
                    type: string
                segmentIds:
                  type: array
                  items:
                    type: string
                contactIds:
                  type: array
                  items:
                    type: string
                excludeListIds:
                  type: array
                  items:
                    type: string
                excludeSegmentIds:
                  type: array
                  items:
                    type: string
                excludeContactIds:
                  type: array
                  items:
                    type: string
                channels:
                  type: array
                  items:
                    enum:
                      - email
                      - sms
                      - whatsapp
                      - push
              additionalProperties: false
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampaignRecipientEstimateResponse'
        '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:
    CampaignRecipientEstimateResponse:
      type: object
      properties:
        success:
          type: boolean
          example: true
        message:
          type: string
        data:
          $ref: '#/components/schemas/CampaignRecipientEstimate'
      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
    CampaignRecipientEstimate:
      type: object
      properties:
        estimatedRecipients:
          type: number
          description: Reachable recipients across the requested channels, deduplicated
        total:
          type: number
          description: Repeats `estimatedRecipients`
        perChannel:
          type: object
          additionalProperties:
            type: integer
          description: Reachable recipients keyed by channel
        credits:
          $ref: '#/components/schemas/CampaignCreditEstimate'
      required:
        - estimatedRecipients
        - total
        - perChannel
        - credits
    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
    CampaignCreditEstimate:
      type: object
      properties:
        lines:
          type: array
          items:
            $ref: '#/components/schemas/CampaignCreditEstimateLine'
          description: >-
            One line per credit-billed channel; subscription-billed channels are
            omitted
        totalCredits:
          type: number
        balanceCredits:
          type: number
          description: The organization wallet's current credit balance
        sufficient:
          type: boolean
          description: Whether the balance covers the total
      required:
        - lines
        - totalCredits
        - balanceCredits
        - sufficient
    CampaignCreditEstimateLine:
      type: object
      properties:
        channel:
          type: string
          enum:
            - email
            - sms
            - whatsapp
            - push
        rateCredits:
          type: number
          description: Credits charged per recipient on this channel
        estimatedRecipients:
          type: number
        credits:
          type: number
          description: Rate multiplied by the reach for this channel
      required:
        - channel
        - rateCredits
        - estimatedRecipients
        - credits
  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.

````