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

# Poll WABA Account Analytics

> Poll a previously requested WABA account analytics job by its handle.



## OpenAPI

````yaml get /waba/accounts/{account_id}/analytics/{handle_id}
openapi: 3.0.3
info:
  title: Timelines Public API
  description: >
    # Timelines Public API


    _Some API calls may utilize message sending quota or be subject to message
    sending rate limits as described below._


    ### Credit Utilization 
      - Sending a message via API consumes 1 credit from message sending quota.
      - Sending a message with non-empty text and attachment consumes 2 credits from message sending quota.
      - If a message cannot be sent (invalid or not connected to WhatsApp number, WhatsApp server error), message sending quota will be restored (usually within a couple of hours).
    ### Message sending rate
      - Messages will be sent with random delay of about 2 seconds between each two messages (to avoid WhatsApp spam detection mechanisms). Contact support@timelines.ai if you want to modify delay for your workspace (available on Business plan only).
      - If you exceed message sending frequency, messages be queued and sent out with delay. Each queued message will consume a message sending credit, so the number of queued messages cannot exceed the available quota.
      
    ### Authorization:
      - Copy API token from [Public API page](https://app.timelines.ai/integrations/api/) in your TimelinesAI account.
      - Put the token in *Authorization* header of request as follows:
      ```
      Authorization: Bearer 4d2d0239-e28c-4f4a-8a4d-3a3ca40056b8
      ```
            
    ### Message formatting:
      - use "\n" for line breaks

    ### Input strings:
      - String fields must not contain the NUL character (U+0000).
  version: 1.3.0
servers:
  - url: https://app.timelines.ai/integrations/api
    description: Public API root URL
security:
  - bearerAuth: []
paths:
  /waba/accounts/{account_id}/analytics/{handle_id}:
    get:
      summary: Poll a WABA account analytics request
      description: >
        Polls the state of an analytics request previously created via `POST
        /waba/accounts/{account_id}/analytics`. The handle is scoped to the
        workspace; `account_id` is accepted for URL symmetry but is not used to
        further scope the lookup.
      parameters:
        - $ref: '#/components/parameters/waba_account_id'
        - $ref: '#/components/parameters/waba_analytics_handle_id'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WabaAnalyticsResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/AccessDenied'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    waba_account_id:
      description: >-
        an internal id of the WABA account (the only value used to address this
        account)
      in: path
      name: account_id
      schema:
        type: integer
      required: true
      example: 4021
    waba_analytics_handle_id:
      description: >-
        opaque handle returned by POST /waba/accounts/{account_id}/analytics,
        used to poll for the result
      in: path
      name: handle_id
      schema:
        type: string
      required: true
      example: 3fa07e9dcae4471cbfd0d0e28f6c5a1a
  schemas:
    WabaAnalyticsResponse:
      type: object
      required:
        - status
        - data
      properties:
        status:
          type: string
          example: ok
          enum:
            - ok
            - error
        data:
          $ref: '#/components/schemas/WabaAnalyticsStatus'
    WabaAnalyticsStatus:
      type: object
      required:
        - handle
        - state
      properties:
        handle:
          type: string
          example: 3fa07e9dcae4471cbfd0d0e28f6c5a1a
          description: >-
            Opaque handle identifying this analytics request; use it to poll for
            the result.
        state:
          type: string
          enum:
            - pending
            - ready
            - error
        result:
          type: object
          description: >
            Present when `state` is `ready`. Carries two Meta edges: `analytics`
            (messaging volume, with `sent`/`delivered` per day) and
            `pricing_analytics` (message volume, with the requested breakdown
            keys per day). Cost and conversation analytics are not included.
        error:
          type: object
          description: Present when `state` is `error`.
          properties:
            code:
              type: integer
            message:
              type: string
    ErrorResponse:
      required:
        - message
        - status
      type: object
      properties:
        message:
          type: string
        status:
          type: string
          example: error
          enum:
            - ok
            - error
        error_code:
          type: string
          description: >-
            Stable, machine-readable error code. Use this for branching in
            client integrations.
          example: validation_error
          enum:
            - missing_credentials
            - invalid_token
            - member_not_found
            - permission_denied
            - insufficient_scope
            - plan_feature_unavailable
            - quota_exceeded
            - rate_limit_exceeded
            - validation_error
            - not_found
            - account_inactive
            - template_not_approved
            - template_wrong_waba
            - template_variables_mismatch
            - service_window_closed
            - not_supported
            - internal_error
        errors:
          type: array
          description: >-
            Per-field validation diagnostics for request-schema (body/params)
            validation failures. Present only when the request failed schema
            validation; absent on business-rule `validation_error` rejections
            (which carry `message` and `error_code` only) and on
            auth/authorization/quota errors.
          items:
            $ref: '#/components/schemas/ValidationError'
    ValidationError:
      type: object
      required:
        - fields
        - msg
      properties:
        fields:
          type: array
          items:
            type: string
          description: >-
            Path of the offending field, as a list of keys/indexes from the
            request root.
          example:
            - url
        msg:
          type: string
          description: Validator message for that field.
          example: must be a valid http(s) URL
  responses:
    BadRequestError:
      description: Invalid parameters
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    UnauthorizedError:
      description: Access token is missing or invalid
    AccessDenied:
      description: Access denied
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    NotFound:
      description: Specified entities not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````