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

# Update Entity

> Updates an existing entity and returns the refreshed entity object.

Use this to change entity billing controls or other mutable entity fields after the entity has already been created.

export const DynamicResponseExample = ({json, statusCode = "200"}) => {
  const toCamelCase = str => {
    return str.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
  };
  const convertKeysToCamelCase = obj => {
    if (Array.isArray(obj)) {
      return obj.map(item => convertKeysToCamelCase(item));
    }
    if (obj !== null && typeof obj === "object") {
      return Object.keys(obj).reduce((acc, key) => {
        const camelKey = toCamelCase(key);
        acc[camelKey] = convertKeysToCamelCase(obj[key]);
        return acc;
      }, {});
    }
    return obj;
  };
  const [isTypeScript, setIsTypeScript] = useState(() => {
    if (typeof window !== "undefined") {
      try {
        const lang = localStorage.getItem("code");
        return JSON.parse(lang) === "typescript";
      } catch {
        return true;
      }
    }
    return true;
  });
  useEffect(() => {
    const onMintlifyStorage = event => {
      if (event.detail?.key === "code") {
        try {
          const value = JSON.parse(event.detail.value);
          setIsTypeScript(value === "typescript");
        } catch {}
      }
    };
    const pollInterval = setInterval(() => {
      try {
        const lang = localStorage.getItem("code");
        const value = JSON.parse(lang);
        setIsTypeScript(value === "typescript");
      } catch {}
    }, 300);
    document.addEventListener("mintlify-localstorage", onMintlifyStorage);
    return () => {
      document.removeEventListener("mintlify-localstorage", onMintlifyStorage);
      clearInterval(pollInterval);
    };
  }, []);
  const camelCaseJson = useMemo(() => convertKeysToCamelCase(json), [json]);
  const snakeCaseString = JSON.stringify(json, null, 2);
  const camelCaseString = JSON.stringify(camelCaseJson, null, 2);
  return <ResponseExample>
			{isTypeScript ? <CodeBlock language="json" filename={statusCode}>
					{camelCaseString}
				</CodeBlock> : <CodeBlock language="json" filename={statusCode}>
					{snakeCaseString}
				</CodeBlock>}
		</ResponseExample>;
};

export const DynamicResponseField = ({children, name, ...props}) => {
  const convertToCamelCase = str => {
    if (typeof str !== "string") return str;
    return str.replace(/[_-](\w)/g, (_, c) => c.toUpperCase());
  };
  const [lang, setLang] = useState(() => {
    if (typeof window !== "undefined") {
      const stored = localStorage.getItem("code");
      return stored || '"typescript"';
    }
    return '"typescript"';
  });
  useEffect(() => {
    const onMintlifyStorage = event => {
      const key = event.detail?.key;
      if (key === "code") {
        setLang(event.detail.value);
      }
    };
    const pollInterval = setInterval(() => {
      const current = localStorage.getItem("code");
      if (current && current !== lang) {
        setLang(current);
      }
    }, 500);
    document.addEventListener("mintlify-localstorage", onMintlifyStorage);
    return () => {
      document.removeEventListener("mintlify-localstorage", onMintlifyStorage);
      clearInterval(pollInterval);
    };
  }, [lang]);
  const resolvedName = useMemo(() => {
    try {
      const value = JSON.parse(lang);
      const useCamelCase = value === "typescript";
      return useCamelCase ? convertToCamelCase(name) : name;
    } catch {
      return name;
    }
  }, [name, lang]);
  return <ResponseField name={resolvedName} {...props}>
			{children}
		</ResponseField>;
};

export const DynamicParamField = ({children, body, path, ...props}) => {
  const convertToCamelCase = str => {
    if (typeof str !== "string") return str;
    return str.replace(/[_-](\w)/g, (_, c) => c.toUpperCase());
  };
  const [lang, setLang] = useState(() => {
    if (typeof window !== "undefined") {
      const stored = localStorage.getItem("code");
      return stored || '"typescript"';
    }
    return '"typescript"';
  });
  useEffect(() => {
    const onMintlifyStorage = event => {
      const key = event.detail?.key;
      if (key === "code") {
        setLang(event.detail.value);
      }
    };
    const pollInterval = setInterval(() => {
      const current = localStorage.getItem("code");
      if (current && current !== lang) {
        setLang(current);
      }
    }, 500);
    document.addEventListener("mintlify-localstorage", onMintlifyStorage);
    return () => {
      document.removeEventListener("mintlify-localstorage", onMintlifyStorage);
      clearInterval(pollInterval);
    };
  }, [lang]);
  const resolvedBody = useMemo(() => {
    try {
      const value = JSON.parse(lang);
      const useCamelCase = value === "typescript";
      return useCamelCase ? convertToCamelCase(body) : body;
    } catch {
      return body;
    }
  }, [body, lang]);
  const resolvedPath = useMemo(() => {
    try {
      const value = JSON.parse(lang);
      const useCamelCase = value === "typescript";
      return useCamelCase ? convertToCamelCase(path) : path;
    } catch {
      return path;
    }
  }, [path, lang]);
  return <ParamField body={resolvedBody} path={resolvedPath} {...props}>
			{children}
		</ParamField>;
};

### Body Parameters

<DynamicParamField body="customer_id" type="string">
  The ID of the customer that owns the entity.
</DynamicParamField>

<DynamicParamField body="entity_id" type="string" required>
  The ID of the entity.
</DynamicParamField>

<DynamicParamField body="billing_controls" type="object">
  Billing controls to replace on the entity.

  <Expandable title="properties">
    <DynamicParamField body="spend_limits" type="object[]">
      List of spend limits per feature. Each entry caps overage (overage\_limit) and/or per-interval usage (usage\_limit).

      <Expandable title="properties">
        <DynamicParamField body="feature_id" type="string">
          Optional feature ID this spend limit applies to.
        </DynamicParamField>

        <DynamicParamField body="enabled" type="boolean">
          Whether the overage spend limit is enabled.
        </DynamicParamField>

        <DynamicParamField body="limit_type" type="'absolute' | 'usage_percentage'">
          How overage\_limit is interpreted: an absolute overage cap (default) or a percentage of the main-plan allowance.
        </DynamicParamField>

        <DynamicParamField body="overage_limit" type="number">
          Overage cap for the feature: absolute units, or a percent (e.g. 120) when limit\_type is usage\_percentage.
        </DynamicParamField>

        <DynamicParamField body="skip_overage_billing" type="boolean">
          When true, overage for this feature is not posted to Stripe. Usage tracking and balance resets still behave normally.
        </DynamicParamField>
      </Expandable>
    </DynamicParamField>

    <DynamicParamField body="usage_limits" type="object[]">
      List of hard usage caps per feature for this entity. An entity entry overrides the customer's for that feature.

      <Expandable title="properties">
        <DynamicParamField body="feature_id" type="string" required>
          The feature this usage limit applies to.
        </DynamicParamField>

        <DynamicParamField body="enabled" type="boolean">
          Whether this usage limit is enabled.
        </DynamicParamField>

        <DynamicParamField body="limit" type="number" required>
          Maximum units allowed per interval.
        </DynamicParamField>

        <DynamicParamField body="interval" type="'day' | 'week' | 'month' | 'year'" required>
          Interval for the cap, aligned to the customer's billing cycle.
        </DynamicParamField>

        <DynamicParamField body="filter" type="object">
          When set, only usage from events whose properties match counts toward this cap. Omit to count all usage of the feature.

          <Expandable title="properties">
            <DynamicParamField body="properties.{key}" type="string" required />
          </Expandable>
        </DynamicParamField>
      </Expandable>
    </DynamicParamField>

    <DynamicParamField body="usage_alerts" type="object[]">
      List of usage alert configurations per feature.

      <Expandable title="properties">
        <DynamicParamField body="feature_id" type="string">
          The feature ID this alert applies to.
        </DynamicParamField>

        <DynamicParamField body="enabled" type="boolean">
          Whether this usage alert is enabled.
        </DynamicParamField>

        <DynamicParamField body="threshold" type="number" required>
          The threshold value that triggers the alert. For usage or remaining, this is an absolute count. For usage\_percentage or remaining\_percentage, this is a percentage (0-100).
        </DynamicParamField>

        <DynamicParamField body="threshold_type" type="'usage' | 'usage_percentage' | 'remaining' | 'remaining_percentage'" required>
          Whether the threshold is an absolute count or a percentage of the usage allowance or remaining balance.
        </DynamicParamField>

        <DynamicParamField body="name" type="string">
          Optional user-defined label to distinguish multiple alerts on the same feature.
        </DynamicParamField>
      </Expandable>
    </DynamicParamField>

    <DynamicParamField body="overage_allowed" type="object[]">
      List of overage allowed controls per feature. When enabled, usage can exceed balance.

      <Expandable title="properties">
        <DynamicParamField body="feature_id" type="string" required>
          The feature ID this overage allowed control applies to.
        </DynamicParamField>

        <DynamicParamField body="enabled" type="boolean">
          Whether overage is allowed for this feature.
        </DynamicParamField>
      </Expandable>
    </DynamicParamField>
  </Expandable>
</DynamicParamField>

### Response

<DynamicResponseField name="id" type="string | null">
  The unique identifier of the entity
</DynamicResponseField>

<DynamicResponseField name="name" type="string | null">
  The name of the entity
</DynamicResponseField>

<DynamicResponseField name="customer_id" type="string | null">
  The customer ID this entity belongs to
</DynamicResponseField>

<DynamicResponseField name="feature_id" type="string | null">
  The feature ID this entity belongs to
</DynamicResponseField>

<DynamicResponseField name="created_at" type="number">
  Unix timestamp when the entity was created
</DynamicResponseField>

<DynamicResponseField name="env" type="'sandbox' | 'live'">
  The environment (sandbox/live)
</DynamicResponseField>

