Errores generales de uso (#1)
Errores de límite de tasa (#2)
Errores de trading (colocación/cancelación de órdenes) (#3)
Errores del estado de servicio (#4)
Errores internos (#5)
Errores de CloudFlare (red) (#6)
Introducción
La mayoría de las solicitudes API se completan correctamente, pero, en ocasiones, no se obtiene la respuesta esperada y se devuelve un mensaje de error.
Nuestra API facilita una variedad de mensajes de error descriptivos destinados a proporcionar el motivo del error, así como sugerencias para dar con la solución adecuada.
Los mensajes de error de la API se pueden dividir en varios grupos diferentes (en función del tipo de error, la causa subyacente y la solución óptima). Sin embargo, el formato de los mensajes de error de la API es siempre el mismo:
"Nivel de gravedad""Categoría del error":"Mensaje de error"
El "Nivel de gravedad" puede ser "E", si se trata de un error, o "W", en caso de una advertencia. La categoría de error puede ser "General", "API", "Query" (consulta), "Order" (orden), "Trade" (operación), "Funding" (financiación) o "Service" (servicio). El "Mensaje de error" puede ser cualquier cadena de texto que describa el motivo del error (como "Invalid arguments" [argumentos no válidos]).
Por ejemplo, un error que indica que se ha utilizado un par de divisas no válido en una consulta de ticker sería el siguiente:
EQuery:Unknown asset pair
Tenga en cuenta que algunos software de terceros (aplicaciones móviles, bots de trading, etc.) optan por ocultar el error de API original y, en su lugar, muestran un error personalizado, por lo que es posible que se le muestre un formato de error o contenido alternativo en función del software que se utilice.
Errores generales de uso
EGeneral:Permission denied Los errores de permiso denegado se devuelven cuando el cliente de API está intentando realizar una tarea para la cual la clave de API no tiene permiso. Por ejemplo, si un cliente de API intenta recuperar el saldo de una cuenta con una clave de API configurada para permitir el acceso de trading, pero no el acceso de gestión de cuentas, se devolverá el error de permiso denegado. Puede revisar sus claves de API y su configuración (como, por ejemplo, sus permisos) desde el apartado de configuración, en la pestaña de API de gestión de cuentas. Debe asegurarse de que las claves API que utilizan las aplicaciones de terceros tienen todos los ajustes y permisos necesarios. EAPI:Invalid key Este error se devuelve cuando la clave API utilizada para la llamada ha caducado o está desactivada. Revise la clave API en la pestaña API de la configuración de la gestión de cuentas o genere una nueva y actualice la aplicación. EQuery:Unknown asset pair Puede obtener la lista completa de nuestros pares de activos de la llamada pública AssetPairs y buscar el nombre del par como entrada de encabezados Json o por el parámetro "altname": https://api.kraken.com/0/public/AssetPairs (https://api.kraken.com/0/public/AssetPairs) EGeneral:Invalid arguments Este error se devuelve cuando se llama a un método sin los parámetros necesarios. Por ejemplo, si se llama el método QueryOrders sin especificar un parámetro de Id. de transacción válido (txid), se devolverá el error de argumentos no válidos. Si se llama un método con parámetros innecesarios, no se devolvería el error de argumentos no válidos porque los parámetros innecesarios simplemente se ignorarían. EAPI:Invalid signature Los errores de firma no válida se producen si la clave API o el secreto de API se escriben incorrectamente en el programa o si los datos POST utilizados en la autenticación y los datos POST enviados a la API no coinciden.
Como referencia adicional, a continuación se muestra un ejemplo en código Python para implementar el algoritmo de firma API. La clave pública de API adecuada se debe copiar y pegar desde la gestión de cuentas, y el método API y los datos POST se deben actualizar de forma apropiada. El valor de salida se puede utilizar directamente como valor para el encabezado HTTP de firma API.
#!/usr/bin/env python# Import required Python librariesimport timeimport base64import hashlibimport hmac# Decode API private key from base64 format displayed in account managementapi_secret = base64.b64decode("nmlrD83t1J+yVWKUBx9vD6j26C5zhC11tFfXpN+Ww+8oOVuGgse5AeADcvl95jYaD+UAi3D5CrVfFr8GfQ7zhA==")# Variables (API method, nonce, and POST data)api_path = "/0/private/TradeBalance"api_nonce = str(int(time.time()*1000))api_post = "nonce=" + api_nonce + "&asset=xxbt"# Cryptographic hash algorithmsapi_sha256 = hashlib.sha256(api_nonce + api_post).digest()api_hmac = hmac.new(api_secret, api_path + api_sha256, hashlib.sha512)# Encode signature into base64 format used in API-Sign valueapi_signature = base64.b64encode(api_hmac.digest())# API authentication signature for use in API-Sign HTTP headerprint(api_signature)
El SHA256 se calcula utilizando el propio valor nonce y los datos POST para el método API; los datos POST se componen de los pares nombre/valor para el nonce y los parámetros del método API. Un ejemplo de los datos que deben transferirse al SHA256 para el método TradeBalance sería el siguiente:
SHA256 = SHA256 of "1541933977000nonce=1541933977000&asset=xxbt"
El valor de cadena que se transfiere a SHA256 no debe contener ningún valor nulo adicional (\0) y el valor de cadena no debe codificarse como base64 o en hexadecimal (es decir, el valor de cadena debe ser una cadena de texto sin formato).
La ruta URI es la dirección URL completa del método API, excepto el prefijo "https://api.kraken.com (https://api.kraken.com/)", por lo que la ruta URI del método TradeBalance, por ejemplo, sería el valor de cadena "/0/private/TradeBalance" sin ningún valor nulo adicional.
El HMAC SHA512 se calcula utilizando la ruta URI y el hash SHA256 previamente calculado, con la clave privada API descodificada en base64 como clave HMAC. Un ejemplo de los datos que se deben transferir al HMAC sería el siguiente:
HMAC SHA512 con una clave privada descodificada en base64 = HMAC de "/0/private/TradeBalanceSHA256"
Los encabezados HTTP de firma API y clave API son los únicos dos encabezados HTTP personalizados necesarios. El encabezado de clave API es un duplicado exacto de la clave pública API de la gestión de cuentas. El encabezado de firma API es el hash HMAC SHA512 codificado con base64.
EAPI:Invalid nonce Puede encontrar más información sobre este error aquí:
https://support.kraken.com/hc/en-us/articles/360001148063 (https://support.kraken.com/hc/en-us/articles/360001148063)
Asimismo, puede obtener más información sobre Nonce y Nonce Window aquí:
https://support.kraken.com/hc/es/articles/360000906023 (https://support.kraken.com/hc/en-us/articles/360000906023)
https://support.kraken.com/hc/es/articles/360001148023 (https://support.kraken.com/hc/en-us/articles/360001148023)
ESession:Invalid session Los errores de sesión no válidos se devuelven a través de la API de WebSocket (https://docs.kraken.com/websockets/) cuando se produce un intento de suscripción a un feed (privado) autenticado (https://support.kraken.com/hc/en-us/articles/360034664311) mediante un token de autenticación que ya no es válido (que ya ha caducado, por ejemplo).
La solución consiste simplemente en solicitar un nuevo token de autenticación a través del REST API GetWebSocketsToken endpoint (https://docs.kraken.com/rest/#operation/getWebsocketsToken) y utilizar el nuevo token para todas las solicitudes de suscripción autenticadas (privadas) posteriores.
Errores de límite de tasa
EAPI:Rate limit exceeded Ha superado el límite de velocidad de API. (https://support.kraken.com/hc/en-us/articles/206548367) EOrder:Rate limit exceeded Aunque añadir y cancelar órdenes no computan en nuestros límites de contador API estándar, estas operaciones tienen su propio contador para añadir y cancelar órdenes. (https://support.kraken.com/hc/en-us/articles/360045239571) Este contador funciona de forma que, cuanto más tiempo permanezcan las órdenes en el libro de órdenes, más órdenes pueden añadir o cancelar los clientes. EGeneral:Temporary lockout Los mensajes de error de bloqueo temporal pueden devolverse si se han producido demasiadas llamadas API fallidas o demasiados errores nonce no válidos en un breve período de tiempo o firmas no válidas. Aunque estas llamadas devuelven un error, ese error se contempla en los límites de la API y puede resultar en un bloqueo temporal.
La duración aproximada de los bloqueos temporales es de 15 minutos. Después de recibir el error de bloqueo temporal, espere 15 minutos antes de enviar nuevas solicitudes API. Si activa varios errores nonce no válidos, aumente la nonce window, ya que esto puede ayudar a reducir la frecuencia con la que se producen estos errores. Asimismo, intente reducir también la frecuencia de sus llamadas API privadas.
Errores de trading
EOrder:Cannot open position La apertura de nuevas posiciones spot sobre margen se ha suspendido temporalmente por el mantenimiento de los motores de trading. La función se reactivará próximamente. Puede obtener información actualizada al respecto en status.kraken.com.
Otra razón puede ser que las posiciones spot sobre margen no están disponibles actualmente para los clientes que residen en determinados países (https://support.kraken.com/hc/en-us/articles/360001368823).
EOrder:Cannot open opposing position En Kraken, no se puede abrir una posición larga y corta para el mismo par. (https://support.kraken.com/hc/en-us/articles/205367328)
Si desea abrir una posición larga y corta para la misma divisa, elija pares de divisas diferentes con la misma divisa que la moneda cotizada o la moneda base. Ej.: XBT/USD corto, XBT/EUR largo.
EOrder:Margin allowance exceeded Este error se produce cuando se han superado los límites de margen permitidos (https://support.kraken.com/hc/en-us/articles/209238787) para el nivel de verificación actual. Los límites de margen permitidos para cada divisa varían en función del nivel de verificación actual. EOrder:Insufficient margin Disponemos de fondos limitados para la ampliación de márgenes. El mensaje de margen insuficiente ("insufficient margin") indica que por el momento no tenemos fondos en el margin pool aplicable (https://support.kraken.com/hc/en-us/articles/217696017). Esta situación puede cambiar en cualquier momento. Es posible que pueda realizar su orden unos segundos o minutos más tarde, pero las órdenes de gran volumen y aquellas realizadas en épocas de gran volumen pueden tardar más. Le rogamos que acepte nuestras disculpas por cualquier inconveniente que pueda surgir. EOrder:Insufficient funds (insufficient user funds) Usted no dispone de fondos disponibles para realizar esta orden. Revise sus posiciones abiertas y sus órdenes de elementos que puedan estar reteniendo sus fondos. EOrder:Order minimum not met (volume too low) No ha alcanzado el volumen de orden mínimo (https://support.kraken.com/hc/en-us/articles/205893708) para este activo. EOrder:Orders limit exceeded Ha superado el número máximo de órdenes abiertas (https://support.kraken.com/hc/en-us/articles/209090607) disponibles en su cuenta.
Estos límites se basan en su nivel de verificación. Cierre algunas de sus órdenes abiertas o amplíe el nivel de verificación de su cuenta.
EOrder:Positions limit exceeded Ha superado la cantidad máxima de posiciones abiertas (https://support.kraken.com/hc/en-us/articles/209090607) disponibles en su cuenta.
Estos límites se basan en su nivel de verificación. Cierre o liquide una parte o la totalidad de sus posiciones abiertas o amplíe el nivel de verificación de su cuenta, si fuera posible.
Errores del estado de servicio
EService:Unavailable o EService:Busy Los errores de servicio que experimenta deberían ser temporales. Puede que desee volver a enviar sus solicitudes, si no se han enviado. Supervisaremos los problemas y actualizaremos nuestra página: https://status.kraken.com/ (https://status.kraken.com/)
Errores internos
EGeneral:Internal error Cuando nos enfrentamos a problemas de degradación de la API, estos pueden traducirse en problemas tanto para Kraken como para cryptowat.ch en forma de mensajes de servicio no disponible, errores 8xx en cryptowat.ch e interrupciones del sitio. ETrade:Locked Este problema está relacionado con la seguridad de su cuenta, la cual puede haberse visto comprometida. Cambie su contraseña y la autenticación de dos factores y póngase en contacto con nuestro Centro de Atención al cliente. EAPI:Feature disabled Este error se produce cuando un indicador o parámetro de entrada se desactiva temporal o permanentemente. El error debe proceder de una de las entradas aprobadas. Póngase en contacto con nuestro Servicio de Atención al Cliente mediante el envío de un registro con la información completa utilizada para la llamada que generó el error.
Errores de CloudFlare
Códigos de estado HTTP 5xx y 10xx Estos errores 5xx y 10xx no son en realidad errores de API, sino más bien errores del servidor web de CloudFlare. Los errores de API siempre se devuelven en formato JSON, por ejemplo, "error":["ErrorType:ErrorMessage"], por lo que cada vez que se recibe un error en un formato diferente (como un código de estado HTTP de 520, 504, 502, 1020, etc.), la solución provisional es intentar realizar de nuevo la llamada API transcurrido un breve periodo de tiempo para comprobar si se ejecuta.
Un efecto secundario de este problema es que una orden se puede colocar correctamente aunque se devuelva un error 5xx o 10xx en lugar de la respuesta esperada. Esto es posible porque CloudFlare, en ocasiones, experimenta el error después de que se haya realizado la llamada a la API, por lo que la llamada a la API se ha realizado correctamente, pero no se devuelven los resultados a través de CloudFlare.
Una solución a este efecto secundario es utilizar referencias de usuario (el parámetro "userref") para todas las órdenes. Al colocar cada orden con una referencia de usuario única, se puede utilizar el método OpenOrders para confirmar si la orden se ha realizado correctamente o no, de modo que se puede determinar si la orden se debe volver a realizar o no.
Por ejemplo, si una llamada al método AddOrder para una orden límite incluye el parámetro "userref=12345678", una llamada posterior al método OpenOrders que utilice el parámetro userref=12345678 devolverá la información de la orden (incluido el ID de orden) para las órdenes realizadas correctamente, pero no devolverá información de la orden (por ejemplo, solo "result":"open":) para las órdenes no realizadas.