> ## Documentation Index
> Fetch the complete documentation index at: https://apidocs.taxwire.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List customers

> Lists your customers, newest first. Page with `limit` + `starting_after` (pass the last customer's `id`). Customers deleted in the Taxwire app are left out. Each customer includes its read-only `exemption` block.

This endpoint has no filters yet. To find a customer, page through the whole list and filter on your side.


## OpenAPI

````yaml GET /customers
openapi: 3.1.0
info:
  title: Taxwire Public API
  version: 0.1.0
servers: []
security: []
paths:
  /customers:
    get:
      tags:
        - Customers
      summary: List Customers
      description: >-
        Lists your customers, newest first. Page with `limit` + `starting_after`
        (pass the last customer's `id`). Customers deleted in the Taxwire app
        are left out. Each customer includes its read-only `exemption` block.
      operationId: list_customers_customers_get
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 1000
            minimum: 1
            description: Page size, between 1 and 1000.
            default: 100
            title: Limit
          description: Page size, between 1 and 1000.
        - name: starting_after
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Return customers after this one. Pass the `id` of the last
              customer from the previous page to fetch the next page.
            title: Starting After
          description: >-
            Return customers after this one. Pass the `id` of the last customer
            from the previous page to fetch the next page.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomersListResponse'
        '422':
          description: Validation Error - Invalid input data
          content:
            application/json:
              example:
                errors:
                  - status: '422'
                    code: validation_required_field
                    title: Missing source_id
                    detail: Please provide a value for the required source_id field
                    source:
                      pointer: /data/attributes/source_id
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limit exceeded. Try again later.
          headers:
            Retry-After:
              schema:
                type: string
              description: Time in seconds until the rate limit resets
            X-RateLimit-Limit:
              schema:
                type: string
              description: The rate limit ceiling for the given request
            X-RateLimit-Remaining:
              schema:
                type: string
              description: The number of requests remaining in the time window
          content:
            application/json:
              example:
                errors:
                  - status: '429'
                    code: rate_limit_error
                    title: Too Many Requests
                    detail: Rate limit exceeded
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              example:
                errors:
                  - status: '500'
                    code: system_internal_error
                    title: Internal Error
                    detail: An unexpected error occurred. Our team has been notified.
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - APIKeyHeader: []
        - HTTPBearer: []
components:
  schemas:
    CustomersListResponse:
      properties:
        object:
          type: string
          title: Object
          default: list
        url:
          type: string
          title: Url
          default: /customers
        has_more:
          type: boolean
          title: Has More
          description: More results available
          examples:
            - true
            - false
        data:
          items:
            $ref: '#/components/schemas/CustomerDetailResource'
          type: array
          title: Data
          description: A page of customers, newest first.
      type: object
      required:
        - has_more
      title: CustomersListResponse
      description: List envelope for GET /customers, cursor-paged by `id`.
    ErrorResponse:
      properties:
        errors:
          items:
            $ref: '#/components/schemas/Error'
          type: array
          title: Errors
      type: object
      required:
        - errors
      title: ErrorResponse
      description: Standardized JSON:API error response model.
    CustomerDetailResource:
      properties:
        id:
          type: string
          title: Id
          description: Unique identifier for the customer.
          examples:
            - cust_01J9Z8Q4E7K2M3N4P5R6S7T8U9
        source_id:
          type: string
          title: Source Id
          description: Identifier for the customer in the source system.
          examples:
            - CUS-1042
        source:
          type: string
          enum:
            - business_central
            - campfire
            - maxio
            - monetizenow
            - netsuite
            - quickbooks
            - rillet
            - salesbricks
            - shopify
            - stripe
            - taxwire
            - xero
          description: >-
            Source system of the customer. `taxwire` for customers created in
            Taxwire rather than in another system.
          examples:
            - taxwire
        source_account_id:
          type: string
          title: Source Account Id
          description: >-
            Account in the source system that the customer belongs to.
            `__default__` if the source system has no account or tenant ID.
          examples:
            - __default__
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
          description: Name of the customer.
          examples:
            - Acme Wholesale
        email:
          anyOf:
            - type: string
            - type: 'null'
          title: Email
          description: Email address of the customer. Does not need to be unique.
          examples:
            - ap@acme.example
        merged_into_customer_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Merged Into Customer Id
          description: >-
            Unique identifier of the customer this customer was merged into,
            when the source system reports a merge. `null` otherwise.
          examples:
            - cust_01J9ZC4D7F2G8H3J5K6L9M1N0P
            - null
        source_updated_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Source Updated At
          description: >-
            Date at which the customer was last updated in the source system.
            `null` if unknown.
          examples:
            - '2026-09-14T19:58:12Z'
        created_at:
          type: string
          format: date-time
          title: Created At
          description: Date at which the customer record was created.
          examples:
            - '2026-09-14T20:00:00Z'
        updated_at:
          type: string
          format: date-time
          title: Updated At
          description: Date at which the customer record was last updated.
          examples:
            - '2026-09-14T20:00:00Z'
        exemption:
          $ref: '#/components/schemas/CustomerExemption'
          description: >-
            What exempts this customer as of now. Read-only. `updated_at` tracks
            the customer's own fields and overrides only. Certificate changes
            move `exemption.updated_at` instead, and an expiry moves neither: it
            changes a row's `status`.
      additionalProperties: false
      type: object
      required:
        - id
        - source_id
        - source
        - source_account_id
        - created_at
        - updated_at
        - exemption
      title: CustomerDetailResource
      description: 'A customer as GET returns it: the customer plus what exempts it.'
    Error:
      properties:
        status:
          type: string
          title: Status
        code:
          type: string
          title: Code
        title:
          type: string
          title: Title
        detail:
          type: string
          title: Detail
        source:
          anyOf:
            - $ref: '#/components/schemas/ErrorSource'
            - type: 'null'
        meta:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Meta
      type: object
      required:
        - status
        - code
        - title
        - detail
      title: Error
      description: Individual JSON:API error object.
    CustomerExemption:
      properties:
        overrides:
          $ref: '#/components/schemas/ExemptionOverrides'
          description: Switches set on the customer in the Taxwire app.
        jurisdictions:
          items:
            $ref: '#/components/schemas/JurisdictionExemption'
          type: array
          title: Jurisdictions
          description: >-
            One row per approved certificate per jurisdiction it covers, not
            grouped: a renewal shows an `expired` row and a `valid` row for the
            same jurisdiction, so check whether any row for it is `valid`.
            Sorted by `jurisdiction`, `exemption_type`, `expires_at` (latest
            first, never-expires first), `certificate_id`. Empty when the
            customer has no approved certificate.
        updated_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Updated At
          description: >-
            When this customer's approved certificates last changed: one was
            added, approved, edited or removed. Null when it never had an
            approved certificate. An expiry changes nothing here, so read
            `status` and `expires_at` for that. Changes to `overrides` move the
            customer's own `updated_at`, not this one.
          examples:
            - '2026-09-14T20:00:00Z'
      additionalProperties: false
      type: object
      required:
        - overrides
        - jurisdictions
      title: CustomerExemption
      description: >-
        What exempts a customer, as of now.


        A snapshot, not a promise for any given sale: whether a certificate
        applies

        can also depend on the product and the sale date.
    ErrorSource:
      properties:
        pointer:
          anyOf:
            - type: string
            - type: 'null'
          title: Pointer
      type: object
      title: ErrorSource
      description: Identifies the source of the error, e.g., via a JSON Pointer.
    ExemptionOverrides:
      properties:
        exempt:
          type: boolean
          title: Exempt
          description: Every sale to this customer is treated as exempt.
        resale:
          type: boolean
          title: Resale
          description: Every sale to this customer is treated as a resale.
        manufacturing:
          type: boolean
          title: Manufacturing
          description: >-
            Every sale to this customer is treated as a qualified manufacturing
            purchase.
      additionalProperties: false
      type: object
      required:
        - exempt
        - resale
        - manufacturing
      title: ExemptionOverrides
      description: Per-customer switches set in the Taxwire app. They apply to every sale.
    JurisdictionExemption:
      properties:
        jurisdiction:
          type: string
          title: Jurisdiction
          description: >-
            The jurisdiction's political path: a US state (`USA.S-CA`), a city
            (`USA.S-IL.M-CHICAGO`), a Canadian province (`CAN.P-ON`) or a
            country code.
          examples:
            - USA.S-CA
            - USA.S-IL.M-CHICAGO
            - CAN.P-ON
        jurisdiction_name:
          type: string
          title: Jurisdiction Name
          description: The jurisdiction's readable name.
          examples:
            - California
            - Chicago, IL
            - Ontario
        exemption_type:
          type: string
          enum:
            - agriculture
            - direct_pay
            - driveaway
            - govt_exempt_org
            - manufacturing
            - resale
            - other
          description: The kind of exemption the certificate claims.
          examples:
            - resale
            - manufacturing
        exemption_type_other:
          anyOf:
            - type: string
            - type: 'null'
          title: Exemption Type Other
          description: >-
            The certificate's own description of the exemption. Set only when
            `exemption_type` is `other`.
          examples:
            - null
            - Tribal sales
        status:
          type: string
          description: >-
            `valid`: in its date window today (UTC). `expired`: its expiration
            date has passed. `not_yet_active`: its start date is in the future.
            More values may be added; treat an unknown one as not valid.
          examples:
            - valid
        starts_at:
          type: string
          format: date
          title: Starts At
          description: >-
            The first day the certificate covers. A `not_yet_active` row starts
            in the future.
          examples:
            - '2025-04-01'
        expires_at:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Expires At
          description: The last day the certificate covers. Null when it never expires.
          examples:
            - '2027-03-31'
            - null
        certificate_id:
          type: string
          title: Certificate Id
          description: The certificate this row comes from.
          examples:
            - cexc_01J9Z8Q4E7K2M3N4P5R6S7T8U9
      additionalProperties: false
      type: object
      required:
        - jurisdiction
        - jurisdiction_name
        - exemption_type
        - status
        - starts_at
        - certificate_id
      title: JurisdictionExemption
      description: One approved certificate's coverage of one jurisdiction.
  securitySchemes:
    APIKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
    HTTPBearer:
      type: http
      scheme: bearer

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.