Pular para o conteúdo principal

Visão Geral

O cash-out SPEI envia uma transferência interbancária para uma CLABE de destino. O saldo da conta é debitado e a NTX Pay processa a transferência na rede SPEI. A confirmação chega via 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": "Invoice 123 payment"
  }'

Response (201)

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

Campos do Request

amountCentavos
integer
obrigatório
Valor em centavos MXN (mínimo 1). Ex.: 50000 = $500,00 MXN.
destinationClabe
string
obrigatório
CLABE de destino — exatamente 18 dígitos numéricos (regex: ^\d{18}$).
beneficiaryName
string
obrigatório
Nome do beneficiário (3–255 caracteres).
beneficiaryTaxId
string
RFC/CURP do beneficiário (10–20 caracteres). Recomendado para reconciliação.
concept
string
Conceito exibido no extrato do beneficiário (até 255 caracteres).

Validação de Saldo

Antes de enviar, valide o saldo:
const balance = await getBalance(token);
if (balance.availableCentavos < amountCentavos) {
  throw new Error('Insufficient balance');
}
Saldo insuficiente retorna 400 — a transação não é criada. Aplique idempotência no lado do cliente (não reprocesse o mesmo pedido após um 400 sem revalidar o saldo).

Estados

StatusSignificado
PENDINGCash-out aceito, aguardando liquidação SPEI
CONFIRMEDLiquidado no Banxico
FAILEDRejeitado pela rede SPEI

Códigos de Erro

CódigoCausa
400Saldo insuficiente, CLABE inválida, payload inválido
401Token inválido
502Falha temporária no processamento — não tente novamente sem verificar o status via GET /api/transactions

Exemplo em Node.js com 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) {
      // Não sabemos se a transação foi criada. Consulte /api/transactions filtrando por externalId
      // antes de tentar novamente.
    }
    throw err;
  }
}

Próximos Passos

Webhook cash_out

Detalhes do payload do webhook de liquidação