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

# API para obtener una sesión: datos de decisión KYC y KYB

> Didit devuelve la decisión completa de sesiones KYC o KYB: identidad, liveness, AML, registro y OCR. Menos de 2 s, pago por llamada.



Prompt para obtener la decisión de una sesión
        Copiar el prompt al portapapeles



      
      

\<pre>

\``Fetch the full decision for a Didit verification session.

Endpoint:
GET https://verification.didit.me/v3/session/{session_id}/decision/

Authentication:
Use the x-api-key header with your Didit API key. The key must hold the read:sessions privilege.

Path parameter:
\- session_id (UUID) — returned by POST /v3/session/. Didit resolves it as a User Verification session first, then as a Business Verification session — you do not need to know the kind in advance.

curl example:
curl https://verification.didit.me/v3/session/<SESSION_ID>/decision/ \
-H "x-api-key: <API_KEY>"

Response — top-level keys (both kinds share these):
\- session_id (UUID)
\- session_kind ("user" | "business") — discriminator, ALWAYS branch on this.
\- session_number (int)
\- session_url (string) — hosted URL.
\- status (string) — "Approved", "Declined", "In Review", "In Progress", "Not Started", "Expired", "Abandoned", "Kyc Expired", "Resubmitted", "Awaiting User".
\- workflow_id (workflow_version, workflow_type and workflow_version_id come only with ?include=events)
\- vendor_data, metadata, callback
\- features (string or array) — feature list the workflow runs.
\- expected_details — what you sent on create, if any.
\- created_at, expires_at (ISO 8601).
\- contact_details — { email, email_lang, send_notification_emails, phone }.
\- reviews — array of manual-review activity.
\- status_override ({ overridden_at, automatic_status } | null) — set when a reviewer changed the status by hand.
\- decision_trace — how the status was reached: status, decided_by (manual | automatic | investigator), decided_at, automatic_status, terminal_node_id, actor, warning_counts, status_warnings.
\- linked_records — same_face, earlier_verifications and networks summaries, or null.
\- biometric_retention ({ jurisdictions, deletes_at }) — the date the live biometric data of the session is deleted.
\- assignee, waiting_since, sla_due_at — the Console reviewer holding the session and its review clock; null unless the session is In Review.
\- database_validation_not_performed_reason — why a configured database validation produced no result, when database_validations is null.
\- geolocation_checks, geolocation_attempts — Location verification results and every attempt (see /core-technology/location-verification/report-location-verification).
\- shared_from_session, shared_from_session_number, sandbox_scenario, fraud_check — set only for imported sessions, sandbox scenarios and Fraud Check sessions.
\- full_session_video, full_session_video_recorded_at — only when your organization records full-session video.

Feature arrays — KYC only (session_kind: "user"):
\- id_verifications, liveness_checks, face_matches, nfc_verifications, poa_verifications, database_validations
\- `id_verifications[].barcodes` is always an array. Each entry preserves the reader output, including `type`, `position`, `data`, `data_raw`, and `side`; documents without barcode output return `[]`.
\- nfc_verifications[] items carry is_nfc_skipped (boolean) and skip_reason (string | null) alongside status/chip_data/authenticity — read the reason from the report when one exists. chip_protocol is "icao" or "jpki"; a Japan My Number Card read ("jpki") has its evidence under jpki (chain_valid, signature_valid, revocation_status, attributes, attributes_match_ocr) and null ICAO fields.
\- nfc_skip_reason (string | null), top level — why NFC did not run (USER_SKIPPED, DOCUMENT_WITHOUT_CHIP, CHIP_CERTIFICATE_UNAVAILABLE, DEVICE_WITHOUT_NFC, INTEGRATION_WITHOUT_NFC_ACCESS, MRZ_KEY_UNAVAILABLE, JPKI_UNAVAILABLE), including when the step was bypassed and nfc_verifications stays null.

Feature arrays — KYB only (session_kind: "business"):
\- registry_checks (includes company + officers + beneficial_owners + ownership_structure)
\- document_verifications
\- key_people_checks (officers + beneficial_owners + submitted parties + ubo_kyc_summary)

Shared by both kinds:
\- aml_screenings, phone_verifications, email_verifications, questionnaire_responses, ip_analyses, document_ai_documents
\- bank_verifications: Bank Verification results, one item per Bank Verification step. Read method: "open_banking" (bank sign-in) or "account_lookup" (account check), or a "microdeposits" or "statement" fallback; null until an account is evaluated. "none" when the person chose Continue without your bank before any attempt was evaluated. continued_without_bank: true when the person chose Continue without your bank, also after an evaluated attempt, whose verdict stands; continuation.reason says why (no_route, institution_unsupported, attempts_exhausted, person_choice). financial_data.not_collected lists the data an account check could not collect. See /core-technology/bank-verification/verification-methods and /core-technology/bank-verification/fallbacks.
\- signatures: E-signature results, one item per signer. Present only when the workflow has an E-signature step. Read status ("signed" means signed), verdict, signer, confirmation, certificate, timestamp, documents[] (sha256_original, sha256_signed, signed_file, fields[]) and evidence_file. See /core-technology/electronic-signature/report-electronic-signature.

V3 contract: feature arrays are ALWAYS plural arrays. If a feature was not run on the session, the field is absent or null — never a placeholder.

See /reference/data-models for the full schema (every nested field).

Handler pattern:
const decision = await (await fetch(url, { headers: { "x-api-key": API_KEY } })).json();
switch (decision.session_kind) {
case "user": return handleUserDecision(decision);
case "business": return handleBusinessDecision(decision);
}

Failure modes:
\- 404 — { "detail": "Not found." } when the session does not exist (both session types are checked) or belongs to a different application.
\- 403 — { "detail": "You do not have permission to perform this action." } when the key lacks read:sessions.
\- 401 — invalid API key.

When to call:
\- Eagerly after receiving a status.updated webhook (recommended pattern — see /integration/webhooks).
\- On-demand when your support agent or analyst opens the session in your dashboard.

Caching:
Decision payloads are mutable until the session reaches a terminal status. Cache only if you also subscribe to data.updated and status.updated webhooks.

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.``

\</pre>



      
      

Pegar en

## Compatibilidad con KYC y KYBEste endpoint funciona tanto con sesiones de **Verificación de usuario (KYC)** como de **Verificación de empresas (KYB)**. La respuesta siempre incluye un campo `session_kind` en el nivel superior:- `"user"`: sesión de Verificación de usuario (KYC). La respuesta incluye `id_verifications`, `liveness_checks`, `face_matches`, `nfc_verifications`, `poa_verifications` y `database_validations`.
- `"business"`: sesión de Verificación de empresas (KYB). La respuesta incluye `registry_checks`, `document_verifications` y `key_people_checks`.Ambos tipos comparten `aml_screenings`, `phone_verifications`, `email_verifications`, `questionnaire_responses`, `ip_analyses`, `document_ai_documents`, `bank_verifications`, `reviews` y `contact_details`, además de los campos comunes del nivel superior (`session_id`, `session_number`, `session_url`, `status`, `workflow_id`, `vendor_data`, `metadata`, `callback`, `features`, `expected_details`, `created_at`, `expires_at`).Didit busca el `session_id` en ambos tipos de sesión (primero en Verificación de usuario y después en Verificación de empresas) y devuelve la que coincida. Los UUID son únicos por aplicación, así que no hay ambigüedad.Consulta la [descripción general de las sesiones](https://docs.didit.me/es/sessions-api/overview.md) para ver la matriz completa de funciones específicas de cada tipo.## Ejemplos> [tab] Verificación de usuario (KYC)
>
> ```bash theme={null}
> curl https://verification.didit.me/v3/session/4c5c7f3a-1f82-4f3b-8d8e-1a8d2d2f9b7a/decision/ \
>   -H "x-api-key: YOUR_API_KEY"
> ```
>
> **Respuesta (truncada):**
>
> ```json theme={null}
> {
>   "session_id": "4c5c7f3a-1f82-4f3b-8d8e-1a8d2d2f9b7a",
>   "session_kind": "user",
>   "session_number": 1024,
>   "session_url": "https://verify.didit.me/...",
>   "status": "APPROVED",
>   "workflow_id": "wf_kyc_standard",
>   "vendor_data": "user-42",
>   "features": "ID_VERIFICATION,LIVENESS,FACE_MATCH,AML",
>   "id_verifications": [
>     { "node_id": "feature_ocr_1", "status": "Approved", "document_type": "Passport", "full_name": "John Doe", "barcodes": [], "...": "..." }
>   ],
>   "liveness_checks": [
>     { "node_id": "feature_liveness_1", "status": "Approved", "score": 0.98 }
>   ],
>   "face_matches": [
>     { "node_id": "feature_face_match_1", "status": "Approved", "score": 0.94 }
>   ],
>   "aml_screenings": [
>     { "node_id": "feature_aml_1", "status": "Approved", "total_hits": 0, "score": 0 }
>   ],
>   "phone_verifications": [],
>   "email_verifications": [],
>   "questionnaire_responses": [],
>   "ip_analyses": [],
>   "reviews": [],
>   "contact_details": { "email": "alex.sample@example.com", "phone": null },
>   "expected_details": null,
>   "metadata": {},
>   "callback": null,
>   "created_at": "2026-04-16T10:00:00Z",
>   "expires_at": "2026-04-23T10:00:00Z"
> }
> ```> [tab] Verificación de empresas (KYB)
>
> ```bash theme={null}
> curl https://verification.didit.me/v3/session/bs-01HJX1.../decision/ \
>   -H "x-api-key: YOUR_API_KEY"
> ```
>
> **Respuesta (truncada):**
>
> ```json theme={null}
> {
>   "session_id": "bs-01HJX1...",
>   "session_kind": "business",
>   "session_number": 89,
>   "session_url": "https://verify.didit.me/...",
>   "status": "APPROVED",
>   "workflow_id": "wf_kyb_standard",
>   "vendor_data": "biz-acme-001",
>   "features": ["KYB_REGISTRY", "KYB_COMPANY_AML", "KYB_DOCUMENTS", "KYB_KEY_PEOPLE"],
>   "registry_checks": [
>     {
>       "status": "Approved",
>       "node_id": "feature_kyb_registry",
>       "data_resolved": true,
>       "company": {
>         "uuid": "...",
>         "node_id": "feature_kyb_registry",
>         "status": "Approved",
>         "registry_status": "active",
>         "company_name": "Acme Corporation Limited",
>         "registration_number": "12345678",
>         "country_code": "GBR",
>         "company_type": "Private Limited",
>         "incorporation_date": "2010-05-14",
>         "registered_address": "1 Main Street, London EC1A 1AA, United Kingdom",
>         "tax_number": "SAMPLE-TAX-12345",
>         "risk_level": "LOW",
>         "verification_status": "verified",
>         "is_from_registry": true,
>         "fetch_status": "resolved",
>         "alternative_names": ["Acme Ltd"],
>         "nature_of_business": "Software publishing",
>         "registered_capital": "100000 GBP",
>         "website": "https://acme.example",
>         "email": "alex.sample@example.com",
>         "phone": "+15550101000",
>         "legal_entity_identifier": "529900XXXXXXXXXXXXX",
>         "financial_summary": {},
>         "officers": [
>           { "uuid": "...", "name": "Jane Doe", "role": "director", "nationality": "USA", "is_active": true, "kyc_status": "Approved", "kyc_session_url": "https://verify.didit.me/..." }
>         ],
>         "beneficial_owners": [
>           { "uuid": "...", "name": "John Smith", "entity_type": "person", "roles": ["ubo"], "ownership_min_shares": 40, "ownership_max_shares": 40, "kyc_status": "Pending", "effective_ownership_percent": 40.0 }
>         ],
>         "addresses": [],
>         "industries": [],
>         "accounts": [],
>         "registry_data": { },
>         "user_provided_data": { },
>         "confirmed_by_user_at": "2026-04-16T10:10:00Z",
>         "is_editable": false
>       },
>       "ownership_structure": { },
>       "warnings": []
>     }
>   ],
>   "aml_screenings": [
>     {
>       "node_id": "feature_kyb_company_aml",
>       "status": "Approved",
>       "total_hits": 0,
>       "score": 0,
>       "entity_type": "COMPANY",
>       "hits": []
>     }
>   ],
>   "document_verifications": [
>     {
>       "status": "Approved",
>       "node_id": "feature_kyb_documents",
>       "items": [
>         { "uuid": "...", "document_type": "certificate_of_incorporation", "status": "Approved", "file_url": "https://...", "ocr_data": { } }
>       ],
>       "groups": { "legal_presence": { "approved": 1, "pending": 0, "missing": 0 } },
>       "required_groups": ["legal_presence", "ownership_structure"],
>       "warnings": []
>     }
>   ],
>   "key_people_checks": [
>     {
>       "status": "Approved",
>       "node_id": "feature_kyb_key_people",
>       "officers": [
>         { "uuid": "...", "name": "Jane Doe", "role": "director", "kyc_status": "Approved", "kyc_session_url": "..." }
>       ],
>       "beneficial_owners": [
>         { "uuid": "...", "name": "John Smith", "roles": ["ubo"], "ownership_min_shares": 40, "ownership_max_shares": 40, "kyc_status": "Pending" }
>       ],
>       "registry": {
>         "officers": [
>           { "uuid": "...", "name": "Jane Doe", "role": "director", "kyc_status": "Approved" }
>         ],
>         "beneficial_owners": [
>           { "uuid": "...", "name": "John Smith", "roles": ["ubo"], "ownership_min_shares": 40, "kyc_status": "Pending" }
>         ]
>       },
>       "submitted": {
>         "parties": [
>           { "uuid": "...", "entity_type": "person", "name": "Alice Chen", "role": "ubo", "ownership_percent": 35.0, "requires_verification": true, "kyc_session_status": "Not Started", "kyc_session_url": "https://verify.didit.me/..." }
>         ]
>       },
>       "ubo_kyc_summary": {
>         "total": 2,
>         "approved": 1,
>         "flagged": 0,
>         "pending": 1
>       },
>       "warnings": []
>     }
>   ],
>   "phone_verifications": null,
>   "email_verifications": null,
>   "questionnaire_responses": null,
>   "ip_analyses": null,
>   "reviews": [],
>   "contact_details": { "email": "alex.sample@example.com", "email_lang": "en", "send_notification_emails": true, "phone": null },
>   "expected_details": null,
>   "metadata": {},
>   "callback": null,
>   "created_at": "2026-04-16T10:00:00Z",
>   "expires_at": "2026-04-23T10:00:00Z"
> }
> ```## Cómo gestionar la respuesta en tu sistema```typescript theme={null}
const res = await fetch(`${BASE}/v3/session/${sessionId}/decision/`, {
  headers: { "x-api-key": API_KEY },
});
const decision = await res.json();

switch (decision.session_kind) {
  case "user":
    handleUserDecision(decision);
    break;
  case "business":
    handleBusinessDecision(decision);
    break;
}
```## Campos de estado, traza de la decisión y revisiónCada decisión explica cómo se llegó a su `status`.| Campo | Qué leer |
| - | - |
| `status_override` | `null` cuando el estado es el automático. Después de que un revisor establezca el estado manualmente, es `{ overridden_at, automatic_status }`, donde `automatic_status` es lo que concluyen las comprobaciones. Úsalo para distinguir una aprobación manual de una automática. |
| `decision_trace` | `status`, `decided_by` (`manual`, `automatic` o `investigator`; `null` mientras la sesión no tiene decisión), `decided_at`, `automatic_status`, `terminal_node_id`, `actor` (el revisor que tomó una decisión manual), `warning_counts` por `log_type` más `total`, y `status_warnings`, las advertencias que establecieron un estado `Declined` o `In Review`. |
| `linked_records` | Un resumen de los demás elementos con los que está vinculada la verificación: `same_face` (otras personas cuyo rostro coincidió y la coincidencia más cercana), `earlier_verifications` (un recuento para la misma persona) y `networks`. `null` cuando no hay nada que mostrar. |
| `assignee`, `waiting_since`, `sla_due_at` | El revisor de la Console que tiene asignada la sesión, cuándo empezó a esperar y cuándo vence la revisión. `waiting_since` y `sla_due_at` son `null` salvo que la sesión esté `In Review` y tu aplicación defina un plazo de revisión. |
| `database_validation_not_performed_reason` | `{ code, message }`, que explica por qué una validación de base de datos configurada no produjo ningún resultado. Permite distinguir entre "los datos coincidieron con el registro" y "no se ejecutó nada" cuando `database_validations` es `null`. |
| `shared_from_session`, `shared_from_session_number` | La sesión de origen cuando esta se importó con `POST /v3/session/import-shared/`; `null` en caso contrario. |
| `sandbox_scenario` | El escenario con el que se creó una sesión de sandbox. |
| `full_session_video`, `full_session_video_recorded_at` | Una URL de la grabación que caduca y la fecha en que se realizó. Solo se devuelven cuando tu organización graba vídeo de la sesión completa. |## Retención de datos biométricos`biometric_retention` siempre está presente. `deletes_at` es la fecha en que se eliminan los datos biométricos activos de la sesión, y `jurisdictions` enumera los estados de EE. UU. cuyas normas biométricas fijan un límite de eliminación para la persona (`US` cuando se desconoce el estado). `deletes_at` es `null` cuando todavía no es aplicable ninguna fecha.## Verificación de ubicaciónCuando el flujo tiene un paso de [Verificación de ubicación](https://docs.didit.me/es/core-technology/location-verification/overview.md), la decisión incluye dos arrays. `geolocation_checks[]` tiene un elemento por paso: su intento aceptado, con el resultado, las coordenadas y su precisión, las comprobaciones con la ubicación de la IP y con la dirección registrada, y las `warnings` del paso. `geolocation_attempts[]` enumera todos los intentos de todos los pasos, del más antiguo al más reciente, con el momento en que se recibió cada uno. Los flujos sin este paso devuelven ambos como `null`. Todos los campos y resultados se detallan en el [Informe de verificación de ubicación](https://docs.didit.me/es/core-technology/location-verification/report-location-verification.md).## Eventos de enrutamiento del flujo`?include=events` añade la cronología de eventos de la sesión. Además de los cambios de paso
y de estado, un flujo que enruta a través de nodos de rama deja un evento por cada
decisión de enrutamiento, de modo que una integración (o la cronología de la Console) puede explicar por qué una sesión terminó
con un resultado determinado sin tener que recorrer a mano el grafo del flujo:| `event_type` | Cuándo se registra | `details` |
| - | - | - |
| `WORKFLOW_BRANCH_EVALUATED` | Se evaluó un nodo con condiciones de rama mientras avanzaba la sesión (nodos de rama, y nodos de función o de webhook con ramas) | `node_id`, `node_label`, `node_type`, `matched_branch_id` (la rama que coincidió, o `null` cuando no coincidió ninguna), `fallback` (`true` cuando ninguna condición coincidió y se tomó la arista predeterminada del nodo), `next_node_id`, `next_node_label` |
| `WORKFLOW_STATUS_NODE_REACHED` | Se ejecutó un nodo de estado | `node_id`, `node_label`, `session_status` (el valor configurado, incluido `Determine`), `resolved_session_status` (el valor al que se resolvió), `feature_statuses` (`[{target, status}]`) |Ambos eventos incluyen `sent_at` en milisegundos, como cualquier otro evento, y no tienen
`component`, `feature_step` ni `step`: los genera el motor de flujos, no
el dispositivo del usuario. Una rama "else" (una rama sin condiciones) cuenta como rama
coincidente; `fallback` solo es `true` cuando no coincidió nada. Los nodos con una sola arista
de salida no toman ninguna decisión y no dejan ningún evento.La misma estructura también incluye `workflow_terminal_node_id`: el `node_id` del último
nodo de estado del flujo registrado que estableció un estado de sesión, o `null` si no se ha registrado
ningún ID de nodo de ese tipo. Es la procedencia histórica del flujo. Las aprobaciones,
rechazos y reenvíos manuales no lo borran; un nodo de estado posterior del flujo lo reemplaza.
Por ejemplo, si un flujo envía una sesión a un nodo *En revisión* y un revisor
la aprueba después, el `status` actual es `Approved`, mientras que
`workflow_terminal_node_id` sigue identificando el nodo *En revisión*. También puede seguir
teniendo un valor mientras hay un reenvío en curso. Consulta el `status` actual y las
cronologías de eventos y de `activity_reviews` para distinguir los resultados del flujo de las decisiones
manuales posteriores.```json theme={null}
{
  "event_type": "WORKFLOW_BRANCH_EVALUATED",
  "sent_at": 1789336414007,
  "details": {
    "node_id": "branch-d57da8aa",
    "node_label": "Credential required?",
    "node_type": "branch",
    "matched_branch_id": null,
    "fallback": true,
    "next_node_id": "status-6ba0bd0d",
    "next_node_label": "In Review"
  }
}
```## Envíos anteriores (`?include=resubmissions`)Un reenvío devuelve al usuario a los pasos que selecciones y conserva lo que esos pasos devolvieron antes.
`?include=resubmissions` añade un array `resubmissions`, del más antiguo al más reciente, con una entrada por cada solicitud de reenvío.
Cada entrada contiene los resultados que esa solicitud reemplazó, de modo que siempre puedes consultar lo que el usuario envió antes.
Funciona con sesiones de usuario (KYC) y de empresa (KYB), y puedes combinarlo con los eventos (`?include=events,resubmissions`).
Sin el parámetro, la respuesta no cambia.| Campo | Descripción |
| - | - |
| `number` | 1 para el primer reenvío de la sesión, 2 para el segundo, y así sucesivamente. |
| `created_at` | Cuándo se solicitó el reenvío. |
| `previous_status` | El estado de la sesión justo antes de la solicitud. |
| `nodes` | Los pasos del flujo a los que se devolvió al usuario (`[{node_id, feature}]`). |
| `reasons` | El motivo indicado para cada paso, indexado por `node_id`, o `null`. |
| `requested_by` | Quién lo solicitó (`name`, `email`, `type`), o `null`. |
| `results` | Lo que esos pasos devolvieron antes de la solicitud, con las mismas claves y la misma estructura que los resultados actuales (`id_verifications`, `nfc_verifications`, `liveness_checks`, `face_matches`, `poa_verifications`, `phone_verifications`, `email_verifications`, `aml_screenings`, `ip_analyses`, `database_validations`, `questionnaire_responses`, `document_ai_documents`, `geolocation_checks`; en las sesiones de empresa también `document_verifications`). Solo aparecen las claves de los pasos a los que se devolvió al usuario. |Los resultados actuales (`id_verifications` y el resto en el nivel superior) siempre describen el envío más reciente.
Los pasos a los que no se devolvió al usuario conservan ahí un único resultado.```json theme={null}
{
  "status": "In Review",
  "id_verifications": [{ "node_id": "feature_ocr", "status": "Approved" }],
  "resubmissions": [
    {
      "number": 1,
      "created_at": "2026-10-01T08:31:04.512Z",
      "previous_status": "In Review",
      "nodes": [{ "node_id": "feature_ocr", "feature": "OCR" }],
      "reasons": { "feature_ocr": "Passport photo too blurry" },
      "requested_by": { "name": "<reviewer name>", "email": "<reviewer email>", "type": "USER" },
      "results": {
        "id_verifications": [
          {
            "node_id": "feature_ocr",
            "status": "Declined",
            "warnings": [{ "risk": "IMAGE_TOO_BLURRY", "log_type": "error" }]
          }
        ]
      }
    }
  ]
}
```Al eliminar una sesión se eliminan con ella los resultados de todos sus envíos.## Métodos de verificación de identidadCada elemento de `id_verifications[]` indica cuál de los tres [métodos de verificación de identidad](https://docs.didit.me/es/core-technology/id-verification/verification-methods.md) lo generó, para que puedas distinguir una lectura de documento de una consulta en un registro o de un inicio de sesión con wallet sin tener que deducirlo de los campos que resulten tener valor:| Campo | Valor |
| - | - |
| `verification_method` | `document`, `id_lookup` o `wallet` |
| `assurance` | `documentary`, `data_match` o `cryptographic` |
| `wallet_provider` | ID de la wallet en el catálogo cuando la generó una wallet; en caso contrario, `null` |
| `id_lookup` | Evidencia del registro (fuente, intentos, comparación campo por campo, retrato del registro) o `null` |
| `wallet_verification` | Evidencia de la credencial (proveedor, autoridad emisora, nivel de garantía, validez de la firma, atributos compartidos) o `null` |
| `fallback_from` | Por qué un método distinto del documento terminó el paso de identidad, cuando rechazó la sesión |Una sesión con documento informa `document` y `documentary` y deja el resto en `null`, por lo que las integraciones existentes no necesitan cambios. Los tipos de cada campo están en [Modelos de datos](https://docs.didit.me/es/reference/data-models.md#verificación-de-identidad).## Consentimiento biométricoLas decisiones de Verificación de usuarios incluyen un objeto `biometric_consent`: si la sesión requería consentimiento biométrico explícito, el `trigger` que lo exigió, el `status` de la respuesta y su evidencia. Dos valores te indican que no se recogió el consentimiento:| Campo | Valor | Significado |
| - | - | - |
| `status` + `reason` | `pending` + `BIOMETRIC_CONSENT_UNSUPPORTED_SDK` | Un SDK nativo anterior a la versión 4.10.0, o uno que no informó su versión, capturó un rostro sin el paso de consentimiento. La sesión se realizó como antes. |
| `status` + `reason` | `declined` + `BIOMETRIC_CONSENT_DECLINED` | Se registró un rechazo. La sesión está en `Declined` y se eliminaron sus datos faciales. Actualmente ninguna pantalla de Didit ofrece la opción de rechazar. |Cuándo aparece el paso y qué significa cada valor se explican en [Consentimiento biométrico](https://docs.didit.me/es/getting-started/biometric-consent.md); todos los campos están en [Modelos de datos](https://docs.didit.me/es/reference/data-models.md#consentimiento-biométrico).## Verificación bancaria> [!WARNING]
>
> La verificación bancaria todavía no está habilitada en producción. Mientras no lo esté, un flujo de producción no puede incluir este paso y `bank_verifications` permanece en `null`.Cuando el flujo tiene un paso de [verificación bancaria](https://docs.didit.me/es/core-technology/bank-verification/verification-methods.md), la decisión incluye `bank_verifications[]` en ambos tipos de sesión: un elemento por paso, con valor `null` hasta que un paso produzca un resultado.| Campo | Qué leer |
| - | - |
| `status` | El veredicto del paso: `Approved`, `In Review`, `Declined`, `Not Finished` o `Expired`. |
| `method` | Cómo se verificó la cuenta: `open_banking` (inicio de sesión en el banco), `account_lookup` (comprobación de la cuenta), `microdeposits` o `statement`. Vale `null` hasta que se evalúa una cuenta, y `none` cuando la persona continuó sin banco antes de que se evaluara ningún intento. |
| `continued_without_bank`, `continuation` | Si la persona eligió **Continue without your bank** y por qué: `continuation.reason` es `no_route`, `institution_unsupported`, `attempts_exhausted` o `person_choice`. Con `institution_unsupported`, `continuation.institution_name` indica el banco que la persona no pudo usar. |
| `ownership` | Cómo se comparó el titular de la cuenta con la identidad verificada: `result` es `match`, `partial_match` (una coincidencia cercana), `no_match`, `not_verifiable` o `unknown`. |
| `account` | La cuenta verificada, enmascarada. |
| `financial_data` | Saldos, transacciones e ingresos, que solo se obtienen mediante el inicio de sesión en el banco. `not_collected` enumera los datos que el paso solicitó y que el método no recopiló, por ejemplo tras una comprobación de la cuenta. |
| `connection` | El último intento: su estado, el banco, los intentos consumidos y un `reason_code`. |Lee `method`, no `ownership.method`, para distinguir el inicio de sesión en el banco de la comprobación de la cuenta: `ownership.method` es la comparación de nombres que produjo la puntuación. Todos los campos están en el esquema `BankVerificationResult` de la respuesta de este endpoint.## Firma electrónicaCuando el flujo tiene un paso de [firma electrónica](https://docs.didit.me/es/core-technology/electronic-signature/overview.md), la decisión incluye `signatures[]` en ambos tipos de sesión. Contiene un elemento por firmante: uno para una verificación de usuario y uno por cada persona clave que firma en una verificación de empresas. Los flujos sin este paso no devuelven la clave en absoluto.| Campo | Qué leer |
| - | - |
| `status` | `signed` una vez firmados los documentos. Cualquier otro valor significa que todavía no hay firma. |
| `verdict` | `Approved`, `In Review`, `Declined` o `Not Finished`, según las reglas del paso. |
| `signer`, `identity_used` | Quién firmó y la identidad verificada asociada. |
| `confirmation`, `certificate`, `timestamp` | La confirmación con código de un solo uso y la evidencia criptográfica. |
| `documents[]` | Los hashes de cada documento, su estado, su ruta `signed_file` y sus `fields[]` con los valores. |
| `evidence_file` | Ruta del PDF de evidencia del firmante. |Descarga los archivos desde esas rutas con tu clave de API. Consulta el [informe de firma electrónica](https://docs.didit.me/es/core-technology/electronic-signature/report-electronic-signature.md) para ver todos los campos.## Errores| Estado | Motivo |
| - | - |
| `404` | No existe ninguna sesión con ese `session_id` para esta aplicación (se comprueban ambos tipos de sesión). |
| `403` | Falta el privilegio `read:sessions`. |
| `401` | Clave de API no válida. |## Páginas relacionadas- [Visión general de las sesiones](https://docs.didit.me/es/sessions-api/overview.md): distinción entre tipos de sesión y matriz de funciones.
- [Esquema de respuesta de KYB](https://docs.didit.me/es/business-verification/response-schema.md): referencia campo por campo de la decisión empresarial.
- [Estados de verificación](https://docs.didit.me/es/integration/verification-statuses.md): máquina de estados compartida por ambos tipos.
- [Webhooks](https://docs.didit.me/es/integration/webhooks.md): suscríbete a `status.updated` para las sesiones de verificación de usuarios y de verificación de empresas (filtra por `session_kind`).
- [Métodos de verificación de identidad](https://docs.didit.me/es/core-technology/id-verification/verification-methods.md): captura de documentos, consulta sin documentos y wallets de identidad digital, y lo que cada uno añade a la sesión.
- [Consentimiento biométrico](https://docs.didit.me/es/getting-started/biometric-consent.md): cuándo el flujo pide un consentimiento biométrico explícito, y el objeto `biometric_consent`.
- [Informe de firma electrónica](https://docs.didit.me/es/core-technology/electronic-signature/report-electronic-signature.md): `signatures[]`, los PDF firmados y la evidencia.
- [Métodos de verificación bancaria](https://docs.didit.me/es/core-technology/bank-verification/verification-methods.md): `bank_verifications[]` y su `method`.
- [Cuando la persona no puede verificar su banco](https://docs.didit.me/es/core-technology/bank-verification/fallbacks.md): `continued_without_bank`, `continuation` y el resultado de cada motivo.


## OpenAPI

````yaml es/openapi-25.json GET /v3/session/{sessionId}/decision/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/decision/:
    get:
      tags:
        - Sessions
      summary: Obtener la decisión completa de una sesión de verificación
      description: >-
        Obtén el informe de decisión completo de una sesión de verificación: el
        `status` agregado de la sesión más un informe por cada función de
        verificación que ejecutó el flujo. Es el endpoint de lectura canónico
        tanto para sesiones de Verificación de usuarios (KYC) como de
        Verificación de empresas (KYB). La misma ruta sirve para ambas, y el
        discriminador `session_kind` de nivel superior te indica qué estructura
        recibiste (`"user"` o `"business"`).


        **Cada informe de función es un array en plural.** Los flujos V3 son
        grafos que pueden ejecutar la misma función más de una vez. Por eso cada
        bloque (`id_verifications`, `nfc_verifications`, `liveness_checks`,
        `face_matches`, `poa_verifications`, `document_ai_documents`,
        `phone_verifications`, `email_verifications`, `aml_screenings`,
        `ip_analyses`, `database_validations`, `questionnaire_responses`) es un
        array JSON, y cada uno de sus elementos incluye un `node_id` que
        identifica el nodo del grafo del flujo que lo generó. Lee NFC como
        `response.nfc_verifications[0]`, nunca como un campo singular `nfc`. Un
        bloque es `null` hasta que el flujo haya ejecutado esa función al menos
        una vez. Las funciones que el flujo no incluye nunca aparecen con datos.
        Los resultados de Firma electrónica están en `signatures`, que solo está
        presente cuando el flujo tiene un paso de Firma electrónica.


        **Cuándo llamarlo.** El patrón recomendado se basa en eventos: espera el
        webhook `status.updated`, que se dispara cuando la sesión llega a una
        decisión (`Approved`, `Declined`, `In Review`), y luego llama a este
        endpoint una vez para obtener el informe completo. El sondeo (polling)
        también funciona, porque el endpoint se puede llamar en cualquier
        momento del ciclo de vida de la sesión y devuelve los datos generados
        hasta ese momento. Aun así, recibir el webhook y luego consultar es más
        barato y más rápido. Las URL de medios de la respuesta (imágenes de
        documentos, videos, PDF) son enlaces prefirmados de corta duración.
        Descárgalos sin demora o vuelve a solicitar la decisión para obtener
        enlaces nuevos, y no los guardes como referencias a largo plazo.


        **Estados.** El `status` de nivel superior es el estado del ciclo de
        vida de la sesión (`Not Started`, `In Progress`, `Awaiting User`, `In
        Review`, `Approved`, `Declined`, `Resubmitted`, `Expired`, `Kyc
        Expired`, `Abandoned`). Además, cada elemento de función tiene su propio
        `status` a nivel de función (`Not Finished`, `Approved`, `Declined`, `In
        Review`, ...). Según las reglas de decisión del flujo, una sesión puede
        estar `Approved` en conjunto mientras una función concreta está `In
        Review`.


        **Autenticación y visibilidad.** Autentícate con la clave de API de la
        aplicación en el encabezado `x-api-key`. También funciona un token
        Bearer de un usuario de la consola con el permiso `read:sessions`. Solo
        son visibles las sesiones que pertenecen a la aplicación autenticada. Si
        tu flujo restringe los atributos de la respuesta, los campos no
        permitidos dentro de los elementos de función se devuelven como `null`,
        mientras que `status`, `warnings` y `node_id` siempre se conservan.


        **Límites de solicitudes.** Las solicitudes GET están limitadas a 600
        por minuto por clave de API. Si superas el límite, se devuelve `429` con
        los encabezados `Retry-After` y `X-RateLimit-*`.
      operationId: get_v3_session_decision
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID de la sesión de verificación cuya decisión quieres obtener. Es
            el `session_id` que devuelve `POST /v3/session/`. La misma ruta
            sirve para sesiones de Verificación de usuarios (KYC) y de
            Verificación de empresas (KYB): el servidor resuelve el ID en ambos
            tipos de sesión.


            **Debe ser un UUID válido.** La ruta solo coincide con UUID bien
            formados, por lo que el enrutador de URL rechaza un valor mal
            formado antes de que se ejecute el código de la aplicación, y la
            respuesta es una página **HTML** `404` en lugar del envoltorio JSON
            `{"detail": ...}` que se muestra a continuación. Valida el formato
            del UUID en el cliente para poder distinguir un error de entrada de
            un `404` real por sesión inexistente.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: include
          in: query
          required: false
          description: >-
            Lista separada por comas de secciones adicionales del payload.
            Valores admitidos: `events` y `resubmissions`, por separado o juntos
            (`events,resubmissions`). Cuando se pasa `include=events`, la
            respuesta contiene además la cronología de eventos de la sesión
            (`events`, incluidos los eventos de enrutamiento
            `WORKFLOW_BRANCH_EVALUATED` / `WORKFLOW_STATUS_NODE_REACHED`
            descritos en la página Retrieve Session), el registro de actividad
            completo (`activity_reviews`), los indicadores de lista de bloqueo
            (`blocklisted`), un `cost_breakdown` por sesión, los metadatos del
            flujo (`workflow_type`, `workflow_version`, `workflow_version_id` y
            `workflow_terminal_node_id`: el último nodo de estado del flujo
            registrado que estableció un estado de sesión, o `null` si no se ha
            registrado ninguno; es una procedencia histórica que no se borra con
            aprobaciones, rechazos o reenvíos manuales, y que se reemplaza por
            un nodo de estado del flujo posterior) y los metadatos de la sesión
            (`api_service`: cadena o `null`, solo se establece en sesiones de
            API independiente; `session_type`: `API`, `HOSTED` o `MIGRATED`;
            `has_device_nfc_support`: booleano). Dos campos cambian respecto a
            la estructura simple: el discriminador de nivel superior
            `session_kind` se **omite** (la estructura con eventos solo existe
            para sesiones de usuario), y el array `features` pasa de cadenas
            simples a objetos `{feature, node_id}`, donde la función de correo
            electrónico se indica como `EMAIL` en lugar de `EMAIL_VERIFICATION`.
            Esta estructura ampliada la usa principalmente la Didit Console; la
            mayoría de las integraciones de API deberían omitir el parámetro.
            **Limitación de KYB:** `include=events` solo se aplica a sesiones de
            usuario (KYC). Las sesiones de empresa (`session_kind = "business"`)
            siempre devuelven la estructura estándar de decisión de empresa:
            `events`, `activity_reviews`, `blocklisted`, `cost_breakdown` y los
            metadatos adicionales `workflow_*` y de sesión nunca se devuelven
            para sesiones de empresa, y su array `features` sigue siendo un
            array de cadenas simples. Con `include=resubmissions` (tanto en
            sesiones de usuario como de empresa), la respuesta también contiene
            `resubmissions`: una entrada por cada solicitud de reenvío, de la
            más antigua a la más reciente, cada una con `number`, `created_at`,
            `previous_status`, `nodes`, `reasons`, `requested_by` y `results`
            (lo que devolvieron los pasos reenviados antes de la solicitud, con
            las mismas claves y la misma estructura que los resultados
            actuales). Cada elemento de `cost_breakdown` incluye `usage_type`,
            `price`, `details` y `created_at`: un paso reenviado que se vuelve a
            ejecutar se factura como un elemento nuevo.
          schema:
            type: string
            enum:
              - events
              - resubmissions
              - events,resubmissions
            example: events
      responses:
        '200':
          description: >-
            Informe de decisión completo. `session_kind` distingue las dos
            estructuras: las sesiones `user` incluyen los arrays de funciones
            KYC que se muestran abajo; las sesiones `business`, en cambio,
            incluyen `registry_checks`, `document_verifications` y
            `key_people_checks` junto con los arrays compartidos. Los arrays de
            funciones son `null` hasta que el flujo ha ejecutado esa función;
            las URL de los archivos multimedia son enlaces prefirmados de corta
            duración.
          content:
            application/json:
              examples:
                Example:
                  summary: Ejemplo completo
                  value:
                    session_id: 11111111-2222-3333-4444-555555555555
                    session_kind: user
                    session_number: 43762
                    session_url: >-
                      https://verify.didit.me/session/11111111-2222-3333-4444-555555555555
                    status: In Review
                    environment: live
                    workflow_id: 11111111-2222-3333-4444-555555555555
                    features:
                      - ID_VERIFICATION
                      - NFC
                      - LIVENESS
                      - FACE_MATCH
                      - POA
                      - PHONE
                      - DATABASE_VALIDATION
                      - AML
                      - IP_ANALYSIS
                    vendor_data: 11111111-1111-1111-1111-111111111111
                    metadata:
                      user_type: premium
                      account_id: ABC123
                    expected_details:
                      first_name: Carmen
                      last_name: Española Española
                    contact_details:
                      email: carmen@example.com
                      email_lang: es
                      send_notification_emails: false
                      phone: null
                    callback: https://verify.didit.me/
                    id_verifications:
                      - node_id: feature_ocr_1
                        status: Approved
                        document_type: Identity Card
                        document_subtype: ID_CARD_GENERIC
                        document_number: CAA000000
                        personal_number: 99999999R
                        portrait_image: https://<media-host>/portrait.jpg
                        front_image: https://<media-host>/front.jpg
                        front_video: https://<media-host>/front.mp4
                        back_image: https://<media-host>/back.jpg
                        back_video: https://<media-host>/back.mp4
                        full_front_image: https://<media-host>/full_front.jpg
                        full_back_image: https://<media-host>/full_back.jpg
                        front_image_camera_front: https://<media-host>/front_camera_front.jpg
                        back_image_camera_front: https://<media-host>/back_camera_front.jpg
                        date_of_birth: '1980-01-01'
                        age: 45
                        expiration_date: '2031-06-02'
                        date_of_issue: '2021-06-02'
                        issuing_state: ESP
                        issuing_state_name: Spain
                        first_name: Carmen
                        last_name: Española Española
                        full_name: Carmen Española Española
                        gender: F
                        address: Avda de Madrid 34, Madrid, Madrid
                        formatted_address: Avda de Madrid 34, Madrid, Madrid 28822, Spain
                        place_of_birth: Madrid
                        marital_status: Single
                        nationality: ESP
                        extra_fields:
                          dl_categories: []
                          blood_group: null
                        mrz:
                          surname: ESPANOLA ESPANOLA
                          name: CARMEN
                          country: ESP
                          nationality: ESP
                          birth_date: '800101'
                          expiry_date: '310602'
                          sex: F
                          document_type: ID
                          document_number: CAA000000
                          optional_data: 99999999R
                          optional_data_2: ''
                          birth_date_hash: '4'
                          expiry_date_hash: '8'
                          document_number_hash: '4'
                          final_hash: '1'
                          personal_number: 99999999R
                          warnings: []
                          errors: []
                          mrz_type: TD1
                          mrz_string: |-
                            IDESPCAA000000499999999R<<<<<<
                            8001014F3106028ESP<<<<<<<<<<<1
                            ESPANOLA<ESPANOLA<<CARMEN<<<<<
                          mrz_key: CAA000000480010143106028
                        parsed_address:
                          city: Madrid
                          label: Spain ID Card Address
                          region: Madrid
                          country: ES
                          category: Residential
                          street_1: Avda de Madrid 34
                          street_2: null
                          is_verified: true
                          postal_code: '28822'
                          raw_results:
                            types:
                              - street_address
                            geometry:
                              location:
                                lat: 37.4222804
                                lng: -122.0843428
                              viewport:
                                northeast:
                                  lat: 37.4237349802915
                                  lng: -122.083183169709
                                southwest:
                                  lat: 37.4210370197085
                                  lng: -122.085881130292
                              location_type: ROOFTOP
                            place_id: ChIJN1t_tDeuEmsRUsoyG83frY4
                            formatted_address: Avda de Madrid 34, 28822 Madrid, Spain
                            navigation_points:
                              - location:
                                  latitude: 37.4222804
                                  longitude: -122.0843428
                            address_components:
                              - types:
                                  - street_number
                                long_name: '34'
                                short_name: '34'
                              - types:
                                  - route
                                long_name: Avda de Madrid
                                short_name: Avda de Madrid
                              - types:
                                  - locality
                                  - political
                                long_name: Madrid
                                short_name: Madrid
                              - types:
                                  - country
                                  - political
                                long_name: Spain
                                short_name: ES
                              - types:
                                  - postal_code
                                long_name: '28822'
                                short_name: '28822'
                          address_type: Avda
                          document_location:
                            latitude: 37.4222804
                            longitude: -122.0843428
                          formatted_address: Avda de Madrid 34, 28822 Madrid, Spain
                        front_image_camera_front_face_match_score: 95.5
                        back_image_camera_front_face_match_score: 93.2
                        document_selfie_face_matches:
                          - session_id: 3f0c9a52-7b1e-4d68-a2c4-5e9d8b7f1a20
                            session_number: 1180
                            similarity_percentage: 97.4
                            vendor_data: user_ref_001
                            vendor_user_id: null
                            biometric_template_id: null
                            verification_date: '2026-09-02T09:15:00Z'
                            user_details:
                              full_name: Jane Doe
                            match_image_url: https://<media-host>/match_face.jpg
                            status: Approved
                            is_blocklisted: false
                            is_allowlisted: false
                            api_service: null
                            source: session
                        front_image_quality_score:
                          focus_score: 85.3
                          brightness_score: 92.1
                          brightness_issue: ok
                          is_document_fully_visible: true
                          resolution_score: 72.4
                          overall_score: 88.7
                        back_image_quality_score:
                          focus_score: 79.1
                          brightness_score: 90.5
                          brightness_issue: ok
                          is_document_fully_visible: true
                          resolution_score: 72.4
                          overall_score: 85.2
                        extra_files:
                          - https://<media-host>/extra_id_verification.jpg
                        matches:
                          - session_id: 7d4f1f60-9c2e-4b8a-8f3d-2a1b5c6d7e8f
                            session_number: 1234
                            vendor_data: user_ref_001
                            verification_date: '2024-06-15T10:30:00Z'
                            user_details:
                              name: John Smith
                              document_type: ID
                              document_number: CLM148418
                            status: Approved
                            is_blocklisted: false
                            api_service: null
                            front_image_url: https://<media-host>/document_front.jpg
                          - session_id: b2c8e4d1-6a3f-4e7b-95c0-1d8f2a6b4c9e
                            session_number: 1235
                            vendor_data: null
                            verification_date: '2024-05-20T14:45:00Z'
                            user_details:
                              name: John Smith
                              document_type: ID
                              document_number: CLM148418
                            status: Declined
                            is_blocklisted: true
                            api_service: ID_VERIFICATION
                            front_image_url: https://<media-host>/document_front_2.jpg
                        warnings:
                          - feature: ID_VERIFICATION
                            risk: QR_NOT_DETECTED
                            additional_data: null
                            log_type: information
                            short_description: QR not detected
                            long_description: >-
                              The system couldn't find or read the QR code on
                              the document, which is necessary for document
                              verification. This could be due to poor image
                              quality or an unsupported document type.
                            node_id: feature_ocr_1
                        verification_method: document
                        assurance: documentary
                        wallet_provider: null
                        fallback_from: null
                        id_lookup: null
                        wallet_verification: null
                        document_liveness:
                          portrait_replace:
                            score: 96.46
                            front: 96.46
                            back: 98.2
                            decline_threshold: 35
                            review_threshold: 70
                            bucket: approve
                          printed_copy:
                            score: 91.2
                            front: 91.2
                            back: 93.7
                            decline_threshold: 35
                            review_threshold: 77
                            bucket: approve
                          screen_replay:
                            score: 99.9
                            front: 99.9
                            back: 99.5
                            decline_threshold: 30
                            review_threshold: 70
                            bucket: approve
                      - node_id: feature_ocr_2
                        status: Approved
                        issuing_state: ZAF
                        issuing_state_name: South Africa
                        first_name: Thabo
                        last_name: Mokoena
                        full_name: Thabo Mokoena
                        date_of_birth: '1991-06-15'
                        personal_number: '9106155043088'
                        verification_method: id_lookup
                        assurance: data_match
                        wallet_provider: null
                        fallback_from: null
                        id_lookup:
                          source: Department of Home Affairs
                          checked_at: '2026-09-04T09:12:44Z'
                          attempts: 1
                          max_attempts: 2
                          outcome: match
                          comparison:
                            - field: identification_number
                              label: ID number
                              provided: '9106155043088'
                              record: '9106155043088'
                              result: match
                            - field: full_name
                              label: Full name
                              provided: Thabo Mokoena
                              record: Thabo Mokoena
                              result: match
                            - field: date_of_birth
                              label: Date of birth
                              provided: '1991-06-15'
                              record: '1991-06-15'
                              result: match
                          registry_portrait: https://<media-host>/registry_portrait.jpg
                          face_match_score: 96.4
                          source_errors: []
                        wallet_verification: null
                        warnings: []
                      - node_id: feature_ocr_3
                        status: Approved
                        issuing_state: DNK
                        issuing_state_name: Denmark
                        first_name: Freja
                        last_name: Nielsen
                        full_name: Freja Nielsen
                        date_of_birth: '1988-03-02'
                        verification_method: wallet
                        assurance: cryptographic
                        wallet_provider: mitid
                        fallback_from: null
                        id_lookup: null
                        wallet_verification:
                          provider: mitid
                          provider_name: MitID
                          issuing_authority: Danish Agency for Digital Government
                          issuing_country: DNK
                          credential_type: person_identification
                          level_of_assurance: substantial
                          verified_at: '2026-09-04T09:12:44Z'
                          signature_valid: true
                          attributes:
                            full_name: Freja Nielsen
                            date_of_birth: '1988-03-02'
                            cpr_alias: b0f1c2d3-e4f5-4678-9abc-def012345678
                          portrait: null
                          face_match_score: null
                        warnings: []
                    nfc_verifications:
                      - node_id: feature_nfc_1
                        status: In Review
                        is_nfc_skipped: false
                        skip_reason: null
                        chip_protocol: icao
                        jpki: null
                        portrait_image: https://<media-host>/portrait.jpg
                        signature_image: https://<media-host>/signature.jpg
                        chip_data:
                          document_type: ID
                          issuing_country: ESP
                          document_number: '123456789'
                          expiration_date: '2030-01-01'
                          first_name: John
                          last_name: Smith
                          birth_date: '1990-05-15'
                          gender: M
                          nationality: ESP
                          address: CALLE MAYOR 123 4B, MADRID, MADRID
                          place_of_birth: MADRID, MADRID
                        authenticity:
                          sod_integrity: true
                          dg_integrity: true
                        certificate_summary:
                          issuer: >-
                            Common Name: CSCA SPAIN, Serial Number: 3,
                            Organization: DIRECCION GENERAL DE LA POLICIA,
                            Country: ES
                          subject: >-
                            Common Name: DS n-eID SPAIN 2, Organizational Unit:
                            PASSPORT, Organization: DIRECCION GENERAL DE LA
                            POLICIA, Country: ES
                          serial_number: '118120836164494130086420187336801405660'
                          not_valid_after: '2031-02-18 10:21:11'
                          not_valid_before: '2020-11-18 10:21:11'
                        warnings:
                          - feature: NFC
                            risk: DATA_INCONSISTENT
                            additional_data: null
                            log_type: warning
                            short_description: OCR and NFC mrz code extracted are not the same
                            long_description: >-
                              The Optical Character Recognition (OCR) data and
                              the NFC chip data don't match, indicating
                              potential document tampering or data
                              inconsistency.
                            node_id: feature_nfc_1
                    liveness_checks:
                      - node_id: feature_liveness_1
                        status: Approved
                        method: ACTIVE_3D
                        score: 89.92
                        reference_image: https://<media-host>/reference.jpg
                        video_url: https://<media-host>/video.mp4
                        age_estimation: 24.3
                        matches:
                          - session_id: 7d4f1f60-9c2e-4b8a-8f3d-2a1b5c6d7e8f
                            session_number: 1234
                            vendor_data: user_ref_001
                            verification_date: '2024-06-15T10:30:00Z'
                            user_details:
                              full_name: John Smith
                              document_type: ID
                              document_number: CLM148418
                            status: Approved
                            is_blocklisted: false
                            is_allowlisted: false
                            api_service: null
                            source: session
                            match_image_url: https://<media-host>/face_match.jpg
                            similarity_percentage: 98.5
                          - session_id: 3e9a7c21-5b48-4f0e-9c6a-8d2f4b1e0a35
                            session_number: 1100
                            vendor_data: customer_xyz
                            verification_date: '2024-04-10T09:15:00Z'
                            user_details:
                              full_name: John Smith
                              document_type: P
                              document_number: DZ8375806
                            status: Approved
                            is_blocklisted: false
                            is_allowlisted: false
                            api_service: PASSIVE_LIVENESS
                            source: session
                            match_image_url: https://<media-host>/face_match_2.jpg
                            similarity_percentage: 95.2
                        warnings:
                          - feature: LIVENESS
                            risk: LOW_LIVENESS_SCORE
                            additional_data: null
                            log_type: information
                            short_description: Low liveness score
                            long_description: >-
                              The liveness check resulted in a low score,
                              indicating potential use of non-live facial
                              representations or poor-quality biometric data.
                            node_id: feature_liveness_1
                        face_quality: null
                        face_luminance: null
                    face_matches:
                      - node_id: feature_face_match_1
                        status: In Review
                        score: 65.43
                        source_image_session_id: null
                        source_image: https://<media-host>/source-image.jpg
                        target_image: https://<media-host>/target-image.jpg
                        warnings:
                          - feature: FACEMATCH
                            risk: LOW_FACE_MATCH_SIMILARITY
                            additional_data: null
                            log_type: warning
                            short_description: Low face match similarity
                            long_description: >-
                              The facial features of the provided image don't
                              closely match the reference image, suggesting a
                              potential identity mismatch.
                            node_id: feature_face_match_1
                    phone_verifications:
                      - node_id: feature_phone_1
                        status: Approved
                        phone_number_prefix: '+34'
                        phone_number: '600600600'
                        full_number: '+34600600600'
                        country_code: ES
                        country_name: Spain
                        carrier:
                          name: Orange
                          type: mobile
                        is_disposable: false
                        is_virtual: false
                        verification_method: sms
                        verification_attempts: 1
                        verified_at: '2024-07-28T06:47:35.654321Z'
                        lifecycle:
                          - type: PHONE_VERIFICATION_MESSAGE_SENT
                            timestamp: '2025-08-24T09:12:39.580554+00:00'
                            details:
                              status: Success
                              reason: null
                              channel: sms
                              actual_channel: sms
                            fee: 0.1
                          - type: VALID_CODE_ENTERED
                            timestamp: '2025-08-24T09:12:39.662157+00:00'
                            details:
                              code_tried: '123456'
                              status: Approved
                            fee: 0
                          - type: PHONE_VERIFICATION_APPROVED
                            timestamp: '2025-08-24T09:12:39.684292+00:00'
                            details: null
                            fee: 0
                        warnings: []
                        matches:
                          - session_id: null
                            session_number: null
                            vendor_data: null
                            verification_date: null
                            phone_number: '+34600000000'
                            status: null
                            is_blocklisted: true
                            api_service: null
                            source: list_entry
                    email_verifications:
                      - node_id: feature_email_1
                        status: Approved
                        email: test@example.com
                        is_breached: true
                        breaches:
                          - name: TAPAirPortugal
                            domain: flytap.com
                            logo_path: https://logos.example.com/TAPAirPortugal.png
                            breach_date: '2022-08-25'
                            description: >-
                              In August 2022, the Portuguese airline <a
                              href="https://www.bleepingcomputer.com/news/security/ragnar-locker-ransomware-claims-attack-on-portugals-flag-airline/"
                              target="_blank" rel="noopener">TAP Air Portugal
                              was the target of a ransomware attack perpetrated
                              by the Ragnar Locker gang</a> who later leaked the
                              compromised data via a public dark web site. Over
                              5M unique email addresses were exposed alongside
                              other personal data including names, genders,
                              DoBs, phone numbers and physical addresses.
                            is_verified: true
                            data_classes:
                              - dates_of_birth
                              - email_addresses
                              - genders
                              - names
                              - nationalities
                              - phone_numbers
                              - physical_addresses
                              - salutations
                              - spoken_languages
                            breach_emails_count: 6083479
                        is_disposable: false
                        is_undeliverable: false
                        verification_attempts: 1
                        verified_at: '2025-09-15T17:36:19.963451Z'
                        warnings:
                          - feature: EMAIL
                            risk: BREACHED_EMAIL_DETECTED
                            additional_data: null
                            log_type: information
                            short_description: Breached email detected
                            long_description: >-
                              This email address was found in one or more known
                              data breaches.
                            node_id: feature_email_1
                        lifecycle:
                          - type: EMAIL_VERIFICATION_MESSAGE_SENT
                            timestamp: '2025-09-15T17:36:19.792684+00:00'
                            details:
                              status: Success
                              reason: null
                            fee: 0.02
                          - type: VALID_CODE_ENTERED
                            timestamp: '2025-09-15T17:36:19.963427+00:00'
                            details:
                              code_tried: '123456'
                              status: Approved
                            fee: 0
                          - type: EMAIL_VERIFICATION_DECLINED
                            timestamp: '2025-09-15T17:36:20.081471+00:00'
                            details:
                              reason: BREACHED_EMAIL_DETECTED
                            fee: 0
                        matches:
                          - session_id: null
                            session_number: null
                            vendor_data: null
                            verification_date: null
                            email: test@example.com
                            status: null
                            is_blocklisted: true
                            api_service: null
                            source: list_entry
                    poa_verifications:
                      - node_id: feature_poa_1
                        status: Declined
                        document_file: https://<media-host>/poa_document.pdf
                        issuing_state: AR
                        document_type: UTILITY_BILL
                        document_subtype: null
                        document_language: es
                        document_metadata:
                          file_size: 1000
                          content_type: application/pdf
                          creation_date: '2021-01-01'
                          modified_date: '2021-01-01'
                          overlay_manipulation: null
                          creator: null
                          producer: PDF Generator
                          software: null
                          encryption: null
                          is_signed: false
                          is_tampered: false
                          signature_info: null
                          exif_original_date: null
                          exif_digitized_date: null
                          processed_by_known_editor: false
                          has_different_creation_mod_date: true
                        issuer: Aguas del Norte
                        issue_date: '2021-02-01'
                        expiration_date: null
                        poa_address: AVDA. MONSEÑOR TAVELLA N° 3396, SALTA
                        poa_formatted_address: Av. Monseñor Tavella 3396, A4400 Salta, Argentina
                        poa_parsed_address:
                          address_type: Avenida
                          street_1: Avenida Monseñor Tavella 3396
                          street_2: null
                          city: Salta
                          region: Salta
                          country: AR
                          postal_code: A4400
                          document_location:
                            latitude: -24.8208664
                            longitude: -65.4131
                        name_on_document: Fernando De Lima
                        name_match_score_expected_details: null
                        name_match_score_id_verification: 38.5
                        expected_details_address: null
                        expected_details_formatted_address: null
                        expected_details_parsed_address: {}
                        extra_fields:
                          bank_account_number: '1234567890'
                          bank_iban: null
                          bank_sort_code: null
                          bank_routing_number: null
                          bank_swift_bic: null
                          bank_branch_name: null
                          bank_branch_address: null
                          document_phone_number: '+5491112345678'
                          additional_names: []
                        extra_files:
                          - https://<media-host>/extra_poa.pdf
                        detected_codes:
                          - type: QR_CODE
                            page_number: 1
                            position:
                              - - 820
                                - 1120
                              - - 1002
                                - 1120
                              - - 1002
                                - 1302
                              - - 820
                                - 1302
                            x: 820
                            'y': 1120
                            width: 182
                            height: 182
                            page_width: 1190
                            page_height: 1684
                            raw_payload: >-
                              aHR0cHM6Ly9hZ3Vhc2RlbG5vcnRlLmNvbS9mYWN0dXJhLzk5ODgxMQ==
                            parsed_payload: https://aguasdelnorte.com/factura/998811
                          - type: CODE_128
                            page_number: 1
                            position:
                              - - 112
                                - 1480
                              - - 560
                                - 1480
                              - - 560
                                - 1540
                              - - 112
                                - 1540
                            x: 112
                            'y': 1480
                            width: 448
                            height: 60
                            page_width: 1190
                            page_height: 1684
                            raw_payload: MDA5OTg4MTEwMDA0Mg==
                            parsed_payload: '0099881100042'
                        warnings: []
                    document_ai_documents:
                      - status: Approved
                        node_id: feature_document_ai_1
                        items:
                          - uuid: c1a2b3c4-d5e6-7f80-9a1b-2c3d4e5f6071
                            node_id: feature_document_ai_1
                            document_key: proof_of_funds
                            original_filename: bank_statement.pdf
                            file_size: 184320
                            file_url: >-
                              https://<media-host>/document_ai/proof_of_funds.pdf
                            status: Approved
                            extracted_data:
                              account_holder: John Doe
                              balance: 15230.55
                              currency: EUR
                              statement_date: '2026-05-31'
                            detected_codes:
                              - type: QR_CODE
                                page_number: 2
                                position:
                                  - - 124
                                    - 86
                                  - - 306
                                    - 86
                                  - - 306
                                    - 268
                                  - - 124
                                    - 268
                                x: 124
                                'y': 86
                                width: 182
                                height: 182
                                page_width: 1190
                                page_height: 1684
                                raw_payload: SU5WLTIwMjYtMDA0Mg==
                                parsed_payload: INV-2026-0042
                            fields:
                              - key: account_holder
                                name: Account holder
                                instruction: Extract the full name of the account holder.
                                type: text
                                required: true
                              - key: balance
                                name: Closing balance
                                instruction: Extract the closing balance amount.
                                type: number
                                required: true
                            document_metadata:
                              is_tampered: false
                            cross_check_result: null
                            created_at: '2026-06-01T12:34:56Z'
                        warnings: []
                    questionnaire_responses:
                      - node_id: feature_questionnaire_1
                        questionnaire_id: 9f7485e0-b00b-4d56-9d3e-7859b68d1213
                        title: Source of Funds
                        description: >-
                          Reply to this questionnaire to help us understand the
                          source of funds.
                        languages:
                          - en
                        default_language: en
                        is_active: true
                        is_simple_questionnaire: true
                        questionnaire_group_id: 2b6a9d40-13a8-4b1e-9a6c-3f1d2e4b5a60
                        version: 1
                        published_at: '2025-11-02T09:14:55.000000Z'
                        sections:
                          - title: null
                            description: null
                            items:
                              - uuid: 618636d9-7d5c-41ce-b8d0-1ab2a4be20db
                                value: question_1
                                element_type: DROPDOWN
                                is_required: true
                                title: What is your primary source of funds?
                                description: null
                                placeholder: null
                                choices:
                                  - label: Salary
                                    value: salary
                                  - label: Business Income
                                    value: business_income
                                  - label: Savings
                                    value: savings
                                  - label: Investments
                                    value: investments
                                  - label: Sale of Asset
                                    value: sale_of_asset
                                  - label: Inheritance/Gift
                                    value: inheritance_gift
                                  - label: Pension
                                    value: pension
                                  - label: Crypto Proceeds
                                    value: crypto_proceeds
                                  - label: Other
                                    value: other
                                    requires_text_input: true
                                max_files: 1
                                answer:
                                  value: salary
                                required_if: null
                                repeatable_config: null
                              - uuid: 2d16b527-72be-42e0-8e96-b164b818386c
                                value: question_2
                                element_type: LONG_TEXT
                                is_required: true
                                title: Provide details of the primary source.
                                description: null
                                placeholder: null
                                choices: null
                                max_files: 1
                                answer:
                                  value: Test answer
                                required_if: null
                                repeatable_config: null
                              - uuid: a9239b7c-fbfb-4ea7-b7e4-c835cd4016e0
                                value: question_3
                                element_type: DROPDOWN
                                is_required: true
                                title: What is your annual income range (pre-tax)?
                                description: null
                                placeholder: null
                                choices:
                                  - label: Less than $25,000
                                    value: <25k
                                  - label: $25,000 - $50,000
                                    value: 25k-50k
                                  - label: $50,001 - $100,000
                                    value: 50k-100k
                                  - label: $100,001 - $250,000
                                    value: 100k-250k
                                  - label: More than $250,000
                                    value: '>250k'
                                max_files: 1
                                answer:
                                  value: <25k
                                required_if: null
                                repeatable_config: null
                              - uuid: 93dede62-6d0c-4a7f-934d-42175eb94011
                                value: question_4
                                element_type: DROPDOWN
                                is_required: true
                                title: What is your approximate net worth (range)?
                                description: null
                                placeholder: null
                                choices:
                                  - label: Less than $50,000
                                    value: <50k
                                  - label: $50,000 - $250,000
                                    value: 50k-250k
                                  - label: $250,001 - $1,000,000
                                    value: 250k-1m
                                  - label: $1,000,001 - $5,000,000
                                    value: 1m-5m
                                  - label: More than $5,000,000
                                    value: '>5m'
                                max_files: 1
                                answer:
                                  value: <50k
                                required_if: null
                                repeatable_config: null
                              - uuid: 2af60d6f-6961-4692-9ee7-24b3033610a6
                                value: question_5
                                element_type: LONG_TEXT
                                is_required: true
                                title: >-
                                  For your initial deposit/funding, indicate the
                                  exact source and amount.
                                description: null
                                placeholder: null
                                choices: null
                                max_files: 1
                                answer:
                                  value: Test answer
                                required_if: null
                                repeatable_config: null
                              - uuid: 0ad9d1aa-736f-46cf-947b-9e1241b53e40
                                value: question_6
                                element_type: LONG_TEXT
                                is_required: true
                                title: Breakdown of sources by percentage.
                                description: null
                                placeholder: null
                                choices: null
                                max_files: 1
                                answer:
                                  value: Test answer
                                required_if: null
                                repeatable_config: null
                              - uuid: 1bf8a2a3-14ee-48a8-bb3d-175481aae4aa
                                value: question_7
                                element_type: SINGLE_CHOICE
                                is_required: true
                                title: >-
                                  Will any funds originate from third parties?
                                  If yes, please provide details.
                                description: null
                                placeholder: null
                                choices:
                                  - label: 'Yes'
                                    value: 'yes'
                                    requires_text_input: true
                                  - label: 'No'
                                    value: 'no'
                                max_files: 1
                                answer:
                                  text: Additional details
                                  value: 'yes'
                                required_if: null
                                repeatable_config: null
                              - uuid: e18d4dd3-b7bf-4883-ba18-d6046adbe313
                                value: question_8
                                element_type: SINGLE_CHOICE
                                is_required: true
                                title: >-
                                  Do you hold or plan to use virtual assets
                                  (e.g., crypto) to fund this account? If yes,
                                  please provide details.
                                description: null
                                placeholder: null
                                choices:
                                  - label: 'Yes'
                                    value: 'yes'
                                    requires_text_input: true
                                  - label: 'No'
                                    value: 'no'
                                max_files: 1
                                answer:
                                  text: Additional details
                                  value: 'yes'
                                required_if: null
                                repeatable_config: null
                              - uuid: a90a073d-e098-404c-bbce-5130d8b12a13
                                value: question_9
                                element_type: FILE_UPLOAD
                                is_required: true
                                title: Upload a proof of funds document
                                description: >-
                                  You can upload your three (3) most recent bank
                                  statements, three (3) most recent payslips,
                                  your most recent tax return, proof of company
                                  ownership, trading exchange statement, sale of
                                  property, or proof of inheritance.
                                placeholder: null
                                choices: null
                                max_files: 3
                                answer:
                                  files:
                                    - /media/ocr/
                                    - /media/ocr/
                                required_if: null
                                repeatable_config: null
                              - uuid: 9503b486-7cb8-4c3b-a97d-4b64926a5a47
                                value: question_10
                                element_type: LONG_TEXT
                                is_required: false
                                title: >-
                                  Would you like to add any details to help us
                                  expedite our review of the documents you
                                  submitted?
                                description: null
                                placeholder: null
                                choices: null
                                max_files: 1
                                answer:
                                  value: Test answer
                                required_if: null
                                repeatable_config: null
                        status: Approved
                    aml_screenings:
                      - node_id: feature_aml_1
                        status: In Review
                        total_hits: 1
                        entity_type: person
                        hits:
                          - id: hit_7c1e9a40b2d35f86e0a4c912
                            url: https://news.example.org/articles/sample
                            match: false
                            score: 0.73
                            target: null
                            caption: Javier Ejemplo Modelo
                            datasets:
                              - PEP
                            features: null
                            rca_name: ''
                            last_seen: '2025-06-13T00:00:00'
                            risk_view:
                              crimes:
                                score: 0
                                weightage: 20
                                risk_level: Low
                                risk_scores: {}
                              countries:
                                score: 0
                                weightage: 30
                                risk_level: Low
                                risk_scores: {}
                              categories:
                                score: 100
                                weightage: 50
                                risk_level: High
                                risk_scores:
                                  PEP: 100
                              custom_list: {}
                            first_seen: '2025-01-18T00:00:00'
                            properties:
                              name:
                                - Javier Ejemplo Modelo
                              alias:
                                - Javier Ejemplo Modelo
                                - David Azagra
                              notes:
                                - Spanish orchestra conductor
                              title: null
                              gender:
                                - male
                              height: null
                              topics: null
                              weight: null
                              address: null
                              country: null
                              website: null
                              eyeColor: null
                              keywords: null
                              lastName:
                                - Ejemplo
                                - Modelo
                              position: null
                              religion: null
                              birthDate:
                                - '1974'
                              education:
                                - Tokyo Arts and Space (2012-2012)
                                - Saint Petersburg Conservatory (-2010)
                                - Comillas Pontifical University
                              ethnicity: null
                              firstName:
                                - David
                              hairColor: null
                              weakAlias: null
                              birthPlace:
                                - Madrid
                              modifiedAt: null
                              wikidataId: null
                              citizenship: null
                              nationality: null
                            match_score: 98
                            risk_score: 73
                            review_status: Unreviewed
                            score_breakdown:
                              name_score: 95
                              name_weight: 60
                              name_weight_normalized: 70.59
                              name_contribution: 67.06
                              dob_score: 100
                              dob_weight: 25
                              dob_weight_normalized: 29.41
                              dob_contribution: 29.41
                              country_score: 0
                              country_weight: 15
                              country_weight_normalized: 0
                              country_contribution: 0
                              document_number_match_type: NEUTRAL
                              document_number_effect: No document number provided for screening
                              total_score: 98
                            pep_matches:
                              - aliases:
                                  - Javier Ejemplo Modelo
                                  - David Azagra
                                education:
                                  - Tokyo Arts and Space (2012-2012)
                                  - Saint Petersburg Conservatory (-2010)
                                  - Comillas Pontifical University
                                list_name: Wikidata
                                publisher: Wikidata
                                source_url: https://news.example.org/articles/sample
                                description: >-
                                  Wikidata is the structured data project of the
                                  Wikipedia community, providing fact-based
                                  information edited by humans and machines
                                matched_name: Javier Ejemplo Modelo
                                pep_position: ''
                                date_of_birth: '1974'
                                other_sources: []
                                place_of_birth: Madrid
                            linked_entities:
                              - name:
                                  - Antonio Ejemplo
                                active: []
                                status: []
                                details: []
                                relation: []
                            warning_matches: []
                            sanction_matches: []
                            adverse_media_details:
                              sentiment: Moderately Negative
                              entity_type: person
                              sentiment_score: -2
                              adverse_keywords:
                                fraud: 3
                                juicio: 1
                                delitos: 2
                                imputado: 1
                                impunidad: 1
                                corruption: 2
                                favoritism: 2
                                privilegio: 1
                                corrupción: 1
                                persecution: 2
                                desconfianza: 1
                                desprestigio: 1
                                fraude de ley: 2
                                manipulación: 1
                                investigación: 3
                                prevaricación: 8
                                trato de favor: 1
                                irregularidades: 2
                                crisis de confianza: 1
                                tráfico de influencias: 8
                            adverse_media_matches:
                              - country: spain
                                summary: >-
                                  Javier Ejemplo is implicated in legal
                                  violations related to favoritism and influence
                                  trafficking, leading to a negative portrayal
                                  in the article.
                                headline: >-
                                  La Diputación de Villaejemplo consolida la
                                  plaza a medida para el ex asesor de Moncloa
                                  amigo del "hermanito" de Ejemplo
                                sentiment: moderately negative
                                thumbnail: https://news.example.org/articles/sample
                                source_url: https://news.example.org/articles/sample
                                author_name: null
                                other_sources: []
                                adverse_keywords:
                                  - fraud
                                  - prevaricación
                                  - tráfico de influencias
                                  - irregularidades
                                  - imputado
                                sentiment_score: -2
                                publication_date: '2025-06-10T20:46:38'
                              - country: spain
                                summary: >-
                                  Javier Ejemplo is implicated in legal issues
                                  regarding favoritism and corruption, leading
                                  to a negative portrayal in the article.
                                headline: >-
                                  La Diputación de Villaejemplo consolida la
                                  plaza a medida para el ex asesor de Moncloa
                                  amigo del "hermanito" de Ejemplo
                                sentiment: moderately negative
                                thumbnail: https://news.example.org/articles/sample
                                source_url: https://news.example.org/articles/sample
                                author_name: null
                                other_sources: []
                                adverse_keywords:
                                  - fraud
                                  - prevaricación
                                  - tráfico de influencias
                                  - irregularidades
                                  - trato de favor
                                sentiment_score: -2
                                publication_date: '2025-06-10T20:46:38'
                              - country: spain
                                summary: >-
                                  Javier Ejemplo Modelo is mentioned in
                                  connection with Carlos Ficticio's corruption
                                  case, indicating his involvement in alleged
                                  influence peddling.
                                headline: España, paraíso del aforado
                                sentiment: moderately negative
                                thumbnail: https://news.example.org/articles/sample
                                source_url: https://news.example.org/articles/sample
                                author_name: null
                                other_sources: []
                                adverse_keywords:
                                  - prevaricación
                                  - tráfico de influencias
                                  - corrupción
                                  - impunidad
                                  - privilegio
                                  - desconfianza
                                  - manipulación
                                  - fraude de ley
                                sentiment_score: -2
                                publication_date: '2025-06-10T05:05:34'
                              - country: spain
                                summary: >-
                                  Javier Ejemplo Modelo is implicated in the
                                  same investigation as Ficticio, which raises
                                  questions about his conduct and political
                                  ethics.
                                headline: 'Aforamientos: esa figura incómoda'
                                sentiment: moderately negative
                                thumbnail: https://news.example.org/articles/sample
                                source_url: https://news.example.org/articles/sample
                                author_name: null
                                other_sources: []
                                adverse_keywords:
                                  - prevaricación
                                  - tráfico de influencias
                                  - investigación
                                  - juicio
                                  - fraude de ley
                                  - desprestigio
                                  - crisis de confianza
                                  - delitos
                                sentiment_score: -2
                                publication_date: '2025-06-08T06:01:00'
                              - country: spain
                                summary: >-
                                  Javier Ejemplo is implicated in a legal
                                  investigation regarding irregularities in his
                                  hiring, which raises serious concerns about
                                  his conduct.
                                headline: >-
                                  La jueza del 'caso Javier Ejemplo' denuncia un
                                  «fraude de ley» en el aforamiento de Ficticio
                                  (Partido Ejemplo)
                                sentiment: moderately negative
                                thumbnail: https://news.example.org/articles/sample
                                source_url: https://news.example.org/articles/sample
                                author_name: null
                                other_sources: []
                                adverse_keywords:
                                  - fraud
                                  - irregularities
                                  - prevaricación
                                  - tráfico de influencias
                                sentiment_score: -2
                                publication_date: '2025-06-09T10:19:10'
                              - country: spain
                                summary: >-
                                  Javier Ejemplo Modelo is mentioned in
                                  connection with legal allegations of
                                  corruption, contributing to a negative
                                  perception.
                                headline: >-
                                  'Caso aforamiento': la letrada mayor de la
                                  Asamblea certifica a la juez que Ficticio es
                                  diputado desde antes de prometer su cargo en
                                  el Pleno
                                sentiment: moderately negative
                                thumbnail: https://news.example.org/articles/sample
                                source_url: https://news.example.org/articles/sample
                                author_name: null
                                other_sources: []
                                adverse_keywords:
                                  - prevaricación
                                  - tráfico de influencias
                                sentiment_score: -2
                                publication_date: '2025-06-09T08:08:30'
                              - country: spain
                                summary: >-
                                  Javier Ejemplo Modelo is implicated in the
                                  same investigation as Ficticio, raising
                                  concerns about political corruption and
                                  influence.
                                headline: 'Aforamientos: esa figura incómoda'
                                sentiment: moderately negative
                                thumbnail: https://news.example.org/articles/sample
                                source_url: https://news.example.org/articles/sample
                                author_name: null
                                other_sources: []
                                adverse_keywords:
                                  - prevaricación
                                  - tráfico de influencias
                                  - investigación
                                sentiment_score: -2
                                publication_date: '2025-06-08T06:01:00'
                              - country: spain
                                summary: >-
                                  Javier Ejemplo Modelo is implicated in the
                                  same investigation as Ficticio, which raises
                                  concerns about political misconduct.
                                headline: 'Aforamientos: esa figura incómoda'
                                sentiment: moderately negative
                                thumbnail: https://news.example.org/articles/sample
                                source_url: https://news.example.org/articles/sample
                                author_name: null
                                other_sources: []
                                adverse_keywords:
                                  - prevaricación
                                  - tráfico de influencias
                                  - investigación
                                  - delitos
                                sentiment_score: -2
                                publication_date: '2025-06-08T06:00:59'
                              - country: spain
                                summary: >-
                                  Javier Ejemplo is implicated in a case of
                                  favoritism and corruption, which casts a
                                  negative light on his character and actions.
                                headline: >-
                                  'Caso Javier Ejemplo': las asociaciones
                                  judiciales salen en defensa de la juez Luisa
                                  Inventada ante las "presiones externas" que
                                  sufre
                                sentiment: moderately negative
                                thumbnail: https://news.example.org/articles/sample
                                source_url: https://news.example.org/articles/sample
                                author_name: null
                                other_sources: []
                                adverse_keywords:
                                  - favoritism
                                  - corruption
                                  - persecution
                                sentiment_score: -2
                                publication_date: '2025-06-06T10:08:15'
                              - country: spain
                                summary: >-
                                  Javier Ejemplo is implicated in a case of
                                  alleged favoritism and corruption, which casts
                                  a negative light on his character and actions.
                                headline: >-
                                  'Caso Javier Ejemplo': las asociaciones
                                  judiciales salen en defensa de la juez Luisa
                                  Inventada ante las "presiones externas" que
                                  sufre
                                sentiment: moderately negative
                                thumbnail: https://news.example.org/articles/sample
                                source_url: https://news.example.org/articles/sample
                                author_name: null
                                other_sources: []
                                adverse_keywords:
                                  - favoritism
                                  - corruption
                                  - persecution
                                sentiment_score: -2
                                publication_date: '2025-06-06T08:08:15'
                            additional_information: {}
                        score: 80
                        screened_data:
                          full_name: Javier Ejemplo Modelo
                          nationality: ES
                          date_of_birth: '1974-01-01'
                          document_number: null
                        is_ongoing_monitoring_enabled: true
                        next_ongoing_monitoring_bill_date: '2026-07-24'
                        last_ongoing_screening_at: '2026-09-12T04:03:11Z'
                        last_ongoing_screening_datasets_updated_at: '2026-09-11T06:00:00Z'
                        warnings:
                          - feature: AML
                            risk: POSSIBLE_MATCH_FOUND
                            additional_data: null
                            log_type: warning
                            short_description: Possible match found in AML screening
                            long_description: >-
                              The Anti-Money Laundering (AML) screening process
                              identified potential matches with watchlists or
                              high-risk databases, requiring further review.
                            node_id: feature_aml_1
                    ip_analyses:
                      - node_id: feature_ip_1
                        status: Approved
                        device_brand: Apple
                        device_model: iPhone
                        browser_family: Mobile Safari
                        os_family: iOS
                        platform: mobile
                        device_fingerprint: didit-fp-a1b2c3d4e5f6g7h8
                        ip_country: Spain
                        ip_country_code: ES
                        ip_state: Barcelona
                        ip_city: Barcelona
                        latitude: 41.4022
                        longitude: 2.1407
                        ip_address: 83.50.226.71
                        isp: null
                        organization: null
                        is_vpn_or_tor: false
                        is_data_center: false
                        time_zone: Europe/Madrid
                        time_zone_offset: '+0100'
                        ip:
                          location:
                            latitude: 40.2206327
                            longitude: 1.5770097
                          distance_from_id_document: 23.4
                          distance_from_poa_document: 12.3
                        id_document:
                          location:
                            latitude: 41.2706327
                            longitude: 1.9770097
                          distance_from_ip: 23.4
                          distance_from_poa_document: 18.7
                        poa_document:
                          location:
                            latitude: 41.2706327
                            longitude: 1.9770097
                          distance_from_ip: 12.3
                          distance_from_id_document: 18.7
                        warnings: []
                        matches:
                          - session_id: 99999999-8888-7777-6666-555555555555
                            session_number: 41205
                            vendor_data: 22222222-2222-2222-2222-222222222222
                            verification_date: '2024-07-20T10:15:30Z'
                            match_type: ip_address
                            match_source: ip_address
                            matched_value: 83.50.226.71
                            status: Approved
                            is_blocklisted: false
                            api_service: null
                            source: session
                            device_info:
                              device_brand: Apple
                              device_model: iPhone
                              browser_family: Mobile Safari
                              os_family: iOS
                              platform: mobile
                              device_fingerprint: didit-fp-f9e8d7c6b5a40312
                            location_info:
                              ip_address: 83.50.226.71
                              ip_country: Spain
                              ip_country_code: ES
                              ip_state: Barcelona
                              ip_city: Barcelona
                              is_vpn_or_tor: false
                              is_data_center: false
                            confidence: 0
                            match_mode: co_occurrence
                          - session_id: aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
                            session_number: 42830
                            vendor_data: 33333333-3333-3333-3333-333333333333
                            verification_date: '2024-06-30T18:22:05Z'
                            match_type: device_fingerprint
                            match_source: recovered_high
                            matched_value: f47ac10b-58cc-4372-a567-0e02b2c3d479
                            status: Declined
                            is_blocklisted: false
                            api_service: null
                            source: session
                            device_info:
                              device_brand: Samsung
                              device_model: SM-G991B
                              browser_family: Chrome Mobile
                              os_family: Android
                              platform: mobile
                              device_fingerprint: null
                            location_info:
                              ip_address: 83.50.231.18
                              ip_country: Spain
                              ip_country_code: ES
                              ip_state: Madrid
                              ip_city: Madrid
                              is_vpn_or_tor: false
                              is_data_center: false
                            confidence: 1
                            match_mode: deterministic
                            recovery_similarity: 0.9874
                            tls_ja4_corroborated: true
                            recovery_gate_reason: hardware_root_match
                    database_validations:
                      - node_id: feature_db_validation_1
                        issuing_state: BRA
                        validation_type: one_by_one
                        screened_data:
                          last_name: De Lima
                          first_name: Fernando
                          tax_number: '01234567890'
                          date_of_birth: '1980-01-01'
                          document_type: ID
                          expiration_date: '2030-01-01'
                        validations:
                          - service_id: bra_cpf
                            service_name: Brazil - CPF status check
                            outcome_code: MATCH
                            validation:
                              full_name: full_match
                              date_of_birth: full_match
                              identification_number: full_match
                            source_data:
                              identification_number: '01234567890'
                              first_name: FERNANDO
                              last_name: DE LIMA
                              date_of_birth: '1980-01-01'
                              gender: M
                              nationality: BRA
                        match_type: full_match
                        status: Approved
                        warnings: []
                    reviews:
                      - user: compliance@example.com
                        new_status: Declined
                        comment: Possible match found in AML screening
                        created_at: '2024-07-18T13:29:00.366811Z'
                    created_at: '2024-07-24T08:54:25.443172Z'
                    expires_at: '2025-07-24T08:54:25.443172Z'
                    biometric_consent:
                      required: false
                      trigger: null
                      status: not_required
                      given_at: null
                      declined_at: null
                      text_version: null
                      text_hash: null
                      locale: null
                      policy_url: null
                      step: null
                      node_id: null
                      ip_address: null
                      ip_country_code: null
                      ip_state: null
                      ip_city: null
                      user_agent: null
                      detected_ip_address: 83.50.226.71
                      detected_country_code: ES
                      detected_state: ES-B
                      detected_city: Barcelona
                      declared_state: null
                      document_state: null
                      jurisdictions: []
                      retention_months: null
                      reason: null
                      decline_reason: null
                      face_data_deleted_at: null
                BusinessExample:
                  summary: Ejemplo de sesión de empresa (KYB)
                  description: >-
                    Una decisión con `session_kind = "business"`: las sesiones
                    KYB sustituyen los arrays de funciones de KYC por
                    `registry_checks`, `document_verifications` y
                    `key_people_checks`, y comparten `aml_screenings`,
                    `phone_verifications`, `email_verifications`,
                    `questionnaire_responses`, `ip_analyses`, `reviews` y el
                    envoltorio de la sesión.
                  value:
                    session_id: 66666666-7777-8888-9999-000000000000
                    session_kind: business
                    session_number: 31415
                    session_url: https://verify.didit.me/session/business123
                    status: In Review
                    environment: live
                    workflow_id: abababab-cdcd-efef-0101-232323232323
                    features:
                      - KYB_REGISTRY
                      - KYB_DOCUMENTS
                      - KYB_KEY_PEOPLE
                    vendor_data: merchant-001234
                    metadata: null
                    callback: https://example.com/verification/callback
                    registry_checks:
                      - status: Approved
                        node_id: feature_kyb_registry_1
                        data_resolved: true
                        company:
                          uuid: dddd4444-eeee-5555-ffff-666677778888
                          node_id: feature_kyb_registry_1
                          status: Approved
                          registry_status: active
                          data_resolved: true
                          company_name: ACME HOLDINGS LTD
                          registration_number: '12345678'
                          country_code: GB
                          region: null
                          company_type: Private Limited Company
                          incorporation_date: '2015-03-12'
                          registered_address: 1 Example Street, London, EC1A 1AA
                          tax_number: null
                          risk_level: null
                          verification_status: null
                          is_from_registry: true
                          fetch_status: resolved
                          alternative_names: null
                          nature_of_business: 62012 - Business and domestic software development
                          registered_capital: 100 GBP
                          registered_capital_amount: '100.00'
                          registered_capital_currency: GBP
                          website: null
                          email: null
                          phone: null
                          legal_entity_identifier: null
                          location_of_registration: England and Wales
                          financial_summary: null
                          officers:
                            - uuid: aaaa1111-bbbb-2222-cccc-333344445555
                              name: Jane Smith
                              designation: Director
                              role: director
                              nationality: British
                              is_active: true
                              kyc_status: Approved
                              kyc_session_url: https://verify.didit.me/session/abc123def456
                          beneficial_owners:
                            - uuid: bbbb2222-cccc-3333-dddd-444455556666
                              name: John Doe
                              first_name: John
                              last_name: Doe
                              entity_type: person
                              roles:
                                - ubo
                                - shareholder
                              ownership_min_shares: '50'
                              ownership_max_shares: '75'
                              is_active: true
                              kyc_status: Pending
                              kyc_session_url: https://verify.didit.me/session/def456ghi789
                              effective_ownership_percent: 75
                          addresses:
                            - type: registered
                              address: 1 Example Street, London, EC1A 1AA
                              country: GB
                          industries:
                            - code: '62012'
                              description: Business and domestic software development
                          accounts: null
                          registry_data: {}
                          user_provided_data:
                            company_name: ACME HOLDINGS
                            registration_number: '12345678'
                          confirmed_by_user_at: '2026-06-10T12:01:30.000000Z'
                          last_console_edit_at: null
                          is_editable: false
                        ownership_structure:
                          shareholders:
                            - name: John Doe
                              first_name: John
                              last_name: Doe
                              date_of_birth: null
                              country_of_birth: null
                              company_name: null
                              registration_number: null
                              entity_type: person
                              nationality: null
                              designation: null
                              roles:
                                - shareholder
                              ownership_min_shares: '75'
                              ownership_max_shares: '75'
                              voting_min_shares: null
                              voting_max_shares: null
                              appointment_date: null
                              is_active: true
                              shareholding:
                                share_class: ORDINARY
                                number_of_shares: 750
                                currency: GBP
                                nominal_value: 1
                                total_value: null
                                percentage: 75
                          beneficial_owners: []
                        warnings: []
                    aml_screenings: null
                    document_verifications:
                      - status: In Review
                        node_id: feature_kyb_documents_1
                        items:
                          - uuid: eeee5555-ffff-6666-0000-777788889999
                            document_type: LEGAL_PRESENCE
                            document_subtype: CERTIFICATE_OF_INCORPORATION
                            document_group: LEGAL_PRESENCE
                            file_url: >-
                              https://<media-host>/kyb/certificate-of-incorporation.pdf
                            original_filename: certificate_of_incorporation.pdf
                            file_size: 482133
                            status: Approved
                            created_at: '2026-06-10T12:03:11.000000Z'
                            cross_check_result:
                              critical:
                                company_name:
                                  document: ACME HOLDINGS LTD
                                  registry: ACME HOLDINGS LTD
                                  score: 1
                                  match: true
                                registration_number:
                                  document: '12345678'
                                  registry: '12345678'
                                  match: true
                              non_critical: {}
                              people: {}
                            document_metadata:
                              file_size: 482133
                              content_type: application/pdf
                              creation_date: '2015-03-12T09:00:00'
                              modified_date: '2015-03-12T09:00:00'
                              creator: null
                              producer: null
                              software: null
                              encryption: null
                              is_signed: true
                              is_tampered: false
                              signature_info: null
                              exif_original_date: null
                              exif_digitized_date: null
                              processed_by_known_editor: false
                              has_different_creation_mod_date: false
                              overlay_manipulation: null
                            description: null
                            is_requested: false
                            ocr_data:
                              company_name: ACME HOLDINGS LTD
                              registration_number: '12345678'
                              incorporation_date: '2015-03-12'
                            is_console_upload: false
                            is_confirmed: true
                          - uuid: ffff6666-0000-7777-1111-888899990000
                            document_type: OWNERSHIP_STRUCTURE
                            document_subtype: null
                            document_group: OWNERSHIP_STRUCTURE
                            file_url: null
                            original_filename: null
                            file_size: null
                            status: Not Finished
                            created_at: '2026-06-10T15:40:02.000000Z'
                            cross_check_result: null
                            document_metadata: null
                            description: Please upload an up-to-date shareholder registry
                            is_requested: true
                            ocr_data: null
                            is_console_upload: false
                            is_confirmed: true
                        groups:
                          LEGAL_PRESENCE:
                            total: 1
                            approved: 1
                            pending: 0
                            declined: 0
                            in_review: 0
                            other: 0
                            missing: 0
                          OWNERSHIP_STRUCTURE:
                            total: 1
                            approved: 0
                            pending: 0
                            declined: 0
                            in_review: 0
                            other: 0
                            missing: 1
                        required_groups:
                          - LEGAL_PRESENCE
                          - OWNERSHIP_STRUCTURE
                        warnings: []
                    key_people_checks:
                      - status: In Review
                        node_id: feature_kyb_key_people_1
                        registry:
                          officers:
                            - uuid: aaaa1111-bbbb-2222-cccc-333344445555
                              name: Jane Smith
                              designation: Director
                              role: director
                              nationality: British
                              appointment_date: '2015-03-12'
                              termination_date: null
                              is_active: true
                              address: 1 Example Street, London, EC1A 1AA
                              aml_status: Approved
                              kyc_status: Approved
                              kyc_session_url: https://verify.didit.me/session/abc123def456
                              kyc_session_id: 77777777-8888-9999-aaaa-bbbbbbbbbbbb
                              verification_workflow_type: kyc
                              verification_workflow_id: 12121212-3434-5656-7878-909090909090
                              verification_workflow_label: Key People KYC
                              verification_workflow_features:
                                - feature: ID_VERIFICATION
                                  status: Approved
                                - feature: LIVENESS
                                  status: Approved
                                - feature: AML
                                  status: Approved
                              didit_internal_id: 99999999-0000-1111-2222-333333333333
                              kyc_document_type: P
                              kyc_nationality: GBR
                              kyc_liveness_passed: true
                              kyc_verified_at: '2026-06-10T14:22:31.123456Z'
                              kyc_aml_categories:
                                sanctions: clear
                                pep: clear
                                adverse_media: clear
                                warnings: clear
                              kyc_notification_sent_at: '2026-06-09T09:00:00.000000Z'
                          beneficial_owners:
                            - uuid: bbbb2222-cccc-3333-dddd-444455556666
                              name: John Doe
                              first_name: John
                              last_name: Doe
                              date_of_birth: '1980-05-04'
                              country_of_birth: null
                              email: null
                              company_name: null
                              registration_number: null
                              entity_type: person
                              nationality: British
                              designation: null
                              roles:
                                - ubo
                                - shareholder
                              ownership_min_shares: '50'
                              ownership_max_shares: '75'
                              is_active: true
                              aml_status: null
                              kyc_status: In Progress
                              kyc_session_url: https://verify.didit.me/session/def456ghi789
                              kyc_session_id: 88888888-9999-aaaa-bbbb-cccccccccccc
                              verification_workflow_type: kyc
                              verification_workflow_id: 12121212-3434-5656-7878-909090909090
                              verification_workflow_label: Key People KYC
                              verification_workflow_features:
                                - feature: ID_VERIFICATION
                                  status: Not Finished
                                - feature: LIVENESS
                                  status: Not Finished
                                - feature: AML
                                  status: Not Finished
                              didit_internal_id: null
                              kyc_document_type: null
                              kyc_nationality: null
                              kyc_liveness_passed: null
                              kyc_verified_at: null
                              kyc_aml_categories: null
                              kyc_notification_sent_at: null
                              child_beneficial_owners: []
                              effective_ownership_percent: 75
                        submitted:
                          parties:
                            - uuid: cccc3333-dddd-4444-eeee-555566667777
                              entity_type: person
                              source: USER
                              name: John Doe
                              first_name: John
                              last_name: Doe
                              company_name: null
                              registration_number: null
                              email: john.doe@example.com
                              nationality: GBR
                              phone_number: '+447700900123'
                              date_of_birth: '1980-05-04'
                              position: Chief Executive Officer
                              custom_fields: {}
                              is_active: true
                              is_skipped: false
                              requires_verification: true
                              roles:
                                - role: ubo
                                  ownership_percent: 75
                                  voting_percent: 75
                                - role: director
                                  ownership_percent: null
                                  voting_percent: null
                              kyc_session_id: 88888888-9999-aaaa-bbbb-cccccccccccc
                              kyc_session_status: In Progress
                              kyc_session_url: https://verify.didit.me/session/def456ghi789
                              kyb_sub_session_id: null
                              kyb_sub_session_status: null
                              kyb_sub_session_url: null
                              verification_workflow_type: kyc
                              verification_workflow_id: 12121212-3434-5656-7878-909090909090
                              verification_workflow_label: Key People KYC
                              verification_workflow_features:
                                - feature: ID_VERIFICATION
                                  status: Not Finished
                                - feature: LIVENESS
                                  status: Not Finished
                                - feature: AML
                                  status: Not Finished
                              didit_internal_id: null
                        ubo_kyc_summary:
                          total: 1
                          approved: 0
                          flagged: 0
                          pending: 1
                        warnings: []
                    phone_verifications: null
                    email_verifications: null
                    questionnaire_responses: null
                    ip_analyses: null
                    reviews: []
                    contact_details: null
                    expected_details:
                      company_name: Tesco PLC
                      registry_country: GB
                      registration_number: '00445790'
                    created_at: '2026-06-10T11:58:04.000000Z'
                    expires_at: '2026-06-24T11:58:04.000000Z'
              schema:
                $ref: '#/components/schemas/SessionDecision'
        '403':
          description: >-
            Falló la autenticación o la autorización. Si falta la clave, se
            devuelve `403`; una clave incorrecta, revocada o expirada devuelve
            `401`. Dos cadenas de `detail` distinguen los modos de fallo:


            - `"Authentication credentials were not provided or are invalid."` —
            no hay encabezado `x-api-key` (ni token `Authorization: Bearer`), o
            la credencial proporcionada no superó la introspección (revocada,
            expirada o con formato incorrecto).

            - `"You do not have permission to perform this action."` — la
            credencial es válida, pero no tiene permiso para leer esta sesión:
            un token Bearer de usuario de la consola no tiene el permiso
            `read:sessions` o no puede acceder a la aplicación propietaria, o
            una clave de API pertenece a una organización distinta de la de la
            sesión.


            Ten en cuenta que, para un `sessionId` totalmente desconocido, el
            endpoint resuelve la aplicación propietaria antes de validar las
            credenciales, por lo que una sesión inexistente devuelve `404`
            incluso cuando la credencial falta o no es válida.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: >-
                      Authentication credentials were not provided or are
                      invalid.
              examples:
                Missing or invalid credentials:
                  summary: >-
                    Falta el encabezado x-api-key, o la clave no superó la
                    introspección
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Insufficient permissions:
                  summary: >-
                    Credencial válida sin read:sessions o sin acceso a la
                    aplicación propietaria
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            Sesión no encontrada. Se devuelve cuando ninguna sesión activa
            coincide con el `sessionId` indicado, ni como sesión de Verificación
            de usuarios (KYC) ni como sesión de Verificación de empresas (KYB).
            Una sesión que se ha eliminado también termina aquí. El cuerpo es el
            envoltorio estándar `{"detail": ...}`.


            **Dos cadenas `detail` distintas.** Si el `sessionId` no se reconoce
            ni como sesión KYC ni como sesión KYB, la búsqueda del propietario
            previa a la autenticación falla y recibes `{"detail": "Not
            found."}`. Esto ocurre antes de validar las credenciales, por lo que
            se devuelve incluso en llamadas no autenticadas. Si la sesión existe
            pero no se puede recuperar con la aplicación autenticada (por
            ejemplo, un registro obsoleto o recién eliminado), la vista devuelve
            `{"detail": "Session not found."}`. Ambas indican el mismo
            resultado, que la sesión no es accesible, así que compara el código
            de estado `404` en lugar de la cadena.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: Not found.
              examples:
                Unknown session id:
                  summary: esta aplicación no conoce el sessionId
                  value:
                    detail: Not found.
                Session not retrievable:
                  summary: >-
                    La sesión existe, pero no se puede recuperar para esta
                    aplicación
                  value:
                    detail: Session not found.
        '429':
          description: >-
            Límite de solicitudes superado. Las solicitudes GET están limitadas
            a **600 por minuto por credencial** (clave de API, token Bearer o IP
            de origen cuando no hay autenticación). Consulta `Retry-After` /
            `X-RateLimit-Reset` y espera antes de reintentar. Si alcanzas este
            límite al consultar periódicamente las decisiones, cambia al webhook
            `status.updated` y obtén la decisión una vez por cada cambio de
            estado.
          headers:
            Retry-After:
              description: Segundos que hay que esperar antes de reintentar la solicitud.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: >-
                Número máximo de solicitudes permitidas en la ventana actual
                (600 para solicitudes GET).
              schema:
                type: integer
                example: 600
            X-RateLimit-Remaining:
              description: Solicitudes restantes en la ventana actual.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: >-
                Marca de tiempo Unix (segundos) en que se restablece la ventana
                actual.
              schema:
                type: integer
                example: 1750000000
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: >-
                      Explicación legible de la superación del límite de
                      solicitudes.
                    example: >-
                      GET request rate limit exceeded. You can make up to 600
                      requests per minute.
              examples:
                Throttled:
                  summary: >-
                    Más de 600 solicitudes GET en un minuto con la misma
                    credencial
                  value:
                    detail: >-
                      GET request rate limit exceeded. You can make up to 600
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: >-
            curl -X GET
            'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/decision/'
            \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Accept: application/json'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.retrieve_decision(
                "11111111-2222-3333-4444-555555555555",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            const result = await
            didit.sessions.retrieveDecision("11111111-2222-3333-4444-555555555555");

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.RetrieveDecision(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsRetrieveDecisionParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().retrieveDecision("11111111-2222-3333-4444-555555555555");

            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Reads DIDIT_API_KEY.

            $didit = new DiditClient();


            $result =
            $didit->sessions->retrieveDecision('11111111-2222-3333-4444-555555555555');

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: >-
            require "didit"


            # Reads DIDIT_API_KEY.

            didit = Didit::Client.new


            result =
            didit.sessions.retrieve_decision("11111111-2222-3333-4444-555555555555")

            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await
            client.Sessions.RetrieveDecisionAsync("11111111-2222-3333-4444-555555555555");

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    SessionDecision:
      type: object
      properties:
        session_id:
          type: string
          format: uuid
          description: El identificador único de la sesión.
        session_kind:
          type: string
          enum:
            - user
            - business
          description: >-
            Discriminador que indica si se trata de una sesión de Verificación
            de usuarios (KYC) o de Verificación de empresas (KYB). Cuando es
            `user`, se aplican los arrays de funciones KYC (`id_verifications`,
            `nfc_verifications`, `liveness_checks`, `face_matches`,
            `poa_verifications`, `document_ai_documents`,
            `database_validations`, ...) y los arrays de empresa no aparecen.
            Cuando es `business`, el payload incluye en su lugar
            `registry_checks`, `document_verifications`, `key_people_checks`
            además de los arrays compartidos (`aml_screenings`,
            `phone_verifications`, `email_verifications`, `ip_analyses`,
            `questionnaire_responses`). **Se omite cuando se pasa
            `include=events`**: la estructura de eventos solo existe para
            sesiones de usuario, por lo que el discriminador se elimina de esa
            variante.
        shared_from_session:
          type: string
          format: uuid
          nullable: true
          description: >-
            En una sesión clonada con `POST /v3/session/import-shared/`: el
            `session_id` de la sesión original en la aplicación de origen.
            `null` en cualquier otra sesión. Se omite cuando se pasa
            `include=events`.
        shared_from_session_number:
          type: integer
          nullable: true
          description: >-
            `session_number` de la sesión de origen cuando esta sesión se
            importó desde otra aplicación de tu organización. `null` en caso
            contrario.
        session_number:
          type: integer
          description: El número de la sesión.
          nullable: true
        session_url:
          type: string
          format: uri
          description: La URL de la sesión.
          nullable: true
        status:
          type: string
          enum:
            - Not Started
            - In Progress
            - Awaiting User
            - In Review
            - Approved
            - Declined
            - Resubmitted
            - Expired
            - Kyc Expired
            - Abandoned
          description: >-
            Estado global del ciclo de vida de la sesión: el resultado
            consolidado del flujo. Los valores finales son `Approved`,
            `Declined`, `In Review`, `Expired`, `Kyc Expired` y `Abandoned`;
            `Not Started`, `In Progress`, `Awaiting User` y `Resubmitted`
            indican que la sesión sigue avanzando por el flujo.
        status_override:
          type: object
          nullable: true
          description: >-
            Presente cuando un revisor estableció `status` manualmente. `null`
            cuando el estado es el automático. Úsalo para distinguir una
            aprobación manual de una automática.
          properties:
            overridden_at:
              type: string
              format: date-time
              nullable: true
            automatic_status:
              type: string
              nullable: true
              description: >-
                El estado que determinan las comprobaciones propias de la
                plataforma.
        decision_trace:
          type: object
          description: >-
            Cómo se llegó al estado: quién lo estableció y qué advertencias lo
            provocaron.
          properties:
            status:
              type: string
              description: El estado de la sesión.
            decided_by:
              type: string
              nullable: true
              enum:
                - manual
                - automatic
                - investigator
                - null
              description: >-
                Quién estableció el estado. `null` mientras la sesión no tiene
                decisión.
            decided_at:
              type: string
              format: date-time
              nullable: true
            automatic_status:
              type: string
              nullable: true
              description: >-
                Lo que concluyen las comprobaciones propias de la plataforma,
                que difiere de `status` tras una decisión manual.
            terminal_node_id:
              type: string
              nullable: true
              description: El nodo de estado del flujo que finalizó la sesión, si lo hubo.
            actor:
              type: object
              nullable: true
              description: El revisor responsable de una decisión manual.
              properties:
                user:
                  type: string
                  nullable: true
                actor_type:
                  type: string
                  nullable: true
            warning_counts:
              type: object
              description: >-
                Advertencias por `log_type` (`error`, `warning`, `information`)
                y `total`.
              additionalProperties:
                type: integer
            status_warnings:
              type: array
              description: >-
                Las advertencias que establecen un estado `Declined` o `In
                Review`.
              items:
                type: object
                properties:
                  risk:
                    type: string
                  feature:
                    type: string
                    nullable: true
                  node_id:
                    type: string
                    nullable: true
                  log_type:
                    type: string
                    nullable: true
                  check_status:
                    type: string
                    nullable: true
                  source:
                    type: string
                    description: >-
                      La lista del payload de la que procede la advertencia, por
                      ejemplo `id_verifications`.
                  short_description:
                    type: string
                    nullable: true
        linked_records:
          type: object
          nullable: true
          description: >-
            Un resumen de otros registros vinculados a la sesión. `null` cuando
            no hay nada que mostrar, y en los flujos que declaran un estándar de
            verificación de edad.
          properties:
            same_face:
              type: object
              nullable: true
              description: >-
                Otras personas cuyo rostro coincidió en alguna de las búsquedas
                faciales de esta sesión.
              properties:
                count:
                  type: integer
                best_match:
                  type: object
                  nullable: true
                  properties:
                    session_id:
                      type: string
                      format: uuid
                      nullable: true
                    session_number:
                      type: integer
                      nullable: true
                    vendor_user_id:
                      type: string
                      format: uuid
                      nullable: true
                    similarity_percentage:
                      type: number
                      nullable: true
            earlier_verifications:
              type: object
              nullable: true
              properties:
                count:
                  type: integer
                vendor_user_id:
                  type: string
                  format: uuid
                  nullable: true
            networks:
              type: object
              nullable: true
              properties:
                count:
                  type: integer
                open:
                  type: integer
                dismissed:
                  type: integer
                items:
                  type: array
                  items:
                    type: object
                    properties:
                      network_id:
                        type: string
                        format: uuid
                      display_number:
                        type: integer
                        nullable: true
                      name:
                        type: string
                      status:
                        type: string
                      risk_score:
                        type: number
                        nullable: true
        workflow_id:
          type: string
          format: uuid
          description: >-
            Identificador estable del grupo de flujos que generó esta sesión.
            Los flujos tienen versiones: este valor identifica el flujo en sí,
            no una versión concreta.
          nullable: true
        features:
          type: array
          items:
            type: string
            description: La función de la sesión.
          description: >-
            Lista de funciones de verificación configuradas para esta sesión,
            como nombres para mostrar: `ID_VERIFICATION`, `NFC`, `LIVENESS`,
            `FACE_MATCH`, `POA`, `PHONE`, `EMAIL_VERIFICATION`, `AML`,
            `IP_ANALYSIS`, `DATABASE_VALIDATION`, `QUESTIONNAIRE`,
            `AGE_ESTIMATION`, `FACE_SEARCH`, `GEOLOCATION` (verificación de
            ubicación) (las sesiones de Verificación de empresas usan el
            conjunto de funciones KYB: `KYB_REGISTRY`, `KYB_DOCUMENTS`,
            `KYB_KEY_PEOPLE`, `AML`, `PHONE`, `EMAIL_VERIFICATION`,
            `IP_ANALYSIS`, `QUESTIONNAIRE`). Con `include=events`, cada entrada
            pasa a ser un objeto `{feature, node_id}` en lugar de una cadena
            simple, y la función de correo electrónico cambia de nombre: aparece
            como `EMAIL` en el modo de eventos en lugar del `EMAIL_VERIFICATION`
            que se usa aquí.
        vendor_data:
          type: string
          description: Los datos del proveedor de la sesión.
          nullable: true
        metadata:
          type: object
          description: Los metadatos de la sesión.
          nullable: true
        expected_details:
          type: object
          description: >-
            Datos esperados que se proporcionan al crear la sesión: se usan para
            la validación cruzada con los datos extraídos (KYC) o para rellenar
            previamente la búsqueda en el registro de empresas (KYB). Devuelve
            exactamente las claves que se proporcionaron; `null` cuando no se
            proporcionó ninguna. Las sesiones KYC incluyen los campos de la
            persona; las sesiones de empresa (KYB) incluyen `company_name`,
            `registry_country` y `registration_number`.
          properties:
            first_name:
              type: string
              description: Nombre del usuario. Por ejemplo, `John`.
            last_name:
              type: string
              description: Apellido del usuario. Por ejemplo, `Doe`.
            date_of_birth:
              type: string
              format: date
              description: >-
                Fecha de nacimiento del usuario con el formato YYYY-MM-DD. Por
                ejemplo, `1990-05-15`.
            gender:
              type: string
              nullable: true
              enum:
                - M
                - F
              default: null
              description: Género del usuario. Debe ser 'M', 'F' o null.
            nationality:
              type: string
              description: >-
                Código de país ISO 3166-1 alpha-3 que representa el país de
                origen del solicitante. Por ejemplo, `USA`.
            country:
              type: string
              description: >-
                Código de país ISO 3166-1 alpha-3 que representa el país del
                documento de prueba de domicilio, o el país del documento de
                identidad del solicitante, que puede diferir de la nacionalidad.
                Por ejemplo, `GBR`.
            address:
              type: string
              description: >-
                La dirección en un formato legible, con toda la información
                posible. Por ejemplo, `123 Main St, San Francisco, CA 94105,
                USA`.
            identification_number:
              type: string
              description: >-
                El número de documento, número personal o número fiscal del
                usuario. Por ejemplo, `123456789`.
            ip_address:
              type: string
              format: ipv4
              description: >-
                Dirección IP esperada para la sesión. Si la dirección IP real
                difiere de este valor, se registrará una advertencia. Por
                ejemplo, `192.168.1.100`.
            expected_document_types:
              type: array
              description: >-
                Tipos de documento a los que se restringió el paso de
                verificación de identidad al crear la sesión. Vacío o sin
                definir significa que no hay restricción. Códigos: `P`
                (pasaporte), `ID` (documento nacional de identidad), `DL`
                (licencia de conducir), `RP` (permiso de residencia), `HIC`
                (tarjeta de seguro médico), `TC` (tarjeta fiscal), `SSC`
                (tarjeta de seguridad social).
              items:
                type: string
                enum:
                  - P
                  - ID
                  - DL
                  - RP
                  - HIC
                  - TC
                  - SSC
            id_country:
              type: string
              nullable: true
              description: >-
                País emisor esperado del documento de identidad (ISO 3166-1
                alfa-3), cuando se restringió al crear la sesión.
              example: ESP
            poa_country:
              type: string
              nullable: true
              description: >-
                País esperado del documento de prueba de domicilio (ISO 3166-1
                alfa-3), cuando se restringió al crear la sesión.
              example: ESP
            company_name:
              type: string
              description: >-
                Razón social esperada de la empresa. Solo para sesiones de
                empresa (KYB).
            registry_country:
              type: string
              description: >-
                País del registro esperado en formato `XX` o `XX-YY` (ISO 3166-1
                alfa-2, opcionalmente con una subdivisión ISO 3166-2 para
                registros de nivel estatal, p. ej., `US-CA`). Solo para sesiones
                de empresa (KYB).
            registration_number:
              type: string
              description: >-
                Número de registro esperado de la empresa. Solo para sesiones de
                empresa (KYB).
          nullable: true
        contact_details:
          type: object
          description: >-
            Datos de contacto proporcionados al crear la sesión (se usan para
            los correos electrónicos de notificación, la verificación de
            teléfono o correo electrónico prellenada y el idioma de
            comunicación). `null` cuando no se proporcionó ni un correo
            electrónico ni un número de teléfono.
          properties:
            email:
              type: string
              description: >-
                Dirección de correo electrónico del usuario (p. ej.,
                "john.doe@example.com") que se usará durante el paso de
                Verificación de correo electrónico. Si no se proporciona, el
                usuario debe indicarla durante el flujo de verificación.
            email_lang:
              type: string
              description: >-
                Código de idioma (ISO 639-1) para las notificaciones por correo
                electrónico. Controla el idioma de todas las comunicaciones por
                correo electrónico (p. ej., "en", "es", "fr").
            send_notification_emails:
              type: boolean
              default: false
              description: >-
                Si es true y se proporciona un correo electrónico, Didit envía
                de forma asíncrona el correo inicial "Verifica tu identidad" al
                crear la sesión de Verificación de usuarios (KYC) o Verificación
                de empresas (KYB). Didit también envía a la dirección de correo
                electrónico proporcionada notificaciones del estado de la
                verificación de las sesiones que requieren revisión manual.
            phone:
              type: string
              nullable: true
              description: >-
                Número de teléfono del usuario en formato E.164, si está
                disponible (p. ej., +14155552671). `null` cuando solo se indicó
                un correo electrónico al crear la sesión. Nota: este campo
                devuelve el número de teléfono original indicado al crear la
                sesión. Si el número no era válido, es posible que no esté en
                formato E.164.
          nullable: true
        callback:
          type: string
          format: uri
          description: La URL de callback de la sesión.
          nullable: true
        id_verifications:
          type: array
          nullable: true
          description: >-
            **Array de informes de verificación de identidad (OCR)** generados
            por los pasos de documento de identidad del grafo del flujo. Siempre
            es un array JSON: lee `id_verifications[0]` e itera si tu flujo
            puede ejecutar más de una verificación de identidad (por ejemplo,
            una verificación principal más una verificación reforzada). Es
            `null` hasta que al menos un paso de identidad haya generado datos.
            Cada elemento es el informe completo, que incluye `node_id`, el
            `status` a nivel de función, los campos extraídos del documento, las
            URL de las imágenes, las puntuaciones de calidad, la MRZ, el
            análisis de la dirección, las coincidencias entre sesiones y
            `warnings[]`.
          items:
            type: object
            description: >-
              Un informe de verificación de identidad: el informe completo de un
              solo paso de Verificación de identidad. `verification_method`
              indica cuál de los tres métodos lo generó (captura de documento,
              consulta sin documento o inicio de sesión con wallet), y el bloque
              de evidencias específico del método se rellena en consecuencia.
            properties:
              node_id:
                type: string
                description: >-
                  ID del nodo del grafo del flujo correspondiente al paso de OCR
                  que generó este informe.
              verification_method:
                type: string
                enum:
                  - document
                  - id_lookup
                  - wallet
                description: >-
                  Qué método de Verificación de identidad generó este informe.
                  `document`: el usuario fotografió un documento de identidad
                  físico (el valor predeterminado, y el valor de todas las
                  sesiones creadas antes de que existieran los demás métodos).
                  `id_lookup`: el usuario escribió su número de identificación
                  nacional y se comprobó en un registro gubernamental u otra
                  fuente oficial de ese país (`id_lookup.source` indica cuál).
                  `wallet`: el usuario inició sesión con una identidad digital
                  gubernamental o bancaria.
              assurance:
                type: string
                enum:
                  - documentary
                  - data_match
                  - cryptographic
                description: >-
                  Nivel de garantía derivado de `verification_method`:
                  `documentary` para un documento que se capturó y verificó,
                  `data_match` para datos que coincidieron con un registro de la
                  fuente consultada, `cryptographic` para atributos que un
                  proveedor de identidad autenticó y firmó.
              wallet_provider:
                type: string
                nullable: true
                description: >-
                  Id de catálogo de la wallet cuando `verification_method` es
                  `wallet` (`mitid`, `bankid_se`, `itsme`, ...). `null` en caso
                  contrario.
              fallback_from:
                type: object
                nullable: true
                description: >-
                  Por qué un método que no es de documento terminó el paso de
                  ID. Se establece en el informe rechazado cuando falló una
                  consulta o un inicio de sesión con wallet y la opción de
                  respaldo del país era `decline`. `null` en caso contrario.
                properties:
                  method:
                    type: string
                    enum:
                      - id_lookup
                      - wallet
                    description: El método que falló.
                  reason:
                    type: string
                    description: >-
                      El resultado que lo finalizó, p. ej., `no_match`,
                      `provider_error`, `cancelled`, `timeout`.
                  action:
                    type: string
                    description: >-
                      La acción configurada que se ejecutó, por ejemplo,
                      `decline`.
              id_lookup:
                type: object
                nullable: true
                description: >-
                  Evidencia del registro. Solo está presente cuando
                  `verification_method` es `id_lookup`; en caso contrario,
                  `null`.
                properties:
                  source:
                    type: string
                    description: >-
                      Nombre visible para el cliente de la fuente consultada, p.
                      ej., `Department of Home Affairs` (un registro
                      gubernamental) o `UK credit bureau and financial services
                      records` (no es un registro gubernamental). Es la única
                      indicación de procedencia de la consulta; no des por hecho
                      que la fuente es gubernamental.
                  checked_at:
                    type: string
                    format: date-time
                    nullable: true
                    description: Fecha y hora en que respondió el registro.
                  attempts:
                    type: integer
                    description: >-
                      Número de intento, empezando en 1, del que procede este
                      informe.
                  max_attempts:
                    type: integer
                    description: >-
                      Número de intentos configurado para el país (de 1 a 5,
                      valor predeterminado 1).
                  outcome:
                    type: string
                    enum:
                      - match
                      - partial_match
                      - no_match
                      - provider_error
                      - format_rejected
                    nullable: true
                    description: >-
                      Lo que respondió el registro. Solo `match`,
                      `partial_match` y `no_match` cuentan para el límite de
                      intentos y se facturan.
                  comparison:
                    type: array
                    description: >-
                      Una fila por cada campo comparable sobre el que respondió
                      la fuente, más una fila por cada error de la fuente. Las
                      filas de comparación usan los nombres de campo
                      normalizados que se indican a continuación en lugar de las
                      claves de campo de la solicitud del país, porque varios
                      campos de la solicitud (nombre y apellido, o cualquiera de
                      los alias del identificador) se agrupan en una sola
                      comparación. Una fuente que falló añade una fila con
                      `field: "provider"` y `result: "error"`, así que lee
                      `result` antes de tratar una fila como un veredicto sobre
                      un campo.
                    items:
                      type: object
                      required:
                        - field
                        - label
                        - provided
                        - record
                        - result
                      properties:
                        field:
                          type: string
                          enum:
                            - identification_number
                            - full_name
                            - date_of_birth
                            - address
                            - provider
                          description: >-
                            Campo de comparación normalizado. `provider` no es
                            un campo del usuario: marca una fila de error de la
                            fuente.
                        label:
                          type: string
                          description: >-
                            Etiqueta visible de la fila, por ejemplo `ID
                            number`, `Full name`, `Provider`.
                        provided:
                          type: string
                          nullable: true
                          description: >-
                            Lo que escribió el usuario. `null` en una fila de
                            error `provider`.
                        record:
                          type: string
                          nullable: true
                          description: >-
                            Lo que contenía la fuente. En una fila de error
                            `provider`, contiene en su lugar el mensaje de
                            error.
                        result:
                          type: string
                          enum:
                            - match
                            - partial
                            - no_match
                            - error
                          description: >-
                            Resultado de la comparación por campo. `error` solo
                            aparece en una fila `provider` y significa que esa
                            fuente no respondió; tómalo como información sobre
                            la consulta, nunca como una discrepancia del campo.
                  registry_portrait:
                    type: string
                    format: uri
                    nullable: true
                    description: >-
                      URL prefirmada de corta duración al retrato que devolvió
                      la fuente. Solo en los cuatro registros gubernamentales
                      que devuelven uno (Sudáfrica, Nigeria, Argentina y
                      Panamá).
                  face_match_score:
                    type: number
                    nullable: true
                    description: >-
                      Selfie frente al retrato del registro, de 0 a 100. Solo
                      cuando el registro devuelve un retrato.
              wallet_verification:
                type: object
                nullable: true
                description: >-
                  Evidencia de la credencial. Solo está presente cuando
                  `verification_method` es `wallet`; `null` en caso contrario.
                properties:
                  provider:
                    type: string
                    description: Id de catálogo de la wallet, p. ej., `mitid`.
                  provider_name:
                    type: string
                    nullable: true
                    description: >-
                      Nombre de la wallet tal como la conoce el usuario final,
                      p. ej., `MitID`.
                  issuing_authority:
                    type: string
                    nullable: true
                    description: >-
                      La autoridad responsable de la wallet, p. ej., `Danish
                      Agency for Digital Government`.
                  issuing_country:
                    type: string
                    description: País ISO 3166-1 alfa-3 en el que se ofreció la wallet.
                  credential_type:
                    type: string
                    nullable: true
                    description: >-
                      Credencial que presentó la wallet, p. ej.
                      `person_identification`.
                  level_of_assurance:
                    type: string
                    enum:
                      - low
                      - substantial
                      - high
                    nullable: true
                    description: >-
                      El nivel de garantía que afirmó la wallet. Un inicio de
                      sesión que afirma un nivel inferior al solicitado falla en
                      lugar de rebajarse.
                  verified_at:
                    type: string
                    format: date-time
                    nullable: true
                    description: El instante de autenticación de la wallet.
                  signature_valid:
                    type: boolean
                    nullable: true
                    description: Si la aserción firmada que devolvió la wallet se validó.
                  attributes:
                    type: object
                    additionalProperties: true
                    description: >-
                      Los atributos que compartió la wallet, con las claves que
                      indica la entrada del catálogo de la wallet.
                  portrait:
                    type: string
                    format: uri
                    nullable: true
                    description: >-
                      URL prefirmada de corta duración al retrato que compartió
                      la wallet, cuando comparte uno.
                  face_match_score:
                    type: number
                    nullable: true
                    description: >-
                      Selfie frente al retrato de la wallet, de 0 a 100, cuando
                      la wallet comparte uno.
              status:
                type: string
                enum:
                  - Not Finished
                  - Approved
                  - Declined
                  - In Review
                  - Expired
                description: >-
                  Estado a nivel de función de este paso de verificación de
                  identidad. Es independiente del `status` de nivel superior de
                  la sesión: una sesión puede alcanzar su decisión global
                  mientras una función concreta sigue en `In Review`.
              document_type:
                type: string
                description: Tipo de documento de identidad
              document_subtype:
                type: string
                nullable: true
                description: >-
                  Código de subtipo de documento aceptado según la configuración
                  de documentos del flujo, incluida la región del documento
                  cuando corresponda. Ejemplos: `ID_CARD_GENERIC`,
                  `QUEENSLAND_DRIVER_LICENSE_GENERIC`.
              document_number:
                type: string
                description: Número de identificación del documento
              personal_number:
                type: string
                description: Número de identificación personal
              portrait_image:
                type: string
                format: uri
                description: URL de la imagen del retrato
              front_image:
                type: string
                format: uri
                description: URL de la imagen del anverso del documento
              front_video:
                type: string
                format: uri
                description: URL del video del anverso del documento
              back_image:
                type: string
                format: uri
                description: URL de la imagen del reverso del documento
              back_video:
                type: string
                format: uri
                description: URL del video del reverso del documento
              full_front_image:
                type: string
                format: uri
                description: URL de la imagen completa del anverso del documento
              full_back_image:
                type: string
                format: uri
                description: URL de la imagen completa del reverso del documento
              front_image_camera_front:
                type: string
                format: uri
                description: >-
                  URL de la imagen del anverso del documento capturada con la
                  cámara frontal
              back_image_camera_front:
                type: string
                format: uri
                description: >-
                  URL de la imagen del reverso del documento capturada con la
                  cámara frontal
              date_of_birth:
                type: string
                format: date
                description: Fecha de nacimiento del documento
              age:
                type: integer
                description: Edad calculada a partir de la fecha de nacimiento
              expiration_date:
                type: string
                format: date
                description: Fecha de caducidad del documento
              date_of_issue:
                type: string
                format: date
                description: Fecha de expedición del documento
              issuing_state:
                type: string
                description: Código ISO del estado emisor
              issuing_state_name:
                type: string
                description: Nombre completo del estado emisor
              first_name:
                type: string
                description: Nombre según el documento
              last_name:
                type: string
                description: Apellido según el documento
              full_name:
                type: string
                description: Nombre completo del documento
              gender:
                type: string
                description: Género del documento
              address:
                type: string
                description: Dirección sin procesar del documento
              formatted_address:
                type: string
                description: Dirección completa formateada
              place_of_birth:
                type: string
                description: Lugar de nacimiento según el documento
              marital_status:
                type: string
                description: Estado civil según el documento
              nationality:
                type: string
                description: Código ISO de nacionalidad
              extra_fields:
                type: object
                description: >-
                  Campos adicionales del documento. Incluye atributos
                  específicos del documento (p. ej., `dl_categories`,
                  `blood_group`, `sponsor`, `employer`, `dl_class_code_b_from`,
                  `dl_class_code_b_to`). Las fechas de validez de las clases de
                  la licencia de conducir se devuelven como
                  `dl_class_code_<class>_from` y `dl_class_code_<class>_to`, y
                  los códigos de restricción/información por clase (p. ej., la
                  columna 12 de las licencias del Reino Unido) como
                  `dl_class_code_<class>_notes`. Cuando el documento incluye
                  nombres, dirección o lugar de nacimiento en varias escrituras,
                  este objeto también incluye las versiones en escritura
                  alternativa de esos campos. La configuración del flujo
                  `preferred_characters` (`latin` o `non_latin`) controla qué
                  escritura se usa en los campos de nivel superior
                  (`first_name`, `last_name`, `full_name`, `address`,
                  `place_of_birth`); la escritura opuesta se coloca aquí como
                  `first_name_non_latin` / `last_name_non_latin` /
                  `full_name_non_latin` / `middle_name_non_latin` /
                  `address_non_latin` / `place_of_birth_non_latin` (cuando
                  `preferred_characters` es `latin`) o con el sufijo `_latin`
                  (cuando `preferred_characters` es `non_latin`). Las claves
                  solo aparecen cuando el OCR extrae realmente un valor real en
                  escritura alternativa: se omite un campo cuyo valor
                  alternativo está en la misma escritura que el conjunto
                  preferido (por ejemplo, un campo con etiqueta en cirílico cuyo
                  valor de OCR se devolvió con homoglifos latinos). Cuando
                  `preferred_characters` es `latin` pero el documento solo
                  contiene texto no latino, Didit translitera los valores
                  extraídos y expone `first_name_latin` / `last_name_latin` /
                  etc. como alternativa.
                additionalProperties: true
                properties:
                  dl_categories:
                    type: array
                    items:
                      type: string
                  blood_group:
                    type: string
                    nullable: true
                  first_name_non_latin:
                    type: string
                    description: >-
                      Nombre en el alfabeto no latino cuando
                      `preferred_characters=latin` y el documento incluye una
                      versión en alfabeto no latino (por ejemplo, `Айна` en un
                      documento de identidad kirguís).
                  last_name_non_latin:
                    type: string
                    description: >-
                      Apellido en el alfabeto no latino cuando
                      `preferred_characters=latin` y el documento contiene una
                      versión no latina.
                  middle_name_non_latin:
                    type: string
                    description: >-
                      Segundo nombre / patronímico en el alfabeto no latino
                      cuando `preferred_characters=latin` y el documento incluye
                      una versión no latina.
                  full_name_non_latin:
                    type: string
                    description: >-
                      Nombre completo compuesto en el alfabeto no latino. Se
                      reconstruye a partir de los componentes individuales
                      cuando están disponibles tanto el nombre como el apellido.
                  address_non_latin:
                    type: string
                    description: >-
                      Dirección en la escritura no latina cuando
                      `preferred_characters=latin` y el documento incluye una
                      versión no latina.
                  place_of_birth_non_latin:
                    type: string
                    description: >-
                      Lugar de nacimiento en el alfabeto no latino cuando
                      `preferred_characters=latin` y el documento incluye una
                      versión no latina.
                  first_name_latin:
                    type: string
                    description: >-
                      Nombre en alfabeto latino. Se rellena cuando
                      `preferred_characters=non_latin` y el documento incluye
                      una versión en alfabeto latino, o, como transliteración de
                      respaldo, cuando `preferred_characters=latin` pero el
                      documento solo contiene texto en alfabeto no latino.
                  last_name_latin:
                    type: string
                    description: >-
                      Apellido en alfabeto latino. Mismas reglas que
                      `first_name_latin`.
                  middle_name_latin:
                    type: string
                    description: >-
                      Segundo nombre / patronímico en alfabeto latino. Mismas
                      reglas que `first_name_latin`.
                  full_name_latin:
                    type: string
                    description: >-
                      Nombre completo compuesto en alfabeto latino. Siempre se
                      reconstruye a partir de los componentes individuales
                      cuando están disponibles tanto el nombre como el apellido.
                  address_latin:
                    type: string
                    description: >-
                      Dirección en escritura latina. Mismas reglas que
                      `first_name_latin`.
                  place_of_birth_latin:
                    type: string
                    description: >-
                      Lugar de nacimiento en alfabeto latino. Se aplican las
                      mismas reglas que a `first_name_latin`.
              mrz:
                type: object
                nullable: true
                description: >-
                  Campos analizados de la zona de lectura mecánica (MRZ)
                  extraídos del documento. `null` si no se detectó ninguna MRZ.
                properties:
                  surname:
                    type: string
                    example: MARTINEZ<SANCHEZ
                  name:
                    type: string
                    example: ELENA
                  country:
                    type: string
                    example: ESP
                  nationality:
                    type: string
                    example: ESP
                  birth_date:
                    type: string
                    example: '850315'
                  expiry_date:
                    type: string
                    example: '220821'
                  sex:
                    type: string
                    example: F
                  document_type:
                    type: string
                    example: ID
                  document_number:
                    type: string
                    example: YZA123456
                  optional_data:
                    type: string
                    example: X9876543L
                  optional_data_2:
                    type: string
                    example: ''
                  birth_date_hash:
                    type: string
                    example: '7'
                  expiry_date_hash:
                    type: string
                    example: '4'
                  document_number_hash:
                    type: string
                    example: '9'
                  final_hash:
                    type: string
                    example: '2'
                  personal_number:
                    type: string
                    example: X9876543L
                  warnings:
                    type: array
                    items:
                      type: string
                  errors:
                    type: array
                    items:
                      type: string
                  mrz_type:
                    type: string
                    example: TD1
                  mrz_string:
                    type: string
                    example: |-
                      IDESPMARTINEZ<SANCHEZ<<<<<<<<<<
                      YZA123456<9ESP8503157F3208214<X9876543L<<<<<<<2
                      MARTINEZ<SANCHEZ<<ELENA<<<<<<<<<<
                  mrz_key:
                    type: string
                    example: YZA123456985031573208214
              parsed_address:
                type: object
                description: Detalles estructurados de la dirección
                properties:
                  city:
                    type: string
                  label:
                    type: string
                  region:
                    type: string
                  country:
                    type: string
                    description: Código de país de dos letras
                  category:
                    type: string
                    description: >-
                      Categoría de la dirección (p. ej., Residential,
                      Commercial)
                  street_1:
                    type: string
                  street_2:
                    type: string
                    nullable: true
                  is_verified:
                    type: boolean
                    description: Si la dirección se ha verificado
                  postal_code:
                    type: string
                  raw_results:
                    type: object
                    properties:
                      types:
                        type: array
                        items:
                          type: string
                      geometry:
                        type: object
                        properties:
                          location:
                            type: object
                            properties:
                              lat:
                                type: number
                              lng:
                                type: number
                          viewport:
                            type: object
                            properties:
                              northeast:
                                type: object
                                properties:
                                  lat:
                                    type: number
                                  lng:
                                    type: number
                              southwest:
                                type: object
                                properties:
                                  lat:
                                    type: number
                                  lng:
                                    type: number
                          location_type:
                            type: string
                      place_id:
                        type: string
                      formatted_address:
                        type: string
                      navigation_points:
                        type: array
                        items:
                          type: object
                          properties:
                            location:
                              type: object
                              properties:
                                latitude:
                                  type: number
                                longitude:
                                  type: number
                      address_components:
                        type: array
                        items:
                          type: object
                          properties:
                            types:
                              type: array
                              items:
                                type: string
                            long_name:
                              type: string
                            short_name:
                              type: string
                  address_type:
                    type: string
                  document_location:
                    type: object
                    properties:
                      latitude:
                        type: number
                      longitude:
                        type: number
                  formatted_address:
                    type: string
              extra_files:
                type: array
                items:
                  type: string
                  format: uri
                description: Archivos adicionales de verificación de documentos
              front_image_camera_front_face_match_score:
                type: number
                nullable: true
                description: >-
                  Puntuación de coincidencia facial entre el retrato extraído de
                  la imagen del anverso del documento y la imagen de la cámara
                  frontal
              back_image_camera_front_face_match_score:
                type: number
                nullable: true
                description: >-
                  Puntuación de coincidencia facial entre el retrato extraído de
                  la imagen del reverso del documento y la imagen de la cámara
                  frontal
              document_selfie_face_matches:
                type: array
                description: >-
                  Sesiones anteriores o entradas de la lista de bloqueo facial
                  cuyo rostro coincidió con la selfie que tomó la cámara frontal
                  durante la captura del documento (Silent Capture Face Search).
                  Mismo formato de entrada que `liveness_checks[].matches`.
                  `null` para las sesiones creadas antes de que existiera este
                  campo o cuando la búsqueda no se ejecutó; un array vacío
                  cuando se ejecutó y no encontró nada. `match_image_url` es una
                  URL prefirmada que expira.
                items:
                  type: object
                  properties:
                    session_id:
                      type: string
                      format: uuid
                      nullable: true
                      description: >-
                        ID de sesión del rostro coincidente. `null` cuando
                        `source` es `imported`, `list_entry` o
                        `retained_template`.
                    session_number:
                      type: integer
                      nullable: true
                    similarity_percentage:
                      type: number
                      description: >-
                        Similitud facial entre las dos imágenes, limitada al
                        rango de 0 a 100.
                    vendor_data:
                      type: string
                      nullable: true
                      description: >-
                        `vendor_data` de la sesión coincidente o del User
                        vinculado, para rostros importados y rostros con
                        plantilla retenida.
                    vendor_user_id:
                      type: string
                      format: uuid
                      nullable: true
                      description: >-
                        ID del usuario vinculado para las coincidencias
                        `imported` y `retained_template` y para las
                        coincidencias de sesión vinculadas a un usuario. `null`
                        para las entradas de lista y las sesiones sin usuario.
                    biometric_template_id:
                      type: string
                      format: uuid
                      nullable: true
                      description: >-
                        ID de la plantilla biométrica conservada. Solo se
                        establece cuando `source` es `retained_template`; `null`
                        en caso contrario.
                    verification_date:
                      type: string
                      format: date-time
                      nullable: true
                      description: >-
                        Fecha y hora en que se capturó el rostro coincidente, o
                        en que se creó una plantilla conservada. `null` para
                        entradas de lista.
                    user_details:
                      type: object
                      nullable: true
                      description: >-
                        Datos de identidad de la sesión coincidente o del perfil
                        de usuario importado. Siempre `null` en las
                        coincidencias `retained_template` y `list_entry`.
                      properties:
                        full_name:
                          type: string
                          nullable: true
                        document_type:
                          type: string
                          nullable: true
                        document_number:
                          type: string
                          nullable: true
                    match_image_url:
                      type: string
                      format: uri
                      nullable: true
                      description: >-
                        Imagen de referencia para las coincidencias basadas en
                        imágenes. Siempre es `null` en las coincidencias de tipo
                        `retained_template`, porque las plantillas conservadas
                        no contienen ninguna imagen.
                    status:
                      type: string
                      nullable: true
                      description: >-
                        Estado del ciclo de vida de la sesión coincidente.
                        `null` para orígenes que no son sesiones.
                    is_blocklisted:
                      type: boolean
                      description: Si el rostro coincidente está en una lista de bloqueo.
                    is_allowlisted:
                      type: boolean
                      description: >-
                        Si el rostro coincidente está en una lista de
                        permitidos.
                    api_service:
                      type: string
                      nullable: true
                      description: >-
                        Servicio de API independiente de la sesión coincidente
                        (p. ej., `PASSIVE_LIVENESS`, `FACE_MATCH`); `null` para
                        sesiones de flujo de verificación (workflow) y orígenes
                        que no son sesiones.
                    source:
                      type: string
                      enum:
                        - session
                        - imported
                        - list_entry
                        - retained_template
                      description: >-
                        Origen del rostro coincidente: `session`, `imported`
                        (rostro subido a un usuario), `list_entry` (lista de
                        permitidos/bloqueo) o `retained_template` (una plantilla
                        biométrica sin imagen almacenada en un usuario, que
                        aparece en `/v3/biometric-templates/`).
                nullable: true
              front_image_quality_score:
                type: object
                nullable: true
                description: >-
                  Métricas de calidad de la imagen del anverso del documento.
                  Cada subpuntuación va de 0 a 100.
                properties:
                  focus_score:
                    type: number
                    description: >-
                      Nitidez de la imagen medida mediante la varianza
                      laplaciana local del 10% superior. Es robusta ante
                      documentos con fondos uniformes amplios. Los valores más
                      altos indican una imagen más nítida y menos borrosa.
                  brightness_score:
                    type: number
                    description: >-
                      Qué tan bien iluminada está la imagen. Penaliza las
                      imágenes demasiado oscuras o sobreexpuestas; el brillo
                      ideal se sitúa en torno a la mitad del rango.
                  brightness_issue:
                    type: string
                    enum:
                      - ok
                      - too_dark
                      - too_bright
                    description: >-
                      Indica el sentido del problema de brillo cuando
                      brightness_score es bajo. 'ok' significa que el brillo es
                      aceptable, 'too_dark' significa que la imagen está
                      subexpuesta y 'too_bright' significa que la imagen está
                      sobreexpuesta.
                  is_document_fully_visible:
                    type: boolean
                    nullable: true
                    description: >-
                      true si las cuatro esquinas del documento son
                      completamente visibles dentro del encuadre de la imagen,
                      false si alguna esquina está cortada. Null cuando las
                      coordenadas de las esquinas no están disponibles.
                  resolution_score:
                    type: number
                    description: >-
                      Resolución efectiva de la imagen según el número total de
                      píxeles.
                  overall_score:
                    type: number
                    description: >-
                      Combinación ponderada de subpuntuaciones (enfoque 45%,
                      brillo 30%, resolución 25%).
              back_image_quality_score:
                type: object
                nullable: true
                description: >-
                  Métricas de calidad de la imagen del reverso del documento.
                  Misma estructura que front_image_quality_score.
                properties:
                  focus_score:
                    type: number
                    description: >-
                      Nitidez de la imagen medida mediante la varianza
                      laplaciana local del 10% superior. Es robusta ante
                      documentos con fondos uniformes amplios. Los valores más
                      altos indican una imagen más nítida y menos borrosa.
                  brightness_score:
                    type: number
                    description: >-
                      Qué tan bien iluminada está la imagen. Penaliza las
                      imágenes demasiado oscuras o sobreexpuestas; el brillo
                      ideal se sitúa en torno a la mitad del rango.
                  brightness_issue:
                    type: string
                    enum:
                      - ok
                      - too_dark
                      - too_bright
                    description: >-
                      Indica el sentido del problema de brillo cuando
                      brightness_score es bajo. 'ok' significa que el brillo es
                      aceptable, 'too_dark' significa que la imagen está
                      subexpuesta y 'too_bright' significa que la imagen está
                      sobreexpuesta.
                  is_document_fully_visible:
                    type: boolean
                    nullable: true
                    description: >-
                      true si las cuatro esquinas del documento son
                      completamente visibles dentro del encuadre de la imagen,
                      false si alguna esquina está cortada. Null cuando las
                      coordenadas de las esquinas no están disponibles.
                  resolution_score:
                    type: number
                    description: >-
                      Resolución efectiva de la imagen según el número total de
                      píxeles.
                  overall_score:
                    type: number
                    description: >-
                      Combinación ponderada de subpuntuaciones (enfoque 45%,
                      brillo 30%, resolución 25%).
              warnings:
                type: array
                items:
                  type: object
                  properties:
                    feature:
                      type: string
                      enum:
                        - ID_VERIFICATION
                        - NFC
                        - LIVENESS
                        - FACEMATCH
                        - PROOF_OF_ADDRESS
                        - PHONE
                        - EMAIL
                        - AML
                        - LOCATION
                        - DATABASE_VALIDATION
                        - QUESTIONNAIRE
                        - DOCUMENT_AI
                        - KYB_REGISTRY
                        - KYB_DOCUMENTS
                        - KYB_KEY_PEOPLE
                        - GEOLOCATION
                        - SIGNATURE
                      description: >-
                        La función que generó esta advertencia (por ejemplo,
                        `ID_VERIFICATION`, `NFC`, `LIVENESS`). El valor
                        identifica el bloque de función al que pertenece la
                        advertencia. El array de advertencias de cada módulo
                        suele usar el valor que corresponde a su módulo, pero el
                        enum anterior es la referencia para todas las
                        advertencias de funciones del payload de la decisión.
                    risk:
                      type: string
                    additional_data:
                      type: object
                      nullable: true
                      description: Datos contextuales adicionales sobre la advertencia
                    log_type:
                      type: string
                      description: 'Tipo de registro: información, advertencia o error'
                    short_description:
                      type: string
                    long_description:
                      type: string
                    node_id:
                      type: string
                      description: >-
                        El ID del nodo del grafo del flujo que generó esta
                        advertencia (para flujos basados en grafos)
                description: Advertencias de la verificación de documentos
              matches:
                type: array
                description: >-
                  Documentos coincidentes encontrados durante la detección de
                  duplicados o de lista de bloqueo (hasta 5 coincidencias)
                items:
                  type: object
                  properties:
                    session_id:
                      type: string
                      format: uuid
                      description: ID de sesión del documento coincidente
                    session_number:
                      type: integer
                      description: Número de sesión del documento coincidente
                    vendor_data:
                      type: string
                      nullable: true
                      description: Datos del proveedor asociados a la sesión coincidente
                    verification_date:
                      type: string
                      format: date-time
                      description: Fecha en que se verificó la sesión coincidente
                    user_details:
                      type: object
                      properties:
                        name:
                          type: string
                          description: Nombre completo del documento coincidente
                        document_type:
                          type: string
                          description: Tipo del documento coincidente
                        document_number:
                          type: string
                          description: Número de documento del documento coincidente
                    status:
                      type: string
                      description: Estado de la sesión coincidente
                    is_blocklisted:
                      type: boolean
                      description: Si el documento coincidente está en la lista de bloqueo
                    api_service:
                      type: string
                      nullable: true
                      description: Tipo de servicio de API de la sesión coincidente
                    front_image_url:
                      type: string
                      format: uri
                      nullable: true
                      description: URL de la imagen del anverso del documento coincidente
              document_liveness:
                type: object
                nullable: true
                description: >-
                  Puntuaciones de prueba de vida del documento por tipo de
                  fraude. Se informan tanto si se activó una advertencia como si
                  no, para que un documento aprobado también pueda auditarse.
                  `null` cuando la comprobación no se ejecutó.
                properties:
                  portrait_replace:
                    type: object
                    nullable: true
                    properties:
                      score:
                        type: number
                        nullable: true
                        description: >-
                          Probabilidad de que el documento sea auténtico para
                          este tipo de fraude, de 0 a 100 (cuanto más alto, más
                          probable es que sea auténtico). Es el valor más bajo
                          de los dos lados, el que usó la decisión. `null`
                          cuando ningún lado produjo una puntuación utilizable.
                      front:
                        type: number
                        nullable: true
                        description: >-
                          Puntuación del anverso; `null` cuando no se capturó o
                          cuando se descartó la puntuación.
                      back:
                        type: number
                        nullable: true
                        description: >-
                          Puntuación del reverso; `null` cuando no se capturó o
                          cuando se descartó la puntuación.
                      decline_threshold:
                        type: number
                        nullable: true
                        description: >-
                          El umbral de rechazo guardado cuando se evaluó este
                          documento. Las ediciones posteriores del flujo no lo
                          cambian. Null cuando no hay evidencia histórica de la
                          evaluación disponible.
                      review_threshold:
                        type: number
                        nullable: true
                        description: >-
                          El umbral de revisión guardado cuando se evaluó este
                          documento. Las ediciones posteriores del flujo no lo
                          cambian. Null cuando la evidencia histórica de la
                          evaluación no está disponible.
                      bucket:
                        type: string
                        nullable: true
                        enum:
                          - approve
                          - review
                          - decline
                          - null
                        description: >-
                          La categoría de tipo de fraude guardada en el momento
                          de la evaluación. Es null cuando no hay una puntuación
                          utilizable, la comprobación no se aplicó o no están
                          disponibles las evidencias históricas de la
                          evaluación. Las ediciones posteriores del flujo no la
                          modifican.
                  printed_copy:
                    type: object
                    nullable: true
                    properties:
                      score:
                        type: number
                        nullable: true
                        description: >-
                          Probabilidad de que el documento sea auténtico para
                          este tipo de fraude, de 0 a 100 (cuanto más alto, más
                          probable es que sea auténtico). Es el valor más bajo
                          de los dos lados, el que usó la decisión. `null`
                          cuando ningún lado produjo una puntuación utilizable.
                      front:
                        type: number
                        nullable: true
                        description: >-
                          Puntuación del anverso; `null` cuando no se capturó o
                          cuando se descartó la puntuación.
                      back:
                        type: number
                        nullable: true
                        description: >-
                          Puntuación del reverso; `null` cuando no se capturó o
                          cuando se descartó la puntuación.
                      decline_threshold:
                        type: number
                        nullable: true
                        description: >-
                          El umbral de rechazo guardado cuando se evaluó este
                          documento. Las ediciones posteriores del flujo no lo
                          cambian. Null cuando no hay evidencia histórica de la
                          evaluación disponible.
                      review_threshold:
                        type: number
                        nullable: true
                        description: >-
                          El umbral de revisión guardado cuando se evaluó este
                          documento. Las ediciones posteriores del flujo no lo
                          cambian. Null cuando la evidencia histórica de la
                          evaluación no está disponible.
                      bucket:
                        type: string
                        nullable: true
                        enum:
                          - approve
                          - review
                          - decline
                          - null
                        description: >-
                          La categoría de tipo de fraude guardada en el momento
                          de la evaluación. Es null cuando no hay una puntuación
                          utilizable, la comprobación no se aplicó o no están
                          disponibles las evidencias históricas de la
                          evaluación. Las ediciones posteriores del flujo no la
                          modifican.
                  screen_replay:
                    type: object
                    nullable: true
                    properties:
                      score:
                        type: number
                        nullable: true
                        description: >-
                          Probabilidad de que el documento sea auténtico para
                          este tipo de fraude, de 0 a 100 (cuanto más alto, más
                          probable es que sea auténtico). Es el valor más bajo
                          de los dos lados, el que usó la decisión. `null`
                          cuando ningún lado produjo una puntuación utilizable.
                      front:
                        type: number
                        nullable: true
                        description: >-
                          Puntuación del anverso; `null` cuando no se capturó o
                          cuando se descartó la puntuación.
                      back:
                        type: number
                        nullable: true
                        description: >-
                          Puntuación del reverso; `null` cuando no se capturó o
                          cuando se descartó la puntuación.
                      decline_threshold:
                        type: number
                        nullable: true
                        description: >-
                          El umbral de rechazo guardado cuando se evaluó este
                          documento. Las ediciones posteriores del flujo no lo
                          cambian. Null cuando no hay evidencia histórica de la
                          evaluación disponible.
                      review_threshold:
                        type: number
                        nullable: true
                        description: >-
                          El umbral de revisión guardado cuando se evaluó este
                          documento. Las ediciones posteriores del flujo no lo
                          cambian. Null cuando la evidencia histórica de la
                          evaluación no está disponible.
                      bucket:
                        type: string
                        nullable: true
                        enum:
                          - approve
                          - review
                          - decline
                          - null
                        description: >-
                          La categoría de tipo de fraude guardada en el momento
                          de la evaluación. Es null cuando no hay una puntuación
                          utilizable, la comprobación no se aplicó o no están
                          disponibles las evidencias históricas de la
                          evaluación. Las ediciones posteriores del flujo no la
                          modifican.
              address_validation:
                allOf:
                  - $ref: '#/components/schemas/AddressValidationResult'
                nullable: true
                description: >-
                  Validación de dirección de la dirección impresa en este
                  documento: si existe y su forma normalizada, tal como se leyó
                  en el documento (una corrección posterior de `address` no la
                  vuelve a ejecutar). Presente cuando este paso de verificación
                  de identidad habilitó el complemento de Validación de
                  dirección; `null` en caso contrario.
              region:
                type: string
                nullable: true
                description: >-
                  Región o estado del país emisor del documento, cuando el
                  documento lo indica.
              extracted_data:
                type: object
                nullable: true
                additionalProperties: true
                description: >-
                  Instantánea de los datos extraídos del documento que se
                  mostraron a la persona para que los revisara. Se guarda junto
                  a los valores confirmados para que puedas comparar lo que se
                  leyó con lo que la persona confirmó. `null` cuando no se pidió
                  a la persona que revisara los datos.
              barcodes:
                type: array
                items:
                  type: object
                  additionalProperties: true
                description: >-
                  Datos leídos de los códigos de barras del documento. Vacío
                  cuando el documento no tiene ninguno o no se leyó ninguno.
        nfc_skip_reason:
          type: string
          nullable: true
          enum:
            - USER_SKIPPED
            - DOCUMENT_WITHOUT_CHIP
            - CHIP_CERTIFICATE_UNAVAILABLE
            - DEVICE_WITHOUT_NFC
            - INTEGRATION_WITHOUT_NFC_ACCESS
            - MRZ_KEY_UNAVAILABLE
            - JPKI_UNAVAILABLE
          description: >-
            Por qué no se ejecutó la verificación del chip NFC; se rellena
            siempre que el flujo incluye un paso NFC. `null` mientras NFC está
            pendiente o cuando el chip sí se leyó. Valores: `USER_SKIPPED`: el
            usuario decidió omitirlo en un dispositivo compatible con NFC
            (permitido por `allow_nfc_skip`); `DOCUMENT_WITHOUT_CHIP`: el
            documento no tiene un chip NFC legible (no es un documento
            electrónico ICAO 9303); `CHIP_CERTIFICATE_UNAVAILABLE`: el
            certificado de firma del país emisor (CSCA) que cubre el periodo de
            emisión del documento no está disponible, por lo que no se puede
            verificar la firma del chip; `DEVICE_WITHOUT_NFC`: el dispositivo
            indicó que no tiene lector NFC; `INTEGRATION_WITHOUT_NFC_ACCESS`: la
            verificación se ejecutó sin un SDK nativo (por ejemplo, en un
            navegador web), que no tiene acceso al lector NFC del teléfono;
            `MRZ_KEY_UNAVAILABLE`: no se pudo obtener la clave de acceso al chip
            a partir de la MRZ del documento; `JPKI_UNAVAILABLE`: el documento
            es una My Number Card de Japón, cuyo chip se lee mediante JPKI, y
            JPKI no estaba disponible para esta verificación: no está habilitado
            o el SDK nativo de la aplicación no puede leer My Number Cards.
        nfc_verifications:
          type: array
          nullable: true
          description: >-
            **Array de informes NFC / ePassport** generados por los pasos NFC
            del grafo del flujo. **Siempre es un array JSON, nunca un objeto
            `nfc` singular**: lee `nfc_verifications[0]` e itera si tu flujo
            puede ejecutar NFC más de una vez. Es `null` hasta que al menos un
            paso NFC haya generado datos. Cada elemento es el informe completo,
            que incluye `node_id`, el `status` a nivel de función,
            `chip_protocol`, `chip_data`, `authenticity` (integridad de SOD +
            DG), `certificate_summary` y `warnings[]`. Una My Number Card de
            Japón se lee mediante JPKI en lugar de ICAO 9303: su elemento tiene
            `chip_protocol: "jpki"`, incluye su evidencia en `jpki` y deja los
            campos ICAO en `null`. Cuando el paso NFC se omitió antes de poder
            ofrecerse (documento sin chip, certificado ausente, sin capacidad
            NFC informada, clave MRZ ilegible, JPKI no disponible para una My
            Number Card), este campo permanece en `null` y `nfc_skip_reason`
            explica el motivo; una omisión en el propio paso (el usuario pulsó
            omitir o el lector resultó no estar disponible en el momento del
            escaneo) sigue generando un informe con `is_nfc_skipped: true`.
          items:
            type: object
            description: >-
              Un informe NFC: el informe completo de una sola lectura de chip
              (un chip de pasaporte electrónico o eID ICAO 9303, o una My Number
              Card de Japón leída mediante JPKI).
            properties:
              node_id:
                type: string
                description: >-
                  ID del nodo del grafo del flujo correspondiente al paso NFC
                  que generó este informe. Úsalo para relacionar el informe con
                  la definición del flujo.
              status:
                type: string
                enum:
                  - Not Finished
                  - Approved
                  - Declined
                  - In Review
                  - Resub Requested
                description: >-
                  Estado a nivel de función de este paso NFC. Es independiente
                  del `status` de nivel superior de la sesión: una sesión puede
                  alcanzar su decisión global mientras una función concreta
                  sigue en `In Review`.
              is_nfc_skipped:
                type: boolean
                description: >-
                  `true` cuando este paso NFC se omitió explícitamente en lugar
                  de leerse; `skip_reason` indica el motivo.
              skip_reason:
                type: string
                nullable: true
                enum:
                  - USER_SKIPPED
                  - DOCUMENT_WITHOUT_CHIP
                  - CHIP_CERTIFICATE_UNAVAILABLE
                  - DEVICE_WITHOUT_NFC
                  - INTEGRATION_WITHOUT_NFC_ACCESS
                  - MRZ_KEY_UNAVAILABLE
                  - JPKI_UNAVAILABLE
                description: >-
                  Por qué se omitió este paso NFC. Solo se define cuando
                  `is_nfc_skipped` es `true`. Usa la misma taxonomía que
                  `nfc_skip_reason` a nivel de sesión, que además cubre los
                  casos en que NFC no llegó a generar ningún informe.
              chip_protocol:
                type: string
                enum:
                  - icao
                  - jpki
                description: >-
                  Cómo lee el chip el paso NFC. `icao`: chip de ePassport o eID
                  ICAO 9303, abierto con la clave de acceso de la MRZ. `jpki`:
                  My Number Card de Japón, donde la tarjeta firma un desafío de
                  un solo uso después de que el titular introduce el PIN de la
                  tarjeta en un SDK nativo; el resultado está en `jpki`. También
                  se establece en los pasos omitidos, para que puedas distinguir
                  una lectura de My Number Card omitida.
              jpki:
                type: object
                nullable: true
                description: >-
                  Qué demostró la lectura de una tarjeta My Number de Japón
                  mediante JPKI. Está presente cuando `chip_protocol` es `jpki`
                  y se leyó la tarjeta. Es `null` para chips ICAO, para pasos
                  omitidos y cuando el paso NFC se cerró sin leer ninguna
                  tarjeta (ese caso genera `JPKI_SIGNATURE_INVALID`). Nunca
                  incluye los certificados, sus números de serie, las firmas ni
                  el My Number de 12 dígitos.
                properties:
                  certificate_types:
                    type: array
                    items:
                      type: string
                      enum:
                        - user_authentication
                        - signature
                    description: >-
                      Los certificados de la tarjeta que se leyeron.
                      `user_authentication` (PIN de 4 dígitos) siempre se lee;
                      `signature` (PIN de firma) se lee cuando la opción
                      `jpki_request_attributes` del nodo NFC está activada.
                  chain_valid:
                    type: boolean
                    description: >-
                      `true` cuando cada certificado leído se encadena a la
                      autoridad de certificación JPKI, está dentro de su periodo
                      de validez y es un certificado de My Number Card de su
                      tipo.
                  signature_valid:
                    type: boolean
                    description: >-
                      `true` cuando se verifica cada firma que la tarjeta
                      realizó sobre el desafío de un solo uso. La tarjeta solo
                      firma después de introducir su PIN, por lo que esto
                      demuestra la posesión de la tarjeta y el conocimiento del
                      PIN.
                  revocation_status:
                    type: string
                    enum:
                      - good
                      - revoked
                      - unchecked
                    description: >-
                      `good` cuando la comprobación de revocación confirmó que
                      todos los certificados son válidos, `revoked` cuando algún
                      certificado está revocado (por ejemplo, una tarjeta
                      notificada como perdida), `unchecked` cuando no había
                      ninguna respuesta de revocación disponible. `unchecked`
                      nunca se trata como `good`: el
                      `jpki_revocation_unchecked_action` del nodo NFC decide el
                      resultado (por defecto, `REVIEW`).
                  ca_generation:
                    type: string
                    nullable: true
                    description: >-
                      Generación de la autoridad de certificación JPKI que
                      emitió los certificados, por ejemplo `2023`. `null` cuando
                      ningún certificado se encadena a una de ellas.
                  certificate_expires_at:
                    type: string
                    format: date-time
                    nullable: true
                    description: >-
                      La fecha de caducidad más próxima entre los certificados
                      leídos.
                  certificates:
                    type: array
                    items:
                      type: object
                      description: >-
                        Qué demostró un certificado leído de la tarjeta. Nunca
                        el certificado en sí ni su número de serie.
                      properties:
                        type:
                          type: string
                          enum:
                            - user_authentication
                            - signature
                          description: Qué certificado de la tarjeta describe esta entrada.
                        chain_valid:
                          type: boolean
                          description: >-
                            `true` cuando el certificado se encadena a la
                            autoridad de certificación JPKI de su tipo, está
                            dentro de su periodo de validez y es un certificado
                            de My Number Card de ese tipo.
                        signature_valid:
                          type: boolean
                          description: >-
                            `true` cuando la firma de la tarjeta sobre el
                            desafío de un solo uso se verifica con este
                            certificado.
                        ca_generation:
                          type: string
                          nullable: true
                          description: >-
                            Generación de la autoridad de certificación JPKI que
                            emitió el certificado, por ejemplo `2023`. `null`
                            cuando no se encontró ningún emisor de confianza.
                        not_valid_before:
                          type: string
                          format: date-time
                          nullable: true
                          description: >-
                            Inicio del periodo de validez del certificado.
                            `null` cuando no se pudo leer el certificado.
                        not_valid_after:
                          type: string
                          format: date-time
                          nullable: true
                          description: >-
                            Fin del periodo de validez del certificado. `null`
                            cuando no se pudo leer el certificado.
                        failure:
                          type: string
                          nullable: true
                          enum:
                            - unreadable_certificate
                            - untrusted_issuer
                            - expired
                            - not_yet_valid
                            - wrong_policy
                            - key_usage
                            - null
                          description: >-
                            Por qué `chain_valid` es `false`:
                            `unreadable_certificate`, `untrusted_issuer` (no
                            emitido por la autoridad de certificación JPKI de su
                            tipo), `expired`, `not_yet_valid`, `wrong_policy`
                            (no es un certificado de My Number Card de ese tipo)
                            o `key_usage` (la clave no puede firmar). `null`
                            cuando la cadena es válida.
                    description: >-
                      Resultados por certificado, una entrada por cada
                      certificado leído.
                  attributes:
                    type: object
                    nullable: true
                    description: >-
                      Los datos del titular extraídos del certificado de firma,
                      una vez que su cadena es válida. `null` cuando no se
                      solicitó el certificado de firma o su cadena no llegó a la
                      autoridad de certificación de JPKI.
                    properties:
                      full_name:
                        type: string
                        nullable: true
                        description: >-
                          Nombre tal como está registrado, normalmente en
                          escritura japonesa.
                      date_of_birth:
                        type: string
                        format: date
                        nullable: true
                        description: >-
                          Fecha de nacimiento, `YYYY-MM-DD`. `null` cuando la
                          fecha registrada está incompleta.
                      gender:
                        type: string
                        nullable: true
                        enum:
                          - M
                          - F
                          - null
                        description: '`M`, `F` o `null` cuando no está registrado.'
                      address:
                        type: string
                        nullable: true
                        description: Dirección registrada.
                      name_substitute_characters:
                        type: string
                        nullable: true
                        description: >-
                          Cadena de posiciones que marca los caracteres de
                          `full_name` que se reemplazaron por un sustituto
                          porque el carácter original está fuera del juego de
                          caracteres estándar. `null` cuando no se reemplazó
                          ninguno.
                      address_substitute_characters:
                        type: string
                        nullable: true
                        description: >-
                          Cadena de posiciones que marca los caracteres
                          sustitutos en `address`, igual que en
                          `name_substitute_characters`.
                  attributes_match_ocr:
                    type: boolean
                    nullable: true
                    description: >-
                      `true` cuando los atributos coinciden con los datos leídos
                      de la foto de la misma tarjeta, `false` cuando algún
                      atributo difiere (`JPKI_AND_OCR_DATA_NOT_SAME`) y `null`
                      cuando no se pudo comparar nada, incluido siempre que
                      `attributes` es `null`.
                  mismatched_attributes:
                    type: array
                    items:
                      type: string
                      enum:
                        - full_name
                        - date_of_birth
                        - gender
                        - address
                    description: >-
                      Nombres de los atributos que difieren de los datos de la
                      foto, nunca sus valores. Vacío cuando todo lo comparado
                      coincide.
              portrait_image:
                type: string
                format: uri
                nullable: true
                description: >-
                  URL prefirmada del retrato leído del chip (ICAO DG2). `null`
                  para una lectura JPKI (`chip_protocol: "jpki"`) y para pasos
                  omitidos.
              signature_image:
                type: string
                format: uri
                nullable: true
                description: >-
                  URL prefirmada de la imagen de la firma del titular leída del
                  chip (ICAO DG7), cuando el chip la almacena. `null` para una
                  lectura JPKI (`chip_protocol: "jpki"`) y para pasos omitidos.
              chip_data:
                type: object
                nullable: true
                description: >-
                  Datos personales extraídos de los Data Groups del chip ICAO.
                  `null` en una lectura JPKI (`chip_protocol: "jpki"`) y en los
                  pasos omitidos.
                properties:
                  document_type:
                    type: string
                  issuing_country:
                    type: string
                  document_number:
                    type: string
                  expiration_date:
                    type: string
                    format: date
                  first_name:
                    type: string
                  last_name:
                    type: string
                  birth_date:
                    type: string
                    format: date
                  gender:
                    type: string
                  nationality:
                    type: string
                  address:
                    type: string
                  place_of_birth:
                    type: string
              authenticity:
                type: object
                nullable: true
                description: >-
                  Autenticación pasiva ICAO: firma del SOD (`sod_integrity`) y
                  hashes de los Data Groups (`dg_integrity`). `null` en una
                  lectura JPKI, que informa de su prueba en `jpki`.
                properties:
                  sod_integrity:
                    type: boolean
                  dg_integrity:
                    type: boolean
              certificate_summary:
                type: object
                nullable: true
                description: >-
                  Resumen del certificado de firmante de documentos (Document
                  Signer Certificate) de la ICAO. `null` en una lectura JPKI
                  (`chip_protocol: "jpki"`) y en los pasos omitidos.
                properties:
                  issuer:
                    type: string
                  subject:
                    type: string
                  serial_number:
                    type: string
                  not_valid_after:
                    type: string
                    format: date-time
                  not_valid_before:
                    type: string
                    format: date-time
              warnings:
                type: array
                items:
                  type: object
                  properties:
                    feature:
                      type: string
                      enum:
                        - ID_VERIFICATION
                        - NFC
                        - LIVENESS
                        - FACEMATCH
                        - PROOF_OF_ADDRESS
                        - PHONE
                        - EMAIL
                        - AML
                        - LOCATION
                        - DATABASE_VALIDATION
                        - QUESTIONNAIRE
                        - DOCUMENT_AI
                        - KYB_REGISTRY
                        - KYB_DOCUMENTS
                        - KYB_KEY_PEOPLE
                        - GEOLOCATION
                        - SIGNATURE
                      description: >-
                        La función que generó esta advertencia. El valor
                        identifica el bloque de función al que pertenece la
                        advertencia. El array de advertencias de cada módulo
                        suele usar el valor que corresponde a su módulo (por
                        ejemplo, `PHONE` dentro de
                        `phone_verifications[].warnings`), pero el enum anterior
                        es la referencia para todas las advertencias de
                        funciones del payload de la decisión.
                    risk:
                      type: string
                    additional_data:
                      type: object
                      nullable: true
                    log_type:
                      type: string
                    short_description:
                      type: string
                    long_description:
                      type: string
                    node_id:
                      type: string
                      description: >-
                        El ID del nodo del grafo del flujo que generó esta
                        advertencia
        liveness_checks:
          type: array
          nullable: true
          description: >-
            **Array de informes de prueba de vida** generados por los pasos de
            prueba de vida del grafo del flujo. Siempre es un array JSON, nunca
            un objeto `liveness` singular. Es `null` hasta que al menos un paso
            de prueba de vida haya generado datos. Cada elemento es el informe
            completo, que incluye `node_id`, el `status` a nivel de función,
            `method`, `score`, `reference_image`, `video_url`, `age_estimation`
            opcional, `matches[]` entre sesiones y `warnings[]`.
          items:
            type: object
            description: >-
              Un informe de prueba de vida: el informe completo de una sola
              pasada de prueba de vida.
            properties:
              node_id:
                type: string
                description: >-
                  ID del nodo del grafo del flujo correspondiente al paso de
                  prueba de vida que generó este informe.
              status:
                type: string
                enum:
                  - Not Finished
                  - Approved
                  - Declined
                  - In Review
                  - Resub Requested
                description: >-
                  Estado a nivel de función de este paso de prueba de vida. Es
                  independiente del `status` de nivel superior de la sesión: una
                  sesión puede alcanzar su decisión global mientras una función
                  concreta sigue en `In Review`.
              method:
                type: string
                description: Método utilizado para la prueba de vida
              score:
                type: number
                description: Puntuación de confianza de la prueba de vida
              reference_image:
                type: string
                format: uri
                description: URL de la imagen de referencia utilizada
              video_url:
                type: string
                format: uri
                description: URL del video de la prueba de vida
              age_estimation:
                type: number
                description: Edad estimada de la persona
              matches:
                type: array
                description: >-
                  Rostros similares encontrados por la búsqueda de rostros
                  duplicados (las mejores coincidencias, con las entradas de la
                  lista de bloqueo o de la lista de permitidos primero). El
                  `source` de cada entrada indica de dónde procede el rostro
                  coincidente: `session` (otra sesión de verificación),
                  `imported` (un rostro subido para un usuario del proveedor),
                  `list_entry` (un rostro de una lista de permitidos o de
                  bloqueo gestionada por la organización) o `retained_template`
                  (una plantilla biométrica sin imagen almacenada en un usuario,
                  listada en `/v3/biometric-templates/`). `session_id`,
                  `session_number`, `status` y `api_service` son `null` para los
                  orígenes que no son sesiones. Las coincidencias `imported`
                  siguen rellenando `vendor_data`, `verification_date` y, cuando
                  el usuario del proveedor tiene un nombre registrado,
                  `user_details` (solo con `full_name`) a partir del registro
                  del usuario del proveedor; las coincidencias
                  `retained_template` rellenan `vendor_user_id`, `vendor_data`,
                  `biometric_template_id` y `verification_date`, mientras que
                  sus campos de imagen e identidad son `null`; las coincidencias
                  `list_entry` devuelven todos estos campos como `null`.
                items:
                  type: object
                  properties:
                    session_id:
                      type: string
                      format: uuid
                      nullable: true
                      description: >-
                        ID de sesión del rostro coincidente. `null` cuando
                        `source` es `imported`, `list_entry` o
                        `retained_template`.
                    session_number:
                      type: integer
                      nullable: true
                    similarity_percentage:
                      type: number
                      description: >-
                        Similitud facial entre las dos imágenes, limitada al
                        rango de 0 a 100.
                    vendor_data:
                      type: string
                      nullable: true
                      description: >-
                        `vendor_data` de la sesión coincidente o del User
                        vinculado, para rostros importados y rostros con
                        plantilla retenida.
                    vendor_user_id:
                      type: string
                      format: uuid
                      nullable: true
                      description: >-
                        ID del usuario vinculado para las coincidencias
                        `imported` y `retained_template` y para las
                        coincidencias de sesión vinculadas a un usuario. `null`
                        para las entradas de lista y las sesiones sin usuario.
                    biometric_template_id:
                      type: string
                      format: uuid
                      nullable: true
                      description: >-
                        ID de la plantilla biométrica conservada. Solo se
                        establece cuando `source` es `retained_template`; `null`
                        en caso contrario.
                    verification_date:
                      type: string
                      format: date-time
                      nullable: true
                      description: >-
                        Fecha y hora en que se capturó el rostro coincidente, o
                        en que se creó una plantilla conservada. `null` para
                        entradas de lista.
                    user_details:
                      type: object
                      nullable: true
                      description: >-
                        Datos de identidad de la sesión coincidente o del perfil
                        de usuario importado. Siempre `null` en las
                        coincidencias `retained_template` y `list_entry`.
                      properties:
                        full_name:
                          type: string
                          nullable: true
                        document_type:
                          type: string
                          nullable: true
                        document_number:
                          type: string
                          nullable: true
                    match_image_url:
                      type: string
                      format: uri
                      nullable: true
                      description: >-
                        Imagen de referencia para las coincidencias basadas en
                        imágenes. Siempre es `null` en las coincidencias de tipo
                        `retained_template`, porque las plantillas conservadas
                        no contienen ninguna imagen.
                    status:
                      type: string
                      nullable: true
                      description: >-
                        Estado del ciclo de vida de la sesión coincidente.
                        `null` para orígenes que no son sesiones.
                    is_blocklisted:
                      type: boolean
                      description: Si el rostro coincidente está en una lista de bloqueo.
                    is_allowlisted:
                      type: boolean
                      description: >-
                        Si el rostro coincidente está en una lista de
                        permitidos.
                    api_service:
                      type: string
                      nullable: true
                      description: >-
                        Servicio de API independiente de la sesión coincidente
                        (p. ej., `PASSIVE_LIVENESS`, `FACE_MATCH`); `null` para
                        sesiones de flujo de verificación (workflow) y orígenes
                        que no son sesiones.
                    source:
                      type: string
                      enum:
                        - session
                        - imported
                        - list_entry
                        - retained_template
                      description: >-
                        Origen del rostro coincidente: `session`, `imported`
                        (rostro subido a un usuario), `list_entry` (lista de
                        permitidos/bloqueo) o `retained_template` (una plantilla
                        biométrica sin imagen almacenada en un usuario, que
                        aparece en `/v3/biometric-templates/`).
              warnings:
                type: array
                items:
                  type: object
                  properties:
                    feature:
                      type: string
                      enum:
                        - ID_VERIFICATION
                        - NFC
                        - LIVENESS
                        - FACEMATCH
                        - PROOF_OF_ADDRESS
                        - PHONE
                        - EMAIL
                        - AML
                        - LOCATION
                        - DATABASE_VALIDATION
                        - QUESTIONNAIRE
                        - DOCUMENT_AI
                        - KYB_REGISTRY
                        - KYB_DOCUMENTS
                        - KYB_KEY_PEOPLE
                        - GEOLOCATION
                        - SIGNATURE
                      description: >-
                        La función que generó esta advertencia. El valor
                        identifica el bloque de función al que pertenece la
                        advertencia. El array de advertencias de cada módulo
                        suele usar el valor que corresponde a su módulo (por
                        ejemplo, `PHONE` dentro de
                        `phone_verifications[].warnings`), pero el enum anterior
                        es la referencia para todas las advertencias de
                        funciones del payload de la decisión.
                    risk:
                      type: string
                    additional_data:
                      type: object
                      nullable: true
                    log_type:
                      type: string
                    short_description:
                      type: string
                    long_description:
                      type: string
                    node_id:
                      type: string
                      description: >-
                        El ID del nodo del grafo del flujo que generó esta
                        advertencia
              face_quality:
                type: number
                nullable: true
                description: >-
                  Puntuación de calidad de la imagen facial (0-100%). Solo
                  disponible para la prueba de vida pasiva.
              face_luminance:
                type: number
                nullable: true
                description: >-
                  Puntuación de luminancia/brillo del rostro (0-100%). Solo
                  disponible para la prueba de vida pasiva.
        face_matches:
          type: array
          nullable: true
          description: >-
            **Array de informes de coincidencia facial** generados por los pasos
            de coincidencia facial del grafo del flujo. Siempre es un array
            JSON, nunca un objeto `face_match` singular. Es `null` hasta que al
            menos un paso de coincidencia facial haya generado datos. Cada
            elemento es el informe completo, que incluye `node_id`, el `status`
            a nivel de función, el `score` de similitud, `source_image`,
            `target_image` y `warnings[]`.
          items:
            type: object
            description: 'Un informe de coincidencia facial: el informe completo.'
            properties:
              node_id:
                type: string
                description: >-
                  ID del nodo del grafo del flujo correspondiente al paso de
                  coincidencia facial que generó este informe.
              status:
                type: string
                enum:
                  - Not Finished
                  - Approved
                  - Declined
                  - In Review
                  - Resub Requested
                description: >-
                  Estado a nivel de función de este paso de coincidencia facial.
                  Es independiente del `status` de nivel superior de la sesión:
                  una sesión puede alcanzar su decisión global mientras una
                  función concreta sigue en `In Review`.
              score:
                type: number
                description: Puntuación de confianza de la coincidencia facial
              source_image_session_id:
                type: string
                format: uuid
                nullable: true
                description: >-
                  ID de sesión con el que se almacena el retrato de origen (de
                  referencia). En los flujos de autenticación biométrica, es el
                  propio ID de la sesión (el retrato enviado se almacena en la
                  nueva sesión). `null` cuando la imagen de origen es el retrato
                  del documento de la misma sesión.
              source_image:
                type: string
                format: uri
                description: URL de la imagen de origen utilizada para la comparación
              target_image:
                type: string
                format: uri
                description: URL de la imagen de destino utilizada para la comparación
              warnings:
                type: array
                items:
                  type: object
                  properties:
                    feature:
                      type: string
                      enum:
                        - ID_VERIFICATION
                        - NFC
                        - LIVENESS
                        - FACEMATCH
                        - PROOF_OF_ADDRESS
                        - PHONE
                        - EMAIL
                        - AML
                        - LOCATION
                        - DATABASE_VALIDATION
                        - QUESTIONNAIRE
                        - DOCUMENT_AI
                        - KYB_REGISTRY
                        - KYB_DOCUMENTS
                        - KYB_KEY_PEOPLE
                        - GEOLOCATION
                        - SIGNATURE
                      description: >-
                        La función que generó esta advertencia. El valor
                        identifica el bloque de función al que pertenece la
                        advertencia. El array de advertencias de cada módulo
                        suele usar el valor que corresponde a su módulo (por
                        ejemplo, `PHONE` dentro de
                        `phone_verifications[].warnings`), pero el enum anterior
                        es la referencia para todas las advertencias de
                        funciones del payload de la decisión.
                    risk:
                      type: string
                    additional_data:
                      type: object
                      nullable: true
                    log_type:
                      type: string
                    short_description:
                      type: string
                    long_description:
                      type: string
                    node_id:
                      type: string
                      description: >-
                        El ID del nodo del grafo del flujo que generó esta
                        advertencia
                description: Advertencias de la verificación de coincidencia facial
              face_coverage:
                type: object
                nullable: true
                description: >-
                  Si los ojos, la boca y el rostro están cubiertos en la imagen
                  capturada. Solo lo devuelve `GET
                  /v3/session/{sessionId}/decision/`; no forma parte de los
                  payloads de webhook. `null` cuando no existe una lectura de
                  cobertura.
                properties:
                  eyes:
                    type: object
                    properties:
                      covered:
                        type: boolean
                        nullable: true
                      calibrated:
                        type: boolean
                        nullable: true
                        description: >-
                          `false` significa que la lectura es solo evidencia en
                          modo sombra y ninguna advertencia actúa en función de
                          ella.
                      visibility_score:
                        type: number
                        nullable: true
                  mouth:
                    type: object
                    properties:
                      covered:
                        type: boolean
                        nullable: true
                      calibrated:
                        type: boolean
                        nullable: true
                        description: >-
                          `false` significa que la lectura es solo evidencia en
                          modo sombra y ninguna advertencia actúa en función de
                          ella.
                      visibility_score:
                        type: number
                        nullable: true
                  face:
                    type: object
                    properties:
                      covered:
                        type: boolean
                        nullable: true
                      calibrated:
                        type: boolean
                        nullable: true
                        description: >-
                          `false` significa que la lectura es solo evidencia en
                          modo sombra y ninguna advertencia actúa en función de
                          ella.
                      visibility_score:
                        type: number
                        nullable: true
        phone_verifications:
          type: array
          nullable: true
          description: >-
            **Array de informes de verificación de teléfono**: siempre es un
            array JSON, nunca un objeto `phone` singular. Es `null` hasta que al
            menos un paso de teléfono haya generado datos. Cada elemento es el
            informe completo, que incluye `node_id`, el `status` a nivel de
            función, el número de teléfono y los metadatos del país,
            `lifecycle[]`, `matches[]` y `warnings[]`.
          items:
            type: object
            properties:
              node_id:
                type: string
                description: >-
                  Identificador único de este paso de teléfono en el grafo del
                  flujo.
              status:
                type: string
                description: >-
                  Estado a nivel de función de este paso de verificación de
                  teléfono. Es independiente del `status` de nivel superior de
                  la sesión: una sesión puede alcanzar su decisión global
                  mientras una función concreta sigue en `In Review`.
                enum:
                  - Not Finished
                  - Approved
                  - Declined
                  - In Review
                  - Expired
              phone_number_prefix:
                type: string
                description: Prefijo del código telefónico del país
              phone_number:
                type: string
                description: Número de teléfono sin prefijo de país
              full_number:
                type: string
                description: Número de teléfono completo con prefijo de país
              country_code:
                type: string
                description: Código de país de dos letras (ISO 3166-1 alpha-2)
              country_name:
                type: string
                description: Nombre completo del país
              carrier:
                type: object
                properties:
                  name:
                    type: string
                    description: Nombre del operador telefónico
                  type:
                    type: string
                    description: Tipo de línea telefónica (móvil, fija, etc.)
              is_disposable:
                type: boolean
                description: Si el número de teléfono es de un servicio desechable
              is_virtual:
                type: boolean
                description: Si el número de teléfono es virtual
              verification_method:
                type: string
                description: Método utilizado para verificar el número de teléfono
              verification_attempts:
                type: integer
                description: Número de intentos de verificación realizados
              verified_at:
                type: string
                format: date-time
                description: Marca de tiempo en la que se verificó el teléfono
              lifecycle:
                type: array
                description: >-
                  Lista cronológica de los eventos del ciclo de vida de la
                  verificación de teléfono.
                items:
                  type: object
                  properties:
                    type:
                      type: string
                    timestamp:
                      type: string
                      format: date-time
                    details:
                      type: object
                      nullable: true
                      description: >-
                        Payload específico del evento. Los eventos de envío
                        incluyen `status`, `reason`, `channel` y
                        `actual_channel`. Los eventos de entrega incluyen
                        `channel` y `status`. Los eventos de comprobación del
                        código incluyen `code_tried` y `status`. Los eventos de
                        estado final incluyen `reason`, o `null` cuando no hay
                        ningún motivo que informar (p. ej.,
                        `PHONE_VERIFICATION_APPROVED`).
                      properties:
                        status:
                          type: string
                        reason:
                          type: string
                          nullable: true
                        channel:
                          type: string
                          nullable: true
                        actual_channel:
                          type: string
                          nullable: true
                        code_tried:
                          type: string
                    fee:
                      type: number
              warnings:
                type: array
                description: >-
                  Lista de advertencias relacionadas con la verificación de
                  teléfono
                items:
                  type: object
                  properties:
                    feature:
                      type: string
                      enum:
                        - ID_VERIFICATION
                        - NFC
                        - LIVENESS
                        - FACEMATCH
                        - PROOF_OF_ADDRESS
                        - PHONE
                        - EMAIL
                        - AML
                        - LOCATION
                        - DATABASE_VALIDATION
                        - QUESTIONNAIRE
                        - DOCUMENT_AI
                        - KYB_REGISTRY
                        - KYB_DOCUMENTS
                        - KYB_KEY_PEOPLE
                        - GEOLOCATION
                        - SIGNATURE
                      description: >-
                        La función que generó esta advertencia. El valor
                        identifica el bloque de función al que pertenece la
                        advertencia. El array de advertencias de cada módulo
                        suele usar el valor que corresponde a su módulo (por
                        ejemplo, `PHONE` dentro de
                        `phone_verifications[].warnings`), pero el enum anterior
                        es la referencia para todas las advertencias de
                        funciones del payload de la decisión.
                    risk:
                      type: string
                    additional_data:
                      type: object
                      nullable: true
                    log_type:
                      type: string
                    short_description:
                      type: string
                    long_description:
                      type: string
                    node_id:
                      type: string
                      description: >-
                        El ID del nodo del grafo del flujo que generó esta
                        advertencia
              matches:
                type: array
                description: >-
                  Coincidencias encontradas para este número de teléfono. Cada
                  coincidencia tiene un `source`: `session` (otra sesión de
                  verificación de tu aplicación coincidió con el mismo número;
                  se devuelve con
                  `session_id`/`session_number`/`vendor_data`/`verification_date`)
                  o `list_entry` (el número figura en una lista de permitidos o
                  de bloqueo gestionada por la organización; consulta
                  `/management-api/lists/overview`). Las coincidencias entre
                  sesiones usan un `vendor_data` distinto y se limitan a 5.
                items:
                  type: object
                  properties:
                    session_id:
                      type: string
                      format: uuid
                      nullable: true
                    session_number:
                      type: integer
                      nullable: true
                    vendor_data:
                      type: string
                      nullable: true
                    verification_date:
                      type: string
                      format: date-time
                      nullable: true
                    phone_number:
                      type: string
                    status:
                      type: string
                      nullable: true
                    is_blocklisted:
                      type: boolean
                    api_service:
                      type: string
                      nullable: true
                    source:
                      type: string
                      enum:
                        - session
                        - list_entry
                      description: >-
                        Origen de esta coincidencia. `session` significa que
                        otra sesión de verificación de tu aplicación coincidió
                        con este valor. `list_entry` significa que el valor
                        coincidió con una lista gestionada por la organización
                        (lista de permitidos/lista de bloqueo); consulta la
                        descripción general de listas de la API de gestión en
                        `/management-api/lists/overview` para saber cómo
                        gestionar esas listas.
              phone_intelligence:
                allOf:
                  - $ref: '#/components/schemas/PhoneIntelligence'
                description: >-
                  Señales de inteligencia telefónica. Solo aparecen cuando el
                  complemento de inteligencia telefónica se ejecutó para este
                  número.
              phone_social:
                allOf:
                  - $ref: '#/components/schemas/PhoneSocialFootprint'
                description: >-
                  Huella social del número. Solo está presente cuando se ejecutó
                  el complemento de huella social para este número.
        email_verifications:
          type: array
          nullable: true
          description: >-
            **Array de informes de verificación de correo electrónico**: siempre
            es un array JSON, nunca un objeto `email` singular. Es `null` hasta
            que al menos un paso de correo electrónico haya generado datos. Cada
            elemento es el informe completo, que incluye `node_id`, el `status`
            a nivel de función, la dirección de correo electrónico, los datos de
            filtraciones, `lifecycle[]`, `matches[]` y `warnings[]`.
          items:
            type: object
            properties:
              node_id:
                type: string
                description: >-
                  Identificador único de este paso de correo electrónico en el
                  grafo del flujo.
              status:
                type: string
                description: >-
                  Estado a nivel de función de este paso de verificación de
                  correo electrónico. Es independiente del `status` de nivel
                  superior de la sesión: una sesión puede alcanzar su decisión
                  global mientras una función concreta sigue en `In Review`.
                enum:
                  - Not Finished
                  - Approved
                  - Declined
                  - In Review
                  - Expired
              email:
                type: string
                description: La dirección de correo electrónico que se está verificando
              is_breached:
                type: boolean
                description: >-
                  Indica si el correo electrónico se encontró en filtraciones de
                  datos conocidas
              breaches:
                type: array
                description: >-
                  Lista de filtraciones conocidas en las que se encontró este
                  correo electrónico
                items:
                  type: object
                  properties:
                    name:
                      type: string
                      description: Nombre de la filtración
                    domain:
                      type: string
                      description: Dominio afectado por la filtración
                    logo_path:
                      type: string
                      description: URL del logotipo del servicio afectado por la filtración
                    breach_date:
                      type: string
                      format: date
                      description: Fecha en que se produjo la filtración
                    description:
                      type: string
                      description: Descripción de la infracción
                    is_verified:
                      type: boolean
                      description: Si la filtración está verificada
                    data_classes:
                      type: array
                      description: Tipos de datos expuestos en la filtración
                      items:
                        type: string
                    breach_emails_count:
                      type: integer
                      description: >-
                        Número de direcciones de correo electrónico afectadas
                        por la filtración
              is_disposable:
                type: boolean
                description: >-
                  Indica si el correo electrónico pertenece a un proveedor
                  desechable
              is_undeliverable:
                type: boolean
                description: >-
                  Indica si la dirección de correo electrónico no puede recibir
                  mensajes
              verification_attempts:
                type: integer
                description: >-
                  Número de intentos de verificación para este correo
                  electrónico
              verified_at:
                type: string
                format: date-time
                description: Marca de tiempo en la que se verificó el correo electrónico
              warnings:
                type: array
                description: >-
                  Lista de advertencias relacionadas con la verificación de
                  correo electrónico
                items:
                  type: object
                  properties:
                    feature:
                      type: string
                      enum:
                        - ID_VERIFICATION
                        - NFC
                        - LIVENESS
                        - FACEMATCH
                        - PROOF_OF_ADDRESS
                        - PHONE
                        - EMAIL
                        - AML
                        - LOCATION
                        - DATABASE_VALIDATION
                        - QUESTIONNAIRE
                        - DOCUMENT_AI
                        - KYB_REGISTRY
                        - KYB_DOCUMENTS
                        - KYB_KEY_PEOPLE
                        - GEOLOCATION
                        - SIGNATURE
                      description: >-
                        La función que generó esta advertencia. El valor
                        identifica el bloque de función al que pertenece la
                        advertencia. El array de advertencias de cada módulo
                        suele usar el valor que corresponde a su módulo (por
                        ejemplo, `PHONE` dentro de
                        `phone_verifications[].warnings`), pero el enum anterior
                        es la referencia para todas las advertencias de
                        funciones del payload de la decisión.
                    risk:
                      type: string
                    additional_data:
                      type: object
                      nullable: true
                    log_type:
                      type: string
                    short_description:
                      type: string
                    long_description:
                      type: string
                    node_id:
                      type: string
                      description: >-
                        El ID del nodo del grafo del flujo que generó esta
                        advertencia
              lifecycle:
                type: array
                description: >-
                  Lista cronológica de los eventos del ciclo de vida de la
                  verificación de correo electrónico.
                items:
                  type: object
                  properties:
                    type:
                      type: string
                    timestamp:
                      type: string
                      format: date-time
                    details:
                      type: object
                      nullable: true
                      description: >-
                        Payload específico del evento. Los eventos de envío
                        incluyen `status` y `reason`. Los eventos de
                        comprobación del código incluyen `code_tried` y
                        `status`. Los eventos de estado final incluyen `reason`,
                        o `null` cuando no hay ningún motivo que informar (p.
                        ej., `EMAIL_VERIFICATION_APPROVED`).
                      properties:
                        status:
                          type: string
                        reason:
                          type: string
                          nullable: true
                        code_tried:
                          type: string
                    fee:
                      type: number
              matches:
                type: array
                description: >-
                  Coincidencias encontradas para esta dirección de correo
                  electrónico. Cada coincidencia tiene un `source`: `session`
                  (otra sesión de verificación de tu aplicación coincidió con el
                  mismo correo electrónico; se devuelve con
                  `session_id`/`session_number`/`vendor_data`/`verification_date`)
                  o `list_entry` (el correo electrónico figura en una lista de
                  permitidos o de bloqueo gestionada por la organización;
                  consulta `/management-api/lists/overview`). Las coincidencias
                  entre sesiones usan un `vendor_data` distinto y se limitan a
                  5.
                items:
                  type: object
                  properties:
                    session_id:
                      type: string
                      format: uuid
                      nullable: true
                    session_number:
                      type: integer
                      nullable: true
                    vendor_data:
                      type: string
                      nullable: true
                    verification_date:
                      type: string
                      format: date-time
                      nullable: true
                    email:
                      type: string
                      format: email
                    status:
                      type: string
                      nullable: true
                    is_blocklisted:
                      type: boolean
                    api_service:
                      type: string
                      nullable: true
                    source:
                      type: string
                      enum:
                        - session
                        - list_entry
                      description: >-
                        Origen de esta coincidencia. `session` significa que
                        otra sesión de verificación de tu aplicación coincidió
                        con este valor. `list_entry` significa que el valor
                        coincidió con una lista gestionada por la organización
                        (lista de permitidos/lista de bloqueo); consulta la
                        descripción general de listas de la API de gestión en
                        `/management-api/lists/overview` para saber cómo
                        gestionar esas listas.
              email_intelligence:
                allOf:
                  - $ref: '#/components/schemas/EmailIntelligence'
                description: >-
                  Señales de inteligencia de correo electrónico. Solo están
                  presentes cuando el complemento de inteligencia de correo
                  electrónico se ejecutó para esta dirección.
              email_social:
                allOf:
                  - $ref: '#/components/schemas/EmailSocialFootprint'
                description: >-
                  Huella social de la dirección. Solo está presente cuando se
                  ejecutó el complemento de huella social para esta dirección.
        poa_verifications:
          type: array
          nullable: true
          description: >-
            **Array de informes de Prueba de domicilio (POA)**: siempre es un
            array JSON, nunca un objeto `poa` singular. Es `null` hasta que al
            menos un paso de POA haya generado datos. Cada elemento es el
            informe completo, que incluye `node_id`, el `status` a nivel de
            función, la URL del archivo del documento, el emisor, las fechas, la
            dirección analizada y `warnings[]`.
          items:
            type: object
            properties:
              node_id:
                type: string
                description: Identificador único de este paso POA en el grafo del flujo.
              status:
                type: string
                description: >-
                  Estado a nivel de función de este paso de prueba de domicilio.
                  Es independiente del `status` de nivel superior de la sesión:
                  una sesión puede alcanzar su decisión global mientras una
                  función concreta sigue en `In Review`.
                enum:
                  - Not Finished
                  - Approved
                  - Declined
                  - In Review
                  - Resub Requested
              document_file:
                type: string
                format: uri
                description: URL del documento de prueba de domicilio
              issuing_state:
                type: string
                description: Código de país de dos letras del estado emisor
              document_type:
                type: string
                description: Tipo de documento de prueba de domicilio
              document_subtype:
                type: string
                nullable: true
                description: >-
                  Clasificación más específica del documento de prueba de
                  domicilio dentro de su `document_type`, cuando se detectó una.
                  `null` en caso contrario.
              document_language:
                type: string
                description: Código de idioma del documento
              document_metadata:
                type: object
                properties:
                  file_size:
                    type: integer
                    description: Tamaño del documento
                  content_type:
                    type: string
                    description: Tipo de contenido del documento
                  creation_date:
                    type: string
                    format: date
                    description: Fecha de creación del documento
                  modified_date:
                    type: string
                    format: date
                    description: Fecha de modificación del documento
                  overlay_manipulation:
                    type: object
                    nullable: true
                    description: >-
                      Análisis forense del PDF ante sospecha de manipulación
                      mediante texto superpuesto. Null cuando no se encontraron
                      indicios de manipulación por superposición o el documento
                      no era un PDF.
                    properties:
                      detected:
                        type: boolean
                        description: >-
                          Indica si se detectaron indicios de manipulación del
                          texto superpuesto.
                      analyzed:
                        type: boolean
                        description: Si se pudo analizar el PDF.
                      signals:
                        type: array
                        items:
                          type: string
                        description: >-
                          Señales forenses que se activaron, como
                          duplicate_font_subset o glyph_fragmentation.
                      manipulated_regions:
                        type: array
                        description: >-
                          Zonas presuntamente manipuladas, en coordenadas de
                          página del PDF.
                        items:
                          type: object
                          properties:
                            page:
                              type: integer
                            x:
                              type: number
                            'y':
                              type: number
                            width:
                              type: number
                            height:
                              type: number
                            page_width:
                              type: number
                            page_height:
                              type: number
                  creator:
                    type: string
                    nullable: true
                    description: >-
                      Aplicación creadora registrada en los metadatos del
                      documento.
                  producer:
                    type: string
                    nullable: true
                    description: Software productor registrado en los metadatos del PDF.
                  software:
                    type: string
                    nullable: true
                    description: >-
                      Software de edición o procesamiento registrado en los
                      metadatos del archivo.
                  encryption:
                    type: string
                    nullable: true
                    description: Esquema de cifrado del documento, cuando está cifrado.
                  is_signed:
                    type: boolean
                    nullable: true
                    description: Si el PDF incluye una firma digital.
                  is_tampered:
                    type: boolean
                    nullable: true
                    description: >-
                      Indica si la validación de la firma señala que el archivo
                      se modificó después de firmarse.
                  signature_info:
                    type: object
                    nullable: true
                    description: Detalles de las firmas digitales, cuando están presentes.
                  exif_original_date:
                    type: string
                    nullable: true
                    description: Fecha de captura original EXIF, para imágenes subidas.
                  exif_digitized_date:
                    type: string
                    nullable: true
                    description: Fecha de digitalización EXIF, para imágenes subidas.
                  processed_by_known_editor:
                    type: boolean
                    nullable: true
                    description: >-
                      Si los metadatos del archivo indican que lo procesó un
                      editor de documentos conocido.
                  has_different_creation_mod_date:
                    type: boolean
                    nullable: true
                    description: >-
                      Si las fechas de creación y de modificación difieren, una
                      señal habitual de manipulación.
                description: >-
                  Metadatos forenses del archivo extraídos del documento de
                  prueba de domicilio subido. Siempre contiene las claves
                  siguientes (los valores son `null` cuando no aplican, p. ej.,
                  las fechas EXIF en los PDF). Es `null` cuando no se pudo
                  extraer ningún metadato.
                nullable: true
              issuer:
                type: string
                description: Nombre del emisor del documento
              issue_date:
                type: string
                format: date
                description: Fecha de emisión del documento
              expiration_date:
                type: string
                format: date
                nullable: true
                description: Fecha de caducidad del documento, si está disponible
              poa_address:
                type: string
                description: Dirección sin procesar del documento de prueba de domicilio
              poa_formatted_address:
                type: string
                description: Dirección formateada del documento de prueba de domicilio
              poa_parsed_address:
                type: object
                properties:
                  address_type:
                    type: string
                    description: Tipo de dirección (calle, avenida, etc.)
                  street_1:
                    type: string
                    description: Dirección principal
                  street_2:
                    type: string
                    nullable: true
                    description: Dirección secundaria
                  city:
                    type: string
                    description: Nombre de la ciudad
                  region:
                    type: string
                    description: Nombre de la región o del estado
                  country:
                    type: string
                    description: Código de país de dos letras
                  postal_code:
                    type: string
                    description: Código postal
                  document_location:
                    type: object
                    properties:
                      latitude:
                        type: number
                        description: Coordenada de latitud
                      longitude:
                        type: number
                        description: Coordenada de longitud
              name_on_document:
                type: string
                nullable: true
                description: >-
                  Nombre del titular de la cuenta o destinatario extraído del
                  documento de prueba de domicilio, usado para la coincidencia
                  de nombres. `null` cuando no se pudo extraer ningún nombre.
              name_match_score_expected_details:
                type: number
                nullable: true
                description: >-
                  Puntuación de similitud (0-100) entre `name_on_document` y el
                  nombre esperado proporcionado al crear la sesión. `null`
                  cuando falta alguno de los dos.
              name_match_score_id_verification:
                type: number
                nullable: true
                description: >-
                  Puntuación de similitud (0-100) entre `name_on_document` y el
                  nombre extraído por el paso de verificación de identidad.
                  `null` cuando falta alguno de los dos.
              expected_details_address:
                type: string
                nullable: true
                description: Dirección sin procesar esperada para la verificación
              expected_details_formatted_address:
                type: string
                nullable: true
                description: Dirección formateada esperada para la verificación
              expected_details_parsed_address:
                type: object
                description: >-
                  Datos desglosados de la dirección esperados para la
                  verificación
              extra_fields:
                type: object
                description: >-
                  Datos bancarios y de contacto adicionales extraídos del
                  documento.
                properties:
                  bank_account_number:
                    type: string
                    nullable: true
                  bank_iban:
                    type: string
                    nullable: true
                  bank_sort_code:
                    type: string
                    nullable: true
                  bank_routing_number:
                    type: string
                    nullable: true
                  bank_swift_bic:
                    type: string
                    nullable: true
                  bank_branch_name:
                    type: string
                    nullable: true
                  bank_branch_address:
                    type: string
                    nullable: true
                  document_phone_number:
                    type: string
                    nullable: true
                  additional_names:
                    type: array
                    items:
                      type: string
              extra_files:
                type: array
                items:
                  type: string
                  format: uri
                description: Archivos adicionales de prueba de domicilio
              warnings:
                type: array
                items:
                  type: object
                  properties:
                    feature:
                      type: string
                      enum:
                        - ID_VERIFICATION
                        - NFC
                        - LIVENESS
                        - FACEMATCH
                        - PROOF_OF_ADDRESS
                        - PHONE
                        - EMAIL
                        - AML
                        - LOCATION
                        - DATABASE_VALIDATION
                        - QUESTIONNAIRE
                        - DOCUMENT_AI
                        - KYB_REGISTRY
                        - KYB_DOCUMENTS
                        - KYB_KEY_PEOPLE
                        - GEOLOCATION
                        - SIGNATURE
                      description: >-
                        La función que generó esta advertencia. El valor
                        identifica el bloque de función al que pertenece la
                        advertencia. El array de advertencias de cada módulo
                        suele usar el valor que corresponde a su módulo (por
                        ejemplo, `PHONE` dentro de
                        `phone_verifications[].warnings`), pero el enum anterior
                        es la referencia para todas las advertencias de
                        funciones del payload de la decisión.
                    risk:
                      type: string
                    additional_data:
                      type: object
                      nullable: true
                    log_type:
                      type: string
                    short_description:
                      type: string
                    long_description:
                      type: string
                    node_id:
                      type: string
                      description: >-
                        El ID del nodo del grafo del flujo que generó esta
                        advertencia
              detected_codes:
                type: array
                description: >-
                  Códigos QR y códigos de barras detectados en todas las páginas
                  procesadas del documento. Vacío cuando no se encuentra
                  ninguno. Un código QR localizado pero que no se puede
                  decodificar tiene `parsed_payload: null`.
                items:
                  $ref: '#/components/schemas/DocumentAIDetectedCode'
              address_validation:
                allOf:
                  - $ref: '#/components/schemas/AddressValidationResult'
                nullable: true
                description: >-
                  Validación de dirección de la dirección de esta prueba de
                  domicilio: si existe y su forma normalizada, tal como se leyó
                  en el documento (una corrección posterior de `poa_address` no
                  la vuelve a ejecutar). Presente cuando este paso de Prueba de
                  domicilio habilitó el complemento de Validación de dirección y
                  el archivo subido superó las comprobaciones del documento;
                  `null` en caso contrario.
        document_ai_documents:
          type: array
          nullable: true
          description: >-
            **Informes de Document AI agrupados por nodo del flujo**: siempre es
            un array JSON, nunca un objeto individual. Vale `null` hasta que al
            menos un paso de Document AI haya generado datos. Solo está presente
            cuando `session_kind = user`. Cada elemento es un grupo de nodo con
            un `status` agregado, el `node_id`, un array `items[]` con los
            resultados de cada documento (datos extraídos indexados por la clave
            de campo configurada) y `warnings`.
          items:
            type: object
            description: Resultados de Document AI agrupados por nodo del flujo.
            properties:
              status:
                type: string
                description: >-
                  Estado agregado de Document AI para este nodo, consolidado a
                  partir de sus `items[]`.
                enum:
                  - Approved
                  - Declined
                  - In Review
                  - Not Finished
              node_id:
                type: string
                nullable: true
                description: >-
                  Identificador único de este paso de Document AI en el grafo
                  del flujo.
              items:
                type: array
                items:
                  type: object
                  properties:
                    uuid:
                      type: string
                      format: uuid
                    node_id:
                      type: string
                      nullable: true
                      description: Nodo del grafo del flujo que generó este documento.
                    document_key:
                      type: string
                      description: >-
                        Clave del documento de Document AI configurado al que
                        corresponde este archivo.
                    original_filename:
                      type: string
                      nullable: true
                      description: Nombre del archivo tal como lo subió el usuario.
                    file_size:
                      type: integer
                      nullable: true
                      description: Tamaño del archivo en bytes.
                    file_url:
                      type: string
                      format: uri
                      nullable: true
                      description: Enlace prefirmado de corta duración al archivo subido.
                    status:
                      type: string
                      enum:
                        - Approved
                        - Declined
                        - In Review
                        - Not Finished
                      description: Estado de Document AI por documento.
                    extracted_data:
                      type: object
                      additionalProperties: true
                      nullable: true
                      description: >-
                        Valores extraídos por Document AI, indexados por la
                        `key` del campo configurado. Cada valor es una cadena,
                        un número o `null`.
                    detected_codes:
                      type: array
                      description: >-
                        Códigos QR y códigos de barras detectados en todas las
                        páginas procesadas. Vacío cuando no se encuentra
                        ninguno. Un código QR localizado pero que no se puede
                        decodificar tiene `parsed_payload: null`.
                      items:
                        $ref: '#/components/schemas/DocumentAIDetectedCode'
                    fields:
                      type: array
                      description: >-
                        Los campos de extracción configurados para este
                        documento.
                      items:
                        type: object
                        properties:
                          key:
                            type: string
                            description: >-
                              Clave estable del campo que se usa como clave en
                              `extracted_data`.
                          name:
                            type: string
                            description: Nombre legible del campo.
                          instruction:
                            type: string
                            description: >-
                              Instrucción de extracción que se muestra al
                              modelo.
                          type:
                            type: string
                            enum:
                              - text
                              - number
                              - date
                            description: Tipo de valor esperado del campo extraído.
                          required:
                            type: boolean
                            description: Whether this field is required.
                    document_metadata:
                      type: object
                      nullable: true
                      description: >-
                        Metadatos forenses del archivo extraídos del documento
                        subido (p. ej., `is_tampered`). Es `null` cuando no se
                        pudo extraer nada.
                    cross_check_result:
                      type: object
                      nullable: true
                      description: >-
                        Contraste de los campos extraídos del documento con
                        otros datos de la sesión. `null` cuando no se realizó
                        ningún contraste.
                    created_at:
                      type: string
                      format: date-time
              warnings:
                type: array
                nullable: true
                items:
                  type: object
                description: >-
                  Registros de advertencias generados para este nodo de Document
                  AI.
        questionnaire_responses:
          type: array
          nullable: true
          description: >-
            **Array de informes de respuestas de cuestionarios**: siempre es un
            array JSON, nunca un objeto `questionnaire` singular. Es `null`
            hasta que al menos un paso de cuestionario haya generado datos. Cada
            elemento es el informe completo, que incluye `node_id`, los
            metadatos del cuestionario, las secciones con elementos de
            formulario y las respuestas del usuario.
          items:
            type: object
            properties:
              node_id:
                type: string
                description: >-
                  Identificador único de este paso de cuestionario en el grafo
                  del flujo.
              questionnaire_id:
                type: string
                description: Identificador único del cuestionario
              title:
                type: string
                description: Título del cuestionario
              description:
                type: string
                description: Descripción del cuestionario
              languages:
                type: array
                items:
                  type: string
                description: Idiomas admitidos
              default_language:
                type: string
                description: Idioma predeterminado
              is_active:
                type: boolean
                description: Si el cuestionario está activo
              is_simple_questionnaire:
                type: boolean
                description: >-
                  Si el cuestionario es un formulario lineal simple (sin grafo
                  de ramificación).
              questionnaire_group_id:
                type: string
                format: uuid
                nullable: true
                description: >-
                  Identificador estable del grupo del cuestionario a lo largo de
                  sus versiones.
              version:
                type: integer
                nullable: true
                description: Número de versión del cuestionario que se respondió.
              published_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Marca de tiempo en la que se publicó esta versión del
                  cuestionario.
              sections:
                type: array
                items:
                  type: object
                  properties:
                    title:
                      type: string
                      nullable: true
                      description: Título de la sección
                    description:
                      type: string
                      nullable: true
                      description: Descripción de la sección
                    items:
                      type: array
                      items:
                        type: object
                        properties:
                          uuid:
                            type: string
                            description: Identificador único del elemento
                          value:
                            type: string
                            nullable: true
                            description: >-
                              Identificador de nodo estable de este elemento de
                              formulario dentro del grafo del cuestionario.
                          element_type:
                            type: string
                            description: Tipo del elemento del cuestionario
                          is_required:
                            type: boolean
                            description: Si el elemento es obligatorio
                          title:
                            type: string
                            description: Título del elemento
                          description:
                            type: string
                            nullable: true
                            description: Descripción del elemento
                          placeholder:
                            type: string
                            nullable: true
                            description: Texto de marcador de posición
                          choices:
                            type: array
                            nullable: true
                            items:
                              type: object
                              properties:
                                label:
                                  type: string
                                value:
                                  type: string
                                requires_text_input:
                                  type: boolean
                                  description: >-
                                    Si esta opción requiere introducir texto
                                    adicional
                                  nullable: true
                              required:
                                - label
                                - value
                            description: >-
                              Opciones para elementos desplegables o de opción
                              única
                          max_files:
                            type: integer
                            description: Número máximo de archivos permitidos
                            nullable: true
                          answer:
                            type: object
                            description: Respuesta proporcionada para el elemento
                            properties:
                              value:
                                type: string
                                nullable: true
                              text:
                                type: string
                                nullable: true
                              files:
                                type: array
                                items:
                                  type: string
                                nullable: true
                          required_if:
                            type: object
                            nullable: true
                            description: >-
                              Regla de obligatoriedad condicional, cuando el
                              elemento solo es obligatorio para determinadas
                              respuestas.
                          repeatable_config:
                            type: object
                            nullable: true
                            description: >-
                              Configuración de los grupos de elementos
                              repetibles, cuando corresponda.
                        required:
                          - uuid
                          - value
                          - element_type
                          - is_required
                          - title
              status:
                type: string
                description: Estado del cuestionario
        bank_verifications:
          type: array
          nullable: true
          description: >-
            Resultados de Verificación bancaria, un elemento por cada paso de
            Verificación bancaria, para Verificación de usuarios y Verificación
            de empresas. `null` hasta que un paso produzca uno. El `method` de
            cada elemento indica cómo se verificó la cuenta: `open_banking`
            (inicio de sesión en el banco) o `account_lookup` (comprobación de
            la cuenta), o una alternativa `statement` o `microdeposits`, y
            `none` cuando la persona continuó sin banco antes de que se evaluara
            algún intento (`continued_without_bank`). Consulta [Métodos de
            verificación
            bancaria](/es/core-technology/bank-verification/verification-methods).
            La Verificación bancaria aún no está habilitada en producción, por
            lo que este campo sigue siendo `null` en las sesiones de producción
            hasta que lo esté.
          items:
            $ref: '#/components/schemas/BankVerificationResult'
        signatures:
          type: array
          description: >-
            Resultados de la firma electrónica, un elemento por firmante y paso
            de firma, para la Verificación de usuarios y la Verificación de
            empresas. Solo está presente cuando el flujo tiene un paso de Firma
            electrónica; es un array vacío hasta que un firmante llega a él.
            Consulta el [informe de firma
            electrónica](/es/core-technology/electronic-signature/report-electronic-signature).
          items:
            $ref: '#/components/schemas/SignatureResult'
        aml_screenings:
          type: array
          nullable: true
          description: >-
            **Array de informes de análisis AML**: siempre es un array JSON,
            nunca un objeto `aml` singular. Es `null` hasta que al menos un paso
            de AML haya generado datos. Cada elemento es el informe completo,
            que incluye `node_id`, el `status` a nivel de función, `total_hits`,
            `entity_type`, `hits[]`, `score`, `screened_data`,
            `is_ongoing_monitoring_enabled` y `warnings[]`.
          items:
            $ref: '#/components/schemas/AMLScreening'
        ip_analyses:
          type: array
          nullable: true
          description: >-
            **Array de informes de Análisis de dispositivo e IP**: siempre es un
            array JSON, nunca un objeto `ip_analysis` singular. Es `null` hasta
            que al menos un paso de análisis de IP haya generado datos. Cada
            elemento es el informe completo, que incluye `node_id`, el `status`
            a nivel de función, los datos de IP y geolocalización, la huella
            digital del dispositivo y `warnings[]`. Las entradas con `(node_id,
            ip_address, device_fingerprint)` duplicados se deduplican en el
            servidor.
          items:
            type: object
            properties:
              node_id:
                type: string
                description: >-
                  Identificador único de este paso de Análisis de dispositivo e
                  IP en el grafo del flujo.
              status:
                type: string
                description: >-
                  Estado a nivel de función de esta entrada de análisis de
                  dispositivo e IP. Es independiente del `status` de nivel
                  superior de la sesión: una sesión puede alcanzar su decisión
                  global mientras una función concreta sigue en `In Review`.
                enum:
                  - Not Finished
                  - Approved
                  - Declined
                  - In Review
                  - Resub Requested
              device_brand:
                type: string
                description: Marca del dispositivo utilizado
              device_model:
                type: string
                description: Modelo del dispositivo utilizado
              browser_family:
                type: string
                description: Familia del navegador utilizada
              os_family:
                type: string
                description: Familia del sistema operativo
              platform:
                type: string
                description: Tipo de plataforma (móvil, escritorio, etc.)
              device_fingerprint:
                type: string
                nullable: true
                description: Identificador único de la huella del dispositivo
              ip_country:
                type: string
                description: País detectado a partir de la IP
              ip_country_code:
                type: string
                description: Código de país de dos letras obtenido de la IP
              ip_state:
                type: string
                description: Estado o región detectado a partir de la IP
              ip_city:
                type: string
                description: Ciudad detectada a partir de la IP
              latitude:
                type: number
                description: Coordenada de latitud de la ubicación de la IP
              longitude:
                type: number
                description: Coordenada de longitud de la ubicación de la IP
              ip_address:
                type: string
                description: Dirección IP
              isp:
                type: string
                nullable: true
                description: Proveedor de servicios de Internet
              organization:
                type: string
                nullable: true
                description: Organización asociada a la IP
              is_vpn_or_tor:
                type: boolean
                description: Indica si la IP procede de una red VPN o Tor
              is_data_center:
                type: boolean
                description: Indica si la IP procede de un centro de datos
              time_zone:
                type: string
                description: Zona horaria detectada a partir de la IP
              time_zone_offset:
                type: string
                description: Desfase de zona horaria
              ip:
                type: object
                description: >-
                  Geolocalización IP de esta entrada más las distancias
                  ortodrómicas (km) hasta la dirección del documento de
                  identidad y la dirección del documento de prueba de domicilio.
                  Las distancias son `null` cuando alguno de los dos lados no
                  tiene una ubicación resoluble.
                properties:
                  location:
                    type: object
                    nullable: true
                    properties:
                      latitude:
                        type: number
                        example: 41.2706327
                      longitude:
                        type: number
                        example: 1.9770097
                    description: Coordenadas, o `null` cuando no están disponibles.
                  distance_from_id_document:
                    type: number
                    nullable: true
                    example: 23.4
                  distance_from_poa_document:
                    type: number
                    nullable: true
                    example: 12.3
              id_document:
                type: object
                description: >-
                  Ubicación extraída de la dirección del documento de identidad,
                  más las distancias (km) a la geolocalización de la IP y a la
                  dirección del documento de prueba de domicilio. `location` es
                  `null` cuando no se pudo geocodificar ninguna dirección del
                  documento.
                properties:
                  location:
                    type: object
                    nullable: true
                    properties:
                      latitude:
                        type: number
                        example: 41.2706327
                      longitude:
                        type: number
                        example: 1.9770097
                    description: Coordenadas, o `null` cuando no están disponibles.
                  distance_from_ip:
                    type: number
                    nullable: true
                    example: 23.4
                  distance_from_poa_document:
                    type: number
                    nullable: true
                    example: 18.7
              poa_document:
                type: object
                description: >-
                  Ubicación extraída del documento de prueba de domicilio, más
                  las distancias (km) a la geolocalización de la IP y a la
                  dirección del documento de identidad. `location` es `null`
                  cuando la sesión no tiene paso de prueba de domicilio o no se
                  pudo geocodificar la dirección.
                properties:
                  location:
                    type: object
                    nullable: true
                    properties:
                      latitude:
                        type: number
                        example: 41.2706327
                      longitude:
                        type: number
                        example: 1.9770097
                    description: Coordenadas, o `null` cuando no están disponibles.
                  distance_from_ip:
                    type: number
                    nullable: true
                    example: 12.3
                  distance_from_id_document:
                    type: number
                    nullable: true
                    example: 18.7
              warnings:
                type: array
                items:
                  type: object
                  properties:
                    feature:
                      type: string
                      enum:
                        - ID_VERIFICATION
                        - NFC
                        - LIVENESS
                        - FACEMATCH
                        - PROOF_OF_ADDRESS
                        - PHONE
                        - EMAIL
                        - AML
                        - LOCATION
                        - DATABASE_VALIDATION
                        - QUESTIONNAIRE
                        - DOCUMENT_AI
                        - KYB_REGISTRY
                        - KYB_DOCUMENTS
                        - KYB_KEY_PEOPLE
                        - GEOLOCATION
                        - SIGNATURE
                      description: >-
                        La función que generó esta advertencia. El valor
                        identifica el bloque de función al que pertenece la
                        advertencia. El array de advertencias de cada módulo
                        suele usar el valor que corresponde a su módulo (por
                        ejemplo, `PHONE` dentro de
                        `phone_verifications[].warnings`), pero el enum anterior
                        es la referencia para todas las advertencias de
                        funciones del payload de la decisión.
                    risk:
                      type: string
                    additional_data:
                      type: object
                      nullable: true
                    log_type:
                      type: string
                    short_description:
                      type: string
                    long_description:
                      type: string
                    node_id:
                      type: string
                      description: >-
                        El ID del nodo del grafo del flujo que generó esta
                        advertencia
              matches:
                type: array
                description: >-
                  Coincidencias entre sesiones encontradas para la dirección IP
                  o la identidad del dispositivo de esta entrada. Cada
                  coincidencia es otra sesión de verificación de tu aplicación
                  (`source` siempre es `session`) que comparte el mismo valor.
                  Siempre pertenece a un usuario de tu plataforma /
                  `vendor_data` distinto del de la sesión actual. Hay un máximo
                  de 5 por recopilador; `device_fingerprint` suma dos
                  recopiladores con límites independientes, por lo que puede
                  haber hasta 10 entradas. Cada elemento incluye `match_source`,
                  `confidence`, `match_mode`, `device_info` y `location_info`.
                  Las claves `recovery_similarity`, `tls_ja4_corroborated` y
                  `recovery_gate_reason` solo están presentes cuando
                  `match_source` es `recovered_high`.
                items:
                  type: object
                  additionalProperties: false
                  properties:
                    session_id:
                      type: string
                      format: uuid
                      description: ID de sesión de la sesión coincidente.
                    session_number:
                      type: integer
                      description: Número secuencial de la sesión coincidente.
                    vendor_data:
                      type: string
                      nullable: true
                      description: >-
                        `vendor_data` de la sesión coincidente: siempre distinto
                        del usuario del proveedor de la sesión actual.
                    verification_date:
                      type: string
                      format: date-time
                      nullable: true
                      description: >-
                        Fecha de creación de la sesión coincidente
                        (`YYYY-MM-DDTHH:MM:SSZ`).
                    match_type:
                      type: string
                      enum:
                        - ip_address
                        - device_fingerprint
                      description: >-
                        Si la coincidencia se produjo por dirección IP o por
                        huella digital del dispositivo
                    match_source:
                      type: string
                      enum:
                        - ip_address
                        - persistent_id
                        - legacy_fp
                        - recovered_high
                      description: >-
                        Cómo se obtuvo esta coincidencia: `ip_address`
                        (dirección IP compartida: coubicación en la red, no una
                        afirmación sobre la identidad del dispositivo),
                        `persistent_id` (identificador persistente del
                        dispositivo almacenado, coincidencia exacta),
                        `legacy_fp` (hash heredado de huella del dispositivo
                        `didit-fp-*`) o `recovered_high` (resultado de
                        recuperación aproximada de huella con alta confianza).
                        Los candidatos de recuperación con menor confianza
                        aparecen solo como advertencias de riesgo, nunca en este
                        array.
                    matched_value:
                      type: string
                      nullable: true
                      description: >-
                        El valor que coincidió: la dirección IP compartida, el
                        identificador persistente del dispositivo o el hash de
                        huella digital heredado o, en el caso de
                        `recovered_high`, el UUID del dispositivo recuperado.
                    status:
                      type: string
                      description: Estado del ciclo de vida de la sesión coincidente.
                    is_blocklisted:
                      type: boolean
                      description: >-
                        Si el valor coincidente está en una lista de bloqueo.
                        Actualmente siempre es `false` para las coincidencias de
                        dispositivo/IP.
                    api_service:
                      type: string
                      nullable: true
                      description: >-
                        Servicio de API independiente de la sesión coincidente;
                        `null` para sesiones de flujo de verificación
                        (workflow).
                    source:
                      type: string
                      enum:
                        - session
                      description: >-
                        Siempre `session` para las coincidencias de
                        dispositivo/IP: cada coincidencia es otra sesión de
                        verificación de tu aplicación.
                    device_info:
                      type: object
                      description: >-
                        Detalles del dispositivo observados en la sesión
                        coincidente.
                      properties:
                        device_brand:
                          type: string
                          nullable: true
                        device_model:
                          type: string
                          nullable: true
                        browser_family:
                          type: string
                          nullable: true
                        os_family:
                          type: string
                          nullable: true
                        platform:
                          type: string
                          nullable: true
                        device_fingerprint:
                          type: string
                          nullable: true
                    location_info:
                      type: object
                      description: >-
                        Detalles de red y geolocalización observados en la
                        sesión coincidente.
                      properties:
                        ip_address:
                          type: string
                          nullable: true
                        ip_country:
                          type: string
                          nullable: true
                        ip_country_code:
                          type: string
                          nullable: true
                        ip_state:
                          type: string
                          nullable: true
                        ip_city:
                          type: string
                          nullable: true
                        is_vpn_or_tor:
                          type: boolean
                        is_data_center:
                          type: boolean
                    confidence:
                      type: number
                      minimum: 0
                      maximum: 1
                      description: >-
                        Confianza de la identificación del lado del servidor,
                        calculada como `1 - P(false positive)`: `1.0` para
                        coincidencias deterministas (`persistent_id`, o
                        `recovered_high` basado en hardware), `0.5` para
                        `legacy_fp`, `0.0` para `ip_address` (solo coubicación)
                        y un valor inferior a `1.0` ajustado según la
                        corroboración para las coincidencias recuperadas
                        probabilísticas (más alto cuando la huella TLS JA4 y el
                        país de la IP coinciden de forma independiente).
                    match_mode:
                      type: string
                      enum:
                        - deterministic
                        - probabilistic
                        - co_occurrence
                      description: >-
                        Clase de evidencia de la coincidencia: `deterministic`
                        (identificador exacto almacenado o anclado en el
                        hardware que no puede coincidir entre dispositivos
                        físicos distintos), `probabilistic` (evidencia difusa de
                        huella digital) o `co_occurrence` (solo red compartida,
                        sin afirmar la identidad del dispositivo).
                    recovery_similarity:
                      type: number
                      description: >-
                        Similitud coseno de la coincidencia por recuperación de
                        huella, redondeada a 4 decimales. Solo está presente
                        cuando `match_source` es `recovered_high`.
                    tls_ja4_corroborated:
                      type: boolean
                      description: >-
                        Si las huellas TLS JA4 de las dos observaciones
                        coinciden: una señal observada por el servidor que el
                        navegador no puede falsificar. Solo está presente cuando
                        `match_source` es `recovered_high`.
                    recovery_gate_reason:
                      type: string
                      description: >-
                        Por qué la coincidencia de recuperación superó el filtro
                        estricto contra falsos positivos: `hardware_root_match`
                        (un identificador de dispositivo anclado al hardware
                        coincidió exactamente) o, en configuraciones que admiten
                        evidencia solo de sondeo,
                        `exact_composite_plus_<n>_families` /
                        `very_high_similarity_plus_<n>_families`. Solo está
                        presente cuando `match_source` es `recovered_high`.
              browser_version:
                type: string
                nullable: true
              os_version:
                type: string
                nullable: true
              user_agent:
                type: string
                nullable: true
                description: La cadena de user agent del navegador.
              accept_language:
                type: string
                nullable: true
                description: El encabezado `Accept-Language` que envió el navegador.
              session_identifier:
                type: string
                nullable: true
                description: >-
                  Identificador de la sesión de navegación en la que se realizó
                  la verificación.
              session_age_ms:
                type: integer
                nullable: true
                description: >-
                  Antigüedad de esa sesión de navegación en milisegundos cuando
                  se ejecutó el paso.
              coords_accuracy:
                type: number
                nullable: true
                description: >-
                  Radio de precisión, en metros, de las coordenadas que informó
                  el dispositivo.
              raw_device_data:
                type: object
                nullable: true
                additionalProperties: true
                description: Señales del dispositivo sin procesar recopiladas para el paso.
        geolocation_checks:
          type: array
          nullable: true
          description: >-
            **Array de resultados de verificación de ubicación**, uno por cada
            paso de verificación de ubicación: el intento aceptado de ese paso.
            Es `null` hasta que un paso de verificación de ubicación haya
            generado datos. Los intentos anteriores del mismo paso están en
            `geolocation_attempts`.
          items:
            $ref: '#/components/schemas/GeolocationCheck'
        geolocation_attempts:
          type: array
          nullable: true
          description: >-
            Todos los intentos de cada paso de verificación de ubicación de esta
            sesión, del más antiguo al más reciente. Se omiten los intentos
            sustituidos por un reenvío. Un flujo de verificación (workflow) que
            oculta `geolocation_checks` mediante sus atributos de respuesta
            también oculta esta lista.
          items:
            $ref: '#/components/schemas/GeolocationAttempt'
        database_validations:
          type: array
          nullable: true
          description: >-
            **Array de informes de Validación de base de datos**: siempre es un
            array JSON, nunca un objeto `database_validation` singular. Vale
            `null` hasta que al menos un paso de validación de base de datos
            haya generado datos. Cada elemento es el informe completo, que
            incluye `node_id`, el `status` a nivel de función, `screened_data`,
            las `validations[]` por servicio (cada una con su `source_data` del
            registro) y `warnings[]`. Los campos `screened_data` y `source_data`
            varían según el país:


            **ARG (Argentina)**: screened_data: {document_number, selfie,
            gender, first_name, last_name}. source_data: {identification_number,
            first_name, last_name, full_name, date_of_birth, date_of_death,
            tax_id, tax_id_type, face_match_score, sit_1_since, banks,
            last_position, highest_position, rejected_checks}. Usa la validación
            biométrica de coincidencia facial de RENAPER. El género se infiere
            automáticamente a partir del análisis facial o del nombre de pila
            cuando no figura en el documento (por ejemplo, en licencias de
            conducir)


            **BOL (Bolivia)**: screened_data: {document_number, date_of_birth,
            first_name, last_name}. source_data: {identification_number,
            first_name, last_name, full_name, date_of_birth, gender}


            **BRA (Brasil)**: screened_data: {tax_number, first_name, last_name,
            date_of_birth}. source_data siempre incluye {identification_number,
            first_name, last_name, date_of_birth, lgpd_minor, minor_under_18,
            minor_under_16} en las coincidencias de CPF correctas. Las consultas
            exitosas de adultos establecen esos indicadores en false. El
            servicio Consulta CPF de la Receita Federal puede devolver HTTP 422
            (menor de 18 años) o 451 (menor de 16 años) con datos retenidos por
            la LGPD; en esos casos, source_data establece los indicadores de
            menor en true según corresponda, incluye el estado HTTP de origen y
            la validación a nivel de campo es no_match. Consulta la sección de
            Brasil de la referencia de códigos de resultado de Validación de
            base de datos para ver la lista completa de códigos.


            **CHL (Chile)**: screened_data: {personal_number, first_name,
            last_name, date_of_birth}. source_data: {identification_number,
            first_name, last_name, date_of_birth, gender}


            **COL (Colombia)**: screened_data: {document_number, document_type,
            first_name, last_name}. source_data: {identification_number,
            first_name, last_name, full_name, date_of_birth, document_type}


            **CRI (Costa Rica)**: screened_data: {personal_number, first_name,
            last_name}. source_data: {identification_number, first_name,
            last_name, full_name}


            **DOM (República Dominicana)**: screened_data: {personal_number}.
            source_data: {identification_number} (solo devuelve válido/no
            válido)


            **ECU (Ecuador)**: screened_data: {personal_number, first_name,
            last_name}. source_data: {identification_number, first_name,
            last_name, street, formatted_address, gender, nationality,
            education, marital_status, spouse, mother_name, father_name,
            profession}


            **ESP (España)**: screened_data: {personal_number, document_type,
            expiration_date, first_name, last_name}. source_data:
            {identification_number, first_name, last_name, full_name,
            document_type, expiration_date}


            **GTM (Guatemala)**: screened_data: {document_number, first_name,
            last_name}. source_data: {identification_number, first_name,
            last_name, full_name}


            **HND (Honduras)**: screened_data: {document_number, first_name,
            last_name}. source_data: {identification_number, first_name,
            last_name, full_name}


            **MEX (México)**: screened_data: {personal_number (CURP),
            first_name, last_name}. source_data: {identification_number,
            first_name, last_name, full_name, date_of_birth, gender,
            nationality, curp_status, state_of_birth, doc_probatorio,
            registration_year, registration_state, registration_municipality,
            num_acta, crip, issuing_state_code, foreign_registry_number,
            folio_carta, folio_certificado}. Usa el registro civil de RENAPO.
            Para MEX también está disponible un servicio independiente de
            comprobación de vigencia del INE como validación adicional
            individual.


            **PAN (Panamá)**: screened_data: {personal_number, selfie}.
            source_data: {identification_number}. Usa la validación biométrica
            de SIB


            **PER (Perú)**: screened_data: {personal_number (DNI), first_name,
            last_name}. source_data: {identification_number, first_name,
            last_name, paternal_name, maternal_name, verification_number,
            verification_letter}


            **PRY (Paraguay)**: screened_data: {document_number, first_name,
            last_name}. source_data: {identification_number, first_name,
            last_name, full_name}


            **SLV (El Salvador)**: screened_data: {document_number,
            date_of_birth, first_name, last_name}. source_data:
            {identification_number, first_name, last_name, full_name}


            **URY (Uruguay)**: screened_data: {personal_number, date_of_birth,
            first_name, last_name}. source_data: {identification_number,
            first_name, last_name, full_name}


            **VEN (Venezuela)**: screened_data: {document_number, first_name,
            last_name}. source_data: {identification_number, first_name,
            last_name, full_name, gender, date_of_birth, document_type}
          items:
            type: object
            properties:
              node_id:
                type: string
                description: >-
                  Identificador único de este paso de validación de base de
                  datos en el grafo del flujo.
              issuing_state:
                type: string
                description: >-
                  Código ISO 3166-1 alpha-3 del país cuyas fuentes
                  gubernamentales o de registro se consultaron (p. ej., `BRA`,
                  `MEX`, `ESP`, `NGA`, `IDN`). Validación de base de datos cubre
                  60+ países de América, Europa, África, Oriente Medio y
                  Asia-Pacífico, además de fuentes globales multipaís. La
                  cobertura se amplía con regularidad, así que trata el valor
                  como un conjunto abierto y no como un enum fijo.
              validation_type:
                type: string
                enum:
                  - one_by_one
                  - two_by_two
                  - not_enabled
                description: >-
                  Cómo se corroboró el resultado: `one_by_one` (resultado de un
                  solo servicio), `two_by_two` (dos o más servicios distintos
                  obtuvieron de forma independiente una coincidencia total del
                  número de identificación) o `not_enabled` (se guarda cuando
                  ningún servicio produjo una coincidencia utilizable). El valor
                  nunca es `null`. Los modos dedicados de validación biométrica
                  2x2 están disponibles actualmente para `ECU` y `PER`.
              screened_data:
                type: object
                description: >-
                  Los datos de entrada usados para la validación. Los campos
                  varían según el país: consulta la documentación de Validación
                  de base de datos
                  (`/core-technology/database-validation/overview`) para ver los
                  formatos de cada país.
                properties:
                  last_name:
                    type: string
                  first_name:
                    type: string
                  tax_number:
                    type: string
                    description: 'Brasil: CPF (11 dígitos)'
                  personal_number:
                    type: string
                    description: >-
                      Chile: RUT, DOM: Cédula (11 dígitos), ECU: Cédula (10
                      dígitos), ESP: DNI/NIE, MEX: CURP (18 caracteres), PER:
                      DNI (8 dígitos), URY: CI
                  document_number:
                    type: string
                    description: >-
                      ARG: DNI, BOL: CI, COL: Cédula, GTM: DPI, HND: DNI, PAN:
                      Cédula, PRY: CI, SLV: DUI, VEN: Cédula
                  date_of_birth:
                    type: string
                    format: date
                  document_type:
                    type: string
                    description: 'COL: CC/CE/TI/NIT, ESP: ID/PASSPORT'
                  expiration_date:
                    type: string
                    format: date
                    description: Obligatorio para ESP
              validations:
                type: array
                description: >-
                  Una entrada por cada servicio de registro que devolvió un
                  payload de validación. Cada entrada identifica el servicio
                  (`service_id`, `service_name`) e incluye la comparación
                  `validation` por campo, el `outcome_code` / `outcome_detail`
                  del servicio cuando se informa, y el registro normalizado en
                  `source_data`.
                items:
                  type: object
                  properties:
                    service_id:
                      type: string
                      description: >-
                        Identificador del servicio de registro que generó este
                        resultado de validación.
                      example: bra_cpf
                    service_name:
                      type: string
                      description: Nombre legible del servicio de registro.
                      example: Brazil - CPF status check
                    validation:
                      type: object
                      description: Los resultados de las validaciones de campos.
                      properties:
                        full_name:
                          type: string
                          description: >-
                            Resultado de coincidencia del nombre completo (p.
                            ej., 'full_match', 'partial_match', 'no_match').
                        date_of_birth:
                          type: string
                          description: Resultado de coincidencia de la fecha de nacimiento.
                        identification_number:
                          type: string
                          description: >-
                            Resultado de coincidencia del número de
                            identificación.
                    outcome_code:
                      type: string
                      nullable: true
                      description: >-
                        Resultado legible por máquina de la consulta al registro
                        (por ejemplo, `MATCH`, `NO_MATCH`, `PARTIAL_MATCH`,
                        `INCONCLUSIVE`, códigos específicos de la fuente).
                        Presente cuando el servicio informa uno.
                    outcome_detail:
                      type: string
                      nullable: true
                      description: >-
                        Explicación legible de `outcome_code`, cuando el
                        servicio la proporciona.
                    source_data:
                      type: object
                      description: >-
                        Los datos devueltos por la base de datos gubernamental.
                        Campos comunes: identification_number, first_name,
                        last_name, full_name, date_of_birth, gender. Campos
                        adicionales por país: BRA siempre incluye lgpd_minor,
                        minor_under_18 y minor_under_16 cuando hay coincidencia
                        de CPF; también incluye el estado HTTP de origen cuando
                        los datos del CPF se retienen en virtud de la LGPD (HTTP
                        422/451). ECU añade street, formatted_address,
                        nationality, education, marital_status, spouse,
                        mother_name, father_name, profession. PER añade
                        paternal_name, maternal_name, verification_number,
                        verification_letter. ESP añade document_type,
                        expiration_date. VEN/COL añaden document_type.
                      additionalProperties: true
              errors:
                type: array
                description: >-
                  Errores devueltos por los servicios de registro durante la
                  validación, cada uno etiquetado con el `service_id` que lo
                  generó. **Esta clave se omite por completo cuando no hay
                  errores.**
                items:
                  type: object
                  description: >-
                    El objeto de error del servicio de origen, incluido tal cual
                    (sus claves varían según el servicio; normalmente un
                    mensaje/código y los detalles específicos del proveedor),
                    más `service_id`, que identifica el servicio que produjo el
                    error.
                  properties:
                    service_id:
                      type: string
                      nullable: true
                      description: >-
                        Identificador del servicio de registro que produjo el
                        error.
                  additionalProperties: true
              match_type:
                type: string
                enum:
                  - no_match
                  - partial_match
                  - full_match
                nullable: true
                description: >-
                  El resultado agregado de coincidencia en los servicios
                  consultados. `null` hasta que se evalúa la validación.
              status:
                type: string
                description: >-
                  Estado a nivel de función de esta validación de base de datos.
                  Es independiente del `status` de nivel superior de la sesión:
                  una sesión puede alcanzar su decisión global mientras una
                  función concreta sigue en `In Review`.
                enum:
                  - Not Finished
                  - Approved
                  - Declined
                  - In Review
                  - Resub Requested
              warnings:
                type: array
                items:
                  type: object
                  properties:
                    feature:
                      type: string
                      enum:
                        - ID_VERIFICATION
                        - NFC
                        - LIVENESS
                        - FACEMATCH
                        - PROOF_OF_ADDRESS
                        - PHONE
                        - EMAIL
                        - AML
                        - LOCATION
                        - DATABASE_VALIDATION
                        - QUESTIONNAIRE
                        - DOCUMENT_AI
                        - KYB_REGISTRY
                        - KYB_DOCUMENTS
                        - KYB_KEY_PEOPLE
                        - GEOLOCATION
                        - SIGNATURE
                      description: >-
                        La función que generó esta advertencia. El valor
                        identifica el bloque de función al que pertenece la
                        advertencia. El array de advertencias de cada módulo
                        suele usar el valor que corresponde a su módulo (por
                        ejemplo, `PHONE` dentro de
                        `phone_verifications[].warnings`), pero el enum anterior
                        es la referencia para todas las advertencias de
                        funciones del payload de la decisión.
                    risk:
                      type: string
                    additional_data:
                      type: object
                      nullable: true
                    log_type:
                      type: string
                    short_description:
                      type: string
                    long_description:
                      type: string
                    node_id:
                      type: string
                      description: >-
                        El ID del nodo del grafo del flujo que generó esta
                        advertencia
                description: Advertencias relacionadas con la validación de base de datos.
        database_validation_not_performed_reason:
          type: object
          nullable: true
          additionalProperties: true
          description: >-
            Por qué una validación de base de datos configurada no produjo
            ningún resultado, como `{code, message}` más campos de contexto.
            Solo está presente cuando `database_validations` es `null` en un
            flujo que tiene el paso, para que puedas distinguir entre "el
            registro coincidió" y "no se ejecutó nada". `null` en caso
            contrario.
          properties:
            code:
              type: string
              description: Motivo estable legible por máquina.
            message:
              type: string
              description: Explicación legible.
        reviews:
          type: array
          items:
            type: object
            properties:
              user:
                type: string
                description: >-
                  Quién realizó la revisión. Suele ser el identificador del
                  revisor de la consola (su correo electrónico), pero el valor
                  es `"API Client"` en las actualizaciones de estado hechas con
                  una clave de API y `"Unknown"` cuando no se pudo identificar a
                  ningún actor, así que no interpretes este campo como una
                  dirección de correo electrónico.
              new_status:
                type: string
              comment:
                type: string
              created_at:
                type: string
                format: date-time
        assignee:
          type: object
          nullable: true
          description: >-
            El revisor de la consola al que está asignada la sesión, o `null`
            cuando nadie la tiene asignada.
          properties:
            email:
              type: string
              format: email
            assigned_at:
              type: string
              format: date-time
              nullable: true
        waiting_since:
          type: string
          format: date-time
          nullable: true
          description: >-
            Fecha y hora en que la sesión empezó a esperar revisión. `null`
            salvo que la sesión esté en `In Review` y tu aplicación configure un
            plazo de revisión.
        sla_due_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Fecha límite de la revisión. `null` salvo que la sesión esté en `In
            Review` y tu aplicación configure un plazo de revisión.
        created_at:
          type: string
          format: date-time
          description: Marca de tiempo en la que se creó la sesión (ISO 8601, UTC).
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Marca de tiempo en la que está previsto que expire esta sesión. Se
            establece en las sesiones de Verificación de usuarios (KYC) cuando
            se configuró una expiración al crearlas (o cuando el estado
            `Approved` desencadena el cálculo de la expiración del KYC). `null`
            en las sesiones sin una expiración configurada y en los tipos que no
            usan expiración (p. ej., las sesiones de Verificación de empresas
            (KYB) que nunca recibieron un `expires_at`).
        registry_checks:
          type: array
          nullable: true
          description: >-
            Comprobaciones en el registro de empresas. Solo está presente cuando
            `session_kind = business`. Cada elemento incluye el payload completo
            del registro de empresas.
          items:
            type: object
            description: >-
              Una verificación en el registro de empresas: el payload completo
              del registro de empresas, enriquecido con la estructura de
              propiedad y las advertencias. Solo está presente cuando
              `session_kind = business`.
            properties:
              status:
                type: string
                description: Estado del ciclo de vida de la función.
              node_id:
                type: string
                nullable: true
              data_resolved:
                type: boolean
              company:
                type: object
                description: >-
                  Payload completo del registro de la empresa (el registro
                  oficial combinado con cualquier dato proporcionado por el
                  usuario o editado en la consola).
                properties:
                  uuid:
                    type: string
                    format: uuid
                  node_id:
                    type: string
                    nullable: true
                  status:
                    type: string
                  registry_status:
                    type: string
                    nullable: true
                  data_resolved:
                    type: boolean
                  company_name:
                    type: string
                  registration_number:
                    type: string
                    nullable: true
                  country_code:
                    type: string
                    description: >-
                      País de constitución (ISO 3166-1 alfa-2, p. ej., `GB`,
                      `DE`, `US`).
                  region:
                    type: string
                    nullable: true
                    description: >-
                      Código de subdivisión ISO 3166-2 cuando corresponda (p.
                      ej., `CA`, `NY` para estados de EE. UU.).
                  company_type:
                    type: string
                    nullable: true
                  incorporation_date:
                    type: string
                    format: date
                    nullable: true
                  registered_address:
                    type: string
                    nullable: true
                  tax_number:
                    type: string
                    nullable: true
                  risk_level:
                    type: string
                    enum:
                      - LOW
                      - MEDIUM
                      - HIGH
                    nullable: true
                  verification_status:
                    type: string
                    nullable: true
                  is_from_registry:
                    type: boolean
                  fetch_status:
                    type: string
                    nullable: true
                  alternative_names:
                    type: string
                    nullable: true
                    description: >-
                      Nombres alternativos, comerciales, anteriores o en el
                      idioma original de la empresa, como texto, cuando se
                      informan.
                  nature_of_business:
                    type: string
                    nullable: true
                  registered_capital:
                    type: string
                    nullable: true
                  registered_capital_amount:
                    type: string
                    format: decimal
                    nullable: true
                    description: >-
                      Importe del capital social registrado como cadena decimal
                      (p. ej., `"100.00"`), extraído de la presentación ante el
                      registro. `null` cuando no está disponible.
                  registered_capital_currency:
                    type: string
                    nullable: true
                    description: >-
                      Código de moneda ISO 4217 de `registered_capital_amount`
                      (p. ej., `"GBP"`). `null` cuando no está disponible.
                  website:
                    type: string
                    nullable: true
                  email:
                    type: string
                    format: email
                    nullable: true
                  phone:
                    type: string
                    nullable: true
                  legal_entity_identifier:
                    type: string
                    nullable: true
                  location_of_registration:
                    type: string
                    nullable: true
                  vat_number:
                    type: string
                    nullable: true
                    description: >-
                      Número de IVA de la UE, cuando se recopila durante el paso
                      de registro alojado o se edita después.
                  vat_validation_status:
                    type: string
                    enum:
                      - valid
                      - invalid
                      - format_valid
                      - invalid_format
                      - could_not_validate
                      - not_applicable
                    description: >-
                      Resultado de validar el número de IVA o, si no lo hay, el
                      `tax_number`, al enviar al registro. `valid` / `invalid`:
                      lo decide el registro oficial del país (VIES de la UE,
                      Noruega, Suiza, Brasil, Colombia, Costa Rica, Ecuador,
                      Paraguay; Polonia también mediante su registro nacional de
                      IVA). `format_valid` / `invalid_format`: lo deciden las
                      reglas de formato y dígito de control del país cuando no
                      se puede consultar ningún registro. `could_not_validate`:
                      el registro no estaba disponible. `not_applicable`: no hay
                      número, el país no tiene registro ni reglas, o es una
                      sesión de sandbox.
                  vat_validated_number:
                    type: string
                    nullable: true
                    description: >-
                      El número que se comprobó, tal como lo conoce la fuente
                      (por ejemplo, el número de IVA derivado de un SIREN
                      francés o de un RSIN neerlandés). `null` cuando no se
                      realizó ninguna comprobación.
                  vat_validation_source:
                    type: string
                    nullable: true
                    enum:
                      - eu_vies
                      - pl_vat_white_list
                      - no_brreg
                      - ch_uid_register
                      - br_receita_federal
                      - co_rues
                      - cr_hacienda
                      - ec_sri
                      - py_dnit
                      - format_rules
                      - null
                    description: >-
                      La fuente que determinó `vat_validation_status`: un
                      registro oficial o `format_rules`. `null` cuando no se
                      ejecutó ninguna comprobación.
                  vat_validated_name:
                    type: string
                    nullable: true
                    description: >-
                      Nombre registrado en la fuente que validó el número,
                      cuando la fuente lo revela. Solo se informa cuando el
                      estado es `valid`.
                  vat_validated_address:
                    type: string
                    nullable: true
                    description: >-
                      Dirección registrada en la fuente que validó el número,
                      cuando esta la facilita. Solo se establece cuando el
                      estado es `valid`.
                  vat_checked_at:
                    type: string
                    format: date-time
                    nullable: true
                    description: >-
                      Marca de tiempo de la comprobación. `null` cuando no se
                      ejecutó ninguna comprobación.
                  financial_summary:
                    type: object
                    nullable: true
                  officers:
                    type: array
                    items:
                      type: object
                      properties:
                        uuid:
                          type: string
                          format: uuid
                        name:
                          type: string
                        designation:
                          type: string
                          nullable: true
                        role:
                          type: string
                          nullable: true
                        nationality:
                          type: string
                          nullable: true
                        is_active:
                          type: boolean
                        kyc_status:
                          type: string
                          enum:
                            - Approved
                            - Declined
                            - Pending
                          nullable: true
                        kyc_session_url:
                          type: string
                          format: uri
                          nullable: true
                        first_name:
                          type: string
                          nullable: true
                          description: >-
                            Nombre de pila cuando el registro lo indica
                            explícitamente; no se deduce del nombre completo.
                        last_name:
                          type: string
                          nullable: true
                          description: >-
                            Apellido, cuando el registro lo indica
                            explícitamente.
                        address:
                          type: string
                          nullable: true
                          description: Dirección del directivo según el registro.
                        appointment_date:
                          type: string
                          nullable: true
                          description: Fecha en que se nombró al cargo.
                          format: date
                        termination_date:
                          type: string
                          nullable: true
                          description: >-
                            Fecha en que terminó el nombramiento, cuando se
                            informa.
                          format: date
                        date_of_birth:
                          type: string
                          nullable: true
                          description: >-
                            Fecha de nacimiento completa según el registro. Es
                            null cuando solo se conoce el año o el mes de
                            nacimiento.
                          format: date
                        date_of_birth_year:
                          type: integer
                          nullable: true
                          minimum: 1
                          maximum: 9999
                          description: >-
                            Año de nacimiento según el registro, incluso cuando
                            la fecha completa no está disponible.
                        date_of_birth_month:
                          type: integer
                          nullable: true
                          minimum: 1
                          maximum: 12
                          description: >-
                            Mes de nacimiento según el registro. Null cuando
                            solo se conoce el año.
                  beneficial_owners:
                    type: array
                    items:
                      type: object
                      properties:
                        uuid:
                          type: string
                          format: uuid
                        name:
                          type: string
                        first_name:
                          type: string
                          nullable: true
                        last_name:
                          type: string
                          nullable: true
                        entity_type:
                          type: string
                          enum:
                            - person
                            - company
                        roles:
                          type: array
                          items:
                            type: string
                        ownership_min_shares:
                          type: string
                          nullable: true
                          description: >-
                            Límite inferior del porcentaje de propiedad tal como
                            lo informa el registro. Cadena de formato libre (por
                            ejemplo, `"25.00"`, `"50"`); usa
                            `effective_ownership_percent` para obtener un valor
                            numérico procesado.
                        ownership_max_shares:
                          type: string
                          nullable: true
                          description: >-
                            Límite superior del porcentaje de propiedad tal como
                            lo informa el registro. Cadena de texto libre; usa
                            `effective_ownership_percent` para obtener un valor
                            numérico ya interpretado.
                        is_active:
                          type: boolean
                        kyc_status:
                          type: string
                          enum:
                            - Approved
                            - Declined
                            - Pending
                          nullable: true
                        kyc_session_url:
                          type: string
                          format: uri
                          nullable: true
                        effective_ownership_percent:
                          type: number
                          nullable: true
                        company_name:
                          type: string
                          nullable: true
                        registration_number:
                          type: string
                          nullable: true
                        country_of_birth:
                          type: string
                          nullable: true
                        email:
                          type: string
                          nullable: true
                        nationality:
                          type: string
                          nullable: true
                        designation:
                          type: string
                          nullable: true
                        voting_min_shares:
                          type: string
                          nullable: true
                        voting_max_shares:
                          type: string
                          nullable: true
                        date_of_birth:
                          type: string
                          nullable: true
                          description: Fecha de nacimiento completa, cuando se informa.
                          format: date
                        appointment_date:
                          type: string
                          nullable: true
                          description: Fecha de nombramiento, cuando se informa.
                          format: date
                        shareholding:
                          $ref: '#/components/schemas/KYBRegistryShareholding'
                  addresses:
                    type: array
                    nullable: true
                    description: >-
                      Todas las direcciones que indica el registro, con una
                      única forma canónica. Es null si no indica ninguna.
                    items:
                      $ref: '#/components/schemas/KYBRegistryAddress'
                  industries:
                    type: array
                    nullable: true
                    description: >-
                      Las actividades en las que el registro clasifica a la
                      empresa, con una única forma canónica. Es null cuando no
                      indica ninguna.
                    items:
                      $ref: '#/components/schemas/KYBRegistryIndustry'
                  accounts:
                    type: object
                    nullable: true
                    additionalProperties: true
                    description: >-
                      Fechas de presentación ante el registro, cuando están
                      disponibles. Las declaraciones anuales y las juntas
                      generales usan last_annual_return_date y last_agm_date;
                      son distintas de las cuentas financieras.
                  registry_data:
                    $ref: '#/components/schemas/KYBRegistryData'
                  user_provided_data:
                    type: object
                    description: Datos confirmados o editados por el usuario final.
                  confirmed_by_user_at:
                    type: string
                    format: date-time
                    nullable: true
                  last_console_edit_at:
                    type: string
                    format: date-time
                    nullable: true
                  is_editable:
                    type: boolean
                  ownership:
                    $ref: '#/components/schemas/KYBRegistryOwnership'
                  registry_tier:
                    type: string
                    nullable: true
                    description: >-
                      El nivel de registro que solicitó el flujo: `basic`,
                      `shareholders` o `ubo`. También en
                      `ownership.tier_requested`.
                  registry_tier_delivered:
                    type: string
                    nullable: true
                    description: >-
                      El nivel que entregó el registro y que se factura. También
                      está en `ownership.tier_delivered`.
                  registry_ownership_status:
                    type: string
                    nullable: true
                    description: >-
                      `not_requested`, `pending`, `delivered`, `not_held` o
                      `unavailable`. También en `ownership.status`.
                  registry_monitoring:
                    type: object
                    nullable: true
                    description: >-
                      El monitor de registro más reciente de la empresa, o
                      `null` si no existe ninguno.
                    properties:
                      uuid:
                        type: string
                        format: uuid
                      status:
                        type: string
                      unavailable_reason:
                        type: string
                        nullable: true
                      enrolled_at:
                        type: string
                        format: date-time
                        nullable: true
                      cancelled_at:
                        type: string
                        format: date-time
                        nullable: true
                      last_bill_date:
                        type: string
                        format: date
                        nullable: true
                      next_bill_date:
                        type: string
                        format: date
                        nullable: true
                      last_event_at:
                        type: string
                        format: date-time
                        nullable: true
                      events_count:
                        type: integer
                      watched_fields:
                        description: Los campos de la empresa que vigila el monitor.
              ownership_structure:
                $ref: '#/components/schemas/KYBOwnershipStructure'
              warnings:
                type: array
                items:
                  type: object
        key_people_checks:
          type: array
          nullable: true
          description: >-
            Comprobaciones agregadas de las personas clave. Solo están presentes
            cuando `session_kind = business`. Cada elemento usa la estructura de
            dos grupos (`registry`, `submitted`, `ubo_kyc_summary`).
          items:
            type: object
            description: >-
              Comprobación agregada sobre los directivos y los UBO de la
              empresa. Usa la estructura `registry` / `submitted`. Solo está
              presente cuando session_kind = business.
            properties:
              status:
                type: string
              node_id:
                type: string
                nullable: true
              registry:
                type: object
                description: Partes descubiertas mediante la comprobación en el registro.
                properties:
                  officers:
                    type: array
                    description: >-
                      Directivos detectados mediante la comprobación en el
                      registro, cada uno con el estado de la sesión KYC
                      secundaria y del análisis AML que se hayan generado para
                      él.
                    items:
                      type: object
                      properties:
                        uuid:
                          type: string
                          format: uuid
                        name:
                          type: string
                          description: >-
                            Nombre completo del directivo tal como consta en el
                            registro.
                        designation:
                          type: string
                          nullable: true
                          description: >-
                            Cargo en texto libre según el registro (p. ej.,
                            `Director`, `Company Secretary`).
                        role:
                          type: string
                          enum:
                            - director
                            - non_executive_director
                            - secretary
                            - chairman
                            - ubo
                            - shareholder
                            - representative
                            - founder
                            - legal_advisor
                            - authorized_signatory
                            - trustee
                            - beneficiary
                            - settlor
                            - protector
                            - company_officer
                            - investor
                            - other
                          description: Rol de directivo normalizado.
                        nationality:
                          type: string
                          nullable: true
                        appointment_date:
                          type: string
                          nullable: true
                          description: Fecha en que se nombró al cargo.
                          format: date
                        termination_date:
                          type: string
                          nullable: true
                          description: >-
                            Fecha en que terminó el nombramiento, cuando se
                            informa.
                          format: date
                        is_active:
                          type: boolean
                        address:
                          type: string
                          nullable: true
                          description: Dirección del directivo según el registro.
                        aml_status:
                          type: string
                          enum:
                            - Not Finished
                            - Approved
                            - Declined
                            - In Review
                            - Resub Requested
                          nullable: true
                          description: >-
                            Estado del análisis AML ejecutado para este
                            directivo. `null` cuando no se ejecutó ningún
                            análisis AML.
                        kyc_status:
                          type: string
                          enum:
                            - Not Started
                            - In Progress
                            - Approved
                            - Declined
                            - In Review
                            - Expired
                            - Abandoned
                            - Kyc Expired
                            - Resubmitted
                            - Awaiting User
                          nullable: true
                          description: >-
                            Estado del ciclo de vida sin procesar de la sesión
                            KYC hija creada para este directivo. Es el enum
                            completo de estados de sesión (no un conjunto
                            reducido Approved/Declined/Pending). `null` cuando
                            no existe ninguna sesión KYC hija.
                        kyc_session_url:
                          type: string
                          format: uri
                          nullable: true
                          description: >-
                            URL que se puede compartir de la sesión KYC
                            secundaria. `null` cuando no existe ninguna sesión
                            secundaria.
                        kyc_session_id:
                          type: string
                          format: uuid
                          nullable: true
                          description: >-
                            ID de sesión de la sesión KYC hija. Pásalo a este
                            mismo endpoint de decisión para obtener el informe
                            KYC completo de la persona. `null` cuando no existe
                            ninguna sesión hija.
                        verification_workflow_type:
                          type: string
                          nullable: true
                          description: >-
                            Tipo de flujo base del flujo de la sesión hija (p.
                            ej., `kyc`). `null` para flujos basados en grafos o
                            cuando no existe ninguna sesión hija.
                        verification_workflow_id:
                          type: string
                          format: uuid
                          nullable: true
                          description: >-
                            ID del flujo que usa la sesión hija. `null` cuando
                            no existe ninguna sesión hija.
                        verification_workflow_label:
                          type: string
                          nullable: true
                          description: >-
                            Etiqueta legible del flujo de la sesión secundaria.
                            `null` si no está definida.
                        verification_workflow_features:
                          type: array
                          nullable: true
                          description: >-
                            Progreso por función de la sesión de verificación
                            secundaria, p. ej. `[{"feature": "ID_VERIFICATION",
                            "status": "Approved"}]`. `null` cuando la sesión
                            secundaria no tiene una lista de funciones que se
                            pueda resolver.
                          items:
                            type: object
                            properties:
                              feature:
                                type: string
                                description: >-
                                  Nombre visible de la función (por ejemplo,
                                  `ID_VERIFICATION`, `LIVENESS`, `AML`).
                              status:
                                type: string
                                enum:
                                  - Not Finished
                                  - Approved
                                  - Declined
                                  - In Review
                                  - Resub Requested
                                description: >-
                                  Estado a nivel de función dentro de la sesión
                                  hija.
                        didit_internal_id:
                          type: string
                          nullable: true
                          description: >-
                            Identificador interno estable de la persona
                            verificada detrás de la sesión secundaria, útil para
                            vincular sesiones entre sí. `null` cuando no existe
                            ninguna sesión secundaria o el usuario aún no se ha
                            resuelto.
                        kyc_document_type:
                          type: string
                          nullable: true
                          description: >-
                            Tipo de documento presentado en la sesión de KYC
                            secundaria (p. ej., `P`, `ID`, `DL`). `null` hasta
                            que la sesión secundaria tenga un resultado de
                            verificación de identidad.
                        kyc_nationality:
                          type: string
                          nullable: true
                          description: >-
                            Nacionalidad extraída del documento en la sesión KYC
                            hija. `null` hasta que esté disponible.
                        kyc_liveness_passed:
                          type: boolean
                          nullable: true
                          description: >-
                            Si se superó la comprobación de prueba de vida de la
                            sesión de KYC hija. `null` cuando no se ha realizado
                            ninguna comprobación de prueba de vida.
                        kyc_verified_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: >-
                            Cuándo la sesión KYC secundaria alcanzó `Approved`.
                            `null` mientras la sesión secundaria tiene cualquier
                            otro estado.
                        kyc_aml_categories:
                          type: object
                          nullable: true
                          description: >-
                            Resumen por categoría derivado de las coincidencias
                            AML de la persona. `null` cuando no hay
                            coincidencias.
                          properties:
                            sanctions:
                              type: string
                              enum:
                                - match
                                - clear
                            pep:
                              type: string
                              enum:
                                - match
                                - clear
                            adverse_media:
                              type: string
                              enum:
                                - match
                                - clear
                            warnings:
                              type: string
                              enum:
                                - match
                                - clear
                        kyc_notification_sent_at:
                          type: string
                          nullable: true
                          description: >-
                            Marca de tiempo ISO 8601 de la última notificación
                            de invitación a la verificación enviada para la
                            sesión secundaria de esta persona. `null` cuando no
                            se envió ninguna.
                        first_name:
                          type: string
                          nullable: true
                          description: >-
                            Nombre de pila cuando el registro lo indica
                            explícitamente; no se deduce del nombre completo.
                        last_name:
                          type: string
                          nullable: true
                          description: >-
                            Apellido, cuando el registro lo indica
                            explícitamente.
                        date_of_birth:
                          type: string
                          nullable: true
                          description: >-
                            Fecha de nacimiento completa según el registro. Es
                            null cuando solo se conoce el año o el mes de
                            nacimiento.
                          format: date
                        date_of_birth_year:
                          type: integer
                          nullable: true
                          minimum: 1
                          maximum: 9999
                          description: >-
                            Año de nacimiento según el registro, incluso cuando
                            la fecha completa no está disponible.
                        date_of_birth_month:
                          type: integer
                          nullable: true
                          minimum: 1
                          maximum: 12
                          description: >-
                            Mes de nacimiento según el registro. Null cuando
                            solo se conoce el año.
                  beneficial_owners:
                    type: array
                    description: >-
                      Beneficiarios finales detectados mediante la comprobación
                      del registro, cada uno enriquecido con el estado de
                      cualquier sesión KYC hija y análisis AML generados para
                      ellos.
                    items:
                      type: object
                      properties:
                        uuid:
                          type: string
                          format: uuid
                        name:
                          type: string
                          description: >-
                            Nombre completo del beneficiario final (o nombre de
                            la empresa para los UBO corporativos).
                        first_name:
                          type: string
                          nullable: true
                        last_name:
                          type: string
                          nullable: true
                        date_of_birth:
                          type: string
                          nullable: true
                          description: Fecha de nacimiento completa, cuando se informa.
                          format: date
                        country_of_birth:
                          type: string
                          nullable: true
                        email:
                          type: string
                          nullable: true
                        company_name:
                          type: string
                          nullable: true
                        registration_number:
                          type: string
                          nullable: true
                        entity_type:
                          type: string
                          enum:
                            - person
                            - company
                        nationality:
                          type: string
                          nullable: true
                        designation:
                          type: string
                          nullable: true
                        roles:
                          type: array
                          description: >-
                            Nombres de los roles que tiene este propietario, p.
                            ej., `["ubo", "shareholder"]`.
                          items:
                            type: string
                        ownership_min_shares:
                          type: string
                          nullable: true
                          description: >-
                            Límite inferior del porcentaje de propiedad tal como
                            lo informa el registro. Cadena de formato libre (por
                            ejemplo, `"25"`, `"25-50%"`); usa
                            `effective_ownership_percent` para obtener un valor
                            numérico procesado.
                        ownership_max_shares:
                          type: string
                          nullable: true
                          description: >-
                            Límite superior del porcentaje de propiedad tal como
                            lo informa el registro. Cadena de texto libre; usa
                            `effective_ownership_percent` para obtener un valor
                            numérico ya interpretado.
                        is_active:
                          type: boolean
                        aml_status:
                          type: string
                          enum:
                            - Not Finished
                            - Approved
                            - Declined
                            - In Review
                            - Resub Requested
                          nullable: true
                          description: >-
                            Estado del análisis AML ejecutado para este
                            beneficiario final. `null` cuando no se ejecutó
                            ningún análisis AML.
                        kyc_status:
                          type: string
                          enum:
                            - Not Started
                            - In Progress
                            - Approved
                            - Declined
                            - In Review
                            - Expired
                            - Abandoned
                            - Kyc Expired
                            - Resubmitted
                            - Awaiting User
                          nullable: true
                          description: >-
                            Estado del ciclo de vida sin procesar de la sesión
                            KYC hija creada para este beneficiario final. Es el
                            enum completo de estados de sesión (no un conjunto
                            reducido Approved/Declined/Pending). `null` cuando
                            no existe ninguna sesión KYC hija.
                        kyc_session_url:
                          type: string
                          format: uri
                          nullable: true
                          description: >-
                            URL que se puede compartir de la sesión KYC
                            secundaria. `null` cuando no existe ninguna sesión
                            secundaria.
                        kyc_session_id:
                          type: string
                          format: uuid
                          nullable: true
                          description: >-
                            ID de sesión de la sesión KYC hija. Pásalo a este
                            mismo endpoint de decisión para obtener el informe
                            KYC completo de la persona. `null` cuando no existe
                            ninguna sesión hija.
                        verification_workflow_type:
                          type: string
                          nullable: true
                          description: >-
                            Tipo de flujo base del flujo de la sesión hija (p.
                            ej., `kyc`). `null` para flujos basados en grafos o
                            cuando no existe ninguna sesión hija.
                        verification_workflow_id:
                          type: string
                          format: uuid
                          nullable: true
                          description: >-
                            ID del flujo que usa la sesión hija. `null` cuando
                            no existe ninguna sesión hija.
                        verification_workflow_label:
                          type: string
                          nullable: true
                          description: >-
                            Etiqueta legible del flujo de la sesión secundaria.
                            `null` si no está definida.
                        verification_workflow_features:
                          type: array
                          nullable: true
                          description: >-
                            Progreso por función de la sesión de verificación
                            secundaria, p. ej. `[{"feature": "ID_VERIFICATION",
                            "status": "Approved"}]`. `null` cuando la sesión
                            secundaria no tiene una lista de funciones que se
                            pueda resolver.
                          items:
                            type: object
                            properties:
                              feature:
                                type: string
                                description: >-
                                  Nombre visible de la función (por ejemplo,
                                  `ID_VERIFICATION`, `LIVENESS`, `AML`).
                              status:
                                type: string
                                enum:
                                  - Not Finished
                                  - Approved
                                  - Declined
                                  - In Review
                                  - Resub Requested
                                description: >-
                                  Estado a nivel de función dentro de la sesión
                                  hija.
                        didit_internal_id:
                          type: string
                          nullable: true
                          description: >-
                            Identificador interno estable de la persona
                            verificada detrás de la sesión secundaria, útil para
                            vincular sesiones entre sí. `null` cuando no existe
                            ninguna sesión secundaria o el usuario aún no se ha
                            resuelto.
                        kyc_document_type:
                          type: string
                          nullable: true
                          description: >-
                            Tipo de documento presentado en la sesión de KYC
                            secundaria (p. ej., `P`, `ID`, `DL`). `null` hasta
                            que la sesión secundaria tenga un resultado de
                            verificación de identidad.
                        kyc_nationality:
                          type: string
                          nullable: true
                          description: >-
                            Nacionalidad extraída del documento en la sesión KYC
                            hija. `null` hasta que esté disponible.
                        kyc_liveness_passed:
                          type: boolean
                          nullable: true
                          description: >-
                            Si se superó la comprobación de prueba de vida de la
                            sesión de KYC hija. `null` cuando no se ha realizado
                            ninguna comprobación de prueba de vida.
                        kyc_verified_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: >-
                            Cuándo la sesión KYC secundaria alcanzó `Approved`.
                            `null` mientras la sesión secundaria tiene cualquier
                            otro estado.
                        kyc_aml_categories:
                          type: object
                          nullable: true
                          description: >-
                            Resumen por categoría derivado de las coincidencias
                            AML de la persona. `null` cuando no hay
                            coincidencias.
                          properties:
                            sanctions:
                              type: string
                              enum:
                                - match
                                - clear
                            pep:
                              type: string
                              enum:
                                - match
                                - clear
                            adverse_media:
                              type: string
                              enum:
                                - match
                                - clear
                            warnings:
                              type: string
                              enum:
                                - match
                                - clear
                        kyc_notification_sent_at:
                          type: string
                          nullable: true
                          description: >-
                            Marca de tiempo ISO 8601 de la última notificación
                            de invitación a la verificación enviada para la
                            sesión secundaria de esta persona. `null` cuando no
                            se envió ninguna.
                        child_beneficial_owners:
                          type: array
                          description: >-
                            En los UBO corporativos: los beneficiarios finales
                            de la propia entidad propietaria, como objetos sin
                            procesar extraídos del registro. Array vacío cuando
                            no aplica.
                          items:
                            type: object
                        effective_ownership_percent:
                          type: number
                          nullable: true
                          description: >-
                            Porcentaje de propiedad numérico analizado: el
                            límite máximo cuando está disponible y, si no, el
                            límite mínimo. `null` cuando no se pudo analizar
                            ninguno de los dos límites.
                        voting_min_shares:
                          type: string
                          nullable: true
                        voting_max_shares:
                          type: string
                          nullable: true
                        appointment_date:
                          type: string
                          nullable: true
                          description: Fecha de nombramiento, cuando se informa.
                          format: date
              submitted:
                type: object
                description: >-
                  Partes enviadas por el administrador de la empresa durante el
                  flujo de personas clave (filas de BusinessParty con
                  source=USER).
                properties:
                  parties:
                    type: array
                    items:
                      type: object
                      description: >-
                        Parte enviada por el administrador de la empresa
                        mediante el flujo de personas clave (source=USER).
                      properties:
                        uuid:
                          type: string
                          format: uuid
                        entity_type:
                          type: string
                          enum:
                            - person
                            - company
                        source:
                          type: string
                          enum:
                            - USER
                          description: >-
                            Aquí siempre es `USER`: este grupo solo contiene las
                            partes introducidas o confirmadas por el usuario
                            final en el flujo de personas clave (las personas
                            descubiertas en el registro aparecen en `registry`).
                        name:
                          type: string
                        first_name:
                          type: string
                          nullable: true
                        last_name:
                          type: string
                          nullable: true
                        company_name:
                          type: string
                          nullable: true
                        registration_number:
                          type: string
                          nullable: true
                        email:
                          type: string
                          format: email
                          nullable: true
                        nationality:
                          type: string
                          nullable: true
                          description: >-
                            Nacionalidad para personas; país de constitución
                            para las partes que son empresas.
                        phone_number:
                          type: string
                          nullable: true
                        date_of_birth:
                          type: string
                          format: date
                          nullable: true
                        position:
                          type: string
                          nullable: true
                          description: Cargo o puesto en texto libre (solo personas).
                        custom_fields:
                          type: object
                          description: >-
                            Campos personalizados definidos en el flujo y
                            recopilados para esta parte; las claves las definen
                            los descriptores de campos de personas clave del
                            flujo.
                        is_active:
                          type: boolean
                        is_skipped:
                          type: boolean
                          description: >-
                            True cuando el usuario final omitió la verificación
                            para esta parte (solo es posible cuando el rol
                            permite omitirla).
                        requires_verification:
                          type: boolean
                          description: >-
                            True cuando se requiere una subsesión KYC / KYB
                            secundaria para esta parte según la configuración
                            del rol y los umbrales de propiedad.
                        roles:
                          type: array
                          description: >-
                            Todos los roles que ocupa esta parte, cada uno con
                            sus propios porcentajes de propiedad y de voto. La
                            parte en sí no tiene un `role`/`ownership_percent`
                            escalar.
                          items:
                            type: object
                            properties:
                              role:
                                type: string
                                enum:
                                  - director
                                  - non_executive_director
                                  - secretary
                                  - chairman
                                  - ubo
                                  - shareholder
                                  - representative
                                  - founder
                                  - legal_advisor
                                  - authorized_signatory
                                  - trustee
                                  - beneficiary
                                  - settlor
                                  - protector
                                  - company_officer
                                  - investor
                                  - other
                              ownership_percent:
                                type: number
                                nullable: true
                              voting_percent:
                                type: number
                                nullable: true
                        kyc_session_id:
                          type: string
                          format: uuid
                          nullable: true
                          description: >-
                            ID de la sesión KYC secundaria para partes que son
                            personas y requieren verificación. `null` en caso
                            contrario.
                        kyc_session_status:
                          type: string
                          enum:
                            - Not Started
                            - In Progress
                            - Approved
                            - Declined
                            - In Review
                            - Expired
                            - Abandoned
                            - Kyc Expired
                            - Resubmitted
                            - Awaiting User
                          nullable: true
                          description: >-
                            Estado del ciclo de vida de la sesión KYC hija.
                            `null` cuando no existe ninguna sesión KYC hija.
                        kyc_session_url:
                          type: string
                          format: uri
                          nullable: true
                        kyb_sub_session_id:
                          type: string
                          format: uuid
                          nullable: true
                          description: >-
                            ID de la subsesión KYB secundaria para partes
                            corporativas que requieren verificación. `null` en
                            caso contrario.
                        kyb_sub_session_status:
                          type: string
                          enum:
                            - Not Started
                            - In Progress
                            - Approved
                            - Declined
                            - In Review
                            - Expired
                            - Abandoned
                            - Kyc Expired
                            - Resubmitted
                            - Awaiting User
                          nullable: true
                          description: >-
                            Estado del ciclo de vida de la subsesión KYB hija.
                            `null` cuando no existe ninguna subsesión.
                        kyb_sub_session_url:
                          type: string
                          format: uri
                          nullable: true
                          description: >-
                            URL que se puede compartir de la subsesión KYB
                            secundaria. `null` cuando no existe ninguna
                            subsesión.
                        verification_workflow_type:
                          type: string
                          nullable: true
                          description: >-
                            Tipo de flujo base del flujo de la sesión hija (se
                            prefiere la sesión KYC y, si no existe, se usa la
                            subsesión KYB). `null` para flujos basados en grafos
                            o cuando no existe ninguna sesión hija.
                        verification_workflow_id:
                          type: string
                          format: uuid
                          nullable: true
                          description: >-
                            ID del flujo que usa la sesión hija. `null` cuando
                            no existe ninguna sesión hija.
                        verification_workflow_label:
                          type: string
                          nullable: true
                          description: >-
                            Etiqueta legible del flujo de la sesión secundaria.
                            `null` si no está definida.
                        verification_workflow_features:
                          type: array
                          nullable: true
                          description: >-
                            Progreso por función de la sesión de verificación
                            secundaria, p. ej. `[{"feature": "ID_VERIFICATION",
                            "status": "Approved"}]`. `null` cuando la sesión
                            secundaria no tiene una lista de funciones que se
                            pueda resolver.
                          items:
                            type: object
                            properties:
                              feature:
                                type: string
                                description: >-
                                  Nombre visible de la función (por ejemplo,
                                  `ID_VERIFICATION`, `LIVENESS`, `AML`).
                              status:
                                type: string
                                enum:
                                  - Not Finished
                                  - Approved
                                  - Declined
                                  - In Review
                                  - Resub Requested
                                description: >-
                                  Estado a nivel de función dentro de la sesión
                                  hija.
                        didit_internal_id:
                          type: string
                          nullable: true
                          description: >-
                            Identificador interno estable de la persona
                            verificada detrás de la sesión secundaria. `null`
                            cuando no se ha resuelto.
              ubo_kyc_summary:
                type: object
                nullable: true
                description: >-
                  Progreso agregado del KYC de los UBO, o null cuando ningún UBO
                  tiene sesiones de KYC vinculadas.
                properties:
                  total:
                    type: integer
                  approved:
                    type: integer
                  flagged:
                    type: integer
                    description: UBO cuyo KYC está rechazado o en revisión.
                  pending:
                    type: integer
              warnings:
                type: array
                items:
                  type: object
        document_verifications:
          type: array
          nullable: true
          description: >-
            Comprobaciones de verificación de documentos agrupadas por nodo del
            flujo. Solo aparece cuando `session_kind = business`.
          items:
            type: object
            description: >-
              Documentos agrupados por nodo del flujo. Solo aparece cuando
              session_kind = business.
            properties:
              status:
                type: string
              node_id:
                type: string
                nullable: true
              items:
                type: array
                items:
                  type: object
                  properties:
                    uuid:
                      type: string
                      format: uuid
                    document_type:
                      type: string
                      enum:
                        - LEGAL_PRESENCE
                        - COMPANY_DETAILS
                        - OWNERSHIP_STRUCTURE
                        - REPRESENTATIVES_AUTHORIZATION
                        - OTHER
                      nullable: true
                      description: >-
                        Grupo general de documentos KYB en el que se clasificó
                        el archivo. `null` mientras no esté clasificado.
                    document_subtype:
                      type: string
                      nullable: true
                      description: >-
                        Subtipo específico detectado por OCR (p. ej.
                        `CERTIFICATE_OF_INCORPORATION`, `SHAREHOLDER_REGISTRY`);
                        `UNKNOWN` cuando el OCR no pudo clasificar el documento
                        con suficiente confianza.
                    document_group:
                      type: string
                      enum:
                        - LEGAL_PRESENCE
                        - COMPANY_DETAILS
                        - OWNERSHIP_STRUCTURE
                        - REPRESENTATIVES_AUTHORIZATION
                        - OTHER
                      nullable: true
                      description: >-
                        Alias de `document_type`: el nombre del grupo que usan
                        `groups` y `required_groups`.
                    file_url:
                      type: string
                      format: uri
                      nullable: true
                      description: >-
                        Enlace prefirmado de corta duración al archivo subido.
                        `null` para los marcadores de solicitud de documento
                        creados por un analista (`is_requested = true`) que aún
                        no se han completado.
                    original_filename:
                      type: string
                      nullable: true
                      description: >-
                        Nombre del archivo tal como lo subió el usuario o el
                        analista.
                    file_size:
                      type: integer
                      nullable: true
                      description: Tamaño del archivo en bytes.
                    status:
                      type: string
                      enum:
                        - Not Finished
                        - Approved
                        - Declined
                        - In Review
                        - Resub Requested
                      description: Estado de verificación por documento.
                    created_at:
                      type: string
                      format: date-time
                    cross_check_result:
                      type: object
                      nullable: true
                      description: >-
                        Contraste de los campos del documento extraídos por OCR
                        con el perfil de la empresa en el registro. Es un objeto
                        con las secciones `critical`, `non_critical` y `people`.
                        Cada sección asigna un nombre de campo (p. ej.
                        `company_name`, `registration_number`,
                        `incorporation_date`, `registered_address`) a un
                        registro de comparación como `{"document": "...",
                        "registry": "...", "match": true, "score": 0.97}`.
                        `null` cuando el documento no tenía datos de OCR o no
                        había ninguna empresa del registro con la que comparar.
                    document_metadata:
                      type: object
                      nullable: true
                      description: >-
                        Metadatos extraídos del documento corporativo subido.
                        Cuando la extracción de metadatos se completa
                        correctamente, las 16 claves están siempre presentes
                        (los valores individuales son `null` cuando no aplican
                        al tipo de archivo); el objeto completo es `null` cuando
                        no se pudo extraer nada. En los PDF,
                        `overlay_manipulation` contiene el análisis forense de
                        texto superpuesto.
                      properties:
                        file_size:
                          type: integer
                          nullable: true
                          description: Tamaño del documento.
                        content_type:
                          type: string
                          nullable: true
                          description: Tipo de contenido del documento.
                        creation_date:
                          type: string
                          nullable: true
                          description: Fecha de creación del documento.
                        modified_date:
                          type: string
                          nullable: true
                          description: Fecha de modificación del documento.
                        creator:
                          type: string
                          nullable: true
                          description: >-
                            Herramienta o usuario de creación registrado en los
                            metadatos del archivo (`Creator` del PDF).
                        producer:
                          type: string
                          nullable: true
                          description: Software que generó el archivo (`Producer` del PDF).
                        software:
                          type: string
                          nullable: true
                          description: >-
                            Software de edición registrado en los metadatos del
                            archivo.
                        encryption:
                          type: string
                          nullable: true
                          description: Esquema de cifrado del archivo, cuando está cifrado.
                        is_signed:
                          type: boolean
                          nullable: true
                          description: Si el documento incluye una firma digital.
                        is_tampered:
                          type: boolean
                          nullable: true
                          description: >-
                            Si la firma digital no superó la validación
                            (modificación posterior a la firma).
                        signature_info:
                          type: object
                          nullable: true
                          description: >-
                            Detalles de las firmas digitales, cuando están
                            presentes.
                        exif_original_date:
                          type: string
                          nullable: true
                          description: >-
                            Fecha de captura original EXIF, para imágenes
                            subidas.
                        exif_digitized_date:
                          type: string
                          nullable: true
                          description: Fecha de digitalización EXIF, para imágenes subidas.
                        processed_by_known_editor:
                          type: boolean
                          nullable: true
                          description: >-
                            Indica si los metadatos señalan que el archivo pasó
                            por un editor de imágenes/PDF conocido.
                        has_different_creation_mod_date:
                          type: boolean
                          nullable: true
                          description: >-
                            Indica si las fechas de creación y modificación
                            difieren, lo que es una posible señal de edición
                            (aunque no concluyente).
                        overlay_manipulation:
                          type: object
                          nullable: true
                          description: >-
                            Análisis forense del PDF ante sospecha de
                            manipulación mediante texto superpuesto. Null cuando
                            no se encontraron indicios de manipulación por
                            superposición o el documento no era un PDF.
                          properties:
                            detected:
                              type: boolean
                              description: >-
                                Indica si se detectaron indicios de manipulación
                                del texto superpuesto.
                            analyzed:
                              type: boolean
                              description: Si se pudo analizar el PDF.
                            signals:
                              type: array
                              items:
                                type: string
                              description: >-
                                Señales forenses que se activaron, como
                                duplicate_font_subset o glyph_fragmentation.
                            manipulated_regions:
                              type: array
                              description: >-
                                Zonas presuntamente manipuladas, en coordenadas
                                de página del PDF.
                              items:
                                type: object
                                properties:
                                  page:
                                    type: integer
                                  x:
                                    type: number
                                  'y':
                                    type: number
                                  width:
                                    type: number
                                  height:
                                    type: number
                                  page_width:
                                    type: number
                                  page_height:
                                    type: number
                    description:
                      type: string
                      nullable: true
                      description: >-
                        Etiqueta o motivo indicado por el analista para una
                        solicitud de documento. `null` para las subidas
                        normales.
                    is_requested:
                      type: boolean
                      description: >-
                        True para los marcadores de posición de solicitudes de
                        documentos creados por analistas que están pendientes de
                        carga.
                    ocr_data:
                      type: object
                      nullable: true
                    is_console_upload:
                      type: boolean
                      description: >-
                        True para los documentos subidos desde la consola en
                        lugar de desde el flujo del usuario final. Las cargas
                        desde la consola nunca cambian el estado agregado a
                        nivel de función.
                    is_confirmed:
                      type: boolean
                      description: >-
                        Las cargas desde la consola empiezan en `false` y
                        cambian a `true` cuando el administrador las confirma;
                        las cargas del usuario final son siempre `true`.
              groups:
                type: object
                description: >-
                  Contadores de progreso por grupo, indexados por nombre de
                  grupo (p. ej. legal_presence, ownership_structure).
                additionalProperties:
                  type: object
                  properties:
                    total:
                      type: integer
                    approved:
                      type: integer
                    pending:
                      type: integer
                    declined:
                      type: integer
                    in_review:
                      type: integer
                    other:
                      type: integer
                    missing:
                      type: integer
                      description: >-
                        Marcadores de posición solicitados que aún no tienen
                        ningún archivo subido.
              required_groups:
                type: array
                items:
                  type: string
              warnings:
                type: array
                items:
                  type: object
        environment:
          type: string
          enum:
            - live
            - sandbox
          description: >-
            Si la sesión la creó una aplicación de producción (`live`) o una
            aplicación de sandbox (`sandbox`). Las sesiones de sandbox son
            gratuitas, totalmente simuladas y nunca consumen créditos.
        sandbox_scenario:
          type: string
          nullable: true
          description: >-
            El escenario de sandbox con el que se creó la sesión. `null` para
            las sesiones en producción y para las sesiones de sandbox creadas
            sin escenario.
        resubmissions:
          type: array
          description: >-
            Solo se devuelve con `include=resubmissions`, para sesiones de
            usuarios y de empresas. Una entrada por cada solicitud de reenvío,
            de la más antigua a la más reciente. Cada entrada contiene los
            resultados que devolvieron los pasos reenviados antes de la
            solicitud, de modo que los envíos anteriores siguen siendo legibles.
            Al eliminar la sesión se eliminan todos los envíos.
          items:
            type: object
            properties:
              number:
                type: integer
                description: >-
                  1 para el primer reenvío de la sesión, 2 para el segundo, y
                  así sucesivamente.
              created_at:
                type: string
                format: date-time
                description: Fecha y hora en que se solicitó el reenvío.
              previous_status:
                type: string
                description: El estado de la sesión justo antes de la solicitud.
              nodes:
                type: array
                description: Los pasos del flujo devueltos al usuario.
                items:
                  type: object
                  properties:
                    node_id:
                      type: string
                    feature:
                      type: string
              reasons:
                type: object
                nullable: true
                additionalProperties:
                  type: string
                description: El motivo indicado para cada paso, indexado por `node_id`.
              requested_by:
                type: object
                nullable: true
                description: Quién solicitó el reenvío.
                properties:
                  name:
                    type: string
                  email:
                    type: string
                  type:
                    type: string
              results:
                type: object
                additionalProperties: true
                description: >-
                  Lo que devolvieron los pasos reenviados antes de la solicitud,
                  con las mismas claves y la misma estructura que los resultados
                  actuales de esta respuesta (`id_verifications`,
                  `nfc_verifications`, `liveness_checks`, `face_matches`,
                  `poa_verifications`, `phone_verifications`,
                  `email_verifications`, `aml_screenings`, `ip_analyses`,
                  `database_validations`, `questionnaire_responses`,
                  `document_ai_documents`, `geolocation_checks`; en las sesiones
                  de empresa, también `document_verifications`). Solo aparecen
                  las claves de los pasos que se reenviaron.
        biometric_consent:
          type: object
          nullable: true
          description: >-
            Si la sesión exigió un consentimiento biométrico explícito antes de
            una captura facial, el motivo y la evidencia de la respuesta. Solo
            para sesiones de Verificación de usuarios (KYC); el mismo objeto
            está en la `decision` de los webhooks de sesión. `null` cuando la
            sesión nunca se evaluó, por ejemplo, en un flujo sin captura facial.
            Los campos sin valor registrado son `null`. Un SDK nativo anterior a
            la 4.10.0, o uno que no informa su versión, no puede mostrar el paso
            de consentimiento: sus capturas faciales se ejecutan como antes, y
            una sesión que exigía consentimiento informa entonces `status:
            "pending"` con `reason: "BIOMETRIC_CONSENT_UNSUPPORTED_SDK"`.
            Consulta [Consentimiento
            biométrico](/es/getting-started/biometric-consent).
          properties:
            required:
              type: boolean
              description: >-
                Whether the session must collect explicit biometric consent.
                Never goes back to `false`.
            trigger:
              type: string
              nullable: true
              enum:
                - declared_state
                - ip_state
                - ip_unknown
                - document_issuer
                - forced
                - customer_collected
              description: >-
                Por qué se requiere el consentimiento, o cómo se cumplió.
                `declared_state`: declaraste un estado cubierto (`user_state`, o
                una dirección de EE. UU. en `expected_details`). `ip_state`: la
                IP de la persona está en un estado cubierto (Illinois, Texas,
                Colorado). `ip_unknown`: la evidencia sitúa a la persona en EE.
                UU., pero no se puede determinar el estado (la IP está en EE.
                UU. sin estado, o no se puede localizar mientras tus datos o el
                documento sitúan a la persona en EE. UU.). `document_issuer`: el
                documento de identidad lo emitió un estado cubierto. `forced`:
                el modo de la aplicación es Siempre. `customer_collected`:
                enviaste `biometric_consent` al crear la sesión. `null` mientras
                no se requiere.
            status:
              type: string
              enum:
                - not_required
                - pending
                - given
                - declined
              description: >-
                `not_required`; `pending` (obligatorio y no otorgado: la persona
                aún no ha respondido, o `reason` indica por qué no se recogió);
                `given`; `declined` (se registró un rechazo y la sesión terminó
                como `Declined`; actualmente ninguna pantalla de Didit ofrece la
                opción de rechazarlo).
            given_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Cuándo se dio el consentimiento. Para `customer_collected`, el
                `given_at` que enviaste.
            declined_at:
              type: string
              format: date-time
              nullable: true
              description: Cuándo se registró un rechazo.
            text_version:
              type: string
              nullable: true
              description: >-
                ID de la versión del texto de consentimiento al que respondió la
                persona, o de la que enviaste.
            text_hash:
              type: string
              nullable: true
              description: >-
                SHA-256 (hex) del texto de consentimiento exacto que se mostró,
                en el idioma en que se mostró.
            locale:
              type: string
              nullable: true
              description: Idioma en el que se mostró el texto de consentimiento.
            policy_url:
              type: string
              format: uri
              nullable: true
              description: >-
                La política de datos biométricos a la que enlazó el paso de
                consentimiento.
            step:
              type: string
              nullable: true
              description: >-
                Paso del flujo en el que se encontraba la sesión cuando la
                persona respondió, por ejemplo, `LIVENESS`.
            node_id:
              type: string
              nullable: true
              description: >-
                Nodo del grafo del flujo en el que se encontraba la sesión
                cuando la persona respondió.
            ip_address:
              type: string
              nullable: true
              description: IP desde la que llegó la respuesta.
            ip_country_code:
              type: string
              nullable: true
              description: País de la IP de la respuesta en formato ISO 3166-1 alfa-2.
            ip_state:
              type: string
              nullable: true
              description: >-
                Subdivisión ISO 3166-2 de la IP de la respuesta, por ejemplo
                `US-IL`.
            ip_city:
              type: string
              nullable: true
              description: Ciudad de la IP desde la que se envió la respuesta.
            user_agent:
              type: string
              nullable: true
              description: User agent de la solicitud de la respuesta.
            detected_ip_address:
              type: string
              nullable: true
              description: >-
                La IP de la persona desde la que se evaluó el requisito por
                última vez. Puede diferir de `ip_address` cuando la persona
                respondió desde otro dispositivo.
            detected_country_code:
              type: string
              nullable: true
              description: País ISO 3166-1 alpha-2 de la IP detectada.
            detected_state:
              type: string
              nullable: true
              description: Subdivisión ISO 3166-2 de la IP detectada.
            detected_city:
              type: string
              nullable: true
              description: Ciudad de la IP detectada.
            declared_state:
              type: string
              nullable: true
              description: >-
                Subdivisión ISO 3166-2 que declaraste: `user_state` o el estado
                de una dirección de EE. UU. en `expected_details`.
            document_state:
              type: string
              nullable: true
              description: >-
                Subdivisión ISO 3166-2 que emitió el documento de identidad,
                leída en la captura del documento.
            jurisdictions:
              type: array
              items:
                type: string
              description: >-
                Estados de EE. UU. (códigos USPS, por ejemplo `IL`) cuya ley
                biométrica ampara a la persona. `US` cuando las pruebas sitúan a
                la persona en EE. UU. pero no se conoce el estado. Vacío cuando
                no aplica ninguno.
            retention_months:
              type: integer
              nullable: true
              description: >-
                El límite de retención biométrica más corto, en meses, entre las
                `jurisdictions`. `null` cuando no se aplica ninguno.
            reason:
              type: string
              nullable: true
              enum:
                - BIOMETRIC_CONSENT_UNSUPPORTED_SDK
                - BIOMETRIC_CONSENT_DECLINED
              description: >-
                `BIOMETRIC_CONSENT_UNSUPPORTED_SDK`: el consentimiento era
                obligatorio y un SDK nativo anterior a la versión 4.10.0, o uno
                que no informó su versión, capturó un rostro sin el paso de
                consentimiento; `status` se mantiene en `pending`, o en `given`
                si la persona aceptó después en el flujo alojado.
                `BIOMETRIC_CONSENT_DECLINED`: se registró un rechazo (sustituye
                al motivo del SDK). `null` en los demás casos, y siempre `null`
                cuando la sesión no requería consentimiento.
            decline_reason:
              type: string
              nullable: true
              enum:
                - BIOMETRIC_CONSENT_DECLINED
              description: >-
                `BIOMETRIC_CONSENT_DECLINED` cuando un rechazo registrado
                terminó la sesión; en caso contrario, `null`.
            face_data_deleted_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Cuándo el rechazo eliminó las imágenes faciales, los vídeos y
                las plantillas faciales de la sesión. `null` salvo que se haya
                registrado un rechazo.
        investigator:
          $ref: '#/components/schemas/InvestigatorBlock'
        biometric_retention:
          $ref: '#/components/schemas/BiometricRetention'
        fraud_check:
          type: object
          nullable: true
          additionalProperties: true
          description: >-
            El resultado de una llamada a la Fraud Check API. `null` para
            cualquier otra sesión.
        full_session_video:
          type: string
          format: uri
          nullable: true
          description: >-
            URL temporal de la grabación de la sesión completa. Solo se devuelve
            cuando tu organización graba vídeo de la sesión completa.
        full_session_video_recorded_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Cuándo se realizó la grabación de la sesión completa. Solo se
            devuelve cuando tu organización graba vídeo de la sesión completa.
    AddressValidationResult:
      type: object
      description: >-
        El resultado de una validación de dirección: si la dirección existe y su
        forma normalizada. Solo confirma la dirección; nunca la vincula a una
        persona.
      required:
        - status
        - verification_level
        - address
        - formatted_address
        - latitude
        - longitude
      properties:
        status:
          type: string
          enum:
            - verified
            - partially_verified
            - not_verified
            - unavailable
          description: >-
            `verified`: la dirección se confirmó hasta el edificio (o el piso o
            el apartado de correos). `partially_verified`: se confirmó solo
            hasta la calle, o hasta el nivel más preciso que contienen los datos
            postales de referencia para ese lugar. `not_verified`: solo
            coincidió la región o la ciudad, o no coincidió nada. `unavailable`:
            la validación no pudo ejecutarse (por ejemplo, el servicio de
            referencia no respondió); no se cobra y nunca afecta a una
            verificación.
        verification_level:
          type: string
          nullable: true
          enum:
            - administrative_area
            - locality
            - thoroughfare
            - premise
            - delivery_point
            - null
          description: >-
            El nivel más preciso con el que coincidió la dirección. `null`
            cuando no hubo ninguna coincidencia o `status` es `unavailable`.
        address:
          type: object
          nullable: true
          description: La dirección normalizada. `null` cuando `status` es `unavailable`.
          properties:
            address_line_1:
              type: string
              nullable: true
              description: >-
                Primera línea de la dirección de entrega, escrita según el
                formato del país.
              example: 1600 Amphitheatre Pkwy
            address_line_2:
              type: string
              nullable: true
              description: >-
                Segunda línea de entrega (un piso, edificio o barrio), cuando la
                dirección la tiene.
            city:
              type: string
              nullable: true
              example: Mountain View
            region:
              type: string
              nullable: true
              description: Estado, provincia o región.
              example: CA
            postal_code:
              type: string
              nullable: true
              example: 94043-1351
            country:
              type: string
              nullable: true
              description: Código de país ISO 3166-1 alfa-2.
              example: US
        formatted_address:
          type: string
          nullable: true
          description: La dirección normalizada en una sola línea.
          example: 1600 Amphitheatre Pkwy, Mountain View CA 94043-1351
        latitude:
          type: number
          nullable: true
          example: 37.422022
        longitude:
          type: number
          nullable: true
          example: -122.08429
    PhoneIntelligence:
      type: object
      description: >-
        Bloque normalizado de inteligencia telefónica. Solo está presente cuando
        el complemento de inteligencia se ejecutó para esta consulta; cuando
        está presente, también se expone con el alias `enrichment` y valores
        idénticos.
      properties:
        score:
          type: number
          nullable: true
          description: >-
            Puntuación de riesgo normalizada de 0 a 100. Cuanto más alta, mayor
            es el riesgo.
        phone_type_risk:
          type: string
          nullable: true
          description: '`Low`, `Medium` o `High`, según la puntuación.'
        phone_trust_index:
          type: number
          nullable: true
          description: >-
            Inverso de la puntuación, para paneles en los que un valor más alto
            es mejor.
        network_stability_index:
          type: number
          nullable: true
          description: Estabilidad de la red de la línea.
        is_disposable:
          type: boolean
          nullable: true
          description: '`true` cuando el número parece desechable o virtual.'
        is_ported:
          type: boolean
          nullable: true
          description: '`true` cuando el número ha cambiado de operador.'
        is_recently_ported:
          type: boolean
          nullable: true
          description: '`true` cuando la portabilidad se produjo recientemente.'
        carrier_type:
          type: string
          nullable: true
          description: >-
            Clasificación de la línea que devuelve la consulta (p. ej.,
            `mobile`).
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: >-
                  Identificador estable de Didit para la señal, por ejemplo
                  `IR-5AC67A32`. Es opaco: agrupa y filtra por él, pero no lo
                  analices.
              value:
                nullable: true
                description: >-
                  En un indicador de riesgo (por ejemplo, `voip`, `leaked`,
                  `disposable`, `spam_trap`), su valor: un booleano, un nivel o
                  una fecha. Null en un código de motivo con puntuación.
              direction:
                type: string
                enum:
                  - risk
                  - trust
                description: Si la señal aumentó el riesgo o aportó confianza.
              message:
                type: string
                description: Explicación legible de la señal, en inglés.
              impact_level:
                type: string
                nullable: true
                description: >-
                  Cuánto movió la señal la puntuación, por ejemplo `low`,
                  `medium` o `high`.
          description: >-
            Señales que explican la puntuación, cada una con un código estable
            de Didit, una dirección, un mensaje y un nivel de impacto. Pueden
            aparecer códigos nuevos con el tiempo, así que no rechaces los
            códigos desconocidos.
    PhoneSocialFootprint:
      type: object
      nullable: true
      description: >-
        Huella social del número de teléfono: las plataformas en línea en las
        que está registrado. Solo está presente cuando se activó `enable_social`
        y la comprobación finalizó. Cualquier recuento puede ser null cuando no
        se obtuvieron datos para él. `profiles_registered: 0` significa que se
        comprobaron las plataformas y que el número de teléfono no se encontró
        en ninguna de ellas: es una respuesta válida y facturable, y una señal
        habitual de identidad sintética.
      properties:
        profiles_registered:
          type: integer
          nullable: true
          description: >-
            Plataformas en las que se ha confirmado que el número de teléfono
            está registrado.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: Plataformas evaluadas para el registro.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: Plataformas que devolvieron un nombre asociado.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: Plataformas que devolvieron una foto de perfil.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: Plataformas de comunicación en las que se detectó presencia.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: Categorías de plataforma distintas en las que se detectó presencia.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: Indicador compuesto de madurez digital, de 0 a 10.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: Indicador de riqueza del perfil, de 0 a 10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: Proporción entre plataformas gratuitas y de pago, de 0 a 10.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: Registros en plataformas gratuitas.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: Registros en plataformas totalmente de pago.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: Registros en plataformas freemium.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: >-
            Grado de completitud del perfil de WhatsApp. Solo para teléfono;
            null para correo electrónico.
          example: Partial
        registered_platforms:
          type: array
          description: Plataformas en las que se ha confirmado el registro.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        not_registered_platforms:
          type: array
          description: Plataformas comprobadas con resultado negativo.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        categories:
          type: object
          description: Número de registros y proporción por categoría de plataforma.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: >-
            Detalles del perfil por plataforma, indexados por plataforma, cuando
            la plataforma los expone.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    EmailIntelligence:
      type: object
      description: >-
        Bloque normalizado de inteligencia de correo electrónico. Solo está
        presente cuando el complemento de inteligencia se ejecutó para este
        correo; cuando está presente, también se expone con el alias
        `enrichment` y valores idénticos.
      properties:
        score:
          type: number
          nullable: true
          description: >-
            Puntuación de riesgo normalizada de 0 a 100. Cuanto más alta, mayor
            es el riesgo.
        deliverable:
          type: string
          nullable: true
          description: Rango de entregabilidad (p. ej., `high`).
        breach_risk_level:
          type: string
          nullable: true
          description: '`Low`, `Medium` o `High`.'
        breach_risk_index:
          type: number
          nullable: true
          description: Índice numérico de riesgo de filtración.
        is_recent_breach:
          type: boolean
          nullable: true
          description: '`true` cuando la dirección aparece en una filtración reciente.'
        is_frequent_breached:
          type: boolean
          nullable: true
          description: '`true` cuando la dirección aparece en muchas filtraciones.'
        is_disposable:
          type: boolean
          nullable: true
          description: '`true` cuando el dominio es un proveedor de correo desechable.'
        is_free_domain:
          type: boolean
          nullable: true
          description: '`true` cuando el dominio es un proveedor de correo gratuito.'
        is_breached:
          type: boolean
          nullable: true
          description: '`true` cuando la dirección aparece en filtraciones conocidas.'
        no_of_breaches:
          type: number
          nullable: true
          description: Número de filtraciones conocidas que contienen la dirección.
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: >-
                  Identificador estable de Didit para la señal, por ejemplo
                  `IR-5AC67A32`. Es opaco: agrupa y filtra por él, pero no lo
                  analices.
              value:
                nullable: true
                description: >-
                  En un indicador de riesgo (por ejemplo, `voip`, `leaked`,
                  `disposable`, `spam_trap`), su valor: un booleano, un nivel o
                  una fecha. Null en un código de motivo con puntuación.
              direction:
                type: string
                enum:
                  - risk
                  - trust
                description: Si la señal aumentó el riesgo o aportó confianza.
              message:
                type: string
                description: Explicación legible de la señal, en inglés.
              impact_level:
                type: string
                nullable: true
                description: >-
                  Cuánto movió la señal la puntuación, por ejemplo `low`,
                  `medium` o `high`.
          description: >-
            Señales que explican la puntuación, cada una con un código estable
            de Didit, una dirección, un mensaje y un nivel de impacto. Pueden
            aparecer códigos nuevos con el tiempo, así que no rechaces los
            códigos desconocidos.
    EmailSocialFootprint:
      type: object
      nullable: true
      description: >-
        Huella social de la dirección de correo electrónico: las plataformas en
        línea en las que está registrada. Solo está presente cuando se activó
        `enable_social` y la comprobación finalizó. Cualquier recuento puede ser
        null cuando no se obtuvieron datos para él. `profiles_registered: 0`
        significa que se comprobaron las plataformas y que la dirección de
        correo electrónico no se encontró en ninguna de ellas: es una respuesta
        válida y facturable, y una señal habitual de identidad sintética.
      properties:
        profiles_registered:
          type: integer
          nullable: true
          description: >-
            Plataformas en las que se ha confirmado que la dirección de correo
            electrónico está registrada.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: Plataformas evaluadas para el registro.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: Plataformas que devolvieron un nombre asociado.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: Plataformas que devolvieron una foto de perfil.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: Plataformas de comunicación en las que se detectó presencia.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: Categorías de plataforma distintas en las que se detectó presencia.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: Indicador compuesto de madurez digital, de 0 a 10.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: Indicador de riqueza del perfil, de 0 a 10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: Proporción entre plataformas gratuitas y de pago, de 0 a 10.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: Registros en plataformas gratuitas.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: Registros en plataformas totalmente de pago.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: Registros en plataformas freemium.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: >-
            Grado de completitud del perfil de WhatsApp. Solo para teléfono;
            null para correo electrónico.
          example: Partial
        registered_platforms:
          type: array
          description: Plataformas en las que se ha confirmado el registro.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        not_registered_platforms:
          type: array
          description: Plataformas comprobadas con resultado negativo.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        categories:
          type: object
          description: Número de registros y proporción por categoría de plataforma.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: >-
            Detalles del perfil por plataforma, indexados por plataforma, cuando
            la plataforma los expone.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    DocumentAIDetectedCode:
      type: object
      required:
        - type
        - page_number
        - position
        - x
        - 'y'
        - width
        - height
        - page_width
        - page_height
        - raw_payload
        - parsed_payload
      properties:
        type:
          type: string
          description: >-
            Simbología detectada, por ejemplo `QR_CODE`, `CODE_128`, `EAN_13`,
            `DATA_MATRIX` o `PDF_417`.
        page_number:
          type: integer
          minimum: 1
          description: Número de página, empezando en 1.
        position:
          type: array
          nullable: true
          description: >-
            Polígono detectado en coordenadas de píxeles de la página
            renderizada. Es `null` cuando no hay una ubicación fiable
            disponible.
          items:
            type: array
            minItems: 2
            maxItems: 2
            items:
              type: integer
        x:
          type: integer
          nullable: true
          description: >-
            Borde izquierdo del cuadro delimitador, en píxeles de la página
            renderizada.
        'y':
          type: integer
          nullable: true
          description: >-
            Borde superior del cuadro delimitador, en píxeles de la página
            renderizada.
        width:
          type: integer
          nullable: true
          description: Ancho del cuadro delimitador en píxeles de la página renderizada.
        height:
          type: integer
          nullable: true
          description: Altura del cuadro delimitador en píxeles de la página renderizada.
        page_width:
          type: integer
          description: Ancho de la página renderizada en píxeles.
        page_height:
          type: integer
          description: Altura de la página renderizada en píxeles.
        raw_payload:
          type: string
          description: >-
            Payload del decodificador sin procesar como cadena base64 cuando
            está disponible; en caso contrario, una cadena vacía.
        parsed_payload:
          nullable: true
          description: >-
            Cadena decodificada o valor estructurado. `null` cuando el código se
            localizó pero no se pudo decodificar.
    BankVerificationResult:
      type: object
      description: >-
        El resultado de un paso de Verificación bancaria, para Verificación de
        usuarios y Verificación de empresas. `method` indica cómo se verificó la
        cuenta, y `none`, que la persona continuó sin banco antes de que se
        evaluara ningún intento. `continued_without_bank` indica que la persona
        continuó sin banco, también después de un intento evaluado. Consulta
        [Métodos de verificación
        bancaria](/es/core-technology/bank-verification/verification-methods) y
        [Cuando la persona no puede verificar su
        banco](/es/core-technology/bank-verification/fallbacks).
      properties:
        schema_version:
          type: integer
          description: Versión de la estructura de este resultado. Actualmente, `1`.
        bank_verification_id:
          type: string
          format: uuid
          description: El ID de este resultado.
        node_id:
          type: string
          description: El nodo del flujo al que pertenece este resultado.
        status:
          type: string
          enum:
            - Not Finished
            - Approved
            - Declined
            - In Review
            - Expired
          description: El veredicto del paso, después de sus acciones y reglas de estado.
        original_status:
          type: string
          nullable: true
          description: >-
            El primer veredicto al que llegó el paso, antes de cualquier cambio
            posterior, como una revisión manual.
        method:
          type: string
          nullable: true
          enum:
            - open_banking
            - account_lookup
            - microdeposits
            - statement
            - none
          description: >-
            Cómo se verificó la cuenta: `open_banking` (inicio de sesión
            bancario: la persona inició sesión en su banco), `account_lookup`
            (comprobación de cuenta: la persona escribió los datos de la cuenta
            y el banco confirmó el nombre), `microdeposits` o `statement`
            (subida de un extracto). `none` cuando la persona continuó sin banco
            antes de que se evaluara ningún intento, por lo que no se verificó
            ninguna cuenta. Tras un intento evaluado, se mantiene el método de
            ese intento. `null` hasta que se evalúa una cuenta, y cuando el
            flujo limita los datos que devuelve. Las reglas del flujo leen el
            mismo valor como `bank.method`.
        provider:
          type: string
          nullable: true
          description: >-
            La clave de la ruta que ejecutó la conexión. Para saber cómo se
            verificó la cuenta, consulta `method`, no esta clave.
        credential_source:
          type: string
          nullable: true
          enum:
            - native
            - byok
          description: >-
            `native`: la ruta propia de Didit, facturada a tu saldo de Didit.
            `byok`: un proveedor del marketplace que conectaste con tus propias
            credenciales.
        route:
          type: object
          nullable: true
          description: La ruta elegida antes del consentimiento. Nunca cambia después.
          properties:
            provider_key:
              type: string
              nullable: true
              description: La clave de la ruta.
            credential_source:
              type: string
              enum:
                - native
                - byok
            is_fallback:
              type: boolean
              description: >-
                Indica si la ruta propia de Didit sustituyó a un proveedor del
                marketplace que no pudo conectarse.
            provider_connection_id:
              type: string
              nullable: true
              description: La conexión del marketplace utilizada, para `byok`.
            requested_scopes:
              type: array
              items:
                type: string
              description: >-
                Los datos que solicitó la conexión, por ejemplo `ownership` o
                `balances`.
        connection:
          type: object
          nullable: true
          description: La conexión del último intento. `null` antes del primer intento.
          properties:
            status:
              type: string
              enum:
                - pending
                - connected
                - cancelled
                - timeout
                - failed
                - unsupported
                - revoked
                - expired
            institution_id:
              type: string
              nullable: true
              description: >-
                El ID del banco. `null` para una comprobación de cuenta, en la
                que no se elige ningún banco.
            institution_name:
              type: string
              nullable: true
              description: El nombre del banco. `null` para una comprobación de cuenta.
            institution_country:
              type: string
              nullable: true
              description: El país de la cuenta, en ISO 3166-1 alfa-3.
            oauth:
              type: boolean
              nullable: true
              description: >-
                Si el inicio de sesión en el banco se realizó mediante OAuth o
                de aplicación a aplicación. `null` para una comprobación de
                cuenta.
            connected_at:
              type: string
              format: date-time
              nullable: true
              description: Cuándo se estableció correctamente la conexión.
            consent_expires_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Cuándo finaliza el consentimiento bancario, para el inicio de
                sesión bancario.
            last_refreshed_at:
              type: string
              format: date-time
              nullable: true
              description: Cuándo se volvieron a leer por última vez los datos financieros.
            attempts:
              type: integer
              description: >-
                Los intentos que la persona empleó en este paso, sumando todos
                los métodos.
            reason_code:
              type: string
              nullable: true
              description: >-
                Por qué la conexión no es simplemente `connected`, por ejemplo
                `USER_CANCELLED`, `INSTITUTION_DOWN`, `ACCOUNT_NOT_FOUND`,
                `REFERENCE_IDENTITY_MISSING` o `VERIFICATION_COMPLETED`.
        account:
          type: object
          nullable: true
          description: La cuenta evaluada. `null` hasta que se evalúa una cuenta.
          properties:
            account_id_masked:
              type: string
              nullable: true
              description: El número de cuenta, enmascarado.
            iban_masked:
              type: string
              nullable: true
              description: El IBAN, enmascarado.
            sort_code:
              type: string
              nullable: true
              description: >-
                El código de clasificación bancaria (sort code), en el Reino
                Unido.
            routing_number_masked:
              type: string
              nullable: true
              description: El número de ruta bancaria, enmascarado.
            type:
              type: string
              nullable: true
              enum:
                - checking
                - current
                - savings
                - business
                - other
            subtype:
              type: string
              nullable: true
              description: El subtipo de cuenta propio del banco.
            currency:
              type: string
              nullable: true
              description: Moneda ISO 4217 de la cuenta.
            holder_type:
              type: string
              nullable: true
              enum:
                - person
                - business
                - unknown
            holders_count:
              type: integer
              nullable: true
            is_joint:
              type: boolean
              nullable: true
            is_business:
              type: boolean
              nullable: true
        ownership:
          type: object
          nullable: true
          description: >-
            Cómo se comparó el titular de la cuenta con la identidad verificada.
            `null` hasta que se evalúa una cuenta.
          properties:
            result:
              type: string
              enum:
                - match
                - partial_match
                - no_match
                - unknown
                - not_verifiable
              description: >-
                `partial_match` es una coincidencia cercana. `not_verifiable`:
                el banco respondió sin un titular con el que comparar.
                `unknown`: no se pudo leer la evidencia o no había ninguna
                identidad con la que comparar.
            reference_identity_source:
              type: string
              nullable: true
              description: >-
                El paso con cuya identidad se comparó al titular: `kyc`,
                `database_validation`, `expected_details`, `questionnaire`,
                `document_ai` o `kyb`.
            name_score:
              type: integer
              minimum: 0
              maximum: 100
              nullable: true
              description: Puntuación de Didit del nombre del titular.
            provider_name_score:
              type: integer
              minimum: 0
              maximum: 100
              nullable: true
              description: >-
                La puntuación propia del banco para el nombre del titular,
                cuando devolvió una.
            address_score:
              type: integer
              minimum: 0
              maximum: 100
              nullable: true
              description: >-
                La puntuación de la dirección del titular, cuando se ejecutó la
                comparación de direcciones.
            email_score:
              type: integer
              minimum: 0
              maximum: 100
              nullable: true
              description: >-
                La puntuación del correo electrónico del titular, cuando se
                ejecutó la comparación de correos electrónicos.
            phone_score:
              type: integer
              minimum: 0
              maximum: 100
              nullable: true
              description: >-
                La puntuación del teléfono del titular, cuando se ejecutó la
                comparación de teléfonos.
            dob_score:
              type: integer
              minimum: 0
              maximum: 100
              nullable: true
              description: >-
                La puntuación de la fecha de nacimiento del titular, cuando el
                banco compartió una.
            close_match:
              type: boolean
              nullable: true
              description: Si el nombre quedó en la franja de coincidencia cercana.
            holder_confirmation:
              type: string
              nullable: true
              enum:
                - pending
                - confirmed
                - rejected
              description: >-
                La respuesta de la persona cuando se le pidió confirmar un
                nombre con coincidencia cercana. `null` si nunca se le preguntó.
            method:
              type: string
              nullable: true
              enum:
                - exact
                - token_set
                - nickname
                - transliteration
                - fuzzy
                - provider_only
                - microdeposits
              description: >-
                Qué comparación de nombres produjo la puntuación. No es el
                método de verificación: para eso, consulta el `method` de nivel
                superior.
            matched_holder_index:
              type: integer
              nullable: true
            holders:
              type: array
              items:
                type: object
              description: Cada titular que indicó el banco, con sus puntuaciones.
            owner_identity_available:
              type: boolean
              nullable: true
            evidence_freshness:
              type: string
              nullable: true
              enum:
                - live
                - cached
                - refreshed
            evaluated_at:
              type: string
              format: date-time
              nullable: true
              description: Cuándo se calculó el veredicto.
        financial_data:
          type: object
          description: >-
            Los datos financieros que leyó el paso. Solo el inicio de sesión
            bancario los lee.
          properties:
            balances:
              type: object
              nullable: true
              description: Con el ámbito `balances`.
            transactions:
              type: object
              nullable: true
              description: Con el ámbito `transactions`.
            income:
              type: object
              nullable: true
              description: Con el ámbito `income`.
            categorization:
              type: object
              nullable: true
              description: >-
                Categorización de Didit de las transacciones leídas. `null` si
                no las hay.
            not_collected:
              type: array
              items:
                type: string
                enum:
                  - balances
                  - income
                  - transactions
              description: >-
                Los datos que solicitó el paso y que no recopila el método con
                el que se verificó la cuenta. Los saldos, las transacciones y
                los ingresos solo provienen del inicio de sesión bancario, por
                lo que una cuenta verificada mediante comprobación de cuenta los
                incluye aquí. Nunca es un fallo. Vacío en caso contrario.
        billing:
          type: object
          nullable: true
          properties:
            route:
              type: string
              enum:
                - native
                - byok
            billed:
              type: boolean
            marketplace_fee:
              type: string
              nullable: true
              description: La comisión de plataforma del marketplace cobrada, para `byok`.
            usage_type:
              type: string
              nullable: true
              description: >-
                La línea de uso en la que se registró el cargo:
                `bank_verification` para un inicio de sesión bancario o una
                comprobación de cuenta, `bank_statement_upload` para la subida
                de un extracto sin un intento bancario cobrado antes, y
                `bank_byok_fee` para la comisión del marketplace por usar tu
                propio proveedor. `null` cuando no se facturó nada.
        reference_identity:
          type: object
          nullable: true
          description: La identidad con la que se comparó al titular, junto con su fuente.
        signals:
          type: object
          nullable: true
          description: >-
            Señales de la cuenta obtenidas del historial de transacciones,
            cuando el paso las ha leído.
        connection_abandoned:
          type: boolean
          nullable: true
          description: >-
            Si el paso terminó sin coincidencia después de que la persona
            abandonara en su banco.
        not_covered:
          type: boolean
          nullable: true
          description: >-
            Si no se pudo acceder al banco o al país de la persona en este paso.
            También es `true` cuando la persona continuó sin banco porque ningún
            método podía verificar su país o su banco.
        continued_without_bank:
          type: boolean
          description: >-
            Si la persona salió del paso con **Continue without your bank**. En
            ese caso, `continuation` indica el motivo. `method` es `none` cuando
            no se evaluó ningún intento antes de que continuara. Tras un intento
            evaluado, como un titular que no coincide, `method` sigue siendo el
            método de ese intento, y su veredicto y sus códigos de motivo se
            mantienen. Se devuelve incluso cuando el flujo limita los datos que
            devuelve.
        continuation:
          type: object
          nullable: true
          description: >-
            Cómo continuó la persona sin banco. `null` cuando no lo hizo. Cuando
            el flujo limita los datos que devuelve, `reason` se sigue
            devolviendo y todas las demás claves son `null`.
          properties:
            reason:
              type: string
              enum:
                - no_route
                - institution_unsupported
                - attempts_exhausted
                - person_choice
              description: >-
                Por qué, según lo determinó Didit cuando la persona continuó:
                `no_route` (ningún inicio de sesión bancario ni comprobación de
                cuenta da servicio a su país), `institution_unsupported` (el
                banco que eligió no se puede usar en este paso),
                `attempts_exhausted` (ya se habían agotado todos los intentos y
                ninguno estaba en curso) o `person_choice` (había una forma de
                verificar y eligió continuar, también cuando no se pudo acceder
                a su banco en ese momento). `no_route` e
                `institution_unsupported` siguen `bank_unsupported_action`,
                `attempts_exhausted` sigue `bank_attempts_exhausted_action` y
                `person_choice` sigue `bank_skipped_action`, salvo que un
                intento evaluado ya haya decidido el paso.
            country:
              type: string
              nullable: true
              description: >-
                El país en el que la persona se estaba verificando, en ISO
                3166-1 alpha-3. `null` cuando continuó antes de elegir uno.
            offered:
              type: array
              items:
                type: string
                enum:
                  - statement
                  - microdeposits
              nullable: true
              description: >-
                Las otras formas de verificación que ese país ofreció a la
                persona cuando continuó, en el orden en que las ofreció:
                `statement` (la carga de un extracto) y luego `microdeposits`.
                Vacío cuando no ofreció ninguna.
            institution_id:
              type: string
              nullable: true
              description: >-
                Para `institution_unsupported`, el ID del banco que la persona
                no pudo usar: el banco que eligió o el banco en el que terminó
                su último intento. Didit lo toma de su propia lista de bancos,
                nunca del dispositivo de la persona, por lo que un banco que no
                está en esa lista es `null`. `null` para cualquier otro motivo.
            institution_name:
              type: string
              nullable: true
              description: >-
                Para `institution_unsupported`, el nombre de ese banco, de la
                misma lista que `institution_id`. `null` cuando esa lista no
                incluye el banco, y para cualquier otro motivo.
            continued_at:
              type: string
              format: date-time
              nullable: true
              description: Fecha y hora en que la persona continuó.
        evidence_purged_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Cuándo se eliminó la evidencia bancaria según
            `bank_evidence_retention_days`. `null` en caso contrario.
        warnings:
          type: array
          items:
            type: string
          description: >-
            Códigos informativos, por ejemplo `holder_declared`. Una advertencia
            nunca cambia el estado por sí sola.
        reason_codes:
          type: array
          items:
            type: string
          description: >-
            Por qué el veredicto resultó así, por ejemplo `OWNER_NAME_PARTIAL`.
            Pueden aplicarse varios. `NOT_COVERED`: la persona continuó sin
            banco porque ningún método podía verificar su país o su banco.
            `SKIPPED`: la persona eligió continuar sin banco aunque había una
            forma de verificar. No se añade ninguno de los dos cuando un intento
            evaluado ya decidió el paso.
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    SignatureResult:
      type: object
      description: >-
        El resultado de un firmante para un paso de Firma electrónica. Consulta
        el [informe de Firma
        electrónica](/es/core-technology/electronic-signature/report-electronic-signature).
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Pásalo como `signature_id` para descargar la evidencia de este
            firmante o validar su firma.
        node_id:
          type: string
          description: El paso del flujo que lo generó.
        status:
          type: string
          enum:
            - intro
            - review
            - code
            - signing
            - signed
            - declined
          description: >-
            En qué punto del paso se encuentra el firmante. Solo `signed`
            significa que los documentos están firmados.
        verdict:
          type: string
          enum:
            - Not Finished
            - Approved
            - In Review
            - Declined
          description: >-
            El resultado del paso. Una advertencia lo establece mediante su
            regla; las reglas de estado personalizadas se aplican después.
        level:
          type: string
          enum:
            - simple
            - aes
            - qes
          description: >-
            `simple` (predeterminado) o `aes`. `qes` (firma electrónica
            cualificada, QES) es un complemento que aún no está disponible.
        format:
          type: string
          enum:
            - pdf
            - pades
          description: '`pdf` para una firma simple, `pades` para la avanzada (AES).'
        profile:
          type: string
          nullable: true
          description: >-
            `PAdES-B-LT` una vez firmada una firma avanzada (AES); en caso
            contrario, null.
        signer:
          type: object
          properties:
            name:
              type: string
              nullable: true
              description: >-
                El nombre del firmante. Está verificado (a partir de la
                verificación de identidad aprobada o de la sesión), salvo en el
                nivel Simple sin un nombre de sesión verificado, donde es el
                nombre que escribió el firmante y no está verificado.
            capacity:
              type: string
              enum:
                - self
                - company
            company:
              type: string
              nullable: true
            role:
              type: string
              nullable: true
              description: El cargo de la persona clave, tal como se declaró.
            roles:
              type: array
              items:
                type: string
              description: >-
                Los roles estructurados de la persona clave, tal como se
                declararon para la empresa.
            identity_session_id:
              type: string
              format: uuid
              description: La sesión de KYC que verificó al firmante.
        identity_used:
          type: object
          description: >-
            La identidad verificada en la que se basa la firma. Vacío para una
            firma Simple sin identidad verificada.
          properties:
            session_id:
              type: string
              format: uuid
            kyc_id:
              type: string
              format: uuid
              nullable: true
            verified:
              type: boolean
            expected_name:
              type: string
              nullable: true
              description: El nombre con el que debía coincidir el firmante.
        certificate:
          type: object
          nullable: true
          description: >-
            El certificado con el que se firmaron los documentos. `null` hasta
            que se firman, y siempre `null` en una firma simple.
          properties:
            issuer:
              type: string
            issued_to:
              type: string
            serial:
              type: string
              description: Número de serie, en hexadecimal.
            valid_from:
              type: string
              format: date-time
            valid_until:
              type: string
              format: date-time
        confirmation:
          type: object
          properties:
            channel:
              type: string
              nullable: true
              enum:
                - email
                - sms
              description: '`null` para una firma simple, que no tiene código.'
            destination:
              type: string
              nullable: true
              description: El contacto enmascarado al que se envió el código.
            confirmed_at:
              type: string
              format: date-time
              nullable: true
            attempts:
              type: integer
              description: Códigos introducidos, incluido el correcto.
        timestamp:
          type: object
          nullable: true
          description: >-
            La marca de tiempo RFC 3161 de la firma, emitida por Didit. Es
            `null` hasta que se firma, y siempre `null` en una firma simple.
          properties:
            time:
              type: string
              format: date-time
            qualified:
              type: boolean
              description: Siempre `false` para AES.
            valid:
              type: boolean
        documents:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                description: >-
                  El documento de la copia de este firmante. Úsalo para
                  descargar el archivo firmado.
              uuid:
                type: string
                format: uuid
                description: Igual que `id`.
              title:
                type: string
              file_name:
                type: string
              pages:
                type: integer
                description: Páginas del documento firmadas. En Word, del PDF convertido.
              size_bytes:
                type: integer
              sha256_original:
                type: string
                description: SHA-256 del documento tal como se le mostró al firmante.
              sha256_signed:
                type: string
                nullable: true
                description: SHA-256 del PDF firmado, una vez firmado.
              status:
                type: string
                enum:
                  - signed
                  - declined
                  - not_signed
                  - not_reached
                description: >-
                  `not_signed`: abierto pero no firmado. `not_reached`: nunca se
                  abrió.
              opened_at:
                type: string
                format: date-time
                nullable: true
              read_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Fecha y hora en que el firmante llegó al final de un documento
                  sin campos, cuando el paso lo exige.
              read_to_end:
                type: boolean
              consented_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Fecha y hora en que el firmante aceptó un documento sin
                  campos, o completó los campos de un documento con campos.
              consent:
                type: boolean
              signed_file:
                type: string
                nullable: true
                description: >-
                  Ruta del PDF firmado, una vez firmado. Consulta [Descargar un
                  documento
                  firmado](/es/sessions-api/electronic-signature/download-signed-document).
              mode:
                type: string
                enum:
                  - fields
                  - read_and_agree
                description: >-
                  `fields` para un documento con campos, `read_and_agree` para
                  un documento sin campos.
              source_format:
                type: string
                enum:
                  - pdf
                  - docx
                description: >-
                  `pdf`, o `docx` para un documento de Word que Didit convirtió
                  a PDF.
              conversion:
                type: object
                nullable: true
                description: >-
                  `null` para un PDF. Para un documento de Word, el archivo
                  original y la conversión.
                properties:
                  from:
                    type: string
                    enum:
                      - docx
                  file_name:
                    type: string
                    description: El nombre original de tu archivo de Word.
                  sha256:
                    type: string
                    description: SHA-256 de tu archivo de Word original.
                  size_bytes:
                    type: integer
                    description: Tamaño de tu archivo de Word original.
                  converter:
                    type: string
                    description: Versión del conversor que generó el PDF.
              fields:
                type: array
                description: >-
                  Campos del documento, con sus valores. Vacío para un documento
                  sin campos.
                items:
                  $ref: '#/components/schemas/SignatureFieldResult'
        adopted_signature:
          type: object
          nullable: true
          description: >-
            La firma y las iniciales que adoptó el firmante para los campos de
            firma e iniciales. `null` hasta que el firmante adopte una.
          properties:
            method:
              type: string
              enum:
                - typed
                - drawn
              description: >-
                `typed`: el nombre verificado con un estilo de escritura a mano.
                `drawn`: dibujada con el dedo o con el ratón (mouse).
            font:
              type: string
              nullable: true
              description: >-
                El estilo de escritura a mano de una firma escrita con teclado.
                `null` cuando se dibuja.
            adopted_at:
              type: string
              format: date-time
        electronic_signature_consent_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Fecha y hora en que el firmante aceptó, en la pantalla de revisión,
            firmar los documentos electrónicamente. Se establece cuando algún
            documento tiene campos.
        evidence_file:
          type: string
          nullable: true
          description: >-
            Ruta del PDF de evidencia, una vez firmado. Consulta [Descargar la
            evidencia de la
            firma](/es/sessions-api/electronic-signature/download-evidence).
        warnings:
          type: array
          description: >-
            Advertencias generadas para este firmante. Consulta [Advertencias de
            firma
            electrónica](/es/core-technology/electronic-signature/warnings-electronic-signature).
          items:
            type: object
            properties:
              code:
                type: string
                enum:
                  - SIGNATURE_DECLINED
                  - SIGNATURE_OTP_FAILED
                  - SIGNATURE_NAME_MISMATCH
                  - SIGNATURE_IDENTITY_NOT_VERIFIED
                  - SIGNATURE_DOCUMENT_CHANGED
                  - SIGNATURE_FIELD_DATA_MISSING
              node_id:
                type: string
        validation:
          type: object
          nullable: true
          description: >-
            La última comprobación criptográfica de los documentos firmados.
            `null` hasta que se firman los documentos. Si Didit no puede
            confirmar el resultado de la firma, el valor es `{"valid": null,
            "reason": "signature_provider_outcome_unknown", "checked_at": ...}`
            y `status` se mantiene en `signing`: considéralo como no firmado.
          properties:
            valid:
              type: boolean
              nullable: true
              description: >-
                `true` cuando todos los documentos son válidos. `null` cuando no
                se pudo confirmar el resultado de la firma.
            reason:
              type: string
              description: >-
                Se establece cuando `valid` es `null`:
                `signature_provider_outcome_unknown`.
            checked_at:
              type: string
              format: date-time
            documents:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                  checked_at:
                    type: string
                    format: date-time
                  valid:
                    type: boolean
                    description: >-
                      `true` cuando la firma y el sello de tiempo son válidos y
                      de confianza.
                  integrity:
                    type: boolean
                    description: '`true` cuando el documento no ha cambiado desde la firma.'
                  trusted:
                    type: boolean
                    description: >-
                      `true` cuando la cadena del certificado de firma llega a
                      una raíz de confianza.
                  revoked:
                    type: boolean
                  trusted_list:
                    type: object
                    description: >-
                      Comprobación en la Lista de Confianza de la UE. Para AES:
                      `{"status": "not_applicable", "reason":
                      "aes_not_qualified"}`.
                    properties:
                      status:
                        type: string
                      reason:
                        type: string
                  certificate:
                    type: object
                    nullable: true
                    description: >-
                      El certificado con el que se firmaron los documentos.
                      `null` hasta que se firman, y siempre `null` en una firma
                      simple.
                    properties:
                      issuer:
                        type: string
                      issued_to:
                        type: string
                      serial:
                        type: string
                        description: Número de serie, en hexadecimal.
                      valid_from:
                        type: string
                        format: date-time
                      valid_until:
                        type: string
                        format: date-time
                  timestamp:
                    type: object
                    nullable: true
                    description: >-
                      La marca de tiempo RFC 3161 de la firma, emitida por
                      Didit. Es `null` hasta que se firma, y siempre `null` en
                      una firma simple.
                    properties:
                      time:
                        type: string
                        format: date-time
                      qualified:
                        type: boolean
                        description: Siempre `false` para AES.
                      valid:
                        type: boolean
        declined_at:
          type: string
          format: date-time
          nullable: true
        declined_action:
          type: string
          enum:
            - DECLINE
            - REVIEW
            - NO_ACTION
        signed_at:
          type: string
          format: date-time
          nullable: true
        expires_at:
          type: string
          format: date-time
          description: Fecha y hora en que el enlace de firma deja de funcionar.
        email_sent_at:
          type: string
          format: date-time
          nullable: true
        email_unavailable_reason:
          type: string
          nullable: true
        ip_address:
          type: string
          nullable: true
          description: La dirección IP del firmante cuando solicitó su código.
        place:
          type: string
          nullable: true
          description: 'No se recopila: siempre es `null`.'
        place_unavailable_reason:
          type: string
          nullable: true
          enum:
            - not_collected
    AMLScreening:
      type: object
      properties:
        node_id:
          type: string
          description: Identificador único de este paso AML en el grafo del flujo.
        status:
          type: string
          description: >-
            Estado a nivel de función de este análisis AML. Es independiente del
            `status` de nivel superior de la sesión: una sesión puede alcanzar
            su decisión global mientras una función concreta sigue en `In
            Review`.
          enum:
            - Not Finished
            - Approved
            - Declined
            - In Review
            - Resub Requested
        total_hits:
          type: integer
          description: Número total de coincidencias encontradas
        entity_type:
          type: string
          description: 'Tipo de entidad analizada: persona o empresa'
        hits:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                description: >-
                  Identificador estable de Didit para la coincidencia: `hit_`
                  seguido de 24 caracteres hexadecimales. La misma entidad
                  coincidente conserva el mismo `id` cuando el sujeto se vuelve
                  a analizar. Pásalo como `hit_id` a los endpoints de revisión
                  de coincidencias AML.
              url:
                type: string
                format: uri
                description: URL de origen de la coincidencia
              match:
                type: boolean
                description: Si se trata de una coincidencia confirmada
              score:
                type: number
                format: float
                nullable: true
                minimum: 0
                maximum: 1
                description: >-
                  Puntuación de coincidencia ponderada obsoleta en el rango 0-1
                  (p. ej., `0.73`). Usa `match_score` (0-100) en su lugar.
                deprecated: true
              target:
                type: boolean
                nullable: true
                description: >-
                  Si la entidad coincidente es el objetivo directo de la
                  inclusión en la lista (y no una parte relacionada). `null`
                  cuando la fuente no lo especifica.
              caption:
                type: string
                description: Leyenda o título de la coincidencia
              datasets:
                type: array
                items:
                  type: string
                  enum:
                    - PEP
                    - PEP Level 1
                    - PEP Level 2
                    - PEP Level 3
                    - PEP Level 4
                    - Sanctions
                    - Adverse Media
                    - Warnings and Regulatory Enforcement
                    - Fitness and Probity
                    - SIP
                    - SIE
                    - Insolvency
                    - Other Lists
                description: >-
                  Lista de categorías de conjuntos de datos en las que se
                  encontró la coincidencia. Indica si la entidad apareció en
                  listas PEP (con nivel), bases de datos de sanciones, medios
                  adversos, advertencias o medidas regulatorias de cumplimiento,
                  u otros conjuntos de datos de cumplimiento. `Other Lists`
                  cuando la fuente de la entidad no indica ninguna de estas
                  categorías.
              features:
                type: object
                nullable: true
                description: Características adicionales de la coincidencia
              rca_name:
                type: string
                description: Nombre del RCA, si corresponde
              last_seen:
                type: string
                format: date-time
                description: Fecha en que se detectó la coincidencia por última vez
              risk_view:
                type: object
                properties:
                  crimes:
                    type: object
                    properties:
                      score:
                        type: integer
                      weightage:
                        type: integer
                      risk_level:
                        type: string
                      risk_scores:
                        type: object
                  countries:
                    type: object
                    properties:
                      score:
                        type: integer
                      weightage:
                        type: integer
                      risk_level:
                        type: string
                      risk_scores:
                        type: object
                  categories:
                    type: object
                    properties:
                      score:
                        type: integer
                      weightage:
                        type: integer
                      risk_level:
                        type: string
                      risk_scores:
                        type: object
                  custom_list:
                    type: object
              first_seen:
                type: string
                format: date-time
                description: Fecha en que se detectó la coincidencia por primera vez
              properties:
                type: object
                properties:
                  name:
                    type: array
                    items:
                      type: string
                  alias:
                    type: array
                    items:
                      type: string
                  notes:
                    type: array
                    items:
                      type: string
                  title:
                    type: string
                    nullable: true
                  gender:
                    type: array
                    items:
                      type: string
                  height:
                    type: string
                    nullable: true
                  topics:
                    type: string
                    nullable: true
                  weight:
                    type: string
                    nullable: true
                  address:
                    type: string
                    nullable: true
                  country:
                    type: string
                    nullable: true
                  website:
                    type: string
                    nullable: true
                  eyeColor:
                    type: string
                    nullable: true
                  keywords:
                    type: string
                    nullable: true
                  lastName:
                    type: array
                    items:
                      type: string
                  position:
                    type: string
                    nullable: true
                  religion:
                    type: string
                    nullable: true
                  birthDate:
                    type: array
                    items:
                      type: string
                  education:
                    type: array
                    items:
                      type: string
                  ethnicity:
                    type: string
                    nullable: true
                  firstName:
                    type: array
                    items:
                      type: string
                  hairColor:
                    type: string
                    nullable: true
                  weakAlias:
                    type: string
                    nullable: true
                  birthPlace:
                    type: array
                    items:
                      type: string
                  modifiedAt:
                    type: string
                    nullable: true
                  wikidataId:
                    type: string
                    nullable: true
                  citizenship:
                    type: string
                    nullable: true
                  nationality:
                    type: string
                    nullable: true
              match_score:
                type: number
                description: >-
                  Puntuación de confianza de identidad ponderada (0-100),
                  calculada a partir de la similitud del nombre, la fecha de
                  nacimiento y la coincidencia de país. Se usa para determinar
                  si un resultado es un falso positivo o una posible
                  coincidencia.
                format: float
                nullable: true
              risk_score:
                type: number
                description: >-
                  Puntuación de riesgo de la entidad (0-100). Se usa para
                  determinar el estado AML final (Aprobado/En
                  revisión/Rechazado) según el risk_score más alto entre las
                  coincidencias que no son falsos positivos.
              review_status:
                type: string
                description: >-
                  Estado de revisión de esta coincidencia. Puede ser
                  'Unreviewed', 'Confirmed Match', 'False Positive' o
                  'Inconclusive'.
                enum:
                  - Unreviewed
                  - Confirmed Match
                  - False Positive
                  - Inconclusive
              score_breakdown:
                type: object
                description: Desglose detallado de cómo se calculó match_score.
                properties:
                  name_score:
                    type: integer
                    description: Porcentaje de similitud de nombre sin procesar (0-100).
                  name_weight:
                    type: integer
                    description: Peso original del nombre según la configuración (0-100).
                  name_weight_normalized:
                    type: number
                    description: >-
                      Peso normalizado del nombre tras reponderar por datos
                      faltantes (0-100).
                  name_contribution:
                    type: number
                    description: Puntos que aporta el nombre a la puntuación total.
                  dob_score:
                    type: integer
                    description: >-
                      Puntuación de coincidencia de la fecha de nacimiento (de
                      -100 a 100).
                  dob_weight:
                    type: integer
                    description: >-
                      Peso original de la fecha de nacimiento según la
                      configuración (0-100).
                  dob_weight_normalized:
                    type: number
                    description: >-
                      Peso normalizado de la fecha de nacimiento tras reponderar
                      por datos faltantes (0-100).
                  dob_contribution:
                    type: number
                    description: >-
                      Puntos que aporta la fecha de nacimiento a la puntuación
                      total.
                  country_score:
                    type: integer
                    description: Puntuación de coincidencia del país (de -100 a 100).
                  country_weight:
                    type: integer
                    description: Peso original del país según la configuración (0-100).
                  country_weight_normalized:
                    type: number
                    description: >-
                      Peso normalizado del país tras reponderar por datos
                      faltantes (0-100).
                  country_contribution:
                    type: number
                    description: Puntos que aporta el país a la puntuación total.
                  document_number_match_type:
                    type: string
                    description: >-
                      Resultado de la evaluación 'Golden Key' del número de
                      documento.
                    enum:
                      - MATCH
                      - NEUTRAL
                      - HARD_MISMATCH
                  document_number_effect:
                    type: string
                    description: >-
                      Descripción legible del efecto del número de documento en
                      la puntuación.
                  total_score:
                    type: integer
                    description: Puntuación de coincidencia ponderada final (0-100).
              pep_matches:
                type: array
                items:
                  type: object
                  properties:
                    aliases:
                      type: array
                      items:
                        type: string
                    education:
                      type: array
                      items:
                        type: string
                    list_name:
                      type: string
                    publisher:
                      type: string
                    source_url:
                      type: string
                      format: uri
                    description:
                      type: string
                    matched_name:
                      type: string
                    pep_position:
                      type: string
                    date_of_birth:
                      type: string
                    other_sources:
                      type: array
                      items:
                        type: string
                    place_of_birth:
                      type: string
              linked_entities:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: array
                      items:
                        type: string
                    active:
                      type: array
                      items:
                        type: string
                    status:
                      type: array
                      items:
                        type: string
                    details:
                      type: array
                      items:
                        type: string
                    relation:
                      type: array
                      items:
                        type: string
              warning_matches:
                type: array
                description: >-
                  Lista de coincidencias de advertencias y medidas regulatorias
                  de cumplimiento. Incluye entradas de las categorías: Warning,
                  SIP, Warnings and Regulatory Enforcement, Fitness and Probity,
                  SIE e Insolvency.
                items:
                  type: object
                  properties:
                    list_name:
                      type: string
                      description: Nombre del editor de la lista de advertencias
                    matched_name:
                      type: string
                      description: Nombre que coincidió en la lista de advertencias
                    description:
                      type: string
                      description: Descripción de la entrada de advertencia
                    publisher:
                      type: string
                      description: Emisor o fuente de la advertencia
                    source_url:
                      type: string
                      format: uri
                      description: URL de la fuente de la advertencia
                    other_sources:
                      type: array
                      items:
                        type: string
                      description: URL de fuentes adicionales
                    countries:
                      type: array
                      items:
                        type: string
                      nullable: true
                      description: Países asociados a la advertencia
                    created_at:
                      type: string
                      nullable: true
                      description: Fecha en que se creó la entrada de advertencia
                    updated_at:
                      type: string
                      nullable: true
                      description: >-
                        Fecha de la última actualización de la entrada de
                        advertencia
                    additional_data:
                      type: object
                      description: >-
                        Datos adicionales de la fuente de la advertencia. Puede
                        contener un objeto `data` con un array `case_details`.
                      properties:
                        data:
                          type: object
                          properties:
                            case_details:
                              type: array
                              description: >-
                                Detalles de los casos de advertencia asociados a
                                esta coincidencia
                              items:
                                type: object
                                properties:
                                  case_type:
                                    type: string
                                    description: Tipo del caso de advertencia
                                    enum:
                                      - Accusation
                                      - Arrest
                                      - Bribery
                                      - Criminal
                                      - Fraud
                                      - Illegal Fundraising
                                      - Non-conviction Terror
                                      - Proclaimed Offender
                                      - Regulatory Enforcement
                                      - Terrorism
                                      - Terrorism-related
                                      - Terrorism-related listing
              sanction_matches:
                type: array
                description: >-
                  Lista de coincidencias en listas de sanciones encontradas para
                  esta entidad.
                items:
                  type: object
                  properties:
                    list_name:
                      type: array
                      items:
                        type: string
                      nullable: true
                      description: Nombre(s) de la(s) lista(s) de sanciones
                    matched_name:
                      type: string
                      description: Nombre que coincidió en la lista de sanciones
                    description:
                      type: string
                      description: Descripción de la entrada de sanción
                    reason:
                      type: string
                      nullable: true
                      description: >-
                        Motivo en texto libre por el que se sancionó a la
                        entidad. Se compone a partir de las entradas de motivo
                        de la lista de sanciones. Ejemplos: 'Executive Order
                        13224 (Terrorism)', 'Support for actions undermining
                        Ukraine's sovereignty', 'Listed due to national security
                        concerns.'
                    source_url:
                      type: string
                      format: uri
                      description: URL de la fuente de la sanción
                    other_sources:
                      type: array
                      items:
                        type: string
                      description: URL de fuentes adicionales
                    details:
                      type: array
                      items:
                        type: string
                      description: Detalles adicionales sobre la sanción
                    legal_basis:
                      type: array
                      items:
                        type: string
                      description: Fundamento jurídico de la sanción
                    listed_on:
                      type: array
                      items:
                        type: string
                      nullable: true
                      description: Fecha(s) en que la entidad se incluyó en la lista
                    sanction_list:
                      type: array
                      items:
                        type: string
                      nullable: true
                      description: Identificador(es) de la lista de sanciones
                    sanction_program:
                      type: array
                      items:
                        type: string
                      description: Programa(s) de sanciones en los que figura la entidad
                    sanctioning_authority:
                      type: array
                      items:
                        type: string
                      description: Autoridad o autoridades que impusieron la sanción
                    updated_on:
                      type: array
                      items:
                        type: string
                      description: >-
                        Fecha(s) de la última actualización de la entrada de
                        sanciones
                    additional_data:
                      type: object
                      description: >-
                        Datos adicionales de la fuente de la sanción que no se
                        recogen en los campos principales
              adverse_media_details:
                type: object
                properties:
                  sentiment:
                    type: string
                  entity_type:
                    type: string
                  sentiment_score:
                    type: integer
                  adverse_keywords:
                    type: object
                    additionalProperties:
                      type: integer
              adverse_media_matches:
                type: array
                items:
                  type: object
                  properties:
                    country:
                      type: string
                    summary:
                      type: string
                    headline:
                      type: string
                    sentiment:
                      type: string
                    thumbnail:
                      type: string
                      format: uri
                    source_url:
                      type: string
                      format: uri
                    author_name:
                      type: string
                      nullable: true
                    other_sources:
                      type: array
                      items:
                        type: string
                    adverse_keywords:
                      type: array
                      items:
                        type: string
                    sentiment_score:
                      type: integer
                    publication_date:
                      type: string
                      format: date-time
              additional_information:
                type: object
        score:
          type: number
          format: float
          nullable: true
          minimum: 0
          maximum: 100
          description: >-
            Puntuación global del análisis AML: la puntuación de riesgo más alta
            entre todas las coincidencias (float, 0-100). `null` hasta que se
            calcula.
        screened_data:
          type: object
          properties:
            full_name:
              type: string
            nationality:
              type: string
            date_of_birth:
              type: string
              format: date
            document_number:
              type: string
              nullable: true
        is_ongoing_monitoring_enabled:
          type: boolean
          description: >-
            Indica si la monitorización AML continua está activada para este
            análisis. Si es `true`, la entidad se vuelve a analizar
            periódicamente y cualquier nueva coincidencia actualiza el informe.
        next_ongoing_monitoring_bill_date:
          type: string
          format: date
          nullable: true
          description: >-
            Fecha (YYYY-MM-DD) en la que se facturará la próxima vez esta
            suscripción de monitorización continua. Se calcula como la fecha de
            la última facturación de monitorización continua más 365 días cuando
            `is_ongoing_monitoring_enabled = true`; en caso contrario, `null`.
            Es una fecha de facturación, no de análisis: para eso, usa
            `last_ongoing_screening_at`.
        last_ongoing_screening_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Cuándo la monitorización continua completó por última vez un nuevo
            análisis de este registro, haya cambiado o no el resultado. `null`
            cuando el registro nunca se ha vuelto a analizar; nunca se rellena
            con la fecha de activación ni con la de facturación.
        last_ongoing_screening_datasets_updated_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            La fecha de la actualización más reciente del conjunto de datos AML
            que informó el proveedor en el momento de ese análisis. `null`
            cuando el proveedor no informó fechas del conjunto de datos; nunca
            se estima.
        warnings:
          type: array
          items:
            type: object
            properties:
              feature:
                type: string
                enum:
                  - ID_VERIFICATION
                  - NFC
                  - LIVENESS
                  - FACEMATCH
                  - PROOF_OF_ADDRESS
                  - PHONE
                  - EMAIL
                  - AML
                  - LOCATION
                  - DATABASE_VALIDATION
                  - QUESTIONNAIRE
                  - DOCUMENT_AI
                  - KYB_REGISTRY
                  - KYB_DOCUMENTS
                  - KYB_KEY_PEOPLE
                  - GEOLOCATION
                  - SIGNATURE
                description: >-
                  La función que generó esta advertencia. El valor identifica el
                  bloque de función al que pertenece la advertencia. En un
                  análisis AML suele ser `AML`, pero el enum anterior es la
                  referencia para todas las advertencias de funciones del
                  payload de la decisión.
              risk:
                type: string
              additional_data:
                type: object
                nullable: true
              log_type:
                type: string
              short_description:
                type: string
              long_description:
                type: string
              node_id:
                type: string
                description: El ID del nodo del grafo del flujo que generó esta advertencia
    GeolocationCheck:
      type: object
      description: >-
        Un resultado de verificación de ubicación: el intento aceptado de un
        nodo del flujo. La medición, la incertidumbre y la autenticidad son
        claves separadas, de modo que una ubicación precisa sin certificar se
        interpreta de forma distinta a una imprecisa certificada.
      properties:
        node_id:
          type: string
          nullable: true
          description: >-
            Nodo del flujo que generó este resultado, para que un flujo con dos
            pasos de verificación de ubicación siga siendo legible.
        status:
          type: string
          enum:
            - Not Finished
            - Approved
            - Declined
            - In Review
            - Resub Requested
          description: >-
            Estado a nivel de función de este paso de verificación de ubicación,
            determinado a partir de sus advertencias. Es independiente del
            `status` de la sesión.
        outcome:
          type: string
          nullable: true
          description: Qué ocurrió en este intento.
          enum:
            - verified
            - low_accuracy
            - accuracy_undetermined
            - stale
            - approximate
            - denied
            - restricted
            - unavailable
            - timeout
            - mock_detected
            - outside_geofence
            - in_blocked_area
            - anonymizer_detected
            - skipped
            - replay_rejected
            - unsupported_client
            - null
        permission:
          type: string
          nullable: true
          description: >-
            Lo que concedió el sistema operativo o el navegador. `not_requested`
            significa que el paso usa solo la ubicación IP de la conexión, por
            lo que nunca se pide ningún permiso a la persona.
          enum:
            - granted_precise
            - granted_approximate
            - denied
            - restricted
            - unavailable
            - timeout
            - dismissed
            - not_requested
            - null
        latitude:
          type: number
          nullable: true
          description: Latitud WGS84 de la posición. `null` cuando no hay posición.
          format: double
        longitude:
          type: number
          nullable: true
          description: Longitud WGS84 de la posición. `null` cuando no hay posición.
          format: double
        accuracy_m:
          type: number
          nullable: true
          description: >-
            Radio de incertidumbre en metros, con el nivel de confianza indicado
            en `accuracy_confidence`.
          format: double
        accuracy_confidence:
          type: string
          nullable: true
          description: >-
            Nivel de confianza que la plataforma asigna a `accuracy_m`: `p95`
            (navegadores), `p68` (Android) o `unspecified` (iOS).
          enum:
            - p95
            - p68
            - unspecified
            - null
        measured_at:
          type: string
          nullable: true
          description: Cuándo el dispositivo obtuvo la posición, según su propio reloj.
          format: date-time
        age_seconds:
          type: integer
          nullable: true
          description: >-
            Segundos entre que el dispositivo obtiene la ubicación y Didit la
            recibe.
        source:
          type: string
          nullable: true
          description: >-
            De dónde procede la posición, cuando la plataforma lo indica. `ip`
            significa que la posición es la ubicación IP de la conexión.
          enum:
            - gps
            - fused
            - network
            - wifi
            - cell
            - browser
            - unknown
            - ip
            - null
        platform:
          type: string
          nullable: true
          description: El cliente que obtuvo la ubicación.
          enum:
            - web
            - ios
            - android
            - react_native
            - flutter
            - null
        sdk_version:
          type: string
          nullable: true
          description: Versión del SDK que generó la corrección.
        is_mock:
          type: boolean
          nullable: true
          description: >-
            `true` cuando el dispositivo indica que la posición procede de un
            proveedor de ubicación simulada o de un software de simulación.
            `null` cuando la plataforma no lo informa (los navegadores no pueden
            saberlo); `null` no equivale a `false`.
        produced_by_accessory:
          type: boolean
          nullable: true
          description: >-
            Solo iOS: `true` cuando la ubicación procede de un accesorio
            externo. `null` en los demás casos.
        integrity:
          type: string
          enum:
            - attested
            - not_attested
            - failed
            - unsupported
            - not_determined
          description: >-
            Indica si la atestación del dispositivo respalda la posición
            obtenida. `unsupported` es lo que informan los navegadores, porque
            la web no tiene mecanismo de atestación; no es un fallo.
        country_code:
          type: string
          nullable: true
          description: País ISO 3166-1 alpha-2 en el que se encuentra la ubicación.
        region_code:
          type: string
          nullable: true
          description: Subdivisión ISO 3166-2 en la que se encuentra la ubicación.
        city:
          type: string
          nullable: true
          description: Localidad poblada más cercana, una etiqueta para los revisores.
        geofence:
          type: object
          description: Resultado de las reglas de país y zona del paso.
          properties:
            enabled:
              type: boolean
              description: Si el paso aplica alguna regla de país o de zona.
            result:
              type: string
              nullable: true
              description: >-
                Situación de la posición respecto a las reglas. `undetermined`
                significa que el círculo de precisión cruza la frontera o que la
                posición no se resolvió en ningún país; no es prueba de estar
                fuera.
              enum:
                - inside
                - outside
                - undetermined
                - null
        inside_geofence:
          type: boolean
          nullable: true
          description: >-
            `true` cuando `geofence.result` es `inside`, `false` cuando es
            `outside` y `null` en cualquier otro caso.
        geofence_basis:
          type: string
          nullable: true
          description: >-
            Desde qué posición se evaluó el resultado del área: la posición
            obtenida del `device` o la ubicación `ip` de la conexión.
          enum:
            - device
            - ip
            - null
        inside_areas:
          type: array
          items:
            type: string
          description: >-
            Ids de las áreas permitidas configuradas dentro de las que se
            encuentra la posición.
        blocked_areas:
          type: array
          items:
            type: string
          description: >-
            Ids de las áreas bloqueadas configuradas en las que se encuentra la
            posición.
        position_source:
          type: string
          nullable: true
          description: >-
            De dónde toma el paso la posición, según la configuración: el
            dispositivo contrastado con la ubicación de la IP, solo el
            dispositivo o solo la ubicación de la IP.
          enum:
            - device_and_ip
            - device_only
            - ip_only
            - null
        anonymizers:
          type: object
          nullable: true
          description: >-
            Cómo son la conexión y el dispositivo: cada valor es `true`, `false`
            o `null` cuando la fuente no puede determinarlo.
          properties:
            vpn:
              type: boolean
              nullable: true
            proxy:
              type: boolean
              nullable: true
            tor:
              type: boolean
              nullable: true
            spoofing:
              type: boolean
              nullable: true
            emulator:
              type: boolean
              nullable: true
        ip_distance_km:
          type: number
          nullable: true
          description: >-
            Distancia a la ubicación IP de la sesión tras restar ambos radios de
            incertidumbre; `0` cuando se solapan.
          format: double
        ip_distance_uncertainty_km:
          type: number
          nullable: true
          description: >-
            Radio combinado que se restó: el radio de la ubicación de la IP más
            la precisión de esta posición.
          format: double
        ip_consistent:
          type: boolean
          nullable: true
          description: >-
            Indica si `ip_distance_km` está dentro de la distancia configurada
            en el paso. `null` cuando se desconoce alguno de los dos lados.
        document_distance_km:
          type: number
          nullable: true
          description: >-
            Distancia a la dirección geocodificada del documento de identidad o
            de la prueba de domicilio. `null` cuando no hay ninguna dirección
            registrada.
          format: double
        travel_excused:
          type: boolean
          nullable: true
          description: >-
            Si la tolerancia de desplazamiento del paso justificó la distancia
            respecto a la dirección. `null` cuando la tolerancia está
            desactivada.
        consecutive_mismatches:
          type: integer
          nullable: true
          description: >-
            En el último intento: esta comprobación más las discrepancias
            anteriores consecutivas de la misma persona.
        attempts:
          type: integer
          description: Número de este intento dentro del nodo, empezando por 1.
        consent:
          type: object
          nullable: true
          description: >-
            El consentimiento que dio la persona antes del aviso del sistema,
            registrado con la versión del texto y el idioma que vio.
          properties:
            accepted_at:
              type: string
              format: date-time
            version:
              type: string
              nullable: true
            locale:
              type: string
              nullable: true
        warnings:
          type: array
          items:
            type: object
            properties:
              feature:
                type: string
                enum:
                  - ID_VERIFICATION
                  - NFC
                  - LIVENESS
                  - FACEMATCH
                  - PROOF_OF_ADDRESS
                  - PHONE
                  - EMAIL
                  - AML
                  - LOCATION
                  - DATABASE_VALIDATION
                  - QUESTIONNAIRE
                  - DOCUMENT_AI
                  - KYB_REGISTRY
                  - KYB_DOCUMENTS
                  - KYB_KEY_PEOPLE
                  - GEOLOCATION
                  - SIGNATURE
                description: >-
                  La función que generó esta advertencia. El valor identifica el
                  bloque de función al que pertenece la advertencia. El array de
                  advertencias de cada módulo suele usar el valor que
                  corresponde a su módulo (por ejemplo, `PHONE` dentro de
                  `phone_verifications[].warnings`), pero el enum anterior es la
                  referencia para todas las advertencias de funciones del
                  payload de la decisión.
              risk:
                type: string
              additional_data:
                type: object
                nullable: true
              log_type:
                type: string
              short_description:
                type: string
              long_description:
                type: string
              node_id:
                type: string
                description: El ID del nodo del grafo del flujo que generó esta advertencia
          description: >-
            Advertencias que generó este paso de verificación de ubicación, con
            `feature` establecido en `GEOLOCATION`. Los códigos de advertencia
            empiezan por `LOCATION_`.
    GeolocationAttempt:
      type: object
      description: >-
        Un intento de un paso de verificación de ubicación: las mismas claves
        que `geolocation_checks[]` excepto `warnings`, más el momento en que
        Didit lo recibió.
      properties:
        node_id:
          type: string
          nullable: true
          description: >-
            Nodo del flujo que generó este resultado, para que un flujo con dos
            pasos de verificación de ubicación siga siendo legible.
        status:
          type: string
          enum:
            - Not Finished
            - Approved
            - Declined
            - In Review
            - Resub Requested
          description: >-
            Estado a nivel de función de este paso de verificación de ubicación,
            determinado a partir de sus advertencias. Es independiente del
            `status` de la sesión.
        outcome:
          type: string
          nullable: true
          description: Qué ocurrió en este intento.
          enum:
            - verified
            - low_accuracy
            - accuracy_undetermined
            - stale
            - approximate
            - denied
            - restricted
            - unavailable
            - timeout
            - mock_detected
            - outside_geofence
            - in_blocked_area
            - anonymizer_detected
            - skipped
            - replay_rejected
            - unsupported_client
            - null
        permission:
          type: string
          nullable: true
          description: >-
            Lo que concedió el sistema operativo o el navegador. `not_requested`
            significa que el paso usa solo la ubicación IP de la conexión, por
            lo que nunca se pide ningún permiso a la persona.
          enum:
            - granted_precise
            - granted_approximate
            - denied
            - restricted
            - unavailable
            - timeout
            - dismissed
            - not_requested
            - null
        latitude:
          type: number
          nullable: true
          description: Latitud WGS84 de la posición. `null` cuando no hay posición.
          format: double
        longitude:
          type: number
          nullable: true
          description: Longitud WGS84 de la posición. `null` cuando no hay posición.
          format: double
        accuracy_m:
          type: number
          nullable: true
          description: >-
            Radio de incertidumbre en metros, con el nivel de confianza indicado
            en `accuracy_confidence`.
          format: double
        accuracy_confidence:
          type: string
          nullable: true
          description: >-
            Nivel de confianza que la plataforma asigna a `accuracy_m`: `p95`
            (navegadores), `p68` (Android) o `unspecified` (iOS).
          enum:
            - p95
            - p68
            - unspecified
            - null
        measured_at:
          type: string
          nullable: true
          description: Cuándo el dispositivo obtuvo la posición, según su propio reloj.
          format: date-time
        age_seconds:
          type: integer
          nullable: true
          description: >-
            Segundos entre que el dispositivo obtiene la ubicación y Didit la
            recibe.
        source:
          type: string
          nullable: true
          description: >-
            De dónde procede la posición, cuando la plataforma lo indica. `ip`
            significa que la posición es la ubicación IP de la conexión.
          enum:
            - gps
            - fused
            - network
            - wifi
            - cell
            - browser
            - unknown
            - ip
            - null
        platform:
          type: string
          nullable: true
          description: El cliente que obtuvo la ubicación.
          enum:
            - web
            - ios
            - android
            - react_native
            - flutter
            - null
        sdk_version:
          type: string
          nullable: true
          description: Versión del SDK que generó la corrección.
        is_mock:
          type: boolean
          nullable: true
          description: >-
            `true` cuando el dispositivo indica que la posición procede de un
            proveedor de ubicación simulada o de un software de simulación.
            `null` cuando la plataforma no lo informa (los navegadores no pueden
            saberlo); `null` no equivale a `false`.
        produced_by_accessory:
          type: boolean
          nullable: true
          description: >-
            Solo iOS: `true` cuando la ubicación procede de un accesorio
            externo. `null` en los demás casos.
        integrity:
          type: string
          enum:
            - attested
            - not_attested
            - failed
            - unsupported
            - not_determined
          description: >-
            Indica si la atestación del dispositivo respalda la posición
            obtenida. `unsupported` es lo que informan los navegadores, porque
            la web no tiene mecanismo de atestación; no es un fallo.
        country_code:
          type: string
          nullable: true
          description: País ISO 3166-1 alpha-2 en el que se encuentra la ubicación.
        region_code:
          type: string
          nullable: true
          description: Subdivisión ISO 3166-2 en la que se encuentra la ubicación.
        city:
          type: string
          nullable: true
          description: Localidad poblada más cercana, una etiqueta para los revisores.
        geofence:
          type: object
          description: Resultado de las reglas de país y zona del paso.
          properties:
            enabled:
              type: boolean
              description: Si el paso aplica alguna regla de país o de zona.
            result:
              type: string
              nullable: true
              description: >-
                Situación de la posición respecto a las reglas. `undetermined`
                significa que el círculo de precisión cruza la frontera o que la
                posición no se resolvió en ningún país; no es prueba de estar
                fuera.
              enum:
                - inside
                - outside
                - undetermined
                - null
        inside_geofence:
          type: boolean
          nullable: true
          description: >-
            `true` cuando `geofence.result` es `inside`, `false` cuando es
            `outside` y `null` en cualquier otro caso.
        geofence_basis:
          type: string
          nullable: true
          description: >-
            Desde qué posición se evaluó el resultado del área: la posición
            obtenida del `device` o la ubicación `ip` de la conexión.
          enum:
            - device
            - ip
            - null
        inside_areas:
          type: array
          items:
            type: string
          description: >-
            Ids de las áreas permitidas configuradas dentro de las que se
            encuentra la posición.
        blocked_areas:
          type: array
          items:
            type: string
          description: >-
            Ids de las áreas bloqueadas configuradas en las que se encuentra la
            posición.
        position_source:
          type: string
          nullable: true
          description: >-
            De dónde toma el paso la posición, según la configuración: el
            dispositivo contrastado con la ubicación de la IP, solo el
            dispositivo o solo la ubicación de la IP.
          enum:
            - device_and_ip
            - device_only
            - ip_only
            - null
        anonymizers:
          type: object
          nullable: true
          description: >-
            Cómo son la conexión y el dispositivo: cada valor es `true`, `false`
            o `null` cuando la fuente no puede determinarlo.
          properties:
            vpn:
              type: boolean
              nullable: true
            proxy:
              type: boolean
              nullable: true
            tor:
              type: boolean
              nullable: true
            spoofing:
              type: boolean
              nullable: true
            emulator:
              type: boolean
              nullable: true
        ip_distance_km:
          type: number
          nullable: true
          description: >-
            Distancia a la ubicación IP de la sesión tras restar ambos radios de
            incertidumbre; `0` cuando se solapan.
          format: double
        ip_distance_uncertainty_km:
          type: number
          nullable: true
          description: >-
            Radio combinado que se restó: el radio de la ubicación de la IP más
            la precisión de esta posición.
          format: double
        ip_consistent:
          type: boolean
          nullable: true
          description: >-
            Indica si `ip_distance_km` está dentro de la distancia configurada
            en el paso. `null` cuando se desconoce alguno de los dos lados.
        document_distance_km:
          type: number
          nullable: true
          description: >-
            Distancia a la dirección geocodificada del documento de identidad o
            de la prueba de domicilio. `null` cuando no hay ninguna dirección
            registrada.
          format: double
        travel_excused:
          type: boolean
          nullable: true
          description: >-
            Si la tolerancia de desplazamiento del paso justificó la distancia
            respecto a la dirección. `null` cuando la tolerancia está
            desactivada.
        consecutive_mismatches:
          type: integer
          nullable: true
          description: >-
            En el último intento: esta comprobación más las discrepancias
            anteriores consecutivas de la misma persona.
        attempts:
          type: integer
          description: Número de este intento dentro del nodo, empezando por 1.
        consent:
          type: object
          nullable: true
          description: >-
            El consentimiento que dio la persona antes del aviso del sistema,
            registrado con la versión del texto y el idioma que vio.
          properties:
            accepted_at:
              type: string
              format: date-time
            version:
              type: string
              nullable: true
            locale:
              type: string
              nullable: true
        received_at:
          type: string
          nullable: true
          description: Cuándo recibió Didit el intento.
          format: date-time
        created_at:
          type: string
          format: date-time
    KYBRegistryShareholding:
      type: object
      nullable: true
      description: >-
        Qué participación tiene un propietario, con la misma estructura para
        cada país y fuente de registro. Es null cuando el registro no indica
        ninguna participación. Un rango (por ejemplo, el 25-50% de un PSC del
        Reino Unido) no es una participación: `percentage` es null y el rango se
        mantiene en `ownership_min_shares` / `ownership_max_shares`.
      properties:
        share_class:
          type: string
          nullable: true
          description: Clase o tipo de participación tal como la denomina el registro.
        number_of_shares:
          type: number
          nullable: true
          description: Número de acciones en posesión.
        currency:
          type: string
          nullable: true
          description: Moneda ISO 4217 de los valores siguientes.
        nominal_value:
          type: number
          nullable: true
          description: Valor nominal por acción.
        total_value:
          type: number
          nullable: true
          description: Valor total de la participación.
        percentage:
          type: number
          nullable: true
          description: Participación exacta en porcentaje, con cuatro decimales.
      required:
        - share_class
        - number_of_shares
        - currency
        - nominal_value
        - total_value
        - percentage
    KYBRegistryAddress:
      type: object
      description: >-
        Una dirección que declara el registro, con la misma estructura para
        todos los países y fuentes de registro. Todas las claves están siempre
        presentes; una parte que el registro no publica es null.
      properties:
        type:
          type: string
          nullable: true
          description: >-
            Tipo de dirección en minúsculas: `registered` para el domicilio
            social; otros tipos, tal como los denomina el registro (por ejemplo,
            `postal`, `office`). `null` cuando el registro no indica de qué
            dirección se trata.
        address:
          type: string
          description: >-
            La dirección completa en una sola línea. Siempre está presente en
            todas las direcciones.
        street:
          type: string
          nullable: true
          description: Calle y número.
        city:
          type: string
          nullable: true
          description: Ciudad o localidad.
        postal_code:
          type: string
          nullable: true
          description: Código postal.
        region:
          type: string
          nullable: true
          description: Región, estado o provincia.
        country_code:
          type: string
          nullable: true
          description: Código de país ISO 3166-1 alfa-2.
        description:
          type: string
          nullable: true
          description: >-
            La etiqueta propia del registro para la dirección, cuando
            proporciona una.
      required:
        - type
        - address
        - street
        - city
        - postal_code
        - region
        - country_code
        - description
    KYBRegistryIndustry:
      type: object
      description: >-
        Una actividad en la que el registro clasifica a la empresa, con la misma
        estructura para todos los países y fuentes de registro.
      properties:
        code:
          type: string
          nullable: true
          description: >-
            Código de actividad tal como lo publica el registro (por ejemplo,
            `73110`).
        description:
          type: string
          nullable: true
          description: Etiqueta de la actividad, cuando el registro la publica.
        scheme:
          type: string
          nullable: true
          description: >-
            Sistema de clasificación, con un único nombre por sistema
            independientemente de la fuente que lo haya informado: `UK SIC
            2007`, `US SIC`, `NACE Rev. 2`, `NACE Rev. 2.1`, `NAF Rev. 2`,
            `CNAE`, `SBI`, `NOGA 2008`, `CAE Rev. 4`, `Canada SIC 1977`; los
            demás sistemas nacionales conservan el nombre que les da el
            registro. Es nulo cuando el registro no indica el sistema.
        is_primary:
          type: boolean
          description: >-
            True para la actividad principal de la empresa. Exactamente una
            entrada es la principal cuando la lista no está vacía.
      required:
        - code
        - description
        - scheme
        - is_primary
    KYBRegistryData:
      type: object
      nullable: true
      description: >-
        Detalle normalizado del registro de Didit para la empresa: el resultado
        de propiedad (`ownership_error`, `section_errors`, `ubo_resolution`,
        `lite_enrichment`), las correcciones realizadas con update-data y los
        datos del registro que no tienen un campo propio. Nunca incluye el
        registro original de la fuente del registro. Todas las claves son
        opcionales y solo aparecen cuando la empresa tiene un valor para ellas;
        se pueden añadir claves nuevas. Consulta los campos canónicos
        (`addresses`, `industries`, `ownership`,
        `beneficial_owners[].shareholding`) para todo lo que cubren.
      properties:
        company_name:
          type: string
          description: Nombre de la empresa tal como se corrigió en la consola.
        registration_number:
          type: string
          description: >-
            Número de registro tal como lo indica el registro o una corrección
            hecha en la consola.
        country_code:
          type: string
          description: >-
            País del registro, tal como lo indica el registro o una corrección
            hecha en la consola.
        region:
          type: string
          description: Región o estado del registro.
        incorporation_date:
          type: string
          description: Fecha de constitución (ISO 8601).
        registration_date:
          type: string
          description: >-
            Fecha de registro (ISO 8601) cuando el registro indica una distinta
            de la fecha de constitución.
        dissolution_date:
          type: string
          description: Fecha de disolución (ISO 8601) cuando el registro indica una.
        tax_number:
          type: string
          description: Número de identificación fiscal.
        vat_number:
          type: string
          description: Número de IVA.
        legal_address:
          type: string
          description: Dirección legal tal como se corrigió en la consola.
        registered_address:
          type: string
          description: Dirección registrada tal como figura en el registro.
        company_type:
          type: string
          description: Forma jurídica.
        registry_status:
          type: string
          description: Estado de la empresa en el registro.
        verification_status:
          type: string
          description: Estado de la verificación.
        alternative_names:
          type: string
          description: Otros nombres comerciales que usa o ha usado la empresa.
        nature_of_business:
          type: string
          description: Descripción de la actividad.
        registered_capital:
          type: string
          description: Capital social tal como figura impreso.
        registered_capital_amount:
          type: string
          description: Importe del capital social, como cadena decimal.
        registered_capital_currency:
          type: string
          description: Moneda del capital social (ISO 4217).
        website:
          type: string
          description: Sitio web.
        email:
          type: string
          description: Correo electrónico de contacto.
        phone:
          type: string
          description: Teléfono de contacto.
        legal_entity_identifier:
          type: string
          description: Identificador de entidad jurídica (LEI).
        location_of_registration:
          type: string
          description: Lugar de registro.
        control_scheme:
          type: string
          description: Esquema de gobierno corporativo cuando el registro lo expone.
        ownership_error:
          type: string
          enum:
            - no_owners_on_record
            - no_natural_person_owner
            - ownership_section_unavailable
            - company_not_found
            - ambiguous_company_match
            - missing_registration_number
            - entity_type_not_covered
            - provider_unavailable
            - other
          description: >-
            Por qué no se entregó un nivel de propiedad solicitado, con los
            mismos códigos que `ownership.unavailable_reason`.
            `no_owners_on_record` (el registro respondió y no indica ningún
            propietario) y `ownership_section_unavailable` (el registro no
            devolvió la sección de propiedad) son resultados distintos.
        section_errors:
          type: object
          description: >-
            Secciones que el registro no devolvió, indexadas por sección
            (`officers`, `shareholders`, `group_structure`). Una sección que
            aparece aquí nunca se entregó: una lista vacía junto a ella no dice
            nada sobre la empresa.
          additionalProperties:
            $ref: '#/components/schemas/KYBRegistrySectionError'
        ubo_resolution:
          $ref: '#/components/schemas/KYBRegistryUboResolution'
        lite_enrichment:
          $ref: '#/components/schemas/KYBRegistryLiteEnrichment'
        registry_metadata:
          type: object
          additionalProperties:
            oneOf:
              - type: string
              - type: number
              - type: boolean
          description: >-
            Los campos propios del registro mercantil para la empresa, con las
            claves tal como las nombra el registro, como valores simples
            (registros heredados). Solo se incluyen los campos revisados como
            datos del registro.
        registry_sources:
          type: array
          description: >-
            Los registros oficiales de los que se leyó el registro (registros
            heredados). Las demás fuentes no se nombran.
          items:
            $ref: '#/components/schemas/KYBRegistrySource'
        previous_names:
          type: array
          items:
            type: string
          description: >-
            Nombres con los que la empresa estuvo registrada anteriormente
            (registros antiguos).
        parent_companies:
          type: array
          items:
            type: string
          description: Empresas matrices que indica el registro (registros heredados).
        documents_available:
          type: integer
          description: >-
            Cuántos documentos presentados ofrece el registro para la empresa
            (registros heredados).
    KYBRegistryOwnership:
      type: object
      description: >-
        El resultado del nivel de propiedad (accionistas / UBO), con la misma
        estructura para cada país y fuente de registro.
      properties:
        status:
          type: string
          nullable: true
          enum:
            - not_requested
            - pending
            - delivered
            - not_held
            - unavailable
            - null
          description: >-
            `delivered` cuando el registro publicó la propiedad; `not_held`
            cuando el registro de propiedad respondió y no incluye la empresa en
            absoluto (consulta `unavailable_reason`); `unavailable` cuando no
            proporcionó los datos de propiedad por cualquier otro motivo
            (consulta `unavailable_reason`); `pending` mientras el registro
            todavía los está obteniendo; `not_requested` para el nivel Basic.
        tier_requested:
          type: string
          nullable: true
          enum:
            - basic
            - shareholders
            - ubo
            - null
          description: El nivel que solicitó el flujo.
        tier_delivered:
          type: string
          nullable: true
          enum:
            - basic
            - shareholders
            - ubo
            - null
          description: >-
            El nivel que entregó el registro (y que se factura). Una solicitud
            de UBO respondida solo con accionistas directos es `shareholders`.
        unavailable_reason:
          type: string
          nullable: true
          enum:
            - no_owners_on_record
            - no_natural_person_owner
            - ownership_section_unavailable
            - company_not_found
            - ambiguous_company_match
            - missing_registration_number
            - entity_type_not_covered
            - provider_unavailable
            - other
            - null
          description: >-
            Por qué no se entregó un nivel de propiedad solicitado. Es null
            salvo que `status` sea `unavailable` o `pending`.
        direct_ownership_complete:
          type: boolean
          nullable: true
          description: >-
            True cuando las participaciones declaradas de los accionistas
            directos suman 100% (con un margen de redondeo de un punto
            porcentual); false cuando no es así; null cuando no se entregaron
            los datos de propiedad o no se declara alguna participación.
        unresolved:
          type: array
          description: >-
            Partes de la cadena de propiedad que el registro no pudo resolver;
            por ejemplo, cuando no consta ninguna estructura de grupo por encima
            de los propietarios directos.
          items:
            type: object
            properties:
              reason:
                type: string
              section:
                type: string
                nullable: true
      required:
        - status
        - tier_requested
        - tier_delivered
        - unavailable_reason
        - direct_ownership_complete
        - unresolved
    KYBOwnershipStructure:
      type: object
      nullable: true
      description: >-
        La tabla de capitalización que acreditó el registro, tal como estaba
        cuando se entregó el nivel de propiedad: `shareholders` directos y
        `beneficial_owners`. Null cuando el registro no acreditó ninguna
        propiedad. Nunca incluye las filas propias de la fuente del registro;
        consulta `company.beneficial_owners` y `company.ownership` para ver el
        registro actual.
      properties:
        shareholders:
          type: array
          items:
            $ref: '#/components/schemas/KYBOwnershipStructureOwner'
        beneficial_owners:
          type: array
          items:
            $ref: '#/components/schemas/KYBOwnershipStructureOwner'
      required:
        - shareholders
        - beneficial_owners
    InvestigatorBlock:
      type: object
      nullable: true
      description: >-
        La revisión más reciente del elemento en Investigator, o null si nunca
        tuvo una. La incluyen la decisión de sesión V3 y la decisión de sesión
        de empresa (y, por tanto, los webhooks `status.updated`).
      properties:
        run_id:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - running
            - completed
            - failed
        stage:
          type: string
          enum:
            - shadow
            - live
        queue:
          type: string
          enum:
            - kyc
            - kyb
            - aml
            - transactions
            - cases
        is_open:
          type: boolean
        recommendation:
          type: string
          enum:
            - approve
            - decline
            - escalate
            - request
          nullable: true
        recommendation_detail:
          type: string
          nullable: true
        confidence:
          type: string
          enum:
            - high
            - moderate
            - low
          nullable: true
        summary:
          type: string
          nullable: true
        ready_to_accept:
          type: boolean
        prepared_at:
          type: string
          format: date-time
          nullable: true
        automated:
          type: boolean
          description: >-
            El Investigator decidió por sí solo, aunque la decisión se anulara
            después.
        decided_by:
          type: string
          enum:
            - investigator
            - member
          nullable: true
        decision:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/InvestigatorDecision'
          type: object
    BiometricRetention:
      type: object
      description: >-
        Fecha y hora en que se eliminan los datos biométricos en vivo de esta
        sesión.
      required:
        - jurisdictions
        - deletes_at
      properties:
        jurisdictions:
          type: array
          items:
            type: string
          description: >-
            Códigos de los estados de EE. UU. cuyas normas biométricas
            establecen un plazo de eliminación para esta persona (`US` cuando se
            desconoce el estado). Vacío cuando no aplica ninguno.
        deletes_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            La fecha en que se eliminan los datos biométricos en vivo (imágenes
            faciales y plantillas) de esta sesión, según la configuración de
            retención de tu aplicación y, cuando corresponda, el límite legal de
            la jurisdicción de la persona. `null` cuando todavía no aplica
            ninguna fecha.
    SocialFootprintPlatform:
      type: object
      properties:
        platform:
          type: string
          description: Identificador de la plataforma.
          example: whatsapp
        category:
          type: string
          description: >-
            Categoría de la plataforma, por ejemplo MESSAGING, SOCIAL_MEDIA,
            ECOMMERCE, PROFESSIONAL, EMAIL_PROVIDER.
          example: MESSAGING
        scope:
          type: string
          enum:
            - global
            - local
          description: >-
            `global` para plataformas de alcance mundial, `local` para las
            específicas de una región.
          example: global
    SocialFootprintCategorySummary:
      type: object
      properties:
        registered:
          type: integer
          nullable: true
          description: >-
            Plataformas de esta categoría en las que se ha confirmado el
            registro.
          example: 2
        ratio:
          type: number
          format: float
          nullable: true
          description: >-
            Proporción de las plataformas comprobadas de la categoría en las que
            existe un registro, de 0.0 a 1.0.
          example: 0.6667
    SocialFootprintProfile:
      type: object
      properties:
        name:
          type: string
          nullable: true
          description: Nombre del perfil, cuando la plataforma lo expone.
        photo:
          type: string
          nullable: true
          description: URL de la foto del perfil, cuando la plataforma la expone.
        about:
          type: string
          nullable: true
          description: >-
            Texto de presentación o biografía del perfil, cuando la plataforma
            lo expone.
        privacy_status:
          type: string
          nullable: true
          enum:
            - PUBLIC
            - PRIVATE
            - null
          description: Visibilidad del perfil, cuando la plataforma la expone.
        business_account:
          type: boolean
          nullable: true
          description: >-
            Si el perfil es una cuenta de empresa, cuando la plataforma lo
            expone.
    SignatureFieldResult:
      type: object
      description: >-
        Un campo de un documento firmado, con su valor en la copia de este
        firmante. Consulta
        [Campos](/es/core-technology/electronic-signature/report-electronic-signature#campos).
      properties:
        key:
          type: string
          description: La clave del campo, tal como se usa en `sign.field_values`.
        type:
          type: string
          enum:
            - signature
            - initials
            - full_name
            - date_signed
            - text
            - checkbox
            - email
            - data
        role:
          type: string
          enum:
            - verified_person
            - legal_representative
            - key_people
        label:
          type: string
        page:
          type: integer
          description: >-
            Número de página, a partir de 1. En un documento de Word, una página
            del PDF convertido.
        x:
          type: number
          description: Borde izquierdo, como fracción del ancho de la página.
        'y':
          type: number
          description: Borde superior, como fracción de la altura de la página.
        width:
          type: number
          description: Ancho, como fracción del ancho de la página.
        height:
          type: number
          description: Altura, como fracción de la altura de la página.
        required:
          type: boolean
        value:
          nullable: true
          description: >-
            Una cadena para `text`, `email`, `full_name`, `date_signed` y
            `data`, un booleano para un `checkbox`, y `true` para una firma o
            unas iniciales aplicadas. `null` cuando está vacío.
        display_value:
          type: string
          nullable: true
          description: >-
            El valor tal como se estampa en la página: fechas en el
            `date_format` del campo, `Yes` o `No` para una casilla de
            verificación, `Signed` para una firma o unas iniciales.
        value_source:
          type: string
          nullable: true
          enum:
            - signer
            - identity
            - contact
            - company
            - session
            - metadata
            - api
            - signing_time
            - null
          description: >-
            Origen del valor: `signer` (escrito, marcado o aplicado por el
            firmante), `identity` (el documento de identidad verificado),
            `contact` (el correo electrónico o teléfono verificado), `company`
            (la empresa verificada), `session` (`vendor_data`), `metadata`,
            `api` (`sign.field_values`) o `signing_time` (la fecha de firma).
        filled_at:
          type: string
          format: date-time
          nullable: true
        image_url:
          type: string
          nullable: true
          description: >-
            Solo firma e iniciales: la ruta de la imagen aplicada. Consulta
            [Descargar una imagen de
            firma](/es/sessions-api/electronic-signature/download-field-image).
        value_unavailable_reason:
          type: string
          nullable: true
          enum:
            - source_empty
            - null
          description: >-
            `source_empty` cuando un campo prellenado no tenía valor en la
            sesión y `signature_field_data_missing_action` permitió que el
            firmante firmara de todos modos.
    KYBRegistrySectionError:
      type: object
      description: Una sección que el registro no devolvió.
      properties:
        status_code:
          type: integer
          nullable: true
          description: El estado que respondió el registro para la sección.
      required:
        - status_code
    KYBRegistryUboResolution:
      type: object
      description: >-
        Cómo recorrió el nivel UBO la cadena de propiedad por encima de la
        empresa.
      properties:
        parent_chain:
          type: array
          description: Matrices corporativas, desde la matriz última hasta la empresa.
          items:
            $ref: '#/components/schemas/KYBRegistryGroupCompany'
        subsidiaries:
          type: array
          description: >-
            Empresas situadas directamente por debajo de la empresa en su grupo
            corporativo.
          items:
            $ref: '#/components/schemas/KYBRegistryGroupCompany'
        unresolved:
          type: array
          description: >-
            Partes de la cadena que el registro no pudo resolver (las mismas
            entradas que `ownership.unresolved`).
          items:
            type: object
            properties:
              reason:
                type: string
                description: >-
                  Por qué, por ejemplo `no_group_structure_on_record`,
                  `selected_company_not_in_group_structure` o `section_error`.
              section:
                type: string
                nullable: true
                description: La sección afectada, por ejemplo `group_structure`.
            required:
              - reason
              - section
      required:
        - parent_chain
        - subsidiaries
        - unresolved
    KYBRegistryLiteEnrichment:
      type: object
      description: >-
        Campos vacíos del perfil Lite que rellenó otra de las fuentes de
        registro del país. No se indica cuál es la fuente.
      properties:
        fields:
          type: array
          items:
            type: string
          description: Los campos de la empresa que se rellenaron.
        people_added:
          type: integer
          description: Cuántos administradores o propietarios se añadieron.
      required:
        - fields
        - people_added
    KYBRegistrySource:
      type: object
      description: >-
        Registro oficial del que se leyó la información. Solo se nombran
        registros gubernamentales oficiales, reguladores y el sistema oficial de
        identificadores; cualquier otra fuente se omite.
      properties:
        name:
          type: string
          description: Nombre del registro, por ejemplo `UK Companies House`.
        source_type:
          type: string
          enum:
            - official
          description: Siempre `official`.
      required:
        - name
        - source_type
    KYBOwnershipStructureOwner:
      type: object
      description: >-
        Un propietario de la instantánea de propiedad: la misma identidad
        registral y participación que `company.beneficial_owners[]`, y su
        `shareholding` canónico.
      properties:
        name:
          type: string
          nullable: true
          description: Nombre del titular tal como figura en el registro.
        first_name:
          type: string
          nullable: true
          description: Nombre de pila de una persona física, cuando el registro lo indica.
        last_name:
          type: string
          nullable: true
          description: Apellido, para una persona física, cuando el registro lo indica.
        date_of_birth:
          type: string
          nullable: true
          description: Fecha de nacimiento (ISO 8601) cuando el registro la publica.
        country_of_birth:
          type: string
          nullable: true
          description: País de nacimiento, cuando el registro lo publica.
        company_name:
          type: string
          nullable: true
          description: Nombre de la empresa, en el caso de un propietario corporativo.
        registration_number:
          type: string
          nullable: true
          description: Número de registro, para un propietario que es una persona jurídica.
        entity_type:
          type: string
          nullable: true
          enum:
            - person
            - company
            - null
          description: Si el propietario es una persona física o una empresa.
        nationality:
          type: string
          nullable: true
          description: Nacionalidad, cuando el registro la indica.
        designation:
          type: string
          nullable: true
          description: El cargo o rol del propietario tal como lo muestra el registro.
        roles:
          type: array
          items:
            type: string
          description: >-
            `shareholder` para un titular directo, `ubo` para un beneficiario
            final.
        ownership_min_shares:
          type: string
          nullable: true
          description: >-
            Límite inferior de la participación, en porcentaje (igual al límite
            superior cuando la participación es exacta).
        ownership_max_shares:
          type: string
          nullable: true
          description: Límite superior de la participación, en porcentaje.
        voting_min_shares:
          type: string
          nullable: true
          description: Límite inferior de los derechos de voto, en porcentaje.
        voting_max_shares:
          type: string
          nullable: true
          description: Límite superior de los derechos de voto, en porcentaje.
        appointment_date:
          type: string
          nullable: true
          description: Fecha en que comenzó la participación o el nombramiento (ISO 8601).
        is_active:
          type: boolean
          nullable: true
          description: Falso para un antiguo propietario.
        shareholding:
          $ref: '#/components/schemas/KYBRegistryShareholding'
      required:
        - name
        - first_name
        - last_name
        - date_of_birth
        - country_of_birth
        - company_name
        - registration_number
        - entity_type
        - nationality
        - designation
        - roles
        - ownership_min_shares
        - ownership_max_shares
        - voting_min_shares
        - voting_max_shares
        - appointment_date
        - is_active
        - shareholding
    InvestigatorDecision:
      type: object
      description: >-
        Cómo salió el elemento de la cola de Investigator. `decided_by`,
        `original_outcome` y `overrides` los devuelven los endpoints de
        aceptación y anulación y el informe; el bloque `investigator` de la
        decisión de una sesión incluye los demás campos.
      properties:
        outcome:
          type: string
          enum:
            - accepted
            - edited
            - overridden
            - decided_elsewhere
            - automated
          description: >-
            `accepted` o `edited` adoptaron la recomendación (`edited` con una
            narrativa reescrita), `overridden` adoptó otra acción,
            `decided_elsewhere` es una decisión tomada fuera del Investigator
            mientras el informe estaba abierto y `automated` es una decisión que
            el Investigator tomó por su cuenta.
        action:
          type: string
          enum:
            - approve
            - decline
            - escalate
            - request
        actor_email:
          type: string
          nullable: true
        actor_name:
          type: string
          nullable: true
        override_category:
          type: string
          enum:
            - missing_context
            - needs_information
            - policy_differs
            - evidence_misread
            - other
            - ''
          nullable: true
        override_reason:
          type: string
          nullable: true
        final_status:
          type: string
          description: El estado del elemento después de la decisión.
        agreed:
          type: boolean
          description: Si la decisión coincidió con la recomendación.
          nullable: true
        decided_at:
          type: string
          format: date-time
        billed:
          type: boolean
          description: Se cobró la revisión.
        decided_by:
          type: string
          enum:
            - investigator
            - member
        original_outcome:
          type: object
          description: >-
            La decisión que tomó el Investigator por su cuenta, sin cambios por
            anulaciones posteriores. Null para una decisión que tomó el equipo.
          properties:
            action:
              type: string
            final_status:
              type: string
            decided_at:
              type: string
              format: date-time
          nullable: true
        overrides:
          type: array
          description: >-
            Todas las anulaciones de decisiones que el Investigator tomó por su
            cuenta, de la más antigua a la más reciente.
          items:
            type: object
            properties:
              action:
                type: string
              actor_email:
                type: string
                nullable: true
              actor_name:
                type: string
                nullable: true
              override_category:
                type: string
              override_reason:
                type: string
              previous_status:
                type: string
              final_status:
                type: string
              agreed:
                type: boolean
                nullable: true
              overridden_at:
                type: string
                format: date-time
    KYBRegistryGroupCompany:
      type: object
      description: >-
        Una empresa del grupo corporativo, identificada por su identidad en el
        registro.
      properties:
        name:
          type: string
          nullable: true
          description: Nombre de la empresa.
        country_code:
          type: string
          nullable: true
          description: País de registro.
        registration_number:
          type: string
          nullable: true
          description: Número de registro.
      required:
        - name
        - country_code
        - registration_number
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.