Skip to content

Get a customer

The customers.get operation: GET /api/v1/customers/{id} in the REST API and the customers_get tool in the MCP server.

GET/api/v1/customers/{id}

Returns a customer of the brand in the mode of the request: profile, inferred and declared type, billing address, tax IDs with their latest check and earlier checks, the locked tax country (set at the first successful payment, spec §9.3), processor references and risk. Deleted customers are returned too, with deletedAt. The customer's location evidence is listed by customers.evidence_sets.list.

At a glance

  • REST: GET /api/v1/customers/{id}
  • MCP tool: customers_get
  • Operation ID: customers.get
  • Scope: Brand
  • Permission: customers:read
  • Risk tier: read
  • Dry run: Not supported
  • Idempotency: Not needed (read only)
  • Modes: Test and live
  • Authentication: API key with the customers:read scope
  • Since: M4

Request

Path parameters

FieldTypeDescription
idcus_… IDThe customer's ID (cus_…).

Query parameters

This operation takes no query parameters.

Response

200 OK with a JSON object:

FieldTypeDescription
idcus_… ID
object"customer"
livemodeboolean
entityIdent_… ID
brandIdbrd_… ID
emailstring
namestring or null
businessNamestring or null
localestring or null
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.
declaredTypeone of individual, business, unknownWhat you declared.
billingAddressobject or null
taxIdsarray of object
taxIds[].idstringIdentifies the tax ID on the customer: its canonical number, e.g. ATU12345678.
taxIds[].typestringeu_vat, gb_vat, ch_uid/ch_vat, no_org/no_vat, us_ein, or another type (unverified).
taxIds[].valuestringThe number as given.
taxIds[].countrystring
taxIds[].numberstring or nullThe canonical number (null for types Ownrecord can't check).
taxIds[].verificationobjectThe latest check (spec §9.4).
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).
taxIds[].verification.sourcestringWho decided: VIES, HMRC, CH_UID, FORMAT (format and checksum only) or NONE.
taxIds[].verification.reasonstring or nullWhy, e.g. not_registered or service_unavailable.
taxIds[].verification.checkedAtdate-time
taxIds[].verification.consultationNumberstring or nullThe register's proof of the check (VIES request identifier, HMRC consultation number).
taxIds[].verification.simulatedbooleanA fixture answer (development and test environments), not a register's.
taxIds[].historyarray of objectEarlier checks, newest first (at most 10).
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).
taxIds[].history[].sourcestringWho decided: VIES, HMRC, CH_UID, FORMAT (format and checksum only) or NONE.
taxIds[].history[].reasonstring or nullWhy, e.g. not_registered or service_unavailable.
taxIds[].history[].checkedAtdate-time
taxIds[].history[].consultationNumberstring or nullThe register's proof of the check (VIES request identifier, HMRC consultation number).
taxIds[].history[].simulatedbooleanA fixture answer (development and test environments), not a register's.
taxIds[].addedAtdate-time
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.
taxExemptobject or nullTax exemption (spec §9.5). Not applied yet: exemption certificates come in a later release.
processorRefsarray of objectThe customer at each payment processor used (set by checkout).
processorRefs[].processorConnectionIdpcon_… ID
processorRefs[].customerRefstring
riskobject
risk.levelone of normal, elevated, blocked
risk.reasonsarray of string
risk.firstPaymentAtdate-time or null
risk.totalPaidmoney
portalLastLoginAtdate-time or null
testClockIdclk_… ID or nullTest mode: the test clock the customer was created on (spec §16.13).
metadataobject
createdAtdate-time
updatedAtdate-time
deletedAtdate-time or nullWhen the customer was deleted (soft delete); null while active.

Examples

A business customer

HTTP
GET /api/v1/customers/cus_01m4ty3c2b5qx7mhd9k8w6s0aa
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "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
}

A consumer after the first payment

The first payment locked the tax country to Germany.

HTTP
GET /api/v1/customers/cus_01m4ty3c2b5qx7mhd9k8w6s0ab
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "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
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400id isn't a customer ID (cus_…).Fix the fields listed in details.issues and send the request again.
resource_not_found404This brand has no such customer in this mode (customers 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).
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, dry_run_not_supported, rate_limited, internal_error.