> ## 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 actualizar datos de sesión: corrige KYC y KYB

> Corrige con Didit datos KYC, POA o KYB extraídos por OCR en sesiones. Tres endpoints PATCH, actualizaciones parciales, webhooks y pago por uso.



Prompt para actualizar los datos de la sesión
        Copiar el prompt al portapapeles



      
      

\<pre>

\`Correct OCR-extracted fields on a finished Didit verification session — KYC identity, Proof of Address, or KYB company data.

There are THREE separate PATCH endpoints. Pick the one that matches the feature record you need to fix.

1\) Update KYC identity data
PATCH https://verification.didit.me/v3/session/{session_id}/update-data/
\- Auth: x-api-key (client) or user-auth token. Privilege: write:sessions.
\- Session status must be one of Approved, Declined, In Review, Kyc Expired.
\- Session must have a captured KYC feature record.
\- Optional query / body param node_id targets a specific KYC instance in multi-step workflows (e.g. node_id=feature_ocr_2).
\- Mutable fields: document_type ("P", "ID", "DL", "RP"), document_number, personal_number, date_of_birth (ISO date), date_of_issue, expiration_date, issuing_state (ISO 3166-1 alpha-3), first_name, last_name (full_name is auto-recomputed), gender ("M"|"F"|"X"), nationality, marital_status, place_of_birth, address (free-text — triggers re-geocoding), parsed_address (nested: address_type, city, region, street_1, street_2, postal_code, country [ISO 3166-1 alpha-2]), extra_fields (object — send null on a key to remove it).

2\) Update Proof of Address (POA) data
PATCH https://verification.didit.me/v3/session/{session_id}/update-poa-data/
\- Same auth + privilege + status gate as KYC.
\- Session must have a captured POA record. node_id supported.
\- Mutable fields: issuing_state (ISO-3), document_type ("utility_bill" | "bank_statement" | "lease_agreement"), document_language (ISO 639-1), issuer, issue_date (ISO date), poa_address (free-text — triggers re-geocoding), name_on_document, poa_parsed_address (same nested shape as KYC parsed_address), extra_fields (bank_account_number, bank_iban, bank_sort_code, bank_routing_number, bank_swift_bic, bank_branch_name, bank_branch_address, document_phone_number, additional_names).

3\) Update KYB company data
PATCH https://verification.didit.me/v3/session/{session_id}/kyb/{company_uuid}/update-data/
\- Privilege: write:businesses (NOT write:sessions).
\- No status gate — KYB company data can be corrected at any time.
\- company_uuid must belong to that session_id (else 404).
\- Mutable fields: company_name, registration_number, country_code (ISO-3), incorporation_date / registration_date / dissolution_date, tax_number, legal_address (lands on registered_address), company_type, registry_status ("active" | "dissolved" | "struck_off" | "inactive" | ...), verification_status ("verified" | "failed" | "unknown"), alternative_names, nature_of_business, registered_capital, website, email, phone, legal_entity_identifier, location_of_registration, control_scheme.
\- Edits BOTH the canonical column and registry_data. user_provided_data is never touched.

4\) Skip (or re-require) a Key People party
PATCH https://verification.didit.me/v3/session/{session_id}/kyb/parties/{party_uuid}/
\- Privilege: write:businesses.
\- Body: { "is_skipped": true } to exempt the party, { "is_skipped": false } to put it back in scope.
\- party_uuid must belong to that session_id (else 404).
\- Use it when a party can no longer finish its own check - most often because the linked individual KYC session was deleted - and the KYB is stuck in Awaiting User with nothing left that can move it.
\- Independent of the role's allow_skip setting: that flag limits what the applicant may skip in the hosted flow, not what you may override.
\- requires_verification is left untouched, so the override stays visible as requires_verification: true + is_skipped: true.
\- Recomputes the Key People check and the parent session status immediately, and fires data.updated with trigger: "console_key_people_skip".

Common contract for all four:
\- PATCH semantics — only fields you send are updated. Omit a field to leave it as-is. Send null on an extra_fields key to remove it.
\- A successful update fires a data.updated webhook (with session_kind: "user" or "business"). KYB company updates carry trigger: "console_registry_edit".
\- The audit trail records changed fields, previous + new values, and (for user-auth) the actor email.

KYC curl example:
curl -X PATCH "https://verification.didit.me/v3/session/<SESSION_ID>/update-data/" \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"first_name": "John",
"last_name": "Doe",
"date_of_birth": "1990-01-01",
"issuing_state": "ESP",
"extra_fields": { "municipality": "Madrid" }
}'

Response: the updated record (KYC / POA / KYB company shape — same fields as in the session decision).

Failure modes:
\- 401 — missing or invalid credentials.
\- 403 — { "detail": "You do not have permission to perform this action." } — caller lacks write:sessions (KYC/POA) or write:businesses (KYB company).
\- 404 — { "detail": "Not found." } — session, node_id, or company_uuid not found; OR the session does not carry the feature record you are patching (no KYC / no POA / no matching company).
\- 400 — validation error: invalid country code, unknown parsed_address key, extra_fields not an object, etc. Returned as { "<field>": ["..."] }.

When NOT to use these endpoints:
\- To ask the user to retake the document → use PATCH /v3/session/{id}/update-status/ with new_status: "Resubmitted" (see /sessions-api/update-status).
\- To change entity-level data → use /v3/users/{vendor_data}/ or /v3/businesses/{vendor_data}/.
\- To edit Key People names / roles / ownership - no public API; that data is submitted through the hosted flow. Only the is_skipped flag is patchable (endpoint 4).

Side effects:
\- Changes to KYC name / DOB / nationality can re-trigger AML if AML was still running.
\- Changes to address / poa_address re-run geocoding asynchronously (failures swallowed — they never fail the update).

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

\</pre>



      
      

Pegar en

A veces el OCR lee mal un documento de identidad, una factura de servicios o una entrada de un registro. Didit ofrece tres endpoints PATCH a los que puedes llamar para corregir los datos extraídos sin tener que repetir toda la verificación.| Endpoint | Cuándo usarlo |
| - | - |
| [`PATCH /v3/session/{id}/update-data/`](#actualizar-los-datos-de-identidad-kyc) | Corregir valores extraídos de un documento de identidad en una sesión de **Verificación de usuario (KYC)** |
| [`PATCH /v3/session/{id}/update-poa-data/`](#actualizar-los-datos-de-prueba-de-domicilio-poa) | Corregir valores extraídos de una factura de servicios, un extracto bancario o un contrato de arrendamiento en una sesión de **Verificación de usuario (KYC)** |
| [`PATCH /v3/session/{id}/kyb/{company_uuid}/update-data/`](#actualizar-los-datos-de-empresa-de-kyb) | Corregir campos extraídos del registro en una sesión de **Verificación de empresas (KYB)** |
| [`PATCH /v3/session/{id}/kyb/parties/{party_uuid}/`](#omitir-a-una-parte-de-personas-clave) | Eximir de la verificación a una persona clave cuando ya no puede completar su propia comprobación |Los cuatro aceptan tu **clave de API de cliente** o un **encabezado de autorización de usuario**, y los cuatro emiten un webhook `data.updated` cuando la operación se completa correctamente, para que tu sistema y tus sistemas de análisis posteriores se mantengan sincronizados.## Requisitos comunes- **Autorización**: clave de API de cliente (`x-api-key` estándar o bearer en `Authorization`) o token de autenticación de usuario.
- **Privilegio**:
  * KYC y POA: `write:sessions`
  * Empresa KYB y parte de Personas clave: `write:businesses`
- **Estado de la sesión** (solo KYC / POA): debe ser `APPROVED`, `DECLINED`, `IN_REVIEW` o `KYC_EXPIRED`. Las sesiones que no han llegado a un estado revisable no se pueden modificar. Las actualizaciones de empresas KYB no tienen restricción de estado.
- **Debe existir un registro de la función**: solo puedes modificar campos KYC si la sesión capturó un KYC, campos POA si capturó un POA y campos de empresa KYB si la sesión tiene una comprobación del registro de empresas.
- **Actualizaciones parciales**: solo cambian los campos que incluyas. Omite un campo para dejarlo como está. Envía `null` para eliminar una clave de `extra_fields`.
- **Webhooks**: una actualización exitosa dispara `data.updated` con `session_kind: "user"` o `"business"`, y el historial de auditoría de la sesión registra qué campos concretos cambiaron y quién los cambió.## Actualizar los datos de identidad KYC**`PATCH /v3/session/{sessionId}/update-data/`**Modifica cualquier campo extraído del documento de identidad. Admite flujos de verificación (workflows) basados en grafos con varias instancias mediante un parámetro de consulta o campo del cuerpo `node_id` opcional: apunta a un registro KYC concreto cuando una misma sesión tiene varios pasos KYC.### Campos modificables| Campo | Notas |
| - | - |
| `document_type` | Código ISO del documento: `P` (pasaporte), `ID`, `DL`, `RP`. |
| `document_number` | El número de documento impreso. |
| `personal_number` | Número personal o de identificación fiscal cuando aparece impreso en el documento. |
| `date_of_birth` | Fecha en formato ISO 8601. |
| `date_of_issue` / `expiration_date` | Fechas en formato ISO 8601. |
| `issuing_state` | País emisor, ISO 3166-1 alfa-3. |
| `first_name` / `last_name` | `full_name` se recalcula automáticamente a partir de estos dos. |
| `gender` | `M`, `F` o `X` cuando está presente. |
| `nationality` | Texto libre. |
| `marital_status` | Texto libre. |
| `place_of_birth` | Texto libre. |
| `address` | Dirección en texto libre tomada del documento. Provoca una nueva geocodificación. |
| `parsed_address` | Dirección estructurada: consulta la estructura anidada más abajo. |
| `extra_fields` | Campos adicionales arbitrarios del documento de identidad (p. ej., `blood_group`, `municipality`). Envía `null` en una clave para eliminarla. |`parsed_address` solo acepta estas claves anidadas: `address_type`, `city`, `region`, `street_1`, `street_2`, `postal_code`, `country` (ISO 3166-1 **alfa-2**).### Ejemplo```bash theme={null}
curl -X PATCH "https://verification.didit.me/v3/session/4c5c7f3a.../update-data/" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "John",
    "last_name": "Doe",
    "date_of_birth": "1990-01-01",
    "issuing_state": "ESP",
    "extra_fields": { "municipality": "Madrid" }
  }'
