> ## 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.

# API REST de Lender

> Ubícate en la API de Lender: la ruta base /api/v1, autenticación bearer, autorización por recurso y acción, dinero como string decimal, idempotencia acotada, paginación, la forma de error problem+json y las operaciones agrupadas por trabajo.

Lender sirve una sola API HTTP. Cada operación vive bajo la ruta base `/api/v1`, y nada se versiona en el host. Un listado de productos es `GET /api/v1/loan-products`.

Esta página es el mapa, no el territorio. Cubre lo que las operaciones comparten y luego las agrupa por el trabajo que hacen. Cada operación tiene su propia página bajo el anchor **Lender** en la [Referencia de API](/es/reference/introduction), con las formas completas de request y response.

<Note>
  Los documentos OpenAPI de este portal son fuentes de renderizado para las páginas de referencia. No son contratos de cliente ni base para generar un SDK.
</Note>

## Autenticación

***

La autenticación se configura por despliegue. `PLUGIN_AUTH_ENABLED` tiene `false` como valor por defecto; cuando está habilitada, las rutas protegidas requieren un token bearer JWT:

```http theme={null}
Authorization: Bearer <token>
```

El valor por defecto solo sirve para despliegues single-tenant: el arranque rechaza `MULTI_TENANT_ENABLED=true` con `PLUGIN_AUTH_ENABLED=false`, porque Lender resuelve el tenant a partir de la claim `tenantId` de la identidad validada.

Dos lecturas son públicas y no piden token: [listar jurisdicciones](/es/reference/lender/list-jurisdictions) y [obtener una jurisdicción](/es/reference/lender/get-jurisdiction). El registro es metadata del despliegue, así que un cliente puede leerlo antes de tener identidad.

Las sondas quedan fuera de la autenticación para que un orquestador las alcance sin token: `/health`, `/readyz` y `/version`.

### Autorización

***

Lender autoriza cada request contra la aplicación `lender`, un recurso y una acción. El recurso sigue a la superficie, y las acciones son granulares en lugar de una sola escritura:

| Recurso              | Acciones                                                                                                                                                            |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `loan_product`       | `read`, `write`                                                                                                                                                     |
| `loan_applications`  | `preview:schedule`, `create`, `approve`, `reject`, `withdraw`, `disburse`, `capitalization-consent:ingest`, `preview:tax`                                           |
| `loan_accounts`      | `read`, `audit:read`, `charge:apply`, `repayment:preview`, `repayment:record`, `repayment:reverse`, `prepayment:record`, `reschedule`, `cet:read`, `pdd:transition` |
| `accounting`         | `read`, `write`                                                                                                                                                     |
| `streaming_manifest` | `read`                                                                                                                                                              |

Otorga al rol del oficial solo las acciones que su trabajo necesita. `make generate-casdoor` escribe los roles y permisos de Lender en un archivo semilla que cargas en tu proveedor de identidad — [Prerrequisitos](/es/lender/lender-prerequisites) muestra el conjunto mínimo para originar.

### Identidad de tenant y de oficial

***

**El tenant nunca es un header, un parámetro de query ni un campo del body.** En modo single-tenant Lender usa `DEFAULT_TENANT_ID`; en modo multi-tenant lo resuelve desde la identidad validada. Consulta [Multi-tenancy](/es/multi-tenancy).

El oficial asignado sale del subject del token de la misma forma. Ningún body de solicitud de préstamo lleva un campo de oficial, y ningún valor enviado por el cliente sobrescribe el subject.

## Requests y responses

***

Cada operación que lleva body envía y devuelve `application/json`.

Envía los importes monetarios y tasas decimales como `requestedInterestRate` en strings decimales — `"50000.00"`, `"0.01500000"`. Los valores de versión de producto y tasa flotante `fixedAnnualRateBps`, `floatingSpreadBps` y `annualRateBps` son puntos básicos enteros. Las marcas de tiempo son RFC 3339 en UTC.

## Idempotencia

***

Las escrituras de dinero y de cronograma aceptan el header de request `X-Idempotency`.

| Operación                                                                          | Header                                            |
| ---------------------------------------------------------------------------------- | ------------------------------------------------- |
| [Desembolsar una solicitud](/es/reference/lender/disburse-loan-application)        | `X-Idempotency` obligatorio                       |
| [Aplicar un cargo de producto](/es/reference/lender/create-loan-product-charges)   | `X-Idempotency` obligatorio                       |
| [Prepagar una cuenta de préstamo](/es/reference/lender/prepay-loan-account)        | `X-Idempotency` obligatorio                       |
| [Prepagar bajo el paquete Brasil](/es/reference/lender/prepay-loan-account-br)     | `X-Idempotency` obligatorio                       |
| [Reprogramar una cuenta de préstamo](/es/reference/lender/reschedule-loan-account) | `X-Idempotency` obligatorio                       |
| [Registrar un pago](/es/reference/lender/record-repayment)                         | `X-Request-ID`, con `X-Idempotency` como respaldo |
| [Reversar una transacción](/es/reference/lender/reverse-loan-account-transaction)  | `X-Request-ID`, con `X-Idempotency` como respaldo |

