Skip to content

List a wallet's credit grants

The credit_grants.list operation: GET /api/v1/wallets/{id}/grants in the REST API and the credit_grants_list tool in the MCP server.

GET/api/v1/wallets/{id}/grants

Lists the credits behind a wallet's balance, newest first: purchases (top-ups and credit packs), subscription credits, promo and adjustment grants and refund reversals. remaining is what is left of each grant (credits held by open reservations count as left); expiresAt is when unused credits expire.

Credits are spent promo first, then subscription credits, then purchased ones, soonest expiry first within each (spec §17.1, priority).

At a glance

  • REST: GET /api/v1/wallets/{id}/grants
  • MCP tool: credit_grants_list
  • Operation ID: credit_grants.list
  • Scope: Brand
  • Permission: wallets:read
  • Risk tier: read
  • Dry run: Not supported
  • Idempotency: Not needed (read only)
  • Modes: Test and live
  • Pagination: limit (at most 100) and starting_after
  • Authentication: API key with the wallets:read scope
  • Since: M6

Request

Path parameters

FieldTypeDescription
idwal_… IDThe wallet (wal_…).

Query parameters

FieldTypeRequiredDescription
limitinteger (1 to 100)No
starting_aftergrant_… IDNo

Response

200 OK with a JSON object, a page of the list (newest first):

FieldTypeDescription
object"list"
dataarray of object
data[].idgrant_… ID
data[].object"credit_grant"
data[].brandIdbrd_… ID
data[].livemodeboolean
data[].walletIdwal_… ID
data[].sourceone of purchase, subscription, promo, adjustment, refund_reversalpurchase, subscription, promo, adjustment or refund_reversal.
data[].amountmoneyWhat was granted.
data[].remainingmoneyWhat is left: not yet spent or expired (reserved credits count as left).
data[].priorityintegerSpend tier (§17.1): 1 promo, 2 subscription, 3 purchased and the rest.
data[].expiresAtdate-time or null
data[].expiredbooleanexpiresAt has passed: the credits can't be spent any more.
data[].reasonstring or nullThe operator's reason, for promo and adjustment grants.
data[].paymentIdstring or null
data[].invoiceIdstring or null
data[].createdAtdate-time
has_moreboolean
next_cursorstring or null

Examples

A promo grant and a purchase

HTTP
GET /api/v1/wallets/wal_01m4ty7w2a5qx7mhd9k8w6s0b1/grants
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "object": "list",
  "data": [
    {
      "id": "grant_01m4ty7w2a5qx7mhd9k8w6s0b3",
      "object": "credit_grant",
      "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
      "livemode": false,
      "walletId": "wal_01m4ty7w2a5qx7mhd9k8w6s0b1",
      "source": "promo",
      "amount": {
        "amount": "5000000",
        "currency": "EUR"
      },
      "remaining": {
        "amount": "5000000",
        "currency": "EUR"
      },
      "priority": 1,
      "expiresAt": "2026-11-01T00:00:00.000Z",
      "expired": false,
      "reason": "Welcome credits",
      "paymentId": null,
      "invoiceId": null,
      "createdAt": "2026-10-16T10:15:00.000Z"
    },
    {
      "id": "grant_01m4ty7w2a5qx7mhd9k8w6s0b2",
      "object": "credit_grant",
      "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
      "livemode": false,
      "walletId": "wal_01m4ty7w2a5qx7mhd9k8w6s0b1",
      "source": "purchase",
      "amount": {
        "amount": "80000000",
        "currency": "EUR"
      },
      "remaining": {
        "amount": "80000000",
        "currency": "EUR"
      },
      "priority": 3,
      "expiresAt": null,
      "expired": false,
      "reason": null,
      "paymentId": "pay_01m4ty7w2a5qx7mhd9k8w6s0b5",
      "invoiceId": null,
      "createdAt": "2026-10-14T09:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400id isn't a wallet ID, or a pagination value is invalid.Fix the fields listed in details.issues and send the request again.
resource_not_found404This brand has no such wallet in this mode (wallets belong to one brand and one mode).Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
scope_required400The request names no brand (an org or entity key without Ownrecord-Brand).Call the operation with credentials or a target at its level: an organization, a legal entity, a brand or the platform (details.required_scope).
permission_denied403You can't read this brand's wallets (wallets:read).Ask an organization owner or admin for a role or scope that allows this action.
livemode_not_allowed403You have no live-mode access, so you can't use live wallets.Use test mode, or credentials for the target's mode. Developers need live access granted by an organization owner or admin.

It can also return these common errors: api_version_unsupported, authentication_required, api_key_invalid, dry_run_not_supported, rate_limited, internal_error.