Saltar al contenido principal

Solicitudes que aprueba una persona

Próximamente

Contrato publicado para diseño; las operaciones aún no responden de punta a punta.

En la API del CMS, los sistemas externos solicitan; no aprueban. Las operaciones que cambian el riesgo del emisor no se aplican al recibirlas: quedan pendientes y las decide una persona, con doble control (cuatro ojos), en la consola del emisor. Por eso responden 202 Accepted en lugar de 200 o 201.

OperaciónRutaAlcanceQuién decideEvento de la decisión
Cambio de línea de créditoPOST /v1/accounts/{accountId}/credit-limit-requestscredit-limit:requestUna persona en la consolasolicitud_linea.decidida (y cuenta.linea_cambiada si se aplica)
Cambio de cuenta principal de un plásticoPOST /v1/cards/{cardId}/accounts/{linkId}/principal-requestscards:linksUna persona en la consolasolicitud_principal.decidida
Lote (campaña) de línea o de saldo prepagoPOST /v1/limit-jobslimits:bulkLa consola aprueba y ejecuta en su ventanalote_limites.completado
Ajuste prepago DEBITO sobre el umbral del productoPOST /v1/accounts/{accountId}/adjustmentsprepaid:adjustOtro cliente por la API, con prepaid:adjust-approveajuste.decidido

Cómo seguir una solicitud​

  1. Guarda el id que devuelve el 202 (también viene en la cabecera Location).
  2. Suscríbete al evento de la decisión (Eventos y webhooks) en lugar de consultar en bucle.
  3. Si necesitas consultar, usa el GET del recurso con una frecuencia baja.

Cambio de línea de crédito​

curl https://api-cms.example.com/v1/accounts/3f0c2a7e-5b1d-4e8f-a9c2-7d6e5f4a3b21/credit-limit-requests \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-H "Idempotency-Key: $(uuidgen)" \
-H 'X-Finora-Operador-Final: operador-17' \
-d '{
"linea": "65000.0000",
"unidad": "UVC",
"motivo": "Revisión anual de comportamiento de pago",
"referenciaExterna": "CRM-2026-000123",
"fechaEfectiva": null,
"clausula": { "version": "UVC-2026-09", "aceptadaEn": "2026-10-20T10:10:00-04:00", "canal": "APP" }
}'
{
"requestId": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"accountId": "3f0c2a7e-5b1d-4e8f-a9c2-7d6e5f4a3b21",
"estado": "PENDIENTE",
"cambio": "AUMENTO",
"unidad": "UVC",
"lineaActual": "61363.0000",
"lineaSolicitada": "65000.0000",
"fechaEfectiva": null,
"motivo": "Revisión anual de comportamiento de pago",
"motivoRechazo": null,
"referenciaExterna": "CRM-2026-000123",
"solicitadoPor": "gw:cliente-demo:operador-17",
"creadaEn": "2026-10-20T10:12:00-04:00",
"decididaEn": null
}
  • Las reglas se validan al registrar y otra vez al aplicar: línea dentro de la ficha del producto (LINEA_FUERA_DE_FICHA), cláusula obligatoria si el régimen resultante es UVC (REQUIERE_CLAUSULA), sin cambio de régimen con saldo (CAMBIO_REGIMEN_CON_SALDO), unidad coherente (UNIDAD_NO_COINCIDE) y el piso duro (LINEA_BAJO_PISO): la línea efectiva en Bs nunca puede quedar por debajo de la deuda más lo retenido.
  • Solo una solicitud pendiente por cuenta: otra responde 409 SOLICITUD_PENDIENTE_EXISTE.
  • OBSOLETA (con motivoRechazo = LINEA_CAMBIO) significa que la línea cambió por otra vía antes de aplicarse: crea una solicitud nueva.
  • Retira una pendiente con DELETE /v1/credit-limit-requests/{requestId}.

Ajuste prepago sobre el umbral​

Un ajuste CREDITO, o un DEBITO por debajo del umbral del producto, se aplica al momento (201, estado = APLICADO). Un DEBITO por encima del umbral responde 202 con estado = PENDIENTE_APROBACION: el importe queda retenido, no debitado.

{
"adjustmentId": "d4c3b2a1-0f9e-4d8c-8b7a-6f5e4d3c2b1a",
"accountId": "8a2b4c6d-1e3f-4a5b-9c7d-2e4f6a8b0c13",
"sentido": "DEBITO",
"monto": { "valor": "2500.00", "moneda": "VES" },
"motivo": "CONCILIACION",
"estado": "PENDIENTE_APROBACION",
"operationId": null,
"solicitadoPor": "gw:cliente-demo:operador-17",
"creadoEn": "2026-10-20T15:20:00-04:00",
"decididoEn": null
}

Lo decide un segundo cliente, que tiene prepaid:adjust-approve (nunca el mismo que tiene prepaid:adjust):

curl https://api-cms.example.com/v1/adjustments/d4c3b2a1-0f9e-4d8c-8b7a-6f5e4d3c2b1a/decision \
-H "Authorization: Bearer $TOKEN_APROBADOR" \
-H 'Content-Type: application/json' \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"resultado":"APROBAR","motivo":"Conciliación verificada contra el extracto del banco."}'
  • APROBAR convierte la retención en débito (APLICADO); RECHAZAR la libera (RECHAZADO). Si nadie decide, vence y se libera (VENCIDO).
  • Si quien decide es quien pidió, 403 CUATRO_OJOS. Si el ajuste ya no está pendiente, 409 ESTADO_NO_PERMITE.
  • Un ajuste nunca cobra comisiones.

Lotes (campañas)​

POST /v1/limit-jobs crea una campaña de LINEA_CREDITO o SALDO_PREPAGO (JSON de hasta 1.000 filas; el CSV llega en una fase posterior) y la simula en segundo plano:

  • modo = SIMULAR: solo simula y termina en SIMULADO; no se puede aprobar.
  • modo = SOLICITAR: simula y queda PENDIENTE_APROBACION. La consola la aprueba con la huella de la simulación y la ejecuta en su ventana horaria, una transacción corta por cuenta.

Consulta el avance con GET /v1/limit-jobs/{jobId} y el resultado por fila con GET /v1/limit-jobs/{jobId}/rows. Cancela un lote no ejecutado con POST /v1/limit-jobs/{jobId}/cancel. Ningún lote cambia el régimen VES ↔ UVC de una cuenta.