Συνήθεις Αιτίες Σφάλματος Invalid Key

Τελευταία ενημέρωση: 5 Ιουνίου 2025

Για να πραγματοποιηθεί μια επιτυχημένη ιδιωτική κλήση, πρέπει να σταλεί ένα αίτημα HTTP POST στο κατάλληλο endpoint.

Αυτό το αίτημα περιλαμβάνει την κεφαλίδα API-Sign (υπογραφή) η οποία χρησιμοποιεί τα κωδικοποιημένα Post_data ως μέρος του αλγορίθμου κατακερματισμού της.

Εάν υπάρχει ασυμφωνία μεταξύ της υπογραφής που περιλαμβάνεται στην κεφαλίδα και των δεδομένων POST που περιλαμβάνονται στο αίτημα, θα επιστραφεί ένα σφάλμα Invalid API Key.

Παρακάτω είναι ένα παράδειγμα μιας σωστά διατυπωμένης κλήσης στην οποία τα δεδομένα που χρησιμοποιούνται στον Αλγόριθμο Ελέγχου Ταυτότητας ταιριάζουν με αυτά στο σώμα του αιτήματος:

python

Python

#!/usr/bin/env python3

import time
import requests
import urllib.parse
import hashlib
import hmac
import base64

api_key = ''
secret_key = ''
nonce = str(int(1000 * time.time()))

# Define the URI path for the Kraken API request
uri_path = '/0/private/AddOrder'

# API URL
api_url = 'https://api.kraken.com'

# Create a dictionary for the request data
# Note that this is the data that will be used to calculate the Authentication Algorithm (API-Sign).
data = {
    'nonce': nonce,
    'ordertype': 'limit',
    'type': 'buy',
    'volume': '1',
    'pair': 'btcusd',
    'price': '58626.4',
    'validate': True
}

# Encode the data for the request
postdata = urllib.parse.urlencode(data)
encoded = (str(data['nonce']) + postdata).encode()

# Create a message to be signed
message = uri_path.encode() + hashlib.sha256(encoded).digest()

# Create the HMAC signature
mac = hmac.new(base64.b64decode(secret_key), message, hashlib.sha512)
sigdigest = base64.b64encode(mac.digest())

# Create headers for the request
headers = {}
headers['API-Key'] = api_key
headers['API-Sign'] = sigdigest.decode()

# Make the POST request
# Note that the data below is what is sent in the HTTP request.
req = requests.post(api_url + uri_path, headers=headers, data={
    'nonce': nonce,
    'ordertype': 'limit',
    'type': 'buy',
    'volume': '1',
    'pair': 'btcusd',
    'price': '58626.4',
    'validate': True
})

# Print the result
print(req.json())

# Result:
# {'error': [], 'result': {'descr': {'order': 'buy 1.00000000 XBTUSD @ limit 58626.4'}}}

Ωστόσο, όταν το ordertype και το volume ανταλλάσσονται, παράγεται ένα σφάλμα Invalid Key.

python

Python

#!/usr/bin/env python3
import time
import requests
import urllib.parse
import hashlib
import hmac
import base64

api_key = ''
secret_key = ''
nonce = str(int(1000 * time.time()))

# Define the URI path for the Kraken API request
uri_path = '/0/private/AddOrder'

# API URL
api_url = 'https://api.kraken.com'

# Create a dictionary for the request data
data = {
    'nonce': nonce,
    'ordertype': 'limit',
    'type': 'buy',
    'volume': '1',
    'pair': 'btcusd',
    'price': '58626.4',
    'validate': True
}

# Encode the data for the request
postdata = urllib.parse.urlencode(data)
encoded = (str(data['nonce']) + postdata).encode()

# Create a message to be signed
message = uri_path.encode() + hashlib.sha256(encoded).digest()

# Create the HMAC signature
mac = hmac.new(base64.b64decode(secret_key), message, hashlib.sha512)
sigdigest = base64.b64encode(mac.digest())

# Create headers for the request
headers = {}
headers['API-Key'] = api_key
headers['API-Sign'] = sigdigest.decode()

