Skip to content

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:

  1. Inicie sesión en el gabinete de TRXUp
  2. Abra Acceso a la API, en Cuenta dentro de la barra lateral
  3. 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.

La pantalla de acceso a la API

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 ​

EncabezadoDescripción
Authorization: Bearer YOUR_API_TOKENSu token de API
X-Signature: YOUR_SIGNATUREFirma de la solicitud
Content-Type: application/jsonEl 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.

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

Ejemplos en Diferentes Lenguajes ​

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

# 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}"
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
  }
});

// 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
<?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;
?>
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
  }
})

# 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/check no 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) ​

EncabezadoDescripción
Authorization: Bearer YOUR_API_TOKENSu token de API, igual que en la versión 1
X-Signature-Version: 2Selecciona la versión 2 de la firma para esta solicitud
X-Timestamp: 1761040800Hora Unix actual en segundos, como número entero decimal
X-Nonce: 7f3c9a12b4e8d05cUn 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_SIGNATUREFirma de la solicitud, calculada como se indica abajo
Content-Type: application/jsonEl 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:

text
METHOD + "\n" + PATH + "\n" + X-Timestamp + "\n" + X-Nonce + "\n" + BODY
  • METHOD es POST (todos los endpoints /v1 usan POST).
  • PATH es la ruta de la solicitud exactamente como se envía, sin el host y sin query string, p. ej. /v1/transaction/new.
  • X-Timestamp y X-Nonce son exactamente los valores de los encabezados que envía.
  • BODY son 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:

EntradaValor
Secreto de APIyour_api_secret
MétodoPOST
Ruta/v1/transaction/new
X-Timestamp1761040800
X-Nonce7f3c9a12b4e8d05c
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):

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

X-Signature esperada:

text
56576e1faecaca2b2533bee6124e7ece2b023665addb2f2e79b8ac83bf8104e8

Errores (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 ​

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