Skip to main content
Bank transfers let customers pay directly from their bank account without entering card details. Yuno supports several regional bank transfer methods, each with its own flow, settlement time, and required fields.

Method overview

MethodCountryCurrencyFlowSettlement
PSEColombia (CO)COPRedirectMinutes (async)
SPEIMexico (MX)MXNCLABE number issuedMinutes to hours (async)
ACHUnited States (US)USDDirect (no redirect)1–3 business days
KHIPUChile (CL)CLPRedirectMinutes (async)
All bank transfer methods return an initial status of PROCESS or PENDING. The final status arrives via webhook when the bank confirms settlement.

PSE — Colombia

PSE (Pagos Seguros en Línea) is Colombia’s most widely used online bank transfer network. The customer selects their bank, is redirected to the bank’s authentication portal, and approves the payment.

Required fields

  • payment_method.type: PSE
  • payment_method.detail.issuer_code: the customer’s bank identifier (see below)
  • country: CO, currency: COP

Get the list of available banks

Before rendering the bank selector, fetch the list of issuers supported by your configured PSE provider:
curl --request GET \
  --url 'https://api-sandbox.y.uno/v1/payment-methods/issuers?country=CO&payment_method_type=PSE' \
  --header 'private-secret-key: YOUR_SECRET_KEY' \
  --header 'account-code: YOUR_ACCOUNT_CODE'
The response returns an array of { issuer_code, name } objects. Display these as a dropdown for the customer to select.

Create a PSE payment

curl --request POST \
  --url https://api-sandbox.y.uno/v1/payments \
  --header 'Content-Type: application/json' \
  --header 'private-secret-key: YOUR_SECRET_KEY' \
  --header 'account-code: YOUR_ACCOUNT_CODE' \
  --data '{
    "merchant_order_id": "order-co-001",
    "checkout_session": "SESSION_ID",
    "country": "CO",
    "amount": { "value": 50000, "currency": "COP" },
    "payment_method": {
      "type": "PSE",
      "detail": {
        "issuer_code": "1022"
      }
    },
    "customer_payer": {
      "id": "CUSTOMER_ID",
      "document": {
        "document_type": "CC",
        "document_number": "1234567890"
      }
    }
  }'
The response includes payment_method.detail.redirect_url. Redirect the customer to this URL to complete bank authentication. After approval or rejection, the bank redirects back to your callback_url.

SPEI — Mexico

SPEI (Sistema de Pagos Electrónicos Interbancarios) is Mexico’s real-time interbank transfer system. Instead of a redirect, Yuno issues a CLABE (18-digit bank account number) that the customer uses to initiate a transfer from their own banking app.

Create a SPEI payment

curl --request POST \
  --url https://api-sandbox.y.uno/v1/payments \
  --header 'Content-Type: application/json' \
  --header 'private-secret-key: YOUR_SECRET_KEY' \
  --header 'account-code: YOUR_ACCOUNT_CODE' \
  --data '{
    "merchant_order_id": "order-mx-001",
    "checkout_session": "SESSION_ID",
    "country": "MX",
    "amount": { "value": 120000, "currency": "MXN" },
    "payment_method": { "type": "SPEI" },
    "customer_payer": {
      "email": "cliente@example.com"
    }
  }'
The response contains the CLABE in payment_method.detail.clabe:
{
  "payment_method": {
    "detail": {
      "clabe": "646180110400000007",
      "bank_name": "STP",
      "beneficiary": "Yuno / Your Merchant Name",
      "reference": "ORD-MX-001",
      "expires_at": "2026-04-08T23:59:59Z"
    }
  }
}
Display the CLABE, beneficiary name, amount, and reference to the customer. They log into their bank app and initiate the transfer using these details.
SPEI CLABEs are single-use. A new payment generates a new CLABE. Do not reuse CLABEs across payments.

ACH — United States

ACH (Automated Clearing House) is the standard US bank transfer network. Customers provide their bank routing number and account number. Settlement takes 1–3 business days.

Create an ACH payment

curl --request POST \
  --url https://api-sandbox.y.uno/v1/payments \
  --header 'Content-Type: application/json' \
  --header 'private-secret-key: YOUR_SECRET_KEY' \
  --header 'account-code: YOUR_ACCOUNT_CODE' \
  --data '{
    "merchant_order_id": "order-us-001",
    "checkout_session": "SESSION_ID",
    "country": "US",
    "amount": { "value": 10000, "currency": "USD" },
    "payment_method": {
      "type": "ACH",
      "token": "ONE_TIME_TOKEN_FROM_SDK"
    }
  }'
ACH returns status: "PENDING" immediately. The final SUCCEEDED or FAILED status arrives via webhook after bank processing (typically next business day).

Webhook handling

All bank transfer methods are asynchronous. Wire your webhook endpoint to handle PAYMENT_STATE_CHANGED events and update your order status accordingly.
// Node.js example — Express webhook handler
app.post('/webhooks/yuno', (req, res) => {
  const event = req.body;

  if (event.type === 'PAYMENT_STATE_CHANGED') {
    const { payment_id, status, payment_method_type } = event.data;

    switch (status) {
      case 'SUCCEEDED':
        // Fulfill the order
        fulfillOrder(payment_id);
        break;
      case 'FAILED':
      case 'EXPIRED':
        // Notify customer, offer retry
        handleFailure(payment_id, payment_method_type);
        break;
      case 'PENDING':
      case 'PROCESS':
        // Still in flight — no action needed
        break;
    }
  }

  res.sendStatus(200); // Always acknowledge
});
Always return HTTP 200 to Yuno’s webhook delivery even if your handler encounters an error. If you return a non-2xx status, Yuno retries the event with exponential backoff, which can cause duplicate processing.
See Webhooks for signature verification and retry configuration.