---
title: "Search clients by email, phone or address"
url: https://docs.light-ai.app/api-reference/clients/search-clients.md
canonical_url: https://docs.light-ai.app/api-reference/clients/search-clients
last_updated: 2026-10-13
summary: "POST /v1/clients/search: Search clients by email, phone or address"
api_status: beta
related:
  - https://docs.light-ai.app/api-reference/clients
---

# Search clients by email, phone or address

> POST /v1/clients/search: Search clients by email, phone or address

`POST /v1/clients/search`

|   |   |
| --- | --- |
| Scope | `clients:read` |
| Credential | API key: `Authorization: Bearer lai_live_…` (or `lai_test_…`). Partner keys add `Light-AI-Organization`. |
| Test mode | Works with test keys against simulated test objects. |

## Headers

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `Light-AI-Organization` | string |  | Partner keys: the connected organization to act for (`org_…`). Organization keys may omit it. Id prefix `org_`. |
| `Light-AI-Version` | string |  | Pin a dated API version (defaults to the key's version). One of: `2026-11-01`. |

## Request body

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `email` | string \| null |  | An email address ("" or null: absent). At most 254 characters. |
| `phone` | string \| null |  | At most 40 characters. |
| `address` | object \| null |  |  |
| `address.line1` | string \| null |  | At most 200 characters. |
| `address.line2` | string \| null |  | At most 200 characters. |
| `address.city` | string \| null |  | At most 120 characters. |
| `address.region` | string \| null |  | State or region, e.g. `TX`. At most 120 characters. |
| `address.postal_code` | string \| null |  | At most 20 characters. |
| `address.country` | string \| null |  | ISO 3166-1 alpha-2 in any case, or a common name ("USA", "United States"); normalized to alpha-2. Defaults to US. At most 60 characters. |
| `address.formatted` | string \| null |  | A one-line address, when components are not available. At most 500 characters. |
| `address.lat` | number \| null |  | -90–90. |
| `address.lng` | number \| null |  | -180–180. |
| `address.place_id` | string \| null |  | Google place id, when known (best dedupe key). At most 300 characters. |

## Response 200

Matching clients (at most 100).

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | Always `list`. |
| `data` | object[] | yes |  |
| `data[].id` | string | yes | Id prefix `cli_`. |
| `data[].object` | string | yes | Always `client`. |
| `data[].livemode` | boolean | yes | false for objects created with a test key. |
| `data[].first_name` | string \| null | yes |  |
| `data[].last_name` | string \| null | yes |  |
| `data[].email` | string \| null | yes |  |
| `data[].phone` | string \| null | yes | E.164, or null when the stored number could not be normalized (see phone_raw). |
| `data[].phone_raw` | string \| null | yes | The number as stored in Light AI. |
| `data[].primary_property` | object \| null | yes |  |
| `data[].primary_property.id` | string | yes | Id prefix `prop_`. |
| `data[].primary_property.object` | string | yes | Always `property`. |
| `data[].primary_property.client_id` | string \| null | yes | Id prefix `cli_`. |
| `data[].primary_property.is_primary` | boolean | yes |  |
| `data[].primary_property.property_type` | string \| null | yes |  |
| `data[].primary_property.address` | object \| null | yes |  |
| `data[].primary_property.created_at` | timestamp | yes | RFC 3339 timestamp (UTC, milliseconds). |
| `data[].primary_property.updated_at` | timestamp | yes | RFC 3339 timestamp (UTC, milliseconds). |
| `data[].property_count` | integer | yes |  |
| `data[].external_refs` | object[] | yes |  |
| `data[].external_refs[].system` | string | yes |  |
| `data[].external_refs[].namespace` | string \| null | yes |  |
| `data[].external_refs[].id` | string | yes |  |
| `data[].external_refs[].owner` | string | yes | `self`: written by your integration (editable); others are read-only. One of: `self`, `organization`, `partner`. |
| `data[].external_refs[].read_only` | boolean | yes |  |
| `data[].created_at` | timestamp | yes | RFC 3339 timestamp (UTC, milliseconds). |
| `data[].updated_at` | timestamp | yes | RFC 3339 timestamp (UTC, milliseconds). |
| `data[].fixture` | boolean |  | Always `true`. |
| `has_more` | boolean | yes |  |
| `next_cursor` | string \| null | yes | Pass as `cursor` to fetch the next page. |

## Errors

| Status | Meaning |
| --- | --- |
| `400` | Bad request. [`bad_request`](https://docs.light-ai.app/errors#bad_request), [`test_mode_mismatch`](https://docs.light-ai.app/errors#test_mode_mismatch), [`test_mode_unsupported`](https://docs.light-ai.app/errors#test_mode_unsupported), [`unsupported_api_version`](https://docs.light-ai.app/errors#unsupported_api_version) |
| `401` | Missing or invalid credential. [`authentication_required`](https://docs.light-ai.app/errors#authentication_required), [`invalid_api_key`](https://docs.light-ai.app/errors#invalid_api_key), [`api_key_revoked`](https://docs.light-ai.app/errors#api_key_revoked), [`api_key_expired`](https://docs.light-ai.app/errors#api_key_expired), [`api_key_suspended`](https://docs.light-ai.app/errors#api_key_suspended) |
| `403` | Not allowed. [`insufficient_scope`](https://docs.light-ai.app/errors#insufficient_scope), [`plan_upgrade_required`](https://docs.light-ai.app/errors#plan_upgrade_required), [`organization_paused`](https://docs.light-ai.app/errors#organization_paused), [`organization_off_season`](https://docs.light-ai.app/errors#organization_off_season), [`api_disabled`](https://docs.light-ai.app/errors#api_disabled), [`api_access_not_enabled`](https://docs.light-ai.app/errors#api_access_not_enabled), [`ip_not_allowed`](https://docs.light-ai.app/errors#ip_not_allowed), [`forbidden`](https://docs.light-ai.app/errors#forbidden) |
| `404` | Not found (also for objects of other organizations and for organizations without an active grant). |
| `409` | Conflict. [`stale_state`](https://docs.light-ai.app/errors#stale_state), [`conflict`](https://docs.light-ai.app/errors#conflict), [`idempotency_in_progress`](https://docs.light-ai.app/errors#idempotency_in_progress), [`idempotency_scope_mismatch`](https://docs.light-ai.app/errors#idempotency_scope_mismatch), [`quote_already_decided`](https://docs.light-ai.app/errors#quote_already_decided), [`quote_not_current`](https://docs.light-ai.app/errors#quote_not_current), [`billing_review_required`](https://docs.light-ai.app/errors#billing_review_required) |
| `413` | Request bodies are limited to 256 KB. |
| `415` | The body is not JSON: send Content-Type: application/json. [`unsupported_media_type`](https://docs.light-ai.app/errors#unsupported_media_type) |
| `422` | Validation failed. [`idempotency_key_reused`](https://docs.light-ai.app/errors#idempotency_key_reused) |
| `429` | Rate limited or daily cap reached. See Retry-After and the RateLimit headers. [`rate_limited`](https://docs.light-ai.app/errors#rate_limited), [`daily_cap_reached`](https://docs.light-ai.app/errors#daily_cap_reached) |
| `500` | Unexpected server error. Safe to retry with exponential backoff; quote the Request-Id to support. [`internal_error`](https://docs.light-ai.app/errors#internal_error) |
| `503` | Temporarily unavailable. Retry with exponential backoff. [`service_unavailable`](https://docs.light-ai.app/errors#service_unavailable) |

## Examples

**Request**

curl:

```bash
curl -X POST "https://api.light-ai.app/v1/clients/search" \
  -H "Authorization: Bearer $LIGHT_AI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "dana@example.com"
}'
```

JavaScript:

```javascript
const response = await fetch('https://api.light-ai.app/v1/clients/search', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.LIGHT_AI_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "email": "dana@example.com"
  }),
});
const data = await response.json();
```

Python:

```python
import os, uuid, requests

response = requests.post(
    "https://api.light-ai.app/v1/clients/search",
    headers={
        "Authorization": f"Bearer {os.environ['LIGHT_AI_API_KEY']}",
    },
    json={
      "email": "dana@example.com"
    },
    timeout=30,
)
data = response.json()
```

**Response 200**

```json
{
  "object": "list",
  "data": [
    {
      "id": "cli_3f9c2a7be41d…",
      "object": "client",
      "livemode": false,
      "first_name": "Dana",
      "last_name": "Reyes",
      "email": "dana@example.com",
      "phone": "+15125550134",
      "phone_raw": "string",
      "primary_property": {
        "id": "prop_3f9c2a7be41d…",
        "object": "property",
        "client_id": "cli_3f9c2a7be41d…",
        "is_primary": true,
        "property_type": "string",
        "address": {
          "line1": {},
          "line2": {},
          "city": {},
          "region": {},
          "postal_code": {},
          "country": {},
          "formatted": "string",
          "lat": {},
          "lng": {}
        },
        "created_at": "2026-10-12T14:03:11.000Z",
        "updated_at": "2026-10-12T14:03:11.000Z"
      },
      "property_count": 1,
      "external_refs": [
        {
          "system": "string",
          "namespace": "string",
          "id": "string",
          "owner": "self",
          "read_only": true
        }
      ],
      "created_at": "2026-10-12T14:03:11.000Z",
      "updated_at": "2026-10-12T14:03:11.000Z",
      "fixture": true
    }
  ],
  "has_more": true,
  "next_cursor": "string"
}
```
