Saltar al contenido principal

What is Sandbox?

El sandbox es un modo de operación de tu cuenta — no un ambiente separado.
  • Usa la misma API, misma base URL y los mismos endpoints que producción
  • Está conectado a un proveedor bancario simulado (no toca Banxico ni la red SPEI real)
  • Las cuentas sandbox son separadas y tienen sus propias credenciales
  • Tu código no cambia entre sandbox y producción — solo cambian las credenciales

Sandbox vs Production

AspectoSandboxProducción
Base URLhttps://api.ntxpay.com (misma)https://api.ntxpay.com
CuentaDedicada de sandboxDedicada de producción
CredencialesCertificado + clientId/clientSecret propiosCertificado + credenciales propios
SaldoSimuladoFondos reales
TransaccionesSimuladas/persistidas localmenteLiquidan en SPEI/Banxico real
WebhooksSimulados (~1s después de la request)Reales, dependientes del provider
X-Sandbox-ScenarioSoportado400 Bad Request
DocumentaciónLa misma para ambos

Getting Started with Sandbox

1

Solicita una cuenta de sandbox

Contacta a tu account manager o escribe a contact@ntxpay.com.
2

Recibe tus credenciales

Certificado X.509 + clientId/clientSecret exclusivos del sandbox.
3

Registra la URL del webhook

POST /api/webhooks-config con la URL HTTPS que recibirá los eventos simulados.
4

Confirma el modo sandbox en el panel

En el dashboard, ve a Settings y verifica que el provider sea sandbox.
5

Autentica y simula escenarios

Autentica vía POST /api/auth/token y usa el header X-Sandbox-Scenario para simular resultados.

Overview

  • El header X-Sandbox-Scenario controla el resultado del webhook asíncrono.
  • Sin el header, el sandbox devuelve webhooks de éxito por default.
  • Para escenarios de error, envía el header explícitamente en la request.
  • La feature funciona solo en sandbox — en producción, la request retorna 400.

How It Works

El header no altera la respuesta HTTP. La API siempre responde 201 Created con status: "PENDING". El scenario afecta exclusivamente el webhook asíncrono disparado ~1 segundo después.
RequestHTTP ResponseWebhook (~1s después)
Sin X-Sandbox-Scenario201 PENDINGCONFIRMED
X-Sandbox-Scenario: success201 PENDINGCONFIRMED
X-Sandbox-Scenario: error:insufficient-funds201 PENDINGFAILED con errorCode
X-Sandbox-Scenario: delayed:5s201 PENDINGCONFIRMED con +5s de delay

How to Use

curl -X POST https://api.ntxpay.com/api/spei/cash-out \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Sandbox-Scenario: error:insufficient-funds" \
  -H "Content-Type: application/json" \
  -d '{
    "amountCentavos": 15000,
    "destinationClabe": "012180001234567890",
    "beneficiaryName": "Maria Lopez",
    "externalId": "test-error-001"
  }'

Available Scenarios

Error Scenarios

Header ValueDescripciónWebhook Status
error:insufficient-fundsCuenta sin saldo suficienteFAILED
error:invalid-clabeCLABE de destino malformada o inexistenteFAILED
error:account-not-foundCuenta destino no localizada en la red SPEIFAILED
error:account-blockedCuenta destino bloqueada o cerradaFAILED
error:duplicate-external-idexternalId ya usado en otra transacciónFAILED
error:bank-rejectedBanco destino rechazó la transferencia (genérico)FAILED
error:oxxo-expiredCupón OXXO expiró sin pagoEXPIRED

Success Scenario

Header ValueDescripciónWebhook Status
successFuerza éxito (mismo comportamiento del default)CONFIRMED
(sin header)Comportamiento default del sandboxCONFIRMED

Delay Scenarios

