Skip to content

Authentifizierung ​

Alle API-Anfragen an die TRXUp API erfordern eine Authentifizierung mit einem Bearer Token und einer Signatur. Dies gewährleistet die Sicherheit und Integrität Ihrer API-Anfragen.

API-Anmeldedaten erhalten ​

Um mit der TRXUp API zu beginnen, müssen Sie Ihre API-Anmeldedaten aus dem Dashboard abrufen:

  1. Melden Sie sich im TRXUp Kundenbereich an
  2. Öffnen Sie API-Zugang, unter Konto in der Seitenleiste
  3. Klicken Sie auf Zugangsdaten erstellen

Der Token und das Signaturgeheimnis werden genau einmal angezeigt, im Moment der Erstellung. Das Geheimnis erscheint danach nie wieder — auch nicht teilweise und auch nicht auf diesem Bildschirm. Wenn Sie es verlieren, erzeugen Sie ein neues Paar.

Der Bildschirm API-Zugang

Auf demselben Bildschirm lässt sich das Paar auf die IP-Adressen beschränken, von denen Ihre eigenen Server aufrufen. Eine korrekt signierte Anfrage von anderswo wird dann abgelehnt.

TIP

Bewahren Sie Ihre API-Anmeldedaten sicher auf und teilen Sie sie niemals öffentlich. Ihr API-Geheimnis sollte wie ein Passwort behandelt werden.

Erforderliche Header ​

HeaderBeschreibung
Authorization: Bearer YOUR_API_TOKENIhr API-Token
X-Signature: YOUR_SIGNATUREAnfrage-Signatur
Content-Type: application/jsonContent-Type muss JSON sein

Signatur-Berechnung ​

Die Signatur wird mit dem SHA256-Hash des Anfragetexts verkettet mit Ihrem API-Geheimnis berechnet.

bash
signature=$(echo -n "$requestBody$apiSecret" | sha256sum | cut -d' ' -f1)

Beispiel in verschiedenen Sprachen ​

bash
#!/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}}'

# Signatur berechnen
SIGNATURE=$(echo -n "${REQUEST_BODY}${API_SECRET}" | sha256sum | cut -d' ' -f1)

# API-Anfrage senden
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}"
javascript
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
  }
});

// Signatur berechnen
const signature = crypto
  .createHash('sha256')
  .update(requestBody + apiSecret)
  .digest('hex');

// API-Anfrage senden
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
<?php
$apiToken = 'your_api_token';
$apiSecret = 'your_api_secret';
$requestBody = json_encode([
  'service' => 'energy',
  'params' => [
    'address' => 'TRX_ADDRESS',
    'energy_amount' => 65000,
    'duration' => 1
  ]
]);

// Signatur berechnen
$signature = hash('sha256', $requestBody . $apiSecret);

// API-Anfrage senden
$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;
?>
python
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
  }
})

# Signatur berechnen
signature = hashlib.sha256((request_body + api_secret).encode()).hexdigest()

# API-Anfrage senden
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())

Signaturversion 2 (optional) ​

Die Signaturversion 2 ist eine optionale, stärkere Art, dieselben Anfragen zu signieren. Sie aktivieren sie pro Anfrage mit dem Header X-Signature-Version: 2. Eine Anfrage ohne diesen Header oder mit X-Signature-Version: 1 wird genau wie oben beschrieben geprüft — bestehende Integrationen müssen also nichts ändern. Version 1 funktioniert weiterhin, und es gibt keine Frist für den Wechsel; für neue Integrationen empfehlen wir Version 2.

Was Version 2 hinzufügt:

  • Die Signatur ist an den Endpunkt gebunden. Methode und Pfad werden mitsigniert, daher kann eine für /v1/subscription/check signierte Anfrage nicht an /v1/subscription/stop wiederholt werden.
  • Sie läuft nach 5 Minuten ab. Der signierte Zeitstempel darf höchstens 300 Sekunden von der Uhr des Servers abweichen.
  • Jede signierte Anfrage wird nur einmal angenommen. Die signierte Nonce kann nicht erneut verwendet werden, daher lässt sich eine abgefangene Anfrage nicht wiederholen.

Erforderliche Header (Version 2) ​

