Ir al contenido
FINORA Academy
SistemaFINORA Core

FINORA Core · Referencia

Códigos de error del gateway de API

ImplementadoImplementado

Transcrita del código del gateway (main, la versión desplegada). Todo error es application/problem+json con:

PropiedadQué es
typeurn:finora:core-gateway:<tipo>
title, status, detailLo de RFC 7807
codigoEl código estable de esta página: es el que tu programa debe leer
requestIdEl mismo valor de la cabecera X-Request-Id
timestampMomento del error
errorCodeEl estado HTTP, para clientes que esperan ese campo
errorReasonCategoría: INVALID_PARAMETERS (400), INVALID_CREDENTIALS (401), PERMISSION_DENIED (403), NOT_FOUND (404), INVALID_API_OPERATION (405, 406, 415), CONFLICT (409), BUSINESS_RULE_VIOLATION (422), TENANT_SUSPENDED (423), TOO_MANY_REQUESTS (429), METHOD_NOT_IMPLEMENTED (501), SERVICE_UNAVAILABLE (503), INTERNAL_ERROR (otros 5xx)
errorSourceEl campo, parámetro o cabecera culpable, cuando se conoce (limit, Idempotency-Key, filterCriteria[0], Content-Type…)

Lee siempre codigo, nunca el texto de detail: el texto puede cambiar, el código no.

EstadocodigoTipoCuándoQué hacer
400GW_GRANT_NO_SOPORTADOgrant-no-soportadogrant_type distinto de client_credentialsUsa client_credentials
400GW_CREDENCIAL_AMBIGUAsolicitud-invalidaEl client_id del cuerpo no coincide con el de Authorization: BasicManda la credencial por una sola vía
400GW_ALCANCE_INVALIDOalcance-invalidoPediste en scope un alcance que tu credencial no tienePide un subconjunto de los tuyos, o ninguno
401GW_CREDENCIAL_INVALIDAcredencial-invalidaCliente o secreto incorrectosRevisa el par; cada fallo suma al bloqueo
401GW_NO_AUTENTICADOno-autenticadoPetición sin token ni apiKey, o token vencido o alteradoPide un token nuevo
429GW_LOGIN_BLOQUEADOdemasiados-intentosDemasiados fallos seguidos de esa credencialEspera el tiempo de bloqueo y corrige el secreto
429GW_IP_BLOQUEADAdemasiados-intentosDemasiadas credenciales inválidas desde tu direcciónEspera; el bloqueo vale incluso con una credencial válida

En /v1/oauth/token el error trae además la propiedad error de OAuth 2.0: invalid_client, invalid_request, invalid_scope, unsupported_grant_type o unauthorized_client.

