# GET /v1/customers

**Service:** Customers  
**Operation:** `CustomerService_ListCustomers`

A company-scoped list of customers, optionally filtered by company name (a case-insensitive contains-match). Use it to resolve a customer by name before referencing it on an order — compare each hit's full `companyName` with the name you hold, since a single hit can still be a partial match. Customers are returned alphabetically by company name. List entries are summaries — id, company name, billing address, and last order time; fetch the full record (email, contacts, tax identifier, price level) with GetCustomer.

## Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `pageSize` | query | integer | no | Maximum number of customers to return per page. 0 uses the server default; the server may cap the value. |
| `pageToken` | query | string | no | Opaque page token from a previous response, used to fetch the next page. |
| `companyName` | query | string | no | Optional: only return customers whose company name contains this text, compared case-insensitively — "Apex" and "ex In" both match "Apex Industrial Solutions". To resolve a customer by name, compare each hit's `companyName` with the full name before taking its id; a single hit is not proof of an exact match. Pages are filtered after they are fetched, so a page may hold fewer than `pageSize` entries while `nextPageToken` is still set. |
| `fields` | query | string | no | Comma-separated response fields to include, using camelCase JSON names (e.g. `orderId,total.amountMicros`). Dot paths reach into nested objects and map transparently across arrays. Paths are relative to the resource, not the response envelope; envelope keys like `nextPageToken` are always preserved. Only 2xx JSON responses are filtered; error bodies pass through unmodified. Unknown names are silently ignored. Takes precedence over `excludeFields` when both are provided. |
| `excludeFields` | query | string | no | Comma-separated response fields to exclude, using camelCase JSON names. Dot paths and array-transparency work the same as `fields`. Paths are relative to the resource, not the response envelope. Only 2xx JSON responses are filtered; error bodies pass through unmodified. Ignored when `fields` is also provided. |

## Responses

| Status | Schema | Description |
| --- | --- | --- |
| 200 | `ListCustomersResponse` | A successful response. |
| 400 | `Error` | The request was rejected because it was malformed — for example an unusable page token or an invalid filter value. The body is a validation-failure envelope: an overall type and message and one entry per problem (each with a stable code, a message, and a param pointing at the offending parameter). |
| 401 | `Error` | The request is missing a valid bearer token, or the token is invalid or expired. |
| 403 | `Error` | The token is valid but does not permit this action, or the resource belongs to a company the token cannot act for. The error type is permission_denied. |
| 429 | `Error` | The request was throttled (rate_limited) or exceeded a size limit (resource_exhausted). When throttled, the Retry-After header says how many seconds to wait before retrying; a resource_exhausted request will fail the same way if retried unchanged. |
| default | `Error` | Any other error. The body is the same error envelope every error uses: a short stable type identifying the kind of failure (for example "rate_limited" or "internal"), a human-readable message, and the request's idempotency key echoed back when one was supplied. |

## Returns

`ListCustomersResponse`

