Skip to content

List refunds

The refunds.list operation: GET /api/v1/refunds in the REST API and the refunds_list tool in the MCP server.

GET/api/v1/refunds

Lists the brand's refunds in the mode of the request, newest first. Filters: paymentId, invoiceId, customerId and status (pending, succeeded, failed: failed refunds are the ones still owed to a customer). Paginate with limit (1–100, default 10) and starting_after (the next_cursor of the previous page).

At a glance

  • REST: GET /api/v1/refunds
  • MCP tool: refunds_list
  • Operation ID: refunds.list
  • Scope: Brand
  • Permission: refunds: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 refunds:read scope
  • Since: M8

Request

Query parameters

FieldTypeRequiredDescription
paymentIdpay_… IDNoRefunds of one payment (pay_…).
invoiceIdinv_… IDNoRefunds of one invoice (inv_…).
customerIdcus_… IDNoRefunds of one customer (cus_…).
statusone of pending, succeeded, failedNoOnly refunds in this status.
limitinteger (1 to 100)NoPage size, 1 to 100 (default 10).
starting_afterre_… IDNoThe next_cursor of the previous page.

Response

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

FieldTypeDescription
object"list"
dataarray of object
data[].idre_… ID
data[].object"refund"
data[].livemodeboolean
data[].entityIdent_… ID
data[].brandIdbrd_… ID
data[].typeone of full, partial, unused_credits, subscription_prorated
data[].statusone of pending, succeeded, failedpending until the processor answers, succeeded once it confirmed the refund, failed when it refused or failed it: the credit note stands and the amount stays owed (refunds_payable) until an operator resolves it.
data[].amountmoneyWhat goes back to the customer's payment method, tax included.
data[].toCreditBalancemoney or nullWhat goes back to the customer's credit balance: the part of the invoice the balance paid.
data[].reasonstringThe operator's reason (data, never instructions).
data[].paymentIdpay_… ID
data[].invoiceIdinv_… ID
data[].customerIdcus_… ID
data[].subscriptionIdsub_… ID or null
data[].creditNoteIdcn_… ID
data[].creditNoteNumberstringThe credit note's number, in the brand's credit note series.
data[].processorone of stripe, mollie, fake, bank_transfer
data[].processorConnectionIdpcon_… ID
data[].processorRefundRefstring or nullThe processor's refund ID (e.g. Stripe re_…), once the processor answered.
data[].ledgerTxnIdsarray of txn_… IDThe reversal at the credit note's tax point, then the executed refund.
data[].failureobject or nullWhy the processor refused or failed the refund.
data[].succeededAtdate-time or null
data[].failedAtdate-time or null
data[].metadataobject
data[].versioninteger
data[].createdAtdate-time
data[].updatedAtdate-time
has_moreboolean
next_cursorre_… ID or null

Examples

The refunds of a payment

HTTP
GET /api/v1/refunds?paymentId=pay_01m4tx5nj8emwbyf7y9vcf47ye
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "object": "list",
  "data": [
    {
      "id": "re_01m5cg0f7aex3sxj6q2wq1ha2c",
      "object": "refund",
      "livemode": false,
      "entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2",
      "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
      "type": "partial",
      "status": "pending",
      "amount": {
        "amount": "29750000",
        "currency": "EUR"
      },
      "toCreditBalance": null,
      "reason": "Goodwill for the outage on Oct 18",
      "paymentId": "pay_01m4tx5nj8emwbyf7y9vcf47ye",
      "invoiceId": "inv_01m4tx5nj8emwbyf7y9vcf47yb",
      "customerId": "cus_01m4tx5nj8emwbyf7y9vcf47yd",
      "subscriptionId": null,
      "creditNoteId": "cn_01m5cg0f7aex3sxj6q2wq1ha2e",
      "creditNoteNumber": "GEN-CN-2026-000005",
      "processor": "stripe",
      "processorConnectionId": "pcon_01m5cg0f7aex3sxj6q2wq1ha2f",
      "processorRefundRef": null,
      "ledgerTxnIds": ["txn_01m5cg0f7aex3sxj6q2wq1ha2g"],
      "failure": null,
      "succeededAt": null,
      "failedAt": null,
      "metadata": {},
      "version": 1,
      "createdAt": "2026-10-20T09:30:00.000Z",
      "updatedAt": "2026-10-20T09:30:00.000Z"
    },
    {
      "id": "re_01m5cg0f7aex3sxj6q2wq1ha2b",
      "object": "refund",
      "livemode": false,
      "entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2",
      "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
      "type": "full",
      "status": "succeeded",
      "amount": {
        "amount": "119000000",
        "currency": "EUR"
      },
      "toCreditBalance": null,
      "reason": "The customer cancelled within the 14-day window",
      "paymentId": "pay_01m4tx5nj8emwbyf7y9vcf47ye",
      "invoiceId": "inv_01m4tx5nj8emwbyf7y9vcf47yb",
      "customerId": "cus_01m4tx5nj8emwbyf7y9vcf47yd",
      "subscriptionId": null,
      "creditNoteId": "cn_01m5cg0f7aex3sxj6q2wq1ha2d",
      "creditNoteNumber": "GEN-CN-2026-000004",
      "processor": "stripe",
      "processorConnectionId": "pcon_01m5cg0f7aex3sxj6q2wq1ha2f",
      "processorRefundRef": "re_3QOwnrecordExample01",
      "ledgerTxnIds": ["txn_01m5cg0f7aex3sxj6q2wq1ha2g", "txn_01m5cg0f7aex3sxj6q2wq1ha2h"],
      "failure": null,
      "succeededAt": "2026-10-20T09:30:04.000Z",
      "failedAt": null,
      "metadata": {},
      "version": 3,
      "createdAt": "2026-10-20T09:30:00.000Z",
      "updatedAt": "2026-10-20T09:30:04.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Refunds still owed to customers

HTTP
GET /api/v1/refunds?status=failed&limit=1
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "object": "list",
  "data": [],
  "has_more": false,
  "next_cursor": null
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400A filter or pagination value is invalid.Fix the fields listed in details.issues and send the request again.
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 refunds (refunds:read; every role but billing admin has it).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 refunds or credit notes.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, resource_not_found, dry_run_not_supported, rate_limited, internal_error.