---
title: "Customer Base Health"
method: GET
path: "/api/v1/report-ai/customer-profiles/health"
tags: ["report-ai", "customer-profiles"]
---

# Customer Base Health

`GET /api/v1/report-ai/customer-profiles/health`

How complete the contact base is, and which sources built it.

Every count reuses the roster's exclusions — shared operator inboxes, stay
guests, and merge tombstones — so the numbers here and the number on the
table agree. A health strip that disagrees with the list beneath it is
worse than none.

Declared before ``/customer-profiles/{customer_profile_id}`` so the literal
path wins; FastAPI matches in declaration order.

## Response `200`

Successful Response

- ContactHealthRead — The contact base in one line: how complete it is, and where it came from. Counts only, never percentages: the frontend derives those. Two representations of one ratio drift, and the roster already shows the totals these have to agree with.
  - `total` integer, required
  - `with_email` integer, required
  - `with_phone` integer, required
  - `with_external_id` integer, required
  - `open_duplicate_pairs` integer, required
  - `sources` SourceHealthRead[]
    - `source_key` string, required
    - `label` string, required
    - `badge_hue` string, required
    - `profile_count` integer, required
    - `last_seen_at` string, date-time, required

---

[API](https://skmtc.dev/getanana/apis/cleon-api.md) · [All operations](https://skmtc.dev/getanana/apis/cleon-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getanana/apis/cleon-api/revisions/ae7627cd46da?raw)
