ACH - Nuvei Documentation (2024)

On this page:

  • Introduction
  • Supported Countries
  • Supported Currencies
  • APM Overview
  • Prerequisites and Notes
    • Platform-Specific Notes
  • Bank Transfer (ACH)
    • Payment (without UPO)
    • Payment (with UPO)
    • Payout
  • Secure Bank Transfer
    • Payment (without UPO)
    • Payment (with UPO)
    • Payout
    • Refund
  • Testing
  • Appendices
    • Generating UPOs
    • Example Payment DMNs

Attributes

  • METHOD TYPEACH
  • PAYMENTSACH - Nuvei Documentation (1)
  • PAYOUTSACH - Nuvei Documentation (2)
  • REFUNDSACH - Nuvei Documentation (3)
  • RECURRINGACH - Nuvei Documentation (4)

ACH (Automated Clearing House) is a US-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 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
  • The “Secure Bank Transfer” APM

Chase bank no longer supports in-process WebView to connect users to their online banking portal. This impacts customers using WebView with their native mobile app only. Desktop and mobile web browser users are NOT affected. Press here for more details.


  • United States
  • USD

Bank Transfer (ACH)APM

ACH - Nuvei Documentation (5)

APM NameNuvei APMIntegration Methods
REST APIWeb SDKCheckout SDK
ACHapmgw_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

ACH - Nuvei Documentation (6)

Nuvei’s Secure Bank Transfer ACH solution allows e-commerce merchants in the US to accept ACH payments. 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.

APM NameNuvei APMIntegration Methods
REST APIWeb SDKCheckout SDK
Secure Bank Transferapmgw_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".
  • This document assumes that you have completed all the account setup 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 from Nuvei.
  • You can contact Nuvei Support for any type of assistance.

Platform-Specific Notes

Press tab to open…

  • REST API
  • Web SDK
  • Simply Connect
  • In addition to payment request responses, the system sends Direct Merchant Notifications (DMNs) 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 urlDetails.notificationUrlin each /payment and /payout request.
  • 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.
  • In addition to payment request responses, the system sends Direct Merchant Notifications (DMNs) 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 urlDetails.notificationUrlin each /openOrder request.

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 userDetails block collected in the createPayment() request.
  • Make sure that the ACH payment methods described in this guide are included in your Nuvei account.
  • When initiating your payment page using the Simply Connect method, set the country to “US” and the currency to “USD” to present these ACH payment methods in the payment method gallery. No further integration steps are required.
  • In addition to payment request responses, the system sends Direct Merchant Notifications (DMNs) 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 notify_urlin each request.
REST API
  • In addition to payment request responses, the system sends Direct Merchant Notifications (DMNs) 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 urlDetails.notificationUrlin each /payment and /payout request.
Web SDK
  • 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.
  • In addition to payment request responses, the system sends Direct Merchant Notifications (DMNs) 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 urlDetails.notificationUrlin each /openOrder request.

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 userDetails block collected in the createPayment() request.
Simply Connect
  • Make sure that the ACH payment methods described in this guide are included in your Nuvei account.
  • When initiating your payment page using the Simply Connect method, set the country to “US” and the currency to “USD” to present these ACH payment methods in the payment method gallery. No further integration steps are required.
  • In addition to payment request responses, the system sends Direct Merchant Notifications (DMNs) 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 notify_urlin each request.

You can use the Bank Transfer (ACH) APM integration to 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 another 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 payment flow begins on your payment page when a customer selects the Bank Transfer (ACH) payment method.

  • For a new customer, or for payment method details that were not previously captured, follow the steps in the Payment (without UPO).
  • For a “returning customer”, offer them the option to select one of their previously captured payment methods. Follow the steps in the Payment (with UPO).

Payouts

  • Payout

Refunds

Voids

Prerequisites and Notes

  1. A userPaymentOptionId (UPO) 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.
  2. 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.
    A preApprovalId indicates that:
    • The specified customer payment method is authenticated, and there is no need to perform the authentication process again.
    • 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.

Payment (without UPO)

Follow the relevant steps for each environment:

Press tab to open…

  • REST API
  • Web SDK
  • Simply Connect
  1. The payment flow begins on your payment page when the customer enters a payment amount and selects the Bank Transfer (ACH) 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.
    • classic_ach_account_type – The customer account type. Required for B2B customers
    • firstName
    • lastName
    • email
  3. Generate a sessionToken by sending a /getSessionToken request.
  4. Send a /payment request with its mandatory parameters including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • paymentOption.alternativePaymentMethod block containing:
      • paymentMethod: “apmgw_ACH
      • AccountNumber
      • RoutingNumber
      • classic_ach_account_type: <“Customer Account Type”>

        In a B2B flow, there is a requirement to pass the Standard Entry Class (SEC) code to the provider. SEC codes are defined and maintained by NACHA, the governing body for the ACH network. The value of the SEC code is derived from the customer’s account type.
        Relevant values:

        • CCD –Corporate Credit or Debit Entry (non-consumer)
        • WEB – Internet initiated/mobile entry (consumer)
        • PPD – Stored credentials payment and deposit (consumer)

        Possible Values:
      • Telephone: Mobile entry (SEC – TEL)
      • Checking: Current account for accessing money on daily basis. Account holder is an individual. (SEC – WEB)
      • Saving: Interest bearing deposit account. Account holder is an individual. (SEC – WEB)
      • Corporate: The account holder is a business and not individual. (SEC – CCD)
  5. deviceDetails block containing: ipAddress
  6. billingAddressblock containing: firstName, lastName, email, phone, address, city, zip, state
  7. userDetails block containing: firstName, lastName, email, phone, address, city, zip, state, identification
  8. urlDetails.notificationUrl
  1. 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": "100", "paymentOption": { "alternativePaymentMethod": { "paymentMethod": "apmgw_ACH", "AccountNumber": "111111111", "RoutingNumber": "999999992" "classic_ach_account_type":"Telephone" // Checking, Saving, Corporate } },"deviceDetails": { "ipAddress": "<customer's IP address>"}, "billingAddress": {"firstName": "John","lastName": "Smith","email": "[emailprotected]","phone": "6175551414","address": "22 Main Street","city": "Boston","zip": "02460","state": "MA", "country": "US" }, "userDetails": { "firstName": "John", "lastName": "Smith", "email": "[emailprotected]", "phone": "6175551414", "address": "22 Main Street", "city": "Boston", "zip": "02460", "state": "MA", "country": "US", "identification": "123456789" }, "urlDetails": { "notificationUrl": "<URL to which DMNs are sent>" }, "timeStamp": "<YYYYMMDDHHmmss>", "checksum": "<calculated checksum>"}
  1. The payment flow begins on your payment page when the customer enters a payment amount.
  2. Initiate a Session
    Send the amount and a userTokenId (unique customer identifier in merchant 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 including:
    • sessionToken
    • paymentOption.alternativePaymentMethod block containing:
      • paymentMethod: “apmgw_ACH
      • AccountNumber
      • RoutingNumber
    • deviceDetails block containing: ipAddress
    • billingAddressblock containing: firstName, lastName, email, phone, address, city, zip, state
    • userDetails block containing: firstName, lastName, email, phone, address, city, zip, state, identification
Example createPayment() Request (without UPO)
sfc.createPayment({ sessionToken: "<sessiontoken>", paymentOption: { alternativePaymentMethod: { paymentMethod: "apmgw_ACH", AccountNumber: document.getElementById("AccountNumber").value, RoutingNumber: document.getElementById("RoutingNumber").value } }, deviceDetails: { ipAddress: "<customer's IP address>"}, billingAddress: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US" }, userDetails: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US" identification: "123456789" }}, function(res) { console.log(res);})
  1. TheBank Transfer (ACH) flow begins when the customer selects the Bank Transfer (ACH) payment method from the payment method gallery.
  2. The customer enters the Account Number, Routing Number, and Amount, and presses the Deposit/Process button.
