> ## 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.4.1. 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, excepto la ruta de transacción DSL, que v4 no sirve. 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.

* **Transacciones DSL.** `POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/dsl` no tiene una ruta v4. Usa `/v2/transactions/direct` o `/v2/transactions/hold`.
* **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. A partir de v4.4.0, una cuenta de origen con un plan de tarifas activo paga las tarifas de su plan, nunca las comisiones de un paquete de comisiones.
* **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.