EstadocodigoTipoCuándo
400TENANT_INVALIDOsolicitud-invalidaEl nombre de institución no tiene un formato válido
400TENANT_AMBIGUOsolicitud-invalidaEl subdominio y X-Finora-Tenant nombran instituciones distintas
400ENTORNO_AMBIGUOsolicitud-invalidaEl subdominio y X-Finora-Environment se contradicen
400ENTORNO_INVALIDOsolicitud-invalidaX-Finora-Environment no es production ni sandbox
403GW_ALCANCE_INSUFICIENTEalcance-insuficienteTu credencial no tiene el alcance de ese dominio y método
403TENANT_CRUZADOtenant-cruzadoPediste una institución distinta de la de tu credencial
403ENTORNO_CRUZADOentorno-cruzadoToken de producción contra el sandbox, o al revés
403TENANT_DESCONOCIDOtenant-desconocidoLa institución no está en el registro del gateway
403SANDBOX_NO_DISPONIBLEsandbox-no-disponibleLa institución no tiene sandbox declarado
403MODULO_NO_HABILITADOmodulo-no-habilitadoEl dominio no está en el plan de la institución
423TENANT_SUSPENDIDOtenant-suspendidoLa institución está suspendida
EstadocodigoCuándo
400PAGINACION_INVALIDAoffset negativo o limit fuera de rango (1–1000; 1–100 en movimientos de cuenta)
400PAGINATION_DETAILS_INVALIDOpaginationDetails no es ON ni OFF
400PAGINACION_POR_CURSORPediste movimientos de cuenta con offset: se paginan con cursor
400DETAILS_LEVEL_INVALIDOdetailsLevel no es BASIC ni FULL
400ID_INVALIDOUn identificador de la ruta con formato inválido (también un GET sobre una acción :verbo)
400FECHA_INVALIDAUna fecha que no es yyyy-MM-dd
400MONEDA_INVALIDAMoneda que no es un código ISO 4217 de tres letras
400TIPO_INVALIDOtype de cuenta contable fuera de la lista
400ESTADO_INVALIDOaccountState de crédito fuera de la lista
400RANGO_DE_FECHAS_REQUERIDOBúsqueda de asientos sin bookingDate BETWEEN con value y secondValue
400CUERPO_INVALIDO, GW_CUERPO_INVALIDOEl cuerpo no es un objeto JSON legible
400CUENTA_INCONSISTENTELa cuenta del cuerpo no coincide con la de la ruta (depósitos, retiros, transferencias)
400GW_SOLICITUD_INVALIDAFalta un parámetro o tiene un tipo inválido
400IDEMPOTENCY_KEY_REQUERIDAEscritura sin Idempotency-Key
400IDEMPOTENCY_KEY_INVALIDAIdempotency-Key no es un UUID
400CURSOR_INVALIDOEl cursor de eventos no tiene el formato que entregó el core
400CURSOR_NO_ADMITIDOMandaste cursor al leer una suscripción: esa lee desde su cursor confirmado
400TIPOS_DE_EVENTO_INVALIDOSeventTypes con un tipo inválido o más de 50
400YAML_REQUERIDOPUT de configuración con el cuerpo vacío
404GW_RUTA_INEXISTENTELa ruta no existe en /v1
404PRODUCTO_NO_ENCONTRADOEl producto de captación o de crédito no existe en el core de la institución
405GW_METODO_NO_PERMITIDOEl método no aplica a esa ruta
406VERSION_NO_SOPORTADAAccept pide una versión distinta de application/vnd.finora.v1+json
406GW_NO_ACEPTABLEAccept pide un formato que la ruta no produce
413YAML_DEMASIADO_GRANDEEl documento de configuración supera 2 MiB
415GW_TIPO_NO_SOPORTADOContent-Type no admitido (JSON en general; YAML en la configuración)
EstadocodigoCuándoQué hacer
409IDEMPOTENCIA_EN_CURSOOtra petición con la misma clave aún no terminaEspera y reintenta con la misma clave
422IDEMPOTENCIA_CUERPO_DISTINTOReusaste la clave con otro cuerpoUna operación nueva lleva una clave nueva
429LIMITE_EXCEDIDOAgotaste el límite; alcanceLimite dice si fue el tuyo (CLIENTE) o el de la institución (TENANT)Espera lo que dice Retry-After
EstadocodigoCuándo
501CORE_NO_SOPORTALa ruta es parte de la superficie /v1 pero el core no la ofrece por API. El error trae operacion y alternativa (por ejemplo, reversar en lugar de borrar un asiento)

El gateway no inventa rechazos de negocio: los toma del core y los reexpone.

EstadocodigoCuándo
4xx del coreCORE_<TIPO>El core rechazó la operación con un tipo propio: unbalanced-entry llega como CORE_UNBALANCED_ENTRY, con su mismo estado y sus datos de negocio (blockingRuleCodes, existingCustomerId, operationalDate…) y estadoCore
400 / 404 / 409 / 422CORE_SOLICITUD_INVALIDA, CORE_NO_ENCONTRADO, CORE_CONFLICTO, CORE_REGLA_DE_NEGOCIO, CORE_RECHAZOEl core rechazó sin un tipo propio
403CORE_ACCESO_DENEGADOLa credencial del gateway ante el core no tiene el permiso de esa operación
403CORE_MODULE_DISABLEDEl módulo no está licenciado en el core de la institución (propiedad modulo)
404CORE_RUTA_NO_DISPONIBLEEl core de esa institución todavía no tiene esa ruta (una versión anterior)
422CORE_FOUR_EYES_VIOLATIONQuien aprueba es la misma identidad que quien solicitó (cuatro ojos)
502CORE_ERROR_INTERNOError interno del core, sin detalle publicable
502CORE_RESPUESTA_NO_JSONEl core respondió algo que no es JSON
502CORE_CREDENCIAL_RECHAZADAEl core no aceptó la credencial del gateway: lo corrige el operador, no tú
503CORE_NO_DISPONIBLEEl core no responde (red o tiempo agotado)
503CORE_CIRCUITO_ABIERTOEl circuit breaker de esa institución está abierto tras varios fallos del core
503CORE_SIN_CREDENCIALEl gateway no tiene configurada la credencial de esa institución
500GW_ERROR_INTERNOError inesperado del gateway; nunca trae trazas

Los tipos de la API contable están en la referencia de la API contable.

Situación¿Reintentas?
5xx, CORE_NO_DISPONIBLE, CORE_CIRCUITO_ABIERTOSí, con espera creciente y la misma Idempotency-Key
409 IDEMPOTENCIA_EN_CURSOSí, con la misma clave, después de unos segundos
429Sí, después de Retry-After
Cualquier otro 4xxNo: corrige la petición primero