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

# Get Billing Stats



## OpenAPI

````yaml api-reference/speakeasy/textql-api-with-code-samples.yaml POST /textql.rpc.public.observe.ObservabilityService/GetBillingStats
openapi: 3.1.0
info:
  title: TextQL API
  version: 1.0.0
  description: |
    TextQL public API. Generated from protobuf service definitions; internal
    endpoints are excluded via google.api.visibility / file_visibility.
servers:
  - url: https://app.textql.com
security:
  - apiKey: []
tags:
  - name: DashboardService
  - name: AppService
    description: |-
      AppService manages data apps: the generative app execution primitive.
       An app is agent-authored single-file HTML/JS/CSS executing in a CSP sandbox,
       fed a snapshot of its declared data sources. First-class resource, not a dashboard.
  - name: ConnectorService
  - name: PowerBIService
  - name: TableauService
  - name: DatasetService
  - name: OntologyManagementService
  - name: ChatService
  - name: AgentService
  - name: AuditLogService
  - name: MCPService
  - name: MetricsExportService
  - name: ObservabilityService
  - name: PlaybookService
  - name: RBACService
    description: RBAC service for managing roles, permissions, and access control
  - name: SandboxAdminService
  - name: SandboxQueryService
  - name: SandboxCapabilityService
  - name: ScimService
  - name: SecretService
  - name: SlackService
  - name: TeamsService
paths:
  /textql.rpc.public.observe.ObservabilityService/GetBillingStats:
    post:
      tags:
        - ObservabilityService
      summary: GetBillingStats
      operationId: ObservabilityService_GetBillingStats
      parameters:
        - name: Connect-Protocol-Version
          in: header
          required: true
          schema:
            $ref: '#/components/schemas/connect-protocol-version'
        - name: Connect-Timeout-Ms
          in: header
          schema:
            $ref: '#/components/schemas/connect-timeout-header'
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/textql.rpc.public.observe.GetBillingStatsRequest
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/textql.rpc.public.observe.GetBillingStatsResponse
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/connect.error'
      x-codeSamples:
        - lang: typescript
          label: TypeScript (SDK)
          source: |-
            import { Textql } from "@textql/sdk";

            const textql = new Textql({
              apiKey: process.env["TEXTQL_API_KEY"] ?? "",
            });

            async function run() {
              const result = await textql.observability.getBillingStats({
                body: {},
              });

              console.log(result);
            }

            run();
        - lang: python
          label: Python (SDK)
          source: |-
            import os
            from textql_sdk import Textql


            with Textql(
                api_key=os.getenv("TEXTQL_API_KEY", ""),
            ) as textql:

                res = textql.observability.get_billing_stats()

                # Handle response
                print(res)
