Saltar al contenido principal

Visión General

El SPEI cash-out envía una transferencia interbancaria a una CLABE de destino. El saldo de la cuenta se debita y NTX Pay procesa la transferencia sobre la red SPEI. La confirmación llega vía webhook cash_out.

Endpoint

POST /api/spei/cash-out

Headers

Authorization: Bearer {token}
Content-Type: application/json

Request

curl -X POST https://sandbox.mx.ntxpay.com/api/spei/cash-out \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "amountCentavos": 50000,
    "destinationClabe": "012180001234567890",
    "beneficiaryName": "Maria Lopez",
    "beneficiaryTaxId": "LOMA850101ABC",
    "concept": "Pago factura 123"
  }'

Response (201)

{
  "id": 56789,
  "status": "PENDING",
  "destinationClabe": "012180001234567890",
  "amountCentavos": 50000,
  "referenceNumerical": "9876543",
  "createdAt": "2026-05-13T12:00:00.000Z"
}

Campos del Request

amountCentavos
integer
requerido
Valor en centavos MXN (mínimo 1). Ej.: 50000 = $500.00 MXN.
destinationClabe
string
requerido
CLABE destino — exactamente 18 dígitos numéricos (regex: ^\d{18}$).
beneficiaryName
string
requerido
Nombre del beneficiario (3–255 caracteres).
beneficiaryTaxId
string
RFC/CURP del beneficiario (10–20 caracteres). Recomendado para conciliación.
concept
string
Concepto que aparece en el extracto del beneficiario (hasta 255 caracteres).

Validación de Saldo

Antes de enviar, valida el saldo:
const balance = await getBalance(token);
if (balance.availableCentavos < amountCentavos) {
  throw new Error('Saldo insuficiente');
}
Saldo insuficiente retorna 400 — la transacción no se crea. Aplica idempotencia en el cliente (no reproceses el mismo pedido tras 400 sin revalidar el saldo).

Estados

StatusSignificado
PENDINGCash-out aceptado, esperando liquidación SPEI
CONFIRMEDLiquidado en Banxico
FAILEDRechazado por la red SPEI

Códigos de Error

CódigoCausa
400Saldo insuficiente, CLABE inválida, payload inválido
401Token inválido
502Servicio temporalmente no disponible — no reenvíes sin checar status en GET /api/transactions

Ejemplo Node.js con Retry

async function speiCashOut(token: string, dto: any) {
  try {
    const { data } = await axios.post(
      'https://sandbox.mx.ntxpay.com/api/spei/cash-out',
      dto,
      { headers: { Authorization: `Bearer ${token}` } },
    );
    return data; // status: PENDING
  } catch (err) {
    if (err.response?.status === 502) {
      // No sabemos si la transacción fue creada. Consulta /api/transactions filtrando por externalId
      // antes de hacer retry.
    }
    throw err;
  }
}

Próximos Pasos

Webhook cash_out

Detalles del payload del webhook de liquidación