| Field | Type | Description |
| --- | --- | --- |
| `customers` | Customer[] | The customers in this page. |
| `customers.customerId` | string | The customer's unique id. |
| `customers.companyName` | string | The customer's company name. Unique within your company and matched case-insensitively when resolving. |
| `customers.taxIdentifier` | TaxIdentifier | The customer's tax identifier, if set. Not required to be unique. On read the scheme is ABN for existing (Australian) customers. |
| `customers.taxIdentifier.value` | string | The identifier value, e.g. an 11-digit ABN. Its format depends on `type` and is NOT validated in v1: an ABN is accepted as any non-empty string of up to 15 characters. The length cap may widen when more schemes are supported. |
| `customers.taxIdentifier.type` | TaxIdentifierType | Which tax / business registration scheme `value` belongs to. Must be a specified scheme when a TaxIdentifier is present. v1 accepts only ABN. The tax / business registration scheme a TaxIdentifier belongs to. v1 accepts only ABN; the remaining values are reserved for future non-AU support.   - TAX_IDENTIFIER_TYPE_UNSPECIFIED: Default, unset value. Not a valid scheme when a TaxIdentifier is supplied.  - TAX_IDENTIFIER_TYPE_ABN: Australian Business Number. The only scheme accepted in v1.  - TAX_IDENTIFIER_TYPE_EU_VAT: EU VAT number. Does not cover the United Kingdom — a UK VAT registration is TAX_IDENTIFIER_TYPE_GB_VAT. Reserved — not accepted in v1.  - TAX_IDENTIFIER_TYPE_US_EIN: US Employer Identification Number. Reserved — not accepted in v1.  - TAX_IDENTIFIER_TYPE_US_TIN: US Taxpayer Identification Number. Reserved — not accepted in v1.  - TAX_IDENTIFIER_TYPE_US_SSN: US Social Security Number (used by sole traders). Reserved — not accepted in v1.  - TAX_IDENTIFIER_TYPE_GB_VAT: United Kingdom VAT registration number. Reserved — not accepted in v1.  - TAX_IDENTIFIER_TYPE_NZ_GST: New Zealand GST number (the IRD number of a GST-registered business). Reserved — not accepted in v1. One of: TAX_IDENTIFIER_TYPE_UNSPECIFIED, TAX_IDENTIFIER_TYPE_ABN, TAX_IDENTIFIER_TYPE_EU_VAT, TAX_IDENTIFIER_TYPE_US_EIN, TAX_IDENTIFIER_TYPE_US_TIN, TAX_IDENTIFIER_TYPE_US_SSN, TAX_IDENTIFIER_TYPE_GB_VAT, TAX_IDENTIFIER_TYPE_NZ_GST. |
| `customers.email` | string | The customer's email address, if set. |
| `customers.phone` | string | The customer's phone number. |
| `customers.defaultPriceLevelId` | string | The customer's default price level, by id. Read reference only; line pricing is supplied by the caller on each order line. |
| `customers.defaultPriceLevelName` | string | The name of the customer's default price level. |
| `customers.billingAddress` | Address | The customer's billing address. |
| `customers.billingAddress.address1` | string | First address line (street number and name). |
| `customers.billingAddress.address2` | string | Second address line (unit, suite, or similar). |
| `customers.billingAddress.city` | string | City or suburb. |
| `customers.billingAddress.state` | string | State, province, or region. |
| `customers.billingAddress.postalCode` | string | Postal code (ZIP code, postcode). |
| `customers.billingAddress.countryCode` | string | Country, as an uppercase ISO 3166-1 alpha-2 code (e.g. "AU"). Optional; when supplied, any other form is rejected. |
| `customers.deliveryAddresses` | Address[] | The customer's delivery addresses. |
| `customers.deliveryAddresses.address1` | string | First address line (street number and name). |
| `customers.deliveryAddresses.address2` | string | Second address line (unit, suite, or similar). |
| `customers.deliveryAddresses.city` | string | City or suburb. |
| `customers.deliveryAddresses.state` | string | State, province, or region. |
| `customers.deliveryAddresses.postalCode` | string | Postal code (ZIP code, postcode). |
| `customers.deliveryAddresses.countryCode` | string | Country, as an uppercase ISO 3166-1 alpha-2 code (e.g. "AU"). Optional; when supplied, any other form is rejected. |
| `customers.contacts` | CustomerContact[] | The customer's contacts. |
| `customers.contacts.contactId` | string | The contact's unique id. |
| `customers.contacts.name` | string | The contact's name. |
| `customers.contacts.email` | string | The contact's email address. |
| `customers.contacts.phone` | string | The contact's phone number. |
| `customers.contacts.mobile` | string | The contact's mobile number. |
| `customers.isOnCreditHold` | boolean | Whether the customer is currently on credit hold. |
| `customers.disableTaxByDefault` | boolean | Whether tax is disabled by default for this customer. |
| `customers.lastOrderAt` | string | When the customer most recently placed an order. Populated on ListCustomers entries; not currently returned by GetCustomer. |
| `nextPageToken` | string | Token to pass as `pageToken` to fetch the next page; empty when there are no more results. |

---

Source: https://developer.factory.app/reference/customers/list-customers · Factory Sales API v1
