Autenticación
Todas las solicitudes a la API de TRXUp requieren autenticación mediante un token Bearer y una firma. Esto garantiza la seguridad e integridad de sus solicitudes a la API.
Obtención de Credenciales de API
Para comenzar con la API de TRXUp, necesitará obtener sus credenciales de API desde el panel de control:
- Inicie sesión en el gabinete de TRXUp
- Abra Acceso a la API, en Cuenta dentro de la barra lateral
- Pulse Crear credenciales
El token y el secreto de firma se muestran una sola vez, en el momento de crearlos. El secreto no vuelve a mostrarse nunca — ni siquiera en parte, ni en esa pantalla. Si lo pierde, emita un par nuevo.

Esa misma pantalla permite restringir el par a las direcciones IP desde las que llaman sus propios servidores. Una solicitud correctamente firmada desde cualquier otro lugar queda rechazada.
TIP
Mantenga sus credenciales de API seguras y nunca las comparta públicamente. Su secreto de API debe tratarse como una contraseña.
Encabezados Requeridos
| Encabezado | Descripción |
|---|---|
Authorization: Bearer YOUR_API_TOKEN | Su token de API |
X-Signature: YOUR_SIGNATURE | Firma de la solicitud |
Content-Type: application/json | El tipo de contenido debe ser JSON |
Cálculo de la Firma
La firma se calcula utilizando el hash SHA256 del cuerpo de la solicitud concatenado con su secreto de API.
signature=$(echo -n "$requestBody$apiSecret" | sha256sum | cut -d' ' -f1)Ejemplos en Diferentes Lenguajes
#!/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}}'
# Calcular firma
SIGNATURE=$(echo -n "${REQUEST_BODY}${API_SECRET}" | sha256sum | cut -d' ' -f1)
# Realizar solicitud a la 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
}
});
// Calcular firma
const signature = crypto
.createHash('sha256')
.update(requestBody + apiSecret)
.digest('hex');
// Realizar solicitud a la 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
]
]);
// Calcular firma
$signature = hash('sha256', $requestBody . $apiSecret);
// Realizar solicitud a la 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
}
})
# Calcular firma
signature = hashlib.sha256((request_body + api_secret).encode()).hexdigest()
# Realizar solicitud a la 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())Versión 2 de la firma (opcional)
La versión 2 de la firma es una forma opcional y más robusta de firmar las mismas solicitudes. Se activa por solicitud enviando el encabezado X-Signature-Version: 2. Una solicitud sin ese encabezado, o con X-Signature-Version: 1, se verifica exactamente como se describe arriba, así que las integraciones existentes no necesitan ningún cambio. La versión 1 sigue funcionando y no hay fecha límite para cambiar; para integraciones nuevas recomendamos la versión 2.
Lo que añade la versión 2:
- La firma está ligada al endpoint. El método y la ruta forman parte de lo firmado, por lo que una solicitud firmada para
/v1/subscription/checkno puede reenviarse a/v1/subscription/stop. - Caduca a los 5 minutos. La marca de tiempo firmada debe estar a no más de 300 segundos del reloj del servidor.
- Cada solicitud firmada se acepta una sola vez. El nonce firmado no puede reutilizarse, por lo que una solicitud interceptada no puede reenviarse.
Encabezados Requeridos (versión 2)
| Encabezado | Descripción |
|---|---|
Authorization: Bearer YOUR_API_TOKEN | Su token de API, igual que en la versión 1 |
X-Signature-Version: 2 | Selecciona la versión 2 de la firma para esta solicitud |
X-Timestamp: 1761040800 | Hora Unix actual en segundos, como número entero decimal |
X-Nonce: 7f3c9a12b4e8d05c | Un valor único para cada solicitud: de 8 a 128 caracteres de A–Z a–z 0–9 . _ ~ - (sirve un UUID o 16 o más caracteres hexadecimales aleatorios). Nunca reutilice un nonce |
X-Signature: YOUR_SIGNATURE | Firma de la solicitud, calculada como se indica abajo |
Content-Type: application/json | El tipo de contenido debe ser JSON |
Cálculo de la Firma (versión 2)
X-Signature es el HMAC-SHA256 en hexadecimal en minúsculas de la siguiente cadena, con su secreto de API como clave:
METHOD + "\n" + PATH + "\n" + X-Timestamp + "\n" + X-Nonce + "\n" + BODYMETHODesPOST(todos los endpoints/v1usan POST).PATHes la ruta de la solicitud exactamente como se envía, sin el host y sin query string, p. ej./v1/transaction/new.X-TimestampyX-Nonceson exactamente los valores de los encabezados que envía.BODYson los bytes exactos del cuerpo de la solicitud (una cadena vacía si el cuerpo está vacío). Firme los bytes que envía: si el JSON se vuelve a serializar después de firmar, la firma no coincidirá."\n"es un único salto de línea (0x0A). No hay salto de línea después del cuerpo.
El servidor comprueba primero la firma, después que X-Timestamp no se aleje más de 300 segundos (5 minutos) de su propio reloj en ninguna dirección y, por último, que su cuenta no haya usado ese nonce antes (los nonces se recuerdan durante unos 11 minutos). Mantenga el reloj de su servidor sincronizado con NTP. Un reintento es una solicitud nueva: necesita una marca de tiempo nueva, un nonce nuevo y una firma nueva.
Vector de Prueba
Compruebe su código con estos valores antes de llamar a la API:
| Entrada | Valor |
|---|---|
| Secreto de API | your_api_secret |
| Método | POST |
| Ruta | /v1/transaction/new |
X-Timestamp | 1761040800 |
X-Nonce | 7f3c9a12b4e8d05c |
| Cuerpo | {"service":"energy","params":{"address":"TRX_ADDRESS","energy_amount":65000,"duration":1}} |
La cadena que se firma (cinco líneas, sin salto de línea después de la última):
POST
/v1/transaction/new
1761040800
7f3c9a12b4e8d05c
{"service":"energy","params":{"address":"TRX_ADDRESS","energy_amount":65000,"duration":1}}X-Signature esperada:
56576e1faecaca2b2533bee6124e7ece2b023665addb2f2e79b8ac83bf8104e8Errores (versión 2)
Una verificación fallida devuelve la misma respuesta HTTP 401 que la versión 1, con "code": 1. Una firma, marca de tiempo o nonce incorrectos o ausentes, o un X-Signature-Version distinto de 1 o 2, reciben el habitual Incorrect token or signature. Solo después de una firma válida pueden aparecer dos mensajes más específicos:
X-Timestamp is N seconds from this server's clock; at most 300 either way is accepted— su reloj está desajustado: sincronícelo con NTP.This X-Nonce was already used; every request needs a new one— genere un nonce nuevo para cada solicitud, incluidos los reintentos.
Ejemplos de la Versión 2 en Diferentes Lenguajes
#!/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())