REST API
  1. The payment flow begins on your payment page when the customer enters a payment amount and selects the Bank Transfer (ACH) 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.
    • classic_ach_account_type – The customer account type. Required for B2B customers
    • firstName
    • lastName
    • email
  3. Generate a sessionToken by sending a /getSessionToken request.
  4. Send a /payment request with its mandatory parameters including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • paymentOption.alternativePaymentMethod block containing:
      • paymentMethod: “apmgw_ACH
      • AccountNumber
      • RoutingNumber
      • classic_ach_account_type: <“Customer Account Type”>

        In a B2B flow, there is a requirement to pass the Standard Entry Class (SEC) code to the provider. SEC codes are defined and maintained by NACHA, the governing body for the ACH network. The value of the SEC code is derived from the customer’s account type.
        Relevant values:

        • CCD –Corporate Credit or Debit Entry (non-consumer)
        • WEB – Internet initiated/mobile entry (consumer)
        • PPD – Stored credentials payment and deposit (consumer)

        Possible Values:
      • Telephone: Mobile entry (SEC – TEL)
      • Checking: Current account for accessing money on daily basis. Account holder is an individual. (SEC – WEB)
      • Saving: Interest bearing deposit account. Account holder is an individual. (SEC – WEB)
      • Corporate: The account holder is a business and not individual. (SEC – CCD)
  5. deviceDetails block containing: ipAddress
  6. billingAddressblock containing: firstName, lastName, email, phone, address, city, zip, state
  7. userDetails block containing: firstName, lastName, email, phone, address, city, zip, state, identification
  8. urlDetails.notificationUrl
  1. 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": "100", "paymentOption": { "alternativePaymentMethod": { "paymentMethod": "apmgw_ACH", "AccountNumber": "111111111", "RoutingNumber": "999999992" "classic_ach_account_type":"Telephone" // Checking, Saving, Corporate } },"deviceDetails": { "ipAddress": "<customer's IP address>"}, "billingAddress": {"firstName": "John","lastName": "Smith","email": "[emailprotected]","phone": "6175551414","address": "22 Main Street","city": "Boston","zip": "02460","state": "MA", "country": "US" }, "userDetails": { "firstName": "John", "lastName": "Smith", "email": "[emailprotected]", "phone": "6175551414", "address": "22 Main Street", "city": "Boston", "zip": "02460", "state": "MA", "country": "US", "identification": "123456789" }, "urlDetails": { "notificationUrl": "<URL to which DMNs are sent>" }, "timeStamp": "<YYYYMMDDHHmmss>", "checksum": "<calculated checksum>"}
Web SDK
  1. The payment flow begins on your payment page when the customer enters a payment amount.
  2. Initiate a Session
    Send the amount and a userTokenId (unique customer identifier in merchant 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 including:
    • sessionToken
    • paymentOption.alternativePaymentMethod block containing:
      • paymentMethod: “apmgw_ACH
      • AccountNumber
      • RoutingNumber
    • deviceDetails block containing: ipAddress
    • billingAddressblock containing: firstName, lastName, email, phone, address, city, zip, state
    • userDetails block containing: firstName, lastName, email, phone, address, city, zip, state, identification
Example createPayment() Request (without UPO)
sfc.createPayment({ sessionToken: "<sessiontoken>", paymentOption: { alternativePaymentMethod: { paymentMethod: "apmgw_ACH", AccountNumber: document.getElementById("AccountNumber").value, RoutingNumber: document.getElementById("RoutingNumber").value } }, deviceDetails: { ipAddress: "<customer's IP address>"}, billingAddress: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US" }, userDetails: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US" identification: "123456789" }}, function(res) { console.log(res);})
Simply Connect
  1. TheBank Transfer (ACH) flow begins when the customer selects the Bank Transfer (ACH) payment method from the payment method gallery.
  2. The customer enters the Account Number, Routing Number, and Amount, and presses the Deposit/Process button.

Handling the Response

As the transaction progresses in the flow from PENDING to UPDATE to APPROVED, you receive responses and DMNs:

  1. transactionStatus=PENDING:
    The request returns:
    • A response that includes transactionStatus: PENDINGand a "userPaymentOptionId".
      Example of Some Parameters Returned
      { ... ... "transactionId":"36682151", "paymentOption": { "userPaymentOptionId": "8100521", "card": {} }, "transactionStatus": "PENDING", ... ...}
    • A DMN containing status=PENDING.
      See Example DMN with status=PENDING.
  2. transactionStatus=UPDATE:
    • After a short time period, a preApprovalId is generated and stored in the UPO record.
    • You receive a DMN containing status=UPDATE.
      See Example DMN with status=UPDATE.
  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 containing status=APPROVED.
        See Example DMN with status=APPROVED.
    • If the transfer is not successful, then the following is returned:
      • A response with status=DECLINED.
      • A DMN containing status=DECLINED.

Payment (with UPO)

Follow the relevant steps for each environment:

Press tab to open…

  • REST API
  • Web SDK
  • Simply Connect
  1. Thepayment flow begins on your payment page when a “returning customer” enters a payment amount and selects the Bank Transfer (ACH) 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 of 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 of 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • paymentOption.userPaymentOptionId: “<ID of a previously stored payment option>
    • deviceDetails block containing: ipAddress
    • billingAddress block containing: firstName, lastName, email, country
    • urlDetails.notificationUrl
