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

# List Contacts

> List contacts with filters for source, external ID, email, or phone number.

Filter by `sourceKey`, `externalId`, `phoneNumber`, or `email`. All supplied filters must match. `externalId` requires `sourceKey`; email matching is case-insensitive. Phone numbers use E.164 format. URL-encode a leading plus sign as `%2B`.

```bash theme={null}
curl 'https://api.usesimple.ai/api/v1/contacts?sourceKey=your_crm&externalId=customer-42' \
  --header 'Authorization: Bearer YOUR_API_KEY'
```

The response contains `data`, `hasMore`, and `nextCursor`. Each contact has the same profile fields as [Get Contact](/api-reference/contacts/get-contact), including consent records for its current phone number. Only active contacts in your organization are included. No matches returns an empty `data` array.

Results are ordered by UUID. Set `limit` between 1 and 100 (default 50). When `hasMore` is true, pass `after` with the returned `nextCursor`, keeping the same filters, to fetch the next page.


## OpenAPI

````yaml GET /contacts
openapi: 3.1.0
info:
  title: Public API v1
  description: >-
    Public API v1 requiring API keys.


    **Timestamps:** All datetime fields in API responses are returned in UTC
    using ISO 8601 format (e.g., `2024-01-15T14:30:00Z`). When filtering by date
    parameters, provide timestamps in ISO 8601 format.
  version: 0.1.0
servers:
  - url: https://api.usesimple.ai/api/v1
    description: Production API Server
security: []
paths:
  /contacts:
    get:
      tags:
        - Contacts
      summary: List Contacts
      description: >-
        List active contacts in the authenticated organization, ordered by UUID.
        Supplied filters are combined. externalId requires sourceKey. Continue
        with after=nextCursor while hasMore is true.
      operationId: list_contacts
      parameters:
        - name: sourceKey
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 63
            pattern: ^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$
            description: Stable lowercase snake_case identifier for the source.
        - name: externalId
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: phoneNumber
          in: query
          required: false
          schema:
            type: string
            pattern: ^\+[1-9]\d{1,14}$
        - name: email
          in: query
          required: false
          schema:
            type: string
            format: email
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
        - name: after
          in: query
          required: false
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: List Contacts
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListContactsResponse'
        '401':
          description: Authentication failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
        '422':
          description: The request or an attribute value is invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
      security:
        - APIKeyHeader: []
components:
  schemas:
    ListContactsResponse:
      type: object
      required:
        - data
        - hasMore
        - nextCursor
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/SyncedContact'
        hasMore:
          type: boolean
        nextCursor:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
    PublicApiError:
      type: object
      required:
        - status
        - success
        - error
        - errors
      properties:
        status:
          type: string
          const: error
        success:
          type: boolean
          const: false
        error:
          type: string
        errors:
          type: array
          items:
            type: string
      title: Public API Error
    SyncedContact:
      type: object
      required:
        - id
        - name
        - email
        - phoneNumber
        - attributes
        - derivedAttributes
        - externalIdentities
        - consents
        - isTest
      properties:
        id:
          type: string
          format: uuid
        name:
          anyOf:
            - type: string
            - type: 'null'
        email:
          anyOf:
            - type: string
              format: email
            - type: 'null'
        phoneNumber:
          anyOf:
            - type: string
            - type: 'null'
        isTest:
          type: boolean
          description: >-
            True for contacts created as dashboard test identities. Test
            contacts never merge with production contacts.
        attributes:
          type: object
          additionalProperties:
            anyOf:
              - type: string
              - type: number
              - type: boolean
              - type: 'null'
        derivedAttributes:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/DerivedContactAttribute'
        externalIdentities:
          type: array
          items:
            $ref: '#/components/schemas/ContactExternalIdentity'
        consents:
          type: array
          items:
            $ref: '#/components/schemas/ContactConsentRecord'
          description: >-
            Consent records by source for the current phone number. Empty for
            contacts without a phone number.
      title: Synced Contact
    DerivedContactAttribute:
      type: object
      required:
        - value
        - status
        - confidence
        - evaluatedAt
      properties:
        value:
          anyOf:
            - type: string
            - type: number
            - type: boolean
            - type: 'null'
        status:
          type: string
          enum:
            - ready
            - pending
            - stale
            - failed
        confidence:
          anyOf:
            - type: number
            - type: 'null'
        evaluatedAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
      title: Derived Contact Attribute
    ContactExternalIdentity:
      type: object
      required:
        - sourceKey
        - externalId
      properties:
        sourceKey:
          type: string
        externalId:
          type: string
      title: Contact External Identity
    ContactConsentRecord:
      type: object
      required:
        - phoneNumber
        - sourceKey
        - medium
        - category
        - status
        - observedAt
      properties:
        phoneNumber:
          type: string
        sourceKey:
          anyOf:
            - type: string
            - type: 'null'
          description: Null identifies a decision recorded by Simple.
        medium:
          type: string
          enum:
            - voice
            - text
        category:
          type: string
          enum:
            - all
            - transactional
            - marketing
        status:
          type: string
          enum:
            - opted_in
            - opted_out
            - not_opted_out
            - unknown
          description: >-
            Any opted_out record blocks the matching communication.
            not_opted_out does not grant affirmative consent.
        observedAt:
          type: string
          format: date-time
  securitySchemes:
    APIKeyHeader:
      type: http
      scheme: bearer
      description: 'Your API key, sent as `Authorization: Bearer YOUR_API_KEY`'

````

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