# Introducción Los errores son molestos - lo sabemos. Por eso tenemos artículos dedicados para cada error en nuestro DevPortal para ayudarte a resolverlos. Echa un vistazo al error a continuación, o simplemente busca el código de error que estás encontrando para ir directamente a las causas y soluciones. ## Códigos de Respuesta Usamos el siguiente código de estado HTTP en la respuesta dependiendo del éxito o fracaso: | Código de Estado | Descripción | | --- | --- | | `200` | ✅ **Éxito** - El contenido está disponible en el cuerpo de la respuesta. | | `201` | ✅ **Éxito** - El contenido fue creado exitosamente en Belvo. | | `204` | ✅ **Éxito** - No hay contenido para devolver. | | `400` | ❌ **Error de Solicitud Incorrecta** - La solicitud devolvió un error, detalle en el contenido. | | `401` | ❌ **No Autorizado** - Las credenciales de Belvo proporcionadas no son válidas. | | `403` | ❌ **Prohibido** - No tienes los permisos requeridos para realizar esta acción. | | `404` | ❌ **No Encontrado** - El recurso al que intentas acceder no se puede encontrar. | | `405` | ❌ **Método No Permitido** - El método HTTP que estás usando no es aceptado para este recurso. | | `408` | ❌ **Tiempo de Solicitud Agotado** - La solicitud se agotó y fue terminada por el servidor. | | `409` | ❌ **Conflicto** - La solicitud no pudo completarse debido a un conflicto con el estado actual del recurso. | | `428` | ❌ **Token MFA Requerido** - Se requirió un token MFA por la institución para conectar. | | `500` | ❌ **Error Interno del Servidor** - El detalle del error está disponible en el cuerpo de la respuesta. | Los errores de la API de Belvo se devuelven en formato JSON. Por ejemplo, un error podría verse así: ```json Ejemplo de un error 400 de Solicitud Incorrecta [ { "request_id": "a6e1c493d7a29d91aed4338e6fcf077d", "message": "Este campo es requerido.", "code": "required", "field": "link" } ] ``` Típicamente, una respuesta de error tendrá los siguientes parámetros: - `request_id`: un ID único para la solicitud, debes compartirlo con el equipo de soporte de Belvo para investigaciones. - `message`: descripción del error en lenguaje humano. - `code`: un código único para el error. Consulta la tabla a continuación para ver cómo manejar cada código de error. - `field` *(opcional)*: El campo específico en el cuerpo de la solicitud que tiene un problema. ## Notas generales sobre el manejo de errores Aquí está nuestra recomendación en términos de reintento en errores: ### Errores 50x Implemente un retroceso exponencial automatizado de hasta cinco reintentos. Recomendamos que utilice un intervalo base de tres segundos con un factor de dos. Por ejemplo, el primer reintento debe ser después de tres segundos, el segundo reintento es después de 6 segundos (2*3), el tercer reintento es después de 12 segundos (2*6), el cuarto reintento es después de 24 segundos (2*12), y el quinto reintento es después de 48 segundos (2*24). ### Errores 40x No deberías intentar nuevamente hacer solicitudes si recibes una respuesta 40x ya que esto es un error del cliente. La única excepción es el error "Too Many Sessions", ya que significa que tu usuario está accediendo a la cuenta desde otro navegador al mismo tiempo. En este caso, por favor implementa la misma política de reintento que con los errores 50x. Almacena el request_id Al implementar tu integración con Belvo, asegúrate de considerar el almacenamiento del `request_id` cuando recibas un error. De esta manera, cuando proporciones a nuestros ingenieros el ID, podrán solucionar el problema rápidamente y volver a poner todo en funcionamiento. ## 400 activation_failed | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Institution | No* | | Enrichment | Institution | No* | | Payment Initiation | N/A | N/A | * Este error normalmente no se muestra en el widget. Sin embargo, hay excepciones donde sí se refleja en el widget para algunas instituciones como BBVA en México. Contáctanos en support@belvo.com si tienes alguna pregunta. ```json Activation Failed Example [ { "code": "activation_failed", "message": "The credentials provided were not accepted by the institution.", "request_id": "3e7b283c6efa449c9c028a16b5c249gg" } ] ``` **Causa** Este error ocurre cuando Belvo no pudo activar automáticamente el acceso a la banca por internet para el usuario debido a información faltante (por ejemplo, el 🇲🇽 CVV o 🇲🇽 NIP faltaban o se proporcionaron incorrectamente). **Solución** Pide al usuario que primero active su acceso a la banca por internet (ya sea contactando directamente al banco o intentando iniciar sesión en su cuenta de banca por internet) y luego pídeles que conecten su cuenta nuevamente. ## 400 already_exists | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregación | N/A | N/A | | Enriquecimiento | N/A | N/A | | Iniciación de Pagos | Solicitud | No | ```json Already Exists Example [ { "field": "details", "request_id": "a0c3b0e58e58409d9b1d49de9be35a3d", "pix_key": { "value": { "message": "This `pix_key__value` already exists. It is linked to BankAccount: d5c8cb5f-7845-4a23-a1fa-76c7ae7e5e36", "code": "already_exists" } } } ] ``` **Causa** Estás intentando registrar una cuenta bancaria proporcionando un valor que ya está vinculado a una cuenta bancaria registrada en Belvo. Esto podría incluir: - El identificador de la clave PIX de la cuenta bancaria - El número de cuenta bancaria ```json Bank Account Error Example { "institution": "f512d996-583a-4a91-8b5b-eba2e103b068", "holder": { "type": "BUSINESS", "information": { "identifier_type": "CNPJ", "name": "Caetano Veloso Entertainment Universe", "identifier": "231.002.990-00" } }, "details": { "country": "BRA", "account_type": "CHECKINGS", "agency": "0444", "number": "45722-01" // Número de cuenta ya registrado en Belvo. } } ``` **Solución** Haz una solicitud para obtener todas las cuentas bancarias para recibir una lista de todas las cuentas bancarias que has registrado, filtrando los resultados por los últimos cuatro dígitos de la cuenta bancaria para obtener los detalles. ## 400 en blanco | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | No | | Enrichment | Request | No | | Payment Initiation | Request | No | ```json Blank Error Example [ { "field": "institution", "request_id": "b9abda13c9afbbc64a265c6d4f937d06", "message": "This field may not be blank.", "code": "null" } ] ``` **Causa** Enviaste una solicitud con una cadena vacía para un campo requerido. Por ejemplo: ```json Blank Field Request Example { "institution": "", // Este campo es requerido y no puede ser una cadena vacía. "username": "bnk100", "password": "full", } ``` **Solución** - Revisa el mensaje de error para ver qué campo necesitas proporcionar. Si no estás seguro de qué información proporcionar o el formato, simplemente revisa nuestra documentación de referencia de la API. ## 400 cancellation_error | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Payment Initiation | Request | No | Ejemplo de Error de Payment Intent No Programado ```json [ { "request_id": "b9abda13c9afbbc64a265c6d4f937d06", "message": "Payment Intent cannot be canceled because it is not SCHEDULED", "code": "cancellation_error" } ] ``` Ejemplo de Error de Tiempo de Corte de Payment Intent Pasado ```json [ { "request_id": "b9abda13c9afbbc64a265c6d4f937d06", "message": "Payment Intent cannot be canceled as the cutoff time (23:59:00) has passed.", "code": "cancellation_error" } ] ``` **Causa** Este error puede ocurrir cuando: - Intentaste cancelar un payment intent que no estaba programado. - Enviaste tu solicitud de cancelación después de las 23:59:00 (GMT-3) del día anterior a la fecha de liquidación programada. ## 400 does_not_exist | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | No | | Enrichment | Request | No | ```json Does Not Exist Example [ { "field": "institution", "request_id": "744da6621cb09b3cbb8271d89fe09060", "message": "Object with name=narnia does not exist.", "code": "does_not_exist" } ] ``` **Causa** Enviaste una solicitud donde proporcionaste un valor que no existe en la base de datos de Belvo. Por ejemplo: ```json Request with Non-Existent Institution Example { "institution": "narnia", // Esta institución no existe en la base de datos de Belvo. "username": "bnk100", "password": "full" } ``` **Solución** Revisa el mensaje de error para ver en qué campo proporcionaste un valor incorrecto. Luego: - Asegúrate de que no hayas cometido errores tipográficos. - Verifica si el valor que estás proporcionando debería estar presente en nuestra base de datos (por ejemplo, si haces una solicitud para un enlace que aún no fue registrado, recibirás un error). ## 400 duplicado | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | Sí | | Enrichment | Request | No | ```json Duplicated Link Example [ { "request_id": "744da6621cb09b3cbb8271d89fe09060", "message": "Link already exists", "code": "duplicated", "institution_user_id": "4jlgn6vL7yifxMlhwFwTjbbzYxYoEEkJqK_CJhhZetI=" } ] ``` **Causa** Este error puede ocurrir cuando: - Intentaste crear un link que ya ha sido asociado con tu cuenta. - Tu usuario intentó crear un link con una cuenta que ya han conectado. **Solución** Puedes: - Consultar tu base de datos para encontrar el `institution_user_id` y verificar si el link asociado `id` sigue siendo válido usando la solicitud Obtener los detalles de un link. Si el `status` no es `valid`, entonces solicita a tu usuario que actualice sus credenciales usando el Belvo widget en modo de actualización. - Consultar tu base de datos para encontrar el `institution_user_id` y usar el link asociado `id` para eliminar el link de la base de datos de Belvo usando la solicitud Eliminar un link. Una vez que hayas eliminado el link, puedes pedir a tu usuario que conecte su cuenta nuevamente. ## 400 null | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | No | | Enrichment | Request | No | ```json Null Field Example [ { "field": "institution", "request_id": "b9abda13c9afbbc64a265c6d4f937d06", "message": "This field may not be null.", "code": "null" } ] ``` **Causa** Hiciste una solicitud sin proporcionar datos en un campo requerido. Por ejemplo: ```json Null Field Request Example { "institution": , // Este campo es requerido. "username": "bnk100", "password": "full", } ``` **Solución** Revisa el mensaje de error para ver qué campo necesitas proporcionar. Si no estás seguro de qué información proporcionar o el formato, simplemente revisa nuestra documentación de referencia de la API. ## 400 requerido | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | No | | Enrichment | Request | No | | Payment Initiation | Request | No | ```json Required Field Example [ { "field": "username", "request_id": "b9abda13c9afbbc64a265c6d4f937d06", "message": "Este campo es requerido.", "code": "required" } ] ``` **Causa** Enviaste una solicitud sin un campo requerido. Por ejemplo: ```json Required Field Request Example { "institution": "erebor_mx_retails", "password": "full" // Cuando estás registrando un nuevo enlace, debes proporcionar un username. } ``` **Solución** - Revisa el mensaje de error para ver qué campo necesitas proporcionar. Si no estás seguro de qué información proporcionar o el formato, simplemente revisa nuestra documentación de referencia de la API. ## 400 institution_down | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Institution | Sí | | Enrichment | Institution | Sí | | Payment Initiation | N/A | N/A | ```json Institution Down Example [ { "code": "institution_down", "message": "The financial institution is down, try again later", "request_id": "3e7b283c6efa449c9c028a16b5c249fd" } ] ``` **Causa** Este error ocurre cuando el sitio web de la institución a la que estás intentando acceder está caído debido a mantenimiento u otros problemas, lo que significa que Belvo no puede crear nuevos enlaces o recuperar nuevos datos. **Solución** Puedes intentar acceder a la institución más tarde. Asegúrate de suscribirte a nuestra Página de Estado de Instituciones para saber tan pronto como una institución no esté disponible. Puedes eliminar una institución que actualmente no está disponible utilizando el parámetro `institutions` en la configuración de inicio y omitiendo la institución de la lista. **Mensaje de error del widget** | Idioma | Título del error | Descripción del error | | --- | --- | --- | | 🇬🇧 Inglés | Something went wrong | The institution you tried to access is temporarily unavailable. Please come back in a bit and we will be able to process your request | | 🇧🇷 Portugués | Ocorreu um erro | Esta instituição está temporariamente inacessível. Tente novamente mais tarde e poderemos processar sua solicitação | | 🇪🇸 Español | Ha habido un error | Esta institución está temporalmente inaccesible. Por favor, inténtalo de nuevo más tarde y podremos procesar tu petición | ## 400 institution_inactive | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Institution | Sí | | Enrichment | Institution | Sí | | Payment Initiation | N/A | N/A | ```json Institution Inactive Example [ { "code": "institution_inactive", "message": "The institution has been temporarily deactivated", "request_id": "3e7b283c6efa449c9c028a16b5c249fd" } ] ``` **Causa** Este error ocurre cuando nosotros (Belvo) hemos desactivado la institución en nuestra API. **Solución** Puedes intentar nuevamente más tarde, una vez que Belvo haya reactivado la institución. ## 400 institution_unavailable | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Institution | Sí | | Enrichment | Institution | Sí | | Payment Initiation | N/A | N/A | ```json Institution Unavailable Example [ { "code": "institution_unavailable", "message": "The financial institution is unavailable", "request_id": "3e7b283c6efa449c9c028a16b5c249fd" } ] ``` **Causa** Este error ocurre cuando el sitio web de la institución a la que estás intentando acceder está inactivo debido a mantenimiento u otros problemas, lo que significa que Belvo no puede crear nuevos enlaces o recuperar nuevos datos. **Solución** Puedes intentar acceder a la institución más tarde. Asegúrate de suscribirte a nuestra Página de Estado de Instituciones para saber tan pronto como una institución no esté disponible. Puedes eliminar una institución que actualmente no está disponible utilizando el parámetro `institutions` en la configuración de inicio y omitiendo la institución de la lista. **Mensaje de error del widget** | Idioma | Título del error | Descripción del error | | --- | --- | --- | | 🇬🇧 Inglés | Something went wrong | The institution you tried to access is temporarily unavailable. Please come back in a bit and we will be able to process your request. | | 🇧🇷 Portugués | Ocorreu um erro | O serviço está temporariamente inacessível. Tente novamente mais tarde e poderemos processar sua solicitação | | 🇪🇸 Español | Ha habido un error | Esta institución está temporalmente inaccesible. Por favor, inténtalo de nuevo más tarde y podremos procesar tu petición | ## 400 inválido | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | No | | Enrichment | Request | No | | Payment Initiation | Request | No | Ejemplo de Formato de Fecha Incorrecto ```json Ejemplo de Formato de Fecha Incorrecto [ { "field": "date_to", "request_id": "a7ad9a4ad8b13f8f800f8f5b69c7856f", "message": "La fecha tiene un formato incorrecto. Usa uno de estos formatos en su lugar: YYYY-MM-DD.", "code": "invalid" } ] ``` Ejemplo de Formato de UUID Incorrecto ```json Ejemplo de Formato de UUID Incorrecto [ { "field": "link", "request_id": "448f2b58fc88b2c5a9db6c9175494950", "message": "YTZjMDA3YjktZTk5Yy00MDczLTgzNGItOGM3NzA1MTMyZGU3 no es un UUID válido.", "code": "invalid" } ] ``` Ejemplo de Recursos de Obtención Incorrectos ```json Ejemplo de Recursos de Obtención Incorrectos [ { "field": "resources", "request_id": "a7ad9a4ad8b13f8f800f8f5b69c7856f", "message": "La institución solo admite los siguientes recursos: {1}, {2}", "code": "invalid" } ] ``` **Causa** Enviaste una solicitud donde proporcionaste un valor en un formato inválido. Esto podría incluir: - El formato de las credenciales de inicio de sesión es incorrecto. - El formato de la fecha es incorrecto. - El UUID no es válido. - El terminal_id no es válido. - El form_id no es válido. - Los recursos que has incluido en `fetch_resources` no son compatibles con la institución. Por ejemplo: Ejemplo de Solicitud con Formato de Fecha Incorrecto ```json Ejemplo de Formato de Fecha Incorrecto { "link": "a6c007b9-e99c-4073-834b-8c7705132de7", "date_from": "2020-01-01", "date_to": "2020-02" // Aquí, el formato de la fecha debe ser YYYY-MM-DD } ``` Ejemplo de Solicitud con Formato de UUID Incorrecto ```json Ejemplo de Formato de UUID Incorrecto { "link": "a6c007b9-e99c" // Aquí, el ID del link no es un UUID válido. } ``` **Solución** Revisa el mensaje de error para ver qué campo es inválido y por qué. Luego, si necesitas más información, consulta nuestra documentación de la API para saber cuál es el formato válido para el campo. ## 400 invalid_choice | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | No | | Enrichment | Request | No | ```json Invalid Choice Example [ { "field": "access_mode", "request_id": "ce49b6af6710bb0c7a2a456c223dde21", "message": "\"Dominik\" is not a valid choice.", "code": "invalid_choice" } ] ``` **Causa** Hiciste una solicitud en la que en uno de los campos proporcionaste un valor que no era válido (por ejemplo, puede que solo acepte ciertas cadenas, similar a un enum). Por ejemplo: ```json Invalid Choice Request Example { "institution": "erebor_mx_retail", "username": "bnk100", "password": "full", "access_mode": "Australia" // Este no es un valor válido, ya que en la documentación se indica que es un enum: single o recurrent } ``` **Solución** - Revisa el mensaje de error para ver en qué campo proporcionaste un valor incorrecto. Luego consulta nuestra documentación para ver qué valor deberías proporcionar para este campo. ## 400 invalid_credentials_storage | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | No | | Enrichment | Request | No | ```json Invalid Credentials Storage Example [ { "request_id": "ce49b6af6710bb0c7a2a456c223dde21", "message": "Recurrent links must store the credentials", "code": "invalid_credentials_storage" } ] ``` **Causa** Hiciste una solicitud donde para un enlace recurrente configuraste el parámetro `credentials_storage` a `nostore` o a un rango de fechas entre `1d` a `365d`. ```json Invalid Credentials Storage Request Example { "institution": "tatooine_mx_fiscal", "username": "PFIS010101000", "password": "individual", "access_mode": "recurrent", "credentials_storage": "nostore" // Para enlaces recurrentes, esto debe configurarse para almacenar } ``` **Solución** - Si deseas crear un enlace recurrente, cambia el valor de `credentials_storage` a `store`. - Si deseas crear un enlace único y no almacenar credenciales, cambia el `access_mode` a `single`. ## 400 invalid_fetch_resources | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | No | | Enrichment | Request | No | ```json Invalid Fetch Resources Example [ { "request_id": "ce49b6af6710bb0c7a2a456c223dde21", "message": "Single links without stored credentials must fetch resources", "code": "invalid_fetch_resources" } ] ``` **Causa** Intentaste crear un enlace donde configuraste el parámetro `credentials_storage` a `nostore` y no pasaste ningún recurso en el parámetro `fetch_resources`. Para enlaces donde no almacenamos credenciales, debes pasar al menos un recurso en `fetch_resources`. ```json Invalid Fetch Resources Request Example { "institution": "tatooine_mx_fiscal", "username": "PFIS010101000", "password": "individual", "access_mode": "recurrent", "credentials_storage": "nostore", "fetch_resources": [] } ``` **Solución** Enumera los recursos que deseas recuperar en el parámetro `fetch_resources`. Por ejemplo: `"fetch_resources": ["ACCOUNTS", "OWNERS", "TRANSACTIONS"]` . ## 400 invalid_link | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregación | Link | No | | Enriquecimiento | Link | No | | Iniciación de Pago | N/A | N/A | ```json Invalid Link Example [ { "code": "invalid_link", "message": "The link has been invalidated. You may need to update link credentials", "request_id": "9b7b283c6efa449c9c028a16b5c249fd" } ] ``` **Causa** Este error ocurre cuando intentas acceder a una cuenta pero las credenciales del usuario ya no son válidas, lo que provoca un error por parte de la institución. El estado de un Link cambia de `valid` a `invalid` después de seis solicitudes POST fallidas **Solución** Pide a tu usuario que proporcione sus credenciales actualizadas. Para facilitar las cosas, te recomendamos encarecidamente que uses nuestro Widget en Modo de Actualización. ## 400 invalid_period | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Belvo | No | | Enrichment | Belvo | No | | Payment Initiation | N/A | N/A | ```json Invalid Period Example [ { "message": "The number of days between date_from and date_to must be at least 90 days", "code": "invalid_period", "request_id": "a66a4fdae4ab8cfc1ed9ee9246aa6890" } ] ``` **Causa** Este error ocurre cuando solicitas ingresos para un enlace dentro de un rango de fechas dado, sin embargo, el período entre `date_from` y `date_to` es menor a 90 días. **Solución** Asegúrate de que el período entre `date_from` y `date_to` sea igual o mayor a 90 días. ## 400 login_error Actualmente estamos refinando nuestros mensajes de `login_error` para proporcionar una mayor granularidad y mejorar la resolución de problemas. | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Link | Sí | | Enrichment | Link | Sí | ```json Ejemplo de Error de Inicio de Sesión [ { "code": "login_error", "message": "Invalid credentials provided to login to the institution.", "request_id": "3e7b283c6efa449c9c028a16b5c249fd" } ] ``` **Causa** Este error puede ocurrir cuando: - las credenciales que tu usuario proporciona son incorrectas o faltan. - el token MFA que tu usuario proporciona no es compatible con Belvo. - hay un problema con la institución que impide los inicios de sesión. - la cuenta del usuario está bloqueada o el usuario no tiene permiso para acceder a su banca por internet. A continuación se muestra una lista de posibles `message`s de error que puedes recibir: - Invalid credentials provided to login to the institution. - A MFA token is required by the institution, but it’s not supported yet by Belvo. - Impossible to login, something unexpected happened while logging into the institution. Try again later. - Login not attempted due to invalid credentials. - Missing credentials to login to the institution. - The user account access was forbidden by the institution. - The user account is locked, user needs to contact the institution to unlock it. **Solución** - Pide a tu usuario que proporcione sus credenciales correctas o el token MFA. Usa nuestro widget para hacerlo aún más fácil (nosotros hacemos todo el trabajo pesado por ti). - Pide a tu usuario que confirme con su banco que su cuenta está activa y que no está bloqueada. - Si hay un problema con la institución, intenta iniciar sesión más tarde. ## 400 max_digits | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | N/A | N/A | | Enrichment | N/A | N/A | | Payment Initiation | Request | No | ```json Wrong Amount Format Example [ { "field": "amount", "request_id": "a0c3b0e58e58409d9b1d49de9be35a3d", "message": "Ensure that there are no more than 12 digits in total.", "code": "max_digits" } ] ``` **Causa** Enviaste una solicitud con el formato de cantidad incorrecto. **Solución** Revisa el mensaje de error para ver por qué el formato de la cantidad es inválido. Si no estás seguro de qué información proporcionar o el formato, simplemente consulta nuestra documentación de referencia de la API para saber cuál es el formato válido para el campo. ## 400 max_decimal_places | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregación | N/A | N/A | | Enriquecimiento | N/A | N/A | | Iniciación de Pago | Solicitud | No | ```json Ejemplo de Demasiados Decimales [ { "field": "amount", "request_id": "a0c3b0e58e58409d9b1d49de9be35a3d", "message": "Asegúrate de que no haya más de 2 decimales.", "code": "max_decimal_places" } ] ``` **Causa** Enviaste una solicitud con el formato de cantidad incorrecto (demasiados decimales). **Solución** Revisa el mensaje de error para ver por qué el formato de la cantidad es inválido. Si no estás seguro de qué información proporcionar o el formato, simplemente revisa nuestra documentación de referencia de la API para saber cuál es el formato válido para el campo. ## 400 min_value | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | N/A | N/A | | Enrichment | N/A | N/A | | Payment Initiation | Request | No | ```json Minimum Amount Value Example [ { "field": "amount", "request_id": "a0c3b0e58e58409d9b1d49de9be35a3d", "message": "Ensure this value is greater than or equal to 0.01.", "code": "min_value" } ] ``` **Causa** Enviaste una solicitud con el formato de cantidad incorrecto (la cantidad es menor que el valor mínimo permitido). **Solución** Revisa el mensaje de error para ver por qué el formato de la cantidad es inválido. Si no estás seguro de qué información proporcionar o el formato, simplemente revisa nuestra documentación de referencia de la API para saber cuál es el formato válido para el campo. ## 400 not_a_list | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Solicitud | No | | Enrichment | Solicitud | No | | Payment Initiation | Solicitud | No | ```json Not a List Example [ { "message": "Expected a list but got type \"str\".", "code": "not_a_list", "request_id": "d5af76cc66e0231e2be7f7be5c41170a" } ] ``` **Causa** Enviaste una solicitud donde en lugar de enviar un array de datos, enviaste solo una lista. Por ejemplo: Ejemplo Incorrecto ```json Ejemplo Incorrecto { "fetch_resources": "ACCOUNTS,OWNERS" // Aquí, fetch_resources tiene que ser un array de valores } ``` Ejemplo Correcto ```json Ejemplo Correcto { "fetch_resources": ["ACCOUNTS", "OWNERS"] } ``` **Solución** Revisa tu solicitud JSON y consulta nuestra documentación para ver qué campo debería ser un array. ## 400 parse_error | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | No | | Enrichment | Request | No | | Payment Initiation | Request | No | ```json Parse Error Example [ { "message": "JSON parse error - Expecting property name enclosed in double quotes: line 3 column 1 (char 54)", "code": "parse_error", "request_id": "d5af76cc66e0231e2be7f7be5c41170a" } ] ``` **Causa** Enviaste una solicitud con JSON inválido. Por ejemplo: ```json Parse Error Request Example { "link": "a6c007b9-e99c-4073-834b-8c7705132de7", // Aquí, el JSON no es válido porque tiene una coma al final } ``` **Solución** Revisa el payload JSON (quizás solo te falta una coma o una comilla) e inténtalo de nuevo. ## 400 session_expired | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | Sí | | Enrichment | Request | Sí | ```json Session Expired Example [ { "code": "session_expired", "message": "The session you are trying to resume has expired, please start again from register/retrieve endpoint", "request_id": "6e7b283c6efa449c9c028a16b5c249fa" } ] ``` **Causa** Este error ocurre cuando intentas reanudar una sesión de solicitud que ya ha expirado. Esto generalmente se debe a que el usuario tardó demasiado en proporcionar su token de autenticación. > Para las solicitudes que requieren un token, hay un período de tiempo en el que el usuario puede proporcionar su token. El período varía de una institución a otra. Puedes verificar cuánto tiempo tiene el usuario para ingresar su token utilizando el parámetro `expiry` en la respuesta 428 `token_required`. **Solución** Desafortunadamente, necesitarás comenzar todo el proceso de inicio de sesión con tu usuario nuevamente. **Mensaje de error del widget** | Idioma | Título del error | Descripción del error | | --- | --- | --- | | 🇬🇧 Inglés | Please try again! | Please try again to link your account as the session with this institution just expired | | 🇧🇷 Portugués | Por favor, faça login novamente | A sessão com essa instituição expirou. Por favor, digite suas credenciais novamente | | 🇪🇸 Español | Por favor, ingresa de nuevo | Por favor, ingresa de nuevo tus credenciales ya que la sesión con esta institución ha expirado | ## 400 session_expired_ob | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | Sí | ```json Session Expired OB Example [ { "code": "session_expired_ob", "request_id": "6e7b283c6efa449c9c028a16b5c249fa" } ] ``` **Causa** Puedes recibir este error por las siguientes razones: 1. El `access_token` que generaste no se utilizó dentro del período de expiración de 10 minutos. 2. En lugar de generar un nuevo `access_token` para el widget para el usuario dado, utilizaste un `access_token` generado para otro usuario que ya creó un enlace usando el widget. 3. Tu usuario no hizo clic en el botón **Ir para a instituição** (Ir a la institución) en el widget dentro de los 60 segundos de aparecer la pantalla. **Solución** Desafortunadamente, necesitarás iniciar el proceso del widget con tu usuario nuevamente. Por favor asegúrate de que: 1. Asegúrate de usar el `access_token` para generar el widget tan pronto como se cree. Si pasan 10 minutos o más, necesitarás crear un nuevo `access_token`. 2. Asegúrate de crear siempre un nuevo `access_token` para cada usuario. 3. Nuestro equipo de UX está mejorando el flujo para incitar al usuario a continuar el flujo dentro de los 60 segundos asignados. **Mensaje de error del widget** | Idioma | Título del error | Descripción del error | | --- | --- | --- | | 🇬🇧 Inglés | Session expired | Your connection session expired, please refresh the page to try again to link your account | | 🇧🇷 Portugués | Sessão expirada | Sua sessão expirou, atualize a página e tente vincular sua conta novamente. | ## 400 too_many_sessions | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Link | Sí | | Enrichment | Link | Sí | | Payment Initiation | Link | Sí | ```json Too Many Sessions Example [ { "code": "too_many_sessions", "message": "Impossible to login, a session is already opened with the institution for these credentials", "request_id": "3e7b283c6efa449c9c028a16b5c249fd" } ] ``` **Causa** Este error ocurre cuando: - un usuario está intentando iniciar sesión en su institución a través de Belvo mientras ya está conectado a su institución en un navegador web o aplicación móvil. - realizas una solicitud de información mientras Belvo está extrayendo datos de la institución para ese usuario. **Solución** Intenta: - Informar a tu usuario que cierre sus sesiones web y de aplicaciones para la institución dada. - Esperar 120 segundos y volver a intentar tu solicitud, asegurándote de que Belvo haya terminado el proceso de extracción de datos. **Mensaje de error del widget** | Idioma | Título del error | Descripción del error | | --- | --- | --- | | 🇬🇧 Inglés | A session is already open | It seems you are logged in to your account with another device. This institution only allows one logged in session at a time. Log out and try linking your account again. | | 🇧🇷 Portugués | Muitas sessões abertas | Parece que já existe uma sessão aberta nesta instituição com seu usuário. Esta instituição permite apenas uma sessão aberta por vez | | 🇪🇸 Español | Demasiadas sesiones abiertas | Parece que ya hay una sesión abierta en esta institución con tu usuario. Esta institución solo permite una sesión abierta a la vez. | ## 400 unavailable_data | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | No | | Enrichment | N/A | No | | Payment Initiation | N/A | N/A | ```json Unavailable Data Example [ { "message": "The institution did not return any data for the request.", "code": "unavailable_data", "request_id": "c76f4d0320b923eb3068f5e2c0fab18f" } ] ``` **Causa** Este error ocurre cuando tu solicitud fue correctamente formada y enviada, sin embargo, la institución no devolvió ningún dato para tu solicitud. **Solución** Recomendamos primero verificar nuestra Página de Estado de Instituciones para ver si hay algún incidente con la institución que esté prohibiendo la extracción de datos. Si no hay incidentes activos para la institución, puedes reintentar la solicitud. Si sigues recibiendo este error, contacta a nuestro equipo de soporte, asegurándote de incluir el `request_id` que recibes en el mensaje. ## 400 unconfirmed_link | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Link | No | | Enrichment | Link | No | | Payment Initiation | N/A | N/A | ```json Unconfirmed Link Example [ { "message": "The link creation has not been completed yet", "code": "unconfirmed_link", "request_id": "c76f4d0320b923eb3068f5e2c0fab18f" } ] ``` **Causa** Este error ocurre cuando intentas acceder a un link que fue pausado previamente (y como tal no está activo ahora). El estado de un Link se establece en `unconfirmed_link` cuando tu usuario no ha completado el proceso de creación del Link exitosamente (por ejemplo, podrían no proporcionar un token MFA válido) **Solución** Pide a tu usuario que proporcione un token MFA a través de nuestro widget en modo de actualización para completar un primer inicio de sesión. Después de que el usuario complete el proceso exitosamente, podrás recuperar datos. ## 400 unsupported_operation | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Belvo | No | | Enrichment | Belvo | No | | Payment Initiation | N/A | N/A | Ejemplo de Error de Recurso No Soportado ```json Ejemplo de Recurso No Soportado [ { "message": "El recurso al que intentas acceder no es soportado por esta institución", "code": "unsupported_operation", "request_id": "a66a4fdae4ab8cfc1ed9ee9246aa6890" } ] ``` Ejemplo de Error de Fetch Historical ```json Ejemplo de Error de Fetch Historical [ { "message": "Para enlaces individuales, debes establecer fetch_historical a true cuando uses el parámetro de solicitud de recursos.", "code": "unsupported_operation", "request_id": "a66a4fdae4ab8cfc1ed9ee9246aa6890" } ] ``` **Causa** Este error ocurre cuando: - Intentas acceder a alguna operación de datos que Belvo no soporta para una institución. Por ejemplo, intentar acceder al recurso **Transactions** para instituciones fiscales. - Realizas una solicitud que requiere que se complete alguna lógica de negocio. Por ejemplo, al usar el parámetro `fetch_resources` en la creación de un enlace individual, también debes establecer `fetch_historical` a true **Solución** Asegúrate de que: - La operación de recurso (por ejemplo, solicitar Transactions) es soportada para esa institución. - Tu solicitud cumple con toda la lógica de negocio requerida. **Mensaje de error del widget** | Idioma | Título del error | Descripción del error | | --- | --- | --- | | 🇬🇧 Inglés | Something went wrong | There was an error with your request. Please try again, and if the problem persists, we will try to fix it as soon as possible | | 🇧🇷 Portugués | Ocorreu um erro | Ocorreu um erro com a sua solicitação. Tente novamente e, se o problema persistir, o corrigiremos o mais breve possível | | 🇪🇸 Español | Ha habido un error | Hemos tenido un error con tu petición. Por favor, inténtalo de nuevo y si el problema persiste, lo arreglaremos lo más pronto posible | ## 400 validation_error | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Request | No | | Enrichment | Request | No | | Payment Initiation | N/A | N/A | ```json Validation Error Example [ { "message": "Bad request", "code": "validation_error", "request_id": "e912d014d7976c3172bb8e65c7a22194" } ] ``` **Causa** Enviaste una solicitud donde: - Las credenciales proporcionadas no coincidieron con los campos esperados, lo que llevó a un error de validación de campos por parte de la institución. Por ejemplo: ```json Validation Error Request Example { "link": "a6c007b9-e99c-4073-834b-8c7705132de7", "date_from": "2020-01-01", "date_to": "2021-03-30" // Entre date_from y date_to hay más de 365 días } ``` **Solución** Obtén los detalles de la institución usando nuestro endpoint de Instituciones y revisa el objeto `form_fields` para obtener información sobre qué campos deben proporcionarse y su formato. ## 401 authentication_failed | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Belvo | No | | Enrichment | Belvo | No | | Payment Initiation | N/A | N/A | ```json Authentication Failed Example [ { "message": "Invalid Secret Keys", "code": "authentication_failed", "request_id": "5c09677ecf78e1d4501547252a0c4e77" } ] ``` **Causa** Este error ocurre cuando intentas hacer una llamada a la API usando credenciales incorrectas de la API de Belvo (ya sea tu clave secreta o contraseña secreta, o ambas, son incorrectas). **Solución** Verifica las credenciales que estás usando comparándolas con las de tu panel de control. Quizás estás usando tus credenciales de sandbox para acceder a datos de producción (o viceversa). Nota: Si no estás seguro sobre tu secretPassword, revisa el correo de confirmación que recibiste de Belvo. ## 401 consent_without_accounts | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Belvo | No | | Enrichment | N/A | N/A | | Payment Initiation | N/A | N/A | ```json Consent Without Accounts Example [ { "message": "Information cannot be retrieved as the consent has no associated accounts", "code": "consent_without_accounts", "request_id": "5c09677ecf78e1d4501547252a0c4e77" } ] ``` **Causa** Este error ocurre cuando el usuario ha eliminado cuentas asociadas con el consentimiento que proporcionaron. Por ejemplo, cuando el usuario generó su consentimiento por primera vez, tenía una cuenta corriente y una cuenta de préstamo en la institución, pero ha cerrado esas cuentas desde entonces. **Solución** Comuníquese con su usuario para confirmar si ha eliminado su cuenta y pídale que genere un nuevo consentimiento en su institución actual. ## 403 access_to_production_denied | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Belvo | No | | Enrichment | Belvo | No | | Payment Initiation | Belvo | No | ```json Access to Production Denied Example [ { "message": "You don’t have access to production API.", "code": "access_to_production_denied", "request_id": "d5af76cc66e0231e2be7f7be5c41170a" } ] ``` **Causa** Este error ocurre cuando intentas acceder al entorno de producción de Belvo sin los permisos correctos. **Solución** Contacta a nuestro equipo de ventas para solicitar acceso al entorno de producción. ## 403 access_to_resource_denied | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Belvo | No | | Enrichment | Belvo | No | | Payment Initiation | N/A | N/A | ```json Access to Resource Denied Example [ { "message": "You don't have access to this resource.", "code": "access_to_resource_denied", "request_id": "d5af76cc66e0231e2be7f7be5c41170a" } ] ``` **Causa** Este error ocurre cuando intentas acceder a un recurso de Belvo sin los permisos correctos. **Solución** Contacta a nuestro equipo de ventas para solicitar acceso a este recurso. ## 403 Prohibido | API | Tipo de error | ¿Reflejado en el widget? | | --- | --- | --- | | Aggregation | Belvo | No | | Enrichment | Belvo | No | ```html