Skip to content

Remove a tax ID from a customer

The customers.tax_ids.delete operation: DELETE /api/v1/customers/{id}/tax_ids/{taxIdId} in the REST API and the customers_tax_ids_delete tool in the MCP server.

DELETE/api/v1/customers/{id}/tax_ids/{taxIdId}

Removes a tax ID from a customer. taxIdId is the tax ID's id on the customer: its canonical number, e.g. ATU12345678. Past sales keep the check they were quoted with; future sales no longer use the ID. The type is inferred again (spec §13.1): without a tax ID, a customer is a business only when declared one with a business name. Emits customer.updated.

At a glance

  • REST: DELETE /api/v1/customers/{id}/tax_ids/{taxIdId}
  • MCP tool: customers_tax_ids_delete
  • Operation ID: customers.tax_ids.delete
  • Scope: Brand
  • Permission: customers:write
  • Risk tier: write
  • Dry run: Supported (send Ownrecord-Dry-Run: true)
  • Idempotency: Idempotency-Key optional
  • Modes: Test and live
  • Authentication: API key with the customers:write scope
  • Since: M4

Request

Path parameters

FieldTypeDescription
idcus_… IDThe customer's ID (cus_…).
taxIdIdstringThe tax ID's id on the customer: its canonical number, e.g. ATU12345678.

Body

This operation takes no body.

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

Remove the Austrian VAT ID

The customer keeps its business name, so it stays a business.

HTTP
DELETE /api/v1/customers/cus_01m4ty3c2b5qx7mhd9k8w6s0aa/tax_ids/ATU00000000
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": [],
  "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:30:00.000Z",
  "deletedAt": null
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400id or taxIdId is malformed.Fix the fields listed in details.issues and send the request again.
resource_not_found404This brand has no such customer in this mode, or the customer has no tax ID with this taxIdId.Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
customer_deleted400The customer was deleted.Create a new customer for this buyer. Deleted customers stay readable for the records they belong to, but can't be changed.
version_conflict409The customer changed at the same moment; retry.Fetch the object again and retry the change.
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 change this brand's customers (customers:write: owners, admins and support).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, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, idempotency_key_reused, idempotency_in_progress, approval_required, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.