अमान्य कुंजी त्रुटि के सामान्य कारण

अंतिम अपडेट: 5 जून 2025

एक सफल निजी कॉल करने के लिए, एक HTTP POST अनुरोध को उचित एंडपॉइंट पर भेजा जाना चाहिए।

इस अनुरोध में हेडर API-साइन (हस्ताक्षर) शामिल है जो अपने हैशिंग एल्गोरिथम के हिस्से के रूप में एन्कोडेड पोस्ट_डेटा का उपयोग करता है।

यदि हेडर में शामिल हस्ताक्षर और अनुरोध में शामिल POST डेटा के बीच कोई विसंगति है, तो एक अमान्य API कुंजी त्रुटि वापस कर दी जाएगी।

नीचे एक सही ढंग से तैयार किए गए कॉल का एक उदाहरण दिया गया है जिसमें प्रमाणीकरण एल्गोरिथम में उपयोग किया गया डेटा अनुरोध के मुख्य भाग में मेल खाता है:

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'}}}

हालांकि, जब ऑर्डरटाइप और वॉल्यूम को आपस में बदल दिया जाता है तो एक अमान्य कुंजी त्रुटि उत्पन्न होती है।

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']}

एक संकेत जो अमान्य कुंजी त्रुटि का कारण हो सकता है, वह यह है कि यदि कई पैरामीटर की आवश्यकता नहीं वाले एंडपॉइंट्स पर कॉल सफल होते हैं (बैलेंस, ओपनऑर्डर)। यदि आपको इन कॉलों से लगातार एक वैध प्रतिक्रिया मिलती है, तो बेमेल सिद्धांत अधिक प्रशंसनीय लगता है।

*कृपया ध्यान दें कि उपरोक्त उदाहरण में, वैलिडेट पैरामीटर का उपयोग किया गया था जो केवल इनपुट को मान्य करता है लेकिन ऑर्डर सबमिट नहीं करता है। लाइव ट्रेडिंग के लिए पैरामीटर को छोड़ दिया जाना चाहिए*

बॉडी के सामग्री प्रकार और हेडर के बीच बेमेल होने से भी एक अमान्य API कुंजी हो सकती है।

कृपया नीचे एक ऐसा परिदृश्य देखें जहां हेडर और पोस्ट डेटा दोनों URL एन्कोडेड हैं:

 

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"}}

हालांकि, जब हम हेडर के सामग्री प्रकार को JSON के रूप में जोड़ते हैं, तो हमें एक

EAPI: अमान्य कुंजी त्रुटि मिलती है।

 

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 एन्कोडेड डेटा या JSON एन्कोडेड डेटा दोनों का उपयोग करना संभव है, लेकिन डेटा SHA256 इनपुट और HTTP अनुरोध दोनों में बिल्कुल मेल खाना चाहिए।*

एक अमान्य कुंजी त्रुटि एक अधूरा या गुम एंडपॉइंट URI (उदाहरण के लिए "AddOrder" के बजाय “/0/private/AddOrder”) पास करने के कारण भी हो सकती है।

प्रमाणीकरण एल्गोरिथम को API-साइन हेडर को सही ढंग से बनाने के लिए, उसे URI का पूरी तरह से उपयोग करने की आवश्यकता होती है (उदाहरण के लिए "/0/private/AddOrder”)। यदि इस URI का कोई भी हिस्सा छोटा किया जाता है, तो इससे API-साइन के लिए गलत मान प्राप्त होगा और इस प्रकार एक अमान्य कुंजी त्रुटि होगी।

नीचे केवल “AddOrder” को एन्कोडिंग के लिए पास करने का एक उदाहरण दिया गया है, बजाय पूर्ण एंडपॉइंट 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']}

एक और सामान्य समस्या जो अमान्य कुंजी त्रुटि का कारण बनती है, वह POST अनुरोध और HTTP प्रमाणीकरण के बीच एन्कोडिंग का बेमेल होना है।

नीचे दिए गए उदाहरण में, ‘डेटा’ जो POST अनुरोध को पास किया जाता है, वह URL स्वरूपित है (रिक्त स्थान '‘+' के रूप में एन्कोड किए गए हैं) जैसे कि एप्लिकेशन /x-www-form-urlencoded सामग्री-प्रकार, जबकि ‘डेटा_स्वरूपित’ रिक्त स्थान को '‘%20’' के रूप में एन्कोड कर रहा है।

जबकि दोनों उदाहरणों में रिक्त स्थान एन्कोड किए गए हैं, प्रमाणीकरण एल्गोरिथम और POST अनुरोध को पास किया गया डेटा बिल्कुल समान नहीं है। इससे एक अमान्य कुंजी त्रुटि होगी।

 

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

*सादे टेक्स्ट या प्रतिशत एन्कोडेड का उपयोग करना संभव है, बशर्ते कि प्रमाणीकरण डेटा और अनुरोध दोनों में प्रारूप समान हो।*

क्या आपको और मदद चाहिए?