components:
  schemas:
    connect-protocol-version:
      type: number
      title: Connect-Protocol-Version
      enum:
        - 1
      description: Define the version of the Connect protocol
      const: 1
      default: 1
    connect-timeout-header:
      type: number
      title: Connect-Timeout-Ms
      description: Define the timeout, in ms
    textql.rpc.public.observe.GetBillingStatsRequest:
      type: object
      properties:
        days:
          type: integer
          title: days
          format: int32
      title: GetBillingStatsRequest
      additionalProperties: false
    textql.rpc.public.observe.GetBillingStatsResponse:
      type: object
      properties:
        memberStats:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.observe.MemberBillingStat'
          title: member_stats
        agentStats:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.observe.AgentBillingStat'
          title: agent_stats
        totalFeedAcu:
          type: number
          title: total_feed_acu
          format: double
        playbookStats:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.observe.PlaybookBillingStat'
          title: playbook_stats
        dashboardStats:
          type: array
          items:
            $ref: >-
              #/components/schemas/textql.rpc.public.observe.DashboardBillingStat
          title: dashboard_stats
        totalPlaybookAcu:
          type: number
          title: total_playbook_acu
          format: double
        totalDashboardAcu:
          type: number
          title: total_dashboard_acu
          format: double
        unattributedFeedAcu:
          type: number
          title: unattributed_feed_acu
          format: double
        unattributedDashboardAcu:
          type: number
          title: unattributed_dashboard_acu
          format: double
        totalDashboardCount:
          type: integer
          title: total_dashboard_count
          format: int32
        totalPlaybookCount:
          type: integer
          title: total_playbook_count
          format: int32
        unattributedPlaybookAcu:
          type: number
          title: unattributed_playbook_acu
          format: double
        appStats:
          type: array
          items:
            $ref: '#/components/schemas/textql.rpc.public.observe.AppBillingStat'
          title: app_stats
        totalAppAcu:
          type: number
          title: total_app_acu
          format: double
        unattributedAppAcu:
          type: number
          title: unattributed_app_acu
          format: double
        totalAppCount:
          type: integer
          title: total_app_count
          format: int32
        acuRatePer1000Usd:
          type: number
          title: acu_rate_per_1000_usd
          format: double
          description: >-
            Effective ACU->USD rate for this org, in USD per 1000 ACUs (resolved
            from
             the tenant's pricing tier / active override). Multiply any ACU figure by
             (rate / 1000) to show dollars. 0 means unknown/unpriced (e.g. trial).
      title: GetBillingStatsResponse
      additionalProperties: false
    connect.error:
      type: object
      properties:
        code:
          type: string
          examples:
            - not_found
          enum:
            - canceled
            - unknown
            - invalid_argument
            - deadline_exceeded
            - not_found
            - already_exists
            - permission_denied
            - resource_exhausted
            - failed_precondition
            - aborted
            - out_of_range
            - unimplemented
            - internal
            - unavailable
            - data_loss
            - unauthenticated
          description: >-
            The status code, which should be an enum value of
            [google.rpc.Code][google.rpc.Code].
        message:
          type: string
          description: >-
            A developer-facing error message, which should be in English. Any
            user-facing error message should be localized and sent in the
            [google.rpc.Status.details][google.rpc.Status.details] field, or
            localized by the client.
        details:
          type: array
          items:
            $ref: '#/components/schemas/connect.error_details.Any'
          description: >-
            A list of messages that carry the error details. There is no limit
            on the number of messages.
      title: Connect Error
      additionalProperties: true
      description: >-
        Error type returned by Connect:
        https://connectrpc.com/docs/go/errors/#http-representation
    textql.rpc.public.observe.MemberBillingStat:
      type: object
      properties:
        memberId:
          type: string
          title: member_id
        memberName:
          type: string
          title: member_name
        email:
          type: string
          title: email
        totalAcu:
          type: number
          title: total_acu
          format: double
        acuByCategory:
          type: object
          title: acu_by_category
          additionalProperties:
            type: number
            title: value
            format: double
          description: llm_tokens, compute_hours, cell_execution
        acuBySource:
          type: object
          title: acu_by_source
          additionalProperties:
            type: number
            title: value
            format: double
          description: chat, feed, observability
        profileImageUrl:
          type: string
          title: profile_image_url
        threadCount:
          type: integer
          title: thread_count
          format: int32
        playbookCount:
          type: integer
          title: playbook_count
          format: int32
        dashboardCount:
          type: integer
          title: dashboard_count
          format: int32
        agentCount:
          type: integer
          title: agent_count
          format: int32
        isFormerMember:
          type: boolean
          title: is_former_member
        positiveSignalCount:
          type: integer
          title: positive_signal_count
          format: int32
          description: >-
            Per-member signal quality over the same window. Signal counts are
            rows
             (one thread can contribute several); flagged/analyzed count distinct
             threads, so flagged/analyzed is the per-member flagged rate.
        negativeSignalCount:
          type: integer
          title: negative_signal_count
          format: int32
        flaggedThreadCount:
          type: integer
          title: flagged_thread_count
          format: int32
        analyzedThreadCount:
          type: integer
          title: analyzed_thread_count
          format: int32
      title: MemberBillingStat
      additionalProperties: false
    textql.rpc.public.observe.AgentBillingStat:
      type: object
      properties:
        agentId:
          type: string
          title: agent_id
        estimatedAcu:
          type: number
          title: estimated_acu
          format: double
          description: proportionally distributed from member's feed ACU by post count
      title: AgentBillingStat
      additionalProperties: false
    textql.rpc.public.observe.PlaybookBillingStat:
      type: object
      properties:
        playbookId:
          type: string
          title: playbook_id
        playbookName:
          type: string
          title: playbook_name
        ownerId:
          type: string
          title: owner_id
        ownerName:
          type: string
          title: owner_name
        totalAcu:
          type: number
          title: total_acu
          format: double
        llmAcu:
          type: number
          title: llm_acu
          format: double
        computeAcu:
          type: number
          title: compute_acu
          format: double
        runCount:
          type: integer
          title: run_count
          format: int32
        dailyRunCounts:
          type: array
          items:
            type: integer
            format: int32
          title: daily_run_counts
        isActive:
          type: boolean
          title: is_active
      title: PlaybookBillingStat
      additionalProperties: false
    textql.rpc.public.observe.DashboardBillingStat:
      type: object
      properties:
        dashboardId:
          type: string
          title: dashboard_id
        dashboardName:
          type: string
          title: dashboard_name
        ownerId:
          type: string
          title: owner_id
        ownerName:
          type: string
          title: owner_name
        computeAcu:
          type: number
          title: compute_acu
          format: double
        refreshCount:
          type: integer
          title: refresh_count
          format: int32
        viewCount:
          type: integer
          title: view_count
          format: int32
        lastViewedAt:
          $ref: '#/components/schemas/google.protobuf.Timestamp'
          title: last_viewed_at
        dailyViewCounts:
          type: array
          items:
            type: integer
            format: int32
          title: daily_view_counts
        isPublished:
          type: boolean
          title: is_published
      title: DashboardBillingStat
      additionalProperties: false
    textql.rpc.public.observe.AppBillingStat:
      type: object
      properties:
        appId:
          type: string
          title: app_id
        appName:
          type: string
          title: app_name
        ownerId:
          type: string
          title: owner_id
        ownerName:
          type: string
          title: owner_name
        computeAcu:
          type: number
          title: compute_acu
          format: double
        refreshCount:
          type: integer
          title: refresh_count
          format: int32
        viewCount:
          type: integer
          title: view_count
          format: int32
        lastViewedAt:
          $ref: '#/components/schemas/google.protobuf.Timestamp'
          title: last_viewed_at
        dailyViewCounts:
          type: array
          items:
            type: integer
            format: int32
          title: daily_view_counts
        isPublished:
          type: boolean
          title: is_published
      title: AppBillingStat
      additionalProperties: false
    connect.error_details.Any:
      type: object
      properties:
        type:
          type: string
          description: >-
            A URL that acts as a globally unique identifier for the type of the
            serialized message. For example:
            `type.googleapis.com/google.rpc.ErrorInfo`. This is used to
            determine the schema of the data in the `value` field and is the
            discriminator for the `debug` field.
        value:
          type: string
          format: binary
          description: >-
            The Protobuf message, serialized as bytes and base64-encoded. The
            specific message type is identified by the `type` field.
        debug:
          oneOf:
            - type: object
              title: Any
              additionalProperties: true
              description: Detailed error information.
          discriminator:
            propertyName: type
          title: Debug
          description: >-
            Deserialized error detail payload. The 'type' field indicates the
            schema. This field is for easier debugging and should not be relied
            upon for application logic.
      additionalProperties: true
      description: >-
        Contains an arbitrary serialized message along with a @type that
        describes the type of the serialized message, with an additional debug
        field for ConnectRPC error details.
    google.protobuf.Timestamp:
      type: string
      examples:
        - '2023-01-15T01:30:15.01Z'
        - '2024-12-25T12:00:00Z'
      format: date-time
      description: >-
        A Timestamp represents a point in time independent of any time zone or
        local
         calendar, encoded as a count of seconds and fractions of seconds at
         nanosecond resolution. The count is relative to an epoch at UTC midnight on
         January 1, 1970, in the proleptic Gregorian calendar which extends the
         Gregorian calendar backwards to year one.

         All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
         second table is needed for interpretation, using a [24-hour linear
         smear](https://developers.google.com/time/smear).

         The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
         restricting to that range, we ensure that we can convert to and from [RFC
         3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.

         # Examples

         Example 1: Compute Timestamp from POSIX `time()`.

             Timestamp timestamp;
             timestamp.set_seconds(time(NULL));
             timestamp.set_nanos(0);

         Example 2: Compute Timestamp from POSIX `gettimeofday()`.

             struct timeval tv;
             gettimeofday(&tv, NULL);

             Timestamp timestamp;
             timestamp.set_seconds(tv.tv_sec);
             timestamp.set_nanos(tv.tv_usec * 1000);

         Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.

             FILETIME ft;
             GetSystemTimeAsFileTime(&ft);
             UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;

             // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
             // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
             Timestamp timestamp;
             timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
             timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));

         Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.

             long millis = System.currentTimeMillis();

             Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
                 .setNanos((int) ((millis % 1000) * 1000000)).build();

         Example 5: Compute Timestamp from Java `Instant.now()`.

             Instant now = Instant.now();

             Timestamp timestamp =
                 Timestamp.newBuilder().setSeconds(now.getEpochSecond())
                     .setNanos(now.getNano()).build();

         Example 6: Compute Timestamp from current time in Python.

             timestamp = Timestamp()
             timestamp.GetCurrentTime()

         # JSON Mapping

         In JSON format, the Timestamp type is encoded as a string in the
         [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
         format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
         where {year} is always expressed using four digits while {month}, {day},
         {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
         seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
         are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
         is required. A proto3 JSON serializer should always use UTC (as indicated by
         "Z") when printing the Timestamp type and a proto3 JSON parser should be
         able to accept both UTC and other timezones (as indicated by an offset).

         For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
         01:30 UTC on January 15, 2017.

         In JavaScript, one can convert a Date object to this format using the
         standard
         [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
         method. In Python, a standard `datetime.datetime` object can be converted
         to this format using
         [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
         the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
         the Joda Time's [`ISODateTimeFormat.dateTime()`](
         http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
         ) to obtain a formatter capable of generating timestamps in this format.
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: tql_api_key

````