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

# Migra de la API v1 a la API v2

> Actualiza las rutas y los contratos de tu integración cuando pasas de Midaz v3.x.x a Midaz v4.x.x.

Esta guía compara los contratos HTTP de Midaz v3.8.6 y Midaz v4.x.x. Cubre el Ledger, CRM y Fees. Describe Midaz v4.3.0. El texto indica la versión de cada comportamiento que empieza después de v4.0.0.

> [!WARNING]
>
> Pasa tu integración a los contratos v2 a más tardar el 29 de abril de 2027. Después de esa fecha, Lerian elimina los contratos v1 del Ledger.

> [!NOTE]
>
> No reemplaces `/v1` por `/v2` en toda tu integración. Midaz v3.x.x y Midaz v4.x.x son versiones del producto. v1 y v2 son versiones del contrato HTTP. Midaz v4.x.x sirve los contratos v1 y v2 en paralelo, y algunas rutas v1 no tienen una ruta v2.

## Rutas del Ledger

***

Reemplaza `{organization_id}`, `{ledger_id}` y los demás identificadores de las URL por los valores de tu integración.

| Tarea | API v1 | API v2 | Cambio |
| :- | :- | :- | :- |
| Crear una transacción | `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/json` `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/inflow` `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/outflow` | [`POST /v2/transactions/direct`](https://docs.lerian.studio/es/reference/products/midaz/v2/create-transaction-direct) [`POST /v2/transactions/hold`](https://docs.lerian.studio/es/reference/products/midaz/v2/create-transaction-hold) | Mueve la organización y el ledger de la URL al cuerpo. Consulta [Organización y ledger en el cuerpo de la transacción](#organization-and-ledger-in-the-transaction-body). |
| Bloquear y desbloquear | `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/block` `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/unblock` | [`POST /v2/transactions/block`](https://docs.lerian.studio/es/reference/products/midaz/v2/create-transaction-block) [`POST /v2/transactions/unblock`](https://docs.lerian.studio/es/reference/products/midaz/v2/create-transaction-unblock) | Mueve la organización y el ledger de la URL al cuerpo. Consulta [Organización y ledger en el cuerpo de la transacción](#organization-and-ledger-in-the-transaction-body). |
| Leer y actualizar transacciones | `GET /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions` `GET` y `PATCH /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/{transaction_id}` | [`GET /v2/organizations/{organization_id}/ledgers/{ledger_id}/transactions`](https://docs.lerian.studio/es/reference/products/midaz/v2/get-all-transactions) `GET` y `PATCH /v2/organizations/{organization_id}/ledgers/{ledger_id}/transactions/{transaction_id}` | Los mismos métodos. Actualiza cómo lees la respuesta. Consulta [Respuestas y errores](#responses-and-errors). |
| Confirmar, cancelar y revertir | `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/{transaction_id}/commit` `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/{transaction_id}/cancel` `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/{transaction_id}/revert` | [`POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/transactions/{transaction_id}/commit`](https://docs.lerian.studio/es/reference/products/midaz/v2/commit-transaction) [`POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/transactions/{transaction_id}/cancel`](https://docs.lerian.studio/es/reference/products/midaz/v2/cancel-transaction) [`POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/transactions/{transaction_id}/revert`](https://docs.lerian.studio/es/reference/products/midaz/v2/revert-transaction) | Los mismos métodos. Actualiza cómo lees la respuesta. |
| Actualizar una operación de una transacción | `PATCH /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/{transaction_id}/operations/{operation_id}` | [`PATCH /v2/organizations/{organization_id}/ledgers/{ledger_id}/transactions/{transaction_id}/operations/{operation_id}`](https://docs.lerian.studio/es/reference/products/midaz/v2/update-operation) | Cambia solo el prefijo. La respuesta no cambia. |
| Cuentas | `/v1/organizations/{organization_id}/ledgers/{ledger_id}/accounts` y sus subrutas | [`/v2/organizations/{organization_id}/ledgers/{ledger_id}/accounts`](https://docs.lerian.studio/es/reference/products/midaz/v2/list-accounts) y sus subrutas | Revisa las reglas de titulares. Consulta [Cuentas y reglas en la API v2](#accounts-and-rules-in-api-v2). |
| Ledgers, saldos y operaciones | Las rutas v1 | Las rutas v2 con los mismos métodos | Las respuestas de éxito no cambian. El formato de error cambia. |
| Rutas de transacción y rutas de operación | `/v1/organizations/{organization_id}/ledgers/{ledger_id}/transaction-routes` `/v1/organizations/{organization_id}/ledgers/{ledger_id}/operation-routes` | [`/v2/organizations/{organization_id}/ledgers/{ledger_id}/transaction-routes`](https://docs.lerian.studio/es/reference/products/midaz/v2/list-transaction-routes) [`/v2/organizations/{organization_id}/ledgers/{ledger_id}/operation-routes`](https://docs.lerian.studio/es/reference/products/midaz/v2/list-operation-routes) | Los mismos métodos. Consulta la referencia de API para ver la respuesta v2. |

Las organizaciones, los activos, los segmentos, los portafolios, los tipos de cuenta, la configuración del ledger y los índices de metadatos también tienen rutas v2. Conserva el método y el alcance de cada ruta. No todas reciben una organización y un ledger en la URL:

* `/v2/organizations` y `/v2/organizations/{organization_id}/ledgers` reciben solo la organización.
* `/v2/settings/metadata-indexes` no recibe organización ni ledger.
* `/v2/transactions/direct`, `/v2/transactions/hold`, `/v2/transactions/block` y `/v2/transactions/unblock` no reciben organización ni ledger en la URL.

Midaz v4.x.x sirve todas las rutas v1 del Ledger de Midaz v3.x.x. La referencia de API marca todas como obsoletas, y Lerian las elimina después del 29 de abril de 2027. Hasta entonces, conservan el formato de error v1.

## Organización y ledger en el cuerpo de la transacción

***

> [!WARNING]
>
> Cuando pases una solicitud de creación, bloqueo o desbloqueo a v2, mueve la organización y el ledger de la URL al cuerpo. La URL v2 de estas rutas no tiene `{organization_id}` ni `{ledger_id}`.

| API v1: la URL lleva la organización y el ledger | API v2: la URL lleva solo la acción | Dónde van la organización y el ledger |
| :- | :- | :- |
| `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/json` `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/inflow` `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/outflow` | `POST /v2/transactions/direct` `POST /v2/transactions/hold` | `organizationId` y `ledgerId` en cada elemento de `debits` y `credits` |
| `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/block` | `POST /v2/transactions/block` | `organizationId` y `ledgerId` en cada elemento de `debits` y `credits` |
| `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/unblock` | `POST /v2/transactions/unblock` | `organizationId` y `ledgerId` en cada elemento de `debits` y `credits` |

El cuerpo v2 no tiene `organizationId` ni `ledgerId` en el nivel superior. Cada elemento indica la organización y el ledger de su propia cuenta:

```text theme={null}
# API v1: the organization and the ledger are in the path
POST /v1/organizations/3fa85f64-5717-4562-b3fc-2c963f66afa6/ledgers/9c858901-8a57-4791-81fe-4a34d4dd8ab5/transactions/json

# API v2: the organization and the ledger are in each item of the body
POST /v2/transactions/direct
```

```json theme={null}
{
  "debits": [
    {
      "alias": "@source",
      "organizationId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "ledgerId": "9c858901-8a57-4791-81fe-4a34d4dd8ab5",
      "amount": "100.00"
    }
  ]
}
```

Este fragmento muestra solo un elemento. Un cuerpo completo también tiene `asset`, `amount` y `credits`. Consulta el [ejemplo de una transacción directa](#example-of-a-direct-transaction).

Sigue estas reglas:

* Envía `organizationId` y `ledgerId` en cada elemento. Ambos son obligatorios, y ambos son UUID.
* Todos los elementos deben indicar la misma organización y el mismo ledger.
* A partir de v4.1.0, `direct` y `hold` aceptan elementos en ledgers distintos cuando cada ledger habilita `crossLedger.enabled`. Consulta [transacciones entre Ledgers](https://docs.lerian.studio/es/products/midaz/ledgers.md#how-to-orchestrate-cross-ledger-transactions).
* `block` y `unblock` siempre necesitan una organización y un ledger en todos los elementos.

Las demás rutas de transacción conservan la organización y el ledger en la URL: listar, leer, actualizar, confirmar, cancelar, revertir y actualizar una operación. Para ver el cuerpo v2 completo, consulta [Contrato de transacción](#transaction-contract).

## Excepciones

***

Estas rutas necesitan un tratamiento específico. No les apliques las tablas de esta guía.

* **Anotaciones.** [`POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/annotation`](https://docs.lerian.studio/es/reference/products/midaz/v1/create-transaction-annotation) no tiene una ruta v2.
* **Cotizaciones de activos.** Estas rutas v1 no tienen una ruta v2:
  * [`PUT /v1/organizations/{organization_id}/ledgers/{ledger_id}/asset-rates`](https://docs.lerian.studio/es/reference/products/midaz/v1/create-or-update-asset-rate)
  * [`GET /v1/organizations/{organization_id}/ledgers/{ledger_id}/asset-rates/{external_id}`](https://docs.lerian.studio/es/reference/products/midaz/v1/get-asset-rate-by-external-id)
  * [`GET /v1/organizations/{organization_id}/ledgers/{ledger_id}/asset-rates/from/{asset_code}`](https://docs.lerian.studio/es/reference/products/midaz/v1/get-all-asset-rates-by-asset-code)
* **Tracer.** Tracer conserva su propia API v1. Consulta el [Inicio rápido de la API de Tracer](https://docs.lerian.studio/es/reference/products/tracer/tracer-api-quick-start.md).

Deja de usar las rutas de anotaciones y de cotizaciones de activos a más tardar el 29 de abril de 2027. Después de esa fecha, no están disponibles, y Midaz no tiene una ruta v2 que las reemplace.

## CRM y Fees en la API v2

***

En Midaz v4.x.x, el Ledger sirve CRM y Fees como módulos. Actualiza la URL base de CRM y Fees en tu entorno. Midaz v4.x.x sirve las rutas de CRM y Fees solo en v2. No tiene una copia v1 de ellas.

Cada ruta conserva su método, a menos que la tabla indique otra cosa.

### CRM

Las rutas v1 de abajo vienen de CRM en Midaz v3.x.x. CRM en Midaz v3.x.x significa el componente CRM de Midaz v3.5.0 a v3.8.6 y el plugin de CRM independiente. Midaz v4.x.x renombra los alias como instrumentos.

| CRM en Midaz v3.x.x | CRM en Midaz v4.x.x |
| :- | :- |
| `GET` y `POST /v1/holders` | [`GET`](https://docs.lerian.studio/es/reference/products/midaz/v2/list-holders) y [`POST /v2/organizations/{organization_id}/holders`](https://docs.lerian.studio/es/reference/products/midaz/v2/create-holder) |
| `GET`, `PATCH` y `DELETE /v1/holders/{holder_id}` | [`GET`](https://docs.lerian.studio/es/reference/products/midaz/v2/get-holder-by-id), [`PATCH`](https://docs.lerian.studio/es/reference/products/midaz/v2/update-holder) y [`DELETE /v2/organizations/{organization_id}/holders/{holder_id}`](https://docs.lerian.studio/es/reference/products/midaz/v2/delete-holder) |
| `GET /v1/aliases` | [`GET /v2/organizations/{organization_id}/instruments`](https://docs.lerian.studio/es/reference/products/midaz/v2/list-instruments) |
| `POST /v1/holders/{holder_id}/aliases` | [`POST /v2/organizations/{organization_id}/holders/{holder_id}/instruments`](https://docs.lerian.studio/es/reference/products/midaz/v2/create-instrument) |
| `GET`, `PATCH` y `DELETE /v1/holders/{holder_id}/aliases/{alias_id}` | [`GET`](https://docs.lerian.studio/es/reference/products/midaz/v2/get-instrument-by-id), [`PATCH`](https://docs.lerian.studio/es/reference/products/midaz/v2/update-instrument) y [`DELETE /v2/organizations/{organization_id}/holders/{holder_id}/instruments/{instrument_id}`](https://docs.lerian.studio/es/reference/products/midaz/v2/delete-instrument) |
| `DELETE /v1/holders/{holder_id}/aliases/{alias_id}/related-parties/{related_party_id}` | [`DELETE /v2/organizations/{organization_id}/holders/{holder_id}/instruments/{instrument_id}/related-parties/{related_party_id}`](https://docs.lerian.studio/es/reference/products/midaz/v2/delete-related-party) |
| `POST /v1/organizations/{organization_id}/encryption/provision` | [`POST /v2/organizations/{organization_id}/encryption/provision`](https://docs.lerian.studio/es/reference/products/midaz/v2/provision-encryption) |
| `GET /v1/organizations/{organization_id}/encryption/status` | [`GET /v2/organizations/{organization_id}/encryption/status`](https://docs.lerian.studio/es/reference/products/midaz/v2/get-provisioning-status) |
| `GET /v1/organizations/{organization_id}/protection/audit` | [`GET /v2/organizations/{organization_id}/protection/audit`](https://docs.lerian.studio/es/reference/products/midaz/v2/get-audit-events) |

Las últimas cuatro filas se aplican solo al componente CRM de Midaz v3.x.x. El plugin de CRM independiente no tiene estas rutas.

### Fees

Las rutas v1 de abajo vienen del plugin de Fees independiente. Midaz v3.x.x no tiene un componente Fees.

| Plugin de Fees | Fees en Midaz v4.x.x |
| :- | :- |
| `GET` y `POST /v1/packages` | [`GET`](https://docs.lerian.studio/es/reference/products/midaz/v2/get-all-packages) y [`POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/packages`](https://docs.lerian.studio/es/reference/products/midaz/v2/create-package) |
| `GET`, `PATCH` y `DELETE /v1/packages/{package_id}` | [`GET`](https://docs.lerian.studio/es/reference/products/midaz/v2/get-package-by-id), [`PATCH`](https://docs.lerian.studio/es/reference/products/midaz/v2/update-package) y [`DELETE /v2/organizations/{organization_id}/ledgers/{ledger_id}/packages/{package_id}`](https://docs.lerian.studio/es/reference/products/midaz/v2/delete-package) |
| `POST /v1/estimates` | [`POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/estimates`](https://docs.lerian.studio/es/reference/products/midaz/v2/estimate-fee-calculation) |
| `GET` y `POST /v1/billing-packages` | [`GET`](https://docs.lerian.studio/es/reference/products/midaz/v2/get-all-billing-packages) y [`POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing-packages`](https://docs.lerian.studio/es/reference/products/midaz/v2/create-billing-package) |
| `GET`, `PATCH` y `DELETE /v1/billing-packages/{billing_package_id}` | [`GET`](https://docs.lerian.studio/es/reference/products/midaz/v2/get-billing-package-by-id), [`PATCH`](https://docs.lerian.studio/es/reference/products/midaz/v2/update-billing-package) y [`DELETE /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing-packages/{billing_package_id}`](https://docs.lerian.studio/es/reference/products/midaz/v2/delete-billing-package) |
| `POST /v1/billing/calculate` | [`POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing/calculate`](https://docs.lerian.studio/es/reference/products/midaz/v2/calculate-billing) |
| `POST /v1/fees` | Sin ruta HTTP. Midaz aplica las comisiones dentro del flujo de transacciones v2. |

## Cambios de alcance y de permisos

***

* Envía la organización en la URL. No envíes el header `X-Organization-Id`.
* En Fees, envía el ledger en la URL. Elimina `ledgerId` del cuerpo de los paquetes, las estimaciones, los paquetes de facturación y el cálculo de facturación.
* Las listas de paquetes y de paquetes de facturación siempre cubren un solo ledger. En el plugin, `ledgerId` era un parámetro de consulta opcional. Para listar los paquetes de una organización completa, llama a la lista una vez por cada ledger.
* En los instrumentos de CRM, conserva `ledgerId` y `accountId` en el cuerpo.
* Usa las estimaciones solo para simular comisiones. Una estimación no registra nada.

Midaz v4.x.x verifica los permisos en el grupo `midaz`. Otorga los nuevos permisos en [Access Manager](https://docs.lerian.studio/es/platform/access-manager.md) antes de mover el tráfico. No supongas que los permisos anteriores siguen vigentes.

| Permiso en Midaz v3.x.x | Permiso en Midaz v4.x.x |
| :- | :- |
| `plugin-crm:holders` | `midaz:holders` |
| `plugin-crm:aliases` | `midaz:instruments` |
| `plugin-crm:encryption` | `midaz:encryption` |
| `plugin-crm:protection` | `midaz:protection` |
| `plugin-fees:packages` | `midaz:packages` |
| `plugin-fees:estimates` | `midaz:estimates` |
| `plugin-fees:billing-packages` | `midaz:billing-packages` |
| `plugin-fees:billing-calculate` | `midaz:billing-calculate` |
| `plugin-fees:fees` | Ninguno. La ruta no existe en Midaz v4.x.x. |

Las rutas nuevas no mueven tus datos. Planifica la migración de los datos, los vínculos y los identificadores de CRM y Fees como una tarea aparte. Para ver el historial de CRM independiente, consulta [Historial de migración de CRM](https://docs.lerian.studio/es/products/midaz/crm/crm-migration-guide.md). Para mover los paquetes de comisiones de Bank Transfer, consulta [Migra las comisiones de Bank Transfer a Midaz](https://docs.lerian.studio/es/products/midaz/fees/fees-migration-guide.md).

## Contrato de transacción

***

El cuerpo de la solicitud v2 tiene estos campos:

* `asset`: el código del activo.
* `amount`: el total, como una cadena decimal.
* `debits` y `credits`: arreglos con uno o más elementos cada uno.

Cada elemento de `debits` y `credits` tiene estos campos:

* `alias`: el alias de la cuenta.
* `organizationId` y `ledgerId`: los UUID de la organización y del ledger de la cuenta. Consulta [Organización y ledger en el cuerpo de la transacción](#organization-and-ledger-in-the-transaction-body).
* `amount` o `share`: envía exactamente uno de los dos.

Elige la intención con la ruta. El cuerpo v2 no tiene un campo `pending`:

* Usa `/v2/transactions/direct` para registrar la transacción de inmediato.
* Usa `/v2/transactions/hold` para crear una transacción pendiente. Después, confírmala o cancélala.

Cuando conviertas una entrada o una salida, escribe ambos lados. En el lado que v1 omitía, usa `@external/` seguido del código del activo en mayúsculas, por ejemplo `@external/BRL`.

### Ejemplo de una transacción directa

`POST /v2/transactions/direct`. Reemplaza los alias y los UUID por los valores reales.

```json theme={null}
{
  "asset": "BRL",
  "amount": "100.00",
  "debits": [
    {
      "alias": "@source",
      "organizationId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "ledgerId": "9c858901-8a57-4791-81fe-4a34d4dd8ab5",
      "amount": "100.00"
    }
  ],
  "credits": [
    {
      "alias": "@destination",
      "organizationId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "ledgerId": "9c858901-8a57-4791-81fe-4a34d4dd8ab5",
      "amount": "100.00"
    }
  ]
}
```

### Campos que el cuerpo v2 no acepta

Midaz rechaza un cuerpo v2 que tiene un campo desconocido, con una respuesta `400`. Revisa tu flujo si envía alguno de estos campos v1:

* `rate` y `remaining` en un elemento.
* `metadata` en un elemento. La transacción en sí sigue aceptando `metadata`.
* `transactionDate`.
* `balanceKey` en un elemento, solo en Midaz v4.0.x. A partir de v4.1.0, cada elemento acepta un `balanceKey` opcional.

No copies estos campos en el cuerpo v2. Primero encuentra una alternativa compatible.

## Respuestas y errores

***

### Respuestas de transacción

* `source` y `destination` pasan a ser `debit` y `credit`, en singular.
* La transacción ya no tiene `route` ni `chartOfAccountsGroupName`.
* Las operaciones dentro de una transacción ya no tienen `route` ni `chartOfAccounts`. Conservan `routeId`, `routeCode` y `routeDescription`.
* Las respuestas de una operación que lees por separado no cambian.
* A partir de v4.1.0, un `direct` o `hold` que abarca varios ledgers devuelve un grupo con `groupId` y `transactions[]`. Confirmar, cancelar y revertir también pueden devolver un grupo.

La transacción v2 también tiene campos que v1 no tiene. Consulta [`GET /v2/organizations/{organization_id}/ledgers/{ledger_id}/transactions/{transaction_id}`](https://docs.lerian.studio/es/reference/products/midaz/v2/get-transaction) en la referencia de API.

### Errores

Las rutas v2 devuelven los errores en el formato RFC 9457, con `Content-Type: application/problem+json`. Lee estos miembros:

* `type`, `title`, `status` y `detail`.
* `code`: el código de error de Midaz. El mismo error tiene el mismo código en v1 y v2.
* `errors[]`: los errores de campo, cuando la solicitud los tiene.

Por ejemplo, una solicitud `POST /v2/transactions/direct` que todavía envía el campo v1 `transactionDate` recibe esta respuesta:

```http theme={null}
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
```

```json theme={null}
{
  "type": "https://errors.lerian.studio/v1/0053",
  "title": "Unexpected Fields in the Request",
  "status": 400,
  "detail": "The request body contains more fields than expected. Please send only the allowed fields as per the documentation. The unexpected fields are listed in the fields object.",
  "errors": [
    {
      "message": "unexpected field",
      "location": "transactionDate"
    }
  ],
  "code": "0053"
}
```

La URI de `type` termina con el código de error. Su segmento `/v1` es la versión del catálogo de errores, no la versión de la API.

No dependas de `message` ni de `fields`. Pertenecen al formato de error v1. En v2, solo las respuestas `413` y `504` también llevan un `message` en el nivel superior. Consulta [Manejo de errores](https://docs.lerian.studio/es/reference/error-handling.md) y la [Lista de errores de Midaz](https://docs.lerian.studio/es/reference/products/midaz/error-list.md).

## Cuentas y reglas en la API v2

***

### Rutas de cuentas

Las rutas de cuentas v2 te permiten estas tareas:

* Leer una cuenta por alias y por código externo.
* Actualizar y eliminar una cuenta.
* Contar las cuentas con `HEAD`.

Envía `holderId` cuando crees una cuenta. Lee `holderId` y `holderCheckSkipped` en las respuestas de cuentas v2.

### Reglas de titulares

* Cuando `accounting.requireHolder` está activado, cada cuenta necesita un titular de la organización. Sin un titular, Midaz no crea la cuenta.
* Para omitir esa verificación, envía `skip.holder`. Midaz lo acepta solo cuando `overrides.allowHolderSkip` está activado. De lo contrario, Midaz rechaza la solicitud con `422` y el error `0490`.
* Cuando `accounting.requireHolder` está desactivado y no envías un titular, una cuenta no externa recibe el titular de su organización. Una cuenta externa no recibe un titular.
* Cuando `accounting.requireHolder` está desactivado, Midaz no verifica que exista el `holderId` que envías.
* Una cuenta que creas a través de v1 no recibe un titular. v1 no aplica estas reglas.

Consulta [Configuración del Ledger](https://docs.lerian.studio/es/products/midaz/ledgers.md#ledger-settings).

### Fees y Tracer

Una transacción v2 ejecuta dos pasos que v1 no ejecuta:

* **Fees.** Midaz cobra una comisión cuando un paquete de comisiones coincide con la transacción.
* **Tracer.** Midaz reserva la transacción en Tracer cuando el modo de Tracer del ledger no es `off`.

A partir de v4.1.0, una transacción puede omitir estos pasos con `skip.fees` o `skip.tracer`. Primero, el ledger debe activar `overrides.allowFeeSkip` o `overrides.allowTracerSkip`.

Valida tus paquetes de comisiones y tus límites de Tracer antes de mover el tráfico. Después de la migración, puedes ver nuevos cobros y nuevos rechazos. Consulta [Compatibilidad de Midaz y plugins](https://docs.lerian.studio/es/products/midaz/midaz-version-compatibility.md).

## Lista de verificación de la migración

***

* [ ] Lista las rutas que usas, la versión del producto y la URL base de cada servicio. Separa las rutas que tienen una ruta v2 de las rutas que no la tienen. Planifica dejar de usar las rutas que no la tienen a más tardar el 29 de abril de 2027.
* [ ] Para cada transacción, elige `direct` o `hold`. Actualiza `debits`, `credits`, los valores decimales y el alcance de cada elemento.
* [ ] Cambia los alias de CRM por instrumentos. Mueve la organización y el ledger de Fees a la URL. Después de la migración de datos, verifica los vínculos y los identificadores.
* [ ] Otorga los permisos `midaz`. Prueba las reglas de titulares de las cuentas en un entorno de staging.
* [ ] Actualiza cómo lees las respuestas de éxito y de error. Prueba los campos eliminados, los datos de entrada no válidos, los recursos inexistentes y el acceso denegado.
* [ ] Prueba cada flujo que usa tu integración: crear, leer, retener, confirmar, cancelar, revertir, bloquear y desbloquear. Verifica los saldos, las operaciones, las comisiones y los rechazos por límites de Tracer.
* [ ] Sigue enviando `X-Idempotency` y `X-TTL` en las solicitudes de creación. No envíes la misma transacción por v1 y v2 para comparar resultados. Usa datos y escenarios controlados en un entorno de staging.
* [ ] Mueve el tráfico en pasos controlados. Supervisa los errores y los resultados financieros. Mantén un plan de rollback que no vuelva a enviar transacciones ya procesadas.


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