Skip to content

List customers

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

GET/api/v1/customers

Lists the brand's customers in the mode of the request, newest first: only this organization's customers, never another organization's. Deleted customers are left out unless includeDeleted=true.

  • email: the customer with exactly this address (addresses are compared in lower case);
  • emailPrefix: customers whose address starts with this text (search);
  • type: individual, business or unknown.

Paginate with limit (1–100, default 10) and starting_after (the next_cursor of the previous page).

At a glance

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

Request

Query parameters

FieldTypeRequiredDescription
limitinteger (1 to 100)No
starting_aftercus_… IDNoThe customer's ID (cus_…).
emailstringNoOnly the customer with exactly this email address.
emailPrefixstringNoCustomers whose email starts with this text (search).
typeone of individual, business, unknownNo
includeDeletedboolean or stringNoInclude deleted customers (default false). true/false, also as a query string.

Response

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

FieldTypeDescription
object"list"
dataarray of object
data[].idcus_… ID
data[].object"customer"
data[].livemodeboolean
data[].entityIdent_… ID
data[].brandIdbrd_… ID
data[].emailstring
data[].namestring or null
data[].businessNamestring or null
data[].localestring or null
data[].typeone of individual, business, unknownInferred (spec §13.1): business with a tax ID that isn't rejected, or with a business name when declared a business. Tax is decided per sale: only a valid tax ID makes a sale business-to-business.
data[].declaredTypeone of individual, business, unknownWhat you declared.
data[].billingAddressobject or null
data[].taxIdsarray of object
data[].taxIds[].idstringIdentifies the tax ID on the customer: its canonical number, e.g. ATU12345678.
data[].taxIds[].typestringeu_vat, gb_vat, ch_uid/ch_vat, no_org/no_vat, us_ein, or another type (unverified).
data[].taxIds[].valuestringThe number as given.
data[].taxIds[].countrystring
data[].taxIds[].numberstring or nullThe canonical number (null for types Ownrecord can't check).
data[].taxIds[].verificationobjectThe latest check (spec §9.4).
data[].taxIds[].verification.statusone of valid, invalid, unavailable, format_only, unverifiedvalid, invalid, unavailable (the register couldn't answer), format_only (no register: format and checksum) or unverified (a type Ownrecord can't check).
data[].taxIds[].verification.sourcestringWho decided: VIES, HMRC, CH_UID, FORMAT (format and checksum only) or NONE.
data[].taxIds[].verification.reasonstring or nullWhy, e.g. not_registered or service_unavailable.
data[].taxIds[].verification.checkedAtdate-time
data[].taxIds[].verification.consultationNumberstring or nullThe register's proof of the check (VIES request identifier, HMRC consultation number).
data[].taxIds[].verification.simulatedbooleanA fixture answer (development and test environments), not a register's.
data[].taxIds[].historyarray of objectEarlier checks, newest first (at most 10).
data[].taxIds[].history[].statusone of valid, invalid, unavailable, format_only, unverifiedvalid, invalid, unavailable (the register couldn't answer), format_only (no register: format and checksum) or unverified (a type Ownrecord can't check).
data[].taxIds[].history[].sourcestringWho decided: VIES, HMRC, CH_UID, FORMAT (format and checksum only) or NONE.
data[].taxIds[].history[].reasonstring or nullWhy, e.g. not_registered or service_unavailable.
data[].taxIds[].history[].checkedAtdate-time
data[].taxIds[].history[].consultationNumberstring or nullThe register's proof of the check (VIES request identifier, HMRC consultation number).
data[].taxIds[].history[].simulatedbooleanA fixture answer (development and test environments), not a register's.
data[].taxIds[].addedAtdate-time
data[].taxCountryLockedobject or nullWhere the customer's purchases are taxed (spec §9.3): set at the first successful payment, moved only when a top-up's evidence resolves to another country.
data[].taxExemptobject or nullTax exemption (spec §9.5). Not applied yet: exemption certificates come in a later release.
data[].processorRefsarray of objectThe customer at each payment processor used (set by checkout).
data[].processorRefs[].processorConnectionIdpcon_… ID
data[].processorRefs[].customerRefstring
data[].riskobject
data[].risk.levelone of normal, elevated, blocked
data[].risk.reasonsarray of string
data[].risk.firstPaymentAtdate-time or null
data[].risk.totalPaidmoney
data[].portalLastLoginAtdate-time or null
data[].testClockIdclk_… ID or nullTest mode: the test clock the customer was created on (spec §16.13).
data[].metadataobject
data[].createdAtdate-time
data[].updatedAtdate-time
data[].deletedAtdate-time or nullWhen the customer was deleted (soft delete); null while active.
has_moreboolean
next_cursorstring or null

Examples

Find a customer by email

HTTP
GET /api/v1/customers?email=ana%40example.com
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "object": "list",
  "data": [
    {
      "id": "cus_01m4ty3c2b5qx7mhd9k8w6s0ab",
      "object": "customer",
      "livemode": false,
      "entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2",
      "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
      "email": "ana@example.com",
      "name": "Ana Schmidt",
      "businessName": null,
      "locale": "de",
      "type": "individual",
      "declaredType": "individual",
      "billingAddress": {
        "line1": null,
        "line2": null,
        "city": null,
        "postalCode": null,
        "region": null,
        "country": "DE"
      },
      "taxIds": [],
      "taxCountryLocked": {
        "country": "DE",
        "subdivision": null,
        "lockedAt": "2026-10-14T09:30:00.000Z",
        "evidenceSetId": "evs_01m4ty3c2b5qx7mhd9k8w6s0ac"
      },
      "taxExempt": null,
      "processorRefs": [
        {
          "processorConnectionId": "pcon_01m4ty3c2b5qx7mhd9k8w6s0af",
          "customerRef": "cus_QxY12AbC"
        }
      ],
      "risk": {
        "level": "normal",
        "reasons": [],
        "firstPaymentAt": "2026-10-14T09:30:00.000Z",
        "totalPaid": {
          "amount": "119000000",
          "currency": "EUR"
        }
      },
      "portalLastLoginAt": null,
      "testClockId": null,
      "metadata": {},
      "createdAt": "2026-10-14T09:00:00.000Z",
      "updatedAt": "2026-10-14T09:30:00.000Z",
      "deletedAt": null
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Business customers, two per page

HTTP
GET /api/v1/customers?type=business&limit=2
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "object": "list",
  "data": [
    {
      "id": "cus_01m4ty3c2b5qx7mhd9k8w6s0aa",
      "object": "customer",
      "livemode": false,
      "entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2",
      "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
      "email": "billing@alpenapps.example",
      "name": "Lena Huber",
      "businessName": "Alpen Apps GmbH",
      "locale": "de-AT",
      "type": "business",
      "declaredType": "business",
      "billingAddress": {
        "line1": "Mariahilfer Straße 1",
        "line2": null,
        "city": "Wien",
        "postalCode": "1060",
        "region": null,
        "country": "AT"
      },
      "taxIds": [
        {
          "id": "ATU00000000",
          "type": "eu_vat",
          "value": "ATU 0000 0000",
          "country": "AT",
          "number": "ATU00000000",
          "verification": {
            "status": "valid",
            "source": "VIES",
            "reason": null,
            "checkedAt": "2026-10-14T09:00:00.000Z",
            "consultationNumber": "WAPIAAAAZ1x2y3",
            "simulated": false
          },
          "history": [],
          "addedAt": "2026-10-14T09:00:00.000Z"
        }
      ],
      "taxCountryLocked": null,
      "taxExempt": null,
      "processorRefs": [],
      "risk": {
        "level": "normal",
        "reasons": [],
        "firstPaymentAt": null,
        "totalPaid": {
          "amount": "0",
          "currency": "EUR"
        }
      },
      "portalLastLoginAt": null,
      "testClockId": null,
      "metadata": {
        "userId": "u_4821"
      },
      "createdAt": "2026-10-14T09:00:00.000Z",
      "updatedAt": "2026-10-14T09:00:00.000Z",
      "deletedAt": null
    },
    {
      "id": "cus_01m4ty3c2b5qx7mhd9k8w6s0a9",
      "object": "customer",
      "livemode": false,
      "entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2",
      "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
      "email": "billing@alpenapps.example",
      "name": "Lena Huber",
      "businessName": "Alpen Apps GmbH",
      "locale": "de-AT",
      "type": "business",
      "declaredType": "business",
      "billingAddress": {
        "line1": "Mariahilfer Straße 1",
        "line2": null,
        "city": "Wien",
        "postalCode": "1060",
        "region": null,
        "country": "AT"
      },
      "taxIds": [
        {
          "id": "ATU00000000",
          "type": "eu_vat",
          "value": "ATU 0000 0000",
          "country": "AT",
          "number": "ATU00000000",
          "verification": {
            "status": "valid",
            "source": "VIES",
            "reason": null,
            "checkedAt": "2026-10-14T09:00:00.000Z",
            "consultationNumber": "WAPIAAAAZ1x2y3",
            "simulated": false
          },
          "history": [],
          "addedAt": "2026-10-14T09:00:00.000Z"
        }
      ],
      "taxCountryLocked": null,
      "taxExempt": null,
      "processorRefs": [],
      "risk": {
        "level": "normal",
        "reasons": [],
        "firstPaymentAt": null,
        "totalPaid": {
          "amount": "0",
          "currency": "EUR"
        }
      },
      "portalLastLoginAt": null,
      "testClockId": null,
      "metadata": {
        "userId": "u_4821"
      },
      "createdAt": "2026-10-14T09:00:00.000Z",
      "updatedAt": "2026-10-14T09:00:00.000Z",
      "deletedAt": null
    }
  ],
  "has_more": true,
  "next_cursor": "cus_01m4ty3c2b5qx7mhd9k8w6s0a9"
}

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).
livemode_not_allowed403You have no live-mode access, so you can't act on live customers.Use test mode, or credentials for the target's mode. Developers need live access granted by an organization owner or admin.
permission_denied403You can't read this brand's customers (customers:read).Ask an organization owner or admin for a role or scope that allows this action.

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.