# Make the POST request
req = requests.post(api_url + uri_path, headers=headers, data={
    'nonce': nonce,
    'volume': '1',
    'type': 'buy',
    'ordertype': 'limit',
    'volume': '1',
    'pair': 'btcusd',
    'price': '58626.4',
    'validate': True
})

# Print the result
print(req.json())

# Result:
# {'error': ['EAPI:Invalid key']}

Μια ένδειξη ότι αυτό μπορεί να είναι η αιτία του σφάλματος Invalid Key είναι εάν οι κλήσεις σε endpoints που δεν απαιτούν πολλαπλές παραμέτρους είναι επιτυχείς (Balance, OpenOrders). Εάν λαμβάνετε συνεχώς μια έγκυρη απάντηση από αυτές τις κλήσεις, τότε η θεωρία της αναντιστοιχίας φαίνεται πιο εύλογη.

*Λάβετε υπόψη ότι στο παραπάνω παράδειγμα, χρησιμοποιήθηκε η παράμετρος Validate, η οποία απλώς επικυρώνει μόνο τις εισόδους αλλά δεν υποβάλλει την παραγγελία. Η παράμετρος θα πρέπει να απορριφθεί για live trading*

Η ύπαρξη αναντιστοιχίας μεταξύ του τύπου περιεχομένου του σώματος και της κεφαλίδας μπορεί επίσης να οδηγήσει σε ένα Invalid API Key.

Παρακαλούμε δείτε παρακάτω ένα σενάριο όπου τόσο η κεφαλίδα όσο και τα δεδομένα Post είναι URL encoded:

 

python

Python

api_key = ""

api_secret = base64.b64decode("")

api_domain = "https://api.kraken.com"
api_path = "/0/private/"
api_endpoint = "Balance"  # {"error":[]} IS SUCCESS-EMPTY BALANCE
api_parameters = ""

api_nonce = str(int(time.time() * 1000))

api_postdata = api_parameters + "&nonce=" + api_nonce
api_postdata = api_postdata.encode('utf-8')

api_sha256Data = api_nonce.encode('utf-8') + api_postdata
api_sha256 = hashlib.sha256(api_sha256Data).digest()

api_hmacSha512Data = api_path.encode('utf-8') + api_endpoint.encode('utf-8') + api_sha256
api_hmacsha512 = hmac.new(api_secret, api_hmacSha512Data, hashlib.sha512)

api_sig = base64.b64encode(api_hmacsha512.digest())

api_url = api_domain + api_path + api_endpoint
api_request = urllib2.Request(api_url, api_postdata)
api_request.add_header("Content-Type", "application/x-www-form-urlencoded")
api_request.add_header("API-Key", api_key)
api_request.add_header("API-Sign", api_sig)
api_request.add_header("User-Agent", "Kraken REST API")

print("DEBUG DATA : ")
print("api_url : " + api_url)
print("api_endpoint : " + api_endpoint)
print("api_parameters : " + api_parameters)

print("")

api_reply = urllib2.urlopen(api_request).read()
api_reply = api_reply.decode()

print("API JSON DATA:")
print(api_reply)

sys.exit(0)

# Response:
# API JSON DATA:
# {"error":[],"result":{"ADA":"0.00000000","AIR":"0.0000000000","ALGO":"0.00000000","ATOM":"0.00000000",
# "AVAX":"0.0000000000","BONK":"0.24","BSX":"0.00","C98":"0.00000","CVC":"0.0000000000","DOT":"0.0000000058",
# "DYM":"1.001240","ETH2.S":"0.0000000000","FLOW":"0.0000000000","FLR":"0.0000","GRT":"0.0000000000","ICP":"0.00000000",
# "KAVA":"0.00000000","KFEE":"4619.88","KSM":"0.0457969620","KSM.S":"0.0000000000","MATIC":"0.0000000000",
# "MINA":"1.0067624751","MINA.S":"0.0000000000","PARA":"0.000","POLS":"0.00000","SBR":"0.00000000","SCRT":"0.00000000",
# "SCRT21.S":"0.00000000","SDN":"0.0000000000","SEI":"0.0000","SHIB":"0.00000","SOL":"0.0000069748","SOL.S":"0.0000000000",
# "SOL03.S":"0.0201035317","TIA":"0.000000","TRX":"0.00000000","USDC":"0.00000000","USDT":"0.00068726",
# "USDT.B":"3.53191423","WEN":"158958.59","WIF":"0.00000","XBT.M":"0.0001000103","XETH":"0.0000000000",
# "XTZ":"0.00000000","XXBT":"0.0000000000","XXDG":"24.34451185","XXMR":"0.0000000000","ZCAD":"0.0000",
# "ZEUR":"0.2732","ZUSD":"0.6353"}}

