---
title: "List Duplicate Clusters"
method: GET
path: "/api/v1/report-ai/customer-profiles/duplicate-clusters"
tags: ["report-ai", "customer-profiles"]
---

# List Duplicate Clusters

`GET /api/v1/report-ai/customer-profiles/duplicate-clusters`

Open pairs of one tier, closed transitively into review decisions.

One tier per request, never mixed: an exact component and a strong one
joined together would be a cluster nobody can act on, because half of it is
safe to merge and half needs a person to look.

The closure is computed once and paged in memory. Unlike the pair queue it
cannot be paged in SQL — a component is only known once every pair has been
walked — so ``_CLUSTER_COUNT_MAX`` bounds it and the count says so.

## Query parameters

- `tier` string
- `cursor` string, nullable

## Response `200`

Successful Response

- DuplicateClusterListResponse — A keyset page of clusters. ``next_cursor`` is the last cluster's smallest member id, which is a property of the data rather than a position in a result set — so a cluster merged from page 1 does not shift page 2 under the operator.
  - `items` DuplicateClusterRead[], required
    - `members` DuplicateClusterMemberRead[], required
      - `id` string, uuid, required
      - `customer_name` string, nullable, required
      - `customer_email` string, nullable, required
      - `phone_number` string, nullable, required
      - `identity_kind` string, required
      - `total_investigations` integer, required
      - `linked_bookings` integer, required
      - `first_seen_at` string, date-time, required
      - `last_seen_at` string, date-time, required
      - `sources` SourceBadgeRead[]
        - `source_key` string, required
        - `label` string, required
        - `badge_hue` string, required
        - `external_id` string, nullable
        - `first_seen_at` string, date-time, required
        - `last_seen_at` string, date-time, required
    - `pair_ids` string[], required
    - `signals` string[], required
    - `source_keys` string[], required
    - `confidence_tier` string, required
    - `survivor_profile_id` string, uuid, required
    - `survivor_reason` string, required
  - `next_cursor` string, nullable, required
  - `open_count` integer, required
  - `last_detected_at` string, date-time, nullable, required

## Other responses

- `422` — Validation Error

## Changes

- **2026-09-03** `d65b8fefae34` — 2 info
  - added the optional property `detail/items/ctx` to the response with the `422` status
  - added the optional property `detail/items/input` to the response with the `422` status

[Change history](https://skmtc.dev/getanana/apis/cleon-api/changes/api/v1/report-ai/customer-profiles/duplicate-clusters/get.md)

---

[API](https://skmtc.dev/getanana/apis/cleon-api.md) · [All operations](https://skmtc.dev/getanana/apis/cleon-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/getanana/cleon-api/revisions/38166468bfc5/schema)