HeaderBeschreibung
Authorization: Bearer YOUR_API_TOKENIhr API-Token, wie in Version 1
X-Signature-Version: 2Wählt für diese Anfrage die Signaturversion 2
X-Timestamp: 1761040800Aktuelle Unix-Zeit in Sekunden, als ganze Dezimalzahl
X-Nonce: 7f3c9a12b4e8d05cEin eindeutiger Wert für jede Anfrage: 8–128 Zeichen aus A–Z a–z 0–9 . _ ~ - (eine UUID oder 16+ zufällige Hex-Zeichen genügen). Verwenden Sie eine Nonce nie zweimal
X-Signature: YOUR_SIGNATUREAnfrage-Signatur, berechnet wie unten beschrieben
Content-Type: application/jsonContent-Type muss JSON sein

Signatur-Berechnung (Version 2) ​

X-Signature ist der HMAC-SHA256 der folgenden Zeichenkette in Hex-Kleinbuchstaben, mit Ihrem API-Geheimnis als Schlüssel:

text
METHOD + "\n" + PATH + "\n" + X-Timestamp + "\n" + X-Nonce + "\n" + BODY
  • METHOD ist POST (alle /v1-Endpunkte verwenden POST).
  • PATH ist der Anfragepfad genau so, wie er gesendet wird, ohne Host und ohne Query-String, z. B. /v1/transaction/new.
  • X-Timestamp und X-Nonce sind genau die Werte der Header, die Sie senden.
  • BODY sind die exakten Rohbytes des Anfragetexts (eine leere Zeichenkette bei leerem Anfragetext). Signieren Sie die Bytes, die Sie senden: Wird das JSON nach dem Signieren erneut serialisiert, stimmt die Signatur nicht.
  • "\n" ist ein einzelner Zeilenvorschub (0x0A). Nach dem Anfragetext folgt kein Zeilenvorschub.

Der Server prüft zuerst die Signatur, dann, dass X-Timestamp höchstens 300 Sekunden (5 Minuten) in beide Richtungen von seiner eigenen Uhr abweicht, und schließlich, dass Ihr Konto die Nonce noch nicht verwendet hat (Nonces werden etwa 11 Minuten lang gespeichert). Halten Sie die Uhr Ihres Servers per NTP synchron. Eine Wiederholung ist eine neue Anfrage: Sie braucht einen neuen Zeitstempel, eine neue Nonce und eine neue Signatur.

Testvektor ​

Prüfen Sie Ihren Code mit diesen Werten, bevor Sie die API aufrufen:

EingabeWert
API-Geheimnisyour_api_secret
MethodePOST
Pfad/v1/transaction/new
X-Timestamp1761040800
X-Nonce7f3c9a12b4e8d05c
Anfragetext{"service":"energy","params":{"address":"TRX_ADDRESS","energy_amount":65000,"duration":1}}

Die zu signierende Zeichenkette (fünf Zeilen, kein Zeilenvorschub nach der letzten):

text
POST
/v1/transaction/new
1761040800
7f3c9a12b4e8d05c
{"service":"energy","params":{"address":"TRX_ADDRESS","energy_amount":65000,"duration":1}}

Erwartete X-Signature:

text
56576e1faecaca2b2533bee6124e7ece2b023665addb2f2e79b8ac83bf8104e8

Fehler (Version 2) ​

Eine fehlgeschlagene Prüfung liefert dieselbe HTTP-401-Antwort wie Version 1, mit "code": 1. Eine falsche oder fehlende Signatur, ein falscher oder fehlender Zeitstempel oder eine falsche oder fehlende Nonce sowie eine andere X-Signature-Version als 1 oder 2 erhalten die übliche Meldung Incorrect token or signature. Erst nach einer gültigen Signatur können zwei spezifischere Meldungen erscheinen:

  • X-Timestamp is N seconds from this server's clock; at most 300 either way is accepted — Ihre Uhr geht falsch: Synchronisieren Sie sie per NTP.
  • This X-Nonce was already used; every request needs a new one — erzeugen Sie für jede Anfrage eine neue Nonce, auch für Wiederholungen.

Beispiele für Version 2 in verschiedenen Sprachen ​

bash
#!/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}"
javascript
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
<?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;
?>
python
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())

Tron Energy API Documentation