Saldo simulado
Use GET /api/v1/sandbox/workspace, el faucet y el endpoint de reset para organizar pruebas deterministas.
Conecte Pix, boleto, checkout, cripto, tarjetas y Split Payment con contratos estables, seguridad y visibilidad en cada etapa.

https://api.nodexhub.com.br
https://sandbox-api.vexuspay.com.br para probar el contrato publicado sin mover fondos reales. Las credenciales de Producción nunca funcionan en Sandbox y las credenciales Sandbox nunca funcionan en Producción.Cree una credencial marcada como Sandbox en Configuración → Credenciales. Su identificador comienza por vx_sbx_. El workspace aislado tiene saldos, recursos, registros de idempotencia y entregas de webhook simulados; nunca llama a un proveedor financiero.
Use GET /api/v1/sandbox/workspace, el faucet y el endpoint de reset para organizar pruebas deterministas.
Cree recursos mediante sus rutas normales y use Sandbox Controls para aprobar, fallar, expirar o revertir operaciones simuladas pendientes.
Los endpoints, intentos de entrega y firmas de Sandbox nunca comparten estado con Producción. Los payloads OTP permanecen cifrados y se redactan en la auditoría.
X-Vexus-Sandbox-Scenario con success, insufficient_balance, provider_timeout, rate_limited, declined, expired o webhook_retry. Producción rechaza este header.Contratos estables, respuestas estructuradas y ejemplos listos para el backend.
Reintentos seguros de operaciones financieras sin movimientos duplicados.
Entrega autenticada, identificadores de evento estables y reintentos controlados.
Las rutas privadas exigen las dos credenciales indicadas abajo. Envíelas únicamente desde su backend. Nunca exponga el Client Secret en código del navegador, una aplicación móvil, una URL, una solicitud de soporte ni logs.
Apikey: TU_CLIENT_ID
X-Client-Secret: TU_CLIENT_SECRET
Content-Type: application/jsonSeleccione el entorno correcto y conceda únicamente los scopes necesarios. El Client Secret se muestra una sola vez al crearlo o rotarlo; guárdelo inmediatamente en un almacén de secretos.
El acceso al producto y el scope de la credencial son verificaciones independientes. HTTP 403 puede indicar que falta uno de ellos aunque la credencial sea válida.
Si se utiliza una allowlist de IP, registre la IP pública de salida de su backend. No llame rutas privadas directamente desde el navegador ni desde una aplicación móvil.
Apikey y X-Client-Secret.Su backend crea una Idempotency-Key de 8–100 caracteres para cada nueva intención de negocio mutable. Conserve método, URL, body, bytes del archivo y clave exactos para los reintentos. Un body diferente con la misma clave devuelve conflicto; una intención nueva siempre exige una clave nueva.
Use un UUID aleatorio antes de la primera solicitud.
Inclúyala junto con las credenciales y el payload.
Sin respuesta concluyente, llame GET /api/v1/account/operations/by-idempotency/{idempotencyKey}?operation=... con la misma credencial.
Cree una clave nueva únicamente cuando la intención original sea terminal o haya fallado de forma definitiva.
Los errores JSON incluyen code estable, message legible, details, correlationId y retryable. Guarde el correlation ID, nunca credenciales ni bodies sensibles.
400/413/415/422 indican entrada inválida. 401 indica error de autenticación; 403, error de autorización. 404 también protege el aislamiento entre cuentas. Ante 409, consulte el recurso existente o la intención original.
Espere el tiempo de Retry-After y aplique backoff exponencial con jitter. Un reintento debe conservar la Idempotency-Key y el body originales.
No presuma éxito ni fallo tras un timeout o 5xx. Consulte la Idempotency-Key original antes de cualquier nuevo POST. Si el estado sigue inconcluso, manténgalo en revisión y contacte con soporte usando el correlationId.
201/202 puede indicar creación o admisión, no liquidación PIX ni confirmación blockchain. Persista los IDs devueltos y acompañe el recurso mediante consulta y webhook hasta un estado terminal.Use las mismas credenciales servidor a servidor de los otros módulos. Consulte siempre redes, activos, pares de swap y capacidades de conversión antes de mostrar una acción: el catálogo es la fuente de verdad de la disponibilidad actual.
La creación es idempotente por cuenta y red. Para custodia individual White Label, envíe X-Vexus-Custody-Subject con un ID de usuario opaco e inmutable. Para custodia central, envíe únicamente X-Vexus-Custody-Access: CENTRAL. Estos headers son mutuamente excluyentes.
Use la dirección de la billetera y acompañe las confirmaciones y el estado del depósito. HTTP 200 o CREDITED no sustituye la espera del estado terminal documentado.
Los importes terminados en _units o _minor son cadenas enteras en la unidad mínima, nunca valores de punto flotante. Las cotizaciones definen tarifas, límites ejecutables y vencimiento.
Use una Idempotency-Key nueva para confirmar, persista el ID devuelto y acompañe el recurso hasta un estado terminal. En modo GROSS, las tarifas se descuentan del límite autorizado; en modo NET, pueden aumentar el débito total.
Cualquier cuenta activa de Producción con producto support y scope support.manage puede integrar el soporte VexusPay en su backend. La credencial autenticada determina la cuenta; no se acepta un ID de cliente/cuenta en el body y nunca se revelan recursos de otra cuenta.
Cree, liste, consulte, responda y cierre tickets mediante las rutas publicadas. Todas las escrituras exigen Idempotency-Key.
Cargue JPEG, PNG o WebP en el campo multipart file. El máximo es 5 MiB por imagen y cuatro adjuntos por mensaje. Cada descarga exige credenciales API y debe pasar por su backend.
Registre un endpoint HTTPS para eventos de soporte. El secreto de firma se devuelve una sola vez y debe guardarse en un almacén de secretos; nunca vuelve a mostrarse.
Apikey, X-Client-Secret, secretos de firma ni URL autenticadas de adjuntos al navegador. Use su backend como límite de confianza.Lea y conserve el body sin procesar antes de interpretar el JSON. Calcule HMAC-SHA256(timestamp + "." + rawBody, signing_secret), compare en tiempo constante con X-Vexus-Signature, rechace timestamps antiguos y deduplique por event_id y X-Vexus-Delivery.
X-Vexus-Event: <event_name>
X-Vexus-Delivery: <uuid>
X-Vexus-Timestamp: <unix_timestamp>
X-Vexus-Signature: v1=<hmac_sha256>2xx rápidamente y procéselo en una cola interna. Los fallos de transporte, 408, 409, 425, 429 y 5xx se reintentan. Un evento duplicado nunca debe iniciar una segunda operación financiera.Los ejemplos abajo son derivados del mismo contrato que genera OpenAPI y la colección Postman.
Disponibilidad técnica sin autenticación.
/health/live
Público
Comprueba si el proceso HTTP está activo.
const response = await fetch("https://api.nodexhub.com.br/health/live", {
method: 'GET',
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/health/live');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/health/live",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/health/ready
Público
Valida la base de datos, las migraciones y las dependencias internas necesarias para recibir tráfico.
const response = await fetch("https://api.nodexhub.com.br/health/ready", {
method: 'GET',
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/health/ready');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/health/ready",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
Entrada, salida, decodificación y pago mediante código QR PIX.

/api/v1/cashin
Credenciales
Scope: cashin Producto: pix.cash_in Crea un cobro PIX dinámico.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cashin", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"amount": 25.9
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cashin');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"amount": 25.9
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"amount": 25.9
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/cashin",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"amount": 25.9
}
/api/v1/cashout
Credenciales
Scope: cashout Producto: pix.cash_out Envía un pago PIX a la clave indicada, sujeto al saldo, al producto habilitado y a los límites de la cuenta.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cashout", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"amount": 20,
"pix_key": "<clave-pix-destino>",
"pix_key_type": "random",
"description": "Transferencia de fondos"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cashout');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"amount": 20,
"pix_key": "<clave-pix-destino>",
"pix_key_type": "random",
"description": "Transferencia de fondos"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"amount": 20,
"pix_key": "<clave-pix-destino>",
"pix_key_type": "random",
"description": "Transferencia de fondos"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/cashout",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"amount": 20,
"pix_key": "<clave-pix-destino>",
"pix_key_type": "random",
"description": "Transferencia de fondos"
}
/api/v1/pix/qr/decode
Credenciales
Scope: cashout Producto: pix.cash_out Valida el CRC y decodifica un payload EMV PIX estático o dinámico sin mover fondos. La respuesta indica si el importe está fijado en el código QR.
const response = await fetch("https://api.nodexhub.com.br/api/v1/pix/qr/decode", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"payload": "00020101021226810014br.gov.bcb.pix2559https://example.invalid/pix/cobranca-exemplo520400005303986540539.905802BR5905VEXUS6009SAO PAULO62070503***6304B9CE"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/pix/qr/decode');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"payload": "00020101021226810014br.gov.bcb.pix2559https://example.invalid/pix/cobranca-exemplo520400005303986540539.905802BR5905VEXUS6009SAO PAULO62070503***6304B9CE"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"payload": "00020101021226810014br.gov.bcb.pix2559https://example.invalid/pix/cobranca-exemplo520400005303986540539.905802BR5905VEXUS6009SAO PAULO62070503***6304B9CE"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/pix/qr/decode",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"payload": "00020101021226810014br.gov.bcb.pix2559https://example.invalid/pix/cobranca-exemplo520400005303986540539.905802BR5905VEXUS6009SAO PAULO62070503***6304B9CE"
}
/api/v1/pix/qr/pay
Credenciales
Scope: cashout Producto: pix.cash_out Paga un código QR PIX después de validar el CRC, el importe declarado, el saldo y los límites. El importe incluido en el código QR siempre prevalece sobre el enviado por el integrador.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/pix/qr/pay", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"payload": "00020101021226810014br.gov.bcb.pix2559https://example.invalid/pix/cobranca-exemplo520400005303986540539.905802BR5905VEXUS6009SAO PAULO62070503***6304B9CE",
"description": "Proveedor"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/pix/qr/pay');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"payload": "00020101021226810014br.gov.bcb.pix2559https://example.invalid/pix/cobranca-exemplo520400005303986540539.905802BR5905VEXUS6009SAO PAULO62070503***6304B9CE",
"description": "Proveedor"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"payload": "00020101021226810014br.gov.bcb.pix2559https://example.invalid/pix/cobranca-exemplo520400005303986540539.905802BR5905VEXUS6009SAO PAULO62070503***6304B9CE",
"description": "Proveedor"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/pix/qr/pay",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"payload": "00020101021226810014br.gov.bcb.pix2559https://example.invalid/pix/cobranca-exemplo520400005303986540539.905802BR5905VEXUS6009SAO PAULO62070503***6304B9CE",
"description": "Proveedor"
}
Emisión, consulta y pago de boleto.

/api/v1/boleto/issue
Credenciales
Scope: boleto Producto: boleto Emite un cobro por boleto sin exigir un artículo del catálogo de Checkout. El producto de API boleto debe estar habilitado. El nombre, CPF/CNPJ y correo se obtienen del registro de la cuenta; la dirección no es obligatoria.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/boleto/issue", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"amount": 99.9,
"due_date": "2026-09-30",
"description": "Cobro mediante boleto"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/boleto/issue');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"amount": 99.9,
"due_date": "2026-09-30",
"description": "Cobro mediante boleto"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"amount": 99.9,
"due_date": "2026-09-30",
"description": "Cobro mediante boleto"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/boleto/issue",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"amount": 99.9,
"due_date": "2026-09-30",
"description": "Cobro mediante boleto"
}
/api/v1/boleto/info
Credenciales
Scope: boleto Producto: boleto Consulta al proveedor el importe actualizado y los datos del beneficiario sin mover fondos.
const response = await fetch("https://api.nodexhub.com.br/api/v1/boleto/info", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"billetCode": "00190000000000014990000000000000000000000000"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/boleto/info');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"billetCode": "00190000000000014990000000000000000000000000"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"billetCode": "00190000000000014990000000000000000000000000"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/boleto/info",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"billetCode": "00190000000000014990000000000000000000000000"
}
/api/v1/boleto/pay
Credenciales
Scope: boleto Producto: boleto Vuelve a consultar al proveedor el importe y el beneficiario, y valida el saldo y los límites antes del pago. El integrador envía únicamente el código del boleto.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/boleto/pay", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"billetCode": "00190000000000014990000000000000000000000000"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/boleto/pay');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"billetCode": "00190000000000014990000000000000000000000000"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"billetCode": "00190000000000014990000000000000000000000000"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/boleto/pay",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"billetCode": "00190000000000014990000000000000000000000000"
}
Catálogo, enlaces de pago, medios habilitados e informes de Checkout.