Ωστόσο, όταν προσθέτουμε τον Content Type της κεφαλίδας ως JSON, λαμβάνουμε ένα

σφάλμα EAPI:Invalid Key Error.

 

python

Python

api_key = ""

api_secret = base64.b64decode("")

api_domain = "https://api.kraken.com"
api_path = "/0/private/"
api_endpoint = "AddOrder"  # {"error":[]} IS SUCCESS-EMPTY BALANCE

# api_parameters = "pair=xbtusd&ordertype=market&type=buy&volume=0.0001&validate=True"
api_parameters = ''

api_nonce = str(int(time.time() * 1000))

api_postdata = api_parameters + "&nonce=" + api_nonce
api_postdata = api_postdata.encode('utf-8')

api_sha256Data = api_nonce.encode('utf-8') + api_postdata
api_sha256 = hashlib.sha256(api_sha256Data).digest()

api_hmacSha512Data = api_path.encode('utf-8') + api_endpoint.encode('utf-8') + api_sha256
api_hmacsha512 = hmac.new(api_secret, api_hmacSha512Data, hashlib.sha512)

api_sig = base64.b64encode(api_hmacsha512.digest())

api_url = api_domain + api_path + api_endpoint
api_request = urllib2.Request(api_url, api_postdata)

print("DEBUG DATA : ")
print("api_url : " + api_url)
print("api_endpoint : " + api_endpoint)
print("api_parameters : " + api_parameters)
print("")

headers = {}
headers['API-Key'] = api_key
headers['API-Sign'] = api_sig
headers['Content-Type'] = 'application/json'
headers['Accepts'] = 'application/json'
headers['User-Agent'] = "Kraken REST API"

api_reply = urllib2.urlopen(api_request).read()
api_reply = api_reply.decode()

data = {'nonce': api_nonce}
req = requests.post(api_url, headers=headers, data=data)
print(req.json())

print("API JSON DATA:")
print(api_reply)

sys.exit(0)

# API JSON DATA:
# {"error":["EAPI:Invalid key"]}

*Σημειώστε ότι είναι δυνατό να χρησιμοποιήσετε είτε URL encoded δεδομένα είτε JSON encoded δεδομένα, αλλά τα δεδομένα πρέπει να ταιριάζουν ακριβώς τόσο στην είσοδο SHA256 όσο και στο αίτημα HTTP.*

Ένα σφάλμα Invalid Key μπορεί επίσης να προκληθεί από τη μετάδοση ενός ελλιπούς ή ελλείποντος endpoint URI (για παράδειγμα "AddOrder" αντί για “/0/private/AddOrder”).

