Join usage-based billing early access (beta)
Usage-based billing is in early access (beta). Read how it works, then apply to join. We'll reach out if you meet the program requirements.
/customers/{customer_id}/usage-balances/{usage_balance_id}/grantsReturns a paginated list of grants for a usage balance. Use the query parameters to page through results.
A grant is an amount of a usage balance unit that funds a usage balance, like the allowance from a subscription. Usage balances belong to customers rather than subscriptions, so a customer with more than one subscription that includes the same usage balance unit has a grant from each. Use grants to show customers how much of each subscription's allowance is left and when it expires.
Grants stay in the list until they expire or a renewal replaces them, including grants that are used up. Paddle doesn't return expired or replaced grants, so you can't use grants to get the history of a usage balance.
Added together, amount.remaining across all grants equals balance.remaining.total on the usage balance. Paddle updates grants and usage balances shortly after it processes events, so a new grant might take a moment to appear, and the totals might not match until it does. Grants don't include overage, which is usage recorded after the customer's grants are used up.
Paddle creates grants automatically, so you can't create or update them using the API.
usage_balance.read permission.Path parameters
ctm_01grnn4zta5a1mf02jjze7y2ysctm_.^ctm_[a-z\d]{26}$^ubl_[a-z\d]{26}$Query parameters
meta.pagination.next URL in responses for list operations.50Set how many entities are returned per page. Paddle returns the maximum number of results if a number greater than the maximum is requested. Check meta.pagination.per_page in the response to see how many were returned.
Default: 50; Maximum: 200.
subscriptionAllowance from a price on a subscription.source.idis the Paddle ID of the subscription.
id[DESC]Order returned entities by the specified field and direction ([ASC] or [DESC]). For example, ?order_by=id[ASC].
Valid fields for ordering: expires_at, granted_at, and id.
Header parameters
true to skip the count query on list operations. When set, meta.pagination.estimated_total returns -1 instead of an exact count.Response (200)
ucb_01jqr8m0k3z9v6x2c4b7n5d8e1ucb_.^ucb_[a-z\d]{26}$ubl_01h9zx4p8q2r5t7v9w1y3z5b7d^ubl_[a-z\d]{26}$ubu_01kw8ta2j8x5t7q4v9m1kd6phz^ubu_[a-z\d]{26}$subscriptionAllowance from a price on a subscription.source.idis the Paddle ID of the subscription.
sub_01h04vsc0qhwtsbsxh3422wjs4type is subscription.^[a-z]+_[a-z\d]{26}$remaining across all grants for a usage balance equals balance.remaining.total on the usage balance.^(0|[1-9][0-9]{0,34})(\.[0-9]{1,9})?$^(0|[1-9][0-9]{0,34})(\.[0-9]{1,9})?$granted minus used.^(0|[1-9][0-9]{0,34})(\.[0-9]{1,9})?$null if a subscription didn't fund this grant.2024-10-12T07:20:50.52Z2024-10-12T07:20:50.52Z2024-10-12T07:20:50.52Z2024-10-12T07:20:50.52Znull if this grant doesn't expire. When set, it's always in the future, because expired grants aren't returned.amount.granted by the price whose allowance granted it. Empty if this grant doesn't come from an allowance on a price.pri_01gsz8z1q1n00f12qt82y31smh^pri_[a-z\d]{26}$amount.granted comes from this price.^(0|[1-9][0-9]{0,34})(\.[0-9]{1,9})?$b15ec92e-8688-40d4-a04d-f44cbec93355after parameter that marks the starting point of the next page. Always returned, even if has_more is false.999Estimated number of entities for this response.
For datasets with 100,000 or fewer matches, returns the exact count. For datasets with more than 100,000 matches, returns 100001 to indicate that more than 100,000 entities match. Returns -1 when counting is skipped or couldn't be calculated.
Use has_more and next to page through all results rather than relying on estimated_total for an exact count.
{ "data": [ { "id": "ucb_01jqr8m0k3z9v6x2c4b7n5d8e1", "usage_balance_id": "ubl_01h9zx4p8q2r5t7v9w1y3z5b7d", "usage_balance_unit_id": "ubu_01kw8ta2j8x5t7q4v9m1kd6phz", "source": { "type": "subscription", "id": "sub_01h04vsc0qhwtsbsxh3422wjs4" }, "amount": { "granted": "3000", "used": "3000", "remaining": "0" }, "priority": 1, "period": { "starts_at": "2026-09-02T00:00:00Z", "ends_at": "2026-10-02T00:00:00Z" }, "granted_at": "2026-09-02T10:00:04Z", "expires_at": "2026-10-02T00:00:00Z", "contributions": [ { "price_id": "pri_01gsz8z1q1n00f12qt82y31smh", "amount": "3000" } ] }, { "id": "ucb_01jqr8s5m1a8b2c6d9e3f7g4h0", "usage_balance_id": "ubl_01h9zx4p8q2r5t7v9w1y3z5b7d", "usage_balance_unit_id": "ubu_01kw8ta2j8x5t7q4v9m1kd6phz", "source": { "type": "subscription", "id": "sub_01h8bx8fmywym11t6swgzba704" }, "amount": { "granted": "7000", "used": "500", "remaining": "6500" }, "priority": 2, "period": { "starts_at": "2026-09-10T00:00:00Z", "ends_at": "2026-10-10T00:00:00Z" }, "granted_at": "2026-09-10T00:00:03Z", "expires_at": "2026-10-10T00:00:00Z", "contributions": [ { "price_id": "pri_01gsz98e27ak2tyhexptwc58yk", "amount": "7000" } ] } ], "meta": { "request_id": "b8f0c2a1-9d3e-4f7a-8c1b-2e5a6d4f9017", "pagination": { "per_page": 50, "next": "https://api.paddle.com/customers/ctm_01gw9m680k848184fpttwr0b7z/usage-balances/ubl_01h9zx4p8q2r5t7v9w1y3z5b7d/grants?after=ucb_01jqr8s5m1a8b2c6d9e3f7g4h0", "has_more": false, "estimated_total": 2 } }}