```En un flujo basado en grafos con varias instancias, añade `?node_id=feature_ocr_2` a la URL (o pasa `"node_id": "feature_ocr_2"` en el cuerpo) para seleccionar un registro KYC concreto.## Actualizar los datos de Prueba de domicilio (POA)**`PATCH /v3/session/{sessionId}/update-poa-data/`**Modifica los campos extraídos de un documento de prueba de domicilio. Se aplican las mismas restricciones de estado y el mismo privilegio que en las actualizaciones KYC. También admite `node_id` para flujos con varias instancias.### Campos modificables| Campo | Notas |
| - | - |
| `issuing_state` | País que emitió el documento, ISO 3166-1 alfa-3. |
| `document_type` | p. ej., `utility_bill`, `bank_statement`, `lease_agreement`. |
| `document_language` | Idioma del documento en ISO 639-1. |
| `issuer` | Empresa de servicios públicos, banco, arrendador, etc. |
| `issue_date` | Fecha en formato ISO 8601. |
| `poa_address` | Dirección tal como aparece impresa en el documento (texto libre). Provoca una nueva geocodificación. |
| `name_on_document` | Nombre completo impreso en el documento. |
| `poa_parsed_address` | Dirección estructurada: misma estructura anidada que `parsed_address` de KYC. |
| `extra_fields` | Campos específicos del documento: datos bancarios (`bank_account_number`, `bank_iban`, `bank_sort_code`, `bank_routing_number`, `bank_swift_bic`, `bank_branch_name`, `bank_branch_address`), `document_phone_number`, `additional_names` (lista o `null`). |### Ejemplo```bash theme={null}
curl -X PATCH "https://verification.didit.me/v3/session/4c5c7f3a.../update-poa-data/" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "document_type": "utility_bill",
    "issuer": "Iberdrola",
    "issue_date": "2026-03-15",
    "name_on_document": "Jane Doe",
    "poa_parsed_address": {
      "street_1": "Calle Mayor 10",
      "city": "Madrid",
      "postal_code": "28013",
      "country": "ES"
    }
  }'