<DynamicResponseField name="subscriptions" type="object[]">
  <Expandable title="properties">
    <DynamicResponseField name="id" type="string">
      The unique identifier of this subscription. If a subscription\_id was provided at attach time, it is used; otherwise, falls back to the internal ID.
    </DynamicResponseField>

    <DynamicResponseField name="plan" type="object">
      The full plan object if expanded.

      <Expandable title="properties">
        <DynamicResponseField name="id" type="string">
          Unique identifier for the plan.
        </DynamicResponseField>

        <DynamicResponseField name="name" type="string">
          Display name of the plan.
        </DynamicResponseField>

        <DynamicResponseField name="description" type="string | null">
          Optional description of the plan.
        </DynamicResponseField>

        <DynamicResponseField name="group" type="string | null">
          Group identifier for organizing related plans. Plans in the same group are mutually exclusive.
        </DynamicResponseField>

        <DynamicResponseField name="version" type="number">
          Version number of the plan. Incremented when plan configuration changes.
        </DynamicResponseField>

        <DynamicResponseField name="add_on" type="boolean">
          Whether this is an add-on plan that can be attached alongside a main plan.
        </DynamicResponseField>

        <DynamicResponseField name="auto_enable" type="boolean">
          If true, this plan is automatically attached when a customer is created. Used for free plans.
        </DynamicResponseField>

        <DynamicResponseField name="price" type="object | null">
          Base recurring price for the plan. Null for free plans or usage-only plans.

          <Expandable title="properties">
            <DynamicResponseField name="amount" type="number">
              Base price amount for the plan.
            </DynamicResponseField>

            <DynamicResponseField name="additional_currencies" type="object[]">
              Base price amounts in additional currencies. The base 'amount' is in the org's default currency.

              <Expandable title="properties">
                <DynamicResponseField name="currency" type="string">
                  Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                </DynamicResponseField>

                <DynamicResponseField name="amount" type="number">
                  Price amount in this currency. Set explicitly per currency, not converted from the base amount.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="interval" type="'one_off' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
              Billing interval (e.g. 'month', 'year').
            </DynamicResponseField>

            <DynamicResponseField name="interval_count" type="number">
              Number of intervals per billing cycle. Defaults to 1.
            </DynamicResponseField>

            <DynamicResponseField name="display" type="object">
              Display text for showing this price in pricing pages.

              <Expandable title="properties">
                <DynamicResponseField name="primary_text" type="string">
                  Main display text (e.g. '\$10' or '100 messages').
                </DynamicResponseField>

                <DynamicResponseField name="secondary_text" type="string">
                  Secondary display text (e.g. 'per month' or 'then \$0.5 per 100').
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="items" type="object[]">
          Feature configurations included in this plan. Each item defines included units, pricing, and reset behavior for a feature.

          <Expandable title="properties">
            <DynamicResponseField name="feature_id" type="string">
              The ID of the feature this item configures.
            </DynamicResponseField>

            <DynamicResponseField name="feature" type="object">
              The full feature object if expanded.

              <Expandable title="properties">
                <DynamicResponseField name="id" type="string">
                  The ID of the feature, used to refer to it in other API calls like /track or /check.
                </DynamicResponseField>

                <DynamicResponseField name="name" type="string | null">
                  The name of the feature.
                </DynamicResponseField>

                <DynamicResponseField name="type" type="'static' | 'boolean' | 'single_use' | 'continuous_use' | 'credit_system' | 'ai_credit_system'">
                  The type of the feature
                </DynamicResponseField>

                <DynamicResponseField name="display" type="object | null">
                  Singular and plural display names for the feature.

                  <Expandable title="properties">
                    <DynamicResponseField name="singular" type="string">
                      The singular display name for the feature.
                    </DynamicResponseField>

                    <DynamicResponseField name="plural" type="string">
                      The plural display name for the feature.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="credit_schema" type="object[] | null">
                  Credit cost schema for credit system features.

                  <Expandable title="properties">
                    <DynamicResponseField name="metered_feature_id" type="string">
                      The ID of the metered feature (should be a single\_use feature).
                    </DynamicResponseField>

                    <DynamicResponseField name="credit_cost" type="number">
                      The credit cost of the metered feature.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="archived" type="boolean | null">
                  Whether or not the feature is archived.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="included" type="number">
              Number of free units included. For consumable features, balance resets to this number each interval.
            </DynamicResponseField>

            <DynamicResponseField name="unlimited" type="boolean">
              Whether the customer has unlimited access to this feature.
            </DynamicResponseField>

            <DynamicResponseField name="reset" type="object | null">
              Reset configuration for consumable features. Null for non-consumable features like seats where usage persists across billing cycles.

              <Expandable title="properties">
                <DynamicResponseField name="interval" type="'one_off' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                  The interval at which the feature balance resets (e.g. 'month', 'year'). For consumable features, usage resets to 0 and included units are restored.
                </DynamicResponseField>

                <DynamicResponseField name="interval_count" type="number">
                  Number of intervals between resets. Defaults to 1.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="price" type="object | null">
              Pricing configuration for usage beyond included units. Null if feature is entirely free.

              <Expandable title="properties">
                <DynamicResponseField name="amount" type="number">
                  Price per billing\_units after included usage is consumed. Mutually exclusive with tiers.
                </DynamicResponseField>

                <DynamicResponseField name="additional_currencies" type="object[]">
                  Amounts in additional currencies for this flat price. The base 'amount' is in the org's default currency. Only valid with 'amount', not 'tiers' (tiered prices carry per-currency amounts on each tier).

                  <Expandable title="properties">
                    <DynamicResponseField name="currency" type="string">
                      Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                    </DynamicResponseField>

                    <DynamicResponseField name="amount" type="number">
                      Price amount in this currency. Set explicitly per currency, not converted from the base amount.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="tiers" type="object[]">
                  Tiered pricing configuration. Each tier's 'to' INCLUDES the included amount. Either 'tiers' or 'amount' is required.

                  <Expandable title="properties">
                    <DynamicResponseField name="to" type="number" />

                    <DynamicResponseField name="amount" type="number" />

                    <DynamicResponseField name="flat_amount" type="number" />

                    <DynamicResponseField name="additional_currencies" type="object[]">
                      <Expandable title="properties">
                        <DynamicResponseField name="currency" type="string">
                          Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                        </DynamicResponseField>

                        <DynamicResponseField name="amount" type="number">
                          Per-unit amount for this tier in this currency.
                        </DynamicResponseField>

                        <DynamicResponseField name="flat_amount" type="number">
                          Flat amount for this tier in this currency, if the tier uses one.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="tier_behavior" type="'graduated' | 'volume'" />

                <DynamicResponseField name="interval" type="'one_off' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                  Billing interval for this price. For consumable features, should match reset.interval.
                </DynamicResponseField>

                <DynamicResponseField name="interval_count" type="number">
                  Number of intervals per billing cycle. Defaults to 1.
                </DynamicResponseField>

                <DynamicResponseField name="billing_units" type="number">
                  Number of units per price increment. Usage is rounded UP to the nearest billing\_units when billed (e.g. billing\_units=100 means 101 usage rounds to 200).
                </DynamicResponseField>

                <DynamicResponseField name="billing_method" type="'prepaid' | 'usage_based'">
                  'prepaid' for features like seats where customers pay upfront, 'usage\_based' for pay-as-you-go after included usage.
                </DynamicResponseField>

                <DynamicResponseField name="max_purchase" type="number | null">
                  Maximum units a customer can purchase beyond included. E.g. if included=100 and max\_purchase=300, customer can use up to 400 total before usage is capped. Null for no limit.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="display" type="object">
              Display text for showing this item in pricing pages.

              <Expandable title="properties">
                <DynamicResponseField name="primary_text" type="string">
                  Main display text (e.g. '\$10' or '100 messages').
                </DynamicResponseField>

                <DynamicResponseField name="secondary_text" type="string">
                  Secondary display text (e.g. 'per month' or 'then \$0.5 per 100').
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="rollover" type="object">
              Rollover configuration for unused units. If set, unused included units roll over to the next period.

              <Expandable title="properties">
                <DynamicResponseField name="max" type="number | null">
                  Maximum rollover units. Null for unlimited rollover.
                </DynamicResponseField>

                <DynamicResponseField name="max_percentage" type="number | null">
                  Maximum rollover as a percentage (0-100) of included + prepaid grant. Mutually exclusive with max.
                </DynamicResponseField>

                <DynamicResponseField name="expiry_duration_type" type="'month' | 'forever'">
                  When rolled over units expire.
                </DynamicResponseField>

                <DynamicResponseField name="expiry_duration_length" type="number">
                  Number of periods before expiry.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="free_trial" type="object">
          Free trial configuration. If set, new customers can try this plan before being charged.

          <Expandable title="properties">
            <DynamicResponseField name="duration_length" type="number">
              Number of duration\_type periods the trial lasts.
            </DynamicResponseField>

            <DynamicResponseField name="duration_type" type="'day' | 'month' | 'year'">
              Unit of time for the trial duration ('day', 'month', 'year').
            </DynamicResponseField>

            <DynamicResponseField name="card_required" type="boolean">
              Whether a payment method is required to start the trial. If true, customer will be charged after trial ends.
            </DynamicResponseField>

            <DynamicResponseField name="on_end" type="'bill' | 'revert'">
              Behavior when the trial ends. 'bill' charges the customer (default). 'revert' expires the trial and restores the customer's previous plan.
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="created_at" type="number">
          Unix timestamp (ms) when the plan was created.
        </DynamicResponseField>

        <DynamicResponseField name="env" type="'sandbox' | 'live'">
          Environment this plan belongs to ('sandbox' or 'live').
        </DynamicResponseField>

        <DynamicResponseField name="archived" type="boolean">
          Whether the plan is archived. Archived plans cannot be attached to new customers.
        </DynamicResponseField>

        <DynamicResponseField name="base_variant_id" type="string | null">
          Deprecated. Use variant\_details.base\_plan\_id instead. If this is a variant, the ID of the base plan it was created from.
        </DynamicResponseField>

        <DynamicResponseField name="variant_details" type="object">
          Details about how this variant relates to its latest base plan.

          <Expandable title="properties">
            <DynamicResponseField name="base_plan_id" type="string">
              The ID of the base plan this variant was derived from.
            </DynamicResponseField>

            <DynamicResponseField name="customize" type="object">
              The customization that transforms the base plan into this variant.

              <Expandable title="properties">
                <DynamicResponseField name="price" type="object | null">
                  Base price configuration for a plan.

                  <Expandable title="properties">
                    <DynamicResponseField name="amount" type="number">
                      Base price amount for the plan.
                    </DynamicResponseField>

                    <DynamicResponseField name="interval" type="'one_off' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                      Billing interval (e.g. 'month', 'year').
                    </DynamicResponseField>

                    <DynamicResponseField name="interval_count" type="number">
                      Number of intervals per billing cycle. Defaults to 1.
                    </DynamicResponseField>

                    <DynamicResponseField name="additional_currencies" type="object[]">
                      Base price amounts in additional currencies. The base 'amount' is in the org's default currency.

                      <Expandable title="properties">
                        <DynamicResponseField name="currency" type="string">
                          Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                        </DynamicResponseField>

                        <DynamicResponseField name="amount" type="number">
                          Price amount in this currency. Set explicitly per currency, not converted from the base amount.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="add_items" type="object[]">
                  Items to add to the plan.

                  <Expandable title="properties">
                    <DynamicResponseField name="feature_id" type="string">
                      The ID of the feature to configure.
                    </DynamicResponseField>

                    <DynamicResponseField name="included" type="number">
                      Number of free units included. Balance resets to this each interval for consumable features.
                    </DynamicResponseField>

                    <DynamicResponseField name="unlimited" type="boolean">
                      If true, customer has unlimited access to this feature.
                    </DynamicResponseField>

                    <DynamicResponseField name="reset" type="object">
                      Reset configuration for consumable features. Omit for non-consumable features like seats.

                      <Expandable title="properties">
                        <DynamicResponseField name="interval" type="'one_off' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                          Interval at which balance resets (e.g. 'month', 'year'). For consumable features only.
                        </DynamicResponseField>

                        <DynamicResponseField name="interval_count" type="number">
                          Number of intervals between resets. Defaults to 1.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="price" type="object">
                      Pricing for usage beyond included units. Omit for free features.

                      <Expandable title="properties">
                        <DynamicResponseField name="amount" type="number">
                          Price per billing\_units after included usage. Either 'amount' or 'tiers' is required.
                        </DynamicResponseField>

                        <DynamicResponseField name="additional_currencies" type="object[]">
                          Amounts in additional currencies for this flat price. The base 'amount' is in the org's default currency. Only valid with 'amount', not 'tiers'.

                          <Expandable title="properties">
                            <DynamicResponseField name="currency" type="string">
                              Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                            </DynamicResponseField>

                            <DynamicResponseField name="amount" type="number">
                              Price amount in this currency. Set explicitly per currency, not converted from the base amount.
                            </DynamicResponseField>
                          </Expandable>
                        </DynamicResponseField>

                        <DynamicResponseField name="tiers" type="object[]">
                          Tiered pricing. Either 'amount' or 'tiers' is required.

                          <Expandable title="properties">
                            <DynamicResponseField name="to" type="number" />

                            <DynamicResponseField name="amount" type="number" />

                            <DynamicResponseField name="flat_amount" type="number" />

                            <DynamicResponseField name="additional_currencies" type="object[]">
                              <Expandable title="properties">
                                <DynamicResponseField name="currency" type="string">
                                  Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                                </DynamicResponseField>

                                <DynamicResponseField name="amount" type="number">
                                  Per-unit amount for this tier in this currency.
                                </DynamicResponseField>

                                <DynamicResponseField name="flat_amount" type="number">
                                  Flat amount for this tier in this currency, if the tier uses one.
                                </DynamicResponseField>
                              </Expandable>
                            </DynamicResponseField>
                          </Expandable>
                        </DynamicResponseField>

                        <DynamicResponseField name="tier_behavior" type="'graduated' | 'volume'" />

                        <DynamicResponseField name="interval" type="'one_off' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                          Billing interval. For consumable features, should match reset.interval.
                        </DynamicResponseField>

                        <DynamicResponseField name="interval_count" type="number">
                          Number of intervals per billing cycle. Defaults to 1.
                        </DynamicResponseField>

                        <DynamicResponseField name="billing_units" type="number">
                          Units per price increment. Usage is rounded UP when billed (e.g. billing\_units=100 means 101 rounds to 200).
                        </DynamicResponseField>

                        <DynamicResponseField name="billing_method" type="'prepaid' | 'usage_based'">
                          'prepaid' for upfront payment (seats), 'usage\_based' for pay-as-you-go.
                        </DynamicResponseField>

                        <DynamicResponseField name="max_purchase" type="number | null">
                          Max units purchasable beyond included. E.g. included=100, max\_purchase=300 allows 400 total. Null for no limit.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="proration" type="object">
                      Proration settings for prepaid features. Controls mid-cycle quantity change billing.

                      <Expandable title="properties">
                        <DynamicResponseField name="on_increase" type="'bill_immediately' | 'prorate_immediately' | 'prorate_next_cycle' | 'bill_next_cycle'">
                          Billing behavior when quantity increases mid-cycle.
                        </DynamicResponseField>

                        <DynamicResponseField name="on_decrease" type="'prorate' | 'prorate_immediately' | 'prorate_next_cycle' | 'none' | 'no_prorations'">
                          Credit behavior when quantity decreases mid-cycle.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="rollover" type="object">
                      Rollover config for unused units. If set, unused included units carry over.

                      <Expandable title="properties">
                        <DynamicResponseField name="max" type="number">
                          Max rollover units. Omit for unlimited rollover.
                        </DynamicResponseField>

                        <DynamicResponseField name="max_percentage" type="number">
                          Maximum rollover as a percentage (0-100) of included + prepaid grant. Mutually exclusive with max.
                        </DynamicResponseField>

                        <DynamicResponseField name="expiry_duration_type" type="'month' | 'forever'">
                          When rolled over units expire.
                        </DynamicResponseField>

                        <DynamicResponseField name="expiry_duration_length" type="number">
                          Number of periods before expiry.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="remove_items" type="object[]">
                  Filters selecting items to remove from the plan.

                  <Expandable title="properties">
                    <DynamicResponseField name="feature_id" type="string">
                      Match items linked to this feature.
                    </DynamicResponseField>

                    <DynamicResponseField name="billing_method" type="'prepaid' | 'usage_based'">
                      Match items with this billing method (prepaid or usage\_based).
                    </DynamicResponseField>

                    <DynamicResponseField name="interval" type="'one_off' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                      Match items with this interval. Accepts either a BillingInterval (price-side) or a ResetInterval (reset-side, includes day/hour/minute) so price-less items keyed by reset.interval can be disambiguated.
                    </DynamicResponseField>

                    <DynamicResponseField name="interval_count" type="integer">
                      Match items with this interval\_count. Disambiguates between items that share an interval but differ in count.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="free_trial" type="object | null">
                  Free trial configuration for a plan.

                  <Expandable title="properties">
                    <DynamicResponseField name="duration_length" type="number">
                      Number of duration\_type periods the trial lasts.
                    </DynamicResponseField>

                    <DynamicResponseField name="duration_type" type="'day' | 'month' | 'year'">
                      Unit of time for the trial ('day', 'month', 'year').
                    </DynamicResponseField>

                    <DynamicResponseField name="card_required" type="boolean">
                      If true, payment method required to start trial. Customer is charged after trial ends.
                    </DynamicResponseField>

                    <DynamicResponseField name="on_end" type="'bill' | 'revert'">
                      Behavior when the trial ends. 'bill' charges the customer (default). 'revert' expires the trial and restores the customer's previous plan.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="billing_controls" type="object">
                  Override the plan's billing controls (auto top-ups, spend limits, usage limits, usage alerts, overage allowed) for this customer.

                  <Expandable title="properties">
                    <DynamicResponseField name="auto_topups" type="object[]">
                      List of auto top-up configurations per feature.

                      <Expandable title="properties">
                        <DynamicResponseField name="feature_id" type="string">
                          The ID of the feature (credit balance) to auto top-up.
                        </DynamicResponseField>

                        <DynamicResponseField name="enabled" type="boolean">
                          Whether auto top-up is enabled.
                        </DynamicResponseField>

                        <DynamicResponseField name="threshold" type="number">
                          When the balance drops below this threshold, an auto top-up will be purchased.
                        </DynamicResponseField>

                        <DynamicResponseField name="quantity" type="number">
                          Amount of credits to add per auto top-up.
                        </DynamicResponseField>

                        <DynamicResponseField name="purchase_limit" type="object">
                          Optional rate limit to cap how often auto top-ups occur.

                          <Expandable title="properties">
                            <DynamicResponseField name="interval" type="'hour' | 'day' | 'week' | 'month'">
                              The time interval for the purchase limit window.
                            </DynamicResponseField>

                            <DynamicResponseField name="interval_count" type="number">
                              Number of intervals in the purchase limit window.
                            </DynamicResponseField>

                            <DynamicResponseField name="limit" type="number">
                              Maximum number of auto top-ups allowed within the interval.
                            </DynamicResponseField>
                          </Expandable>
                        </DynamicResponseField>

                        <DynamicResponseField name="invoice_mode" type="boolean">
                          When true, auto top-up creates a send\_invoice invoice instead of auto-charging.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="spend_limits" type="object[]">
                      List of overage spend limits per feature (caps overage spend).

                      <Expandable title="properties">
                        <DynamicResponseField name="feature_id" type="string">
                          Optional feature ID this spend limit applies to.
                        </DynamicResponseField>

                        <DynamicResponseField name="enabled" type="boolean">
                          Whether the overage spend limit is enabled.
                        </DynamicResponseField>

                        <DynamicResponseField name="limit_type" type="'absolute' | 'usage_percentage'">
                          How overage\_limit is interpreted: an absolute overage cap (default) or a percentage of the main-plan allowance.
                        </DynamicResponseField>

                        <DynamicResponseField name="overage_limit" type="number">
                          Overage cap for the feature: absolute units, or a percent (e.g. 120) when limit\_type is usage\_percentage.
                        </DynamicResponseField>

                        <DynamicResponseField name="skip_overage_billing" type="boolean">
                          When true, overage for this feature is not posted to Stripe. Usage tracking and balance resets still behave normally.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="usage_limits" type="object[]">
                      List of hard usage caps per feature (max units per interval).

                      <Expandable title="properties">
                        <DynamicResponseField name="feature_id" type="string">
                          The feature this usage limit applies to.
                        </DynamicResponseField>

                        <DynamicResponseField name="enabled" type="boolean">
                          Whether this usage limit is enabled.
                        </DynamicResponseField>

                        <DynamicResponseField name="limit" type="number">
                          Maximum units allowed per interval.
                        </DynamicResponseField>

                        <DynamicResponseField name="interval" type="'day' | 'week' | 'month' | 'year'">
                          Interval for the cap, aligned to the customer's billing cycle.
                        </DynamicResponseField>

                        <DynamicResponseField name="filter" type="object">
                          When set, only usage from events whose properties match counts toward this cap. Omit to count all usage of the feature.

                          <Expandable title="properties">
                            <DynamicResponseField name="properties" type="object" />
                          </Expandable>
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="usage_alerts" type="object[]">
                      List of usage alert configurations per feature.

                      <Expandable title="properties">
                        <DynamicResponseField name="feature_id" type="string">
                          The feature ID this alert applies to.
                        </DynamicResponseField>

                        <DynamicResponseField name="enabled" type="boolean">
                          Whether this usage alert is enabled.
                        </DynamicResponseField>

                        <DynamicResponseField name="threshold" type="number">
                          The threshold value that triggers the alert. For usage or remaining, this is an absolute count. For usage\_percentage or remaining\_percentage, this is a percentage (0-100).
                        </DynamicResponseField>

                        <DynamicResponseField name="threshold_type" type="'usage' | 'usage_percentage' | 'remaining' | 'remaining_percentage'">
                          Whether the threshold is an absolute count or a percentage of the usage allowance or remaining balance.
                        </DynamicResponseField>

                        <DynamicResponseField name="name" type="string">
                          Optional user-defined label to distinguish multiple alerts on the same feature.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="overage_allowed" type="object[]">
                      List of overage allowed controls per feature. When enabled, usage can exceed balance.

                      <Expandable title="properties">
                        <DynamicResponseField name="feature_id" type="string">
                          The feature ID this overage allowed control applies to.
                        </DynamicResponseField>

                        <DynamicResponseField name="enabled" type="boolean">
                          Whether overage is allowed for this feature.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="config" type="object">
          Miscellaneous plan-level configuration flags.

          <Expandable title="properties">
            <DynamicResponseField name="ignore_past_due" type="boolean">
              If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past\_due state.
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="billing_controls" type="object">
          Plan-level billing controls used as customer defaults.

          <Expandable title="properties">
            <DynamicResponseField name="auto_topups" type="object[]">
              List of auto top-up configurations per feature.

              <Expandable title="properties">
                <DynamicResponseField name="feature_id" type="string">
                  The ID of the feature (credit balance) to auto top-up.
                </DynamicResponseField>

                <DynamicResponseField name="enabled" type="boolean">
                  Whether auto top-up is enabled.
                </DynamicResponseField>

                <DynamicResponseField name="threshold" type="number">
                  When the balance drops below this threshold, an auto top-up will be purchased.
                </DynamicResponseField>

                <DynamicResponseField name="quantity" type="number">
                  Amount of credits to add per auto top-up.
                </DynamicResponseField>

                <DynamicResponseField name="purchase_limit" type="object">
                  Optional rate limit to cap how often auto top-ups occur.

                  <Expandable title="properties">
                    <DynamicResponseField name="interval" type="'hour' | 'day' | 'week' | 'month'">
                      The time interval for the purchase limit window.
                    </DynamicResponseField>

                    <DynamicResponseField name="interval_count" type="number">
                      Number of intervals in the purchase limit window.
                    </DynamicResponseField>

                    <DynamicResponseField name="limit" type="number">
                      Maximum number of auto top-ups allowed within the interval.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="invoice_mode" type="boolean">
                  When true, auto top-up creates a send\_invoice invoice instead of auto-charging.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="spend_limits" type="object[]">
              List of overage spend limits per feature (caps overage spend).

              <Expandable title="properties">
                <DynamicResponseField name="feature_id" type="string">
                  Optional feature ID this spend limit applies to.
                </DynamicResponseField>

                <DynamicResponseField name="enabled" type="boolean">
                  Whether the overage spend limit is enabled.
                </DynamicResponseField>

                <DynamicResponseField name="limit_type" type="'absolute' | 'usage_percentage'">
                  How overage\_limit is interpreted: an absolute overage cap (default) or a percentage of the main-plan allowance.
                </DynamicResponseField>

                <DynamicResponseField name="overage_limit" type="number">
                  Overage cap for the feature: absolute units, or a percent (e.g. 120) when limit\_type is usage\_percentage.
                </DynamicResponseField>

                <DynamicResponseField name="skip_overage_billing" type="boolean">
                  When true, overage for this feature is not posted to Stripe. Usage tracking and balance resets still behave normally.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="usage_limits" type="object[]">
              List of hard usage caps per feature (max units per interval).

              <Expandable title="properties">
                <DynamicResponseField name="feature_id" type="string">
                  The feature this usage limit applies to.
                </DynamicResponseField>

                <DynamicResponseField name="enabled" type="boolean">
                  Whether this usage limit is enabled.
                </DynamicResponseField>

                <DynamicResponseField name="limit" type="number">
                  Maximum units allowed per interval.
                </DynamicResponseField>

                <DynamicResponseField name="interval" type="'day' | 'week' | 'month' | 'year'">
                  Interval for the cap, aligned to the customer's billing cycle.
                </DynamicResponseField>

                <DynamicResponseField name="filter" type="object">
                  When set, only usage from events whose properties match counts toward this cap. Omit to count all usage of the feature.

                  <Expandable title="properties">
                    <DynamicResponseField name="properties" type="object" />
                  </Expandable>
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="usage_alerts" type="object[]">
              List of usage alert configurations per feature.

              <Expandable title="properties">
                <DynamicResponseField name="feature_id" type="string">
                  The feature ID this alert applies to.
                </DynamicResponseField>

                <DynamicResponseField name="enabled" type="boolean">
                  Whether this usage alert is enabled.
                </DynamicResponseField>

                <DynamicResponseField name="threshold" type="number">
                  The threshold value that triggers the alert. For usage or remaining, this is an absolute count. For usage\_percentage or remaining\_percentage, this is a percentage (0-100).
                </DynamicResponseField>

                <DynamicResponseField name="threshold_type" type="'usage' | 'usage_percentage' | 'remaining' | 'remaining_percentage'">
                  Whether the threshold is an absolute count or a percentage of the usage allowance or remaining balance.
                </DynamicResponseField>

                <DynamicResponseField name="name" type="string">
                  Optional user-defined label to distinguish multiple alerts on the same feature.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="overage_allowed" type="object[]">
              List of overage allowed controls per feature. When enabled, usage can exceed balance.

              <Expandable title="properties">
                <DynamicResponseField name="feature_id" type="string">
                  The feature ID this overage allowed control applies to.
                </DynamicResponseField>

                <DynamicResponseField name="enabled" type="boolean">
                  Whether overage is allowed for this feature.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="metadata" type="object">
          Arbitrary key-value metadata defined by you for your own use. Shared across all versions of the plan.
        </DynamicResponseField>

        <DynamicResponseField name="customer_eligibility" type="object">
          <Expandable title="properties">
            <DynamicResponseField name="trial_available" type="boolean">
              Whether the trial on this plan is available to this customer. For example, if the customer used the trial in the past, this will be false.
            </DynamicResponseField>

            <DynamicResponseField name="status" type="'active' | 'scheduled'">
              The customer's current status with this plan. 'active' if attached, 'scheduled' if pending activation.
            </DynamicResponseField>

            <DynamicResponseField name="canceling" type="boolean">
              Whether the customer's active instance of this plan is set to cancel.
            </DynamicResponseField>

            <DynamicResponseField name="trialing" type="boolean">
              Whether the customer is currently on a free trial of this plan.
            </DynamicResponseField>

            <DynamicResponseField name="attach_action" type="'activate' | 'upgrade' | 'downgrade' | 'none' | 'purchase'">
              The action that would occur if this plan were attached to the customer.
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>
      </Expandable>
    </DynamicResponseField>

    <DynamicResponseField name="plan_id" type="string">
      The unique identifier of the subscribed plan.
    </DynamicResponseField>

    <DynamicResponseField name="auto_enable" type="boolean">
      Whether the plan was automatically enabled for the customer.
    </DynamicResponseField>

    <DynamicResponseField name="add_on" type="boolean">
      Whether this is an add-on plan rather than a base subscription.
    </DynamicResponseField>

    <DynamicResponseField name="status" type="'active' | 'scheduled'">
      Current status of the subscription.
    </DynamicResponseField>

    <DynamicResponseField name="past_due" type="boolean">
      Whether the subscription has overdue payments.
    </DynamicResponseField>

    <DynamicResponseField name="canceled_at" type="number | null">
      Timestamp when the subscription was canceled, or null if not canceled.
    </DynamicResponseField>

    <DynamicResponseField name="expires_at" type="number | null">
      Timestamp when the subscription will expire, or null if no expiry set.
    </DynamicResponseField>

    <DynamicResponseField name="trial_ends_at" type="number | null">
      Timestamp when the trial period ends, or null if not on trial.
    </DynamicResponseField>

    <DynamicResponseField name="started_at" type="number">
      Timestamp when the subscription started.
    </DynamicResponseField>

    <DynamicResponseField name="current_period_start" type="number | null">
      Start timestamp of the current billing period.
    </DynamicResponseField>

    <DynamicResponseField name="current_period_end" type="number | null">
      End timestamp of the current billing period.
    </DynamicResponseField>

    <DynamicResponseField name="quantity" type="number">
      Number of units of this subscription (for per-seat plans).
    </DynamicResponseField>

    <DynamicResponseField name="scope" type="'customer' | 'entity'">
      Whether this subscription is attached at the customer level or entity level.
    </DynamicResponseField>
  </Expandable>