Για να δημιουργήσει σωστά ο Αλγόριθμος Ελέγχου Ταυτότητας την κεφαλίδα API-Sign, πρέπει να χρησιμοποιήσει το URI στην ολότητά του (για παράδειγμα "/0/private/AddOrder”). Εάν οποιοδήποτε μέρος αυτού του URI περικοπεί, θα οδηγήσει σε λανθασμένη τιμή για το API-Sign και συνεπώς σε σφάλμα Invalid Key.

Παρακάτω είναι ένα παράδειγμα όπου μόνο το “AddOrder” μεταβιβάζεται για κωδικοποίηση αντί για το πλήρες endpoint URI “/0/private/AddOrder”

python

Python

api_key = ''
secret_key = ''

# Define the URI path for the Kraken API request
uri_path = 'AddOrder'

# API URL
api_url = 'https://api.kraken.com/0/private/'

# Create a dictionary for the request data
data = {
    "nonce": str(int(1000 * time.time())),
    "ordertype": 'limit',
    'type': 'buy',
    'volume': '0.07617478622420963',
    'pair': 'SOLUSD',
    'price': '127.47',
    'validate': 'true'
}

# Encode the data for the request
postdata = urllib.parse.urlencode(data)
encoded = (str(data['nonce']) + postdata).encode()

# Create a message to be signed
message = uri_path.encode() + hashlib.sha256(encoded).digest()

# Create the HMAC signature
mac = hmac.new(base64.b64decode(secret_key), message, hashlib.sha512)
sigdigest = base64.b64encode(mac.digest())

# Create headers for the request
headers = {}
headers['API-Key'] = api_key
headers['API-Sign'] = sigdigest.decode()

# Make the POST request
req = requests.post(api_url + uri_path, headers=headers, data=data)

# Print the result
print(req.json())

# Result:
# {'error': ['EAPI:Invalid key']}

Ένα άλλο κοινό ζήτημα που προκαλεί σφάλμα Invalid Key Error είναι η αναντιστοιχία κωδικοποίησης μεταξύ του αιτήματος POST και του ελέγχου ταυτότητας HTTP.

Στο παρακάτω παράδειγμα, τα ‘Data’ που μεταβιβάζονται στο αίτημα POST είναι URL formatted (με κενά κωδικοποιημένα ως ‘+’) ως application /x-www-form-urlencoded content-type, ενώ τα ‘data_formatted’ κωδικοποιούν τα κενά ως ‘%20’.

Ενώ και στα δύο παραδείγματα τα κενά είναι κωδικοποιημένα, τα δεδομένα που μεταβιβάζονται στον αλγόριθμο ελέγχου ταυτότητας και στο αίτημα POST δεν είναι ακριβώς τα ίδια. Αυτό θα οδηγήσει σε σφάλμα Invalid Key.

 

python

Python

# Define the URI path for the Kraken API request
uri_path = '/0/private/DepositAddresses'

# API URL
api_url = 'https://api.kraken.com'

# Calculate Nonce for both data variables
nonce = str(int(1000 * time.time()))

# Create a dictionary for the request data
data = {
    "nonce": nonce,
    "asset": 'BTC',
    'method': 'Bitcoin Lightning',
    'amount': '0.2',
    'new': True
}

postdata_data = urllib.parse.urlencode(data)

# Encode the data for the request manually
data_formatted = f'nonce={nonce}&asset=BTC&method=Bitcoin%20Lightning&amount=0.2&new=True'
postdata = data_formatted
encoded = (nonce + postdata).encode()

# Create a message to be signed
message = uri_path.encode() + hashlib.sha256(encoded).digest()

# Create the HMAC signature
mac = hmac.new(base64.b64decode(secret_key), message, hashlib.sha512)
sigdigest = base64.b64encode(mac.digest())

# Create headers for the request
headers = {}
headers['API-Key'] = api_key
headers['API-Sign'] = sigdigest.decode()

# Make the POST request
req = requests.post(api_url + uri_path, headers=headers, data=data)

# Print the result
print(req.json())

# Result:
# {'error': ['EAPI:Invalid key']}

Για να το απεικονίσουμε αυτό καθαρά, παρακαλούμε δείτε παρακάτω τις 2 διαφορετικές μορφές για τα Δεδομένα:

bash

Bash

data = nonce=1719929687102&asset=BTC&method=Bitcoin+Lightning&amount=0.2&new=True

data_formatted = nonce=1719929687102&asset=BTC&method=Bitcoin%20Lightning&amount=0.2&new=True

*Είναι δυνατό να χρησιμοποιήσετε είτε απλό κείμενο είτε percent encoded, αρκεί η μορφή να είναι ίδια τόσο στα δεδομένα Ελέγχου Ταυτότητας όσο και στο αίτημα.*

Χρειάζεστε περισσότερη βοήθεια;