```## Actualizar los datos de empresa de KYB**`PATCH /v3/session/{sessionId}/kyb/{companyUuid}/update-data/`**Corrige los campos extraídos del registro de una empresa de KYB. El endpoint edita **tanto** las columnas canónicas de la empresa como `registry_data`, de modo que la vista "Extracted from Registry" de la consola refleja tus correcciones. `user_provided_data` (lo que el usuario final confirmó en el flujo alojado) no se modifica. Se registra `last_console_edit_at` y se envía un webhook `data.updated` con `trigger: "console_registry_edit"`.### Requisitos- **Permiso**: `write:businesses` (distinto del permiso de KYC / POA).
- El `companyUuid` de la URL debe pertenecer al `sessionId` indicado; de lo contrario, recibes un 404.
- No hay restricción por estado de la sesión: los datos de empresa de KYB se pueden corregir en cualquier momento.### Campos modificables| Campo | Notas |
| - | - |
| `company_name` | Razón social. |
| `registration_number` | Número de registro oficial. |
| `country_code` | País de constitución, ISO 3166-1 alfa-3. |
| `incorporation_date` / `registration_date` / `dissolution_date` | Fechas ISO 8601. |
| `tax_number` | Número de identificación fiscal. |
| `legal_address` | Alias de `registered_address`: se guarda en la columna canónica `registered_address`. |
| `company_type` | Ltd / LLC / PLC / SA / GmbH / SL, etc. |
| `registry_status` | `active`, `dissolved`, `struck_off`, `inactive`, etc. |
| `verification_status` | `verified`, `failed`, `unknown`. |
| `alternative_names` | Nombres comerciales, nombres anteriores, DBA. |
| `nature_of_business` | Descripción breve. |
| `registered_capital` | Capital autorizado / emitido. |
| `website`, `email`, `phone` | Datos de contacto. |
| `legal_entity_identifier` | LEI. |
| `location_of_registration` | Ciudad / subdivisión. |
| `control_scheme` | Esquema de gobierno, cuando el registro lo proporciona. |Los campos que omitas no se modifican. Los campos que envíes se escriben en la columna canónica (cuando existe) y se combinan en `registry_data`. Las fechas se serializan como cadenas ISO 8601 al combinarse en `registry_data`.### Ejemplo```bash theme={null}
curl -X PATCH "https://verification.didit.me/v3/session/bs-01HJX1.../kyb/f7a9c1b2-4e6d.../update-data/" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "company_name": "Acme Corporation Limited",
    "registration_number": "12345678",
    "registry_status": "active",
    "legal_address": "1 Main Street, London EC1A 1AA, United Kingdom",
    "alternative_names": "Acme Ltd, Acme Group"
  }'
