---
title: "Person/contact integrity sweep"
method: GET
path: "/api/v1/ackdb/persons/integrity"
tags: ["ackDB"]
---

# Person/contact integrity sweep

`GET /api/v1/ackdb/persons/integrity`

## Request

- Base URL: `http://localhost:3009`
- URL: `http://localhost:3009/api/v1/ackdb/persons/integrity`
- Auth: HTTP bearer

Read-only, on-demand health report over the identity graph (#472). Four wound classes, each with an exact count and a sample capped at 25 rows:

- `unregisteredEdgeEmails` — contacts whose email is not a person key AND whose person has NO `linkedin_url` anchor. Should be 0: such a person is invisible to email-keyed ingest, and the next push mints a duplicate human. Heal with `npm run backfill-email-keys`. Note (#575): linkedin-anchored contacts whose email is intentionally column-only are NOT counted — email is a fallback anchor, so their missing email key is by design, and the backfill deliberately skips them.
- `keylessPersons` — active persons with zero durable keys; reachable only by legacy entity-scoped adoption, never by global resolution.
- `sameNameSameCompany` — the same normalized name held by DIFFERENT persons at one company: the visible tell of a split human. A review list, not a bug list — two real people can share a name.
- `domainMismatchEdges` — active contacts whose email domain (non-freemail) matches none of their company's `domain` links; candidates for `POST /contacts/{contactId}/move`.

## Response `200`

`{ data: { unregisteredEdgeEmails, keylessPersons, sameNameSameCompany, domainMismatchEdges } }`, each `{ count, sample[] }`.

- object
  - `data` unknown, required

---

[API](https://skmtc.dev/floqer/apis/floqer-public-api.md) - [All operations](https://skmtc.dev/floqer/apis/floqer-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/floqer/apis/floqer-public-api/revisions/fce50dc07b20?raw)
