• Documentation
  • API Reference
  • Documentation
  • API Reference
Expand All Collapse All
< BACK TO HOME
  • General
    • Introduction to APMs
    • APM Input Fields and APIs
    • APM subMethod Class
    • Account Details Capture
    • APM Countries and Currencies
  • US and Canada Guides
    • ACH
    • Interac Instant
    • Mazooma
    • PayNearMe
    • PlayPlus
      • PlayPlus (REST)
      • PlayPlus (Web SDK)
    • VIP Preferred
      • VIP Preferred (REST)
      • VIP Pref. (Web SDK/Checkout)
  • Europe Guides
    • Okto Cash
    • Open Banking
  • Global Guides
    • Apple Pay
      • Registering with Apple Pay
        • (Manually) Register in the Apple System
          • Create an Apple ID
          • Enroll in the Apple Developer Program
            • Submit an Enrollment Request
            • Complete the Enrollment Process
            • Activate your Apple Developer Program Account
          • Register a Merchant ID in the Apple System
            • Create a Merchant ID
            • Create a Payment Processing Certificate
            • Create a Merchant Identity Certificate
            • Register and Verify Your Domain
      • Nuvei Apple Pay Implementations
        • Payment Page using IFrame
        • Static Apple Pay Button
        • Static Pay Button (Web SDK)
        • Dynamic Apple Pay Button
      • Apple Pay Integration
        • Apple Pay Guide (REST API)
        • Apple Pay Guide (Web SDK)
        • Apple Pay Guide (Checkout)
        • Apple Pay Integration Testing
    • Google Pay
      • Google Pay (REST API)
      • Google Pay (Web SDK)
      • Google Pay (Checkout)
    • Neteller
    • PayPal
    • Skrill
    • Visa Checkout
  • Latin America Guides
    • PIX
    • PIX Payouts
    • STPmex
  • Asia Pacific Guides
    • Alipay HK
    • Dana
    • DragonPay
    • GCash
    • India Payouts
    • KakaoPay
    • TouchnGo
    • TrueMoney

ACH

On this page:
  • Purpose
  • APM Overview
  • Prerequisites and Notes
  • Bank Transfer (ACH)
    • Payment (Without UPO)
    • Payment (With UPO)
    • Payout (Withdrawal)
  • Secure Bank Transfer
    • Payment (Without UPO)
    • Payment (With UPO)
  • Appendix
    • Generating UPOs
    • Example Payment DMNs

Purpose

ACH (Automated Clearing House) is a U.S. based financial network used for electronic payments and money transfers. ACH payments, also known as “direct payments”, are a way to transfer money from one bank account to another without using paper checks, credit card networks, wire transfers, or cash.

Nuvei supports a growing number of ACH APM (Alternative Payment Method) integrations, which are available via our payment technology platforms.
This guide describes how to integrate the following ACH APMs into your payment flows:

  • The “Bank Transfer (ACH)” APM (also known as “Classic ACH”)
  • The “Secure Bank Transfer” APM (also known as “Guaranteed ACH”)

APM Overview

Bank Transfer (ACH) APM (Classic ACH)

APM Name Nuvei APM Integration Methods
REST API Web SDK Checkout SDK
ACH apmgw_ACH ✓ ✓ ✓
APM Flow: This APM uses a "Direct" workflow.
Notes:
  • The first time a customer uses a particular bank account to perform a bank transfer, they capture their bank account details. Nuvei stores these details in an encrypted UPO (User Payment Option) record in the Nuvei system, for use in future transactions.
  • You can offer "returning customers" the option of selecting one of their previously captured payment methods (UPOs), instead of capturing their bank account details again.

Secure Bank Transfer APM (Guaranteed ACH)

Nuvei’s Guaranteed ACH solution allows e-commerce merchants in the US to accept ACH payments, without administrative or NSF return risk (the merchant always gets their funds). Guaranteed ACH enables a merchant to disregard potential returns. Third party verification tools (like Plaid) are utilized by Nuvei, to validate transactions in real-time, validate consumers, as well as generate consumer risk assessments. If a transaction is approved, Nuvei pays the merchant the following day – regardless of potential returns.

APM Name Nuvei APM Integration Methods
REST API Web SDK Checkout SDK
Secure Bank Transfer apmgw_Secure_Bank_Transfer ✓ ✓ ✓
APM Flow: This APM uses a "Redirect" workflow.
  • The first time the customer performs a bank transfer using a particular bank account, they are "redirected" to select their bank and bank account.
  • Subsequent bank transfers using that bank account are "Direct".
Notes: Using this APM "guarantees" that "the merchant always gets their funds":
  • It allows you to accept ACH payments with no risk of "potential returns", because Nuvei accepts any administrative and NSF return risk. To achieve this, Nuvei uses real-time third-party verification tools to validate transactions, as well as assessing each customer's risk.
  • Once a transaction is approved, it is settled the following day.