Example of /payment Request (with 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": "100", "paymentOption": { "userPaymentOptionId": "8100521" },"deviceDetails": {"ipAddress": "<customer's IP address>"}, "billingAddress": { "firstName": "John", "lastName": "Smith", "email": "[emailprotected]", "country": "US" }, "urlDetails": { "notificationUrl": "<URL to which DMNs are sent>" },"timeStamp": "<YYYYMMDDHHmmss>","checksum": "<calculated checksum>"}
  1. The payment flow begins on your payment page when a “returning customer” enters a payment amount.
  2. Initiate a Session
    Send the amountand a userTokenId (unique customer identifier in merchant 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 of 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 of 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • paymentOption.userPaymentOptionId: “<ID of a previously stored payment option>
    • deviceDetails block containing: ipAddress
    • billingAddress block containing: firstName, lastName, email, country
    • urlDetails.notificationUrl
Example createPayment() Request (With UPO)
sfc.createPayment({ sessionToken: "<sessiontoken>", paymentOption: { userPaymentOptionId: "8100521" }, deviceDetails: { ipAddress: "<customer's IP address>"},billingAddress: {firstName: "John",lastName: "Smith",email: "[emailprotected]",country: "US"}, urlDetails: { notificationUrl: "<URL to which DMNs are sent>"},}, function(res) { console.log(res);});
  1. The Bank Transfer (ACH) flow begins when the customer selects the Bank Transfer (ACH) payment method from the payment method gallery.
  2. The customer selects one of their previously captured payment methods (UPOs), enters an amount, and presses the Deposit/Process button.
REST API
  1. Thepayment flow begins on your payment page when a “returning customer” enters a payment amount and selects the Bank Transfer (ACH) 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 of 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 of 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • paymentOption.userPaymentOptionId: “<ID of a previously stored payment option>
    • deviceDetails block containing: ipAddress
    • billingAddress block containing: firstName, lastName, email, country
    • urlDetails.notificationUrl
Example of /payment Request (with 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": "100", "paymentOption": { "userPaymentOptionId": "8100521" },"deviceDetails": {"ipAddress": "<customer's IP address>"}, "billingAddress": { "firstName": "John", "lastName": "Smith", "email": "[emailprotected]", "country": "US" }, "urlDetails": { "notificationUrl": "<URL to which DMNs are sent>" },"timeStamp": "<YYYYMMDDHHmmss>","checksum": "<calculated checksum>"}
Web SDK
  1. The payment flow begins on your payment page when a “returning customer” enters a payment amount.
  2. Initiate a Session
    Send the amountand a userTokenId (unique customer identifier in merchant 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 of 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 of 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • paymentOption.userPaymentOptionId: “<ID of a previously stored payment option>
    • deviceDetails block containing: ipAddress
    • billingAddress block containing: firstName, lastName, email, country
    • urlDetails.notificationUrl
Example createPayment() Request (With UPO)
sfc.createPayment({ sessionToken: "<sessiontoken>", paymentOption: { userPaymentOptionId: "8100521" }, deviceDetails: { ipAddress: "<customer's IP address>"},billingAddress: {firstName: "John",lastName: "Smith",email: "[emailprotected]",country: "US"}, urlDetails: { notificationUrl: "<URL to which DMNs are sent>"},}, function(res) { console.log(res);});
Simply Connect
  1. The Bank Transfer (ACH) flow begins when the customer selects the Bank Transfer (ACH) payment method from the payment method gallery.
  2. The customer selects one of their previously captured payment methods (UPOs), enters an amount, and presses the Deposit/Process button.

Handling the Response

You receive a DMN as the transactionStatus 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

A payout 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 including:

  • userTokenId – Unique customer identifier in merchant system.
  • userPaymentOption block containing:userPaymentOptionId
  • deviceDetails block containing: ipAddress
  • urlDetails.notificationUrl
  • The following parameters may be required if they are not already stored in the UPO:
    userDetails block containing: firstName, lastName, email
    If they are not present, please use the /updateUser method to add them.

Press here for more information about updating and/or adding user details.

Example /payout Request
{ "merchantId": "<your merchantId>", "merchantSiteId": "<your merchantSiteId>", "userTokenId": "<unique customer identifier in merchant system>", "clientRequestId": "<unique request ID in merchant system>", "currency": "USD", "amount": "100", "userPaymentOption": { "userPaymentOptionId": "<UPO received from previous deposit>" }, "deviceDetails": { "ipAddress": "<customer's IP address>" }, "urlDetails": { "notificationUrl": "<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 containing status=APPROVED.
  • If the transaction is not successful, then the following is returned:
    • A response with status=DECLINED.
    • A DMN containing status=DECLINED.
Example /payout Response
{ "reason": "", "transactionStatus": "APPROVED", "clientRequestId": "W1Q3SBGE4", "internalRequestId": 17817071, "version": "1.0", "transactionId": "2110000000004333013", "merchantSiteId": "126006", "merchantId": "2502136204546424962", "additionalTransactionBankId": "1802509592" "clientUniqueId": "695701003", "errCode": 0, "userPaymentOptionId": "8054521", "paymentMethodErrorCode": 0, "userTokenId": "CEBQK9OVSLJA", "externalTransactionId": "2110000000068709", "status": "SUCCESS"}

Refund

See the Refund topic.

Voids

See the Voidtopic.

You can use theSecure Bank Transfer APM integration to perform payments (deposits), payouts (withdrawals), and refunds.

Contact Nuvei Support for implementation support.

Payments

The payment flow begins on your payment page when a customer selects the Secure Bank Transfer 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 of their previously captured payment methods. Follow the steps in the Payment (with UPO) flow.

Payouts

  • Payout(same flow as for Bank Transfer (ACH))

Refunds

Prerequisites and Notes

  1. A userPaymentOptionId 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.
  2. 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.
    A preApprovalId indicates that:
    • The specified customer payment method is authenticated, and there is no need to perform the authentication process again.
    • 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.
  3. You have the option to enable the Privacy Policy acceptance (optional) feature, by contacting Nuvei to configure this feature in your merchant account.
    This feature forces customers who are using the Secure Bank Transfer APM for the first time to agree to the “Privacy Notice”, before allowing them to continue to the next step. If you choose to use this feature, then:
    • You should display a link for the customer to view the Nuvei Privacy Notice (https://nuvei.com/privacy-notice/).
    • Provide a checkbox for the customer to accept the “Privacy Notice”, before being allowed to continue to the next step.
      For example,“I agree to the Privacy Policy”.
  4. You have the option to enable the “Automatic Transaction Approval” (optional) feature, however, you are responsible for all losses from “returned transactions” and other risks.
    To enable this, contact Nuvei to configure this feature in your merchant account.

Payment (without UPO)

Follow the relevant steps for each environment:

Press tab to open…

  • REST API
  • Web SDK
  • Simply Connect
  1. The payment flow begins on your payment page when the customer enters an amount they wish to transfer, and selects the Secure Bank Transfer payment method.
  2. This is an optional step, if you enabled the “Privacy Notice” acceptance option (see the prerequisite above):
    • Display a “Privacy Notice” link for the customer to press 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • paymentOption.alternativePaymentMethod: “apmgw_Secure_Bank_Transfer
    • deviceDetails block containing: ipAddress
    • billingAddressblock 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": "100", "paymentOption": { "alternativePaymentMethod": { "paymentMethod": "apmgw_Secure_Bank_Transfer" } }, "billingAddress": {"firstName": "John","lastName": "Smith","email": "[emailprotected]","phone": "6175551414","address": "22 Main Street","city": "Boston","zip": "02460","state": "MA", "country": "US"}, "userDetails": { "firstName": "John", "lastName": "Smith", "email": "[emailprotected]", "phone": "6175551414", "address": "22 Main Street", "city": "Boston", "zip": "02460", "state": "MA", "country": "US", "identification": "123456789" }, "deviceDetails": { "ipAddress": "<customer's IP address>" }, "urlDetails": { "notificationUrl": "<URL to which DMNs are sent>" }, "timeStamp": "<YYYYMMDDHHmmss>", "checksum": "<calculated checksum>"}
  6. 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.eyJkZXRhaWxzIjoiNzRDQkZEODMyOUI1RDMwMjNDM0YwNUJERThGRkFEMDRGQUNEMURCQUZFMEYxM0QwMzhFQkU5RjRCMzhFMTY2RTY5NEI0QzhDMDg2RjYzMDM2RTdCMkIyREVBRjRENTIyNkM2RDg1RUE5NkI2Qji*zNjEzMUVBREI0NDBGRjU0QzE0RThGM0ZCODg2QzUwQzcyMTYxMURBMkNBQzg1NzI2NjRCOEE4ODE0MThEMkJCMjBFNTAzRDE4MTRBMkJBM0M1NjM3RDBCNkFFRDU5MUVFQzk2NEQwMUE2OEFFRUQyMDBBMUJBRUQ4RUIxNDBGNEEwQkQ2OTE3MzYxMEM4Rjg1MTAwMjMxREEzQkRDNUZGMkNGOUNGRURCQkZFMTQ2REEwMDdCQUY4QUUzN0Q1Q0JEQTYzOTQyNDhGMkFEQzhFMzMyODU4NzQ5MzUyNTI2NDFFREREM0Q4ODEwQTE3RkVCNTlBMjY4ODBCMkI2NjYzRkVENjk3RjRBMDhERTFBNzVDRDdBMzk2MzBGRjJBREU1Mjk0N0FERjFFQUVFMDA4Nzg4Q0REN0RCNjM5M0QwRTNEOTFBQkVERTY3MDFBMUQ0RkU3M0M3RTQwNUQ5RjlCNzZDMUYxRjQ5QzIxMjU4RERENDVDQUFDNTNERDg4MEVBNTk2Mzk1QzBDRDQ4NUY0OTQ4M0VERURGNDJFRkQzMUJBNkIwMUYwMTFGMTVGNzAyMUI2OTRBOUQ1NTU0OEEyQ0FDNUQ3MzVBNTgyMkJCMEFDOUFCQjhBQzc1Q0UxNzc1NjI0QzY1QUQ1MDU4NTVCRDI5RjFCMjJCMDlCREExM0I1QkFFQ0ZEMTA1MUI2NTQ4QTUxQkJDNDlEOTlCQUI4MUZERjAwNzAyQTBDQ0IyQTk3MDVENzE2MkZFRUQ5RjEzN0ZGN0FGMDUwNUIyMUIwOTY2RDA2NTFFQkRDRDA1MkY0RTE4MDY5ODlCOEFBQjJDMTIxNkIzNzJDREQ5RDQ0RDQ2N0EwOEUwQjI4MkUzOTkwNjAwOTcyQ0NDNEYwQjZEMDdERDg1ODk2MDYzM0UwNkExQ0VGRTY0OEExNzBDOTA3RjA3Qzg4NDA4NDI0MzQzRjNGQjM1MDZFN0EzRkEwNkQ0MDY5M0QyQkE3MzBGQTdCNzc3NDFFQUU2NDg2NEI2NjE3MDdGMzY0MDNCMTQyOTJDMTM1NzI5NDUwQ0YxRDk3NTcxQUE5NzJDQzg1MTVGQSIsIm1lcmNoYW50X2lkIjoiU2ZDaGFyZ2UiLCJpdiI6Ijk5RTM0MEMyNzg0MkNBOTlCQkIxQzUyNzVFQUFFNURBIiwidXJsIjoiaHR0cHM6Ly9zdGFnaW5nLnZlcmlmaWVkYWNoLmNvbS9jb25zdW1lci9BY3F1aXJlSW5mb0dhdGV3YXkuZG8ifQ.EF3K5UsPQYdua_YcRd9Yefl-KemNwEMq5-EXV7QWAZUbCQglncAaAHzzlW-sxq2XcVZcZ2qbxLkQqjzkB3tItTGUDmqysL-opqOdaaz54EKeHKC5hzQIp77DucIGYQhPxfOB_eAxTOPLvZ85c3woJ37m8BH8kuJPSoAjYrZ12geEQJQx4R2VxNT3QsxxryEWZvU1yKc8mjCl011nWz6cp4LZpHIMwUwvdCMJWUeJtAxC-Q6Ec4NqP93AFki9Ln0OOvenbOEBn3UpK_BncxKu7RFOzM8w4kSf0eopKC44awlROwZaO0k0htJAUikA_W-fgeLISuMpHmWMZz6X3Ju2Bg", "userPaymentOptionId": "8061731", "card": {} }, "sessionToken": "6fa38ea2-6f1a-4620-85ae-7deaf0d5f8f1", "userTokenId": "2J6QZH3UF9E2", "status": "SUCCESS"}
  7. Redirect the customer to their bank’s site, so they can capture the bank account details of the account they want to pay from.
  1. The payment flow begins on your payment page when the customer enters a payment amount.
  2. Initiate a Session
    Send the amountand a userTokenId (unique customer identifier in merchant 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. This is an optional step, if you enabled the “Privacy Notice” acceptance option (see the prerequisite above):
    • Display a “Privacy Notice” link for the customer to press 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • paymentOption.alternativePaymentMethod: “apmgw_Secure_Bank_Transfer
    • deviceDetails block containing: ipAddress
    • billingAddressblock containing: firstName, lastName, email, phone, address, city, zip, state
    • userDetails block containing: firstName, lastName, email, phone, address, city, zip, state, identification
    • urlDetails.notificationUrl
      Example createPayment() Request (without UPO)
      sfc.createPayment({ sessionToken: "<sessiontoken>", paymentOption: { alternativePaymentMethod: { paymentMethod: "apmgw_Secure_Bank_Transfer" } },deviceDetails: { ipAddress: "<customer's IP address>"}, billingAddress: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US" }, userDetails: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US", identification: "123456789" }, urlDetails: { notificationUrl: "<URL to which DMNs are sent>"},}, function(res) { console.log(res);});
  8. 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.eyJkZXRhaWxzIjoiNzRDQkZEODMyOUI1RDMwMjNDM0YwNUJERThGRkFEMDRGQUNEMURCQUZFMEYxM0QwMzhFQkU5RjRCMzhFMTY2RTY5NEI0QzhDMDg2RjYzMDM2RTdCMkIyREVBRjRENTIyNkM2RDg1RUE5NkI2Qji*zNjEzMUVBREI0NDBGRjU0QzE0RThGM0ZCODg2QzUwQzcyMTYxMURBMkNBQzg1NzI2NjRCOEE4ODE0MThEMkJCMjBFNTAzRDE4MTRBMkJBM0M1NjM3RDBCNkFFRDU5MUVFQzk2NEQwMUE2OEFFRUQyMDBBMUJBRUQ4RUIxNDBGNEEwQkQ2OTE3MzYxMEM4Rjg1MTAwMjMxREEzQkRDNUZGMkNGOUNGRURCQkZFMTQ2REEwMDdCQUY4QUUzN0Q1Q0JEQTYzOTQyNDhGMkFEQzhFMzMyODU4NzQ5MzUyNTI2NDFFREREM0Q4ODEwQTE3RkVCNTlBMjY4ODBCMkI2NjYzRkVENjk3RjRBMDhERTFBNzVDRDdBMzk2MzBGRjJBREU1Mjk0N0FERjFFQUVFMDA4Nzg4Q0REN0RCNjM5M0QwRTNEOTFBQkVERTY3MDFBMUQ0RkU3M0M3RTQwNUQ5RjlCNzZDMUYxRjQ5QzIxMjU4RERENDVDQUFDNTNERDg4MEVBNTk2Mzk1QzBDRDQ4NUY0OTQ4M0VERURGNDJFRkQzMUJBNkIwMUYwMTFGMTVGNzAyMUI2OTRBOUQ1NTU0OEEyQ0FDNUQ3MzVBNTgyMkJCMEFDOUFCQjhBQzc1Q0UxNzc1NjI0QzY1QUQ1MDU4NTVCRDI5RjFCMjJCMDlCREExM0I1QkFFQ0ZEMTA1MUI2NTQ4QTUxQkJDNDlEOTlCQUI4MUZERjAwNzAyQTBDQ0IyQTk3MDVENzE2MkZFRUQ5RjEzN0ZGN0FGMDUwNUIyMUIwOTY2RDA2NTFFQkRDRDA1MkY0RTE4MDY5ODlCOEFBQjJDMTIxNkIzNzJDREQ5RDQ0RDQ2N0EwOEUwQjI4MkUzOTkwNjAwOTcyQ0NDNEYwQjZEMDdERDg1ODk2MDYzM0UwNkExQ0VGRTY0OEExNzBDOTA3RjA3Qzg4NDA4NDI0MzQzRjNGQjM1MDZFN0EzRkEwNkQ0MDY5M0QyQkE3MzBGQTdCNzc3NDFFQUU2NDg2NEI2NjE3MDdGMzY0MDNCMTQyOTJDMTM1NzI5NDUwQ0YxRDk3NTcxQUE5NzJDQzg1MTVGQSIsIm1lcmNoYW50X2lkIjoiU2ZDaGFyZ2UiLCJpdiI6Ijk5RTM0MEMyNzg0MkNBOTlCQkIxQzUyNzVFQUFFNURBIiwidXJsIjoiaHR0cHM6Ly9zdGFnaW5nLnZlcmlmaWVkYWNoLmNvbS9jb25zdW1lci9BY3F1aXJlSW5mb0dhdGV3YXkuZG8ifQ.EF3K5UsPQYdua_YcRd9Yefl-KemNwEMq5-EXV7QWAZUbCQglncAaAHzzlW-sxq2XcVZcZ2qbxLkQqjzkB3tItTGUDmqysL-opqOdaaz54EKeHKC5hzQIp77DucIGYQhPxfOB_eAxTOPLvZ85c3woJ37m8BH8kuJPSoAjYrZ12geEQJQx4R2VxNT3QsxxryEWZvU1yKc8mjCl011nWz6cp4LZpHIMwUwvdCMJWUeJtAxC-Q6Ec4NqP93AFki9Ln0OOvenbOEBn3UpK_BncxKu7RFOzM8w4kSf0eopKC44awlROwZaO0k0htJAUikA_W-fgeLISuMpHmWMZz6X3Ju2Bg", "userPaymentOptionId": "8061731", "card": {} }, "sessionToken": "6fa38ea2-6f1a-4620-85ae-7deaf0d5f8f1", "userTokenId": "2J6QZH3UF9E2", "status": "SUCCESS"}
  9. Redirect the customer to their bank’s site, so they can capture the bank account details of the account they want to pay from.
  1. TheSecure Bank Transfer flow begins when the customer selects the Secure Bank Transfer payment method from the payment method gallery.
  2. This is an optional step, if you enabled the “Privacy Notice” acceptance option (see the prerequisite above):
    1. Display a “Privacy Notice” link for the customer to press to view the Nuvei Privacy Notice (https://nuvei.com/privacy-notice/).
    2. Display the “I agree to the Privacy Policy” checkbox, which the customer must select before allowing them to continue to the next step.
  3. The customer enters the Amount and other required details, and presses the Deposit/Process button.
  4. 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.
REST API
  1. The payment flow begins on your payment page when the customer enters an amount they wish to transfer, and selects the Secure Bank Transfer payment method.
  2. This is an optional step, if you enabled the “Privacy Notice” acceptance option (see the prerequisite above):
    • Display a “Privacy Notice” link for the customer to press 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • paymentOption.alternativePaymentMethod: “apmgw_Secure_Bank_Transfer
    • deviceDetails block containing: ipAddress
    • billingAddressblock 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": "100", "paymentOption": { "alternativePaymentMethod": { "paymentMethod": "apmgw_Secure_Bank_Transfer" } }, "billingAddress": {"firstName": "John","lastName": "Smith","email": "[emailprotected]","phone": "6175551414","address": "22 Main Street","city": "Boston","zip": "02460","state": "MA", "country": "US"}, "userDetails": { "firstName": "John", "lastName": "Smith", "email": "[emailprotected]", "phone": "6175551414", "address": "22 Main Street", "city": "Boston", "zip": "02460", "state": "MA", "country": "US", "identification": "123456789" }, "deviceDetails": { "ipAddress": "<customer's IP address>" }, "urlDetails": { "notificationUrl": "<URL to which DMNs are sent>" }, "timeStamp": "<YYYYMMDDHHmmss>", "checksum": "<calculated checksum>"}
  6. 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.eyJkZXRhaWxzIjoiNzRDQkZEODMyOUI1RDMwMjNDM0YwNUJERThGRkFEMDRGQUNEMURCQUZFMEYxM0QwMzhFQkU5RjRCMzhFMTY2RTY5NEI0QzhDMDg2RjYzMDM2RTdCMkIyREVBRjRENTIyNkM2RDg1RUE5NkI2Qji*zNjEzMUVBREI0NDBGRjU0QzE0RThGM0ZCODg2QzUwQzcyMTYxMURBMkNBQzg1NzI2NjRCOEE4ODE0MThEMkJCMjBFNTAzRDE4MTRBMkJBM0M1NjM3RDBCNkFFRDU5MUVFQzk2NEQwMUE2OEFFRUQyMDBBMUJBRUQ4RUIxNDBGNEEwQkQ2OTE3MzYxMEM4Rjg1MTAwMjMxREEzQkRDNUZGMkNGOUNGRURCQkZFMTQ2REEwMDdCQUY4QUUzN0Q1Q0JEQTYzOTQyNDhGMkFEQzhFMzMyODU4NzQ5MzUyNTI2NDFFREREM0Q4ODEwQTE3RkVCNTlBMjY4ODBCMkI2NjYzRkVENjk3RjRBMDhERTFBNzVDRDdBMzk2MzBGRjJBREU1Mjk0N0FERjFFQUVFMDA4Nzg4Q0REN0RCNjM5M0QwRTNEOTFBQkVERTY3MDFBMUQ0RkU3M0M3RTQwNUQ5RjlCNzZDMUYxRjQ5QzIxMjU4RERENDVDQUFDNTNERDg4MEVBNTk2Mzk1QzBDRDQ4NUY0OTQ4M0VERURGNDJFRkQzMUJBNkIwMUYwMTFGMTVGNzAyMUI2OTRBOUQ1NTU0OEEyQ0FDNUQ3MzVBNTgyMkJCMEFDOUFCQjhBQzc1Q0UxNzc1NjI0QzY1QUQ1MDU4NTVCRDI5RjFCMjJCMDlCREExM0I1QkFFQ0ZEMTA1MUI2NTQ4QTUxQkJDNDlEOTlCQUI4MUZERjAwNzAyQTBDQ0IyQTk3MDVENzE2MkZFRUQ5RjEzN0ZGN0FGMDUwNUIyMUIwOTY2RDA2NTFFQkRDRDA1MkY0RTE4MDY5ODlCOEFBQjJDMTIxNkIzNzJDREQ5RDQ0RDQ2N0EwOEUwQjI4MkUzOTkwNjAwOTcyQ0NDNEYwQjZEMDdERDg1ODk2MDYzM0UwNkExQ0VGRTY0OEExNzBDOTA3RjA3Qzg4NDA4NDI0MzQzRjNGQjM1MDZFN0EzRkEwNkQ0MDY5M0QyQkE3MzBGQTdCNzc3NDFFQUU2NDg2NEI2NjE3MDdGMzY0MDNCMTQyOTJDMTM1NzI5NDUwQ0YxRDk3NTcxQUE5NzJDQzg1MTVGQSIsIm1lcmNoYW50X2lkIjoiU2ZDaGFyZ2UiLCJpdiI6Ijk5RTM0MEMyNzg0MkNBOTlCQkIxQzUyNzVFQUFFNURBIiwidXJsIjoiaHR0cHM6Ly9zdGFnaW5nLnZlcmlmaWVkYWNoLmNvbS9jb25zdW1lci9BY3F1aXJlSW5mb0dhdGV3YXkuZG8ifQ.EF3K5UsPQYdua_YcRd9Yefl-KemNwEMq5-EXV7QWAZUbCQglncAaAHzzlW-sxq2XcVZcZ2qbxLkQqjzkB3tItTGUDmqysL-opqOdaaz54EKeHKC5hzQIp77DucIGYQhPxfOB_eAxTOPLvZ85c3woJ37m8BH8kuJPSoAjYrZ12geEQJQx4R2VxNT3QsxxryEWZvU1yKc8mjCl011nWz6cp4LZpHIMwUwvdCMJWUeJtAxC-Q6Ec4NqP93AFki9Ln0OOvenbOEBn3UpK_BncxKu7RFOzM8w4kSf0eopKC44awlROwZaO0k0htJAUikA_W-fgeLISuMpHmWMZz6X3Ju2Bg", "userPaymentOptionId": "8061731", "card": {} }, "sessionToken": "6fa38ea2-6f1a-4620-85ae-7deaf0d5f8f1", "userTokenId": "2J6QZH3UF9E2", "status": "SUCCESS"}
  7. Redirect the customer to their bank’s site, so they can capture the bank account details of the account they want to pay from.
Web SDK
  1. The payment flow begins on your payment page when the customer enters a payment amount.
  2. Initiate a Session
    Send the amountand a userTokenId (unique customer identifier in merchant 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. This is an optional step, if you enabled the “Privacy Notice” acceptance option (see the prerequisite above):
    • Display a “Privacy Notice” link for the customer to press 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • paymentOption.alternativePaymentMethod: “apmgw_Secure_Bank_Transfer
    • deviceDetails block containing: ipAddress
    • billingAddressblock containing: firstName, lastName, email, phone, address, city, zip, state
    • userDetails block containing: firstName, lastName, email, phone, address, city, zip, state, identification
    • urlDetails.notificationUrl
      Example createPayment() Request (without UPO)
      sfc.createPayment({ sessionToken: "<sessiontoken>", paymentOption: { alternativePaymentMethod: { paymentMethod: "apmgw_Secure_Bank_Transfer" } },deviceDetails: { ipAddress: "<customer's IP address>"}, billingAddress: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US" }, userDetails: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US", identification: "123456789" }, urlDetails: { notificationUrl: "<URL to which DMNs are sent>"},}, function(res) { console.log(res);});
  8. 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.eyJkZXRhaWxzIjoiNzRDQkZEODMyOUI1RDMwMjNDM0YwNUJERThGRkFEMDRGQUNEMURCQUZFMEYxM0QwMzhFQkU5RjRCMzhFMTY2RTY5NEI0QzhDMDg2RjYzMDM2RTdCMkIyREVBRjRENTIyNkM2RDg1RUE5NkI2Qji*zNjEzMUVBREI0NDBGRjU0QzE0RThGM0ZCODg2QzUwQzcyMTYxMURBMkNBQzg1NzI2NjRCOEE4ODE0MThEMkJCMjBFNTAzRDE4MTRBMkJBM0M1NjM3RDBCNkFFRDU5MUVFQzk2NEQwMUE2OEFFRUQyMDBBMUJBRUQ4RUIxNDBGNEEwQkQ2OTE3MzYxMEM4Rjg1MTAwMjMxREEzQkRDNUZGMkNGOUNGRURCQkZFMTQ2REEwMDdCQUY4QUUzN0Q1Q0JEQTYzOTQyNDhGMkFEQzhFMzMyODU4NzQ5MzUyNTI2NDFFREREM0Q4ODEwQTE3RkVCNTlBMjY4ODBCMkI2NjYzRkVENjk3RjRBMDhERTFBNzVDRDdBMzk2MzBGRjJBREU1Mjk0N0FERjFFQUVFMDA4Nzg4Q0REN0RCNjM5M0QwRTNEOTFBQkVERTY3MDFBMUQ0RkU3M0M3RTQwNUQ5RjlCNzZDMUYxRjQ5QzIxMjU4RERENDVDQUFDNTNERDg4MEVBNTk2Mzk1QzBDRDQ4NUY0OTQ4M0VERURGNDJFRkQzMUJBNkIwMUYwMTFGMTVGNzAyMUI2OTRBOUQ1NTU0OEEyQ0FDNUQ3MzVBNTgyMkJCMEFDOUFCQjhBQzc1Q0UxNzc1NjI0QzY1QUQ1MDU4NTVCRDI5RjFCMjJCMDlCREExM0I1QkFFQ0ZEMTA1MUI2NTQ4QTUxQkJDNDlEOTlCQUI4MUZERjAwNzAyQTBDQ0IyQTk3MDVENzE2MkZFRUQ5RjEzN0ZGN0FGMDUwNUIyMUIwOTY2RDA2NTFFQkRDRDA1MkY0RTE4MDY5ODlCOEFBQjJDMTIxNkIzNzJDREQ5RDQ0RDQ2N0EwOEUwQjI4MkUzOTkwNjAwOTcyQ0NDNEYwQjZEMDdERDg1ODk2MDYzM0UwNkExQ0VGRTY0OEExNzBDOTA3RjA3Qzg4NDA4NDI0MzQzRjNGQjM1MDZFN0EzRkEwNkQ0MDY5M0QyQkE3MzBGQTdCNzc3NDFFQUU2NDg2NEI2NjE3MDdGMzY0MDNCMTQyOTJDMTM1NzI5NDUwQ0YxRDk3NTcxQUE5NzJDQzg1MTVGQSIsIm1lcmNoYW50X2lkIjoiU2ZDaGFyZ2UiLCJpdiI6Ijk5RTM0MEMyNzg0MkNBOTlCQkIxQzUyNzVFQUFFNURBIiwidXJsIjoiaHR0cHM6Ly9zdGFnaW5nLnZlcmlmaWVkYWNoLmNvbS9jb25zdW1lci9BY3F1aXJlSW5mb0dhdGV3YXkuZG8ifQ.EF3K5UsPQYdua_YcRd9Yefl-KemNwEMq5-EXV7QWAZUbCQglncAaAHzzlW-sxq2XcVZcZ2qbxLkQqjzkB3tItTGUDmqysL-opqOdaaz54EKeHKC5hzQIp77DucIGYQhPxfOB_eAxTOPLvZ85c3woJ37m8BH8kuJPSoAjYrZ12geEQJQx4R2VxNT3QsxxryEWZvU1yKc8mjCl011nWz6cp4LZpHIMwUwvdCMJWUeJtAxC-Q6Ec4NqP93AFki9Ln0OOvenbOEBn3UpK_BncxKu7RFOzM8w4kSf0eopKC44awlROwZaO0k0htJAUikA_W-fgeLISuMpHmWMZz6X3Ju2Bg", "userPaymentOptionId": "8061731", "card": {} }, "sessionToken": "6fa38ea2-6f1a-4620-85ae-7deaf0d5f8f1", "userTokenId": "2J6QZH3UF9E2", "status": "SUCCESS"}
  9. Redirect the customer to their bank’s site, so they can capture the bank account details of the account they want to pay from.
Simply Connect
  1. TheSecure Bank Transfer flow begins when the customer selects the Secure Bank Transfer payment method from the payment method gallery.
  2. This is an optional step, if you enabled the “Privacy Notice” acceptance option (see the prerequisite above):
    1. Display a “Privacy Notice” link for the customer to press to view the Nuvei Privacy Notice (https://nuvei.com/privacy-notice/).
    2. Display the “I agree to the Privacy Policy” checkbox, which the customer must select before allowing them to continue to the next step.
  3. The customer enters the Amount and other required details, and presses the Deposit/Process button.
  4. 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.

Handling the Response

The transaction begins to be processed and the system returns the following responses:

Optional – Only applicable to the “Automatic Transaction Approval” feature:

If you enabled the optional “Automatic Transaction Approval” feature, then 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 userPaymentOptionIdwith a preApprovalId stored in the UPO record.
    • A DMN 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 that includes the result of the transaction (status=DECLINED).

The transaction status progresses from PENDING to UPDATE, and then to APPROVED or DECLINED.
You receive the following responses and DMNs:

  1. transactionStatus=PENDING:
    The request returns:
    • A response that includes "transactionStatus": PENDINGand a "userPaymentOptionId".
      Example of Some Parameters Returned
      { ... ... "transactionId":"36682151", "paymentOption": { "userPaymentOptionId": "8100521", "card": {} }, "transactionStatus": "PENDING", ... ...}
    • A DMN containing status=PENDING.
      See Example DMN with status=PENDING.
  2. transactionStatus=UPDATE:
    • After a short time period, a preApprovalId is generated and stored in the UPO record.
    • You receive a DMN containing status=UPDATE.
      See Example DMN with status=UPDATE.
  3. The request is processed and returns a transaction notification with the final status within 2–5 days.
    • transactionStatus=APPROVED:
      If the transfer is successful, then the following is returned:
      • A response with status=APPROVED.
      • A DMN containing status=APPROVED.
        See Example DMN with status=APPROVED.
    • status=DECLINED:
      If the transfer is not successful, then the following is returned:
      • A response with status=DECLINED.
      • A DMN containing status=DECLINED.

Payment (with UPO)

Follow the relevant steps for each environment:

Press tab to open…

  • REST API
  • Web SDK
  • Simply Connect
  1. The payment flow begins on your payment page when a “returning customer” enters an amount they wish to transfer, and selects the Secure Bank Transfer 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 of 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 of 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • userPaymentOptionId: “<ID of a previously stored payment option>
    • deviceDetails block containing: ipAddress
    • 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 /payment Request (with 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": "100", "paymentOption": { "userPaymentOptionId": "8100521", "alternativePaymentMethod": { "paymentMethod": "apmgw_Secure_Bank_Transfer" } }, deviceDetails: { ipAddress: "<customer's IP address>"}, "billingAddress": { "firstName": "John", "lastName": "Smith", "email": "[emailprotected]", "phone": "6175551414", "address": "22 Main Street", "city": "Boston", "zip": "02460", "state": "MA", "country": "US" }, "userDetails": { "firstName": "John", "lastName": "Smith", "email": "[emailprotected]", "phone": "6175551414", "address": "22 Main Street", "city": "Boston", "zip": "02460", "state": "MA", "country": "US", "identification": "123456789" }, "urlDetails": { "notificationUrl": "<URL to which DMNs are sent>" },"timeStamp": "<YYYYMMDDHHmmss>","checksum": "<calculated checksum>"}
  1. Thepayment flow begins on your payment page when a “returning customer” enters a payment amount.
  2. Initiate a Session
    Send the amountand a userTokenId (unique customer identifier in merchant 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 of 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 of 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • userPaymentOptionId: “<ID of a previously stored payment option>
    • paymentOption.alternativePaymentMethod: “apmgw_Secure_Bank_Transfer
    • deviceDetails block containing: ipAddress
    • 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 createPayment() Request (with UPO)
sfc.createPayment({ sessionToken: "<sessiontoken>", paymentOption: { userPaymentOptionId: "8100521", alternativePaymentMethod: { paymentMethod: "apmgw_Secure_Bank_Transfer" } }, deviceDetails: { ipAddress: "<customer's IP address>"}, billingAddress: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US" }, userDetails: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US", identification: "123456789" }, urlDetails: { notificationUrl: "<URL to which DMNs are sent>"},}, function(res) { console.log(res);});
  1. The Secure Bank Transfer flow begins when the customer selects the Secure Bank Transfer payment method from the payment method gallery.
  2. The customer selects one of their previously captured payment methods (UPOs), enters an amount, and presses the Deposit/Process button.
REST API
  1. The payment flow begins on your payment page when a “returning customer” enters an amount they wish to transfer, and selects the Secure Bank Transfer 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 of 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 of 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • userPaymentOptionId: “<ID of a previously stored payment option>
    • deviceDetails block containing: ipAddress
    • 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 /payment Request (with 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": "100", "paymentOption": { "userPaymentOptionId": "8100521", "alternativePaymentMethod": { "paymentMethod": "apmgw_Secure_Bank_Transfer" } }, deviceDetails: { ipAddress: "<customer's IP address>"}, "billingAddress": { "firstName": "John", "lastName": "Smith", "email": "[emailprotected]", "phone": "6175551414", "address": "22 Main Street", "city": "Boston", "zip": "02460", "state": "MA", "country": "US" }, "userDetails": { "firstName": "John", "lastName": "Smith", "email": "[emailprotected]", "phone": "6175551414", "address": "22 Main Street", "city": "Boston", "zip": "02460", "state": "MA", "country": "US", "identification": "123456789" }, "urlDetails": { "notificationUrl": "<URL to which DMNs are sent>" },"timeStamp": "<YYYYMMDDHHmmss>","checksum": "<calculated checksum>"}
Web SDK
  1. Thepayment flow begins on your payment page when a “returning customer” enters a payment amount.
  2. Initiate a Session
    Send the amountand a userTokenId (unique customer identifier in merchant 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 of 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 of 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 including:
    • userTokenId – Unique customer identifier in merchant system.
    • amount
    • userPaymentOptionId: “<ID of a previously stored payment option>
    • paymentOption.alternativePaymentMethod: “apmgw_Secure_Bank_Transfer
    • deviceDetails block containing: ipAddress
    • 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 createPayment() Request (with UPO)
sfc.createPayment({ sessionToken: "<sessiontoken>", paymentOption: { userPaymentOptionId: "8100521", alternativePaymentMethod: { paymentMethod: "apmgw_Secure_Bank_Transfer" } }, deviceDetails: { ipAddress: "<customer's IP address>"}, billingAddress: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US" }, userDetails: { firstName: "John", lastName: "Smith", email: "[emailprotected]", phone: "6175551414", address: "22 Main Street", city: "Boston", zip: "02460", state: "MA", country: "US", identification: "123456789" }, urlDetails: { notificationUrl: "<URL to which DMNs are sent>"},}, function(res) { console.log(res);});
Simply Connect
  1. The Secure Bank Transfer flow begins when the customer selects the Secure Bank Transfer payment method from the payment method gallery.
  2. The customer selects one of their previously captured payment methods (UPOs), enters an amount, and presses the Deposit/Process button.

The request is processed:

  • Secure Bank Transfer processes the transaction and returns transaction notifications and status.
    See the Handling the Response topic (same as for “Payment (without UPO)” (above).
  • Alternatively:

    Optional – Only applicable to the “Automatic Transaction Approval” feature:
    If you enabled the optional “Automatic Transaction Approval” feature and 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 transfer is successful, then the following is returned:
      • A response with status=APPROVED.
      • A userPaymentOptionIdwith a preApprovalId stored in the UPO record.
      • A DMN 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 that includes the result of the transaction (status=DECLINED).

Payout

A payout is performed using the REST API /payout request.

See the Payouttopic above – same flow as for Bank Transfer (ACH).

Refund

See the Refund topic.

Declined Deposit and Declined Pre-approval

NSF – Amount 1.27
Declined – Amount 1.30
Account No: 3666394279
Routing No: 123456780

Successful Deposit and Successful Pre-approval

Success – Amount: 1.25
Account No: 111111111
Routing No: 123456780

Testing Trigger Amounts

ACH - Nuvei Documentation (7)

In production, a real bank account must be used to get back an approved transaction.

Generating UPOs

Introduction

A userPaymentOptionId 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 the 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, including email, countryCode, firstName, and lastName.

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":"[emailprotected]", "countryCode":"2-letterISOcountrycode>", "timeStamp": "<YYYYMMDDHHmmss>", "checksum": "<calculated checksum>"}

Generating a UPO

Send an /addUPOAPM request with its mandatory parameters including:

  • userTokenId – The unique customer identifier in your system.
  • apmData block containing:
    • AccountNumber – The customer’s bank account number.
    • 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":"[emailprotected]", "phone":"6175551414", "address":"22 Main Street", "city":"Boston", "zip":"02460", "state":"MA", "country":"US" }, "timeStamp":"<YYYYMMDDHHmmss>", "checksum":"<calculated checksum>"}
{ "merchantId":"<your merchantId>", "merchantSiteId":"<your merchantSiteId>", "clientRequestId":"<unique request ID in merchant system>", "userTokenId":"<unique customer identifier in merchant system>", "paymentMethodName":"apmgw_Secure_Bank_Transfer", "apmData":{ "AccountNumber":"111111111", "RoutingNumber":"999999992" }, "billingAddress":{ "firstName":"John", "lastName":"Smith", "email":"[emailprotected]", "phone":"6175551414", "address":"22 Main Street", "city":"Boston", "zip":"02460", "state":"MA", "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 DMN with status=PENDING
...'ppp_status=PENDING&Status=PENDING&ExErrCode=0&ErrCode=0&errApmCode=0&errApmDescription=&errScCode=0&errScDescription=&Reason=&ReasonCode=0&PPP_TransactionID=37833471&userid=UID&merchant_unique_id=MUID012311122&customData=QA+test+merchant&productId=PID&first_name=Alberta&last_name=Bobbeth+Charleson&email=test%40mymail.com&currency=USD&customField1=&customField2=&customField3=&customField4=&customField5=&customField6=&customField7=&customField8=&customField9=&customField10=&customField11=&customField12=&customField13=&customField14=&customField15=&invoice_id=&address1=Sancho+el+fuerte&address2=15&country=United+States&state=NEW+YORK&city=Madrid&zip=07208&phone1=4804638290&phone2=&phone3=&client_ip=174.26.150.77&nameOnCard=&cardNumber=&bin=&noCVV=&acquirerId=&acquirerBank=Nuvei-PI&expMonth=&expYear=&Token=&tokenId=&AuthCode=0000&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=en_GB&unknownParameters=&payment_method=apmgw_Secure_Bank_Transfer&ID=&merchant_id=4972436454212160565&responseTimeStamp=2022-07-12.11%3A22%3A01&buyButtonProductId=&webMasterId=&appliedPromotions=&uniqueCC=&transactionType=Sale&externalEmail=&cardCompany=&eci=&user_token_id=Test1111111111111222222&user_token=auto&userPaymentOptionId=8288891&TransactionID=2110000000006605022&externalTransactionId=9715155&APMReferenceID=9195BF012FC0B7FFCD0B4DB98799ABAB&orderTransactionId=18916101&totalAmount=1.25&dynamicDescriptor=QA+Test+site&item_name_1=ItemName&item_number_1=&item_amount_1=1.25&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=20220711&type=DEPOSIT&clientRequestId=&relatedTransactionId=&apmPayerInfo=%7B%22StatusInfo%22%3A%22%7B+StatusCode%3A+%2C+info%3A+%7D%22%2C%22BankName%22%3A%22Chase%3A+Plaid+Checking%22%2C%22AccountNumber%22%3A%220000%22%2C%22AccountHolder%22%3A%22Alberta+Bobbeth+Charleson%22%2C%22TransactionAmountLimit%22%3A%2250000%22%2C%22DailyAmountLimit%22%3A%2250000%22%2C%22MonthlyAmountLimit%22%3A%22100000%22%2C%22BankKYC%22%3A%5B%7B%22names%22%3A%5B%22Alberta+Bobbeth+Charleson%22%5D%2C%22addresses%22%3A%5B%7B%22data%22%3A%7B%22city%22%3A%22Malakoff%22%2C%22country%22%3A%22US%22%2C%22postal_code%22%3A%2202460%22%2C%22region%22%3A%22MA%22%2C%22street%22%3A%2222+Main+Street%22%7D%2C%22primary%22%3Atrue%7D%2C%7B%22data%22%3A%7B%22city%22%3A%22San+Matias%22%2C%22country%22%3A%22US%22%2C%22postal_code%22%3A%2293405-2255%22%2C%22region%22%3A%22CA%22%2C%22street%22%3A%222493+Leisure+Lane%22%7D%2C%22primary%22%3Afalse%7D%5D%2C%22emails%22%3A%5B%7B%22data%22%3A%22accountholder0%40example.com%22%2C%22primary%22%3Atrue%7D%2C%7B%22data%22%3A%22accountholder1%40example.com%22%2C%22primary%22%3Afalse%7D%2C%7B%22data%22%3A%22extraordinarily.long.email.username.123456%40reallylonghostname.com%22%2C%22primary%22%3Afalse%7D%5D%2C%22phone_numbers%22%3A%5B%7B%22data%22%3A%226175551414%22%2C%22primary%22%3Afalse%7D%2C%7B%22data%22%3A%221112224444%22%2C%22primary%22%3Afalse%7D%2C%7B%22data%22%3A%221112225555%22%2C%22primary%22%3Afalse%7D%5D%7D%5D%2C%22Note%22%3A%22PrevPay%3A+nil+%2B0%7CScore%3A+100%2F100%22%7D&sessionId=21f7e875c612def9af98328ceb5f&responsechecksum=0296f25eb86c71bdf4dd7fe3e4060e1b&advanceResponseChecksum=5f47045e522221edfb1b084cf2caa5a3,
Example DMN with status=UPDATE
...'ppp_status=OK&Status=UPDATE&ExErrCode=0&ErrCode=0&errApmCode=0&errApmDescription=&errScCode=0&errScDescription=&Reason=&ReasonCode=0&PPP_TransactionID=37833471&userid=UID&merchant_unique_id=MUID012311122&customData=QA+test+merchant&productId=PID&first_name=Alberta&last_name=Bobbeth+Charleson&email=test%40mymail.com&currency=USD&customField1=&customField2=&customField3=&customField4=&customField5=&customField6=&customField7=&customField8=&customField9=&customField10=&customField11=&customField12=&customField13=&customField14=&customField15=&invoice_id=&address1=Sancho+el+fuerte&address2=15&country=United+States&state=NEW+YORK&city=Madrid&zip=07208&phone1=4804638290&phone2=&phone3=&client_ip=174.26.150.77&nameOnCard=&cardNumber=&bin=&noCVV=&acquirerId=&acquirerBank=Nuvei-PI&expMonth=&expYear=&Token=&tokenId=&AuthCode=0000&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=en_GB&unknownParameters=&payment_method=apmgw_Secure_Bank_Transfer&ID=&merchant_id=4972436454212160565&responseTimeStamp=2022-07-12.12%3A58%3A19&buyButtonProductId=&webMasterId=&appliedPromotions=&uniqueCC=&transactionType=Sale&externalEmail=&cardCompany=&eci=&user_token_id=Test1111111111111222222&user_token=auto&userPaymentOptionId=8288891&TransactionID=2110000000006605022&externalTransactionId=9715155&APMReferenceID=9195BF012FC0B7FFCD0B4DB98799ABAB&orderTransactionId=18916101&totalAmount=1.25&dynamicDescriptor=QA+Test+site&item_name_1=ItemName&item_number_1=&item_amount_1=1.25&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=&ECIRaw=&upoRegistrationDate=20220711&type=DEPOSIT&clientRequestId=&relatedTransactionId=&apmPayerInfo=%7B%22StatusInfo%22%3A%22%7B+StatusCode%3A+%2C+info%3A+%7D%22%2C%22BankName%22%3A%22Chase%3A+Plaid+Checking%22%2C%22AccountNumber%22%3A%220000%22%2C%22AccountHolder%22%3A%22Alberta+Bobbeth+Charleson%22%2C%22AvailableBalance%22%3A%2210000%22%2C%22CurrentBalance%22%3A%2211000%22%2C%22TransactionAmountLimit%22%3A%2250000%22%2C%22DailyAmountLimit%22%3A%2250000%22%2C%22MonthlyAmountLimit%22%3A%22100000%22%2C%22BankKYC%22%3A%5B%7B%22names%22%3A%5B%22Alberta+Bobbeth+Charleson%22%5D%2C%22addresses%22%3A%5B%7B%22data%22%3A%7B%22city%22%3A%22Malakoff%22%2C%22country%22%3A%22US%22%2C%22postal_code%22%3A%2202460%22%2C%22region%22%3A%22MA%22%2C%22street%22%3A%2222+Main+Street%22%7D%2C%22primary%22%3Atrue%7D%2C%7B%22data%22%3A%7B%22city%22%3A%22San+Matias%22%2C%22country%22%3A%22US%22%2C%22postal_code%22%3A%2293405-2255%22%2C%22region%22%3A%22CA%22%2C%22street%22%3A%222493+Leisure+Lane%22%7D%2C%22primary%22%3Afalse%7D%5D%2C%22emails%22%3A%5B%7B%22data%22%3A%22accountholder0%40example.com%22%2C%22primary%22%3Atrue%2C%22type%22%3A%22primary%22%7D%2C%7B%22data%22%3A%22accountholder1%40example.com%22%2C%22primary%22%3Afalse%2C%22type%22%3A%22secondary%22%7D%2C%7B%22data%22%3A%22extraordinarily.long.email.username.123456%40reallylonghostname.com%22%2C%22primary%22%3Afalse%2C%22type%22%3A%22other%22%7D%5D%2C%22phone_numbers%22%3A%5B%7B%22data%22%3A%226175551414%22%2C%22primary%22%3Afalse%2C%22type%22%3A%22home%22%7D%2C%7B%22data%22%3A%221112224444%22%2C%22primary%22%3Afalse%2C%22type%22%3A%22work%22%7D%2C%7B%22data%22%3A%221112225555%22%2C%22primary%22%3Afalse%2C%22type%22%3A%22mobile%22%7D%5D%7D%5D%2C%22Note%22%3A%22PrevPay%3A+nil+%2B0%7CScore%3A+100%2F100%22%7D&representmentInformation=Account+Linked&sessionId=21f7e875c612def9af98328ceb5f&responsechecksum=40ce1091b7db73b2b9203452f86d4b19&advanceResponseChecksum=a6252e4a90a788b4641db423ad54409a',
Example DMN with status=APPROVED
...'ppp_status=OK&Status=APPROVED&ExErrCode=0&ErrCode=0&errApmCode=0&errApmDescription=&errScCode=0&errScDescription=&Reason=&ReasonCode=0&PPP_TransactionID=37833471&userid=UID&merchant_unique_id=MUID012311122&customData=QA+test+merchant&productId=PID&first_name=Alberta&last_name=Bobbeth+Charleson&email=test%40mymail.com&currency=USD&customField1=&customField2=&customField3=&customField4=&customField5=&customField6=&customField7=&customField8=&customField9=&customField10=&customField11=&customField12=&customField13=&customField14=&customField15=&invoice_id=&address1=Sancho+el+fuerte&address2=15&country=United+States&state=NEW+YORK&city=Madrid&zip=07208&phone1=4804638290&phone2=&phone3=&client_ip=174.26.150.77&nameOnCard=&cardNumber=&bin=&noCVV=&acquirerId=&acquirerBank=Nuvei-PI&expMonth=&expYear=&Token=&tokenId=&AuthCode=0000&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=en_GB&unknownParameters=&payment_method=apmgw_Secure_Bank_Transfer&ID=&merchant_id=4972436454212160565&responseTimeStamp=2022-07-12.11%3A31%3A46&buyButtonProductId=&webMasterId=&appliedPromotions=&uniqueCC=&transactionType=Sale&externalEmail=&cardCompany=&eci=&user_token_id=Test1111111111111222222&user_token=auto&userPaymentOptionId=8288891&TransactionID=2110000000006605022&externalTransactionId=9715155&APMReferenceID=9195BF012FC0B7FFCD0B4DB98799ABAB&orderTransactionId=18916101&totalAmount=1.25&dynamicDescriptor=QA+Test+site&item_name_1=ItemName&item_number_1=&item_amount_1=1.25&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=20220711&type=DEPOSIT&clientRequestId=&relatedTransactionId=&apmPayerInfo=%7B%22StatusInfo%22%3A%22%7B+StatusCode%3A+%2C+info%3A+%2C+originalAmount%3A+1.2500%2C+ProcessedAmount%3A+1.25%7D%22%2C%22BankName%22%3A%22Chase%3A+Plaid+Checking%22%2C%22AccountNumber%22%3A%220000%22%2C%22AccountHolder%22%3A%22Alberta+Bobbeth+Charleson%22%2C%22AvailableBalance%22%3A%2210000%22%2C%22CurrentBalance%22%3A%2211000%22%2C%22TransactionAmountLimit%22%3A%2250000%22%2C%22DailyAmountLimit%22%3A%2250000%22%2C%22MonthlyAmountLimit%22%3A%22100000%22%2C%22BankKYC%22%3A%5B%7B%22names%22%3A%5B%22Alberta+Bobbeth+Charleson%22%5D%2C%22addresses%22%3A%5B%7B%22data%22%3A%7B%22city%22%3A%22Malakoff%22%2C%22country%22%3A%22US%22%2C%22postal_code%22%3A%2202460%22%2C%22region%22%3A%22MA%22%2C%22street%22%3A%2222+Main+Street%22%7D%2C%22primary%22%3Atrue%7D%2C%7B%22data%22%3A%7B%22city%22%3A%22San+Matias%22%2C%22country%22%3A%22US%22%2C%22postal_code%22%3A%2293405-2255%22%2C%22region%22%3A%22CA%22%2C%22street%22%3A%222493+Leisure+Lane%22%7D%2C%22primary%22%3Afalse%7D%5D%2C%22emails%22%3A%5B%7B%22data%22%3A%22accountholder0%40example.com%22%2C%22primary%22%3Atrue%7D%2C%7B%22data%22%3A%22accountholder1%40example.com%22%2C%22primary%22%3Afalse%7D%2C%7B%22data%22%3A%22extraordinarily.long.email.username.123456%40reallylonghostname.com%22%2C%22primary%22%3Afalse%7D%5D%2C%22phone_numbers%22%3A%5B%7B%22data%22%3A%226175551414%22%2C%22primary%22%3Afalse%7D%2C%7B%22data%22%3A%221112224444%22%2C%22primary%22%3Afalse%7D%2C%7B%22data%22%3A%221112225555%22%2C%22primary%22%3Afalse%7D%5D%7D%5D%2C%22Note%22%3A%22PrevPay%3A+nil+%2B0%7CScore%3A+100%2F100%22%7D&sessionId=21f7e875c612def9af98328ceb5f&responsechecksum=40ce1091b7db73b2b9203452f86d4b19&advanceResponseChecksum=789fc87b58bce800ac0890acaf491563',
ACH - Nuvei Documentation (2024)
Top Articles
How to Invest in an IRA as a Beginner
Binance Coin (BNB) Price Prediction 2024, 2025, 2030 — Can BNB Hit $10000? - BTCC
Chatiw.ib
Aadya Bazaar
Mr Tire Prince Frederick Md 20678
Georgia Vehicle Registration Fees Calculator
라이키 유출
Directions To 401 East Chestnut Street Louisville Kentucky
Green Bay Press Gazette Obituary
Www Thechristhospital Billpay
Bustle Daily Horoscope
Our Facility
Craigslist Pets Southern Md
Valentina Gonzalez Leak
David Turner Evangelist Net Worth
WWE-Heldin Nikki A.S.H. verzückt Fans und Kollegen
Hell's Kitchen Valley Center Photos Menu
Love In The Air Ep 9 Eng Sub Dailymotion
Dr Adj Redist Cadv Prin Amex Charge
Nail Salon Goodman Plaza
How To Cancel Goodnotes Subscription
Craigslistjaxfl
ELT Concourse Delta: preparing for Module Two
Hdmovie 2
Thick Ebony Trans
Hannah Palmer Listal
Everything To Know About N Scale Model Trains - My Hobby Models
Boxer Puppies For Sale In Amish Country Ohio
What Sells at Flea Markets: 20 Profitable Items
Downtown Dispensary Promo Code
Log in to your MyChart account
Kuttymovies. Com
Filmy Met
Star News Mugshots
Bernie Platt, former Cherry Hill mayor and funeral home magnate, has died at 90
How to Get Into UCLA: Admissions Stats + Tips
Frostbite Blaster
The Boogeyman Showtimes Near Surf Cinemas
USB C 3HDMI Dock UCN3278 (12 in 1)
Bismarck Mandan Mugshots
Www Craigslist Com Brooklyn
Hometown Pizza Sheridan Menu
Below Five Store Near Me
Executive Lounge - Alle Informationen zu der Lounge | reisetopia Basics
Is Chanel West Coast Pregnant Due Date
Autozone Battery Hold Down
Myhrkohls.con
Southwind Village, Southend Village, Southwood Village, Supervision Of Alcohol Sales In Church And Village Halls
Sdn Dds
Ff14 Palebloom Kudzu Cloth
Syrie Funeral Home Obituary
7 National Titles Forum
Latest Posts
Article information

Author: Kelle Weber

Last Updated:

Views: 5974

Rating: 4.2 / 5 (73 voted)

Reviews: 80% of readers found this page helpful

Author information

Name: Kelle Weber

Birthday: 2000-08-05

Address: 6796 Juan Square, Markfort, MN 58988

Phone: +8215934114615

Job: Hospitality Director

Hobby: tabletop games, Foreign language learning, Leather crafting, Horseback riding, Swimming, Knapping, Handball

Introduction: My name is Kelle Weber, I am a magnificent, enchanting, fair, joyous, light, determined, joyous person who loves writing and wants to share my knowledge and understanding with you.