API Direct (S2S)

Retiros

Envía dinero a un beneficiario por SPEI o tarjeta de débito, y sigue el estado hasta su liquidación.

Los retiros (payouts) a beneficiarios se procesan por el mismo endpoint unificado /process/ que los pagos, usando operation_type: "withdrawal".

Disponibilidad. Los retiros vía API Direct actualmente solo están disponibles para beneficiarios en México.

Métodos de transferencia disponibles

AspectoSPEITarjeta de débito
Tiempo de procesamientoInstantáneo (segundos)Instantáneo (segundos)
DisponibilidadHorario bancario24/7
Tipo de cuentaCLABE de 18 dígitosTarjeta de 16 dígitos
Ideal paraBeneficiarios con CLABE, montos mayoresBeneficiarios que solo tienen tarjeta

Geolocalización obligatoria para México. Los campos metadata.latitude y metadata.longitude son obligatorios para procesar retiros en México. Omitirlos o enviar coordenadas erróneas resulta en una transacción fallida.

Paso 1: haz la petición de retiro

Envía tu petición al endpoint /process/ con operation_type en "withdrawal":

CampoDescripción
operation_typeSiempre "withdrawal" para operaciones de payout.
amountMonto del retiro en la moneda especificada.
currencyCódigo de moneda (actualmente solo se soporta "MXN").
client_referenceTu identificador de referencia interno para este retiro.
transfer_method"SPEI" o "DEBIT_CARD".
beneficiaryObjeto con la información completa del beneficiario.
metadataInformación adicional requerida (debe incluir latitude y longitude).

El objeto beneficiary especifica quién recibe los fondos y cómo:

CampoDescripción
accountCuenta destino (CLABE de 18 dígitos para SPEI, o tarjeta de 16 dígitos para tarjeta de débito).
nameNombre legal completo del beneficiario, tal como aparece en su cuenta o tarjeta.
rfcRFC del beneficiario.
curpCURP del beneficiario (18 caracteres alfanuméricos).
institutionCódigo de institución bancaria. Ver Referencia bancaria.
emailCorreo del beneficiario para notificaciones y registro.

Requisito de RFC/CURP. Debes proporcionar rfc o curp en cada petición de retiro. Si no tienes disponible alguno de los dos, envía "ND" (No Disponible) como valor en ese campo.

Códigos de institución para pruebas en Stage. Usa 97846 como institution para simular tanto retiros SPEI como retiros por tarjeta de débito en Stage. Para producción, usa los códigos reales de la Referencia bancaria (por ejemplo, 40012 ya es un código real de producción, no debe usarse para pruebas).

Ejemplo confirmado y funcional, transferencia SPEI:

{
  "operation_type": "withdrawal",
  "amount": 20.00,
  "currency": "MXN",
  "client_reference": "payout-001",
  "transfer_method": "SPEI",
  "description": "Commission payment",
  "beneficiary": {
    "account": "846180000400000001",
    "name": "Ana María González",
    "rfc": "GOAN850315AB2",
    "institution": "97846",
    "email": "ana.gonzalez@email.com"
  },
  "metadata": {
    "latitude": "22.8870221",
    "longitude": "-109.911775"
  }
}
curl -X POST https://stage.tonder.io/api/v1/process/ \
  -H "Authorization: Token YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "operation_type": "withdrawal",
    "amount": 20.00,
    "currency": "MXN",
    "client_reference": "payout-001",
    "transfer_method": "SPEI",
    "description": "Commission payment",
    "beneficiary": {
      "account": "846180000400000001",
      "name": "Ana María González",
      "rfc": "GOAN850315AB2",
      "institution": "97846",
      "email": "ana.gonzalez@email.com"
    },
    "metadata": {
      "latitude": "22.8870221",
      "longitude": "-109.911775"
    }
  }'

Paso 2: maneja la respuesta

Ante una petición exitosa, la API devuelve un acuse de recibo inmediato:

{
  "id": "550e8400-e29b-41d4-a716-446655440001",
  "operation_type": "withdrawal",
  "status": "Pending",
  "amount": 20.00,
  "currency": "MXN",
  "client_reference": "payout-001",
  "created_at": "2024-07-26T10:30:00Z",
  "status_code": 201
}
CampoDescripción
idIdentificador único de la transacción, guárdalo para monitorear el progreso.
operation_typeConfirma que es una operación de retiro.
statusEstado actual de la transacción (inicialmente Pending).
amountMonto del retiro, tal como se envió.
currencyCódigo de moneda.
client_referenceTu identificador de referencia interno.
created_atTimestamp ISO 8601 de creación del retiro.
status_codeCódigo HTTP (201 para creación exitosa).