</DynamicResponseField>

<DynamicResponseField name="purchases" type="object[]">
  <Expandable title="properties">
    <DynamicResponseField name="plan" type="object">
      The full plan object if expanded.

      <Expandable title="properties">
        <DynamicResponseField name="id" type="string">
          Unique identifier for the plan.
        </DynamicResponseField>

        <DynamicResponseField name="name" type="string">
          Display name of the plan.
        </DynamicResponseField>

        <DynamicResponseField name="description" type="string | null">
          Optional description of the plan.
        </DynamicResponseField>

        <DynamicResponseField name="group" type="string | null">
          Group identifier for organizing related plans. Plans in the same group are mutually exclusive.
        </DynamicResponseField>

        <DynamicResponseField name="version" type="number">
          Version number of the plan. Incremented when plan configuration changes.
        </DynamicResponseField>

        <DynamicResponseField name="add_on" type="boolean">
          Whether this is an add-on plan that can be attached alongside a main plan.
        </DynamicResponseField>

        <DynamicResponseField name="auto_enable" type="boolean">
          If true, this plan is automatically attached when a customer is created. Used for free plans.
        </DynamicResponseField>

        <DynamicResponseField name="price" type="object | null">
          Base recurring price for the plan. Null for free plans or usage-only plans.

          <Expandable title="properties">
            <DynamicResponseField name="amount" type="number">
              Base price amount for the plan.
            </DynamicResponseField>

            <DynamicResponseField name="additional_currencies" type="object[]">
              Base price amounts in additional currencies. The base 'amount' is in the org's default currency.

              <Expandable title="properties">
                <DynamicResponseField name="currency" type="string">
                  Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                </DynamicResponseField>

                <DynamicResponseField name="amount" type="number">
                  Price amount in this currency. Set explicitly per currency, not converted from the base amount.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="interval" type="'one_off' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
              Billing interval (e.g. 'month', 'year').
            </DynamicResponseField>

            <DynamicResponseField name="interval_count" type="number">
              Number of intervals per billing cycle. Defaults to 1.
            </DynamicResponseField>

            <DynamicResponseField name="display" type="object">
              Display text for showing this price in pricing pages.

              <Expandable title="properties">
                <DynamicResponseField name="primary_text" type="string">
                  Main display text (e.g. '\$10' or '100 messages').
                </DynamicResponseField>

                <DynamicResponseField name="secondary_text" type="string">
                  Secondary display text (e.g. 'per month' or 'then \$0.5 per 100').
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="items" type="object[]">
          Feature configurations included in this plan. Each item defines included units, pricing, and reset behavior for a feature.

          <Expandable title="properties">
            <DynamicResponseField name="feature_id" type="string">
              The ID of the feature this item configures.
            </DynamicResponseField>

            <DynamicResponseField name="feature" type="object">
              The full feature object if expanded.

              <Expandable title="properties">
                <DynamicResponseField name="id" type="string">
                  The ID of the feature, used to refer to it in other API calls like /track or /check.
                </DynamicResponseField>

                <DynamicResponseField name="name" type="string | null">
                  The name of the feature.
                </DynamicResponseField>

                <DynamicResponseField name="type" type="'static' | 'boolean' | 'single_use' | 'continuous_use' | 'credit_system' | 'ai_credit_system'">
                  The type of the feature
                </DynamicResponseField>

                <DynamicResponseField name="display" type="object | null">
                  Singular and plural display names for the feature.

                  <Expandable title="properties">
                    <DynamicResponseField name="singular" type="string">
                      The singular display name for the feature.
                    </DynamicResponseField>

                    <DynamicResponseField name="plural" type="string">
                      The plural display name for the feature.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="credit_schema" type="object[] | null">
                  Credit cost schema for credit system features.

                  <Expandable title="properties">
                    <DynamicResponseField name="metered_feature_id" type="string">
                      The ID of the metered feature (should be a single\_use feature).
                    </DynamicResponseField>

                    <DynamicResponseField name="credit_cost" type="number">
                      The credit cost of the metered feature.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="archived" type="boolean | null">
                  Whether or not the feature is archived.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="included" type="number">
              Number of free units included. For consumable features, balance resets to this number each interval.
            </DynamicResponseField>

            <DynamicResponseField name="unlimited" type="boolean">
              Whether the customer has unlimited access to this feature.
            </DynamicResponseField>

            <DynamicResponseField name="reset" type="object | null">
              Reset configuration for consumable features. Null for non-consumable features like seats where usage persists across billing cycles.

              <Expandable title="properties">
                <DynamicResponseField name="interval" type="'one_off' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                  The interval at which the feature balance resets (e.g. 'month', 'year'). For consumable features, usage resets to 0 and included units are restored.
                </DynamicResponseField>

                <DynamicResponseField name="interval_count" type="number">
                  Number of intervals between resets. Defaults to 1.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="price" type="object | null">
              Pricing configuration for usage beyond included units. Null if feature is entirely free.

              <Expandable title="properties">
                <DynamicResponseField name="amount" type="number">
                  Price per billing\_units after included usage is consumed. Mutually exclusive with tiers.
                </DynamicResponseField>

                <DynamicResponseField name="additional_currencies" type="object[]">
                  Amounts in additional currencies for this flat price. The base 'amount' is in the org's default currency. Only valid with 'amount', not 'tiers' (tiered prices carry per-currency amounts on each tier).

                  <Expandable title="properties">
                    <DynamicResponseField name="currency" type="string">
                      Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                    </DynamicResponseField>

                    <DynamicResponseField name="amount" type="number">
                      Price amount in this currency. Set explicitly per currency, not converted from the base amount.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="tiers" type="object[]">
                  Tiered pricing configuration. Each tier's 'to' INCLUDES the included amount. Either 'tiers' or 'amount' is required.

                  <Expandable title="properties">
                    <DynamicResponseField name="to" type="number" />

                    <DynamicResponseField name="amount" type="number" />

                    <DynamicResponseField name="flat_amount" type="number" />

                    <DynamicResponseField name="additional_currencies" type="object[]">
                      <Expandable title="properties">
                        <DynamicResponseField name="currency" type="string">
                          Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                        </DynamicResponseField>

                        <DynamicResponseField name="amount" type="number">
                          Per-unit amount for this tier in this currency.
                        </DynamicResponseField>

                        <DynamicResponseField name="flat_amount" type="number">
                          Flat amount for this tier in this currency, if the tier uses one.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="tier_behavior" type="'graduated' | 'volume'" />

                <DynamicResponseField name="interval" type="'one_off' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                  Billing interval for this price. For consumable features, should match reset.interval.
                </DynamicResponseField>

                <DynamicResponseField name="interval_count" type="number">
                  Number of intervals per billing cycle. Defaults to 1.
                </DynamicResponseField>

                <DynamicResponseField name="billing_units" type="number">
                  Number of units per price increment. Usage is rounded UP to the nearest billing\_units when billed (e.g. billing\_units=100 means 101 usage rounds to 200).
                </DynamicResponseField>

                <DynamicResponseField name="billing_method" type="'prepaid' | 'usage_based'">
                  'prepaid' for features like seats where customers pay upfront, 'usage\_based' for pay-as-you-go after included usage.
                </DynamicResponseField>

                <DynamicResponseField name="max_purchase" type="number | null">
                  Maximum units a customer can purchase beyond included. E.g. if included=100 and max\_purchase=300, customer can use up to 400 total before usage is capped. Null for no limit.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="display" type="object">
              Display text for showing this item in pricing pages.

              <Expandable title="properties">
                <DynamicResponseField name="primary_text" type="string">
                  Main display text (e.g. '\$10' or '100 messages').
                </DynamicResponseField>

                <DynamicResponseField name="secondary_text" type="string">
                  Secondary display text (e.g. 'per month' or 'then \$0.5 per 100').
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="rollover" type="object">
              Rollover configuration for unused units. If set, unused included units roll over to the next period.

              <Expandable title="properties">
                <DynamicResponseField name="max" type="number | null">
                  Maximum rollover units. Null for unlimited rollover.
                </DynamicResponseField>

                <DynamicResponseField name="max_percentage" type="number | null">
                  Maximum rollover as a percentage (0-100) of included + prepaid grant. Mutually exclusive with max.
                </DynamicResponseField>

                <DynamicResponseField name="expiry_duration_type" type="'month' | 'forever'">
                  When rolled over units expire.
                </DynamicResponseField>

                <DynamicResponseField name="expiry_duration_length" type="number">
                  Number of periods before expiry.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="free_trial" type="object">
          Free trial configuration. If set, new customers can try this plan before being charged.

          <Expandable title="properties">
            <DynamicResponseField name="duration_length" type="number">
              Number of duration\_type periods the trial lasts.
            </DynamicResponseField>

            <DynamicResponseField name="duration_type" type="'day' | 'month' | 'year'">
              Unit of time for the trial duration ('day', 'month', 'year').
            </DynamicResponseField>

            <DynamicResponseField name="card_required" type="boolean">
              Whether a payment method is required to start the trial. If true, customer will be charged after trial ends.
            </DynamicResponseField>

            <DynamicResponseField name="on_end" type="'bill' | 'revert'">
              Behavior when the trial ends. 'bill' charges the customer (default). 'revert' expires the trial and restores the customer's previous plan.
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="created_at" type="number">
          Unix timestamp (ms) when the plan was created.
        </DynamicResponseField>

        <DynamicResponseField name="env" type="'sandbox' | 'live'">
          Environment this plan belongs to ('sandbox' or 'live').
        </DynamicResponseField>

        <DynamicResponseField name="archived" type="boolean">
          Whether the plan is archived. Archived plans cannot be attached to new customers.
        </DynamicResponseField>

        <DynamicResponseField name="base_variant_id" type="string | null">
          Deprecated. Use variant\_details.base\_plan\_id instead. If this is a variant, the ID of the base plan it was created from.
        </DynamicResponseField>

        <DynamicResponseField name="variant_details" type="object">
          Details about how this variant relates to its latest base plan.

          <Expandable title="properties">
            <DynamicResponseField name="base_plan_id" type="string">
              The ID of the base plan this variant was derived from.
            </DynamicResponseField>

            <DynamicResponseField name="customize" type="object">
              The customization that transforms the base plan into this variant.

              <Expandable title="properties">
                <DynamicResponseField name="price" type="object | null">
                  Base price configuration for a plan.

                  <Expandable title="properties">
                    <DynamicResponseField name="amount" type="number">
                      Base price amount for the plan.
                    </DynamicResponseField>

                    <DynamicResponseField name="interval" type="'one_off' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                      Billing interval (e.g. 'month', 'year').
                    </DynamicResponseField>

                    <DynamicResponseField name="interval_count" type="number">
                      Number of intervals per billing cycle. Defaults to 1.
                    </DynamicResponseField>

                    <DynamicResponseField name="additional_currencies" type="object[]">
                      Base price amounts in additional currencies. The base 'amount' is in the org's default currency.

                      <Expandable title="properties">
                        <DynamicResponseField name="currency" type="string">
                          Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                        </DynamicResponseField>

                        <DynamicResponseField name="amount" type="number">
                          Price amount in this currency. Set explicitly per currency, not converted from the base amount.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="add_items" type="object[]">
                  Items to add to the plan.

                  <Expandable title="properties">
                    <DynamicResponseField name="feature_id" type="string">
                      The ID of the feature to configure.
                    </DynamicResponseField>

                    <DynamicResponseField name="included" type="number">
                      Number of free units included. Balance resets to this each interval for consumable features.
                    </DynamicResponseField>

                    <DynamicResponseField name="unlimited" type="boolean">
                      If true, customer has unlimited access to this feature.
                    </DynamicResponseField>

                    <DynamicResponseField name="reset" type="object">
                      Reset configuration for consumable features. Omit for non-consumable features like seats.

                      <Expandable title="properties">
                        <DynamicResponseField name="interval" type="'one_off' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                          Interval at which balance resets (e.g. 'month', 'year'). For consumable features only.
                        </DynamicResponseField>

                        <DynamicResponseField name="interval_count" type="number">
                          Number of intervals between resets. Defaults to 1.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="price" type="object">
                      Pricing for usage beyond included units. Omit for free features.

                      <Expandable title="properties">
                        <DynamicResponseField name="amount" type="number">
                          Price per billing\_units after included usage. Either 'amount' or 'tiers' is required.
                        </DynamicResponseField>

                        <DynamicResponseField name="additional_currencies" type="object[]">
                          Amounts in additional currencies for this flat price. The base 'amount' is in the org's default currency. Only valid with 'amount', not 'tiers'.

                          <Expandable title="properties">
                            <DynamicResponseField name="currency" type="string">
                              Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                            </DynamicResponseField>

                            <DynamicResponseField name="amount" type="number">
                              Price amount in this currency. Set explicitly per currency, not converted from the base amount.
                            </DynamicResponseField>
                          </Expandable>
                        </DynamicResponseField>

                        <DynamicResponseField name="tiers" type="object[]">
                          Tiered pricing. Either 'amount' or 'tiers' is required.

                          <Expandable title="properties">
                            <DynamicResponseField name="to" type="number" />

                            <DynamicResponseField name="amount" type="number" />

                            <DynamicResponseField name="flat_amount" type="number" />

                            <DynamicResponseField name="additional_currencies" type="object[]">
                              <Expandable title="properties">
                                <DynamicResponseField name="currency" type="string">
                                  Three-letter Stripe-supported currency code (e.g. 'eur', 'gbp').
                                </DynamicResponseField>

                                <DynamicResponseField name="amount" type="number">
                                  Per-unit amount for this tier in this currency.
                                </DynamicResponseField>

                                <DynamicResponseField name="flat_amount" type="number">
                                  Flat amount for this tier in this currency, if the tier uses one.
                                </DynamicResponseField>
                              </Expandable>
                            </DynamicResponseField>
                          </Expandable>
                        </DynamicResponseField>

                        <DynamicResponseField name="tier_behavior" type="'graduated' | 'volume'" />

                        <DynamicResponseField name="interval" type="'one_off' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                          Billing interval. For consumable features, should match reset.interval.
                        </DynamicResponseField>

                        <DynamicResponseField name="interval_count" type="number">
                          Number of intervals per billing cycle. Defaults to 1.
                        </DynamicResponseField>

                        <DynamicResponseField name="billing_units" type="number">
                          Units per price increment. Usage is rounded UP when billed (e.g. billing\_units=100 means 101 rounds to 200).
                        </DynamicResponseField>

                        <DynamicResponseField name="billing_method" type="'prepaid' | 'usage_based'">
                          'prepaid' for upfront payment (seats), 'usage\_based' for pay-as-you-go.
                        </DynamicResponseField>

                        <DynamicResponseField name="max_purchase" type="number | null">
                          Max units purchasable beyond included. E.g. included=100, max\_purchase=300 allows 400 total. Null for no limit.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="proration" type="object">
                      Proration settings for prepaid features. Controls mid-cycle quantity change billing.

                      <Expandable title="properties">
                        <DynamicResponseField name="on_increase" type="'bill_immediately' | 'prorate_immediately' | 'prorate_next_cycle' | 'bill_next_cycle'">
                          Billing behavior when quantity increases mid-cycle.
                        </DynamicResponseField>

                        <DynamicResponseField name="on_decrease" type="'prorate' | 'prorate_immediately' | 'prorate_next_cycle' | 'none' | 'no_prorations'">
                          Credit behavior when quantity decreases mid-cycle.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="rollover" type="object">
                      Rollover config for unused units. If set, unused included units carry over.

                      <Expandable title="properties">
                        <DynamicResponseField name="max" type="number">
                          Max rollover units. Omit for unlimited rollover.
                        </DynamicResponseField>

                        <DynamicResponseField name="max_percentage" type="number">
                          Maximum rollover as a percentage (0-100) of included + prepaid grant. Mutually exclusive with max.
                        </DynamicResponseField>

                        <DynamicResponseField name="expiry_duration_type" type="'month' | 'forever'">
                          When rolled over units expire.
                        </DynamicResponseField>

                        <DynamicResponseField name="expiry_duration_length" type="number">
                          Number of periods before expiry.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="remove_items" type="object[]">
                  Filters selecting items to remove from the plan.

                  <Expandable title="properties">
                    <DynamicResponseField name="feature_id" type="string">
                      Match items linked to this feature.
                    </DynamicResponseField>

                    <DynamicResponseField name="billing_method" type="'prepaid' | 'usage_based'">
                      Match items with this billing method (prepaid or usage\_based).
                    </DynamicResponseField>

                    <DynamicResponseField name="interval" type="'one_off' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
                      Match items with this interval. Accepts either a BillingInterval (price-side) or a ResetInterval (reset-side, includes day/hour/minute) so price-less items keyed by reset.interval can be disambiguated.
                    </DynamicResponseField>

                    <DynamicResponseField name="interval_count" type="integer">
                      Match items with this interval\_count. Disambiguates between items that share an interval but differ in count.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="free_trial" type="object | null">
                  Free trial configuration for a plan.

                  <Expandable title="properties">
                    <DynamicResponseField name="duration_length" type="number">
                      Number of duration\_type periods the trial lasts.
                    </DynamicResponseField>

                    <DynamicResponseField name="duration_type" type="'day' | 'month' | 'year'">
                      Unit of time for the trial ('day', 'month', 'year').
                    </DynamicResponseField>

                    <DynamicResponseField name="card_required" type="boolean">
                      If true, payment method required to start trial. Customer is charged after trial ends.
                    </DynamicResponseField>

                    <DynamicResponseField name="on_end" type="'bill' | 'revert'">
                      Behavior when the trial ends. 'bill' charges the customer (default). 'revert' expires the trial and restores the customer's previous plan.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="billing_controls" type="object">
                  Override the plan's billing controls (auto top-ups, spend limits, usage limits, usage alerts, overage allowed) for this customer.

                  <Expandable title="properties">
                    <DynamicResponseField name="auto_topups" type="object[]">
                      List of auto top-up configurations per feature.

                      <Expandable title="properties">
                        <DynamicResponseField name="feature_id" type="string">
                          The ID of the feature (credit balance) to auto top-up.
                        </DynamicResponseField>

                        <DynamicResponseField name="enabled" type="boolean">
                          Whether auto top-up is enabled.
                        </DynamicResponseField>

                        <DynamicResponseField name="threshold" type="number">
                          When the balance drops below this threshold, an auto top-up will be purchased.
                        </DynamicResponseField>

                        <DynamicResponseField name="quantity" type="number">
                          Amount of credits to add per auto top-up.
                        </DynamicResponseField>

                        <DynamicResponseField name="purchase_limit" type="object">
                          Optional rate limit to cap how often auto top-ups occur.

                          <Expandable title="properties">
                            <DynamicResponseField name="interval" type="'hour' | 'day' | 'week' | 'month'">
                              The time interval for the purchase limit window.
                            </DynamicResponseField>

                            <DynamicResponseField name="interval_count" type="number">
                              Number of intervals in the purchase limit window.
                            </DynamicResponseField>

                            <DynamicResponseField name="limit" type="number">
                              Maximum number of auto top-ups allowed within the interval.
                            </DynamicResponseField>
                          </Expandable>
                        </DynamicResponseField>

                        <DynamicResponseField name="invoice_mode" type="boolean">
                          When true, auto top-up creates a send\_invoice invoice instead of auto-charging.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="spend_limits" type="object[]">
                      List of overage spend limits per feature (caps overage spend).

                      <Expandable title="properties">
                        <DynamicResponseField name="feature_id" type="string">
                          Optional feature ID this spend limit applies to.
                        </DynamicResponseField>

                        <DynamicResponseField name="enabled" type="boolean">
                          Whether the overage spend limit is enabled.
                        </DynamicResponseField>

                        <DynamicResponseField name="limit_type" type="'absolute' | 'usage_percentage'">
                          How overage\_limit is interpreted: an absolute overage cap (default) or a percentage of the main-plan allowance.
                        </DynamicResponseField>

                        <DynamicResponseField name="overage_limit" type="number">
                          Overage cap for the feature: absolute units, or a percent (e.g. 120) when limit\_type is usage\_percentage.
                        </DynamicResponseField>

                        <DynamicResponseField name="skip_overage_billing" type="boolean">
                          When true, overage for this feature is not posted to Stripe. Usage tracking and balance resets still behave normally.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="usage_limits" type="object[]">
                      List of hard usage caps per feature (max units per interval).

                      <Expandable title="properties">
                        <DynamicResponseField name="feature_id" type="string">
                          The feature this usage limit applies to.
                        </DynamicResponseField>

                        <DynamicResponseField name="enabled" type="boolean">
                          Whether this usage limit is enabled.
                        </DynamicResponseField>

                        <DynamicResponseField name="limit" type="number">
                          Maximum units allowed per interval.
                        </DynamicResponseField>

                        <DynamicResponseField name="interval" type="'day' | 'week' | 'month' | 'year'">
                          Interval for the cap, aligned to the customer's billing cycle.
                        </DynamicResponseField>

                        <DynamicResponseField name="filter" type="object">
                          When set, only usage from events whose properties match counts toward this cap. Omit to count all usage of the feature.

                          <Expandable title="properties">
                            <DynamicResponseField name="properties" type="object" />
                          </Expandable>
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="usage_alerts" type="object[]">
                      List of usage alert configurations per feature.

                      <Expandable title="properties">
                        <DynamicResponseField name="feature_id" type="string">
                          The feature ID this alert applies to.
                        </DynamicResponseField>

                        <DynamicResponseField name="enabled" type="boolean">
                          Whether this usage alert is enabled.
                        </DynamicResponseField>

                        <DynamicResponseField name="threshold" type="number">
                          The threshold value that triggers the alert. For usage or remaining, this is an absolute count. For usage\_percentage or remaining\_percentage, this is a percentage (0-100).
                        </DynamicResponseField>

                        <DynamicResponseField name="threshold_type" type="'usage' | 'usage_percentage' | 'remaining' | 'remaining_percentage'">
                          Whether the threshold is an absolute count or a percentage of the usage allowance or remaining balance.
                        </DynamicResponseField>

                        <DynamicResponseField name="name" type="string">
                          Optional user-defined label to distinguish multiple alerts on the same feature.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>

                    <DynamicResponseField name="overage_allowed" type="object[]">
                      List of overage allowed controls per feature. When enabled, usage can exceed balance.

                      <Expandable title="properties">
                        <DynamicResponseField name="feature_id" type="string">
                          The feature ID this overage allowed control applies to.
                        </DynamicResponseField>

                        <DynamicResponseField name="enabled" type="boolean">
                          Whether overage is allowed for this feature.
                        </DynamicResponseField>
                      </Expandable>
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="config" type="object">
          Miscellaneous plan-level configuration flags.

          <Expandable title="properties">
            <DynamicResponseField name="ignore_past_due" type="boolean">
              If true, entitlements attached to this plan will still reset on schedule even when the customer's product is in a past\_due state.
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="billing_controls" type="object">
          Plan-level billing controls used as customer defaults.

          <Expandable title="properties">
            <DynamicResponseField name="auto_topups" type="object[]">
              List of auto top-up configurations per feature.

              <Expandable title="properties">
                <DynamicResponseField name="feature_id" type="string">
                  The ID of the feature (credit balance) to auto top-up.
                </DynamicResponseField>

                <DynamicResponseField name="enabled" type="boolean">
                  Whether auto top-up is enabled.
                </DynamicResponseField>

                <DynamicResponseField name="threshold" type="number">
                  When the balance drops below this threshold, an auto top-up will be purchased.
                </DynamicResponseField>

                <DynamicResponseField name="quantity" type="number">
                  Amount of credits to add per auto top-up.
                </DynamicResponseField>

                <DynamicResponseField name="purchase_limit" type="object">
                  Optional rate limit to cap how often auto top-ups occur.

                  <Expandable title="properties">
                    <DynamicResponseField name="interval" type="'hour' | 'day' | 'week' | 'month'">
                      The time interval for the purchase limit window.
                    </DynamicResponseField>

                    <DynamicResponseField name="interval_count" type="number">
                      Number of intervals in the purchase limit window.
                    </DynamicResponseField>

                    <DynamicResponseField name="limit" type="number">
                      Maximum number of auto top-ups allowed within the interval.
                    </DynamicResponseField>
                  </Expandable>
                </DynamicResponseField>

                <DynamicResponseField name="invoice_mode" type="boolean">
                  When true, auto top-up creates a send\_invoice invoice instead of auto-charging.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="spend_limits" type="object[]">
              List of overage spend limits per feature (caps overage spend).

              <Expandable title="properties">
                <DynamicResponseField name="feature_id" type="string">
                  Optional feature ID this spend limit applies to.
                </DynamicResponseField>

                <DynamicResponseField name="enabled" type="boolean">
                  Whether the overage spend limit is enabled.
                </DynamicResponseField>

                <DynamicResponseField name="limit_type" type="'absolute' | 'usage_percentage'">
                  How overage\_limit is interpreted: an absolute overage cap (default) or a percentage of the main-plan allowance.
                </DynamicResponseField>

                <DynamicResponseField name="overage_limit" type="number">
                  Overage cap for the feature: absolute units, or a percent (e.g. 120) when limit\_type is usage\_percentage.
                </DynamicResponseField>

                <DynamicResponseField name="skip_overage_billing" type="boolean">
                  When true, overage for this feature is not posted to Stripe. Usage tracking and balance resets still behave normally.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="usage_limits" type="object[]">
              List of hard usage caps per feature (max units per interval).

              <Expandable title="properties">
                <DynamicResponseField name="feature_id" type="string">
                  The feature this usage limit applies to.
                </DynamicResponseField>

                <DynamicResponseField name="enabled" type="boolean">
                  Whether this usage limit is enabled.
                </DynamicResponseField>

                <DynamicResponseField name="limit" type="number">
                  Maximum units allowed per interval.
                </DynamicResponseField>

                <DynamicResponseField name="interval" type="'day' | 'week' | 'month' | 'year'">
                  Interval for the cap, aligned to the customer's billing cycle.
                </DynamicResponseField>

                <DynamicResponseField name="filter" type="object">
                  When set, only usage from events whose properties match counts toward this cap. Omit to count all usage of the feature.

                  <Expandable title="properties">
                    <DynamicResponseField name="properties" type="object" />
                  </Expandable>
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="usage_alerts" type="object[]">
              List of usage alert configurations per feature.

              <Expandable title="properties">
                <DynamicResponseField name="feature_id" type="string">
                  The feature ID this alert applies to.
                </DynamicResponseField>

                <DynamicResponseField name="enabled" type="boolean">
                  Whether this usage alert is enabled.
                </DynamicResponseField>

                <DynamicResponseField name="threshold" type="number">
                  The threshold value that triggers the alert. For usage or remaining, this is an absolute count. For usage\_percentage or remaining\_percentage, this is a percentage (0-100).
                </DynamicResponseField>

                <DynamicResponseField name="threshold_type" type="'usage' | 'usage_percentage' | 'remaining' | 'remaining_percentage'">
                  Whether the threshold is an absolute count or a percentage of the usage allowance or remaining balance.
                </DynamicResponseField>

                <DynamicResponseField name="name" type="string">
                  Optional user-defined label to distinguish multiple alerts on the same feature.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="overage_allowed" type="object[]">
              List of overage allowed controls per feature. When enabled, usage can exceed balance.

              <Expandable title="properties">
                <DynamicResponseField name="feature_id" type="string">
                  The feature ID this overage allowed control applies to.
                </DynamicResponseField>

                <DynamicResponseField name="enabled" type="boolean">
                  Whether overage is allowed for this feature.
                </DynamicResponseField>
              </Expandable>
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="metadata" type="object">
          Arbitrary key-value metadata defined by you for your own use. Shared across all versions of the plan.
        </DynamicResponseField>

        <DynamicResponseField name="customer_eligibility" type="object">
          <Expandable title="properties">
            <DynamicResponseField name="trial_available" type="boolean">
              Whether the trial on this plan is available to this customer. For example, if the customer used the trial in the past, this will be false.
            </DynamicResponseField>

            <DynamicResponseField name="status" type="'active' | 'scheduled'">
              The customer's current status with this plan. 'active' if attached, 'scheduled' if pending activation.
            </DynamicResponseField>

            <DynamicResponseField name="canceling" type="boolean">
              Whether the customer's active instance of this plan is set to cancel.
            </DynamicResponseField>

            <DynamicResponseField name="trialing" type="boolean">
              Whether the customer is currently on a free trial of this plan.
            </DynamicResponseField>

            <DynamicResponseField name="attach_action" type="'activate' | 'upgrade' | 'downgrade' | 'none' | 'purchase'">
              The action that would occur if this plan were attached to the customer.
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>
      </Expandable>
    </DynamicResponseField>

    <DynamicResponseField name="plan_id" type="string">
      The unique identifier of the purchased plan.
    </DynamicResponseField>

    <DynamicResponseField name="expires_at" type="number | null">
      Timestamp when the purchase expires, or null for lifetime access.
    </DynamicResponseField>

    <DynamicResponseField name="started_at" type="number">
      Timestamp when the purchase was made.
    </DynamicResponseField>

    <DynamicResponseField name="quantity" type="number">
      Number of units purchased.
    </DynamicResponseField>

    <DynamicResponseField name="scope" type="'customer' | 'entity'">
      Whether this purchase is attached at the customer level or entity level.
    </DynamicResponseField>
  </Expandable>