Header ValueDescripciónWebhook Status
delayed:5sÉxito tras 5 segundos extraCONFIRMED
delayed:30sÉxito tras 30 segundos extraCONFIRMED
delayed:60sÉxito tras 60 segundos extraCONFIRMED
El delay máximo permitido es de 120 segundos — valores arriba se truncan automáticamente.

Received Webhook Examples

Success Webhook (default)

{
  "event": "cash_out",
  "deliveryId": "8e2c5b6f-3a12-4b9c-9a18-77a2b3c4d5e6",
  "createdAt": "2026-03-26T10:00:00.000Z",
  "transaction": {
    "id": 12345,
    "externalId": "test-success-001",
    "paymentMethod": "SPEI",
    "direction": "out",
    "type": "cash_out",
    "status": "CONFIRMED",
    "provider": "sandbox",
    "amountCentavos": 15000,
    "clabe": "012180001234567890",
    "referenceNumerical": "9876543",
    "createdAt": "2026-03-26T09:59:59.000Z",
    "confirmedAt": "2026-03-26T10:00:00.000Z",
    "counterpart": {
      "name": "Maria Lopez",
      "taxId": null,
      "bank": {}
    }
  },
  "errorCode": null,
  "errorMessage": null,
  "metadata": {}
}

Error Webhook (error:insufficient-funds)

{
  "event": "cash_out",
  "deliveryId": "1a3f9e8d-2c47-4b9c-aa18-77a2b3c4d5e6",
  "createdAt": "2026-03-26T10:01:00.000Z",
  "transaction": {
    "id": 12346,
    "externalId": "test-error-001",
    "paymentMethod": "SPEI",
    "direction": "out",
    "type": "cash_out",
    "status": "FAILED",
    "provider": "sandbox",
    "amountCentavos": 15000,
    "clabe": "012180001234567890",
    "referenceNumerical": null,
    "createdAt": "2026-03-26T10:00:59.000Z",
    "confirmedAt": null,
    "counterpart": {
      "name": null,
      "taxId": null,
      "bank": {}
    }
  },
  "errorCode": "INSUFFICIENT_FUNDS",
  "errorMessage": "Cuenta sin saldo suficiente",
  "metadata": {}
}
Notas:
  • En status: FAILED, referenceNumerical y confirmedAt son null (la red SPEI nunca confirmó la transacción).
  • errorCode y errorMessage describen el motivo de la falla.

Compatible Endpoints

EndpointMétodoDescripción
/api/spei/cash-inPOSTGenerar CLABE desechable de cobro
/api/spei/cash-outPOSTEnviar SPEI por CLABE
/api/oxxo/cash-inPOSTGenerar cupón OXXO

Behavior

  • La API procesa la request normalmente: retorna 201 Created con status: PENDING.
  • El header no altera la respuesta inmediata.
  • Tras ~1 segundo (o más con delayed:), el webhook es enviado a la URL configurada.
  • Tu sistema recibe el webhook con status correspondiente al scenario (CONFIRMED o FAILED).
El header controla solo el webhook. La respuesta HTTP siempre es 201 Created con status: PENDING, sin importar el scenario.

Restrictions

  • X-Sandbox-Scenario funciona exclusivamente con cuentas configuradas en modo sandbox.
  • Cuentas de producción que envíen el header reciben:
{
  "statusCode": 400,
  "message": "X-Sandbox-Scenario header is only supported in sandbox mode. This account is not configured with a sandbox provider."
}
Contacta a contact@ntxpay.com para verificar la configuración de tu cuenta.

Best Practices

  1. Prueba todos los escenarios — implementa el manejo de CONFIRMED, PENDING, FAILED y EXPIRED antes de ir a producción.
  2. Valida los campos de error — usa errorCode y errorMessage para tomar la acción adecuada (notificar usuario, retry, etc.).
  3. Prueba con delay — verifica que tu sistema maneja bien la entrega lenta del webhook.
  4. Idempotencia — usa transaction.id como llave de idempotencia; el mismo webhook puede ser reenviado.