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

# Estimate campaign cost

> Credits a draft campaign's dispatch will take from the wallet for the given audience, and whether the
wallet covers them. Each recipient costs the conversation of the template's category, as the provider
bills it; the per-message transport fee is a separate charge and is not included. Scheduling runs the same check and is refused with
`CampaignInsufficientCreditsError` (402) when the balance falls short.



## OpenAPI

````yaml /api/services-api.yaml post /v1/tenants/{tenantID}/campaigns/{campaignID}/cost
openapi: 3.0.3
info:
  description: >-
    Talqui is an omnichannel customer service platform that unifies
    conversations from WhatsApp, Instagram, Telegram, and many other channels
    into a single attendant panel, alongside a broader ecosystem of plugins and
    integrations. This API gives developers programmatic access to Talqui's
    services layer, exposing the operations needed to read and manage tenants,
    conversations, plugins, and related resources that power that platform.


    Authentication is available on behalf of an Operator (the default for this
    API), a Plugin Connection, or a Plugin — see the [Talqui authentication
    guide](https://docs.talqui.chat/guides/introduction/authentication/) for how
    each token is obtained and when to use it.


    Need help or have questions not covered here? Reach out to
    support@talqui.com.
  license:
    name: ISC
    url: https://opensource.org/license/isc-license-txt
  title: Talqui - Services API
  version: 0.111.0
servers:
  - description: Production
    url: https://services-api.talqui.chat
security: []
tags:
  - name: Tenants
  - name: Settings
  - name: Analytics/Reports
  - name: Analytics
  - name: Campaigns
  - name: Campaigns/Models
  - name: Contacts
  - name: Contacts/Imports
  - name: Handoff links
  - name: Inboxes
  - name: Messages
  - name: Notifications
  - name: Sessions
  - name: Operators/Shortcuts
  - name: Operators
  - name: Plugins
  - name: Milestones
  - name: Invites
paths:
  /v1/tenants/{tenantID}/campaigns/{campaignID}/cost:
    post:
      tags:
        - Campaigns
      summary: Estimate campaign cost
      description: >-
        Credits a draft campaign's dispatch will take from the wallet for the
        given audience, and whether the

        wallet covers them. Each recipient costs the conversation of the
        template's category, as the provider

        bills it; the per-message transport fee is a separate charge and is not
        included. Scheduling runs the same check and is refused with

        `CampaignInsufficientCreditsError` (402) when the balance falls short.
      operationId: EstimateCampaignCostController
      parameters:
        - in: path
          name: tenantID
          required: true
          schema:
            type: string
        - in: path
          name: campaignID
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              properties:
                excludedContactIDs:
                  description: Contacts removed from the audience.
                  items:
                    type: string
                  type: array
                filters:
                  default: []
                  description: >-
                    Segment rules of the audience — same wire format as
                    /schedule.
                  items:
                    properties:
                      criterion:
                        description: >-
                          The field/criterion name — see the engine for the
                          recognized set.
                        type: string
                      id:
                        description: >-
                          Client-generated identifier for this rule; echoed
                          back, never used for logic.
                        type: string
                      operator:
                        description: One of the CONTACT_SEGMENT_CONDITIONALS values.
                        enum:
                          - eq
                          - ne
                          - ex
                          - nex
                          - ha
                          - nh
                          - gt
                          - lt
                          - gte
                          - lte
                          - sw
                          - nsw
                          - ew
                        type: string
                      query:
                        default: []
                        description: >-
                          Operand values for this rule — usually a
                          single-element array.
                        items: {}
                        type: array
                      schema:
                        description: >-
                          Whether this criterion is native to Contact
                          ("contact") or requires a join ("interaction").
                        enum:
                          - contact
                          - interaction
                        type: string
                    required:
                      - id
                      - schema
                      - criterion
                      - operator
                    type: object
                  type: array
                importedContactIDs:
                  description: Contacts resolved from a CSV import.
                  items:
                    type: string
                  type: array
                manualContactIDs:
                  description: Contacts picked manually.
                  items:
                    type: string
                  type: array
              type: object
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                additionalProperties: false
                properties:
                  campaignCost:
                    additionalProperties: false
                    description: >-
                      The estimate, or null when the channel bills no
                      conversation per template or the tenant has no
                      subscription.
                    nullable: true
                    properties:
                      campaignCostAffordable:
                        description: >-
                          Whether the balance covers the cost. Scheduling is
                          refused when false.
                        type: boolean
                      campaignCostCategory:
                        description: >-
                          Template category billed: marketing, utility or
                          authentication.
                        type: string
                      campaignCostCredits:
                        description: >-
                          Credits the dispatch takes: the conversation of each
                          recipient. The per-message transport fee is charged
                          separately.
                        type: number
                      campaignCostRecipients:
                        description: >-
                          Recipients counted for the estimate (an upper bound
                          when the sources overlap).
                        type: number
                      campaignCostSessionMetric:
                        description: >-
                          Billable metric charged per recipient for the
                          conversation.
                        type: string
                      walletBalance:
                        description: >-
                          Wallet balance with pending events applied; null when
                          there is no wallet.
                        nullable: true
                        type: number
                    required:
                      - campaignCostRecipients
                      - campaignCostCategory
                      - campaignCostSessionMetric
                      - campaignCostCredits
                      - walletBalance
                      - campaignCostAffordable
                    type: object
                required:
                  - campaignCost
                type: object
          description: Response for status 200.
        '400':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      oneOf:
                        - $ref: '#/components/schemas/MissingTenantIDError'
                        - $ref: '#/components/schemas/MissingCampaignIDError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            MissingTenantIDError (error_code 1001): tenantID absent from the
            URL. | MissingCampaignIDError (error_code 1741): campaignID absent
            from the URL.
        '401':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      $ref: '#/components/schemas/UnauthorizedError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: 'UnauthorizedError (error_code 1003): missing/invalid operator token.'
        '404':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      oneOf:
                        - $ref: '#/components/schemas/CampaignNotFoundError'
                        - $ref: '#/components/schemas/CampaignModelNotFoundError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            CampaignNotFoundError (error_code 1740): no campaign matches for
            this tenant. | CampaignModelNotFoundError (error_code 1058): the
            campaign's template no longer exists.
        '500':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      $ref: '#/components/schemas/UnknownError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            UnknownError (error_code 5999): Unexpected internal error not
            otherwise documented for this endpoint.
        '502':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      $ref: '#/components/schemas/BadGatewayError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: 'BadGatewayError (error_code 5002): the wallet could not be read.'
      security:
        - operatorAuth: []
components:
  schemas:
    MissingTenantIDError:
      additionalProperties: false
      properties:
        error:
          enum:
            - MissingTenantIDError
          type: string
        error_code:
          enum:
            - 1001
          type: number
        message:
          example: tenantID is required.
          type: string
        statusCode:
          enum:
            - 400
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    MissingCampaignIDError:
      additionalProperties: false
      properties:
        error:
          enum:
            - MissingCampaignIDError
          type: string
        error_code:
          enum:
            - 1741
          type: number
        message:
          example: campaignID is required.
          type: string
        statusCode:
          enum:
            - 400
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    UnauthorizedError:
      additionalProperties: false
      properties:
        error:
          enum:
            - UnauthorizedError
          type: string
        error_code:
          enum:
            - 1003
          type: number
        message:
          example: You are not authorized to perform this request.
          type: string
        statusCode:
          enum:
            - 401
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    CampaignNotFoundError:
      additionalProperties: false
      properties:
        error:
          enum:
            - CampaignNotFoundError
          type: string
        error_code:
          enum:
            - 1740
          type: number
        message:
          example: Campaign not found.
          type: string
        statusCode:
          enum:
            - 404
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    CampaignModelNotFoundError:
      additionalProperties: false
      properties:
        error:
          enum:
            - CampaignModelNotFoundError
          type: string
        error_code:
          enum:
            - 1058
          type: number
        message:
          example: Campaign model not found.
          type: string
        statusCode:
          enum:
            - 404
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    UnknownError:
      additionalProperties: false
      properties:
        error:
          enum:
            - UnknownError
          type: string
        error_code:
          enum:
            - 5999
          type: number
        message:
          example: For some unknown reason your request has not succeeded.
          type: string
        statusCode:
          enum:
            - 500
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    BadGatewayError:
      additionalProperties: false
      properties:
        error:
          enum:
            - BadGatewayError
          type: string
        error_code:
          enum:
            - 5002
          type: number
        message:
          example: External service returned an invalid response.
          type: string
        statusCode:
          enum:
            - 502
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
  securitySchemes:
    operatorAuth:
      bearerFormat: JWT
      description: >-
        Behalf of an Operator (default). A JWT issued by Talqui Core when an
        operator signs in, scoped to every tenant that operator belongs to. Send
        as `Authorization: Bearer <jwt-token>`.
      scheme: bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.