Solicitudes que aprueba una persona
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ón | Ruta | Alcance | Quién decide | Evento de la decisión |
|---|---|---|---|---|
| Cambio de línea de crédito | POST /v1/accounts/{accountId}/credit-limit-requests | credit-limit:request | Una persona en la consola | solicitud_linea.decidida (y cuenta.linea_cambiada si se aplica) |
| Cambio de cuenta principal de un plástico | POST /v1/cards/{cardId}/accounts/{linkId}/principal-requests | cards:links | Una persona en la consola | solicitud_principal.decidida |
| Lote (campaña) de línea o de saldo prepago | POST /v1/limit-jobs | limits:bulk | La consola aprueba y ejecuta en su ventana | lote_limites.completado |
Ajuste prepago DEBITO sobre el umbral del producto | POST /v1/accounts/{accountId}/adjustments | prepaid:adjust | Otro cliente por la API, con prepaid:adjust-approve | ajuste.decidido |
Cómo seguir una solicitud
- Guarda el id que devuelve el 202 (también viene en la cabecera
Location). - Suscríbete al evento de la decisión (Eventos y webhooks) en lugar de consultar en bucle.
- Si necesitas consultar, usa el
GETdel 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(conmotivoRechazo = 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."}'
APROBARconvierte la retención en débito (APLICADO);RECHAZARla 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, 409ESTADO_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 enSIMULADO; no se puede aprobar.modo = SOLICITAR: simula y quedaPENDIENTE_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.