/api/v1/card/config
Solo producción Credenciales
Scope: cards.write Producto: card PUBLISHED PRODUCTION ONLY Devuelve la clave pública y la URL del SDK autorizado para tokenizar la tarjeta en el navegador. Nunca envíe PAN ni CVV al backend de VexusPay.
const response = await fetch("https://api.nodexhub.com.br/api/v1/card/config", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/card/config');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/card/config",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
/api/v1/card/pay
Solo producción Credenciales
Scope: cards.write Producto: card PUBLISHED PRODUCTION ONLY Procesa un cobro independiente sin exigir un artículo del catálogo de Checkout. El producto de API card debe estar habilitado. Use un token de tarjeta de un solo uso creado por el SDK indicado por el endpoint de configuración; no se aceptan PAN ni CVV.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/card/pay", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"amount": 99.9,
"external_id": "pedido-ejemplo-123",
"buyer_name": "Cliente de Ejemplo",
"buyer_email": "cliente@example.com",
"buyer_cpf": "52998224725",
"card_token": "REEMPLACE_CON_TOKEN_DE_UN_SOLO_USO",
"payment_method_id": "visa",
"installments": 1,
"description": "Pedido de ejemplo 123"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/card/pay');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"amount": 99.9,
"external_id": "pedido-ejemplo-123",
"buyer_name": "Cliente de Ejemplo",
"buyer_email": "cliente@example.com",
"buyer_cpf": "52998224725",
"card_token": "REEMPLACE_CON_TOKEN_DE_UN_SOLO_USO",
"payment_method_id": "visa",
"installments": 1,
"description": "Pedido de ejemplo 123"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"amount": 99.9,
"external_id": "pedido-ejemplo-123",
"buyer_name": "Cliente de Ejemplo",
"buyer_email": "cliente@example.com",
"buyer_cpf": "52998224725",
"card_token": "REEMPLACE_CON_TOKEN_DE_UN_SOLO_USO",
"payment_method_id": "visa",
"installments": 1,
"description": "Pedido de ejemplo 123"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/card/pay",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"amount": 99.9,
"external_id": "pedido-ejemplo-123",
"buyer_name": "Cliente de Ejemplo",
"buyer_email": "cliente@example.com",
"buyer_cpf": "52998224725",
"card_token": "REEMPLACE_CON_TOKEN_DE_UN_SOLO_USO",
"payment_method_id": "visa",
"installments": 1,
"description": "Pedido de ejemplo 123"
}
/api/v1/checkout/methods
Credenciales
Scope: checkout Producto: checkout Devuelve únicamente los medios de pago homologados y disponibles para la cuenta autenticada.
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/methods", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/methods');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/checkout/methods",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/checkout/report
Credenciales
Scope: checkout Producto: checkout Devuelve métricas agregadas de los enlaces de pago y pedidos de la cuenta autenticada.
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/report", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/report');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/checkout/report",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/checkout/products
Credenciales
Scope: checkout Producto: checkout Lista los productos activos y archivados del catálogo de la cuenta.
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/products", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/products');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/checkout/products",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/checkout/products
Credenciales
Scope: checkout Producto: checkout Crea un producto del catálogo. Un medio que exige identificación externa del producto solo puede habilitarse cuando se informa provider_product_id.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/products", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Plan mensual",
"price": "49.90",
"currency": "BRL",
"payment_methods": [
"PIX"
]
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/products');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"name": "Plan mensual",
"price": "49.90",
"currency": "BRL",
"payment_methods": [
"PIX"
]
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"name": "Plan mensual",
"price": "49.90",
"currency": "BRL",
"payment_methods": [
"PIX"
]
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/checkout/products",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"name": "Plan mensual",
"price": "49.90",
"currency": "BRL",
"payment_methods": [
"PIX"
]
}
/api/v1/checkout/products/{productId}
Credenciales
Scope: checkout Producto: checkout Devuelve un producto del catálogo perteneciente a la cuenta autenticada.
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/products/REEMPLAZA_CON_PRODUCT_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/products/REEMPLAZA_CON_PRODUCT_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/checkout/products/REEMPLAZA_CON_PRODUCT_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/checkout/products/{productId}
Credenciales
Scope: checkout Producto: checkout Actualiza una versión del producto. Envíe la version devuelta por el endpoint de consulta para impedir sobrescrituras concurrentes.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/products/REEMPLAZA_CON_PRODUCT_ID", {
method: 'PUT',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Plan mensual actualizado",
"price": "59.90",
"currency": "BRL",
"payment_methods": [
"PIX"
],
"version": 1
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/products/REEMPLAZA_CON_PRODUCT_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"name": "Plan mensual actualizado",
"price": "59.90",
"currency": "BRL",
"payment_methods": [
"PIX"
],
"version": 1
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"name": "Plan mensual actualizado",
"price": "59.90",
"currency": "BRL",
"payment_methods": [
"PIX"
],
"version": 1
}
''')
response = requests.request(
'PUT',
"https://api.nodexhub.com.br/api/v1/checkout/products/REEMPLAZA_CON_PRODUCT_ID",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"name": "Plan mensual actualizado",
"price": "59.90",
"currency": "BRL",
"payment_methods": [
"PIX"
],
"version": 1
}
/api/v1/checkout/products/{productId}
Credenciales
Scope: checkout Producto: checkout Archiva el producto y sus enlaces activos. Exige Idempotency-Key y no acepta body.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/products/REEMPLAZA_CON_PRODUCT_ID", {
method: 'DELETE',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/products/REEMPLAZA_CON_PRODUCT_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
}
response = requests.request(
'DELETE',
"https://api.nodexhub.com.br/api/v1/checkout/products/REEMPLAZA_CON_PRODUCT_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/checkout/links
Credenciales
Scope: checkout Producto: checkout Lista los enlaces de pago, sus estados y métricas para la cuenta autenticada.
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/links", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/links');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/checkout/links",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/checkout/links
Credenciales
Scope: checkout Producto: checkout Crea un enlace independiente o asociado a un producto. Combine el payment_path devuelto con el dominio VexusPay de la cuenta.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/links", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"title": "Pago de servicio",
"amount": "49.90",
"currency": "BRL",
"payment_methods": [
"PIX"
]
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/links');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"title": "Pago de servicio",
"amount": "49.90",
"currency": "BRL",
"payment_methods": [
"PIX"
]
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"title": "Pago de servicio",
"amount": "49.90",
"currency": "BRL",
"payment_methods": [
"PIX"
]
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/checkout/links",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"title": "Pago de servicio",
"amount": "49.90",
"currency": "BRL",
"payment_methods": [
"PIX"
]
}
/api/v1/checkout/links/{linkId}
Credenciales
Scope: checkout Producto: checkout Devuelve la configuración y el payment_path de un enlace perteneciente a la cuenta autenticada.
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/checkout/links/{linkId}
Credenciales
Scope: checkout Producto: checkout Actualiza una versión del enlace. Envíe la version devuelta por el endpoint de consulta para impedir sobrescrituras concurrentes.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID", {
method: 'PUT',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"title": "Pago de servicio actualizado",
"amount": "59.90",
"currency": "BRL",
"payment_methods": [
"PIX"
],
"version": 1
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"title": "Pago de servicio actualizado",
"amount": "59.90",
"currency": "BRL",
"payment_methods": [
"PIX"
],
"version": 1
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"title": "Pago de servicio actualizado",
"amount": "59.90",
"currency": "BRL",
"payment_methods": [
"PIX"
],
"version": 1
}
''')
response = requests.request(
'PUT',
"https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"title": "Pago de servicio actualizado",
"amount": "59.90",
"currency": "BRL",
"payment_methods": [
"PIX"
],
"version": 1
}
/api/v1/checkout/links/{linkId}/archive
Credenciales
Scope: checkout Producto: checkout Archiva el enlace e impide nuevos pagos. Exige Idempotency-Key y no acepta body.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID/archive", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID/archive');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
}
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID/archive",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/checkout/links/{linkId}/cancel
Credenciales
Scope: checkout Producto: checkout Cancela el enlace con un motivo auditable e impide nuevos pagos. Exige Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID/cancel", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"reason": "Cancelación solicitada por el cliente"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID/cancel');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"reason": "Cancelación solicitada por el cliente"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"reason": "Cancelación solicitada por el cliente"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/checkout/links/REEMPLAZA_CON_LINK_ID/cancel",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"reason": "Cancelación solicitada por el cliente"
}
Catálogo, billeteras, saldos, depósitos, retiros, swaps, transferencias internas y conversiones según las capacidades actuales.

