---
title: "Product catalog"
method: GET
path: "/v2/billing/products"
tags: ["billing"]
---

# Product catalog

`GET /v2/billing/products`

## Request

- Base URL: `https://api.stuut.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.stuut.ai/v2/billing/products`
- Auth: HTTP bearer

Return product metadata, list rates, and organization access state.

## Response `200`

Successful Response

- ProductCatalog
  - `products` CatalogProduct[], required: Every product Stuut offers, including products absent from the active contract.
    - `key` 'active_accounts' | 'collections' | 'cash_application' | 'deductions' | 'disputes' | 'voice' | 'sms', required: Stable slug for a product offered by Stuut.
    - `name` string, required: Customer-facing product name.
    - `required` boolean, required: Whether the product is part of every account and cannot be disabled.
    - `status` 'ENABLED' | 'AVAILABLE' | 'CONTACT_SALES', required: Backend-resolved state and UI action: ENABLED is active, AVAILABLE can be enabled self-service, and CONTACT_SALES requires a managed contract change.
    - `metrics` CatalogMetric[], required: Presentation metadata for the product's metrics.
      - `metric_name` string, required: Stable Metronome billable-metric name.
      - `name` string, required: Customer-facing metric name.
      - `unit` string, required: Singular metered unit, e.g. invoice, payment, or minute.
      - `rate_format` 'CURRENCY_PER_UNIT' | 'PERCENTAGE', required: How the frontend should format this metric's prices.
    - `rates` ProductRate[], required: Current standard List Rates; every entry has source=LIST.
      - `metric_name` string, required: Stable catalog metric name priced by this rate; uncataloged contract products fall back to their Metronome product name.
      - `source` 'LIST' | 'OVERRIDE', required: LIST for standard pricing; OVERRIDE for negotiated contract pricing.
      - `dimension` object, nullable, required: The pricing slice for dimensional products, e.g. {'activity': 'worked'}; null for flat-priced products.
      - `rate` Rate, required: A Metronome rate from the contract's rate schedule.
        - `rate_type` 'FLAT' | 'PERCENTAGE' | 'SUBSCRIPTION' | 'CUSTOM' | 'TIERED' | 'TIERED_PERCENTAGE', required: Rate shape; flat/percentage rates carry `price`, tiered rates carry `tiers`.
        - `price` string, decimal, nullable, required: Dollars per unit for FLAT/SUBSCRIPTION rates; a decimal fraction for PERCENTAGE rates (0.005 = 0.5%).
        - `tiers` Tier[], nullable, required: Graduated bands for TIERED and TIERED_PERCENTAGE rates.
          - `size` string, decimal, nullable, required: Band size in metered UNITS (not money); null = the open top tier.
          - `price` string, decimal, required: Price within this band: dollars per unit for TIERED rates; a decimal fraction for TIERED_PERCENTAGE rates (0.005 = 0.5%).
      - `is_unlimited` boolean, required: True when this slice's effective rate is $0 — usage is metered but never charged, i.e. unlimited. An unknown price (no FLAT price, no tiers) is NOT unlimited.
    - `activation_credits` ActivationCredit[], required: Credits granted specifically by activating this product.
      - `name` string, required: Customer-facing credit name.
      - `amount` string, decimal, required: Credit amount in `currency`.
      - `currency` string, required: ISO-4217 currency code.
      - `expires_after_days` integer, nullable, required: Days after activation before the credit expires; null = never.

---

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