</DynamicResponseField>

<DynamicResponseField name="balances.{key}" type="object">
  <Expandable title="properties">
    <DynamicResponseField name="feature_id" type="string">
      The feature ID this balance is for.
    </DynamicResponseField>

    <DynamicResponseField name="feature" type="object">
      The full feature object if expanded.

      <Expandable title="properties">
        <DynamicResponseField name="id" type="string">
          The unique identifier for this feature, used in /check and /track calls.
        </DynamicResponseField>

        <DynamicResponseField name="name" type="string">
          Human-readable name displayed in the dashboard and billing UI.
        </DynamicResponseField>

        <DynamicResponseField name="type" type="'boolean' | 'metered' | 'credit_system' | 'ai_credit_system'">
          Feature type: 'boolean' for on/off access, 'metered' for usage-tracked features, 'credit\_system' for unified credit pools, 'ai\_credit\_system' for model-based token pricing.
        </DynamicResponseField>

        <DynamicResponseField name="consumable" type="boolean">
          For metered features: true if usage resets periodically (API calls, credits), false if allocated persistently (seats, storage).
        </DynamicResponseField>

        <DynamicResponseField name="event_names" type="string[]">
          Event names that trigger this feature's balance. Allows multiple features to respond to a single event.
        </DynamicResponseField>

        <DynamicResponseField name="credit_schema" type="object[]">
          For credit\_system features: maps metered features to their credit costs.

          <Expandable title="properties">
            <DynamicResponseField name="metered_feature_id" type="string">
              ID of the metered feature that draws from this credit system.
            </DynamicResponseField>

            <DynamicResponseField name="credit_cost" type="number">
              Credits consumed per unit of the metered feature.
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="model_markups.{key}" type="object | null">
          Per-model markup overrides for AI credit systems.

          <Expandable title="properties">
            <DynamicResponseField name="markup" type="number" />

            <DynamicResponseField name="input_cost" type="number" />

            <DynamicResponseField name="output_cost" type="number" />
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="default_markup" type="number">
          Default percentage markup for AI credit systems. Use -100 to make usage free.
        </DynamicResponseField>

        <DynamicResponseField name="provider_markups.{key}" type="object | null">
          Per-provider default markup percentages for AI credit systems.

          <Expandable title="properties">
            <DynamicResponseField name="markup" type="number" />
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="display" type="object">
          Display names for the feature in billing UI and customer-facing components.

          <Expandable title="properties">
            <DynamicResponseField name="singular" type="string | null">
              Singular form for UI display (e.g., 'API call', 'seat').
            </DynamicResponseField>

            <DynamicResponseField name="plural" type="string | null">
              Plural form for UI display (e.g., 'API calls', 'seats').
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="archived" type="boolean">
          Whether the feature is archived and hidden from the dashboard.
        </DynamicResponseField>
      </Expandable>
    </DynamicResponseField>

    <DynamicResponseField name="granted" type="number">
      Total balance granted (included + prepaid).
    </DynamicResponseField>

    <DynamicResponseField name="remaining" type="number">
      Remaining balance available for use.
    </DynamicResponseField>

    <DynamicResponseField name="usage" type="number">
      Total usage consumed in the current period.
    </DynamicResponseField>

    <DynamicResponseField name="unlimited" type="boolean">
      Whether this feature has unlimited usage.
    </DynamicResponseField>

    <DynamicResponseField name="overage_allowed" type="boolean">
      Whether usage beyond the granted balance is allowed (with overage charges).
    </DynamicResponseField>

    <DynamicResponseField name="max_purchase" type="number | null">
      Maximum quantity that can be purchased as a top-up, or null for unlimited.
    </DynamicResponseField>

    <DynamicResponseField name="next_reset_at" type="number | null">
      Timestamp when the balance will reset, or null for no reset.
    </DynamicResponseField>

    <DynamicResponseField name="breakdown" type="object[]">
      Detailed breakdown of balance sources when stacking multiple plans or grants.

      <Expandable title="properties">
        <DynamicResponseField name="id" type="string">
          The unique identifier for this balance breakdown.
        </DynamicResponseField>

        <DynamicResponseField name="plan_id" type="string | null">
          The plan ID this balance originates from, or null for standalone balances.
        </DynamicResponseField>

        <DynamicResponseField name="included_grant" type="number">
          Amount granted from the plan's included usage.
        </DynamicResponseField>

        <DynamicResponseField name="prepaid_grant" type="number">
          Amount granted from prepaid purchases or top-ups.
        </DynamicResponseField>

        <DynamicResponseField name="remaining" type="number">
          Remaining balance available for use.
        </DynamicResponseField>

        <DynamicResponseField name="usage" type="number">
          Amount consumed in the current period.
        </DynamicResponseField>

        <DynamicResponseField name="unlimited" type="boolean">
          Whether this balance has unlimited usage.
        </DynamicResponseField>

        <DynamicResponseField name="reset" type="object | null">
          Reset configuration for this balance, or null if no reset.

          <Expandable title="properties">
            <DynamicResponseField name="interval" type="'one_off' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'semi_annual' | 'year'">
              The reset interval (hour, day, week, month, etc.) or 'multiple' if combined from different intervals.
            </DynamicResponseField>

            <DynamicResponseField name="interval_count" type="number">
              Number of intervals between resets (eg. 2 for bi-monthly).
            </DynamicResponseField>

            <DynamicResponseField name="resets_at" type="number | null">
              Timestamp when the balance will next reset.
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="price" type="object | null">
          Pricing configuration if this balance has usage-based pricing.

          <Expandable title="properties">
            <DynamicResponseField name="amount" type="number">
              The per-unit price amount.
            </DynamicResponseField>

            <DynamicResponseField name="tiers" type="object[]">
              Tiered pricing configuration if applicable.

              <Expandable title="properties">
                <DynamicResponseField name="to" type="number" />

                <DynamicResponseField name="amount" type="number" />

                <DynamicResponseField name="flat_amount" type="number" />
              </Expandable>
            </DynamicResponseField>

            <DynamicResponseField name="tier_behavior" type="'graduated' | 'volume'">
              How tiers are applied: graduated (split across bands) or volume (flat rate for the matched tier).
            </DynamicResponseField>

            <DynamicResponseField name="billing_units" type="number">
              The number of units per billing increment (eg. \$9 / 250 units).
            </DynamicResponseField>

            <DynamicResponseField name="billing_method" type="'prepaid' | 'usage_based'">
              Whether usage is prepaid or billed pay-per-use.
            </DynamicResponseField>

            <DynamicResponseField name="max_purchase" type="number | null">
              Maximum quantity that can be purchased, or null for unlimited.
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="expires_at" type="number | null">
          Timestamp when this balance expires, or null for no expiration.
        </DynamicResponseField>
      </Expandable>
    </DynamicResponseField>

    <DynamicResponseField name="rollovers" type="object[]">
      Rollover balances carried over from previous periods.

      <Expandable title="properties">
        <DynamicResponseField name="balance" type="number">
          Amount of balance rolled over from a previous period.
        </DynamicResponseField>

        <DynamicResponseField name="expires_at" type="number">
          Timestamp when the rollover balance expires.
        </DynamicResponseField>
      </Expandable>
    </DynamicResponseField>
  </Expandable>
