Аутентификация
Все запросы к API TRXUp требуют аутентификации с использованием Bearer-токена и подписи. Это обеспечивает безопасность и целостность ваших API-запросов.
Получение учетных данных API
Чтобы начать работу с API TRXUp, вам необходимо получить учетные данные API в панели управления:
- Войдите в личный кабинет TRXUp
- Откройте Доступ к API — раздел Аккаунт в боковом меню
- Нажмите Создать учётные данные
Токен и секрет подписи показываются ровно один раз, в момент создания. Секрет больше не отображается никогда — ни частично, ни на этом экране. Если вы его потеряли, выпустите новую пару.

На этом же экране пару можно ограничить IP-адресами, с которых обращаются ваши собственные серверы. Корректно подписанный запрос с любого другого адреса будет отклонён.
TIP
Храните ваши учетные данные API в безопасности и никогда не делитесь ими публично. С вашим API-Token следует обращаться как с паролем.
Необходимые заголовки
| Заголовок | Описание |
|---|---|
Authorization: Bearer YOUR_API_TOKEN | Ваш API-токен |
X-Signature: YOUR_SIGNATURE | Подпись запроса |
Content-Type: application/json | Тип контента должен быть JSON |
Расчет подписи
Подпись рассчитывается с использованием SHA256-хеша тела запроса, объединенного с вашим API-секретом.
signature=$(echo -n "$requestBody$apiSecret" | sha256sum | cut -d' ' -f1)Примеры на разных языках программирования
#!/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}}'
# Расчет подписи
SIGNATURE=$(echo -n "${REQUEST_BODY}${API_SECRET}" | sha256sum | cut -d' ' -f1)
# Выполнение API-запроса
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
}
});
// Расчет подписи
const signature = crypto
.createHash('sha256')
.update(requestBody + apiSecret)
.digest('hex');
// Выполнение API-запроса
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
]
]);
// Расчет подписи
$signature = hash('sha256', $requestBody . $apiSecret);
// Выполнение API-запроса
$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
}
})
# Расчет подписи
signature = hashlib.sha256((request_body + api_secret).encode()).hexdigest()
# Выполнение API-запроса
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())Подпись версии 2 (необязательно)
Подпись версии 2 — необязательный, более надёжный способ подписывать те же запросы. Она включается для каждого запроса отдельно заголовком X-Signature-Version: 2. Запрос без этого заголовка или с X-Signature-Version: 1 проверяется ровно так, как описано выше, поэтому существующим интеграциям ничего менять не нужно. Версия 1 продолжает работать, и срока перехода нет; для новых интеграций мы рекомендуем версию 2.
Что добавляет версия 2:
- Подпись привязана к эндпоинту. Метод и путь входят в подписываемые данные, поэтому запрос, подписанный для
/v1/subscription/check, нельзя повторить на/v1/subscription/stop. - Она истекает через 5 минут. Подписанная метка времени должна отличаться от часов сервера не более чем на 300 секунд.
- Каждый подписанный запрос принимается только один раз. Подписанный nonce нельзя использовать повторно, поэтому перехваченный запрос нельзя воспроизвести.
Необходимые заголовки (версия 2)
| Заголовок | Описание |
|---|---|
Authorization: Bearer YOUR_API_TOKEN | Ваш API-токен, как в версии 1 |
X-Signature-Version: 2 | Выбирает подпись версии 2 для этого запроса |
X-Timestamp: 1761040800 | Текущее Unix-время в секундах, десятичным целым числом |
X-Nonce: 7f3c9a12b4e8d05c | Уникальное значение для каждого запроса: 8–128 символов из A–Z a–z 0–9 . _ ~ - (подойдёт UUID или 16+ случайных шестнадцатеричных символов). Никогда не используйте nonce повторно |
X-Signature: YOUR_SIGNATURE | Подпись запроса, рассчитанная как описано ниже |
Content-Type: application/json | Тип контента должен быть JSON |
Расчет подписи (версия 2)
X-Signature — это HMAC-SHA256 следующей строки в шестнадцатеричном виде строчными буквами, где ключом служит ваш API-секрет:
METHOD + "\n" + PATH + "\n" + X-Timestamp + "\n" + X-Nonce + "\n" + BODYMETHOD—POST(все эндпоинты/v1используют POST).PATH— путь запроса ровно в том виде, в каком он отправляется, без хоста и без query string, например/v1/transaction/new.X-TimestampиX-Nonce— в точности значения отправляемых заголовков.BODY— точные исходные байты тела запроса (пустая строка, если тело пустое). Подписывайте те байты, которые отправляете: если JSON сериализуется заново после подписи, подпись не совпадёт."\n"— один символ перевода строки (0x0A). После тела перевода строки нет.
Сервер сначала проверяет подпись, затем то, что X-Timestamp отличается от его собственных часов не более чем на 300 секунд (5 минут) в любую сторону, и наконец то, что ваш аккаунт ещё не использовал этот nonce (nonce запоминаются примерно на 11 минут). Синхронизируйте часы вашего сервера по NTP. Повторная попытка — это новый запрос: ей нужны новая метка времени, новый nonce и новая подпись.
Тестовый вектор
Проверьте свой код на этих значениях, прежде чем обращаться к API:
| Входные данные | Значение |
|---|---|
| API-секрет | your_api_secret |
| Метод | POST |
| Путь | /v1/transaction/new |
X-Timestamp | 1761040800 |
X-Nonce | 7f3c9a12b4e8d05c |
| Тело | {"service":"energy","params":{"address":"TRX_ADDRESS","energy_amount":65000,"duration":1}} |
Строка для подписи (пять строк, без перевода строки после последней):
POST
/v1/transaction/new
1761040800
7f3c9a12b4e8d05c
{"service":"energy","params":{"address":"TRX_ADDRESS","energy_amount":65000,"duration":1}}Ожидаемый X-Signature:
56576e1faecaca2b2533bee6124e7ece2b023665addb2f2e79b8ac83bf8104e8Ошибки (версия 2)
Неудачная проверка возвращает тот же ответ HTTP 401, что и в версии 1, с "code": 1. Неверная или отсутствующая подпись, метка времени или nonce, а также X-Signature-Version, отличный от 1 или 2, получают обычное Incorrect token or signature. Только после корректной подписи могут появиться два более конкретных сообщения:
X-Timestamp is N seconds from this server's clock; at most 300 either way is accepted— ваши часы сбились: синхронизируйте их по NTP.This X-Nonce was already used; every request needs a new one— генерируйте новый nonce для каждого запроса, в том числе для повторных попыток.
Примеры версии 2 на разных языках программирования
#!/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())