```Respuesta: el objeto completo de la empresa de KYB, con la misma estructura que `registry_checks[].company` en la [decisión de la sesión](https://docs.didit.me/es/sessions-api/retrieve-session.md#verificación-de-empresas-kyb).## Omitir a una parte de Personas clave**`PATCH /v3/session/{sessionId}/kyb/parties/{partyUuid}/`**Exime de la verificación a una parte de Personas clave: es la vía de escape para una parte que nunca podrá completar su propia comprobación. La causa habitual es una sesión hija eliminada: una vez eliminado el KYC individual asignado a un UBO o a un director, su estado queda congelado y nunca puede resolverse, por lo que el KYB no tiene nada que pueda sacarlo de `Awaiting User`. Al omitir la parte, esta sale de la agregación de Personas clave, la comprobación se recalcula en el acto y la sesión puede resolverse y ser aprobada o rechazada.### Requisitos- **Permiso**: `write:businesses`.
- El `partyUuid` de la URL debe pertenecer al `sessionId` indicado; de lo contrario, recibes un 404.
- **No depende de `allow_skip`.** Esa configuración del rol limita lo que el solicitante puede omitir mientras completa la pantalla alojada de Personas clave; este endpoint es la anulación del operador, por lo que funciona incluso en roles que el solicitante no podría haber omitido.### Cuerpo| Campo | Tipo | Notas |
| - | - | - |
| `is_skipped` | boolean | `true` exime a la parte; `false` la vuelve a incluir y la comprobación vuelve a quedar a la espera de ella. |`requires_verification` se deja intacto de forma deliberada, de modo que una parte excluida aparece con `requires_verification: true` **y** `is_skipped: true`: el registro sigue mostrando que las reglas exigían una comprobación.### Ejemplo```bash theme={null}
curl -X PATCH "https://verification.didit.me/v3/session/bs-01HJX1.../kyb/parties/0a3f1e2c-7c2f.../" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "is_skipped": true }'
```Respuesta: la parte actualizada, con la misma forma que una entrada de `key_people_checks[].submitted.parties[]` en la [decisión de la sesión](https://docs.didit.me/es/business-verification/response-schema.md#key_people_checks).Se envía un webhook `data.updated` con `trigger: "console_key_people_skip"`.> [!NOTE]
>
> Una parte cuya sesión hija se eliminó aparece marcada en el payload de la decisión con
> `kyc_session_deleted: true` (o `kyb_sub_session_deleted: true` en el caso de partes
> corporativas), y su `kyc_session_url` / `kyb_sub_session_url` se devuelve como
> `null` porque el enlace ya no se resuelve. Eliminar una sesión hija nunca
> aprueba a la parte por sí solo: la comprobación de Personas clave pasa a `In Review` para que
> una persona tome la decisión.## Qué ocurre después de una actualización- **Webhook**: se activa `data.updated` en la sesión, con el `session_kind` de la sesión en el payload (`"user"` o `"business"`). Suscríbete una sola vez a nivel de destino y enruta según `session_kind`.
- **Registro de auditoría**: la sesión registra exactamente qué campos cambiaron, los valores anteriores y nuevos y (en las llamadas autenticadas como usuario) el correo electrónico de quien hizo el cambio. Se puede ver en la pestaña Events de la consola.
- **Nueva geocodificación de la dirección**: en las actualizaciones de KYC y POA que cambian `address` / `poa_address`, Didit vuelve a ejecutar la geocodificación en segundo plano. Los fallos se ignoran, de modo que la actualización nunca falla por un problema de geocodificación.
- **Nueva evaluación AML**: las actualizaciones de KYC que cambian el nombre, la fecha de nacimiento o la nacionalidad pueden volver a disparar el análisis AML si este no había terminado en la sesión. Los resultados aparecen en la decisión de la sesión.## Cuándo no usar estos endpoints- **Volver a ejecutar toda la verificación**: si el cliente tiene que volver a tomar la foto de su documento de identidad o volver a subir un documento, usa [update-status](https://docs.didit.me/es/sessions-api/update-status.md) para pasar la sesión a `Resubmitted`.
- **Cambiar campos del perfil de la entidad User o Business**: usa [`PATCH /v3/users/{vendor_data}/`](https://docs.didit.me/es/management-api/users/update) o [`PATCH /v3/businesses/{vendor_data}/`](https://docs.didit.me/es/management-api/businesses/update); esos endpoints actualizan datos a nivel de entidad, no a nivel de sesión.
- **Editar los datos de Personas clave**: no existe una API pública para modificar el nombre, los roles o la propiedad de una parte; esos datos se envían a través del flujo alojado. El único campo modificable es `is_skipped` (consulta [Omitir a una parte de Personas clave](#omitir-a-una-parte-de-personas-clave)).## Errores| Estado | Significado |
| - | - |
| `401` | Faltan las credenciales o no son válidas. |
| `403` | Quien hace la llamada no tiene el privilegio necesario (`write:sessions` o `write:businesses`). |
| `404` | No se encontró la sesión, o la sesión no contiene el registro que intentas modificar (no hay KYC, no hay POA, no hay ninguna empresa coincidente, no hay ninguna parte que coincida o la parte pertenece a otra sesión). |
| `400` | Error de validación: código de país no válido, clave de `parsed_address` desconocida, `extra_fields` no es un objeto, etc. |## Próximos pasos> [card] [Obtener sesión](https://docs.didit.me/es/sessions-api/retrieve-session.md)
>
> Obtén la decisión completa para ver los campos actualizados.> [card] [Actualizar estado](https://docs.didit.me/es/sessions-api/update-status.md)
>
> Aprueba, rechaza o reabre una sesión después de corregir datos.> [card] [Webhooks](https://docs.didit.me/es/integration/webhooks.md)
>
> Suscríbete a los eventos `data.updated`.


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