---
title: "Get tenant billing summary"
method: GET
path: "/tenants/billing"
tags: ["SelfBilling"]
---

# Get tenant billing summary

`GET /tenants/billing`

## Request

- Base URL: `https://us.api.flexprice.io/v1`
- URL: `https://us.api.flexprice.io/v1/tenants/billing`
- Auth: API key in header `x-api-key`

Returns the caller tenant's billing summary; same as /portal/billing/summary.

## Response `200`

OK

- SelfBillingSummaryResponse
  - `invoices` SelfBillingInvoice[]
    - `currency` string
    - `due_date` string, date-time
    - `id` string
    - `number` string
    - `payment_status` 'INITIATED' | 'PENDING' | 'PROCESSING' | 'SUCCEEDED' | 'OVERPAID' | 'FAILED' | 'REFUNDED' | 'PARTIALLY_REFUNDED' | 'VOIDED'
    - `pdf_url` string
    - `status` 'DRAFT' | 'FINALIZED' | 'VOIDED' | 'SKIPPED'
    - `total` string
  - `status` 'trialing' | 'active' | 'suspended'
  - `subscription_status` 'active' | 'paused' | 'cancelled' | 'incomplete' | 'trialing' | 'draft'
  - `trial_ends_at` string, date-time
  - `usage` CustomerUsageSummaryResponse
    - `customer_id` string
    - `features` FeatureUsageSummary[]
      - `buckets` AggregatedEntitlementBucket[]: Buckets is one entry per independent budget on a parallel feature. The scalar figures above cannot describe several budgets at once — a sum is not spendable from any one of them — so a client showing a parallel feature reads these instead. Empty for additive features, where the scalars are the whole truth.
        - `entitlement_id` string
        - `grant_duration_unit` 'hour' | 'day' | 'week' | 'subscription_period'
        - `grant_duration_value` integer
        - `grant_measure` 'quantity' | 'amount'
        - `grant_quota` string
        - `grant_unlimited` boolean
        - `source_entity_id` string
        - `usage_limit` integer
      - `current_usage` string
      - `feature` FeatureResponse
        - `alert_settings` TypesAlertSettings
          - `alert_enabled` boolean
          - `alert_threshold_type` 'absolute' | 'percentage'
          - `critical` TypesAlertThreshold
            - `condition` 'above' | 'below'
            - `threshold` string
          - `info` TypesAlertThreshold
            - `condition` 'above' | 'below'
            - `threshold` string
          - `warning` TypesAlertThreshold
            - `condition` 'above' | 'below'
            - `threshold` string
        - `created_at` string, date-time
        - `created_by` string
        - `description` string
        - `environment_id` string
        - `group` GroupResponse
          - `created_at` string, date-time
          - `entity_ids` string[]
          - `entity_type` string
          - `id` string
          - `lookup_key` string
          - `metadata` object
          - `name` string
          - `status` string
          - `updated_at` string, date-time
        - `group_id` string
        - `id` string
        - `lookup_key` string
        - `metadata` TypesMetadata
        - `meter` MeterResponse
          - `aggregation` MeterAggregation
            - `bucket_size` 'MINUTE' | '15MIN' | '30MIN' | 'HOUR' | '3HOUR' | '6HOUR' | '12HOUR' | 'DAY' | 'WEEK' | 'MONTH'
            - `expression` string: Expression is an optional CEL expression to compute per-event quantity from event.properties. When set, it replaces Field-based extraction. Property names are used directly (e.g., token * duration * pixel).
            - `field` string: Field is the key in $event.properties on which the aggregation is to be applied For ex if the aggregation type is sum for API usage, the field could be "duration_ms" Ignored when Expression is set.
            - `group_by` string: GroupBy is the property name in event.properties to group by before aggregating. Requires MAX aggregation. Windowing comes from the price, so this no longer implies a meter-level bucket_size. When set, aggregation is applied per unique value of this property within each bucket, then the per-group results are summed to produce the bucket total.
            - `multiplier` string: Multiplier is the multiplier for the aggregation For ex if the aggregation type is sum_with_multiplier for API usage, the multiplier could be 1000 to scale up by a factor of 1000. If not provided, it will be null.
            - `type` 'COUNT' | 'SUM' | 'AVG' | 'COUNT_UNIQUE' | 'LATEST' | 'SUM_WITH_MULTIPLIER' | 'MAX' | 'WEIGHTED_SUM'
          - `created_at` string, date-time
          - `event_name` string
          - `filters` MeterFilter[]
            - `key` string: Key is the key for the filter from $event.properties Currently we support only first level keys in the properties and not nested keys
            - `values` string[]: Values are the possible values for the filter to be considered for the meter For ex "model_name" could have values "o1-mini", "gpt-4o" etc
          - `id` string
          - `name` string
          - `reset_usage` 'BILLING_PERIOD' | 'NEVER'
          - `status` string
          - `tenant_id` string
          - `updated_at` string, date-time
        - `meter_id` string
        - `name` string
        - `reporting_unit` TypesReportingUnit
          - `conversion_rate` number: Multiplier: reporting_unit_value = unit_value * conversion_rate; must be > 0
          - `unit_plural` string: Display unit label, plural (e.g. "seconds")
          - `unit_singular` string: Display unit label, singular (e.g. "second")
        - `status` 'published' | 'deleted' | 'archived'
        - `tenant_id` string
        - `type` 'metered' | 'boolean' | 'static' | 'config'
        - `unit_plural` string
        - `unit_singular` string
        - `updated_at` string, date-time
        - `updated_by` string
      - `grant_duration_unit` 'hour' | 'day' | 'week' | 'subscription_period'
      - `grant_duration_value` integer
      - `grant_measure` 'quantity' | 'amount'
      - `grant_quota` string
      - `grant_state` GrantState
        - `allowances` GrantAllowanceState[]
          - `entitlement_id` string
          - `grant_id` string
          - `is_active` boolean
          - `last_computed_at` string, date-time
          - `measure` 'quantity' | 'amount'
          - `quota` string
          - `quota_crossed_at` string, date-time
          - `remaining` string
          - `status` 'active' | 'exhausted'
          - `unlimited` boolean
          - `usage` string
          - `valid_from` string
          - `valid_to` string
      - `grant_unlimited` boolean
      - `is_enabled` boolean
      - `is_soft_limit` boolean
      - `is_unlimited` boolean
      - `next_usage_reset_at` string, date-time
      - `sources` EntitlementSource[]
        - `config_value` object
        - `entitlement_id` string
        - `entity_id` string
        - `entity_name` string
        - `entity_type` 'plan' | 'addon' | 'subscription'
        - `is_enabled` boolean
        - `quantity` integer
        - `static_value` string
        - `subscription_id` string
        - `usage_limit` integer
        - `usage_reset_period` 'MONTHLY' | 'ANNUAL' | 'WEEKLY' | 'DAILY' | 'QUARTERLY' | 'HALF_YEARLY' | 'ONETIME'
      - `total_limit` integer
      - `usage_percent` string
    - `pagination` TypesPaginationResponse
      - `limit` integer
      - `offset` integer
      - `total` integer
    - `period` BillingPeriodInfo
      - `end_time` string, date-time
      - `period` string: e.g., "monthly", "yearly"
      - `start_time` string, date-time

## Other responses

- `404`: Self-billing disabled
- `500`: Server error

## Changes

- **2026-10-20** `a24bd13338e3`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/flexprice/apis/flexprice-api/changes/tenants/billing/get.md)

---

[API](https://skmtc.dev/flexprice/apis/flexprice-api.md) - [All operations](https://skmtc.dev/flexprice/apis/flexprice-api/llms.txt) - [OpenAPI document](https://skmtc.dev/flexprice/apis/flexprice-api/revisions/84cb4a3af400?raw)