</DynamicResponseField>

<DynamicResponseField name="flags.{key}" type="object">
  <Expandable title="properties">
    <DynamicResponseField name="id" type="string">
      The unique identifier for this flag.
    </DynamicResponseField>

    <DynamicResponseField name="plan_id" type="string | null">
      The plan ID this flag originates from, or null for standalone flags.
    </DynamicResponseField>

    <DynamicResponseField name="expires_at" type="number | null">
      Timestamp when this flag expires, or null for no expiration.
    </DynamicResponseField>

    <DynamicResponseField name="feature_id" type="string">
      The feature ID this flag is for.
    </DynamicResponseField>

    <DynamicResponseField name="feature" type="object">
      The full feature object if expanded.

      <Expandable title="properties">
        <DynamicResponseField name="id" type="string">
          The unique identifier for this feature, used in /check and /track calls.
        </DynamicResponseField>

        <DynamicResponseField name="name" type="string">
          Human-readable name displayed in the dashboard and billing UI.
        </DynamicResponseField>

        <DynamicResponseField name="type" type="'boolean' | 'metered' | 'credit_system' | 'ai_credit_system'">
          Feature type: 'boolean' for on/off access, 'metered' for usage-tracked features, 'credit\_system' for unified credit pools, 'ai\_credit\_system' for model-based token pricing.
        </DynamicResponseField>

        <DynamicResponseField name="consumable" type="boolean">
          For metered features: true if usage resets periodically (API calls, credits), false if allocated persistently (seats, storage).
        </DynamicResponseField>

        <DynamicResponseField name="event_names" type="string[]">
          Event names that trigger this feature's balance. Allows multiple features to respond to a single event.
        </DynamicResponseField>

        <DynamicResponseField name="credit_schema" type="object[]">
          For credit\_system features: maps metered features to their credit costs.

          <Expandable title="properties">
            <DynamicResponseField name="metered_feature_id" type="string">
              ID of the metered feature that draws from this credit system.
            </DynamicResponseField>

            <DynamicResponseField name="credit_cost" type="number">
              Credits consumed per unit of the metered feature.
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="model_markups.{key}" type="object | null">
          Per-model markup overrides for AI credit systems.

          <Expandable title="properties">
            <DynamicResponseField name="markup" type="number" />

            <DynamicResponseField name="input_cost" type="number" />

            <DynamicResponseField name="output_cost" type="number" />
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="default_markup" type="number">
          Default percentage markup for AI credit systems. Use -100 to make usage free.
        </DynamicResponseField>

        <DynamicResponseField name="provider_markups.{key}" type="object | null">
          Per-provider default markup percentages for AI credit systems.

          <Expandable title="properties">
            <DynamicResponseField name="markup" type="number" />
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="display" type="object">
          Display names for the feature in billing UI and customer-facing components.

          <Expandable title="properties">
            <DynamicResponseField name="singular" type="string | null">
              Singular form for UI display (e.g., 'API call', 'seat').
            </DynamicResponseField>

            <DynamicResponseField name="plural" type="string | null">
              Plural form for UI display (e.g., 'API calls', 'seats').
            </DynamicResponseField>
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="archived" type="boolean">
          Whether the feature is archived and hidden from the dashboard.
        </DynamicResponseField>
      </Expandable>
    </DynamicResponseField>
  </Expandable>
</DynamicResponseField>

<DynamicResponseField name="billing_controls" type="object">
  Billing controls for the entity.

  <Expandable title="properties">
    <DynamicResponseField name="spend_limits" type="object[]">
      List of spend limits per feature. Each entry caps overage (overage\_limit) and/or per-interval usage (usage\_limit).

      <Expandable title="properties">
        <DynamicResponseField name="feature_id" type="string">
          Optional feature ID this spend limit applies to.
        </DynamicResponseField>

        <DynamicResponseField name="enabled" type="boolean">
          Whether the overage spend limit is enabled.
        </DynamicResponseField>

        <DynamicResponseField name="limit_type" type="'absolute' | 'usage_percentage'">
          How overage\_limit is interpreted: an absolute overage cap (default) or a percentage of the main-plan allowance.
        </DynamicResponseField>

        <DynamicResponseField name="overage_limit" type="number">
          Overage cap for the feature: absolute units, or a percent (e.g. 120) when limit\_type is usage\_percentage.
        </DynamicResponseField>

        <DynamicResponseField name="skip_overage_billing" type="boolean">
          When true, overage for this feature is not posted to Stripe. Usage tracking and balance resets still behave normally.
        </DynamicResponseField>

        <DynamicResponseField name="source" type="'customer' | 'plan'">
          Response-only: whether the entry is a customer-level override or inherited from an attached plan's defaults.
        </DynamicResponseField>
      </Expandable>
    </DynamicResponseField>

    <DynamicResponseField name="usage_limits" type="object[]">
      List of hard usage caps per feature for this entity. An entity entry overrides the customer's for that feature.

      <Expandable title="properties">
        <DynamicResponseField name="feature_id" type="string">
          The feature this usage limit applies to.
        </DynamicResponseField>

        <DynamicResponseField name="enabled" type="boolean">
          Whether this usage limit is enabled.
        </DynamicResponseField>

        <DynamicResponseField name="limit" type="number">
          Maximum units allowed per interval.
        </DynamicResponseField>

        <DynamicResponseField name="interval" type="'day' | 'week' | 'month' | 'year'">
          Interval for the cap, aligned to the customer's billing cycle.
        </DynamicResponseField>

        <DynamicResponseField name="filter" type="object">
          When set, only usage from events whose properties match counts toward this cap. Omit to count all usage of the feature.

          <Expandable title="properties">
            <DynamicResponseField name="properties" type="object" />
          </Expandable>
        </DynamicResponseField>

        <DynamicResponseField name="usage" type="number">
          Current usage already consumed in the active interval. Response-only; not stored on billing controls.
        </DynamicResponseField>

        <DynamicResponseField name="source" type="'customer' | 'plan'">
          Response-only: whether the entry is a customer-level override or inherited from an attached plan's defaults.
        </DynamicResponseField>
      </Expandable>
    </DynamicResponseField>

    <DynamicResponseField name="usage_alerts" type="object[]">
      List of usage alert configurations per feature.

      <Expandable title="properties">
        <DynamicResponseField name="feature_id" type="string">
          The feature ID this alert applies to.
        </DynamicResponseField>

        <DynamicResponseField name="enabled" type="boolean">
          Whether this usage alert is enabled.
        </DynamicResponseField>

        <DynamicResponseField name="threshold" type="number">
          The threshold value that triggers the alert. For usage or remaining, this is an absolute count. For usage\_percentage or remaining\_percentage, this is a percentage (0-100).
        </DynamicResponseField>

        <DynamicResponseField name="threshold_type" type="'usage' | 'usage_percentage' | 'remaining' | 'remaining_percentage'">
          Whether the threshold is an absolute count or a percentage of the usage allowance or remaining balance.
        </DynamicResponseField>

        <DynamicResponseField name="name" type="string">
          Optional user-defined label to distinguish multiple alerts on the same feature.
        </DynamicResponseField>

        <DynamicResponseField name="source" type="'customer' | 'plan'">
          Response-only: whether the entry is a customer-level override or inherited from an attached plan's defaults.
        </DynamicResponseField>
      </Expandable>
    </DynamicResponseField>

    <DynamicResponseField name="overage_allowed" type="object[]">
      List of overage allowed controls per feature. When enabled, usage can exceed balance.

      <Expandable title="properties">
        <DynamicResponseField name="feature_id" type="string">
          The feature ID this overage allowed control applies to.
        </DynamicResponseField>

        <DynamicResponseField name="enabled" type="boolean">
          Whether overage is allowed for this feature.
        </DynamicResponseField>

        <DynamicResponseField name="source" type="'customer' | 'plan'">
          Response-only: whether the entry is a customer-level override or inherited from an attached plan's defaults.
        </DynamicResponseField>
      </Expandable>
    </DynamicResponseField>
  </Expandable>
</DynamicResponseField>

<DynamicResponseField name="invoices" type="object[]">
  Invoices for this entity (only included when expand=invoices)

  <Expandable title="properties">
    <DynamicResponseField name="plan_ids" type="string[]">
      Array of plan IDs included in this invoice
    </DynamicResponseField>

    <DynamicResponseField name="stripe_id" type="string">
      The Stripe invoice ID
    </DynamicResponseField>

    <DynamicResponseField name="processor_type" type="'stripe' | 'revenuecat'">
      The billing processor that owns this invoice.
    </DynamicResponseField>

    <DynamicResponseField name="status" type="string">
      The status of the invoice
    </DynamicResponseField>

    <DynamicResponseField name="total" type="number">
      The total amount of the invoice
    </DynamicResponseField>

    <DynamicResponseField name="currency" type="string">
      The currency code for the invoice
    </DynamicResponseField>

    <DynamicResponseField name="created_at" type="number">
      Timestamp when the invoice was created
    </DynamicResponseField>

    <DynamicResponseField name="hosted_invoice_url" type="string | null">
      URL to the Stripe-hosted invoice page
    </DynamicResponseField>
  </Expandable>
</DynamicResponseField>

<ResponseExample>
  ```json 200 theme={null}
  {
    "id": "seat_42",
    "name": "Seat 42",
    "customer_id": "cus_123",
    "feature_id": "seats",
    "created_at": 1771409161016,
    "env": "sandbox",
    "subscriptions": [
      {
        "plan_id": "pro_plan",
        "auto_enable": true,
        "add_on": false,
        "status": "active",
        "past_due": false,
        "canceled_at": null,
        "expires_at": null,
        "trial_ends_at": null,
        "started_at": 1771431921437,
        "current_period_start": 1771431921437,
        "current_period_end": 1771999921437,
        "quantity": 1
      }
    ],
    "purchases": [],
    "balances": {
      "messages": {
        "feature_id": "messages",
        "granted": 100,
        "remaining": 72,
        "usage": 28,
        "unlimited": false,
        "overage_allowed": false,
        "max_purchase": null,
        "next_reset_at": 1773851121437,
        "breakdown": [
          {
            "id": "cus_ent_39qmLooixXLAqMywgXywjAz96rV",
            "plan_id": "pro_plan",
            "included_grant": 100,
            "prepaid_grant": 0,
            "remaining": 72,
            "usage": 28,
            "unlimited": false,
            "reset": {
              "interval": "month",
              "resets_at": 1773851121437
            },
            "price": null,
            "expires_at": null
          }
        ]
      }
    },
    "invoices": []
  }
  ```
</ResponseExample>


## OpenAPI

````yaml openapi POST /v1/entities.update
openapi: 3.1.0
info:
  title: Autumn API
  version: 2.3.0
servers:
  - url: https://api.useautumn.com
    description: Production server
security:
  - secretKey: []
