Manual para que una aplicación cliente interprete la respuesta del endpoint público POST /v1/screening, incluso cuando la consulta avanzada expande la red societaria mediante ownership_network.
Los textos presentados al usuario pueden ser localizados por la capa cliente. La documentación interactiva (/docs) es la referencia de tipos y campos; este manual explica la semántica y el orden de lectura.
La recomendación de la API apoya la decisión de compliance. No sustituye la política, las aprobaciones ni el análisis humano exigido por el cliente.
Orden seguro de lectura
Una respuesta larga no debe leerse como una lista única de coincidencias. El consumidor debe seguir esta secuencia:
- Confirmar si la respuesta es concluyente (
status). - Leer la decisión sobre el sujeto consultado directamente.
- Evaluar las coincidencias y la cobertura de las fuentes.
- Evaluar por separado la red societaria, cuando se solicite.
- Usar el dossier y la facturación como evidencia y trazabilidad.
1. ¿La respuesta es concluyente?
{
"status": "COMPLETE",
"billable": true,
"warnings": [],
"notices": []
}
| Campo | Interpretación |
|---|---|
status: COMPLETE | Las etapas solicitadas se completaron. |
status: PARTIAL | Al menos una fuente o etapa no se completó. La respuesta es inconclusa. No trate CLEAR como aprobación automática. |
status: ERROR | La consulta no produjo una clasificación confiable. No tome una decisión de riesgo. |
billable | Indica si hubo cobro; no indica si el resultado es favorable. |
warnings | Mensajes para lectura humana. |
notices | Las mismas alertas en formato estructurado, con code, severity y message. |
Ejemplo de respuesta que exige repetición o revisión, y no aprobación:
{
"status": "PARTIAL",
"billable": false,
"notices": [
{
"code": "PARTIAL_SOURCE_FAILURE",
"severity": "WARNING",
"message": "Partial screening: at least one selected live source was unavailable. The result is not conclusive and was not charged. Run the screening again."
}
]
}
2. Decisión sobre el sujeto consultado directamente
{
"risk_level": "HIGH",
"identity_class": "TRUE_MATCH",
"recommendation": "REJECT",
"summary": "One or more high-risk matches have confirmed identity. Blocking is recommended subject to your compliance policy."
}
Estos cuatro campos describen solamente a la persona o empresa enviada en el request. No deben asumirse como un resumen automático de la red de QSA.
| Campo | Pregunta que responde |
|---|---|
risk_level | ¿Qué tan grave es el riesgo efectivo encontrado? |
identity_class | ¿Qué tan cierta es la coincidencia de identidad entre el registro y el sujeto consultado? |
recommendation | ¿Qué acción sugiere la API al cliente? |
summary | Explicación breve para una interfaz humana. |
Clases de identidad
| Valor | Uso práctico |
|---|---|
TRUE_MATCH | Identidad confirmada por documento o evidencia fuerte. |
POTENTIAL_MATCH | Evidencia relevante, pero se requiere revisión humana. |
WEAK_MATCH | Evidencia insuficiente para una coincidencia accionable. |
NO_MATCH | No se encontró ninguna coincidencia relevante. |
Niveles de riesgo
| Valor | Uso práctico |
|---|---|
CLEAR | No hay riesgo accionable dentro del alcance efectivamente consultado. |
MEDIUM | Requiere revisión; por ejemplo, un PEP confirmado o una coincidencia potencial de una fuente grave. |
HIGH | Coincidencia grave con identidad suficientemente confirmada. |
ERROR | No hubo clasificación confiable. |
Una política de integración típica es:
COMPLETE + CLEAR + NO_MATCH -> continuar, respetando el alcance consultado
COMPLETE + MEDIUM o POTENTIAL_MATCH -> revisión humana
COMPLETE + HIGH + TRUE_MATCH -> bloquear o escalar según la política
PARTIAL o ERROR -> no aprobar automáticamente
El PEP es un caso aparte: requires_edd: true exige diligencia reforzada, pero la condición de PEP, por sí sola, no es motivo de bloqueo automático.
3. Coincidencias directas: hits
{
"total_hits": 2,
"actionable_hits_count": 2,
"informational_hits_count": 3,
"returned_hits_count": 2,
"hits_truncated": false,
"hits": [
{
"source": "OFAC_SDN",
"category": "Financial Sanction",
"name_similarity": 0.98,
"identity_confidence": 1.0,
"document_evidence": "EXACT_MATCH",
"identity_class": "TRUE_MATCH",
"risk_level": "HIGH",
"requires_edd": true,
"downgraded": false
}
]
}
| Campo | Cómo usarlo |
|---|---|
hits | Coincidencias accionables que sustentan la decisión del sujeto principal. |
total_hits / actionable_hits_count | Coincidencias accionables encontradas antes del límite de tamaño de la respuesta. |
returned_hits_count | Siempre igual a hits.length. |
informational_hits | Candidatos descartados o débiles; útiles para auditoría, no para bloqueo automático. |
hits_truncated | Si es true, hits no contiene todas las coincidencias. |
truncated_hits_by_source | Cantidad omitida por fuente. |
category | Naturaleza regulatoria del registro, por ejemplo sanción, PEP o insolvencia. |
source_risk_level | Gravedad original de la fuente. |
risk_level en el hit | Gravedad efectiva tras considerar la identidad. |
name_similarity | Similitud de nombre; no es prueba aislada de identidad. |
identity_confidence | Confianza final de identidad. |
document_evidence | Cómo contribuyó el documento a la identificación. |
downgraded | La confianza o el riesgo se redujo por la evidencia disponible. |
requires_edd | El caso requiere diligencia reforzada (enhanced due diligence). |
Nunca tome una decisión solo por name_similarity. Use identity_class, risk_level, document_evidence y el contexto de la fuente.
4. Cobertura de las fuentes: sources_checked
sources_checked es la prueba de qué fuentes fueron efectivamente consultadas y qué ocurrió en cada una.
{
"sources_checked": {
"OFAC_SDN": {
"list_status": "AVAILABLE",
"query_result": "MATCH",
"risk_level": "HIGH",
"hits": 1,
"confirmed_hits": 1,
"potential_hits": 0,
"skip_reason": null
},
"PY_DNIT_RUC": {
"list_status": "NOT_APPLICABLE",
"query_result": "NOT_QUERIED",
"hits": 0,
"skip_reason": "COMPATIBLE_DOCUMENT_REQUIRED"
}
}
}
- Una fuente con
NO_MATCHsolo sustenta una conclusión si fue realmente consultada. skip_reason: COMPATIBLE_DOCUMENT_REQUIREDno es una falla: esa fuente exige un documento compatible y no puede buscarse solo por el nombre.- Un
errorcompletado, una fuente no disponible o un aviso de alcance parcial impiden tratar la respuesta como cobertura íntegra. confirmed_hits,potential_hits,weak_hitsybest_match_classayudan a explicar la calidad de la evidencia por fuente.
5. Solicitud de QSA
El QSA es un enriquecimiento interno devuelto por la misma llamada de Screening. Para solicitarlo, el consumidor agrega estos campos al cuerpo de POST /v1/screening:
{
"name": "EMPRESA ALFA LTDA",
"cnpj": "12345678000190",
"groups": ["national", "sanctions"],
"advanced": true,
"ownership_depth": 3
}
ownership_depth puede ir de 1 a 8 y exige advanced: true más CPF o CNPJ. El QSA no se ejecuta en profundidad 0.
6. Qué representa un nivel de QSA
Un nivel es una ronda completa de expansión societaria, no una alternancia fija entre empresas y socios.
| Profundidad | Resultado esperado |
|---|---|
0 | QSA no solicitado. |
1 | Vínculos directos del sujeto consultado. |
2 | Expansión de todas las personas y empresas nuevas encontradas en el nivel 1. |
3 | Expansión de todas las entidades nuevas del nivel 2. |
4 a 8 | Repetición de la misma regla para la ronda anterior. |
Raíz CPF
Persona consultada
└── nivel 1: empresas en las que la persona figura como socia
└── nivel 2: socios de esas empresas y empresas en las que participan
└── nivel 3: expansión de las entidades nuevas del nivel 2
Raíz CNPJ
Empresa consultada (nivel 0)
├── nivel 1: sus socios
├── nivel 1: empresas en las que también participa
└── nivel 2: expansión de las personas y empresas nuevas del nivel 1
└── nivel 3: expansión de las entidades nuevas del nivel 2
El nivel mide distancia en la expansión, no riesgo, participación societaria ni control. Una entidad de nivel 3 puede ser más grave que una de nivel 1, y viceversa.
7. Cómo leer una respuesta en varios niveles
{
"ownership_network": {
"status": "FOUND",
"queried_cnpj_root": "12345678",
"requested_depth": 3,
"reached_depth": 3,
"billable_depth": 3,
"total_companies": 4,
"companies": [
{
"cnpj_root": "12345678",
"legal_name": "EMPRESA CONSULTADA LTDA",
"level": 0,
"partners": [
{
"level": 1,
"name": "ANA EXEMPLO",
"party_type": "PF",
"role": "SOCIO-ADMINISTRADOR"
}
]
},
{
"cnpj_root": "87654321",
"legal_name": "HOLDING ALFA LTDA",
"level": 1,
"originating_partner_name": "EMPRESA CONSULTADA LTDA",
"screening": {
"risk_level": "CLEAR",
"identity_class": "NO_MATCH",
"recommendation": "APPROVE"
}
},
{
"cnpj_root": "11223344",
"legal_name": "BETA PARTICIPACOES LTDA",
"level": 2,
"originating_partner_name": "ANA EXEMPLO",
"screening": {
"risk_level": "MEDIUM",
"identity_class": "TRUE_MATCH",
"recommendation": "REVIEW",
"actionable_hits_count": 1
}
},
{
"cnpj_root": "55667788",
"legal_name": "GAMMA INVESTIMENTOS LTDA",
"level": 3,
"originating_partner_name": "BETA PARTICIPACOES LTDA",
"screening": {
"risk_level": "HIGH",
"identity_class": "TRUE_MATCH",
"recommendation": "REJECT",
"actionable_hits_count": 1
}
}
]
}
}
El cliente debe analizar cada company.screening y cada company.partners[].screening como una conclusión sobre esa entidad relacionada.
| Resultado en una entidad relacionada | Tratamiento recomendado |
|---|---|
CLEAR + NO_MATCH | No hay coincidencia accionable en esa entidad, dentro del alcance derivado consultado. |
MEDIUM, POTENTIAL_MATCH o requires_edd: true | Señalar la red para revisión humana. |
HIGH + TRUE_MATCH | Señalar riesgo alto en la red; bloquear, escalar o exigir aprobación según la política del cliente. |
PARTIAL, ERROR, hits_truncated o aviso de límite | No considerar completo el análisis de esa entidad ni el de la red. |
En el ejemplo anterior, el resultado principal puede seguir siendo CLEAR, pero el cliente debe mostrar algo como:
Sujeto principal: sin coincidencia accionable.
Red societaria: riesgo alto encontrado en el nivel 3 en GAMMA INVESTIMENTOS LTDA.
Próxima acción: revisión de compliance de la red societaria.
Esto preserva la verdad del contrato: el riesgo directo y el riesgo de relación no son la misma afirmación.
Presentación recomendada
Agrupar la lista por level es más seguro que intentar dibujar un árbol jurídico exacto:
Red societaria — 3 de 3 niveles completados
Nivel 0
• EMPRESA CONSULTADA LTDA
Nivel 1 — vínculos directos
• ANA EXEMPLO — socia administradora
• HOLDING ALFA LTDA — sin coincidencia accionable
Nivel 2 — vínculos de los relacionados
• BETA PARTICIPAÇÕES LTDA — revisión necesaria
Nivel 3 — expansión adicional
• GAMMA INVESTIMENTOS LTDA — riesgo alto confirmado
companies es una lista plana. originating_partner_name indica a través de qué socio se encontró la empresa, pero el contrato no incluye un identificador de empresa matriz ni de arista. Por eso, nombres iguales pueden hacer ambiguo un árbol gráfico. La interfaz debe preferir la formulación "encontrada en el nivel X vía Y".
8. Completitud, límites y costo del QSA
{
"ownership_network": {
"requested_depth": 3,
"reached_depth": 2,
"warnings": ["The ownership entity limit was reached."],
"derived_screening": {
"entities_processed": 100,
"unique_entities": 98,
"relationships_found": 156,
"entity_limit": 100,
"interpol_excluded": true
},
"billing": {
"base_groups": ["national", "sanctions"],
"base_group_cost": 2,
"billable_depth": 2,
"ownership_tokens": 4,
"interpol_excluded": true
}
}
}
| Campo | Interpretación |
|---|---|
requested_depth | Profundidad solicitada en el request. |
reached_depth | Mayor ronda efectivamente alcanzada. Puede ser menor que la solicitada si no había vínculos nuevos. |
warnings | Si hay aviso de límite o indisponibilidad, la red no debe tratarse como completa. |
billable_depth | Profundidad efectivamente usada para la facturación. |
derived_screening | Métricas del análisis de riesgo de las entidades relacionadas. |
entities_processed / unique_entities | Volumen procesado y volumen tras la deduplicación. |
relationships_found | Vínculos societarios encontrados. |
entity_limit | Límite operativo que protege contra redes excesivamente grandes. |
interpol_excluded | INTERPOL no participa del análisis derivado de QSA. |
billing.ownership_tokens | Componente de tokens de la expansión societaria. |
Cuando el QSA se ejecuta, la profundidad facturable mínima es 1, incluso sin vínculos encontrados. El costo de expansión se basa en el costo de los grupos de fuentes y en la profundidad efectivamente facturable. Si el QSA no está disponible, la consulta principal puede continuar; en ese caso, trate el bloque societario como no disponible y siga los avisos y la facturación devueltos.
9. Dossier y trazabilidad de auditoría
dossier organiza las evidencias del sujeto principal para auditoría:
{
"dossier": {
"audit_trail": {
"api_version": "v1",
"timestamp_utc": "2026-08-04T12:15:18Z",
"groups_checked": ["national", "sanctions"],
"tokens_charged": 6
},
"decision": {
"risk_level": "MEDIUM",
"identity_class": "POTENTIAL_MATCH",
"recommendation": "REVIEW"
},
"regulatory_taxonomy": {
"by_category": {
"Politically Exposed Person (PEP)": 1
},
"risk_by_category": {
"Politically Exposed Person (PEP)": "MEDIUM"
}
},
"proof_of_compliance": {
"status": "RECORDED",
"ledger_ref": "SCR-20260804-ABC123",
"hash": "..."
}
}
}
El dossier no debe usarse para recalcular la decisión: es una presentación auditable de decision, detailed_hits, taxonomía y evidencia de facturación.
10. Resultado resumido para la interfaz del cliente
Una aplicación puede mostrar su propio resumen, siempre que preserve la respuesta original para auditoría:
{
"screening_completeness": "COMPLETE",
"direct_subject": {
"risk": "CLEAR",
"identity": "NO_MATCH",
"recommendation": "APPROVE",
"actionable_hits": 0
},
"ownership_network": {
"status": "FOUND",
"requested_depth": 3,
"reached_depth": 3,
"related_entities_with_actionable_hits": 2,
"highest_related_risk": "HIGH"
},
"next_action": "MANUAL_REVIEW"
}
related_entities_with_actionable_hits, highest_related_risk y next_action son ejemplos de campos calculados por la aplicación cliente. No sustituyen los campos oficiales devueltos por la API.
11. Checklist de implementación
- Validar
statusantes de consumir cualquier recomendación. - Tratar
risk_leveleidentity_classcomo ejes independientes. - Mostrar
noticesy registrar la respuesta íntegra. - No confundir el resultado directo con el riesgo de la red societaria.
- Evaluar cada
company.screeningypartners[].screeningdel QSA. - Mostrar
requested_depth,reached_depth, avisos y límites de la red. - Señalar que INTERPOL queda excluido del análisis derivado de QSA.
- Usar
tokens_charged,token_balance,billingyproof_of_compliancepara trazabilidad. - Nunca inferir que una fuente fue consultada solo porque no hay hits; usar
sources_checked.
Vea funcionando
Las cinco llamadas más comunes — health, sources, balance, screening (con y sin coincidencia) y statement — corriendo en vivo, lado a lado, en la página Vea funcionando.
Entrar