/api/v1/crypto/networks
Credenciales
Scope: cashin Producto: crypto Lista BSC y TRON con su estado de mantenimiento y sus capacidades de depósito, retiro y swap.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/networks", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/networks');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/networks",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/assets
Credenciales
Scope: cashin Producto: crypto Lista los activos por red, su precisión decimal y las capacidades habilitadas actualmente.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/assets", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/assets');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/assets",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/swap-pairs
Credenciales
Scope: cashin Producto: crypto Lista los pares disponibles en la misma red y el par cross-chain USDT TRC-20 ↔ USDT BEP-20.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/swap-pairs", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/swap-pairs');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/swap-pairs",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/wallets
Credenciales
Scope: cashin Producto: crypto Lista únicamente las billeteras de la cuenta o del contexto de custodia autenticado.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/wallets", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/wallets');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/wallets",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/wallets
Credenciales
Scope: cashin Producto: crypto Crea o reutiliza de forma idempotente la billetera HD BSC o TRON de la cuenta. Los tokens de la misma red comparten la misma dirección.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/wallets", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"network": "BSC"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/wallets');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"network": "BSC"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"network": "BSC"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/crypto/wallets",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"network": "BSC"
}
/api/v1/crypto/wallets/{walletId}
Credenciales
Scope: cashin Producto: crypto Devuelve una billetera Vexus perteneciente a la cuenta autenticada.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/wallets/REEMPLAZA_CON_WALLET_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/wallets/REEMPLAZA_CON_WALLET_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/wallets/REEMPLAZA_CON_WALLET_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/wallets/{walletId}/balances
Credenciales
Scope: cashin Producto: crypto Devuelve los saldos contable, disponible, reservado, pendiente y on-chain como cadenas enteras en la unidad mínima del activo.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/wallets/REEMPLAZA_CON_WALLET_ID/balances", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/wallets/REEMPLAZA_CON_WALLET_ID/balances');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/wallets/REEMPLAZA_CON_WALLET_ID/balances",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/wallets/{walletId}/transactions
Credenciales
Scope: cashin Producto: crypto Lista los depósitos y retiros recientes de la billetera.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/wallets/REEMPLAZA_CON_WALLET_ID/transactions", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/wallets/REEMPLAZA_CON_WALLET_ID/transactions');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/wallets/REEMPLAZA_CON_WALLET_ID/transactions",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/deposits
Credenciales
Scope: cashin Producto: crypto Lista únicamente los depósitos vinculados a billeteras de la cuenta o del contexto de custodia autenticado.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/deposits", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/deposits');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/deposits",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/deposits/{depositId}
Credenciales
Scope: cashin Producto: crypto Devuelve el estado del depósito y la cantidad de confirmaciones. CREDITED o HTTP 200 no sustituye la verificación de un estado terminal.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/deposits/REEMPLAZA_CON_DEPOSIT_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/deposits/REEMPLAZA_CON_DEPOSIT_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/deposits/REEMPLAZA_CON_DEPOSIT_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/withdrawals/quote
Credenciales
Scope: cashout Producto: crypto Crea una cotización autoritativa con tarifas, importe neto, débito total y validez en *_units. En modo GROSS, el importe informado es el límite autorizado y las tarifas se descuentan de él. Esta llamada no mueve fondos.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/withdrawals/quote", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"network": "BSC",
"asset": "USDT_BSC",
"destination_address": "REEMPLACE_CON_DIRECCION_BSC",
"amount_units": "1000000",
"amount_mode": "GROSS"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/withdrawals/quote');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"network": "BSC",
"asset": "USDT_BSC",
"destination_address": "REEMPLACE_CON_DIRECCION_BSC",
"amount_units": "1000000",
"amount_mode": "GROSS"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"network": "BSC",
"asset": "USDT_BSC",
"destination_address": "REEMPLACE_CON_DIRECCION_BSC",
"amount_units": "1000000",
"amount_mode": "GROSS"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/crypto/withdrawals/quote",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"network": "BSC",
"asset": "USDT_BSC",
"destination_address": "REEMPLACE_CON_DIRECCION_BSC",
"amount_units": "1000000",
"amount_mode": "GROSS"
}
/api/v1/crypto/withdrawals
Credenciales
Scope: cashout Producto: crypto Reserva los fondos y programa el retiro mediante quote_id. HTTP 202 no confirma una transacción blockchain; siga el recurso hasta que alcance un estado terminal.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/withdrawals", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"quote_id": "00000000-0000-4000-8000-000000000002"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/withdrawals');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"quote_id": "00000000-0000-4000-8000-000000000002"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"quote_id": "00000000-0000-4000-8000-000000000002"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/crypto/withdrawals",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"quote_id": "00000000-0000-4000-8000-000000000002"
}
/api/v1/crypto/withdrawals/{withdrawalId}
Credenciales
Scope: cashout Producto: crypto Devuelve el estado, el TXID y el costo real de red cuando estén disponibles.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/withdrawals/REEMPLAZA_CON_WITHDRAWAL_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/withdrawals/REEMPLAZA_CON_WITHDRAWAL_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/withdrawals/REEMPLAZA_CON_WITHDRAWAL_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/swaps/quote
Credenciales
Scope: cashout Producto: crypto Crea una cotización autoritativa same-chain o cross-chain de USDT usando únicamente los pares publicados.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/swaps/quote", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"asset_in": "USDT_TRC20",
"asset_out": "USDT_BSC",
"amount_in_units": "1000000",
"slippage_bps": 50
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/swaps/quote');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"asset_in": "USDT_TRC20",
"asset_out": "USDT_BSC",
"amount_in_units": "1000000",
"slippage_bps": 50
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"asset_in": "USDT_TRC20",
"asset_out": "USDT_BSC",
"amount_in_units": "1000000",
"slippage_bps": 50
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/crypto/swaps/quote",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"asset_in": "USDT_TRC20",
"asset_out": "USDT_BSC",
"amount_in_units": "1000000",
"slippage_bps": 50
}
/api/v1/crypto/swaps
Credenciales
Scope: cashout Producto: crypto Reserva los fondos y programa el swap mediante quote_id. HTTP 202 no confirma la liquidación.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/swaps", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"quote_id": "00000000-0000-4000-8000-000000000003"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/swaps');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"quote_id": "00000000-0000-4000-8000-000000000003"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"quote_id": "00000000-0000-4000-8000-000000000003"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/crypto/swaps",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"quote_id": "00000000-0000-4000-8000-000000000003"
}
/api/v1/crypto/swaps/{swapId}
Credenciales
Scope: cashout Producto: crypto Devuelve los importes realizados, los hashes de transacción y el estado conciliado del swap.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/swaps/REEMPLAZA_CON_SWAP_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/swaps/REEMPLAZA_CON_SWAP_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/swaps/REEMPLAZA_CON_SWAP_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/internal-transfers
Credenciales
Scope: cashout Producto: crypto Liquida entre dos usuarios VexusPay en el ledger de Vexus. No crea una transacción blockchain ni un TXID. Informe exactamente un destinatario: recipient_custody_subject es el modo recomendado para White Labels y debe identificar un subject ACTIVE existente en la misma White Label, sin creación automática; recipient_external_user_id permanece solo por compatibilidad.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/internal-transfers", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"recipient_custody_subject": "usuario_00000002",
"network": "TRON",
"asset": "USDT_TRC20",
"amount_units": "1000000"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/internal-transfers');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"recipient_custody_subject": "usuario_00000002",
"network": "TRON",
"asset": "USDT_TRC20",
"amount_units": "1000000"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"recipient_custody_subject": "usuario_00000002",
"network": "TRON",
"asset": "USDT_TRC20",
"amount_units": "1000000"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/crypto/internal-transfers",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"recipient_custody_subject": "usuario_00000002",
"network": "TRON",
"asset": "USDT_TRC20",
"amount_units": "1000000"
}
/api/v1/crypto/conversions/capabilities
Credenciales
Scope: cashin Producto: crypto Devuelve las direcciones, los activos, las redes y los controles operativos disponibles sin crear una operación.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/conversions/capabilities", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/conversions/capabilities');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/conversions/capabilities",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/conversions/markets
Credenciales
Scope: cashin Producto: crypto Devuelve precios indicativos del socio; no son cotizaciones ejecutables.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/conversions/markets", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/conversions/markets');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/conversions/markets",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/conversions
Credenciales
Scope: cashin Producto: crypto Lista las direcciones externas del socio pertenecientes a la cuenta.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/conversions", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/conversions');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/conversions",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/conversions/deposit-address
Credenciales
Scope: cashin Producto: crypto MAINTENANCE Reservado para el flujo cripto a BRL. Las nuevas ventas están en mantenimiento; no use esta ruta hasta que capabilities indique que la dirección está disponible.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/conversions/deposit-address", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"asset": "USDT",
"network": "TRX"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/conversions/deposit-address');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"asset": "USDT",
"network": "TRX"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"asset": "USDT",
"network": "TRX"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/crypto/conversions/deposit-address",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"asset": "USDT",
"network": "TRX"
}
/api/v1/crypto/conversion-operations
Credenciales
Scope: cashout Producto: crypto Lista las operaciones de conversión del contexto autenticado, incluidos sus estados históricos.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/conversion-operations", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/conversion-operations');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/conversion-operations",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/crypto/conversions/quote
Credenciales
Scope: cashout Producto: crypto Crea una cotización ejecutable FIAT_TO_CRYPTO únicamente cuando capabilities habilita el activo y la red. Se exige un destino externo. CRYPTO_TO_FIAT está en mantenimiento y no se acepta en esta versión del request.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/conversions/quote", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"direction": "FIAT_TO_CRYPTO",
"asset": "USDT",
"network": "TRX",
"brl_amount_minor": "10000",
"destination_address": "REEMPLACE_CON_DIRECCION_TRC20"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/conversions/quote');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"direction": "FIAT_TO_CRYPTO",
"asset": "USDT",
"network": "TRX",
"brl_amount_minor": "10000",
"destination_address": "REEMPLACE_CON_DIRECCION_TRC20"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"direction": "FIAT_TO_CRYPTO",
"asset": "USDT",
"network": "TRX",
"brl_amount_minor": "10000",
"destination_address": "REEMPLACE_CON_DIRECCION_TRC20"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/crypto/conversions/quote",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"direction": "FIAT_TO_CRYPTO",
"asset": "USDT",
"network": "TRX",
"brl_amount_minor": "10000",
"destination_address": "REEMPLACE_CON_DIRECCION_TRC20"
}
/api/v1/crypto/conversions/{conversionId}/confirm
Credenciales
Scope: cashout Producto: crypto Confirma una cotización FIAT_TO_CRYPTO vigente. HTTP 202 indica únicamente la admisión; siga la conversión hasta que alcance un estado terminal.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/conversions/REEMPLAZA_CON_CONVERSION_ID/confirm", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/conversions/REEMPLAZA_CON_CONVERSION_ID/confirm');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/crypto/conversions/REEMPLAZA_CON_CONVERSION_ID/confirm",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
/api/v1/crypto/conversions/{conversionId}
Credenciales
Scope: cashout Producto: crypto Devuelve el estado auditable de la conversión.
const response = await fetch("https://api.nodexhub.com.br/api/v1/crypto/conversions/REEMPLAZA_CON_CONVERSION_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/crypto/conversions/REEMPLAZA_CON_CONVERSION_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/crypto/conversions/REEMPLAZA_CON_CONVERSION_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
Pagos con tarjeta tokenizada y emisión, consulta, recarga, transacciones y controles de estado de tarjetas virtuales autorizadas.
/api/v1/cards/products
Credenciales
Scope: cards.read Producto: virtual.cards Devuelve únicamente los tipos de tarjeta VexusPay habilitados actualmente para emisión. El catálogo es dinámico: no conserve la disponibilidad como autorización permanente. No expone códigos técnicos del emisor.
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/products", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/products');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/cards/products",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/cards/rates
Credenciales
Scope: cards.read Producto: virtual.cards Devuelve las tarifas comerciales dinámicas de la cuenta para emisión, recarga y procesamiento, con origen GLOBAL, PLAN o USER. Consulte este endpoint antes de iniciar una operación. Las tarifas del emisor se confirman únicamente al confirmar la emisión o la recarga.
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/rates", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/rates');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/cards/rates",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/cards/capabilities
Solo producción Credenciales
Scope: cards.read Producto: virtual.cards PUBLISHED PRODUCTION ONLY Devuelve las acciones disponibles actualmente para la cuenta e indica si X-Vexus-External-User-Id es obligatorio. Consúltelo inmediatamente antes de mostrar o iniciar una acción; no prometa emisión, recarga ni control cuando la acción correspondiente sea false.
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/capabilities", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/capabilities');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/cards/capabilities",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/cards
Credenciales
Scope: cards.read Producto: virtual.cards Cuando external_user_header_required=true, lista únicamente las tarjetas del usuario externo informado, con saldo, estado, marca y últimos cuatro dígitos. Nunca devuelve PAN, CVV ni OTP.
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'X-Vexus-External-User-Id: witevexus:user:1001',
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'X-Vexus-External-User-Id': 'witevexus:user:1001',
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/cards",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/cards
Credenciales
Scope: cards.write Producto: virtual.cards Emite una tarjeta solo cuando products y capabilities habilitan la acción. La emisión exige Idempotency-Key. La tarjeta prepaga en USD se financia desde la tesorería compartida del emisor abastecida en USDT; no debita ni convierte automáticamente la billetera Vexus Crypto del usuario final y no existe una operación atómica cripto a tarjeta. La White Label debe reservar y debitar su propio ledger de usuario por separado. El intervalo técnico actual es de USD 10.00 a USD 1000000.00. Cuando sea obligatorio, external_user_id en el body debe coincidir con X-Vexus-External-User-Id. No reintente una respuesta ambigua con una clave nueva.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"product_code": "vexus_international",
"amount": "10.00",
"name_on_card": "CLIENTE DE EJEMPLO",
"external_user_id": "witevexus:user:1001"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'X-Vexus-External-User-Id: witevexus:user:1001',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"product_code": "vexus_international",
"amount": "10.00",
"name_on_card": "CLIENTE DE EJEMPLO",
"external_user_id": "witevexus:user:1001"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"product_code": "vexus_international",
"amount": "10.00",
"name_on_card": "CLIENTE DE EJEMPLO",
"external_user_id": "witevexus:user:1001"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/cards",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"product_code": "vexus_international",
"amount": "10.00",
"name_on_card": "CLIENTE DE EJEMPLO",
"external_user_id": "witevexus:user:1001"
}
/api/v1/cards/{cardId}
Credenciales
Scope: cards.read Producto: virtual.cards Sincroniza el saldo y el estado actuales de la tarjeta del usuario externo autenticado. Nunca devuelve PAN, CVV ni OTP.
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'X-Vexus-External-User-Id: witevexus:user:1001',
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'X-Vexus-External-User-Id': 'witevexus:user:1001',
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/cards/{cardId}
Credenciales
Scope: cards.write Producto: virtual.cards Cancela permanentemente una tarjeta solo mientras capabilities.actions.cancel=true. La acción puede devolver su saldo según las reglas de la tarjeta y exige Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID", {
method: 'DELETE',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'X-Vexus-External-User-Id: witevexus:user:1001',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'DELETE',
"https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
/api/v1/cards/{cardId}/fund
Credenciales
Scope: cards.write Producto: virtual.cards Añade fondos prepagos en USD solo mientras capabilities.actions.fund=true. La recarga usa la tesorería compartida del emisor abastecida en USDT y no debita ni convierte automáticamente la billetera Vexus Crypto del usuario final. La White Label debe reservar y debitar su propio ledger por separado. Exige Idempotency-Key, acepta actualmente de USD 10.00 a USD 1000000.00 y devuelve las tarifas confirmadas.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/fund", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"amount": "10.00"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/fund');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'X-Vexus-External-User-Id: witevexus:user:1001',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"amount": "10.00"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"amount": "10.00"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/fund",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"amount": "10.00"
}
/api/v1/cards/{cardId}/freeze
Credenciales
Scope: cards.write Producto: virtual.cards Congela temporalmente una tarjeta activa solo mientras capabilities.actions.freeze=true. Exige Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/freeze", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/freeze');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'X-Vexus-External-User-Id: witevexus:user:1001',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/freeze",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
/api/v1/cards/{cardId}/unfreeze
Credenciales
Scope: cards.write Producto: virtual.cards Reactiva una tarjeta congelada solo mientras capabilities.actions.unfreeze=true. Exige Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/unfreeze", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/unfreeze');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'X-Vexus-External-User-Id: witevexus:user:1001',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/unfreeze",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
/api/v1/cards/{cardId}/transactions
Credenciales
Scope: cards.read Producto: virtual.cards Devuelve un snapshot de transacciones y saldo para visualización y conciliación auxiliar. El contrato del emisor no define identificador estable, paginación, webhook ni correlación completa del ciclo de autorización, captura, reversión, reembolso y chargeback. No use esta respuesta como fuente contable. Nunca devuelve OTP, PAN ni CVV.
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/transactions", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/transactions');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'X-Vexus-External-User-Id: witevexus:user:1001',
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'X-Vexus-External-User-Id': 'witevexus:user:1001',
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/transactions",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/cards/{cardId}/display-sessions
Credenciales
Scope: cards.write Producto: virtual.cards Crea una URL HTTPS de un solo uso, válida durante 120 segundos, que muestra PAN y CVV directamente en el navegador del usuario. Abra display_url directamente en un iframe cuyo origen coincida exactamente con allowed_origin; recargar o reutilizar falla. Nunca haga proxy, fetch, captura, persistencia ni log de la URL. Cuando sea obligatorio, X-Vexus-External-User-Id identifica al titular y external_user_id en el body, si se envía, debe coincidir. Recovery no vuelve a exponer display_url; tras la expiración cree otra sesión con una nueva Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/display-sessions", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"allowed_origin": "https://witevexus.fun",
"external_user_id": "witevexus:user:1001"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/display-sessions');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'X-Vexus-External-User-Id: witevexus:user:1001',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"allowed_origin": "https://witevexus.fun",
"external_user_id": "witevexus:user:1001"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"allowed_origin": "https://witevexus.fun",
"external_user_id": "witevexus:user:1001"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/cards/REEMPLAZA_CON_CARD_ID/display-sessions",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"allowed_origin": "https://witevexus.fun",
"external_user_id": "witevexus:user:1001"
}
/api/v1/cards/webhooks
Credenciales
Scope: cards.read Producto: virtual.cards Lista únicamente los endpoints de esta cuenta suscritos a virtual_card.otp.received. Nunca devuelve el secreto de firma.
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/webhooks", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/webhooks');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/cards/webhooks",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/cards/webhooks
Credenciales
Scope: cards.write Producto: virtual.cards Crea un endpoint HTTPS para virtual_card.otp.received, el único evento público de tarjeta virtual. signing_secret aparece únicamente en esta respuesta y debe permanecer en el almacén seguro del backend. Los eventos usan createdAt RFC 3339 UTC y HMAC sobre el body bruto. Exige Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/webhooks", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"label": "OTP de Producción",
"url": "https://api.exemplo.com/webhooks/vexus"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/webhooks');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"label": "OTP de Producción",
"url": "https://api.exemplo.com/webhooks/vexus"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"label": "OTP de Producción",
"url": "https://api.exemplo.com/webhooks/vexus"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/cards/webhooks",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"label": "OTP de Producción",
"url": "https://api.exemplo.com/webhooks/vexus"
}
/api/v1/cards/webhooks/{webhookId}/rotate-secret
Solo producción Credenciales
Scope: cards.write Producto: virtual.cards PUBLISHED PRODUCTION ONLY Revoca inmediatamente el secreto anterior sin ventana de superposición y devuelve el nuevo signing_secret una sola vez. Coordine la actualización del receptor. Envíe un objeto JSON vacío e Idempotency-Key. Recovery nunca vuelve a exponer el secreto.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/webhooks/REEMPLAZA_CON_WEBHOOK_ID/rotate-secret", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/webhooks/REEMPLAZA_CON_WEBHOOK_ID/rotate-secret');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/cards/webhooks/REEMPLAZA_CON_WEBHOOK_ID/rotate-secret",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
/api/v1/cards/webhooks/{webhookId}/activate
Solo producción Credenciales
Scope: cards.write Producto: virtual.cards PUBLISHED PRODUCTION ONLY Reanuda las nuevas entregas de virtual_card.otp.received a un endpoint de la cuenta. Envíe un objeto JSON vacío e Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/webhooks/REEMPLAZA_CON_WEBHOOK_ID/activate", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/webhooks/REEMPLAZA_CON_WEBHOOK_ID/activate');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/cards/webhooks/REEMPLAZA_CON_WEBHOOK_ID/activate",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
/api/v1/cards/webhooks/{webhookId}/deactivate
Solo producción Credenciales
Scope: cards.write Producto: virtual.cards PUBLISHED PRODUCTION ONLY Pausa las nuevas entregas de virtual_card.otp.received sin eliminar el historial. Envíe un objeto JSON vacío e Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/cards/webhooks/REEMPLAZA_CON_WEBHOOK_ID/deactivate", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/cards/webhooks/REEMPLAZA_CON_WEBHOOK_ID/deactivate');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/cards/webhooks/REEMPLAZA_CON_WEBHOOK_ID/deactivate",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
Consulta autorizada del saldo, límites financieros efectivos, tarifas y recuperación idempotente de operaciones.
/api/v1/account/limits
Credenciales
Scope: account.read Producto: account Devuelve los límites efectivos de la cuenta en BRL: agregado, entrada y salida PIX, boleto y transferencia interna. source indica si la regla procede de la política GLOBAL o de una personalización USER.
const response = await fetch("https://api.nodexhub.com.br/api/v1/account/limits", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/account/limits');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/account/limits",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/account/fees
Credenciales
Scope: account.read Producto: account Devuelve las tarifas comerciales efectivas para PIX, boleto, tarjetas, tarjetas virtuales, transferencias internas y reglas por activo/red cripto. En cripto, la cotización de la operación es autoritativa para el costo de red, la tarifa de servicio, el importe neto y el débito total.
const response = await fetch("https://api.nodexhub.com.br/api/v1/account/fees", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/account/fees');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/account/fees",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/account/operations/by-idempotency/{idempotencyKey}
Solo producción Credenciales
Scope: account.read Producto: DYNAMIC_FROM_ORIGINAL_OPERATION PUBLISHED PRODUCTION ONLY Devuelve el estado sanitizado de la intención creada por la misma credencial de Producción. Exige account.read y valida dinámicamente el producto y los entitlements originales. Después de un timeout u OPERATION_STATUS_AMBIGUOUS, informe la operación y los headers de contexto originales. En cripto, una intención PENDING reciente sigue en curso; después de 60 segundos se promueve de forma conservadora a AMBIGUOUS con reconciliation_required=true. Deje de consultar esta ruta de recuperación al recibir ACCEPTED. wallet.create, withdrawal.quote, swap.quote, conversion.address y conversion.quote finalizan su propia intención con terminal=true; siga withdrawal.execute y swap.execute mediante el GET autoritativo de resource_id. Persista conversionId antes de confirmar una conversión porque la recuperación puede devolver ACCEPTED sin resource_id; luego consulte la conversión original. ACCEPTED nunca demuestra liquidación ni autoriza una nueva intención financiera. Recovery de display y webhook nunca vuelve a exponer display_url ni signing_secret. Un replay exacto del POST original conserva su respuesta durante 24 horas; un display expirado exige otra sesión y clave.
const response = await fetch("https://api.nodexhub.com.br/api/v1/account/operations/by-idempotency/REEMPLAZA_CON_IDEMPOTENCY_KEY", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'X-Vexus-External-User-Id': 'witevexus:user:1001',
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/account/operations/by-idempotency/REEMPLAZA_CON_IDEMPOTENCY_KEY');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'X-Vexus-External-User-Id: witevexus:user:1001',
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'X-Vexus-External-User-Id': 'witevexus:user:1001',
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/account/operations/by-idempotency/REEMPLAZA_CON_IDEMPOTENCY_KEY",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/account/ted
Solo producción Credenciales
Scope: account.read Producto: account PUBLISHED PRODUCTION ONLY Devuelve la agencia, la cuenta, el dígito, la institución y el titular de la cuenta TED nominal del usuario autenticado sin exponer credenciales del proveedor.
const response = await fetch("https://api.nodexhub.com.br/api/v1/account/ted", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/account/ted');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/account/ted",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/account/balance
Solo producción Credenciales
Scope: account.read Producto: account PUBLISHED PRODUCTION ONLY Devuelve el saldo aislado en BRL de la cuenta nominal del usuario autenticado.
const response = await fetch("https://api.nodexhub.com.br/api/v1/account/balance", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/account/balance');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/account/balance",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/account/transactions
Solo producción Credenciales
Scope: account.read Producto: account PUBLISHED PRODUCTION ONLY Devuelve el extracto de la cuenta nominal para un intervalo de hasta 31 días con paginación y aislamiento por titular.
const response = await fetch("https://api.nodexhub.com.br/api/v1/account/transactions", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/account/transactions');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/account/transactions",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/nominal
Solo producción Credenciales
Scope: account.read Producto: account PUBLISHED PRODUCTION ONLY Devuelve la cuenta nominal activa y la clave PIX vinculada al usuario autenticado. Nunca expone credenciales del proveedor.
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/nominal",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/nominal/ted
Solo producción Credenciales
Scope: account.read Producto: account PUBLISHED PRODUCTION ONLY Devuelve la agencia, la cuenta, el dígito y la institución de la cuenta nominal.
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal/ted", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal/ted');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/nominal/ted",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/nominal/balance
Solo producción Credenciales
Scope: account.read Producto: account PUBLISHED PRODUCTION ONLY Devuelve el saldo en BRL de la cuenta nominal del usuario autenticado.
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal/balance", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal/balance');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/nominal/balance",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/nominal/transactions
Solo producción Credenciales
Scope: account.read Producto: account PUBLISHED PRODUCTION ONLY Devuelve depósitos, transferencias salientes y otros movimientos de la cuenta nominal para un intervalo de hasta 31 días.
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal/transactions", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal/transactions');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/nominal/transactions",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/nominal/pix-key
Solo producción Credenciales
Scope: account.read Producto: account PUBLISHED PRODUCTION ONLY Devuelve la clave PIX nominal aprovisionada previamente.
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal/pix-key", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal/pix-key');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/nominal/pix-key",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/nominal/operations/{operationId}
Solo producción Credenciales
Scope: account.read Producto: account PUBLISHED PRODUCTION ONLY Devuelve el resultado idempotente de una operación nominal de QR o salida PIX.
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal/operations/REEMPLAZA_CON_OPERATION_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal/operations/REEMPLAZA_CON_OPERATION_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/nominal/operations/REEMPLAZA_CON_OPERATION_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/balance
Credenciales
Scope: cashin Producto: pix.cash_in Devuelve el saldo expuesto por el contrato de la cuenta. Envíe un objeto JSON vacío.
const response = await fetch("https://api.nodexhub.com.br/api/v1/balance", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/balance');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/balance",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
/api/v1/nominal/pix-key
Solo producción Credenciales
Scope: pix.cash_in Producto: pix.cash_in PUBLISHED PRODUCTION ONLY Solicita una cuenta virtual al proveedor bancario homologado con clave aleatoria, correo o CNPJ. Exige Idempotency-Key y una solicitud nominal aprobada administrativamente.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal/pix-key", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal/pix-key');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
}
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/nominal/pix-key",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/nominal/qr/dynamic
Solo producción Credenciales
Scope: pix.cash_in Producto: pix.cash_in PUBLISHED PRODUCTION ONLY Crea un cobro QR dinámico en la cuenta nominal. Exige Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal/qr/dynamic", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal/qr/dynamic');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
}
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/nominal/qr/dynamic",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/nominal/qr/static
Solo producción Credenciales
Scope: pix.cash_in Producto: pix.cash_in PUBLISHED PRODUCTION ONLY Crea un QR estático en la cuenta nominal. Exige Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal/qr/static", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal/qr/static');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
}
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/nominal/qr/static",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/nominal/qr/decode
Solo producción Credenciales
Scope: pix.qr_pay Producto: pix.qr_pay PUBLISHED PRODUCTION ONLY Lee y valida un QR PIX mediante el proveedor bancario homologado sin ejecutar el pago.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal/qr/decode", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal/qr/decode');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
}
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/nominal/qr/decode",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/nominal/qr/pay
Solo producción Credenciales
Scope: pix.qr_pay Producto: pix.qr_pay PUBLISHED PRODUCTION ONLY Paga un QR PIX desde la cuenta nominal. El procesamiento es asíncrono y exige Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal/qr/pay", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal/qr/pay');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
}
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/nominal/qr/pay",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/nominal/pix-out
Solo producción Credenciales
Scope: pix.cash_out Producto: pix.cash_out PUBLISHED PRODUCTION ONLY Envía PIX desde la cuenta nominal. La confirmación llega por webhook y la solicitud exige Idempotency-Key.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/nominal/pix-out", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/nominal/pix-out');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
}
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/nominal/pix-out",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
Contrato White Label de la cuenta, incluidos plan, adicionales, tarifas, facturación y estado de acceso.
/api/v1/white-label
Credenciales
Scope: account.read Producto: white_label Devuelve en una respuesta el estado del contrato, el plan, los adicionales, la facturación, las tarifas y los productos habilitados. Este endpoint de consulta sigue disponible cuando la mensualidad está vencida.
const response = await fetch("https://api.nodexhub.com.br/api/v1/white-label", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/white-label');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/white-label",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/white-label/plan
Credenciales
Scope: account.read Producto: white_label Devuelve el plan y los adicionales contratados por la cuenta autenticada.
const response = await fetch("https://api.nodexhub.com.br/api/v1/white-label/plan", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/white-label/plan');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/white-label/plan",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/white-label/fees
Credenciales
Scope: account.read Producto: white_label Devuelve las tarifas comerciales del plan, incluidas las de PIX, boleto, tarjeta virtual y las reglas por activo/red cripto.
const response = await fetch("https://api.nodexhub.com.br/api/v1/white-label/fees", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/white-label/fees');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/white-label/fees",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/white-label/billing
Credenciales
Scope: account.read Producto: white_label Devuelve la mensualidad, la tarifa de alta, el importe pendiente, el vencimiento y el estado de acceso. No crea un cobro ni mueve fondos.
const response = await fetch("https://api.nodexhub.com.br/api/v1/white-label/billing", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/white-label/billing');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/white-label/billing",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/white-label/status
Credenciales
Scope: account.read Producto: white_label Devuelve únicamente el estado del contrato y si las operaciones financieras mediante la API están habilitadas.
const response = await fetch("https://api.nodexhub.com.br/api/v1/white-label/status", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/white-label/status');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/white-label/status",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/white-label/nominal
Solo producción Credenciales
Scope: account.read Producto: white_label Lista únicamente las solicitudes de la cuenta White Label. Los documentos aparecen enmascarados y los datos de identidad proceden del perfil central de VexusPay.
const response = await fetch("https://api.nodexhub.com.br/api/v1/white-label/nominal", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/white-label/nominal');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/white-label/nominal",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/white-label/nominal
Solo producción Credenciales
Scope: account.read Producto: white_label Envía una solicitud para análisis administrativo. No se aceptan nombre, CPF ni CNPJ en el body; VexusPay utiliza únicamente el KYC aprobado del titular.
const response = await fetch("https://api.nodexhub.com.br/api/v1/white-label/nominal", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"reason": "Cuenta operativa de mi marca para recibir pagos PIX."
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/white-label/nominal');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"reason": "Cuenta operativa de mi marca para recibir pagos PIX."
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"reason": "Cuenta operativa de mi marca para recibir pagos PIX."
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/white-label/nominal",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"reason": "Cuenta operativa de mi marca para recibir pagos PIX."
}
/api/v1/white-label/nominal/bind
Solo producción Credenciales
Scope: account.read Producto: white_label Vincula el identificador del cliente White Label a una cuenta nominal Vexus activa. El identificador se aísla por White Label.
const response = await fetch("https://api.nodexhub.com.br/api/v1/white-label/nominal/bind", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"nominal_user_id": 1001,
"external_subject": "cliente:1001"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/white-label/nominal/bind');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"nominal_user_id": 1001,
"external_subject": "cliente:1001"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"nominal_user_id": 1001,
"external_subject": "cliente:1001"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/white-label/nominal/bind",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"nominal_user_id": 1001,
"external_subject": "cliente:1001"
}
/api/v1/white-label/nominal/{requestId}
Solo producción Credenciales
Scope: account.read Producto: white_label Devuelve una solicitud de la cuenta White Label sin exponer el documento completo ni credenciales de la cuenta.
const response = await fetch("https://api.nodexhub.com.br/api/v1/white-label/nominal/REEMPLAZA_CON_REQUEST_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/white-label/nominal/REEMPLAZA_CON_REQUEST_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/white-label/nominal/REEMPLAZA_CON_REQUEST_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/white-label/nominal/{requestId}
Solo producción Credenciales
Scope: account.read Producto: white_label Cancela una solicitud que aún está pendiente o aprobada. Una cuenta ya aprovisionada no puede cancelarse mediante esta ruta.
const response = await fetch("https://api.nodexhub.com.br/api/v1/white-label/nominal/REEMPLAZA_CON_REQUEST_ID", {
method: 'DELETE',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/white-label/nominal/REEMPLAZA_CON_REQUEST_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'DELETE',
"https://api.nodexhub.com.br/api/v1/white-label/nominal/REEMPLAZA_CON_REQUEST_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
Tickets y webhooks firmados para cualquier cuenta activa autenticada. Solo producción.
/api/v1/support/tickets
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Lista hasta los 100 tickets actualizados más recientemente de la cuenta de la credencial. Nunca devuelve tickets de otras cuentas ni el contenido de sus mensajes.
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/tickets", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/tickets');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/support/tickets",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/support/tickets
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Abre un ticket de la cuenta autenticada en la cola de soporte de VexusPay. Envíe texto, hasta cuatro attachment_ids cargados previamente, o ambos. Nunca incluya HTML, bytes/base64 ni credenciales en el body JSON.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/tickets", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"category": "IMPLEMENTATION",
"subject": "Consulta sobre la integración PIX",
"message": "Necesitamos validar cómo gestiona nuestra integración la respuesta asíncrona.",
"attachment_ids": [
"d6c53708-95f6-46f2-8bf7-2c4cdd4ccade"
]
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/tickets');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"category": "IMPLEMENTATION",
"subject": "Consulta sobre la integración PIX",
"message": "Necesitamos validar cómo gestiona nuestra integración la respuesta asíncrona.",
"attachment_ids": [
"d6c53708-95f6-46f2-8bf7-2c4cdd4ccade"
]
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"category": "IMPLEMENTATION",
"subject": "Consulta sobre la integración PIX",
"message": "Necesitamos validar cómo gestiona nuestra integración la respuesta asíncrona.",
"attachment_ids": [
"d6c53708-95f6-46f2-8bf7-2c4cdd4ccade"
]
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/support/tickets",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"category": "IMPLEMENTATION",
"subject": "Consulta sobre la integración PIX",
"message": "Necesitamos validar cómo gestiona nuestra integración la respuesta asíncrona.",
"attachment_ids": [
"d6c53708-95f6-46f2-8bf7-2c4cdd4ccade"
]
}
/api/v1/support/tickets/{ticketId}
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Devuelve el ticket y la conversación cronológica únicamente cuando pertenecen a la cuenta de la credencial.
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/tickets/REEMPLAZA_CON_TICKET_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/tickets/REEMPLAZA_CON_TICKET_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/support/tickets/REEMPLAZA_CON_TICKET_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/support/tickets/{ticketId}/messages
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Añade texto, hasta cuatro attachment_ids cargados previamente, o ambos al ticket de la cuenta. Una respuesta devuelve el ticket a OPEN. Los tickets CLOSED no aceptan mensajes nuevos.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/tickets/REEMPLAZA_CON_TICKET_ID/messages", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"message": "Aplicamos el cambio y enviamos un nuevo correlation ID para su análisis.",
"attachment_ids": [
"d6c53708-95f6-46f2-8bf7-2c4cdd4ccade"
]
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/tickets/REEMPLAZA_CON_TICKET_ID/messages');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"message": "Aplicamos el cambio y enviamos un nuevo correlation ID para su análisis.",
"attachment_ids": [
"d6c53708-95f6-46f2-8bf7-2c4cdd4ccade"
]
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"message": "Aplicamos el cambio y enviamos un nuevo correlation ID para su análisis.",
"attachment_ids": [
"d6c53708-95f6-46f2-8bf7-2c4cdd4ccade"
]
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/support/tickets/REEMPLAZA_CON_TICKET_ID/messages",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"message": "Aplicamos el cambio y enviamos un nuevo correlation ID para su análisis.",
"attachment_ids": [
"d6c53708-95f6-46f2-8bf7-2c4cdd4ccade"
]
}
/api/v1/support/tickets/{ticketId}/close
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Confirma el cierre del ticket de la cuenta. Envíe un objeto JSON vacío y conserve Idempotency-Key si necesita reintentar la solicitud.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/tickets/REEMPLAZA_CON_TICKET_ID/close", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/tickets/REEMPLAZA_CON_TICKET_ID/close');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/support/tickets/REEMPLAZA_CON_TICKET_ID/close",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
/api/v1/support/attachments
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Acepta una imagen en el campo multipart file, verifica su MIME real, normaliza el bitmap y devuelve un attachment_id pendiente. Admite JPEG, PNG y WebP de hasta 5 MiB; un ID no vinculado expira después de 24 horas.
Idempotency-Key.import crypto from 'node:crypto';
import { readFile } from 'node:fs/promises';
const idempotencyKey = crypto.randomUUID();
const image = await readFile('/ruta/a/evidencia.png');
const form = new FormData();
form.append('file', new Blob([image], { type: 'image/png' }), 'evidencia.png');
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/attachments", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
},
body: form,
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/attachments');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
],
CURLOPT_POSTFIELDS => ['file' => new CURLFile('/ruta/a/evidencia.png', 'image/png', 'evidencia.png')],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
}
image_file = open('/ruta/a/evidencia.png', 'rb')
files = {'file': ('evidencia.png', image_file, 'image/png')}
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/support/attachments",
headers=headers,
files=files,
timeout=30,
)
image_file.close()
response.raise_for_status()
print(response.json())
/api/v1/support/attachments/{attachmentId}
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Devuelve el binario privado de una imagen de la cuenta. Cada descarga exige credenciales API, usa Cache-Control: no-store y debe pasar por el backend de la integración. Nunca exponga el Client Secret al navegador.
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/attachments/REEMPLAZA_CON_ATTACHMENT_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const imageBytes = Buffer.from(await response.arrayBuffer());
console.log(response.headers.get('content-type'), imageBytes.length);
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/attachments/REEMPLAZA_CON_ATTACHMENT_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
file_put_contents('/ruta/al/adjunto-soporte', $response);
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/support/attachments/REEMPLAZA_CON_ATTACHMENT_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
with open('./anexo-suporte', 'wb') as output:
output.write(response.content)
/api/v1/support/webhooks
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Lista los endpoints de esta cuenta suscritos a eventos de soporte. Las URL se reducen a su origen HTTPS y nunca se devuelven los secretos de firma.
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/webhooks", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/webhooks');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/support/webhooks",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/support/webhooks
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Crea un endpoint HTTPS para eventos de soporte. signing_secret aparece únicamente en esta respuesta y debe guardarse inmediatamente en un almacén seguro. Si se omite events, se suscriben los cinco eventos de soporte.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/webhooks", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"label": "Soporte de Producción",
"url": "https://api.exemplo.com/webhooks/vexus/support",
"events": [
"support.message.created",
"support.ticket.status_changed",
"support.ticket.closed"
]
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/webhooks');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"label": "Soporte de Producción",
"url": "https://api.exemplo.com/webhooks/vexus/support",
"events": [
"support.message.created",
"support.ticket.status_changed",
"support.ticket.closed"
]
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"label": "Soporte de Producción",
"url": "https://api.exemplo.com/webhooks/vexus/support",
"events": [
"support.message.created",
"support.ticket.status_changed",
"support.ticket.closed"
]
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/support/webhooks",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"label": "Soporte de Producción",
"url": "https://api.exemplo.com/webhooks/vexus/support",
"events": [
"support.message.created",
"support.ticket.status_changed",
"support.ticket.closed"
]
}
/api/v1/support/webhooks/{webhookId}/rotate-secret
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Invalida el secreto anterior y devuelve el nuevo signing_secret una sola vez. Envíe un objeto JSON vacío y actualice el receptor antes de depender de nuevas entregas.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/webhooks/REEMPLAZA_CON_WEBHOOK_ID/rotate-secret", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/webhooks/REEMPLAZA_CON_WEBHOOK_ID/rotate-secret');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/support/webhooks/REEMPLAZA_CON_WEBHOOK_ID/rotate-secret",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
/api/v1/support/webhooks/{webhookId}/activate
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Reactiva un endpoint de la cuenta y restablece su circuito de fallos. Envíe un objeto JSON vacío.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/webhooks/REEMPLAZA_CON_WEBHOOK_ID/activate", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/webhooks/REEMPLAZA_CON_WEBHOOK_ID/activate');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/support/webhooks/REEMPLAZA_CON_WEBHOOK_ID/activate",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
/api/v1/support/webhooks/{webhookId}/deactivate
Solo producción Credenciales
Scope: support.manage Producto: support Solo producción. Pausa nuevas entregas al endpoint sin eliminar su historial. Envíe un objeto JSON vacío.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/support/webhooks/REEMPLAZA_CON_WEBHOOK_ID/deactivate", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/support/webhooks/REEMPLAZA_CON_WEBHOOK_ID/deactivate');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/support/webhooks/REEMPLAZA_CON_WEBHOOK_ID/deactivate",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}
Reglas, ejecución, consulta, cancelación, reembolsos e informes de Split Payment.

/api/v1/splits/rules
Credenciales
Scope: split Producto: split Lista las reglas de split pertenecientes a la cuenta autenticada.
const response = await fetch("https://api.nodexhub.com.br/api/v1/splits/rules", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/splits/rules');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/splits/rules",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/splits/rules
Credenciales
Scope: split Producto: split Crea una regla de split versionada mediante porcentajes o importes fijos.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/splits/rules", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Socios",
"mode": "PERCENTAGE",
"currency": "BRL",
"participants": [
{
"handle": "cuenta-socia",
"percentage": "20.00"
}
]
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/splits/rules');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"name": "Socios",
"mode": "PERCENTAGE",
"currency": "BRL",
"participants": [
{
"handle": "cuenta-socia",
"percentage": "20.00"
}
]
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"name": "Socios",
"mode": "PERCENTAGE",
"currency": "BRL",
"participants": [
{
"handle": "cuenta-socia",
"percentage": "20.00"
}
]
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/splits/rules",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"name": "Socios",
"mode": "PERCENTAGE",
"currency": "BRL",
"participants": [
{
"handle": "cuenta-socia",
"percentage": "20.00"
}
]
}
/api/v1/splits/rules/{ruleId}
Credenciales
Scope: split Producto: split Archiva la versión anterior de la regla y crea una versión nueva.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/splits/rules/REEMPLAZA_CON_RULE_ID", {
method: 'PUT',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Socios v2",
"mode": "PERCENTAGE",
"currency": "BRL",
"participants": [
{
"handle": "cuenta-socia",
"percentage": "25.00"
}
]
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/splits/rules/REEMPLAZA_CON_RULE_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"name": "Socios v2",
"mode": "PERCENTAGE",
"currency": "BRL",
"participants": [
{
"handle": "cuenta-socia",
"percentage": "25.00"
}
]
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"name": "Socios v2",
"mode": "PERCENTAGE",
"currency": "BRL",
"participants": [
{
"handle": "cuenta-socia",
"percentage": "25.00"
}
]
}
''')
response = requests.request(
'PUT',
"https://api.nodexhub.com.br/api/v1/splits/rules/REEMPLAZA_CON_RULE_ID",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"name": "Socios v2",
"mode": "PERCENTAGE",
"currency": "BRL",
"participants": [
{
"handle": "cuenta-socia",
"percentage": "25.00"
}
]
}
/api/v1/splits/rules/{ruleId}
Credenciales
Scope: split Producto: split Archiva una regla de la cuenta. Esta operación no acepta body.
const response = await fetch("https://api.nodexhub.com.br/api/v1/splits/rules/REEMPLAZA_CON_RULE_ID", {
method: 'DELETE',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/splits/rules/REEMPLAZA_CON_RULE_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'DELETE',
"https://api.nodexhub.com.br/api/v1/splits/rules/REEMPLAZA_CON_RULE_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/splits
Credenciales
Scope: split Producto: split Crea la operación financiera y las asignaciones a partir de una regla activa. La cuenta debe tener una ruta de liquidación Split homologada; la gestión de reglas sigue disponible sin ella.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/splits", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"rule_id": "00000000-0000-4000-8000-000000000001",
"amount": 100,
"payer": {
"name": "Cliente de Ejemplo",
"document": "52998224725",
"email": "cliente@example.com"
}
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/splits');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"rule_id": "00000000-0000-4000-8000-000000000001",
"amount": 100,
"payer": {
"name": "Cliente de Ejemplo",
"document": "52998224725",
"email": "cliente@example.com"
}
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"rule_id": "00000000-0000-4000-8000-000000000001",
"amount": 100,
"payer": {
"name": "Cliente de Ejemplo",
"document": "52998224725",
"email": "cliente@example.com"
}
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/splits",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"rule_id": "00000000-0000-4000-8000-000000000001",
"amount": 100,
"payer": {
"name": "Cliente de Ejemplo",
"document": "52998224725",
"email": "cliente@example.com"
}
}
/api/v1/splits/{splitId}
Credenciales
Scope: split Producto: split Devuelve la operación y las asignaciones visibles para la cuenta propietaria.
const response = await fetch("https://api.nodexhub.com.br/api/v1/splits/REEMPLAZA_CON_SPLIT_ID", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/splits/REEMPLAZA_CON_SPLIT_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/splits/REEMPLAZA_CON_SPLIT_ID",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/splits/{splitId}/cancel
Credenciales
Scope: split Producto: split Cancela un split únicamente cuando su estado financiero lo permite. No acepta body.
const response = await fetch("https://api.nodexhub.com.br/api/v1/splits/REEMPLAZA_CON_SPLIT_ID/cancel", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/splits/REEMPLAZA_CON_SPLIT_ID/cancel');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/splits/REEMPLAZA_CON_SPLIT_ID/cancel",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/splits/{splitId}/refund
Credenciales
Scope: split Producto: split Solicita un reembolso parcial o total. HTTP 202 indica procesamiento asíncrono, no finalización.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://api.nodexhub.com.br/api/v1/splits/REEMPLAZA_CON_SPLIT_ID/refund", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"amount": 25,
"comment": "Reembolso parcial solicitado por el cliente"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://api.nodexhub.com.br/api/v1/splits/REEMPLAZA_CON_SPLIT_ID/refund');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"amount": 25,
"comment": "Reembolso parcial solicitado por el cliente"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"amount": 25,
"comment": "Reembolso parcial solicitado por el cliente"
}
''')
response = requests.request(
'POST',
"https://api.nodexhub.com.br/api/v1/splits/REEMPLAZA_CON_SPLIT_ID/refund",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"amount": 25,
"comment": "Reembolso parcial solicitado por el cliente"
}
/api/v1/splits/report
Credenciales
Scope: split Producto: split Devuelve los elementos de la cuenta autenticada dentro del intervalo UTC informado.
const response = await fetch("https://api.nodexhub.com.br/api/v1/splits/report", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://api.nodexhub.com.br/api/v1/splits/report');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://api.nodexhub.com.br/api/v1/splits/report",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
Controles exclusivos de Sandbox para simular estados sin mover fondos reales.
/api/v1/sandbox/workspace
Credenciales
Scope: sandbox.manage Devuelve únicamente los saldos y recursos simulados de la cuenta autenticada.
const response = await fetch("https://sandbox-api.example.invalid/api/v1/sandbox/workspace", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://sandbox-api.example.invalid/api/v1/sandbox/workspace');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://sandbox-api.example.invalid/api/v1/sandbox/workspace",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/sandbox/faucet
Credenciales
Scope: sandbox.manage Acredita un activo simulado en el ledger aislado del Sandbox.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://sandbox-api.example.invalid/api/v1/sandbox/faucet", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"asset": "USDT_BEP20",
"amount": "25.00"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://sandbox-api.example.invalid/api/v1/sandbox/faucet');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"asset": "USDT_BEP20",
"amount": "25.00"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"asset": "USDT_BEP20",
"amount": "25.00"
}
''')
response = requests.request(
'POST',
"https://sandbox-api.example.invalid/api/v1/sandbox/faucet",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"asset": "USDT_BEP20",
"amount": "25.00"
}
/api/v1/sandbox/reset
Credenciales
Scope: sandbox.manage Elimina únicamente los recursos Sandbox de esta cuenta y recrea su saldo simulado inicial.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://sandbox-api.example.invalid/api/v1/sandbox/reset", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"confirmation": "RESET_SANDBOX"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://sandbox-api.example.invalid/api/v1/sandbox/reset');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"confirmation": "RESET_SANDBOX"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"confirmation": "RESET_SANDBOX"
}
''')
response = requests.request(
'POST',
"https://sandbox-api.example.invalid/api/v1/sandbox/reset",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"confirmation": "RESET_SANDBOX"
}
/api/v1/sandbox/resources/{resourceType}/{resourceId}/actions
Credenciales
Scope: sandbox.manage Aprueba, falla, expira o revierte una operación simulada pendiente.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://sandbox-api.example.invalid/api/v1/sandbox/resources/REEMPLAZA_CON_RESOURCE_TYPE/REEMPLAZA_CON_RESOURCE_ID/actions", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"action": "APPROVE"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://sandbox-api.example.invalid/api/v1/sandbox/resources/REEMPLAZA_CON_RESOURCE_TYPE/REEMPLAZA_CON_RESOURCE_ID/actions');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"action": "APPROVE"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"action": "APPROVE"
}
''')
response = requests.request(
'POST',
"https://sandbox-api.example.invalid/api/v1/sandbox/resources/REEMPLAZA_CON_RESOURCE_TYPE/REEMPLAZA_CON_RESOURCE_ID/actions",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"action": "APPROVE"
}
/api/v1/sandbox/crypto/deposits
Credenciales
Scope: sandbox.manage Crea un depósito simulado sin transmisión ni consulta blockchain. Use el wallet_id devuelto al crear o listar una billetera Sandbox de la misma cuenta.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://sandbox-api.example.invalid/api/v1/sandbox/crypto/deposits", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"wallet_id": "00000000-0000-4000-8000-000000000003",
"amount": "10.00",
"confirmations": 0
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://sandbox-api.example.invalid/api/v1/sandbox/crypto/deposits');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"wallet_id": "00000000-0000-4000-8000-000000000003",
"amount": "10.00",
"confirmations": 0
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"wallet_id": "00000000-0000-4000-8000-000000000003",
"amount": "10.00",
"confirmations": 0
}
''')
response = requests.request(
'POST',
"https://sandbox-api.example.invalid/api/v1/sandbox/crypto/deposits",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"wallet_id": "00000000-0000-4000-8000-000000000003",
"amount": "10.00",
"confirmations": 0
}
/api/v1/sandbox/cards/{cardId}/transactions
Credenciales
Scope: sandbox.manage Simula la aprobación, el rechazo, la reversión o el reembolso de una tarjeta simulada.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://sandbox-api.example.invalid/api/v1/sandbox/cards/REEMPLAZA_CON_CARD_ID/transactions", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"amount": "12.50",
"currency": "USD",
"outcome": "APPROVED"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://sandbox-api.example.invalid/api/v1/sandbox/cards/REEMPLAZA_CON_CARD_ID/transactions');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"amount": "12.50",
"currency": "USD",
"outcome": "APPROVED"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"amount": "12.50",
"currency": "USD",
"outcome": "APPROVED"
}
''')
response = requests.request(
'POST',
"https://sandbox-api.example.invalid/api/v1/sandbox/cards/REEMPLAZA_CON_CARD_ID/transactions",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"amount": "12.50",
"currency": "USD",
"outcome": "APPROVED"
}
/api/v1/sandbox/cards/{cardId}/otp
Credenciales
Scope: sandbox.manage Genera un OTP simulado y lo entrega únicamente mediante el pipeline de webhooks Sandbox.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://sandbox-api.example.invalid/api/v1/sandbox/cards/REEMPLAZA_CON_CARD_ID/otp", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"wallet_type": "GOOGLE_PAY"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://sandbox-api.example.invalid/api/v1/sandbox/cards/REEMPLAZA_CON_CARD_ID/otp');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{
"wallet_type": "GOOGLE_PAY"
}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{
"wallet_type": "GOOGLE_PAY"
}
''')
response = requests.request(
'POST',
"https://sandbox-api.example.invalid/api/v1/sandbox/cards/REEMPLAZA_CON_CARD_ID/otp",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{
"wallet_type": "GOOGLE_PAY"
}
/api/v1/sandbox/webhook-deliveries
Credenciales
Scope: sandbox.manage Lista las entregas y los intentos de webhook del entorno Sandbox.
const response = await fetch("https://sandbox-api.example.invalid/api/v1/sandbox/webhook-deliveries", {
method: 'GET',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$ch = curl_init('https://sandbox-api.example.invalid/api/v1/sandbox/webhook-deliveries');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
],
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
}
response = requests.request(
'GET',
"https://sandbox-api.example.invalid/api/v1/sandbox/webhook-deliveries",
headers=headers,
timeout=30,
)
response.raise_for_status()
print(response.json())
/api/v1/sandbox/webhook-deliveries/{deliveryId}/retry
Credenciales
Scope: sandbox.manage Vuelve a programar una entrega Sandbox sin afectar los webhooks de producción.
Idempotency-Key.import crypto from 'node:crypto';
const idempotencyKey = crypto.randomUUID();
const response = await fetch("https://sandbox-api.example.invalid/api/v1/sandbox/webhook-deliveries/REEMPLAZA_CON_DELIVERY_ID/retry", {
method: 'POST',
headers: {
'Apikey': process.env.VEXUS_CLIENT_ID,
'X-Client-Secret': process.env.VEXUS_CLIENT_SECRET,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
$idempotencyKey = bin2hex(random_bytes(16));
$ch = curl_init('https://sandbox-api.example.invalid/api/v1/sandbox/webhook-deliveries/REEMPLAZA_CON_DELIVERY_ID/retry');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Apikey: ' . getenv('VEXUS_CLIENT_ID'),
'X-Client-Secret: ' . getenv('VEXUS_CLIENT_SECRET'),
'Idempotency-Key: ' . $idempotencyKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$response = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
if ($httpStatus >= 400) throw new RuntimeException("HTTP {$httpStatus}");
var_dump(json_decode($response, true, 512, JSON_THROW_ON_ERROR));
import os
import requests
import json
import uuid
idempotency_key = str(uuid.uuid4())
headers = {
'Apikey': os.environ['VEXUS_CLIENT_ID'],
'X-Client-Secret': os.environ['VEXUS_CLIENT_SECRET'],
'Idempotency-Key': idempotency_key,
'Content-Type': 'application/json',
}
payload = json.loads(r'''
{}
''')
response = requests.request(
'POST',
"https://sandbox-api.example.invalid/api/v1/sandbox/webhook-deliveries/REEMPLAZA_CON_DELIVERY_ID/retry",
headers=headers,
json=payload,
timeout=30,
)
response.raise_for_status()
print(response.json())
{}