Envía tu propia clave. Con un almacén de idempotencia disponible, las cinco operaciones que **exigen** `X-Idempotency` comparten un comportamiento:

* Un reintento de una llamada **completada** repite la primera respuesta y le pone `X-Idempotency-Replayed: true`. Nada se registra por segunda vez.
* Un reintento mientras la primera llamada sigue **en vuelo** responde `409`.
* La clave tiene alcance de tenant y expira tras la ventana que fija `IDEMPOTENCY_RETRY_WINDOW_SEC`, con default de 300 segundos.

El middleware compartido falla abierto ante errores transitorios del almacén de idempotencia. Durante una caída, no dependas de la repetición ni de una protección de como-máximo-una-vez a nivel de middleware.

El pago y la reversión funcionan distinto. Ambos leen primero `X-Request-ID` y caen de vuelta a `X-Idempotency` cuando ese falta. Envía uno de los dos: una llamada que no lleva ninguno responde `422`.

Lender guarda el id del request en la base de datos junto con los datos de la llamada. Un reintento que lleva el mismo id y los mismos datos repite la primera respuesta por la ruta normal de respuesta, sin header de repetición. El mismo id de request con datos **distintos** responde `409` en lugar de repetir, así que un id nunca puede registrar dos montos diferentes. Ese registro no expira.

Los datos que Lender compara cambian según la operación:

| Operación                | Datos comparados contra el id del request guardado                                                                                                                                                                       |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Registrar un pago        | La cuenta de préstamo, el monto y la fecha de efecto (`transactionDate` cuando falta `effectiveDate`).                                                                                                                   |
| Reversar una transacción | La transacción que se reversa, la cuenta de préstamo, la fecha efectiva de la reversión, el motivo, la versión del perfil y el código de jurisdicción. El monto viene de la transacción original, así que no se compara. |

## Paginación

***

La paginación es por operación, no global. Lee la página de referencia de la operación que llamas, y envía solo los parámetros que ella declara.

| Lectura                                                                                                                                                         | Parámetros                                                          |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
| [Listar productos de préstamo](/es/reference/lender/list-loan-products) y [listar productos de préstamo brasileños](/es/reference/lender/list-loan-products-br) | `limit` (default 25, techo 100) y `offset` (default 0, techo 10000) |
| [Eventos de auditoría](/es/reference/lender/list-loan-account-audit-events-huma)                                                                                | solo `limit` (default 50, techo 100)                                |

Un valor fuera del rango se rechaza en lugar de ajustarse al límite. Cada otra lectura declara sus propios parámetros, así que acótala con los identificadores y filtros de su página de referencia.

## Errores

***

