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

# Duplicados

> Flujo API para revisar, unificar o descartar candidatos duplicados.

# Duplicados

Los duplicados usan el mismo flujo del panel administrativo: la API lista
revisiones, expande una revisión individual y permite unificar solo
los registros seleccionados o descartar la revisión.

## Permisos

Usa `duplicates:read` para listar y leer revisiones.

Usa `duplicates:write` para unificar o descartar revisiones. Si cualquier
persona de la revision es menor de edad o tiene condiciones/notas de salud,
tambien se requiere `persons:sensitive:read`. Estos endpoints no limitan las
revisiones a la fuente de la llave.

Las escrituras comprueban el permiso sensible antes de ocultar revisiones con
personas privadas: una revision privada y sensible puede responder `403` sin
ese permiso, y `404` con él.

## Listar revisiones

```http theme={null}
GET /v1/duplicates
```

Filtros:

* `status`: `pending`, `merged`, `dismissed` o `all`
* `confidence`: `high`, `medium`, `low` o `all`
* `query`: busca por ID de revisión, ID de persona, nombre o cédula

Los filtros `status` y `confidence` usan `all` por defecto; los valores no
reconocidos también se interpretan como `all`. Para trabajar solo con revisiones
abiertas, envía `status=pending`.

La lista es liviana y devuelve `person_ids`, no expande personas. Puede incluir
una revisión cuyo detalle no sea accesible porque contiene una persona privada.

Cada revisión incluye `match_score` (número o `null`): la similitud mínima de
Jaro-Winkler (0–1) entre los nombres normalizados y con tokens ordenados de
los miembros del grupo. Solo está presente en revisiones creadas por el
escaneo de coincidencias difusas; es `null` para coincidencias exactas de
clave, para registros previos al escaneo y para los marcados durante la
ingesta.

Las coincidencias difusas también deben superar guardas estructurales de
identidad: nombres individuales en ambos lados, género conocido compatible,
estado compatible y una coincidencia plausible entre nombre y apellido, incluso
cuando el orden está invertido.

También incluye `scan_version` (entero o `null`): la generación del algoritmo
de escaneo de duplicados que escribió el registro (actualmente `2`). Es `null`
para registros escritos antes de versionar el escaneo o marcados durante la
ingesta.

## Ver una revisión

```http theme={null}
GET /v1/duplicates/{duplicate_id}
```

El detalle reemplaza `person_ids` por `persons`, con los objetos completos de
persona necesarios para revisar el caso, minimizados salvo que la llave tenga
`persons:sensitive:read`. Si alguna persona es privada, el detalle responde
`404`. También incluye `match_score` y
`scan_version`, con el mismo significado que en la lista.

## Unificar

```http theme={null}
POST /v1/duplicates/{duplicate_id}/merge
Content-Type: application/json
```

```json theme={null}
{
  "person_ids": ["canonical-or-candidate-id", "other-candidate-id"],
  "canonical_person_id": "canonical-or-candidate-id",
  "national_id": "V-15615565",
  "birth_date": "2014-05-06",
  "first_name": "María",
  "last_name": "González",
  "location": "Tanaguarena, La Guaira",
  "found_notes": "Ingresada en Hospital Dr. Miguel Pérez Carreño. Procedencia Tanaguarena.",
  "description": null
}
```

Envía solo las personas que deben unificarse. El sistema conserva la mejor
información y mueve fuentes, pistas y reportes al perfil principal. El cuerpo
rechaza campos desconocidos y requiere al menos dos IDs distintos que
pertenezcan a la revisión. Un arreglo con menos de dos elementos responde `422`.
Si contiene varios elementos pero menos de dos IDs distintos, un ID ajeno a la
revisión o una persona canónica inactiva, responde `404`.

Solo se puede unificar una revisión `pending`. Una revisión ya cerrada responde
`404` tras las comprobaciones de acceso y validación del cuerpo. Una unificación
correcta responde `200` con `{ "data": { ...revision } }`, incluyendo `persons`.

`canonical_person_id` es opcional: indica cuál persona se conserva como perfil
principal y debe ser uno de los `person_ids` (si no, responde `422`). Si se omite,
el sistema elige automáticamente el registro más completo.

La persona canónica debe estar activa. Al unificar, todos los registros eliminados
que apuntaban a un candidato se reapuntan directamente a la persona canónica para
evitar cadenas de fusiones. Restaurar una persona elimina su asociación de fusión
anterior.

`national_id` es opcional. Si se provee, reemplaza la cédula que el sistema elegiría automáticamente entre los candidatos.

`birth_date` es opcional y usa el formato `YYYY-MM-DD`. El sistema conserva
automáticamente una única fecha conocida. Si las personas seleccionadas tienen
fechas diferentes, el campo es obligatorio y debe coincidir con una de ellas.
Las unificaciones automáticas con fechas en conflicto quedan pendientes para
revisión manual.

`first_name` y `last_name` son opcionales y deben enviarse juntos o ninguno. Si se
proveen, reemplazan el nombre que el sistema elegiría automáticamente — útil cuando
los registros tienen el nombre desordenado o con variantes ortográficas. Si se omiten,
el sistema elige el nombre del registro más completo.

`location` es opcional. Si se provee, reemplaza la ubicación que el sistema
construiría automáticamente combinando los valores de los candidatos.
`last_seen_location` no se admite; los campos desconocidos responden `422`.

`found_notes` es opcional. Si se provee, reemplaza las notas que el sistema
construiría automáticamente combinando los valores de los candidatos.

`description` es opcional y acepta `null`. Si se provee, reemplaza la descripción
que el sistema construiría automáticamente (incluyendo el bloque de "Otros reportes
asociados"). Pasa `null` para dejar el campo vacío en el perfil unificado.

## Descartar

```http theme={null}
POST /v1/duplicates/{duplicate_id}/dismiss
```

No requiere cuerpo. Descartar no modifica personas; solo cierra una revisión
`pending`. Si ya está cerrada, responde `404` tras las comprobaciones de acceso.
Una operación correcta responde `200` con `{ "data": { ...revision } }`,
incluyendo `persons`.

Una respuesta `500` puede ocurrir después de guardar una unificación o un
descarte. Consulta la revisión antes de reintentar.
