Kimlik Doğrulama
TRXUp API'sine yapılan tüm API istekleri Bearer token ve imza kullanılarak kimlik doğrulaması gerektirir. Bu, API isteklerinizin güvenliğini ve bütünlüğünü sağlar.
API Kimlik Bilgilerini Edinme
TRXUp API'si ile başlamak için kontrol panelinden API kimlik bilgilerinizi edinmeniz gerekir:
- TRXUp müşteri paneline giriş yapın
- Kenar çubuğundaki Hesap altında API erişimi'ni açın
- Kimlik bilgileri oluştur'a basın
Token ve imzalama anahtarı yalnızca bir kez, oluşturuldukları anda gösterilir. Anahtar bir daha asla görüntülenmez — kısmen de olmaz, o ekranda da olmaz. Kaybederseniz yeni bir çift oluşturun.

Aynı ekran, çifti yalnızca kendi sunucularınızın çağrı yaptığı IP adresleriyle sınırlamanıza izin verir. Doğru imzalanmış olsa bile başka bir adresten gelen istek reddedilir.
TIP
API kimlik bilgilerinizi güvenli tutun ve asla herkese açık şekilde paylaşmayın. API gizli anahtarınız bir şifre gibi ele alınmalıdır.
Gerekli Başlıklar
| Başlık | Açıklama |
|---|---|
Authorization: Bearer YOUR_API_TOKEN | API token'ınız |
X-Signature: YOUR_SIGNATURE | İstek imzası |
Content-Type: application/json | İçerik türü JSON olmalıdır |
İmza Hesaplama
İmza, istek gövdesi ile API gizli anahtarınızın birleştirilmesiyle SHA256 hash'i kullanılarak hesaplanır.
signature=$(echo -n "$requestBody$apiSecret" | sha256sum | cut -d' ' -f1)Farklı Dillerde Örnekler
#!/bin/bash
API_TOKEN="your_api_token"
API_SECRET="your_api_secret"
REQUEST_BODY='{"service":"energy","params":{"address":"TRX_ADDRESS","energy_amount":65000,"duration":1}}'
# İmzayı hesapla
SIGNATURE=$(echo -n "${REQUEST_BODY}${API_SECRET}" | sha256sum | cut -d' ' -f1)
# API isteği yap
curl -X POST "https://api.trxup.com/v1/transaction/new" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "X-Signature: ${SIGNATURE}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}"const crypto = require('crypto');
const axios = require('axios');
const apiToken = 'your_api_token';
const apiSecret = 'your_api_secret';
const requestBody = JSON.stringify({
service: 'energy',
params: {
address: 'TRX_ADDRESS',
energy_amount: 65000,
duration: 1
}
});
// İmzayı hesapla
const signature = crypto
.createHash('sha256')
.update(requestBody + apiSecret)
.digest('hex');
// API isteği yap
axios({
method: 'post',
url: 'https://api.trxup.com/v1/transaction/new',
headers: {
'Authorization': `Bearer ${apiToken}`,
'X-Signature': signature,
'Content-Type': 'application/json'
},
data: requestBody
})
.then(response => console.log(response.data))
.catch(error => console.error(error));<?php
$apiToken = 'your_api_token';
$apiSecret = 'your_api_secret';
$requestBody = json_encode([
'service' => 'energy',
'params' => [
'address' => 'TRX_ADDRESS',
'energy_amount' => 65000,
'duration' => 1
]
]);
// İmzayı hesapla
$signature = hash('sha256', $requestBody . $apiSecret);
// API isteği yap
$ch = curl_init('https://api.trxup.com/v1/transaction/new');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $apiToken,
'X-Signature: ' . $signature,
'Content-Type: application/json'
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>import hashlib
import json
import requests
api_token = 'your_api_token'
api_secret = 'your_api_secret'
request_body = json.dumps({
'service': 'energy',
'params': {
'address': 'TRX_ADDRESS',
'energy_amount': 65000,
'duration': 1
}
})
# İmzayı hesapla
signature = hashlib.sha256((request_body + api_secret).encode()).hexdigest()
# API isteği yap
headers = {
'Authorization': f'Bearer {api_token}',
'X-Signature': signature,
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.trxup.com/v1/transaction/new',
headers=headers,
data=request_body
)
print(response.json())İmza sürüm 2 (isteğe bağlı)
İmza sürüm 2, aynı istekleri imzalamanın isteğe bağlı ve daha güçlü bir yoludur. Her istek için ayrı ayrı X-Signature-Version: 2 başlığını göndererek etkinleştirirsiniz. Bu başlığı içermeyen ya da X-Signature-Version: 1 içeren bir istek tam olarak yukarıda anlatıldığı gibi doğrulanır; bu nedenle mevcut entegrasyonlarda hiçbir değişiklik gerekmez. Sürüm 1 çalışmaya devam eder ve geçiş için bir son tarih yoktur; yeni entegrasyonlar için sürüm 2'yi öneririz.
Sürüm 2'nin getirdikleri:
- İmza uç noktaya bağlıdır. Yöntem ve yol imzalanan verinin parçasıdır; bu yüzden
/v1/subscription/checkiçin imzalanmış bir istek/v1/subscription/stopadresine yeniden gönderilemez. - 5 dakika sonra geçerliliğini yitirir. İmzalanan zaman damgası sunucunun saatinden en fazla 300 saniye farklı olabilir.
- İmzalanan her istek yalnızca bir kez kabul edilir. İmzalanan nonce yeniden kullanılamaz; bu yüzden ele geçirilmiş bir istek yeniden oynatılamaz.
Gerekli Başlıklar (sürüm 2)
| Başlık | Açıklama |
|---|---|
Authorization: Bearer YOUR_API_TOKEN | API token'ınız, sürüm 1'deki gibi |
X-Signature-Version: 2 | Bu istek için imza sürüm 2'yi seçer |
X-Timestamp: 1761040800 | Saniye cinsinden geçerli Unix zamanı, ondalık tam sayı olarak |
X-Nonce: 7f3c9a12b4e8d05c | Her istek için benzersiz bir değer: A–Z a–z 0–9 . _ ~ - karakterlerinden 8–128 karakter (bir UUID veya en az 16 rastgele onaltılık karakter yeterlidir). Bir nonce'u asla yeniden kullanmayın |
X-Signature: YOUR_SIGNATURE | Aşağıdaki gibi hesaplanan istek imzası |
Content-Type: application/json | İçerik türü JSON olmalıdır |
İmza Hesaplama (sürüm 2)
X-Signature, anahtar olarak API gizli anahtarınızla hesaplanan, aşağıdaki dizenin küçük harfli onaltılık HMAC-SHA256 değeridir:
METHOD + "\n" + PATH + "\n" + X-Timestamp + "\n" + X-Nonce + "\n" + BODYMETHOD,POST'tur (tüm/v1uç noktaları POST kullanır).PATH, isteğin gönderildiği haliyle yoludur; ana bilgisayar adı ve sorgu dizesi olmadan, örneğin/v1/transaction/new.X-TimestampveX-Nonce, gönderdiğiniz başlıkların tam değerleridir.BODY, istek gövdesinin tam ham baytlarıdır (gövde boşsa boş bir dize). Gönderdiğiniz baytları imzalayın: JSON imzalandıktan sonra yeniden serileştirilirse imza eşleşmez."\n"tek bir satır sonu karakteridir (0x0A). Gövdeden sonra satır sonu yoktur.
Sunucu önce imzayı, ardından X-Timestamp değerinin kendi saatinden her iki yönde en fazla 300 saniye (5 dakika) farklı olduğunu, son olarak da hesabınızın bu nonce'u daha önce kullanmadığını kontrol eder (nonce'lar yaklaşık 11 dakika boyunca hatırlanır). Sunucunuzun saatini NTP ile senkronize tutun. Yeniden deneme yeni bir istektir: yeni bir zaman damgası, yeni bir nonce ve yeni bir imza gerektirir.
Test Vektörü
API'yi çağırmadan önce kodunuzu bu değerlerle doğrulayın:
| Girdi | Değer |
|---|---|
| API gizli anahtarı | your_api_secret |
| Yöntem | POST |
| Yol | /v1/transaction/new |
X-Timestamp | 1761040800 |
X-Nonce | 7f3c9a12b4e8d05c |
| Gövde | {"service":"energy","params":{"address":"TRX_ADDRESS","energy_amount":65000,"duration":1}} |
İmzalanacak dize (beş satır, sonuncusundan sonra satır sonu yok):
POST
/v1/transaction/new
1761040800
7f3c9a12b4e8d05c
{"service":"energy","params":{"address":"TRX_ADDRESS","energy_amount":65000,"duration":1}}Beklenen X-Signature:
56576e1faecaca2b2533bee6124e7ece2b023665addb2f2e79b8ac83bf8104e8Hatalar (sürüm 2)
Başarısız bir doğrulama, sürüm 1'deki ile aynı HTTP 401 yanıtını "code": 1 ile döndürür. Hatalı veya eksik imza, zaman damgası ya da nonce ile 1 veya 2 dışındaki bir X-Signature-Version, alışılmış Incorrect token or signature mesajını alır. Yalnızca geçerli bir imzadan sonra daha belirgin iki mesaj görülebilir:
X-Timestamp is N seconds from this server's clock; at most 300 either way is accepted— saatiniz kaymış: NTP ile senkronize edin.This X-Nonce was already used; every request needs a new one— yeniden denemeler dahil her istek için yeni bir nonce üretin.
Farklı Dillerde Sürüm 2 Örnekleri
#!/bin/bash
API_TOKEN="your_api_token"
API_SECRET="your_api_secret"
REQUEST_PATH="/v1/transaction/new"
REQUEST_BODY='{"service":"energy","params":{"address":"TRX_ADDRESS","energy_amount":65000,"duration":1}}'
# A new timestamp and nonce for every request
TIMESTAMP=$(date +%s)
NONCE=$(openssl rand -hex 16)
# Calculate signature: METHOD\nPATH\nTIMESTAMP\nNONCE\nBODY, no trailing newline
SIGNATURE=$(printf '%s\n%s\n%s\n%s\n%s' "POST" "$REQUEST_PATH" "$TIMESTAMP" "$NONCE" "$REQUEST_BODY" \
| openssl dgst -sha256 -hmac "$API_SECRET" | awk '{print $NF}')
# Make API request
curl -X POST "https://api.trxup.com${REQUEST_PATH}" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "X-Signature-Version: 2" \
-H "X-Timestamp: ${TIMESTAMP}" \
-H "X-Nonce: ${NONCE}" \
-H "X-Signature: ${SIGNATURE}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}"const crypto = require('crypto');
const axios = require('axios');
const apiToken = 'your_api_token';
const apiSecret = 'your_api_secret';
const requestPath = '/v1/transaction/new';
const requestBody = JSON.stringify({
service: 'energy',
params: {
address: 'TRX_ADDRESS',
energy_amount: 65000,
duration: 1
}
});
// A new timestamp and nonce for every request
const timestamp = Math.floor(Date.now() / 1000).toString();
const nonce = crypto.randomUUID();
// Calculate signature: METHOD\nPATH\nTIMESTAMP\nNONCE\nBODY
const payload = ['POST', requestPath, timestamp, nonce, requestBody].join('\n');
const signature = crypto
.createHmac('sha256', apiSecret)
.update(payload)
.digest('hex');
// Make API request (send exactly the body that was signed)
axios({
method: 'post',
url: 'https://api.trxup.com' + requestPath,
headers: {
'Authorization': `Bearer ${apiToken}`,
'X-Signature-Version': '2',
'X-Timestamp': timestamp,
'X-Nonce': nonce,
'X-Signature': signature,
'Content-Type': 'application/json'
},
data: requestBody
})
.then(response => console.log(response.data))
.catch(error => console.error(error));<?php
$apiToken = 'your_api_token';
$apiSecret = 'your_api_secret';
$requestPath = '/v1/transaction/new';
$requestBody = json_encode([
'service' => 'energy',
'params' => [
'address' => 'TRX_ADDRESS',
'energy_amount' => 65000,
'duration' => 1
]
]);
// A new timestamp and nonce for every request
$timestamp = (string) time();
$nonce = bin2hex(random_bytes(16));
// Calculate signature: METHOD\nPATH\nTIMESTAMP\nNONCE\nBODY
$payload = implode("\n", ['POST', $requestPath, $timestamp, $nonce, $requestBody]);
$signature = hash_hmac('sha256', $payload, $apiSecret);
// Make API request (send exactly the body that was signed)
$ch = curl_init('https://api.trxup.com' . $requestPath);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $apiToken,
'X-Signature-Version: 2',
'X-Timestamp: ' . $timestamp,
'X-Nonce: ' . $nonce,
'X-Signature: ' . $signature,
'Content-Type: application/json'
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>import hashlib
import hmac
import json
import time
import uuid
import requests
api_token = 'your_api_token'
api_secret = 'your_api_secret'
request_path = '/v1/transaction/new'
# Compact separators: the same bytes as the test vector and the other examples
request_body = json.dumps({
'service': 'energy',
'params': {
'address': 'TRX_ADDRESS',
'energy_amount': 65000,
'duration': 1
}
}, separators=(',', ':'))
# A new timestamp and nonce for every request
timestamp = str(int(time.time()))
nonce = uuid.uuid4().hex
# Calculate signature: METHOD\nPATH\nTIMESTAMP\nNONCE\nBODY
payload = '\n'.join(['POST', request_path, timestamp, nonce, request_body])
signature = hmac.new(api_secret.encode(), payload.encode(), hashlib.sha256).hexdigest()
# Make API request (send exactly the bytes that were signed)
headers = {
'Authorization': f'Bearer {api_token}',
'X-Signature-Version': '2',
'X-Timestamp': timestamp,
'X-Nonce': nonce,
'X-Signature': signature,
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.trxup.com' + request_path,
headers=headers,
data=request_body.encode()
)
print(response.json())