Paso 3: consulta el estado de la transacción

Los retiros son operaciones asíncronas. Usa el id de la respuesta para consultar el estado en el endpoint GET /api/v1/transactions/{id}/, o monitorea vía webhooks.

A medida que el retiro avanza, pasa por distintos estados:

EstadoTipoDescripciónAntes
PendingInicialLa solicitud se recibió y está en cola o en espera.PENDING, ON_HOLD
ProcessingIntermedioLa solicitud fue enviada al banco o proveedor de pago.SENT_TO_PROVIDER
SuccessÉxitoLa transferencia se completó con éxito.PAID_FULL
DeclinedTerminalEl retiro fue rechazado (por ejemplo, cuenta inválida).REJECTED
CancelledTerminalEl retiro fue cancelado.CANCELED
FailedTerminalEl retiro falló.FAILED

Estados renombrados. Los retiros ahora usan el mismo vocabulario de estados que los pagos. Si tu integración esperaba los nombres anteriores (PENDING, SENT_TO_PROVIDER, PAID_FULL, REJECTED, CANCELED, FAILED), actualízala con la columna "Antes" de la tabla.

Webhooks

Los webhooks de retiros por API Direct siguen el mismo payload plano que los webhooks de pagos, con estas diferencias:

CampoDiferencia
operation_type"withdrawal".
transfer_method_typeSe usa en lugar de payment_method_type (SPEI o DEBIT_CARD).
event_typeUsa el prefijo withdrawal_ (por ejemplo, withdrawal_Pending, withdrawal_Success).
provider"STP", el riel bancario que liquida el retiro.

Se generan exactamente dos webhooks por retiro: primero una notificación Pending, luego una notificación terminal (Success, Declined o Failed).

Pending

{
  "id": "550e8400-e29b-41d4-a716-446655440001",
  "operation_type": "withdrawal",
  "amount": "20",
  "currency": "MXN",
  "client_reference": "payout-001",
  "status": "Pending",
  "provider": "STP",
  "transfer_method_type": "SPEI",
  "created": "2026-05-21T19:15:32.029134Z",
  "metadata": {
    "latitude": "22.8870221",
    "longitude": "-109.911775",
    "external_id": "payout-001"
  },
  "event_type": "withdrawal_Pending",
  "action": "MODIFY"
}

Success

{
  "id": "550e8400-e29b-41d4-a716-446655440001",
  "operation_type": "withdrawal",
  "amount": "20",
  "currency": "MXN",
  "client_reference": "payout-001",
  "status": "Success",
  "provider": "STP",
  "transfer_method_type": "SPEI",
  "created": "2026-05-21T19:20:47.029134Z",
  "metadata": {
    "latitude": "22.8870221",
    "longitude": "-109.911775",
    "external_id": "payout-001"
  },
  "event_type": "withdrawal_Success",
  "action": "MODIFY"
}

Declined

{
  "id": "c7b14546-84bd-4a81-89fb-3dc660f47011",
  "operation_type": "withdrawal",
  "amount": "60",
  "currency": "MXN",
  "client_reference": "card-payout-002",
  "status": "Declined",
  "provider": "STP",
  "transfer_method_type": "SPEI",
  "created": "2026-05-21T19:20:47.029134Z",
  "metadata": {
    "latitude": "22.8870221",
    "longitude": "-109.911775",
    "external_id": "card-payout-002"
  },
  "event_type": "withdrawal_Declined",
  "action": "MODIFY"
}

Failed

{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "operation_type": "withdrawal",
  "amount": "75",
  "currency": "MXN",
  "client_reference": "card-payout-003",
  "status": "Failed",
  "provider": "STP",
  "transfer_method_type": "SPEI",
  "created": "2026-05-21T19:20:47.029134Z",
  "metadata": {
    "latitude": "22.8870221",
    "longitude": "-109.911775",
    "external_id": "card-payout-003"
  },
  "event_type": "withdrawal_Failed",
  "action": "MODIFY"
}

Monitoreo recomendado: usa webhooks para recibir actualizaciones de estado en tiempo real. Como alternativa, puedes hacer polling con el endpoint de estado de transacción.

Consulta tu saldo

Antes de dispersar, verifica el saldo disponible:

curl https://stage.tonder.io/api/v1/withdrawals/balance \
  -H "Authorization: Token YOUR_API_KEY"
curl https://app.tonder.io/api/v1/withdrawals/balance \
  -H "Authorization: Token YOUR_API_KEY"
{
  "message": "Data retrieved successfully",
  "current_balance": "32894.55"
}

Un retiro por más del saldo disponible se rechaza. El esquema del endpoint está en la Referencia API.

Siguientes pasos

¿Te resultó útil esta página?

En esta página