Prerequisites and Notes

  • This document assumes that you have completed all the account set up prerequisites, and are ready to integrate the APMs into your payment flow.
  • ACH only supports US based IPs. IP addresses outside the US do not work.
  • Transactions are conducted in US Dollars.
  • Test credentials and testing scenarios should be obtained directly from ACH.
  • You can contact Nuvei Support for any type of assistance.
  • Click tab to open…
    • for REST API
    • for Web SDK
    • for Checkout
    Prerequisites and Notes:
    • In addition to payment request responses, the system sends DMNs (Direct Merchant Notifications) containing the transaction processing results to a specified notificationUrl provided by you. This ensures that you receive transaction results that may not always be immediately available.
    • You should include the notificationUrl in each /payment and /payout request, or set it on the CPanel (hard-coded).

    Prerequisites and Notes:
    • Some parameters can be collected in both the /openOrder request and the createPayment() request.
    • When processing a createPayment() request, if there are multiple input values for the same parameter, then the system chooses a single parameter value depending on two factors:
      • The method used to collect the parameter value.
      • The JSON block the parameter belongs to.
      The following order of precedence is used to choose the single parameter value (from highest priority to lowest):
      1. The billingAddress block collected in the createPayment() request.
      2. The billingAddress block collected in the /openOrder request.
      3. The userDetails block collected in the createPayment() request.
      4. The userDetails block collected in the /openOrder request.

    Prerequisites and Notes:
    • Make sure that ACH APM payment methods described in this guide are included in your Nuvei account.
    • When initiating your payment page using the Checkout methods, set the country to “US” and the currency to “USD”, in order to present these ACH APM payment methods in the Payment Method Gallery.
    • No further integration steps are required.

    for REST API
    Prerequisites and Notes:
    • In addition to payment request responses, the system sends DMNs (Direct Merchant Notifications) containing the transaction processing results to a specified notificationUrl provided by you. This ensures that you receive transaction results that may not always be immediately available.
    • You should include the notificationUrl in each /payment and /payout request, or set it on the CPanel (hard-coded).

    for Web SDK
    Prerequisites and Notes:
    • Some parameters can be collected in both the /openOrder request and the createPayment() request.
    • When processing a createPayment() request, if there are multiple input values for the same parameter, then the system chooses a single parameter value depending on two factors:
      • The method used to collect the parameter value.
      • The JSON block the parameter belongs to.
      The following order of precedence is used to choose the single parameter value (from highest priority to lowest):
      1. The billingAddress block collected in the createPayment() request.
      2. The billingAddress block collected in the /openOrder request.
      3. The userDetails block collected in the createPayment() request.
      4. The userDetails block collected in the /openOrder request.

    for Checkout
    Prerequisites and Notes:
    • Make sure that ACH APM payment methods described in this guide are included in your Nuvei account.
    • When initiating your payment page using the Checkout methods, set the country to “US” and the currency to “USD”, in order to present these ACH APM payment methods in the Payment Method Gallery.
    • No further integration steps are required.


    Bank Transfer (ACH)

    You can use the Bank Transfer (ACH) APM integration perform payments (deposits), payouts (withdrawals), refunds, and voids.

    Nuvei stores your customer’s bank account details in an encrypted UPO (User Payment Option) record in the Nuvei system. A UPO represents a customer bank account or other payment method, for use in future transactions with no need for the customer to enter their payment details again.

    Contact Nuvei Support for implementation support.

    Payments

    The Bank Transfer (ACH) flow begins in your payment page when a customer selects the Bank Transfer (ACH) APM as their payment method.
    Follow the steps in the relevant flow:

    • Payment (Without UPO)
      For new customers, or for payment method details that were not previously captured.
    • Payment (With UPO)
      You can offer “returning customers” the option to select one of their previously captured payment methods.
    Payouts
    • Payout (Withdrawal)
    Refunds
    • See the Refunds topic.
    Voids
    • See the Voids topic.

    Payment (Without UPO)

    Collect Payment Details and Send Request

    Follow the relevant steps for each environment:

    Click tab to open…

    • for REST API
    • for Web SDK
    • for Checkout
    1. The Bank Transfer (ACH) flow begins in your payment page when the customer enters a payment amount and selects the Bank Transfer (ACH) APM as the payment method.
    2. Prompt the customer to enter:
      • AccountNumber – The customer bank account from which to pay.
      • RoutingNumber – The Bank Routing Number for that bank account.
      • firstName
      • lastName
      • email
    3. Generate a sessionToken by sending a /getSessionToken request.
    4. Send a /payment request with its mandatory parameters, and include:
      • sessionToken
      • userTokenId – Unique identifier of the customer in your system
      • amount
      • paymentOption.alternativePaymentMethod block containing:
        • .paymentMethod: "apmgw_ACH"
        • .AccountNumber
        • .RoutingNumber
      • billingAddress block containing: .firstName, .lastName, .email
      • userDetails block containing: .firstName, .lastName, .email
      • urlDetails.notificationUrl
      Example /payment Request (Without UPO)
      {
        "sessionToken": "<sessionToken from getSessionToken>",
        "merchantId": "<your merchantId>",
        "merchantSiteId": "<your merchantSiteId>",
        "userTokenId": "<unique customer identifier in merchant system>",
        "clientRequestId": "<unique request ID in merchant system>",
        "clientUniqueId": "<unique transaction ID in merchant system>",
        "currency": "USD",
        "amount": "1.25",
        "paymentOption": {
          "alternativePaymentMethod": {
            "paymentMethod": "apmgw_ACH",
            "AccountNumber": "111111111",
            "RoutingNumber": "999999992"
          }
        },
        "billingAddress": {
          "firstName": "John",
          "lastName": "Smith",
          "email": "john.smith@email.com",
          "phone": "1112223333",
          "address": "2992 Cameron Road",
          "city": "Newark",
          "zip": "14236",
          "state": "NY",
          "country": "US"
        },
        "userDetails": {
          "firstName": "John",
          "lastName": "Smith",
          "email": "john.smith@email.com",
          "phone": "1112223333",
          "address": "2992 Cameron Road",
          "city": "Newark",
          "zip": "14236",
          "state": "NY",
          "country": "US"
          "identification": "123456780"
        },
        "deviceDetails": {
          "deviceType": "DESKTOP",
          "deviceName": "iPhone 5s",
          "deviceOS": "iOS 10.2",
          "browser": "safari",
          "ipAddress": "192.168.2.38"
        },
        "urlDetails": {
          "notificationUrl": "[The URL to which DMNs are sent]"
        },
        "timeStamp": "<YYYYMMDDHHmmss>",
        "checksum": "<calculated checksum>"
      }

    1. The Bank Transfer (ACH) flow begins in your payment page when the customer enters a payment amount.
    2. Initiate a Session
      Send the amount and a userTokenId (unique identifier of the customer in your system) in an /openOrder request, which authenticates and sets up an order in the Nuvei system, and returns a sessionToken.
    3. Initialize the Web SDK
      This instantiates the Web SDK with the sessionToken received from the server call to /openOrder.
    4. Allow the customer to select the Bank Transfer (ACH) APM as the payment method.
    5. Prompt the customer to enter:
      • AccountNumber – The customer bank account from which to pay.
      • RoutingNumber – The Bank Routing Number for that bank account.
      • firstName
      • lastName
      • email
    6. Send a createPayment() request with its mandatory parameters, and include:
      • sessionToken
      • paymentOption.alternativePaymentMethod block containing:
        • .paymentMethod: "apmgw_ACH"
        • .AccountNumber
        • .RoutingNumber
      • billingAddress block containing: .firstName, .lastName, .email
      • userDetails block containing: .firstName, .lastName, .email
      Example createPayment() Request (Without UPO)
      sfc.createPayment({
        "sessionToken": "<sessiontoken>",
        "paymentOption": {
          "alternativePaymentMethod": {
            "paymentMethod": "apmgw_ACH",
            "AccountNumber": document.getElementById("AccountNumber").value,
            "RoutingNumber": document.getElementById("RoutingNumber").value
          }
        },
        "billingAddress": {
          "firstName": "John",
          "lastName": "Smith",
          "email": "john.smith@email.com",
          "phone": "1112223333",
          "address": "2992 Cameron Road",
          "city": "Newark",
          "zip": "14236",
          "state": "NY",
          "country": "US"
        },
        "userDetails": {
          "firstName": "John",
          "lastName": "Smith",
          "email": "john.smith@email.com",
          "phone": "1112223333",
          "address": "2992 Cameron Road",
          "city": "Newark",
          "zip": "14236",
          "state": "NY",
          "country": "US"
          "identification": "123456780"
        }
      }, function(res) {
        console.log(res);
      })

    • The Bank Transfer (ACH) flow begins when the customer selects the Bank Transfer (ACH) payment method from the Payment Method Gallery.
    • The customer enters Account Number, Routing Number, and Amount, and clicks the Deposit/Process button.

    for REST API
    1. The Bank Transfer (ACH) flow begins in your payment page when the customer enters a payment amount and selects the Bank Transfer (ACH) APM as the payment method.
    2. Prompt the customer to enter:
      • AccountNumber – The customer bank account from which to pay.
      • RoutingNumber – The Bank Routing Number for that bank account.
      • firstName
      • lastName
      • email
    3. Generate a sessionToken by sending a /getSessionToken request.
    4. Send a /payment request with its mandatory parameters, and include:
      • sessionToken
      • userTokenId – Unique identifier of the customer in your system
      • amount
      • paymentOption.alternativePaymentMethod block containing:
        • .paymentMethod: "apmgw_ACH"
        • .AccountNumber
        • .RoutingNumber
      • billingAddress block containing: .firstName, .lastName, .email
      • userDetails block containing: .firstName, .lastName, .email
      • urlDetails.notificationUrl
      Example /payment Request (Without UPO)
      {
        "sessionToken": "<sessionToken from getSessionToken>",
        "merchantId": "<your merchantId>",
        "merchantSiteId": "<your merchantSiteId>",
        "userTokenId": "<unique customer identifier in merchant system>",
        "clientRequestId": "<unique request ID in merchant system>",
        "clientUniqueId": "<unique transaction ID in merchant system>",
        "currency": "USD",
        "amount": "1.25",
        "paymentOption": {
          "alternativePaymentMethod": {
            "paymentMethod": "apmgw_ACH",
            "AccountNumber": "111111111",
            "RoutingNumber": "999999992"
          }
        },
        "billingAddress": {
          "firstName": "John",
          "lastName": "Smith",
          "email": "john.smith@email.com",
          "phone": "1112223333",
          "address": "2992 Cameron Road",
          "city": "Newark",
          "zip": "14236",
          "state": "NY",
          "country": "US"
        },
        "userDetails": {
          "firstName": "John",
          "lastName": "Smith",
          "email": "john.smith@email.com",
          "phone": "1112223333",
          "address": "2992 Cameron Road",
          "city": "Newark",
          "zip": "14236",
          "state": "NY",
          "country": "US"
          "identification": "123456780"
        },
        "deviceDetails": {
          "deviceType": "DESKTOP",
          "deviceName": "iPhone 5s",
          "deviceOS": "iOS 10.2",
          "browser": "safari",
          "ipAddress": "192.168.2.38"
        },
        "urlDetails": {
          "notificationUrl": "[The URL to which DMNs are sent]"
        },
        "timeStamp": "<YYYYMMDDHHmmss>",
        "checksum": "<calculated checksum>"
      }

    for Web SDK
    1. The Bank Transfer (ACH) flow begins in your payment page when the customer enters a payment amount.
    2. Initiate a Session
      Send the amount and a userTokenId (unique identifier of the customer in your system) in an /openOrder request, which authenticates and sets up an order in the Nuvei system, and returns a sessionToken.
    3. Initialize the Web SDK
      This instantiates the Web SDK with the sessionToken received from the server call to /openOrder.
    4. Allow the customer to select the Bank Transfer (ACH) APM as the payment method.
    5. Prompt the customer to enter:
      • AccountNumber – The customer bank account from which to pay.
      • RoutingNumber – The Bank Routing Number for that bank account.
      • firstName
      • lastName
      • email
    6. Send a createPayment() request with its mandatory parameters, and include:
      • sessionToken
      • paymentOption.alternativePaymentMethod block containing:
        • .paymentMethod: "apmgw_ACH"
        • .AccountNumber
        • .RoutingNumber
      • billingAddress block containing: .firstName, .lastName, .email
      • userDetails block containing: .firstName, .lastName, .email
      Example createPayment() Request (Without UPO)
      sfc.createPayment({
        "sessionToken": "<sessiontoken>",
        "paymentOption": {
          "alternativePaymentMethod": {
            "paymentMethod": "apmgw_ACH",
            "AccountNumber": document.getElementById("AccountNumber").value,
            "RoutingNumber": document.getElementById("RoutingNumber").value
          }
        },
        "billingAddress": {
          "firstName": "John",
          "lastName": "Smith",
          "email": "john.smith@email.com",
          "phone": "1112223333",
          "address": "2992 Cameron Road",
          "city": "Newark",
          "zip": "14236",
          "state": "NY",
          "country": "US"
        },
        "userDetails": {
          "firstName": "John",
          "lastName": "Smith",
          "email": "john.smith@email.com",
          "phone": "1112223333",
          "address": "2992 Cameron Road",
          "city": "Newark",
          "zip": "14236",
          "state": "NY",
          "country": "US"
          "identification": "123456780"
        }
      }, function(res) {
        console.log(res);
      })

    for Checkout
    • The Bank Transfer (ACH) flow begins when the customer selects the Bank Transfer (ACH) payment method from the Payment Method Gallery.
    • The customer enters Account Number, Routing Number, and Amount, and clicks the Deposit/Process button.

    Handling the Response

    As the transaction progresses in the flow from PENDING to UPDATE to APPROVED, you will receive responses anf DMN notifications:

    1. transactionStatus=PENDING:
      The request returns:
      • A response that includes "transactionStatus": "PENDING" and a "userPaymentOptionId".
        Example of Some Parameters Returned
        {
          ...
          ...
          "transactionId":"36682151",
          "paymentOption": {
            "userPaymentOptionId": "8100521",
            "card": {}
          },
          "transactionStatus": "PENDING",
          ...
          ...
        }
      • A DMN containing "Status=PENDING".
        See Example “Status=PENDING” DMN.
    2. transactionStatus=UPDATE:
      • After a short time period, a preApprovalId is generated and stored in the UPO record.
        The preApprovalId indicates that:
        • The customer payment method is authenticated, and there is no need to perform the authentication process again. This allows the system to automatically approve certain payment transactions when this UPO is used in the future.
        • If this is an initial recurring payment, then the customer allows you to create subsequent recurring payments on their behalf, without their presence, according to some rebilling agreement.
      • You will receive a DMN notification containing "Status=UPDATE".
        See Example “Status=UPDATE” DMN.
    3. transactionStatus=APPROVED:
      The request is processed and returns a transaction notification with the final status within 2-5 days.
      • If the transfer is successful, then the following is returned:
        • A response with “status=APPROVED“.
        • A DMN notification containing “status=APPROVED“.
          See Example “Status=APPROVED” DMN.
      • If the transfer is not successful, then the following is returned:
        • A response with “status=DECLINED“.
        • A DMN notification containing “status=DECLINED“.

    Payment (With UPO)

    Collect Payment Details and Send Request

    Follow the relevant steps for each environment:

    Click tab to open…

    • for REST API
    • for Web SDK
    • for Checkout
    1. The Bank Transfer (ACH) flow begins in your payment page when a “returning customer” enters a payment amount and selects the Bank Transfer (ACH) APM as the payment method.
    2. Call a /getUserUPOs request to retrieve a list of the customer’s UPOs.
      (If no appropriate UPOs are returned, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.)
    3. Offer the “returning customer” the option to select one their previously captured payment methods (stored in a UPO record, representing the customer’s bank account), instead of collecting their bank account details again.
      • If the customer selects one their previously captured payment methods (UPOs), then continue with the next step.
      • If not, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.
    4. Generate a sessionToken by sending a /getSessionToken request.
    5. Send a /payment request with its mandatory parameters, and include:
      • sessionToken
      • userTokenId
      • amount
      • "paymentOption.userPaymentOptionId": "<userPaymentOptionId of a previously stored customer payment method>" selected by the customer.
      • paymentOption.alternativePaymentMethod block containing:
        • .paymentMethod: "apmgw_ACH"
        • .AccountNumber
        • .RoutingNumber
      • billingAddress block containing: .firstName, .lastName, .email
      • urlDetails.notificationUrl
      Example of some parameters in the /payment Request (With UPO)
      {
        ...
        ...
        "sessionToken": "<sessionToken from getSessionToken>",
        "userTokenId": "<unique customer identifier in merchant system>",
        "amount": "125",
        "paymentOption": { 
          "userPaymentOptionId": "8100521",   
          "alternativePaymentMethod": {
            "paymentMethod": "apmgw_ACH",
            "AccountNumber": "111111111",
            "RoutingNumber": "999999992" 
          }
        },
        "billingAddress": {
          "firstName": "John",
          "lastName": "Smith",
          "email": "john.smith@email.com"
        },
        "urlDetails": {
          "notificationUrl": "[The URL to which DMNs are sent]"
        },
        ...
        ...
      }

    1. The Bank Transfer (ACH) flow begins in your payment page when a “returning customer” enters a payment amount.
    2. Initiate a Session
      Send the amount and a userTokenId (unique identifier of the customer in your system) in an /openOrder request, which authenticates and sets up an order in the Nuvei system, and returns a sessionToken.
    3. Initialize the Web SDK
      This instantiates the Web SDK with the sessionToken received from the server call to /openOrder.
    4. Allow the customer to select the Bank Transfer (ACH) APM as the payment method.
    5. Call a /getUserUPOs request to retrieve a list of the customer’s UPOs.
      (If no appropriate UPOs are returned, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.)
    6. Offer the “returning customer” the option to select one their previously captured payment methods (stored in a UPO record, representing the customer’s bank account), instead of collecting their bank account details again.
      • If the customer selects one their previously captured payment methods (UPOs), then continue with the next step.
      • If not, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.
    7. Send a createPayment() request with its mandatory parameters, and include:
      • sessionToken
      • "userPaymentOptionId": "<userPaymentOptionId of a previously stored customer payment method>" selected by the customer.
      • paymentOption.alternativePaymentMethod block containing:
        • .paymentMethod: "apmgw_ACH"
        • .AccountNumber
        • .RoutingNumber
      Example createPayment() Request (With UPO)
      sfc.createPayment({
        "sessionToken": "<sessiontoken>",
        "paymentOption": {
          "userPaymentOptionId": "8100521",
          "alternativePaymentMethod": {
            "paymentMethod": "apmgw_ACH",
            "AccountNumber": "111111111",
            "RoutingNumber": "999999992"
          }      
        }
      }, function(res) {
        console.log(res);
      })

    • The Bank Transfer (ACH) flow begins when the customer selects the Bank Transfer (ACH) payment method from the Payment Method Gallery.
    • The customer selects one their previously captured payment methods (UPOs), enters an amount, and clicks the Deposit/Process button.

    for REST API
    1. The Bank Transfer (ACH) flow begins in your payment page when a “returning customer” enters a payment amount and selects the Bank Transfer (ACH) APM as the payment method.
    2. Call a /getUserUPOs request to retrieve a list of the customer’s UPOs.
      (If no appropriate UPOs are returned, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.)
    3. Offer the “returning customer” the option to select one their previously captured payment methods (stored in a UPO record, representing the customer’s bank account), instead of collecting their bank account details again.
      • If the customer selects one their previously captured payment methods (UPOs), then continue with the next step.
      • If not, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.
    4. Generate a sessionToken by sending a /getSessionToken request.
    5. Send a /payment request with its mandatory parameters, and include:
      • sessionToken
      • userTokenId
      • amount
      • "paymentOption.userPaymentOptionId": "<userPaymentOptionId of a previously stored customer payment method>" selected by the customer.
      • paymentOption.alternativePaymentMethod block containing:
        • .paymentMethod: "apmgw_ACH"
        • .AccountNumber
        • .RoutingNumber
      • billingAddress block containing: .firstName, .lastName, .email
      • urlDetails.notificationUrl
      Example of some parameters in the /payment Request (With UPO)
      {
        ...
        ...
        "sessionToken": "<sessionToken from getSessionToken>",
        "userTokenId": "<unique customer identifier in merchant system>",
        "amount": "125",
        "paymentOption": { 
          "userPaymentOptionId": "8100521",   
          "alternativePaymentMethod": {
            "paymentMethod": "apmgw_ACH",
            "AccountNumber": "111111111",
            "RoutingNumber": "999999992" 
          }
        },
        "billingAddress": {
          "firstName": "John",
          "lastName": "Smith",
          "email": "john.smith@email.com"
        },
        "urlDetails": {
          "notificationUrl": "[The URL to which DMNs are sent]"
        },
        ...
        ...
      }

    for Web SDK
    1. The Bank Transfer (ACH) flow begins in your payment page when a “returning customer” enters a payment amount.
    2. Initiate a Session
      Send the amount and a userTokenId (unique identifier of the customer in your system) in an /openOrder request, which authenticates and sets up an order in the Nuvei system, and returns a sessionToken.
    3. Initialize the Web SDK
      This instantiates the Web SDK with the sessionToken received from the server call to /openOrder.
    4. Allow the customer to select the Bank Transfer (ACH) APM as the payment method.
    5. Call a /getUserUPOs request to retrieve a list of the customer’s UPOs.
      (If no appropriate UPOs are returned, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.)
    6. Offer the “returning customer” the option to select one their previously captured payment methods (stored in a UPO record, representing the customer’s bank account), instead of collecting their bank account details again.
      • If the customer selects one their previously captured payment methods (UPOs), then continue with the next step.
      • If not, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.
    7. Send a createPayment() request with its mandatory parameters, and include:
      • sessionToken
      • "userPaymentOptionId": "<userPaymentOptionId of a previously stored customer payment method>" selected by the customer.
      • paymentOption.alternativePaymentMethod block containing:
        • .paymentMethod: "apmgw_ACH"
        • .AccountNumber
        • .RoutingNumber
      Example createPayment() Request (With UPO)
      sfc.createPayment({
        "sessionToken": "<sessiontoken>",
        "paymentOption": {
          "userPaymentOptionId": "8100521",
          "alternativePaymentMethod": {
            "paymentMethod": "apmgw_ACH",
            "AccountNumber": "111111111",
            "RoutingNumber": "999999992"
          }      
        }
      }, function(res) {
        console.log(res);
      })

    for Checkout
    • The Bank Transfer (ACH) flow begins when the customer selects the Bank Transfer (ACH) payment method from the Payment Method Gallery.
    • The customer selects one their previously captured payment methods (UPOs), enters an amount, and clicks the Deposit/Process button.

    Handling the Response

    You will receive a DMN notification as the transaction Status progresses from PENDING to UPDATE to APPROVED:
    (The next steps are identical to the steps in Payment (Without UPO) above)

    1. transactionStatus=PENDING
    2. transactionStatus=UPDATE
    3. transactionStatus=APPROVED

    Payout (Withdrawal)

    A Payout (Withdrawal) is performed using the REST API /payout request.

    Prerequisites

    A /payout request is performed using a UPO (representing the customer bank account).

    UPOs can be generated in the following ways:

    • A UPO is automatically created upon successful completion of a /payment request, as described in the payment topics.
    • Alternatively, you can generate a UPO as described in the Generating UPOs topic.

    Sending a /payout Request

    Call the /payout request with its mandatory parameters and include:

    • userTokenId
    • userPaymentOption.userPaymentOptionId
    • urlDetails.notificationUrl
    • The following parameters may be required if they are not already stored in the UPO:
      userDetails block containing: .firstName, .lastName, .email
    Example /payout Request
    {
      "merchantId": "<your merchantId>",
      "merchantSiteId": "<your merchantSiteId>",
      "userTokenId": "<unique customer identifier in merchant system>",
      "clientUniqueId": "<unique transaction ID in merchant system>",
      "clientRequestId": "<unique request ID in merchant system>",
      "currency": "USD",
      "amount": "35",
      "userPaymentOption": {
        "userPaymentOptionId": "<UPO received from previous deposit>"
      },  
      "deviceDetails": {
        "ipAddress": "127.0.0.1"
      },
      "urlDetails": {
        "notificationUrl": "<The URL to which DMNs are sent>"
      },
      "timeStamp": "<YYYYMMDDHHmmss>",
      "checksum": "<calculated checksum>"
    }

    The request is processed, and returns a transaction notification with the final status.

    • If the transaction is successful, then the following is returned:
      • A response with “status=APPROVED“.
      • A DMN notification containing “status=APPROVED“.
    • If the transaction is not successful, then the following is returned:
      • A response with “status=DECLINED“.
      • A DMN notification containing “status=DECLINED“.
    Example /payout Response
    {
      "reason": "",
      "transactionStatus": "APPROVED",
      "clientRequestId": "W1Q3SBGE4",
      "internalRequestId": 17817071,
      "version": "1.0",
      "transactionId": "2110000000004333013",
      "merchantSiteId": "126006",
      "merchantId": "2502136204546424962",
      "clientUniqueId": "695701003",
      "errCode": 0,
      "userPaymentOptionId": "8054521",
      "paymentMethodErrorCode": "0",
      "userTokenId": "CEBQK9OVSLJA",
      "externalTransactionId": "2110000000068709",
      "status": "SUCCESS"
    }

    Secure Bank Transfer

    Prerequisites and Notes

    Accepting the Nuvei Privacy Policy: Customers using the Secure Bank Transfer APM for the first time are required to:

    • Have access to a “Privacy Notice” link in order to view the Nuvei Privacy Notice (https://nuvei.com/privacy-notice/).
    • Must select the “I agree to the Privacy Policy” checkbox, before being allowed to continue to the next step.

    The Secure Bank Transfer payment flow begins in your payment page when a customer selects the Secure Bank Transfer APM as their payment method.

    • For a new customer, follow the steps in the Payment (Without UPO) flow.
    • For a “returning customer”, offer them the option to select one their previously captured payment methods. Follow the steps in the Payment (With UPO) flow.

    Payment (Without UPO)

    1. Collect the payment details and send the request:
      Click tab to open…
      • for REST API
      • for Web SDK
      • for Checkout
      1. The Secure Bank Transfer flow begins in your payment page when the customer enters an amount they wish to transfer, and selects the Secure Bank Transfer APM as the payment method.
      2. Display a “Privacy Notice” link that the customer can click to view the Nuvei Privacy Notice (https://nuvei.com/privacy-notice/).
        Display the “I agree to the Privacy Policy” checkbox, which the customer must select before allowing them to continue to the next step.
      3. Prompt the customer to enter their user details: firstName, lastName, email, phone, address, city, zip, state, identification.
      4. Generate a sessionToken by sending a /getSessionToken request.
      5. Send a /payment request with its mandatory parameters, and include:
        • sessionToken
        • userTokenId – Unique identifier of the customer in your system
        • amount
        • paymentOption.alternativePaymentMethod: "apmgw_Secure_Bank_Transfer"
        • billingAddress block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state.
        • userDetails block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .identification.
        • urlDetails.notificationUrl
        Example /payment Request (Without UPO)
        {
          "sessionToken": "<sessionToken from getSessionToken>",
          "merchantId": "<your merchantId>",
          "merchantSiteId": "<your merchantSiteId>",
          "userTokenId": "<unique customer identifier in merchant system>",
          "clientRequestId": "<unique request ID in merchant system>",
          "clientUniqueId": "<unique transaction ID in merchant system>",
          "currency": "USD",
          "amount": "1",
          "paymentOption": {
            "alternativePaymentMethod": {
              "paymentMethod": "apmgw_Secure_Bank_Transfer"
            }
          },
          "billingAddress": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US"
          },
          "userDetails": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US",
            "identification": "123456780"
          },
          "deviceDetails": {
            "deviceType": "DESKTOP",
            "deviceName": "iPhone 5s",
            "deviceOS": "iOS 10.2",
            "browser": "safari",
            "ipAddress": "192.168.2.38"
          },
          "urlDetails": {
            "notificationUrl": "[The URL to which DMNs are sent]"
          },
          "timeStamp": "<YYYYMMDDHHmmss>",
          "checksum": "<calculated checksum>"
        }

      1. The Secure Bank Transfer flow begins in your payment page when the customer enters a payment amount.
      2. Initiate a Session
        Send the amount and a userTokenId (unique identifier of the customer in your system) in an /openOrder request, which authenticates and sets up an order in the Nuvei system, and returns a sessionToken.
      3. Initialize the Web SDK
        This instantiates the Web SDK with the sessionToken received from the server call to /openOrder.
      4. Display a “Privacy Notice” link that the customer can click to view the Nuvei Privacy Notice (https://nuvei.com/privacy-notice/).
        Display the “I agree to the Privacy Policy” checkbox, which the customer must select before allowing them to continue to the next step.
      5. Allow the customer to select the Secure Bank Transfer APM as the payment method.
      6. Prompt the customer to enter their user details: firstName, lastName, email, phone, address, city, zip, state, identification.
      7. Send a createPayment() request with its mandatory parameters, and include:
        • sessionToken
        • paymentOption.alternativePaymentMethod: "apmgw_Secure_Bank_Transfer"
        • billingAddress block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country.
        • userDetails block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country, .identification.
        Example createPayment() Request (Without UPO)
        sfc.createPayment({
          "sessionToken": "<sessiontoken>",
          "paymentOption": {
            "alternativePaymentMethod": {
              "paymentMethod": "apmgw_Secure_Bank_Transfer"
            }
          },
          "billingAddress": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US"
          },
          "userDetails": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US",
            "identification": "123456780"
          }
        }, function(res) {
          console.log(res);
        })

      • The Secure Bank Transfer flow begins when the customer selects the Secure Bank Transfer payment method from the Payment Method Gallery.
      • The customer enters the Amount and the other required details, selects the “I agree to the Privacy Policy” checkbox, and clicks the Deposit/Process button.
      • The customer is redirected to their bank’s site, so they can capture the bank account details of the account they want to pay from.

      for REST API
      1. The Secure Bank Transfer flow begins in your payment page when the customer enters an amount they wish to transfer, and selects the Secure Bank Transfer APM as the payment method.
      2. Display a “Privacy Notice” link that the customer can click to view the Nuvei Privacy Notice (https://nuvei.com/privacy-notice/).
        Display the “I agree to the Privacy Policy” checkbox, which the customer must select before allowing them to continue to the next step.
      3. Prompt the customer to enter their user details: firstName, lastName, email, phone, address, city, zip, state, identification.
      4. Generate a sessionToken by sending a /getSessionToken request.
      5. Send a /payment request with its mandatory parameters, and include:
        • sessionToken
        • userTokenId – Unique identifier of the customer in your system
        • amount
        • paymentOption.alternativePaymentMethod: "apmgw_Secure_Bank_Transfer"
        • billingAddress block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state.
        • userDetails block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .identification.
        • urlDetails.notificationUrl
        Example /payment Request (Without UPO)
        {
          "sessionToken": "<sessionToken from getSessionToken>",
          "merchantId": "<your merchantId>",
          "merchantSiteId": "<your merchantSiteId>",
          "userTokenId": "<unique customer identifier in merchant system>",
          "clientRequestId": "<unique request ID in merchant system>",
          "clientUniqueId": "<unique transaction ID in merchant system>",
          "currency": "USD",
          "amount": "1",
          "paymentOption": {
            "alternativePaymentMethod": {
              "paymentMethod": "apmgw_Secure_Bank_Transfer"
            }
          },
          "billingAddress": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US"
          },
          "userDetails": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US",
            "identification": "123456780"
          },
          "deviceDetails": {
            "deviceType": "DESKTOP",
            "deviceName": "iPhone 5s",
            "deviceOS": "iOS 10.2",
            "browser": "safari",
            "ipAddress": "192.168.2.38"
          },
          "urlDetails": {
            "notificationUrl": "[The URL to which DMNs are sent]"
          },
          "timeStamp": "<YYYYMMDDHHmmss>",
          "checksum": "<calculated checksum>"
        }

      for Web SDK
      1. The Secure Bank Transfer flow begins in your payment page when the customer enters a payment amount.
      2. Initiate a Session
        Send the amount and a userTokenId (unique identifier of the customer in your system) in an /openOrder request, which authenticates and sets up an order in the Nuvei system, and returns a sessionToken.
      3. Initialize the Web SDK
        This instantiates the Web SDK with the sessionToken received from the server call to /openOrder.
      4. Display a “Privacy Notice” link that the customer can click to view the Nuvei Privacy Notice (https://nuvei.com/privacy-notice/).
        Display the “I agree to the Privacy Policy” checkbox, which the customer must select before allowing them to continue to the next step.
      5. Allow the customer to select the Secure Bank Transfer APM as the payment method.
      6. Prompt the customer to enter their user details: firstName, lastName, email, phone, address, city, zip, state, identification.
      7. Send a createPayment() request with its mandatory parameters, and include:
        • sessionToken
        • paymentOption.alternativePaymentMethod: "apmgw_Secure_Bank_Transfer"
        • billingAddress block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country.
        • userDetails block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country, .identification.
        Example createPayment() Request (Without UPO)
        sfc.createPayment({
          "sessionToken": "<sessiontoken>",
          "paymentOption": {
            "alternativePaymentMethod": {
              "paymentMethod": "apmgw_Secure_Bank_Transfer"
            }
          },
          "billingAddress": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US"
          },
          "userDetails": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US",
            "identification": "123456780"
          }
        }, function(res) {
          console.log(res);
        })

      for Checkout
      • The Secure Bank Transfer flow begins when the customer selects the Secure Bank Transfer payment method from the Payment Method Gallery.
      • The customer enters the Amount and the other required details, selects the “I agree to the Privacy Policy” checkbox, and clicks the Deposit/Process button.
      • The customer is redirected to their bank’s site, so they can capture the bank account details of the account they want to pay from.

    2. Skip this step for Nuvei Checkout.

      A successful request returns a paymentOption.redirectUrl (to a Secure Bank Transfer URL).
      Example of a Successful Response with a paymentOption.redirectUrl
      {
        "reason": "",
        "orderId": "36298881",
        "transactionStatus": "REDIRECT",
        "clientRequestId": "GF1XTXTBM",
        "internalRequestId": 17817111,
        "version": "1.0",
        "merchantSiteId": "126006",
        "merchantId": "2502136204546424962",
        "clientUniqueId": "695701003",
        "errCode": 0,
        "paymentOption": {
          "redirectUrl": "https://cdn-int.safecharge.com/safecharge_resources/v1/get_to_post/index.html?eyJhbGciOiJSUzI1NiJ9.eyJkZXRhaWxzIjoiNzRDQkZEODMyOUI1RDMwMjNDM0YwNUJERThGRkFEMDRGQUNEMURCQUZFMEYxM0QwMzhFQkU5RjRCMzhFMTY2RTY5NEI0QzhDMDg2RjYzMDM2RTdCMkIyREVBRjRENTIyNkM2RDg1RUE5NkI2QjIzNjEzMUVBREI0NDBGRjU0QzE0RThGM0ZCODg2QzUwQzcyMTYxMURBMkNBQzg1NzI2NjRCOEE4ODE0MThEMkJCMjBFNTAzRDE4MTRBMkJBM0M1NjM3RDBCNkFFRDU5MUVFQzk2NEQwMUE2OEFFRUQyMDBBMUJBRUQ4RUIxNDBGNEEwQkQ2OTE3MzYxMEM4Rjg1MTAwMjMxREEzQkRDNUZGMkNGOUNGRURCQkZFMTQ2REEwMDdCQUY4QUUzN0Q1Q0JEQTYzOTQyNDhGMkFEQzhFMzMyODU4NzQ5MzUyNTI2NDFFREREM0Q4ODEwQTE3RkVCNTlBMjY4ODBCMkI2NjYzRkVENjk3RjRBMDhERTFBNzVDRDdBMzk2MzBGRjJBREU1Mjk0N0FERjFFQUVFMDA4Nzg4Q0REN0RCNjM5M0QwRTNEOTFBQkVERTY3MDFBMUQ0RkU3M0M3RTQwNUQ5RjlCNzZDMUYxRjQ5QzIxMjU4RERENDVDQUFDNTNERDg4MEVBNTk2Mzk1QzBDRDQ4NUY0OTQ4M0VERURGNDJFRkQzMUJBNkIwMUYwMTFGMTVGNzAyMUI2OTRBOUQ1NTU0OEEyQ0FDNUQ3MzVBNTgyMkJCMEFDOUFCQjhBQzc1Q0UxNzc1NjI0QzY1QUQ1MDU4NTVCRDI5RjFCMjJCMDlCREExM0I1QkFFQ0ZEMTA1MUI2NTQ4QTUxQkJDNDlEOTlCQUI4MUZERjAwNzAyQTBDQ0IyQTk3MDVENzE2MkZFRUQ5RjEzN0ZGN0FGMDUwNUIyMUIwOTY2RDA2NTFFQkRDRDA1MkY0RTE4MDY5ODlCOEFBQjJDMTIxNkIzNzJDREQ5RDQ0RDQ2N0EwOEUwQjI4MkUzOTkwNjAwOTcyQ0NDNEYwQjZEMDdERDg1ODk2MDYzM0UwNkExQ0VGRTY0OEExNzBDOTA3RjA3Qzg4NDA4NDI0MzQzRjNGQjM1MDZFN0EzRkEwNkQ0MDY5M0QyQkE3MzBGQTdCNzc3NDFFQUU2NDg2NEI2NjE3MDdGMzY0MDNCMTQyOTJDMTM1NzI5NDUwQ0YxRDk3NTcxQUE5NzJDQzg1MTVGQSIsIm1lcmNoYW50X2lkIjoiU2ZDaGFyZ2UiLCJpdiI6Ijk5RTM0MEMyNzg0MkNBOTlCQkIxQzUyNzVFQUFFNURBIiwidXJsIjoiaHR0cHM6Ly9zdGFnaW5nLnZlcmlmaWVkYWNoLmNvbS9jb25zdW1lci9BY3F1aXJlSW5mb0dhdGV3YXkuZG8ifQ.EF3K5UsPQYdua_YcRd9Yefl-KemNwEMq5-EXV7QWAZUbCQglncAaAHzzlW-sxq2XcVZcZ2qbxLkQqjzkB3tItTGUDmqysL-opqOdaaz54EKeHKC5hzQIp77DucIGYQhPxfOB_eAxTOPLvZ85c3woJ37m8BH8kuJPSoAjYrZ12geEQJQx4R2VxNT3QsxxryEWZvU1yKc8mjCl011nWz6cp4LZpHIMwUwvdCMJWUeJtAxC-Q6Ec4NqP93AFki9Ln0OOvenbOEBn3UpK_BncxKu7RFOzM8w4kSf0eopKC44awlROwZaO0k0htJAUikA_W-fgeLISuMpHmWMZz6X3Ju2Bg",
          "userPaymentOptionId": "8061731",
          "card": {}
        },
        "sessionToken": "6fa38ea2-6f1a-4620-85ae-7deaf0d5f8f1",
        "userTokenId": "2J6QZH3UF9E2",
        "status": "SUCCESS"
      }
    3. Skip this step for Nuvei Checkout.

      Redirect the customer to their bank’s site, so they can capture the bank account details of the account they want to pay from.
    4. The request is processed, and returns a transaction notification with the final status.
      • If the transfer is successful, then the following is returned:
        • A response with “status=APPROVED“.
        • A userPaymentOptionId (UPO):
          • This represents the customer’s bank account in the Nuvei system. It can be used in future payment transactions to represent the customer’s bank account details.
          • A preApprovalId is stored in the UPO record. This is used by the system to automatically approve certain payment transactions when this payment method is used in the future.

            The preApprovalId indicates that:

            1. The specified customer payment method is authenticated, and there is no need to perform the authentication process again.
            2. If this was an initial recurring payment, then the customer allows you to create subsequent recurring payments on their behalf, without their presence, according to some rebilling agreement.
        • A DMN notification that includes the result of the transaction (“status=APPROVED“), sent to the urlDetails.notificationUrl parameter that you provided in the request.
      • If the transfer is not successful, then the following is returned:
        • A response with “status=DECLINED“.
        • A DMN notification that includes the result of the transaction (“status=DECLINED“).

    Payment (With UPO)

    1. Collect the payment details and send the request:
      Click tab to open…
      • for REST API
      • for Web SDK
      • for Checkout
      1. The Secure Bank Transfer payment flow begins in your payment page when a “returning customers” enters an amount they wish to transfer, and selects the Secure Bank Transfer APM as the payment method.
      2. Generate a sessionToken by sending a /getSessionToken request.
      3. Call a /getUserUPOs request to retrieve a list of the customer’s UPOs.
        (If no appropriate UPOs are returned, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.)
      4. Offer the “returning customer” the option to select one their previously captured payment methods (stored in a UPO record, representing the customer’s bank account), instead of collecting their bank account details again.
        • If the customer selects one their previously captured payment methods (UPOs), then continue with the next step.
        • If the customer does not select one of their existing UPOs, then skip the rest of these steps and perform the steps in the Payment (Without UPO) flow instead.
      5. Send a /payment request with its mandatory parameters, and include:
        • sessionToken
        • userTokenId – Unique identifier of the customer in your system
        • amount
        • "userPaymentOptionId": "<userPaymentOptionId of a previously stored customer payment method>"
        • paymentOption.alternativePaymentMethod: "apmgw_Secure_Bank_Transfer"
        • billingAddress block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country.
        • userDetails block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country, .identification.
        • urlDetails.notificationUrl
        Example of some parameters in the /payment Request (With UPO)
        {
          ...
          ...
          "sessionToken": "<sessionToken from getSessionToken>",
          "userTokenId": "<unique customer identifier in merchant system>",
          "amount": "125",
          "paymentOption": {
            "userPaymentOptionId": "8100521",
            "alternativePaymentMethod": {
              "paymentMethod": "apmgw_Secure_Bank_Transfer"
            }
          },
          "billingAddress": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US"
          },
          "userDetails": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US",
            "identification": "123456780"
          },
          "urlDetails": {
            "notificationUrl": "[The URL to which DMNs are sent]"
          },
          ...
          ...
        }

      1. The Secure Bank Transfer flow begins in your payment page when a “returning customer” enters a payment amount.
      2. Initiate a Session
        Send the amount and a userTokenId (unique identifier of the customer in your system) in an /openOrder request, which authenticates and sets up an order in the Nuvei system, and returns a sessionToken.
      3. Initialize the Web SDK
        This instantiates the Web SDK with the sessionToken received from the server call to /openOrder.
      4. Allow the customer to select the Secure Bank Transfer APM as the payment method.
      5. Call a /getUserUPOs request to retrieve a list of the customer’s UPOs.
        (If no appropriate UPOs are returned, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.)
      6. Offer the “returning customer” the option to select one their previously captured payment methods (stored in a UPO record, representing the customer’s bank account), instead of collecting their bank account details again.
        • If the customer selects one their previously captured payment methods (UPOs), then continue with the next step.
        • If not, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.
      7. Send a createPayment() request with its mandatory parameters, and include:
        • sessionToken
        • "userPaymentOptionId": "<userPaymentOptionId of a previously stored customer payment method>" selected by the customer.
        • paymentOption.alternativePaymentMethod: "apmgw_Secure_Bank_Transfer"
        • billingAddress block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country.
        • userDetails block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country, .identification.
        Example createPayment() Request (With UPO)
        sfc.createPayment({
          "sessionToken": "<sessiontoken>",  
          "paymentOption": {
            "userPaymentOptionId": "8100521",
            "alternativePaymentMethod": {
              "paymentMethod": "apmgw_Secure_Bank_Transfer"      
            }
          },
          "billingAddress": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US"
          },
          "userDetails": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US",
            "identification": "123456780"
          }
        }, function(res) {
          console.log(res);
        })

      • The Secure Bank Transfer flow begins when the customer selects the Secure Bank Transfer payment method from the Payment Method Gallery.
      • The customer selects one their previously captured payment methods (UPOs), enters an amount, and clicks the Deposit/Process button.

      for REST API
      1. The Secure Bank Transfer payment flow begins in your payment page when a “returning customers” enters an amount they wish to transfer, and selects the Secure Bank Transfer APM as the payment method.
      2. Generate a sessionToken by sending a /getSessionToken request.
      3. Call a /getUserUPOs request to retrieve a list of the customer’s UPOs.
        (If no appropriate UPOs are returned, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.)
      4. Offer the “returning customer” the option to select one their previously captured payment methods (stored in a UPO record, representing the customer’s bank account), instead of collecting their bank account details again.
        • If the customer selects one their previously captured payment methods (UPOs), then continue with the next step.
        • If the customer does not select one of their existing UPOs, then skip the rest of these steps and perform the steps in the Payment (Without UPO) flow instead.
      5. Send a /payment request with its mandatory parameters, and include:
        • sessionToken
        • userTokenId – Unique identifier of the customer in your system
        • amount
        • "userPaymentOptionId": "<userPaymentOptionId of a previously stored customer payment method>"
        • paymentOption.alternativePaymentMethod: "apmgw_Secure_Bank_Transfer"
        • billingAddress block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country.
        • userDetails block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country, .identification.
        • urlDetails.notificationUrl
        Example of some parameters in the /payment Request (With UPO)
        {
          ...
          ...
          "sessionToken": "<sessionToken from getSessionToken>",
          "userTokenId": "<unique customer identifier in merchant system>",
          "amount": "125",
          "paymentOption": {
            "userPaymentOptionId": "8100521",
            "alternativePaymentMethod": {
              "paymentMethod": "apmgw_Secure_Bank_Transfer"
            }
          },
          "billingAddress": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US"
          },
          "userDetails": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US",
            "identification": "123456780"
          },
          "urlDetails": {
            "notificationUrl": "[The URL to which DMNs are sent]"
          },
          ...
          ...
        }

      for Web SDK
      1. The Secure Bank Transfer flow begins in your payment page when a “returning customer” enters a payment amount.
      2. Initiate a Session
        Send the amount and a userTokenId (unique identifier of the customer in your system) in an /openOrder request, which authenticates and sets up an order in the Nuvei system, and returns a sessionToken.
      3. Initialize the Web SDK
        This instantiates the Web SDK with the sessionToken received from the server call to /openOrder.
      4. Allow the customer to select the Secure Bank Transfer APM as the payment method.
      5. Call a /getUserUPOs request to retrieve a list of the customer’s UPOs.
        (If no appropriate UPOs are returned, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.)
      6. Offer the “returning customer” the option to select one their previously captured payment methods (stored in a UPO record, representing the customer’s bank account), instead of collecting their bank account details again.
        • If the customer selects one their previously captured payment methods (UPOs), then continue with the next step.
        • If not, then skip the rest of these steps, and perform the steps in the Payment (Without UPO) flow instead.
      7. Send a createPayment() request with its mandatory parameters, and include:
        • sessionToken
        • "userPaymentOptionId": "<userPaymentOptionId of a previously stored customer payment method>" selected by the customer.
        • paymentOption.alternativePaymentMethod: "apmgw_Secure_Bank_Transfer"
        • billingAddress block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country.
        • userDetails block containing: .firstName, .lastName, .email, .phone, .address, .city, .zip, .state, .country, .identification.
        Example createPayment() Request (With UPO)
        sfc.createPayment({
          "sessionToken": "<sessiontoken>",  
          "paymentOption": {
            "userPaymentOptionId": "8100521",
            "alternativePaymentMethod": {
              "paymentMethod": "apmgw_Secure_Bank_Transfer"      
            }
          },
          "billingAddress": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US"
          },
          "userDetails": {
            "firstName": "John",
            "lastName": "Smith",
            "email": "john.smith@email.com",
            "phone": "1112223333",
            "address": "2992 Cameron Road",
            "city": "Newark",
            "zip": "14236",
            "state": "NY",
            "country": "US",
            "identification": "123456780"
          }
        }, function(res) {
          console.log(res);
        })

      for Checkout
      • The Secure Bank Transfer flow begins when the customer selects the Secure Bank Transfer payment method from the Payment Method Gallery.
      • The customer selects one their previously captured payment methods (UPOs), enters an amount, and clicks the Deposit/Process button.

    2. The request is processed:
      • If the UPO (the payment method selected by the customer) has a preApprovalId (generated after a previous successful payment transaction), then Nuvei does not send the transaction to Secure Bank Transfer for processing.
        Instead, the Nuvei APM Gateway immediately responds with “status=APPROVED” or “status=DECLINED“, according to rules set by Secure Bank Transfer.
      • If the UPO does not have a preApprovalId, then Secure Bank Transfer processes the transaction, and returns a transaction notification with the final status.
        See step 4 (The request is processed…..) in Payment (Without UPO) (above)

    Appendix

    Generating UPOs

    Introduction

    A userPaymentOptionId (UPO) represents a customer bank account in the Nuvei system. It is normally generated automatically upon successful completion of a /payment request.

    However, you can also generate a UPO without first sending a /payment request first, as described below.

    Prerequisites

    The userTokenId is a mandatory parameter when sending a /addUPOAPM request.

    A userTokenId is the unique identifier of your customer in your system. It is normally registered in the Nuvei system automatically upon successful completion of a /payment request.

    If the customer’s userTokenId is not yet registered in the Nuvei system, then you can register it by sending a /createUser request with its mandatory parameters, and include these additional parameters: firstName, lastName, and email.

    Example /createUser Request
    {
      "merchantId": "<your merchantId>",
      "merchantSiteId": "<your merchantSiteId>",
      "clientRequestId": "<unique request ID in merchant system>",
      "userTokenId": "<unique customer identifier in merchant system>",
      "firstName":"John",
      "lastName":"Smith",
      "email":"john.smith@email.com",
      "countryCode":"US",
      "timeStamp": "<YYYYMMDDHHmmss>",
      "checksum": "<calculated checksum>"
    }

    Generating a userPaymentOptionId (UPO)

    Send an /addUPOAPM request with its mandatory parameters and include these parameters:

    • userTokenId – The unique customer identifier in your system.
    • apmData.AccountNumber – The customer’s bank account number.
    • apmData.RoutingNumber – The customer’s financial institution ABA number. (9-digits including leading zeros)
    Example /addUPOAPM Request
    {
      "merchantId":"<your merchantId>",
      "merchantSiteId":"<your merchantSiteId>",
      "clientRequestId":"<unique request ID in merchant system>",
      "userTokenId":"<unique customer identifier in merchant system>",
      "paymentMethodName":"apmgw_ACH",
      "apmData":{
        "AccountNumber":"111111111", 
        "RoutingNumber":"999999992" 
      },
      "billingAddress":{
        "firstName":"John",
        "lastName":"Smith",
        "email":"john.smith@email.com",
        "phone":"1112223333",
        "address":"2992 Cameron Road",
        "city":"Newark",
        "zip":"14236",
        "state":"NY",
        "country":"US"
      },
      "timeStamp":"<YYYYMMDDHHmmss>",
      "checksum":"<calculated checksum>"
    }
    Example /addUPOAPM Response
    {
      "reason":"",
      "merchantId":"2502136204546424962",
      "errCode":0,
      "clientRequestId":"HWMTWQ2RT",
      "userPaymentOptionId":8052151,
      "internalRequestId":17817221,
      "version":"1.0",
      "status":"SUCCESS",
      "merchantSiteId":"126006"
    }

    Example Payment DMNs

    Example “Status=PENDING” DMN
    ppp_status=PENDING&Status=PENDING&ExErrCode=0&ErrCode=0&errApmCode=0&errApmDescription=&errScCode=0&errScDescription=&Reason=&ReasonCode=0&PPP_TransactionID=37067271&userid=Test&merchant_unique_id=&customData=&productId=&first_name=John&last_name=Smith&email=john.smith%40safecharge.com&currency=USD&customField1=&customField2=&customField3=&customField4=&customField5=&customField6=&customField7=&customField8=&customField9=&customField10=&customField11=&customField12=&customField13=&customField14=&customField15=&invoice_id=&address1=340689+main+St.&address2=&country=United+States&state=&city=London&zip=&phone1=&phone2=&phone3=&client_ip=93.146.254.172&nameOnCard=&cardNumber=&bin=&noCVV=&acquirerId=&acquirerBank=Smart2Pay-PI&expMonth=&expYear=&Token=&tokenId=&AuthCode=111111111&AvsCode=&Cvv2Reply=&shippingCountry=&shippingState=&shippingCity=&shippingAddress=&shippingZip=&shippingFirstName=&shippingLastName=&shippingPhone=&shippingCell=&shippingMail=&total_discount=0.00&total_handling=0.00&total_shipping=0.00&total_tax=0.00&buyButtonProductBundleId=&merchant_site_id=3111&merchant_status=&action=&requestVersion=&message=PENDING&merchantLocale=&unknownParameters=&payment_method=apmgw_ACH&ID=&merchant_id=4972436454212160565&responseTimeStamp=2022-03-28.14%3A05%3A24&buyButtonProductId=&webMasterId=&appliedPromotions=&uniqueCC=&transactionType=Sale&externalEmail=&cardCompany=&eci=&user_token_id=Test&userPaymentOptionId=8155541&TransactionID=2110000000005780083&APMReferenceID=C68967F45F76F83F5FBFCCB6FAB859E6&orderTransactionId=18598041&totalAmount=1.26&dynamicDescriptor=QA+Test+site&item_name_1=NA&item_number_1=&item_amount_1=1.26&item_quantity_1=1&item_discount_1=0.00&item_handling_1=0.00&item_shipping_1=0.00&feeAmount=&amountWithoutFee=&houseNumber=&customCurrency=&externalToken_blockedCard=&externalToken_cardAcquirerId=&externalToken_cardAcquirerName=&externalToken_cardBin=&externalToken_cardBrandId=&externalToken_cardBrandName=&externalToken_cardExpiration=&externalToken_cardLength=&externalToken_cardMask=&externalToken_cardName=&externalToken_cardTypeId=&externalToken_cardTypeName=&externalToken_clubName=&externalToken_creditCompanyId=&externalToken_creditCompanyName=&externalToken_extendedCardType=&externalToken_Indication=&externalToken_tokenValue=&externalToken_tokenProvider=&upoRegistrationDate=20220324&type=DEPOSIT&clientRequestId=20220328170520&relatedTransactionId=&responsechecksum=4e5b4caef554c6b74920ea8fd326304b&advanceResponseChecksum=5f243f6b203c7e55c3037ab471b5201b
    Example “Status=UPDATE” DMN
    ppp_status=PENDING&Status=UPDATE&ExErrCode=0&ErrCode=0&errApmCode=0&errApmDescription=&errScCode=0&errScDescription=&Reason=&ReasonCode=0&PPP_TransactionID=37067271&userid=Test&merchant_unique_id=&customData=&productId=&first_name=John&last_name=Smith&email=john.smith%40safecharge.com&currency=USD&customField1=&customField2=&customField3=&customField4=&customField5=&customField6=&customField7=&customField8=&customField9=&customField10=&customField11=&customField12=&customField13=&customField14=&customField15=&invoice_id=&address1=340689+main+St.&address2=&country=United+States&state=&city=London&zip=&phone1=&phone2=&phone3=&client_ip=93.146.254.172&nameOnCard=&cardNumber=&bin=&noCVV=&acquirerId=&acquirerBank=Smart2Pay-PI&expMonth=&expYear=&Token=&tokenId=&AuthCode=111111111&AvsCode=&Cvv2Reply=&shippingCountry=&shippingState=&shippingCity=&shippingAddress=&shippingZip=&shippingFirstName=&shippingLastName=&shippingPhone=&shippingCell=&shippingMail=&total_discount=0.00&total_handling=0.00&total_shipping=0.00&total_tax=0.00&buyButtonProductBundleId=&merchant_site_id=3111&merchant_status=&action=&requestVersion=&message=UPDATE&merchantLocale=&unknownParameters=&payment_method=apmgw_ACH&ID=&merchant_id=4972436454212160565&responseTimeStamp=2022-03-28.14%3A05%3A25&buyButtonProductId=&webMasterId=&appliedPromotions=&uniqueCC=&transactionType=Sale&externalEmail=&cardCompany=&eci=&user_token_id=Test&userPaymentOptionId=8155541&TransactionID=2110000000005780083&externalTransactionId=6463161&APMReferenceID=C68967F45F76F83F5FBFCCB6FAB859E6&orderTransactionId=18598041&totalAmount=1.26&dynamicDescriptor=QA+Test+site&item_name_1=NA&item_number_1=&item_amount_1=1.26&item_quantity_1=1&item_discount_1=0.00&item_handling_1=0.00&item_shipping_1=0.00&feeAmount=&amountWithoutFee=&houseNumber=&customCurrency=&externalToken_blockedCard=&externalToken_cardAcquirerId=&externalToken_cardAcquirerName=&externalToken_cardBin=&externalToken_cardBrandId=&externalToken_cardBrandName=&externalToken_cardExpiration=&externalToken_cardLength=&externalToken_cardMask=&externalToken_cardName=&externalToken_cardTypeId=&externalToken_cardTypeName=&externalToken_clubName=&externalToken_creditCompanyId=&externalToken_creditCompanyName=&externalToken_extendedCardType=&externalToken_Indication=&externalToken_tokenValue=&externalToken_tokenProvider=&upoRegistrationDate=20220324&type=DEPOSIT&clientRequestId=20220328170520&relatedTransactionId=&apmPayerInfo=%7B%22StatusInfo%22%3A%22%7B+StatusCode%3A+%2C+info%3A+%7D%22%7D&representmentInformation=Account+Linked&responsechecksum=4e5b4caef554c6b74920ea8fd326304b&advanceResponseChecksum=e4e217faf6fa6f66f48ea8021ad9a872
    Example “Status=APPROVED” DMN
    ppp_status=OK&Status=APPROVED&ExErrCode=0&ErrCode=0&errApmCode=0&errApmDescription=&errScCode=0&errScDescription=&Reason=&ReasonCode=0&PPP_TransactionID=37067271&userid=Test&merchant_unique_id=&customData=&productId=&first_name=John&last_name=Smith&email=john.smith%40safecharge.com&currency=USD&customField1=&customField2=&customField3=&customField4=&customField5=&customField6=&customField7=&customField8=&customField9=&customField10=&customField11=&customField12=&customField13=&customField14=&customField15=&invoice_id=&address1=340689+main+St.&address2=&country=United+States&state=&city=London&zip=&phone1=&phone2=&phone3=&client_ip=93.146.254.172&nameOnCard=&cardNumber=&bin=&noCVV=&acquirerId=&acquirerBank=Smart2Pay-PI&expMonth=&expYear=&Token=&tokenId=&AuthCode=111111111&AvsCode=&Cvv2Reply=&shippingCountry=&shippingState=&shippingCity=&shippingAddress=&shippingZip=&shippingFirstName=&shippingLastName=&shippingPhone=&shippingCell=&shippingMail=&total_discount=0.00&total_handling=0.00&total_shipping=0.00&total_tax=0.00&buyButtonProductBundleId=&merchant_site_id=3111&merchant_status=&action=&requestVersion=&message=APPROVED&merchantLocale=&unknownParameters=&payment_method=apmgw_ACH&ID=&merchant_id=4972436454212160565&responseTimeStamp=2022-03-29.06%3A25%3A53&buyButtonProductId=&webMasterId=&appliedPromotions=&uniqueCC=&transactionType=Sale&externalEmail=&cardCompany=&eci=&user_token_id=Test&userPaymentOptionId=8155541&TransactionID=2110000000005780083&externalTransactionId=6463161&APMReferenceID=C68967F45F76F83F5FBFCCB6FAB859E6&orderTransactionId=18598041&totalAmount=1.26&dynamicDescriptor=QA+Test+site&item_name_1=NA&item_number_1=&item_amount_1=1.26&item_quantity_1=1&item_discount_1=0.00&item_handling_1=0.00&item_shipping_1=0.00&feeAmount=&amountWithoutFee=&houseNumber=&customCurrency=&externalToken_blockedCard=&externalToken_cardAcquirerId=&externalToken_cardAcquirerName=&externalToken_cardBin=&externalToken_cardBrandId=&externalToken_cardBrandName=&externalToken_cardExpiration=&externalToken_cardLength=&externalToken_cardMask=&externalToken_cardName=&externalToken_cardTypeId=&externalToken_cardTypeName=&externalToken_clubName=&externalToken_creditCompanyId=&externalToken_creditCompanyName=&externalToken_extendedCardType=&externalToken_Indication=&externalToken_tokenValue=&externalToken_tokenProvider=&upoRegistrationDate=20220324&type=DEPOSIT&clientRequestId=20220328170520&relatedTransactionId=&apmPayerInfo=%7B%22StatusInfo%22%3A%22%7B+StatusCode%3A+%2C+info%3A+%2C+originalAmount%3A+1.2600%2C+ProcessedAmount%3A+1.26%7D%22%2C%22AccountNumber%22%3A%111111111%22%7D&responsechecksum=f1f26100df03d560ba161bca759ed023&advanceResponseChecksum=0a52570c8dab67e027f08745d1770f85
2022 Nuvei. All rights reserved.