Los errores de Huma y del manejador global responden `application/problem+json` y siguen [RFC 9457](https://www.rfc-editor.org/rfc/rfc9457). La autorización y el middleware de idempotencia pueden usar sus propios formatos de respuesta.

| Campo    | Qué lleva                                                                                                              |
| -------- | ---------------------------------------------------------------------------------------------------------------------- |
| `status` | El código de estado HTTP.                                                                                              |
| `title`  | El nombre del estado.                                                                                                  |
| `detail` | Qué falló en esta ocurrencia.                                                                                          |
| `errors` | Detalles opcionales de validación de schema. Cada entrada lleva `location`, `message` y el `value` que recibió Lender. |

Ramifica por estado y tipo de contenido. Para un `422`, usa `errors` cuando esté presente; la validación del handler o del dominio puede devolver solo `detail` de nivel superior. Una falla del lado del servidor responde con un detail genérico, así que una causa cruda nunca llega a un cliente.

## Las operaciones por trabajo

***

### Catalogar un producto

Ocho operaciones son dueñas del catálogo. [Crear un producto](/es/reference/lender/create-loan-product) y [agregar una versión](/es/reference/lender/create-loan-product-version) construyen los términos a los que se ata una solicitud. La versión es inmutable. [Vincular un perfil contable](/es/reference/lender/create-loan-product-accounting-profile) mapea cada evento contable a cuentas del libro mayor, y Lender lo necesita en el desembolso. [Aplicar un cargo](/es/reference/lender/create-loan-product-charges) y [leer tasas flotantes](/es/reference/lender/list-loan-product-floating-rates) completan la superficie, junto a [listar](/es/reference/lender/list-loan-products), [obtener](/es/reference/lender/get-loan-product) y [activar](/es/reference/lender/activate-loan-product). Lee [Definir un producto de préstamo](/es/lender/define-a-loan-product).

### Originar

Seis operaciones llevan una solicitud de enviada a desembolsada: [crear](/es/reference/lender/create-loan-application), luego una de [aprobar](/es/reference/lender/approve-loan-application), [rechazar](/es/reference/lender/reject-loan-application) o [retirar](/es/reference/lender/withdraw-loan-application), y después [desembolsar](/es/reference/lender/disburse-loan-application). [Previsualizar un cronograma](/es/reference/lender/preview-loan-schedule) calcula las cuotas para una cotización y no persiste nada.

Las respuestas de creación y de decisión son las únicas lecturas de una solicitud, así que guarda el body que devuelve cada llamada. Lee [Cómo funciona la originación](/es/lender/how-origination-works) para la máquina de estados e [Inicio rápido](/es/lender/lender-quick-start) para las seis llamadas de punta a punta.

### Hacer servicing de un préstamo vivo

Cinco lecturas describen la cuenta: [la cuenta](/es/reference/lender/get-active-loan-account), [su cronograma](/es/reference/lender/get-active-loan-schedule), [sus transacciones](/es/reference/lender/list-active-loan-transactions), [sus cargos](/es/reference/lender/list-active-loan-charges) y [su historia de auditoría](/es/reference/lender/list-loan-account-audit-events-huma).

Cinco escrituras mueven dinero o el cronograma: [previsualizar un pago](/es/reference/lender/preview-repayment) antes de [registrarlo](/es/reference/lender/record-repayment), [prepagar](/es/reference/lender/prepay-loan-account), [reprogramar](/es/reference/lender/reschedule-loan-account) y [reversar una transacción](/es/reference/lender/reverse-loan-account-transaction). Nada reescribe la historia. Una reversión registra una nueva transacción que compensa la original. Lee [Servicing de un préstamo](/es/lender/service-a-loan).

### Contabilizar y asentar

[Iniciar una ejecución de devengo](/es/reference/lender/create-accrual-run) reconoce intereses de un período de competencia. [Lista las referencias de asiento](/es/reference/lender/get-journal-reference) por id de correlación y [lee una](/es/reference/lender/get-journal-reference-by-id) para encontrar el registro contable que escribió una ejecución. Lee [Contabilidad y ejecuciones de devengo](/es/lender/accounting-and-accrual-runs).

### Descubrir jurisdicciones

Las dos lecturas públicas informan qué códigos de jurisdicción lleva este despliegue y qué decide cada perfil. Lee [Jurisdicciones](/es/lender/jurisdictions).

### Brasil

El paquete Brasil agrega lecturas y escrituras reguladas bajo `/api/v1/br`: [divulgación de CET](/es/reference/lender/get-loan-account-cet-disclosure), [el descriptor de operación de crédito](/es/reference/lender/get-loan-account-credit-operation-descriptor), [etapa PDD](/es/reference/lender/get-loan-account-pdd-stage) y [sus transiciones](/es/reference/lender/apply-loan-account-pdd-stage-transition), [una cotización de prepago](/es/reference/lender/create-prepayment-quote) con [su estado de liquidación](/es/reference/lender/get-payoff-statement), [previsualización de impuestos](/es/reference/lender/preview-tax) y [consentimiento de capitalización](/es/reference/lender/ingest-capitalization-clause-consent). El paquete también lleva sus propias rutas de producto, que se comportan como las genéricas bajo reglas brasileñas. Lee [Pack regulatorio de Brasil](/es/lender/brazil-regulatory-pack).

La jornada con descuento en nómina es una conversación por eventos con el riel de nómina, no un conjunto de llamadas REST. Lee [Consignado privado](/es/lender/consignado-privado).

## Próximos pasos

***

<CardGroup cols={2}>
  <Card title="Inicio rápido" icon="rocket" href="/es/lender/lender-quick-start">
    Seis llamadas de una base vacía a un préstamo desembolsado.
  </Card>

  <Card title="Eventos" icon="bell" href="/es/lender/lender-events">
    Suscríbete a la jornada de crédito en lugar de hacer polling.
  </Card>

  <Card title="Referencia de API" icon="code" href="/es/reference/introduction">
    Cada operación, con las formas completas de request y response.
  </Card>

  <Card title="Prerrequisitos" icon="list-check" href="/es/lender/lender-prerequisites">
    Los servicios, las migraciones y la configuración que necesita una primera llamada.
  </Card>
</CardGroup>