paths:
  /v1/entities.update:
    post:
      tags:
        - entities
      description: >-
        Updates an existing entity and returns the refreshed entity object.


        Use this to change entity billing controls or other mutable entity
        fields after the entity has already been created.
      operationId: updateEntity
      parameters:
        - name: x-api-version
          in: header
          required: true
          schema:
            type: string
            default: 2.3.0
          x-speakeasy-globals-hidden: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_id:
                  type: string
                  description: The ID of the customer that owns the entity.
                entity_id:
                  type: string
                  description: The ID of the entity.
                billing_controls:
                  type: object
                  properties:
                    spend_limits:
                      type: array
                      items:
                        type: object
                        properties:
                          feature_id:
                            type: string
                            description: Optional feature ID this spend limit applies to.
                          enabled:
                            type: boolean
                            default: false
                            description: Whether the overage spend limit is enabled.
                          limit_type:
                            enum:
                              - absolute
                              - usage_percentage
                            type: string
                            description: >-
                              How overage_limit is interpreted: an absolute
                              overage cap (default) or a percentage of the
                              main-plan allowance.
                          overage_limit:
                            type: number
                            minimum: 0
                            description: >-
                              Overage cap for the feature: absolute units, or a
                              percent (e.g. 120) when limit_type is
                              usage_percentage.
                          skip_overage_billing:
                            type: boolean
                            description: >-
                              When true, overage for this feature is not posted
                              to Stripe. Usage tracking and balance resets still
                              behave normally.
                      description: >-
                        List of spend limits per feature. Each entry caps
                        overage (overage_limit) and/or per-interval usage
                        (usage_limit).
                    usage_limits:
                      type: array
                      items:
                        type: object
                        properties:
                          feature_id:
                            type: string
                            description: The feature this usage limit applies to.
                          enabled:
                            type: boolean
                            default: true
                            description: Whether this usage limit is enabled.
                          limit:
                            type: number
                            minimum: 0
                            description: Maximum units allowed per interval.
                          interval:
                            enum:
                              - day
                              - week
                              - month
                              - year
                            type: string
                            description: >-
                              Interval for the cap, aligned to the customer's
                              billing cycle.
                          filter:
                            type: object
                            properties:
                              properties:
                                type: object
                                propertyNames:
                                  type: string
                                  minLength: 1
                                  maxLength: 64
                                additionalProperties:
                                  anyOf:
                                    - type: string
                                      minLength: 1
                                      maxLength: 128
                                    - type: number
                                    - type: boolean
                            required:
                              - properties
                            description: >-
                              When set, only usage from events whose properties
                              match counts toward this cap. Omit to count all
                              usage of the feature.
                        required:
                          - feature_id
                          - limit
                          - interval
                      description: >-
                        List of hard usage caps per feature for this entity. An
                        entity entry overrides the customer's for that feature.
                    usage_alerts:
                      type: array
                      items:
                        type: object
                        properties:
                          feature_id:
                            type: string
                            description: The feature ID this alert applies to.
                          enabled:
                            type: boolean
                            default: true
                            description: Whether this usage alert is enabled.
                          threshold:
                            type: number
                            minimum: 0
                            description: >-
                              The threshold value that triggers the alert. For
                              usage or remaining, this is an absolute count. For
                              usage_percentage or remaining_percentage, this is
                              a percentage (0-100).
                          threshold_type:
                            enum:
                              - usage
                              - usage_percentage
                              - remaining
                              - remaining_percentage
                            type: string
                            description: >-
                              Whether the threshold is an absolute count or a
                              percentage of the usage allowance or remaining
                              balance.
                          name:
                            type: string
                            description: >-
                              Optional user-defined label to distinguish
                              multiple alerts on the same feature.
                        required:
                          - threshold
                          - threshold_type
                      description: List of usage alert configurations per feature.
                    overage_allowed:
                      type: array
                      items:
                        type: object
                        properties:
                          feature_id:
                            type: string
                            description: >-
                              The feature ID this overage allowed control
                              applies to.
                          enabled:
                            type: boolean
                            default: false
                            description: Whether overage is allowed for this feature.
                        required:
                          - feature_id
                      description: >-
                        List of overage allowed controls per feature. When
                        enabled, usage can exceed balance.
                  description: Billing controls to replace on the entity.
              required:
                - entity_id
              title: UpdateEntityParams
              examples:
                - customer_id: cus_123
                  entity_id: seat_42
                  billing_controls:
                    spend_limits:
                      - feature_id: messages
                        enabled: true
                        limit_type: usage_percentage
                        overage_limit: 120
            example:
              customer_id: cus_123
              entity_id: seat_42
              billing_controls:
                spend_limits:
                  - feature_id: messages
                    enabled: true
                    limit_type: usage_percentage
                    overage_limit: 120
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    anyOf:
                      - type: string
                      - type: 'null'
                    description: The unique identifier of the entity
                  name:
                    anyOf:
                      - type: string
                      - type: 'null'
                    description: The name of the entity
                  customer_id:
                    anyOf:
                      - type: string
                      - type: 'null'
                    description: The customer ID this entity belongs to
                  feature_id:
                    anyOf:
                      - type: string
                      - type: 'null'
                    description: The feature ID this entity belongs to
                  created_at:
                    type: number
                    description: Unix timestamp when the entity was created
                  env:
                    enum:
                      - sandbox
                      - live
                    type: string
                    description: The environment (sandbox/live)
                  subscriptions:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: >-
                            The unique identifier of this subscription. If a
                            subscription_id was provided at attach time, it is
                            used; otherwise, falls back to the internal ID.
                        plan:
                          $ref: '#/components/schemas/Plan'
                          description: The full plan object if expanded.
                        plan_id:
                          type: string
                          description: The unique identifier of the subscribed plan.
                        auto_enable:
                          type: boolean
                          description: >-
                            Whether the plan was automatically enabled for the
                            customer.
                        add_on:
                          type: boolean
                          description: >-
                            Whether this is an add-on plan rather than a base
                            subscription.
                        status:
                          enum:
                            - active
                            - scheduled
                          type: string
                          description: Current status of the subscription.
                        past_due:
                          type: boolean
                          description: Whether the subscription has overdue payments.
                        canceled_at:
                          anyOf:
                            - type: number
                            - type: 'null'
                          description: >-
                            Timestamp when the subscription was canceled, or
                            null if not canceled.
                        expires_at:
                          anyOf:
                            - type: number
                            - type: 'null'
                          description: >-
                            Timestamp when the subscription will expire, or null
                            if no expiry set.
                        trial_ends_at:
                          anyOf:
                            - type: number
                            - type: 'null'
                          description: >-
                            Timestamp when the trial period ends, or null if not
                            on trial.
                        started_at:
                          type: number
                          description: Timestamp when the subscription started.
                        current_period_start:
                          anyOf:
                            - type: number
                            - type: 'null'
                          description: Start timestamp of the current billing period.
                        current_period_end:
                          anyOf:
                            - type: number
                            - type: 'null'
                          description: End timestamp of the current billing period.
                        quantity:
                          type: number
                          description: >-
                            Number of units of this subscription (for per-seat
                            plans).
                        scope:
                          enum:
                            - customer
                            - entity
                          type: string
                          description: >-
                            Whether this subscription is attached at the
                            customer level or entity level.
                      required:
                        - id
                        - plan_id
                        - auto_enable
                        - add_on
                        - status
                        - past_due
                        - canceled_at
                        - expires_at
                        - trial_ends_at
                        - started_at
                        - current_period_start
                        - current_period_end
                        - quantity
                  purchases:
                    type: array
                    items:
                      type: object
                      properties:
                        plan:
                          $ref: '#/components/schemas/Plan'
                          description: The full plan object if expanded.
                        plan_id:
                          type: string
                          description: The unique identifier of the purchased plan.
                        expires_at:
                          anyOf:
                            - type: number
                            - type: 'null'
                          description: >-
                            Timestamp when the purchase expires, or null for
                            lifetime access.
                        started_at:
                          type: number
                          description: Timestamp when the purchase was made.
                        quantity:
                          type: number
                          description: Number of units purchased.
                        scope:
                          enum:
                            - customer
                            - entity
                          type: string
                          description: >-
                            Whether this purchase is attached at the customer
                            level or entity level.
                      required:
                        - plan_id
                        - expires_at
                        - started_at
                        - quantity
                  balances:
                    type: object
                    propertyNames:
                      type: string
                    additionalProperties:
                      $ref: '#/components/schemas/Balance'
                  flags:
                    type: object
                    propertyNames:
                      type: string
                    additionalProperties:
                      type: object
                      properties:
                        id:
                          type: string
                          description: The unique identifier for this flag.
                        plan_id:
                          anyOf:
                            - type: string
                            - type: 'null'
                          description: >-
                            The plan ID this flag originates from, or null for
                            standalone flags.
                        expires_at:
                          anyOf:
                            - type: number
                            - type: 'null'
                          description: >-
                            Timestamp when this flag expires, or null for no
                            expiration.
                        feature_id:
                          type: string
                          description: The feature ID this flag is for.
                        feature:
                          type: object
                          properties:
                            id:
                              type: string
                              description: >-
                                The unique identifier for this feature, used in
                                /check and /track calls.
                            name:
                              type: string
                              description: >-
                                Human-readable name displayed in the dashboard
                                and billing UI.
                            type:
                              enum:
                                - boolean
                                - metered
                                - credit_system
                                - ai_credit_system
                              type: string
                              description: >-
                                Feature type: 'boolean' for on/off access,
                                'metered' for usage-tracked features,
                                'credit_system' for unified credit pools,
                                'ai_credit_system' for model-based token
                                pricing.
                            consumable:
                              type: boolean
                              description: >-
                                For metered features: true if usage resets
                                periodically (API calls, credits), false if
                                allocated persistently (seats, storage).
                            event_names:
                              type: array
                              items:
                                type: string
                              description: >-
                                Event names that trigger this feature's balance.
                                Allows multiple features to respond to a single
                                event.
                            credit_schema:
                              type: array
                              items:
                                type: object
                                properties:
                                  metered_feature_id:
                                    type: string
                                    description: >-
                                      ID of the metered feature that draws from
                                      this credit system.
                                  credit_cost:
                                    type: number
                                    description: >-
                                      Credits consumed per unit of the metered
                                      feature.
                                required:
                                  - metered_feature_id
                                  - credit_cost
                              description: >-
                                For credit_system features: maps metered
                                features to their credit costs.
                            model_markups:
                              anyOf:
                                - type: object
                                  propertyNames:
                                    type: string
                                  additionalProperties:
                                    type: object
                                    properties:
                                      markup:
                                        type: number
                                        minimum: -100
                                      input_cost:
                                        type: number
                                        minimum: 0
                                      output_cost:
                                        type: number
                                        minimum: 0
                                - type: 'null'
                              description: >-
                                Per-model markup overrides for AI credit
                                systems.
                            default_markup:
                              type: number
                              minimum: -100
                              description: >-
                                Default percentage markup for AI credit systems.
                                Use -100 to make usage free.
                            provider_markups:
                              anyOf:
                                - type: object
                                  propertyNames:
                                    type: string
                                  additionalProperties:
                                    type: object
                                    properties:
                                      markup:
                                        type: number
                                        minimum: -100
                                    required:
                                      - markup
                                - type: 'null'
                              description: >-
                                Per-provider default markup percentages for AI
                                credit systems.
                            display:
                              type: object
                              properties:
                                singular:
                                  anyOf:
                                    - type: string
                                    - type: 'null'
                                  description: >-
                                    Singular form for UI display (e.g., 'API
                                    call', 'seat').
                                plural:
                                  anyOf:
                                    - type: string
                                    - type: 'null'
                                  description: >-
                                    Plural form for UI display (e.g., 'API
                                    calls', 'seats').
                              description: >-
                                Display names for the feature in billing UI and
                                customer-facing components.
                            archived:
                              type: boolean
                              description: >-
                                Whether the feature is archived and hidden from
                                the dashboard.
                          required:
                            - id
                            - name
                            - type
                            - consumable
                            - archived
                          description: The full feature object if expanded.
                      required:
                        - id
                        - plan_id
                        - expires_at
                        - feature_id
                      examples:
                        - id: cus_ent_39qmLooixXLAqMywgXywjAz96rV
                          plan_id: pro_plan
                          expires_at: null
                          feature_id: dashboard
                  billing_controls:
                    type: object
                    properties:
                      spend_limits:
                        type: array
                        items:
                          type: object
                          properties:
                            feature_id:
                              type: string
                              description: Optional feature ID this spend limit applies to.
                            enabled:
                              type: boolean
                              default: false
                              description: Whether the overage spend limit is enabled.
                            limit_type:
                              enum:
                                - absolute
                                - usage_percentage
                              type: string
                              description: >-
                                How overage_limit is interpreted: an absolute
                                overage cap (default) or a percentage of the
                                main-plan allowance.
                            overage_limit:
                              type: number
                              minimum: 0
                              description: >-
                                Overage cap for the feature: absolute units, or
                                a percent (e.g. 120) when limit_type is
                                usage_percentage.
                            skip_overage_billing:
                              type: boolean
                              description: >-
                                When true, overage for this feature is not
                                posted to Stripe. Usage tracking and balance
                                resets still behave normally.
                            source:
                              enum:
                                - customer
                                - plan
                              type: string
                              description: >-
                                Response-only: whether the entry is a
                                customer-level override or inherited from an
                                attached plan's defaults.
                        description: >-
                          List of spend limits per feature. Each entry caps
                          overage (overage_limit) and/or per-interval usage
                          (usage_limit).
                      usage_limits:
                        type: array
                        items:
                          type: object
                          properties:
                            feature_id:
                              type: string
                              description: The feature this usage limit applies to.
                            enabled:
                              type: boolean
                              default: true
                              description: Whether this usage limit is enabled.
                            limit:
                              type: number
                              minimum: 0
                              description: Maximum units allowed per interval.
                            interval:
                              enum:
                                - day
                                - week
                                - month
                                - year
                              type: string
                              description: >-
                                Interval for the cap, aligned to the customer's
                                billing cycle.
                            filter:
                              type: object
                              properties:
                                properties:
                                  type: object
                                  propertyNames:
                                    type: string
                                    minLength: 1
                                    maxLength: 64
                                  additionalProperties: {}
                              required:
                                - properties
                              description: >-
                                When set, only usage from events whose
                                properties match counts toward this cap. Omit to
                                count all usage of the feature.
                            usage:
                              type: number
                              minimum: 0
                              description: >-
                                Current usage already consumed in the active
                                interval. Response-only; not stored on billing
                                controls.
                            source:
                              enum:
                                - customer
                                - plan
                              type: string
                              description: >-
                                Response-only: whether the entry is a
                                customer-level override or inherited from an
                                attached plan's defaults.
                          required:
                            - feature_id
                            - limit
                            - interval
                        description: >-
                          List of hard usage caps per feature for this entity.
                          An entity entry overrides the customer's for that
                          feature.
                      usage_alerts:
                        type: array
                        items:
                          type: object
                          properties:
                            feature_id:
                              type: string
                              description: The feature ID this alert applies to.
                            enabled:
                              type: boolean
                              default: true
                              description: Whether this usage alert is enabled.
                            threshold:
                              type: number
                              minimum: 0
                              description: >-
                                The threshold value that triggers the alert. For
                                usage or remaining, this is an absolute count.
                                For usage_percentage or remaining_percentage,
                                this is a percentage (0-100).
                            threshold_type:
                              enum:
                                - usage
                                - usage_percentage
                                - remaining
                                - remaining_percentage
                              type: string
                              description: >-
                                Whether the threshold is an absolute count or a
                                percentage of the usage allowance or remaining
                                balance.
                            name:
                              type: string
                              description: >-
                                Optional user-defined label to distinguish
                                multiple alerts on the same feature.
                            source:
                              enum:
                                - customer
                                - plan
                              type: string
                              description: >-
                                Response-only: whether the entry is a
                                customer-level override or inherited from an
                                attached plan's defaults.
                          required:
                            - threshold
                            - threshold_type
                        description: List of usage alert configurations per feature.
                      overage_allowed:
                        type: array
                        items:
                          type: object
                          properties:
                            feature_id:
                              type: string
                              description: >-
                                The feature ID this overage allowed control
                                applies to.
                            enabled:
                              type: boolean
                              default: false
                              description: Whether overage is allowed for this feature.
                            source:
                              enum:
                                - customer
                                - plan
                              type: string
                              description: >-
                                Response-only: whether the entry is a
                                customer-level override or inherited from an
                                attached plan's defaults.
                          required:
                            - feature_id
                        description: >-
                          List of overage allowed controls per feature. When
                          enabled, usage can exceed balance.
                    description: Billing controls for the entity.
                  invoices:
                    type: array
                    items:
                      type: object
                      properties:
                        plan_ids:
                          type: array
                          items:
                            type: string
                          description: Array of plan IDs included in this invoice
                        stripe_id:
                          type: string
                          description: The Stripe invoice ID
                        processor_type:
                          enum:
                            - stripe
                            - revenuecat
                          type: string
                          default: stripe
                          description: The billing processor that owns this invoice.
                        status:
                          type: string
                          description: The status of the invoice
                        total:
                          type: number
                          description: The total amount of the invoice
                        currency:
                          type: string
                          description: The currency code for the invoice
                        created_at:
                          type: number
                          description: Timestamp when the invoice was created
                        hosted_invoice_url:
                          anyOf:
                            - type: string
                            - type: 'null'
                          description: URL to the Stripe-hosted invoice page
                      required:
                        - plan_ids
                        - stripe_id
                        - status
                        - total
                        - currency
                        - created_at
                    description: >-
                      Invoices for this entity (only included when
                      expand=invoices)
                required:
                  - id
                  - name
                  - created_at
                  - env
                  - subscriptions
                  - purchases
                  - balances
                  - flags
                examples:
                  - id: seat_42
                    name: Seat 42
                    customer_id: cus_123
                    feature_id: seats
                    created_at: 1771409161016
                    env: sandbox
                    subscriptions:
                      - plan_id: pro_plan
                        auto_enable: true
                        add_on: false
                        status: active
                        past_due: false
                        canceled_at: null
                        expires_at: null
                        trial_ends_at: null
                        started_at: 1771431921437
                        current_period_start: 1771431921437
                        current_period_end: 1771999921437
                        quantity: 1
                    purchases: []
                    balances:
                      messages:
                        feature_id: messages
                        granted: 100
                        remaining: 72
                        usage: 28
                        unlimited: false
                        overage_allowed: false
                        max_purchase: null
                        next_reset_at: 1773851121437
                        breakdown:
                          - id: cus_ent_39qmLooixXLAqMywgXywjAz96rV
                            plan_id: pro_plan
                            included_grant: 100
                            prepaid_grant: 0
                            remaining: 72
                            usage: 28
                            unlimited: false
                            reset:
                              interval: month
                              resets_at: 1773851121437
                            price: null
                            expires_at: null
                    invoices: []
              example:
                id: seat_42
                name: Seat 42
                customer_id: cus_123
                feature_id: seats
                created_at: 1771409161016
                env: sandbox
                subscriptions:
                  - plan_id: pro_plan
                    auto_enable: true
                    add_on: false
                    status: active
                    past_due: false
                    canceled_at: null
                    expires_at: null
                    trial_ends_at: null
                    started_at: 1771431921437
                    current_period_start: 1771431921437
                    current_period_end: 1771999921437
                    quantity: 1
                purchases: []
                balances:
                  messages:
                    feature_id: messages
                    granted: 100
                    remaining: 72
                    usage: 28
                    unlimited: false
                    overage_allowed: false
                    max_purchase: null
                    next_reset_at: 1773851121437
                    breakdown:
                      - id: cus_ent_39qmLooixXLAqMywgXywjAz96rV
                        plan_id: pro_plan
                        included_grant: 100
                        prepaid_grant: 0
                        remaining: 72
                        usage: 28
                        unlimited: false
                        reset:
                          interval: month
                          resets_at: 1773851121437
                        price: null
                        expires_at: null
                invoices: []
      x-codeSamples:
        - lang: typescript
          label: Typescript (SDK)
          source: |-
            import { Autumn } from 'autumn-js'

            const autumn = new Autumn()

            const result = await autumn.entities.update({
              customerId: "cus_123",
              entityId: "seat_42",
              billingControls: {
                spendLimits: [
                  {
                    featureId: "messages",
                    enabled: true,
                    limitType: "usage_percentage",
                    overageLimit: 120,
                  },
                ],
              },
            });
        - lang: python
          label: Python (SDK)
          source: |-
            from autumn_sdk import Autumn

            autumn = Autumn(secret_key="am_sk_test...")

            res = autumn.entities.update(
                entity_id="seat_42",
                customer_id="cus_123",
                billing_controls={
                    "spend_limits": [
                        {
                            "feature_id": "messages",
                            "enabled": True,
                            "limit_type": "usage_percentage",
                            "overage_limit": 120,
                        },
                    ],
                },
            )
components:
  schemas:
    Plan:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier for the plan.
        name:
          type: string
          description: Display name of the plan.
        description:
          anyOf:
            - type: string
            - type: 'null'
          description: Optional description of the plan.
        group:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Group identifier for organizing related plans. Plans in the same
            group are mutually exclusive.
        version:
          type: number
          description: >-
            Version number of the plan. Incremented when plan configuration
            changes.
        add_on:
          type: boolean
          description: >-
            Whether this is an add-on plan that can be attached alongside a main
            plan.
        auto_enable:
          type: boolean
          description: >-
            If true, this plan is automatically attached when a customer is
            created. Used for free plans.
        price:
          anyOf:
            - type: object
              properties:
                amount:
                  type: number
                  description: Base price amount for the plan.
                additional_currencies:
                  type: array
                  items:
                    type: object
                    properties:
                      currency:
                        type: string
                        description: >-
                          Three-letter Stripe-supported currency code (e.g.
                          'eur', 'gbp').
                      amount:
                        type: number
                        description: >-
                          Price amount in this currency. Set explicitly per
                          currency, not converted from the base amount.
                    required:
                      - currency
                      - amount
                  description: >-
                    Base price amounts in additional currencies. The base
                    'amount' is in the org's default currency.
                interval:
                  enum:
                    - one_off
                    - week
                    - month
                    - quarter
                    - semi_annual
                    - year
                  type: string
                  description: Billing interval (e.g. 'month', 'year').
                interval_count:
                  type: number
                  description: Number of intervals per billing cycle. Defaults to 1.
                display:
                  type: object
                  properties:
                    primary_text:
                      type: string
                      description: Main display text (e.g. '$10' or '100 messages').
                    secondary_text:
                      type: string
                      description: >-
                        Secondary display text (e.g. 'per month' or 'then $0.5
                        per 100').
                  required:
                    - primary_text
                  description: Display text for showing this price in pricing pages.
              required:
                - amount
                - interval
            - type: 'null'
          description: >-
            Base recurring price for the plan. Null for free plans or usage-only
            plans.
        items:
          type: array
          items:
            type: object
            properties:
              feature_id:
                type: string
                description: The ID of the feature this item configures.
              feature:
                type: object
                properties:
                  id:
                    type: string
                    description: >-
                      The ID of the feature, used to refer to it in other API
                      calls like /track or /check.
                  name:
                    anyOf:
                      - type: string
                      - type: 'null'
                    description: The name of the feature.
                  type:
                    enum:
                      - static
                      - boolean
                      - single_use
                      - continuous_use
                      - credit_system
                      - ai_credit_system
                    type: string
                    description: The type of the feature
                  display:
                    anyOf:
                      - type: object
                        properties:
                          singular:
                            type: string
                            description: The singular display name for the feature.
                          plural:
                            type: string
                            description: The plural display name for the feature.
                        required:
                          - singular
                          - plural
                      - type: 'null'
                    description: Singular and plural display names for the feature.
                  credit_schema:
                    anyOf:
                      - type: array
                        items:
                          type: object
                          properties:
                            metered_feature_id:
                              type: string
                              description: >-
                                The ID of the metered feature (should be a
                                single_use feature).
                            credit_cost:
                              type: number
                              description: The credit cost of the metered feature.
                          required:
                            - metered_feature_id
                            - credit_cost
                      - type: 'null'
                    description: Credit cost schema for credit system features.
                  archived:
                    anyOf:
                      - type: boolean
                      - type: 'null'
                    description: Whether or not the feature is archived.
                required:
                  - id
                  - type
                description: The full feature object if expanded.
              included:
                type: number
                description: >-
                  Number of free units included. For consumable features,
                  balance resets to this number each interval.
              unlimited:
                type: boolean
                description: Whether the customer has unlimited access to this feature.
              reset:
                anyOf:
                  - type: object
                    properties:
                      interval:
                        enum:
                          - one_off
                          - minute
                          - hour
                          - day
                          - week
                          - month
                          - quarter
                          - semi_annual
                          - year
                        type: string
                        description: >-
                          The interval at which the feature balance resets (e.g.
                          'month', 'year'). For consumable features, usage
                          resets to 0 and included units are restored.
                      interval_count:
                        type: number
                        description: Number of intervals between resets. Defaults to 1.
                    required:
                      - interval
                  - type: 'null'
                description: >-
                  Reset configuration for consumable features. Null for
                  non-consumable features like seats where usage persists across
                  billing cycles.
              price:
                anyOf:
                  - type: object
                    properties:
                      amount:
                        type: number
                        description: >-
                          Price per billing_units after included usage is
                          consumed. Mutually exclusive with tiers.
                      additional_currencies:
                        type: array
                        items:
                          type: object
                          properties:
                            currency:
                              type: string
                              description: >-
                                Three-letter Stripe-supported currency code
                                (e.g. 'eur', 'gbp').
                            amount:
                              type: number
                              description: >-
                                Price amount in this currency. Set explicitly
                                per currency, not converted from the base
                                amount.
                          required:
                            - currency
                            - amount
                        description: >-
                          Amounts in additional currencies for this flat price.
                          The base 'amount' is in the org's default currency.
                          Only valid with 'amount', not 'tiers' (tiered prices
                          carry per-currency amounts on each tier).
                      tiers:
                        type: array
                        items:
                          type: object
                          properties:
                            to:
                              anyOf:
                                - type: number
                                - const: inf
                            amount:
                              type: number
                            flat_amount:
                              type: number
                            additional_currencies:
                              type: array
                              items:
                                type: object
                                properties:
                                  currency:
                                    type: string
                                    description: >-
                                      Three-letter Stripe-supported currency
                                      code (e.g. 'eur', 'gbp').
                                  amount:
                                    type: number
                                    description: >-
                                      Per-unit amount for this tier in this
                                      currency.
                                  flat_amount:
                                    type: number
                                    description: >-
                                      Flat amount for this tier in this
                                      currency, if the tier uses one.
                                required:
                                  - currency
                          required:
                            - to
                            - amount
                        description: >-
                          Tiered pricing configuration. Each tier's 'to'
                          INCLUDES the included amount. Either 'tiers' or
                          'amount' is required.
                      tier_behavior:
                        enum:
                          - graduated
                          - volume
                        type: string
                      interval:
                        enum:
                          - one_off
                          - week
                          - month
                          - quarter
                          - semi_annual
                          - year
                        type: string
                        description: >-
                          Billing interval for this price. For consumable
                          features, should match reset.interval.
                      interval_count:
                        type: number
                        description: Number of intervals per billing cycle. Defaults to 1.
                      billing_units:
                        type: number
                        description: >-
                          Number of units per price increment. Usage is rounded
                          UP to the nearest billing_units when billed (e.g.
                          billing_units=100 means 101 usage rounds to 200).
                      billing_method:
                        enum:
                          - prepaid
                          - usage_based
                        type: string
                        description: >-
                          'prepaid' for features like seats where customers pay
                          upfront, 'usage_based' for pay-as-you-go after
                          included usage.
                      max_purchase:
                        anyOf:
                          - type: number
                          - type: 'null'
                        description: >-
                          Maximum units a customer can purchase beyond included.
                          E.g. if included=100 and max_purchase=300, customer
                          can use up to 400 total before usage is capped. Null
                          for no limit.
                    required:
                      - interval
                      - billing_units
                      - billing_method
                      - max_purchase
                  - type: 'null'
                description: >-
                  Pricing configuration for usage beyond included units. Null if
                  feature is entirely free.
              display:
                type: object
                properties:
                  primary_text:
                    type: string
                    description: Main display text (e.g. '$10' or '100 messages').
                  secondary_text:
                    type: string
                    description: >-
                      Secondary display text (e.g. 'per month' or 'then $0.5 per
                      100').
                required:
                  - primary_text
                description: Display text for showing this item in pricing pages.
              rollover:
                type: object
                properties:
                  max:
                    anyOf:
                      - type: number
                      - type: 'null'
                    description: Maximum rollover units. Null for unlimited rollover.
                  max_percentage:
                    anyOf:
                      - type: number
                      - type: 'null'
                    description: >-
                      Maximum rollover as a percentage (0-100) of included +
                      prepaid grant. Mutually exclusive with max.
                  expiry_duration_type:
                    enum:
                      - month
                      - forever
                    type: string
                    description: When rolled over units expire.
                  expiry_duration_length:
                    type: number
                    description: Number of periods before expiry.
                required:
                  - max
                  - expiry_duration_type
                description: >-
                  Rollover configuration for unused units. If set, unused
                  included units roll over to the next period.
            required:
              - feature_id
              - included
              - unlimited
              - reset
              - price
          description: >-
            Feature configurations included in this plan. Each item defines
            included units, pricing, and reset behavior for a feature.
        free_trial:
          type: object
          properties:
            duration_length:
              type: number
              description: Number of duration_type periods the trial lasts.
            duration_type:
              enum:
                - day
                - month
                - year
              type: string
              description: Unit of time for the trial duration ('day', 'month', 'year').
            card_required:
              type: boolean
              description: >-
                Whether a payment method is required to start the trial. If
                true, customer will be charged after trial ends.
            on_end:
              anyOf:
                - enum:
                    - bill
                    - revert
                  type: string
                - type: 'null'
              description: >-
                Behavior when the trial ends. 'bill' charges the customer
                (default). 'revert' expires the trial and restores the
                customer's previous plan.
          required:
            - duration_length
            - duration_type
            - card_required
          description: >-
            Free trial configuration. If set, new customers can try this plan
            before being charged.
        created_at:
          type: number
          description: Unix timestamp (ms) when the plan was created.
        env:
          enum:
            - sandbox
            - live
          type: string
          description: Environment this plan belongs to ('sandbox' or 'live').
        archived:
          type: boolean
          description: >-
            Whether the plan is archived. Archived plans cannot be attached to
            new customers.
        base_variant_id:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Deprecated. Use variant_details.base_plan_id instead. If this is a
            variant, the ID of the base plan it was created from.
        variant_details:
          type: object
          properties:
            base_plan_id:
              type: string
              description: The ID of the base plan this variant was derived from.
            customize:
              type: object
              properties:
                price:
                  anyOf:
                    - type: object
                      properties:
                        amount:
                          type: number
                          description: Base price amount for the plan.
                        interval:
                          enum:
                            - one_off
                            - week
                            - month
                            - quarter
                            - semi_annual
                            - year
                          type: string
                          description: Billing interval (e.g. 'month', 'year').
                        interval_count:
                          type: number
                          description: >-
                            Number of intervals per billing cycle. Defaults to
                            1.
                        additional_currencies:
                          type: array
                          items:
                            type: object
                            properties:
                              currency:
                                type: string
                                description: >-
                                  Three-letter Stripe-supported currency code
                                  (e.g. 'eur', 'gbp').
                              amount:
                                type: number
                                description: >-
                                  Price amount in this currency. Set explicitly
                                  per currency, not converted from the base
                                  amount.
                            required:
                              - currency
                              - amount
                          description: >-
                            Base price amounts in additional currencies. The
                            base 'amount' is in the org's default currency.
                      required:
                        - amount
                        - interval
                      title: BasePrice
                      description: Base price configuration for a plan.
                    - type: 'null'
                  description: >-
                    Override the base price of the plan. Pass null to remove the
                    base price.
                add_items:
                  type: array
                  items:
                    type: object
                    properties:
                      feature_id:
                        type: string
                        description: The ID of the feature to configure.
                      included:
                        type: number
                        description: >-
                          Number of free units included. Balance resets to this
                          each interval for consumable features.
                      unlimited:
                        type: boolean
                        description: >-
                          If true, customer has unlimited access to this
                          feature.
                      reset:
                        type: object
                        properties:
                          interval:
                            enum:
                              - one_off
                              - minute
                              - hour
                              - day
                              - week
                              - month
                              - quarter
                              - semi_annual
                              - year
                            type: string
                            description: >-
                              Interval at which balance resets (e.g. 'month',
                              'year'). For consumable features only.
                          interval_count:
                            type: number
                            description: Number of intervals between resets. Defaults to 1.
                        required:
                          - interval
                        description: >-
                          Reset configuration for consumable features. Omit for
                          non-consumable features like seats.
                      price:
                        type: object
                        properties:
                          amount:
                            type: number
                            description: >-
                              Price per billing_units after included usage.
                              Either 'amount' or 'tiers' is required.
                          additional_currencies:
                            type: array
                            items:
                              type: object
                              properties:
                                currency:
                                  type: string
                                  description: >-
                                    Three-letter Stripe-supported currency code
                                    (e.g. 'eur', 'gbp').
                                amount:
                                  type: number
                                  description: >-
                                    Price amount in this currency. Set
                                    explicitly per currency, not converted from
                                    the base amount.
                              required:
                                - currency
                                - amount
                            description: >-
                              Amounts in additional currencies for this flat
                              price. The base 'amount' is in the org's default
                              currency. Only valid with 'amount', not 'tiers'.
                          tiers:
                            type: array
                            items:
                              type: object
                              properties:
                                to:
                                  anyOf:
                                    - type: number
                                    - const: inf
                                amount:
                                  type: number
                                flat_amount:
                                  type: number
                                additional_currencies:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      currency:
                                        type: string
                                        description: >-
                                          Three-letter Stripe-supported currency
                                          code (e.g. 'eur', 'gbp').
                                      amount:
                                        type: number
                                        description: >-
                                          Per-unit amount for this tier in this
                                          currency.
                                      flat_amount:
                                        type: number
                                        description: >-
                                          Flat amount for this tier in this
                                          currency, if the tier uses one.
                                    required:
                                      - currency
                              required:
                                - to
                                - amount
                            description: >-
                              Tiered pricing.  Either 'amount' or 'tiers' is
                              required.
                          tier_behavior:
                            enum:
                              - graduated
                              - volume
                            type: string
                          interval:
                            enum:
                              - one_off
                              - week
                              - month
                              - quarter
                              - semi_annual
                              - year
                            type: string
                            description: >-
                              Billing interval. For consumable features, should
                              match reset.interval.
                          interval_count:
                            type: number
                            default: 1
                            description: >-
                              Number of intervals per billing cycle. Defaults to
                              1.
                          billing_units:
                            type: number
                            default: 1
                            description: >-
                              Units per price increment. Usage is rounded UP
                              when billed (e.g. billing_units=100 means 101
                              rounds to 200).
                          billing_method:
                            enum:
                              - prepaid
                              - usage_based
                            type: string
                            description: >-
                              'prepaid' for upfront payment (seats),
                              'usage_based' for pay-as-you-go.
                          max_purchase:
                            anyOf:
                              - type: number
                              - type: 'null'
                            description: >-
                              Max units purchasable beyond included. E.g.
                              included=100, max_purchase=300 allows 400 total.
                              Null for no limit.
                        required:
                          - interval
                          - billing_method
                        description: >-
                          Pricing for usage beyond included units. Omit for free
                          features.
                      proration:
                        type: object
                        properties:
                          on_increase:
                            enum:
                              - bill_immediately
                              - prorate_immediately
                              - prorate_next_cycle
                              - bill_next_cycle
                            type: string
                            description: >-
                              Billing behavior when quantity increases
                              mid-cycle.
                          on_decrease:
                            enum:
                              - prorate
                              - prorate_immediately
                              - prorate_next_cycle
                              - none
                              - no_prorations
                            type: string
                            description: Credit behavior when quantity decreases mid-cycle.
                        required:
                          - on_increase
                          - on_decrease
                        description: >-
                          Proration settings for prepaid features. Controls
                          mid-cycle quantity change billing.
                      rollover:
                        type: object
                        properties:
                          max:
                            type: number
                            description: Max rollover units. Omit for unlimited rollover.
                          max_percentage:
                            type: number
                            description: >-
                              Maximum rollover as a percentage (0-100) of
                              included + prepaid grant. Mutually exclusive with
                              max.
                          expiry_duration_type:
                            enum:
                              - month
                              - forever
                            type: string
                            description: When rolled over units expire.
                          expiry_duration_length:
                            type: number
                            description: Number of periods before expiry.
                        required:
                          - expiry_duration_type
                        description: >-
                          Rollover config for unused units. If set, unused
                          included units carry over.
                    required:
                      - feature_id
                    title: PlanItem
                    description: >-
                      Configuration for a feature item in a plan, including
                      usage limits, pricing, and rollover settings.
                  description: Items to add to the plan.
                remove_items:
                  type: array
                  items:
                    type: object
                    properties:
                      feature_id:
                        type: string
                        description: Match items linked to this feature.
                      billing_method:
                        enum:
                          - prepaid
                          - usage_based
                        type: string
                        description: >-
                          Match items with this billing method (prepaid or
                          usage_based).
                      interval:
                        anyOf:
                          - enum:
                              - one_off
                              - week
                              - month
                              - quarter
                              - semi_annual
                              - year
                            type: string
                          - enum:
                              - one_off
                              - minute
                              - hour
                              - day
                              - week
                              - month
                              - quarter
                              - semi_annual
                              - year
                            type: string
                        description: >-
                          Match items with this interval. Accepts either a
                          BillingInterval (price-side) or a ResetInterval
                          (reset-side, includes day/hour/minute) so price-less
                          items keyed by reset.interval can be disambiguated.
                      interval_count:
                        type: integer
                        minimum: -9007199254740991
                        maximum: 9007199254740991
                        exclusiveMinimum: 0
                        description: >-
                          Match items with this interval_count. Disambiguates
                          between items that share an interval but differ in
                          count.
                    title: PlanItemFilter
                    description: >-
                      Filter for matching plan items. All provided fields must
                      match (AND).
                  description: Filters selecting items to remove from the plan.
                free_trial:
                  anyOf:
                    - type: object
                      properties:
                        duration_length:
                          type: number
                          description: Number of duration_type periods the trial lasts.
                        duration_type:
                          enum:
                            - day
                            - month
                            - year
                          type: string
                          default: month
                          description: Unit of time for the trial ('day', 'month', 'year').
                        card_required:
                          type: boolean
                          default: true
                          description: >-
                            If true, payment method required to start trial.
                            Customer is charged after trial ends.
                        on_end:
                          enum:
                            - bill
                            - revert
                          type: string
                          description: >-
                            Behavior when the trial ends. 'bill' charges the
                            customer (default). 'revert' expires the trial and
                            restores the customer's previous plan.
                      required:
                        - duration_length
                      title: FreeTrialParams
                      description: Free trial configuration for a plan.
                    - type: 'null'
                  description: >-
                    Override the plan's default free trial. Pass an object to
                    set a custom trial, or null to remove the trial entirely.
                billing_controls:
                  type: object
                  properties:
                    auto_topups:
                      type: array
                      items:
                        type: object
                        properties:
                          feature_id:
                            type: string
                            description: >-
                              The ID of the feature (credit balance) to auto
                              top-up.
                          enabled:
                            type: boolean
                            default: false
                            description: Whether auto top-up is enabled.
                          threshold:
                            type: number
                            minimum: 0
                            description: >-
                              When the balance drops below this threshold, an
                              auto top-up will be purchased.
                          quantity:
                            type: number
                            minimum: 1
                            description: Amount of credits to add per auto top-up.
                          purchase_limit:
                            type: object
                            properties:
                              interval:
                                enum:
                                  - hour
                                  - day
                                  - week
                                  - month
                                type: string
                                description: >-
                                  The time interval for the purchase limit
                                  window.
                              interval_count:
                                type: number
                                minimum: 1
                                default: 1
                                description: >-
                                  Number of intervals in the purchase limit
                                  window.
                              limit:
                                type: number
                                minimum: 1
                                description: >-
                                  Maximum number of auto top-ups allowed within
                                  the interval.
                            required:
                              - interval
                              - limit
                            description: >-
                              Optional rate limit to cap how often auto top-ups
                              occur.
                          invoice_mode:
                            type: boolean
                            description: >-
                              When true, auto top-up creates a send_invoice
                              invoice instead of auto-charging.
                        required:
                          - feature_id
                          - threshold
                          - quantity
                      description: List of auto top-up configurations per feature.
                    spend_limits:
                      type: array
                      items:
                        type: object
                        properties:
                          feature_id:
                            type: string
                            description: Optional feature ID this spend limit applies to.
                          enabled:
                            type: boolean
                            default: false
                            description: Whether the overage spend limit is enabled.
                          limit_type:
                            enum:
                              - absolute
                              - usage_percentage
                            type: string
                            description: >-
                              How overage_limit is interpreted: an absolute
                              overage cap (default) or a percentage of the
                              main-plan allowance.
                          overage_limit:
                            type: number
                            minimum: 0
                            description: >-
                              Overage cap for the feature: absolute units, or a
                              percent (e.g. 120) when limit_type is
                              usage_percentage.
                          skip_overage_billing:
                            type: boolean
                            description: >-
                              When true, overage for this feature is not posted
                              to Stripe. Usage tracking and balance resets still
                              behave normally.
                      description: >-
                        List of overage spend limits per feature (caps overage
                        spend).
                    usage_limits:
                      type: array
                      items:
                        type: object
                        properties:
                          feature_id:
                            type: string
                            description: The feature this usage limit applies to.
                          enabled:
                            type: boolean
                            default: true
                            description: Whether this usage limit is enabled.
                          limit:
                            type: number
                            minimum: 0
                            description: Maximum units allowed per interval.
                          interval:
                            enum:
                              - day
                              - week
                              - month
                              - year
                            type: string
                            description: >-
                              Interval for the cap, aligned to the customer's
                              billing cycle.
                          filter:
                            type: object
                            properties:
                              properties:
                                type: object
                                propertyNames:
                                  type: string
                                  minLength: 1
                                  maxLength: 64
                                additionalProperties: {}
                            required:
                              - properties
                            description: >-
                              When set, only usage from events whose properties
                              match counts toward this cap. Omit to count all
                              usage of the feature.
                        required:
                          - feature_id
                          - limit
                          - interval
                      description: >-
                        List of hard usage caps per feature (max units per
                        interval).
                    usage_alerts:
                      type: array
                      items:
                        type: object
                        properties:
                          feature_id:
                            type: string
                            description: The feature ID this alert applies to.
                          enabled:
                            type: boolean
                            default: true
                            description: Whether this usage alert is enabled.
                          threshold:
                            type: number
                            minimum: 0
                            description: >-
                              The threshold value that triggers the alert. For
                              usage or remaining, this is an absolute count. For
                              usage_percentage or remaining_percentage, this is
                              a percentage (0-100).
                          threshold_type:
                            enum:
                              - usage
                              - usage_percentage
                              - remaining
                              - remaining_percentage
                            type: string
                            description: >-
                              Whether the threshold is an absolute count or a
                              percentage of the usage allowance or remaining
                              balance.
                          name:
                            type: string
                            description: >-
                              Optional user-defined label to distinguish
                              multiple alerts on the same feature.
                        required:
                          - threshold
                          - threshold_type
                      description: List of usage alert configurations per feature.
                    overage_allowed:
                      type: array
                      items:
                        type: object
                        properties:
                          feature_id:
                            type: string
                            description: >-
                              The feature ID this overage allowed control
                              applies to.
                          enabled:
                            type: boolean
                            default: false
                            description: Whether overage is allowed for this feature.
                        required:
                          - feature_id
                      description: >-
                        List of overage allowed controls per feature. When
                        enabled, usage can exceed balance.
                  description: >-
                    Override the plan's billing controls (auto top-ups, spend
                    limits, usage limits, usage alerts, overage allowed) for
                    this customer.
              additionalProperties: false
              description: >-
                The customization that transforms the base plan into this
                variant.
          required:
            - base_plan_id
          description: Details about how this variant relates to its latest base plan.
        config:
          type: object
          properties:
            ignore_past_due:
              type: boolean
              default: false
              description: >-
                If true, entitlements attached to this plan will still reset on
                schedule even when the customer's product is in a past_due
                state.
          description: Miscellaneous plan-level configuration flags.
        billing_controls:
          type: object
          properties:
            auto_topups:
              type: array
              items:
                type: object
                properties:
                  feature_id:
                    type: string
                    description: The ID of the feature (credit balance) to auto top-up.
                  enabled:
                    type: boolean
                    default: false
                    description: Whether auto top-up is enabled.
                  threshold:
                    type: number
                    minimum: 0
                    description: >-
                      When the balance drops below this threshold, an auto
                      top-up will be purchased.
                  quantity:
                    type: number
                    minimum: 1
                    description: Amount of credits to add per auto top-up.
                  purchase_limit:
                    type: object
                    properties:
                      interval:
                        enum:
                          - hour
                          - day
                          - week
                          - month
                        type: string
                        description: The time interval for the purchase limit window.
                      interval_count:
                        type: number
                        minimum: 1
                        default: 1
                        description: Number of intervals in the purchase limit window.
                      limit:
                        type: number
                        minimum: 1
                        description: >-
                          Maximum number of auto top-ups allowed within the
                          interval.
                    required:
                      - interval
                      - limit
                    description: Optional rate limit to cap how often auto top-ups occur.
                  invoice_mode:
                    type: boolean
                    description: >-
                      When true, auto top-up creates a send_invoice invoice
                      instead of auto-charging.
                required:
                  - feature_id
                  - threshold
                  - quantity
              description: List of auto top-up configurations per feature.
            spend_limits:
              type: array
              items:
                type: object
                properties:
                  feature_id:
                    type: string
                    description: Optional feature ID this spend limit applies to.
                  enabled:
                    type: boolean
                    default: false
                    description: Whether the overage spend limit is enabled.
                  limit_type:
                    enum:
                      - absolute
                      - usage_percentage
                    type: string
                    description: >-
                      How overage_limit is interpreted: an absolute overage cap
                      (default) or a percentage of the main-plan allowance.
                  overage_limit:
                    type: number
                    minimum: 0
                    description: >-
                      Overage cap for the feature: absolute units, or a percent
                      (e.g. 120) when limit_type is usage_percentage.
                  skip_overage_billing:
                    type: boolean
                    description: >-
                      When true, overage for this feature is not posted to
                      Stripe. Usage tracking and balance resets still behave
                      normally.
              description: List of overage spend limits per feature (caps overage spend).
            usage_limits:
              type: array
              items:
                type: object
                properties:
                  feature_id:
                    type: string
                    description: The feature this usage limit applies to.
                  enabled:
                    type: boolean
                    default: true
                    description: Whether this usage limit is enabled.
                  limit:
                    type: number
                    minimum: 0
                    description: Maximum units allowed per interval.
                  interval:
                    enum:
                      - day
                      - week
                      - month
                      - year
                    type: string
                    description: >-
                      Interval for the cap, aligned to the customer's billing
                      cycle.
                  filter:
                    type: object
                    properties:
                      properties:
                        type: object
                        propertyNames:
                          type: string
                          minLength: 1
                          maxLength: 64
                        additionalProperties: {}
                    required:
                      - properties
                    description: >-
                      When set, only usage from events whose properties match
                      counts toward this cap. Omit to count all usage of the
                      feature.
                required:
                  - feature_id
                  - limit
                  - interval
              description: List of hard usage caps per feature (max units per interval).
            usage_alerts:
              type: array
              items:
                type: object
                properties:
                  feature_id:
                    type: string
                    description: The feature ID this alert applies to.
                  enabled:
                    type: boolean
                    default: true
                    description: Whether this usage alert is enabled.
                  threshold:
                    type: number
                    minimum: 0
                    description: >-
                      The threshold value that triggers the alert. For usage or
                      remaining, this is an absolute count. For usage_percentage
                      or remaining_percentage, this is a percentage (0-100).
                  threshold_type:
                    enum:
                      - usage
                      - usage_percentage
                      - remaining
                      - remaining_percentage
                    type: string
                    description: >-
                      Whether the threshold is an absolute count or a percentage
                      of the usage allowance or remaining balance.
                  name:
                    type: string
                    description: >-
                      Optional user-defined label to distinguish multiple alerts
                      on the same feature.
                required:
                  - threshold
                  - threshold_type
              description: List of usage alert configurations per feature.
            overage_allowed:
              type: array
              items:
                type: object
                properties:
                  feature_id:
                    type: string
                    description: The feature ID this overage allowed control applies to.
                  enabled:
                    type: boolean
                    default: false
                    description: Whether overage is allowed for this feature.
                required:
                  - feature_id
              description: >-
                List of overage allowed controls per feature. When enabled,
                usage can exceed balance.
          description: Plan-level billing controls used as customer defaults.
        metadata:
          type: object
          propertyNames:
            type: string
          additionalProperties: {}
          description: >-
            Arbitrary key-value metadata defined by you for your own use. Shared
            across all versions of the plan.
        customer_eligibility:
          type: object
          properties:
            trial_available:
              type: boolean
              description: >-
                Whether the trial on this plan is available to this customer.
                For example, if the customer used the trial in the past, this
                will be false.
            status:
              enum:
                - active
                - scheduled
              type: string
              description: >-
                The customer's current status with this plan. 'active' if
                attached, 'scheduled' if pending activation.
            canceling:
              type: boolean
              description: >-
                Whether the customer's active instance of this plan is set to
                cancel.
            trialing:
              type: boolean
              description: Whether the customer is currently on a free trial of this plan.
            attach_action:
              enum:
                - activate
                - upgrade
                - downgrade
                - none
                - purchase
              type: string
              description: >-
                The action that would occur if this plan were attached to the
                customer.
          required:
            - attach_action
      required:
        - id
        - name
        - description
        - group
        - version
        - add_on
        - auto_enable
        - price
        - items
        - created_at
        - env
        - archived
        - base_variant_id
        - config
        - metadata
    Balance:
      type: object
      properties:
        feature_id:
          type: string
          description: The feature ID this balance is for.
        feature:
          type: object
          properties:
            id:
              type: string
              description: >-
                The unique identifier for this feature, used in /check and
                /track calls.
            name:
              type: string
              description: Human-readable name displayed in the dashboard and billing UI.
            type:
              enum:
                - boolean
                - metered
                - credit_system
                - ai_credit_system
              type: string
              description: >-
                Feature type: 'boolean' for on/off access, 'metered' for
                usage-tracked features, 'credit_system' for unified credit
                pools, 'ai_credit_system' for model-based token pricing.
            consumable:
              type: boolean
              description: >-
                For metered features: true if usage resets periodically (API
                calls, credits), false if allocated persistently (seats,
                storage).
            event_names:
              type: array
              items:
                type: string
              description: >-
                Event names that trigger this feature's balance. Allows multiple
                features to respond to a single event.
            credit_schema:
              type: array
              items:
                type: object
                properties:
                  metered_feature_id:
                    type: string
                    description: >-
                      ID of the metered feature that draws from this credit
                      system.
                  credit_cost:
                    type: number
                    description: Credits consumed per unit of the metered feature.
                required:
                  - metered_feature_id
                  - credit_cost
              description: >-
                For credit_system features: maps metered features to their
                credit costs.
            model_markups:
              anyOf:
                - type: object
                  propertyNames:
                    type: string
                  additionalProperties:
                    type: object
                    properties:
                      markup:
                        type: number
                        minimum: -100
                      input_cost:
                        type: number
                        minimum: 0
                      output_cost:
                        type: number
                        minimum: 0
                - type: 'null'
              description: Per-model markup overrides for AI credit systems.
            default_markup:
              type: number
              minimum: -100
              description: >-
                Default percentage markup for AI credit systems. Use -100 to
                make usage free.
            provider_markups:
              anyOf:
                - type: object
                  propertyNames:
                    type: string
                  additionalProperties:
                    type: object
                    properties:
                      markup:
                        type: number
                        minimum: -100
                    required:
                      - markup
                - type: 'null'
              description: Per-provider default markup percentages for AI credit systems.
            display:
              type: object
              properties:
                singular:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: Singular form for UI display (e.g., 'API call', 'seat').
                plural:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: Plural form for UI display (e.g., 'API calls', 'seats').
              description: >-
                Display names for the feature in billing UI and customer-facing
                components.
            archived:
              type: boolean
              description: Whether the feature is archived and hidden from the dashboard.
          required:
            - id
            - name
            - type
            - consumable
            - archived
          description: The full feature object if expanded.
        granted:
          type: number
          description: Total balance granted (included + prepaid).
        remaining:
          type: number
          minimum: 0
          description: Remaining balance available for use.
        usage:
          type: number
          description: Total usage consumed in the current period.
        unlimited:
          type: boolean
          description: Whether this feature has unlimited usage.
        overage_allowed:
          type: boolean
          description: >-
            Whether usage beyond the granted balance is allowed (with overage
            charges).
        max_purchase:
          anyOf:
            - type: number
            - type: 'null'
          description: >-
            Maximum quantity that can be purchased as a top-up, or null for
            unlimited.
        next_reset_at:
          anyOf:
            - type: number
            - type: 'null'
          description: Timestamp when the balance will reset, or null for no reset.
        breakdown:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                default: ''
                description: The unique identifier for this balance breakdown.
              plan_id:
                anyOf:
                  - type: string
                  - type: 'null'
                description: >-
                  The plan ID this balance originates from, or null for
                  standalone balances.
              included_grant:
                type: number
                description: Amount granted from the plan's included usage.
              prepaid_grant:
                type: number
                description: Amount granted from prepaid purchases or top-ups.
              remaining:
                type: number
                description: Remaining balance available for use.
              usage:
                type: number
                description: Amount consumed in the current period.
              unlimited:
                type: boolean
                description: Whether this balance has unlimited usage.
              reset:
                anyOf:
                  - type: object
                    properties:
                      interval:
                        anyOf:
                          - enum:
                              - one_off
                              - minute
                              - hour
                              - day
                              - week
                              - month
                              - quarter
                              - semi_annual
                              - year
                            type: string
                          - const: multiple
                        description: >-
                          The reset interval (hour, day, week, month, etc.) or
                          'multiple' if combined from different intervals.
                      interval_count:
                        type: number
                        description: >-
                          Number of intervals between resets (eg. 2 for
                          bi-monthly).
                      resets_at:
                        anyOf:
                          - type: number
                          - type: 'null'
                        description: Timestamp when the balance will next reset.
                    required:
                      - interval
                      - resets_at
                  - type: 'null'
                description: Reset configuration for this balance, or null if no reset.
              price:
                anyOf:
                  - type: object
                    properties:
                      amount:
                        type: number
                        description: The per-unit price amount.
                      tiers:
                        type: array
                        items:
                          type: object
                          properties:
                            to:
                              anyOf:
                                - type: number
                                - const: inf
                            amount:
                              type: number
                            flat_amount:
                              type: number
                          required:
                            - to
                            - amount
                        description: Tiered pricing configuration if applicable.
                      tier_behavior:
                        enum:
                          - graduated
                          - volume
                        type: string
                        description: >-
                          How tiers are applied: graduated (split across bands)
                          or volume (flat rate for the matched tier).
                      billing_units:
                        type: number
                        description: >-
                          The number of units per billing increment (eg. $9 /
                          250 units).
                      billing_method:
                        enum:
                          - prepaid
                          - usage_based
                        type: string
                        description: Whether usage is prepaid or billed pay-per-use.
                      max_purchase:
                        anyOf:
                          - type: number
                          - type: 'null'
                        description: >-
                          Maximum quantity that can be purchased, or null for
                          unlimited.
                    required:
                      - billing_units
                      - billing_method
                      - max_purchase
                  - type: 'null'
                description: Pricing configuration if this balance has usage-based pricing.
              expires_at:
                anyOf:
                  - type: number
                  - type: 'null'
                description: >-
                  Timestamp when this balance expires, or null for no
                  expiration.
            required:
              - plan_id
              - included_grant
              - prepaid_grant
              - remaining
              - usage
              - unlimited
              - reset
              - price
              - expires_at
          description: >-
            Detailed breakdown of balance sources when stacking multiple plans
            or grants.
        rollovers:
          type: array
          items:
            type: object
            properties:
              balance:
                type: number
                description: Amount of balance rolled over from a previous period.
              expires_at:
                type: number
                description: Timestamp when the rollover balance expires.
            required:
              - balance
              - expires_at
          description: Rollover balances carried over from previous periods.
      required:
        - feature_id
        - granted
        - remaining
        - usage
        - unlimited
        - overage_allowed
        - max_purchase
        - next_reset_at
      examples:
        - feature_id: messages
          granted: 100
          remaining: 72
          usage: 28
          unlimited: false
          overage_allowed: false
          max_purchase: null
          next_reset_at: 1773851121437
          breakdown:
            - id: cus_ent_39qmLooixXLAqMywgXywjAz96rV
              plan_id: pro_plan
              included_grant: 100
              prepaid_grant: 0
              remaining: 72
              usage: 28
              unlimited: false
              reset:
                interval: month
                resets_at: 1773851121437
              price: null
              expires_at: null
  securitySchemes:
    secretKey:
      type: http
      scheme: bearer
      bearerFormat: JWT

````