DEVELOPER

Pay-by-Bank (ACH) API



Products

Pay-by-Bank (ACH) API Integration Guide


EnvironmentBase URL
Sandboxhttps://secure.epxuap.com



How To Start

  1. Contact us for test credentials that can be used to try out the payment API in a test environment.
    Once test credentials are provisioned, they can be referenced when logged in by selecting the User profile icon in the top right corner of the screen and selecting Credentials.
  2. Use the API specification or the Postman Collection to build your app against the test environment.
    Additional resources to assist with development, including test data, are provided here.
    When logged in, you can use the Integration Tracker to view the status of your integration, notes from meetings with Integration Engineers, resources related to your solution, and more by clicking the User profile icon in the top right corner of the screen and selecting Integrations.
  3. Submit a request for certification using our contact form. One of our analysts will begin the review process by validating the data you provided against our internal logs. If any changes are needed, our analysts will work with you until the application is ready to be certified.
  4. You'll receive a letter of EPX certification with production credentials and can deploy your application for use.

How To Test

Contact us for test credentials that can be used to try out the payment API in a test environment. Once test credentials are provisioned, they can be referenced when logged in by selecting the User profile icon in the top right corner of the screen and selecting Credentials.


HTTPS Request Method

Data is formatted utilizing the key-value pair format and sent via a POST or GET request to the Pay-by-Bank (ACH) API over the standard HTTPS port, 443. Responses are received in XML format.

If using a GET request, the request body is built as one string, which includes both the request URL and the data elements. Below is a sample request to our testing environment:

https://secure.epxuap.com?CUST_NBR=7000&MERCH_NBR=700010&DBA_NBR=1&TERMINAL_NBR=1&TRAN_TYPE=CKC2&AMOUNT=77.00&BATCH_ID=20211207&TRAN_NBR=113&ACCOUNT_NBR=123456789&ROUTING_NBR=123456789&FIRST_NAME=Teddy&LAST_NAME=Tester&ADDRESS=123+Main+Street&CITY=Wilmington&STATE=DE&ZIP_CODE=12345

Note: Each key-value pair is separated by an ampersand (&), and an ‘End of Request’ marker is not required because the last field is simply the end of the request. When submitting a request in this manner, the fields do not need to be in any particular order.

If using a POST request, you do not need to build the combined string. You can use your preferred library to send the request to the Pay-by-Bank (ACH) API, or you can post from an HTML form to your server to submit the data to EPX. See below for an HTML example of this method.


Example HTML Code

HTML
<html>
  <head> </head>
  <body>
    <h1>Sample HTML Post</h1>
    <h2>ACH Transaction</h2>
    <form action="https://secure.epxuap.com" method="POST">
      <table>
        <tr>
          <td valign="top">
            CUST_NBR: <input type="hidden" name="CUST_NBR" value="7000" /><br />
            MERCH_NBR: <input type="text" name="MERCH_NBR" value="700010" /><br />
            DBA_NBR: <input type="text" name="DBA_NBR" value="1" /><br />
            TERMINAL_NBR: <input type="text" name="TERMINAL_NBR" value="1" /><br />
            TRAN_TYPE:
            <input type="text" name="TRAN_TYPE" value="CKC2" /><br />
            BATCH_ID: <input type="text" name="BATCH_ID" value="5" /><br />
            TRAN_NBR: <input type="text" name="TRAN_NBR" value="9" /><br />
            AMOUNT: <input type="text" name="AMOUNT" value="11.99" /><br />
            ACCOUNT_NBR: <input type="text" name="ACCOUNT_NBR" value="123456789" /><br />
            ROUTING_NBR: <input type="text" name="ROUTING_NBR" value="123456789" /><br />
            <!-- For transactions using a token instead of the raw data, send this field. -->
            <!-- ORIG_AUTH_GUID: <input type="text" name="ORIG_AUTH_GUID" value="09LJ39855GWBZJGP8UR"/><br> -->
            <input type="submit" name="submit" value="submit" />
          </td>
        </tr>
      </table>
    </form>
  </body>
</html>




Example XML Response

<RESPONSE>
    <FIELDS>
        <FIELD KEY="MSG_VERSION">123</FIELD>
        <FIELD KEY="CUST_NBR">1234</FIELD>
        <FIELD KEY="MERCH_NBR">123456</FIELD>
        <FIELD KEY="DBA_NBR">1</FIELD>
        <FIELD KEY="TERMINAL_NBR">12</FIELD>
        <FIELD KEY="TRAN_TYPE">CKC2</FIELD>
        <FIELD KEY="BATCH_ID">1234</FIELD>
        <FIELD KEY="TRAN_NBR">5</FIELD>
        <FIELD KEY="LOCAL_DATE">052722</FIELD>
        <FIELD KEY="LOCAL_TIME">092446</FIELD>
        <FIELD KEY="AUTH_GUID">LLNKWEROIU09SKLRM3</FIELD>
        <FIELD KEY="AUTH_RESP">00</FIELD>
        <FIELD KEY="AUTH_CODE">244919</FIELD>
        <FIELD KEY="AUTH_RESP_TEXT">ACCEPTED 244919</FIELD>
        <FIELD KEY="AUTH_CARD_TYPE">L</FIELD>
        <FIELD KEY="AUTH_TRAN_DATE_GMT">05/27/2022 03:24:46 PM</FIELD>
        <FIELD KEY="AUTH_AMOUNT_REQUESTED">77.00</FIELD>
        <FIELD KEY="AUTH_AMOUNT">77.00</FIELD>
        <FIELD KEY="AUTH_CURRENCY_CODE">840</FIELD>
        <FIELD KEY="NETWORK_RESPONSE">00</FIELD>
        <FIELD KEY="AUTH_MASKED_ACCOUNT_NBR">******7890</FIELD>
        <FIELD KEY="ORIG_TRAN_TYPE">CKC2</FIELD>
    </FIELDS>
</RESPONSE>




Request Fields

Field NameDescription

CUST_NBR / MERCH_NBR / DBA_NBR / TERMINAL_NBR

These 4 values create your “4-part key” that is provided to you by the integration engineers. The 4-part key will be provided to you in
{CUST_NBR} - {MERCH_NBR} - {DBA_NBR} - {TERMINAL_NBR} format.

TRAN_TYPE

This field relates to the TRAN_TYPEs listed in the EPX Data Dictionary   and Transaction Specs - ACH   documentation. This field will determine which type of transaction you will process.

AMOUNT

The amount of the transaction. When processing USD, the value here needs to be in ##.## format, with two decimal places.

BATCH_ID

The BATCH_ID field contains a unique number created by the operator to identify a batch of transactions. This unique number can be created by any means, but we suggest using the current date in YYYYMMDD format.

TRAN_NBR

A numeric value, used to identify the transaction. This should be unique for each transaction in a batch. You can just start the first transaction of the day at 1 and increment this number by 1 for each new transaction.

ACCOUNT_NBR

The bank account number to be acted upon during the transaction.

ROUTING_NBR

The bank routing number to be acted upon during the transaction.

FIRST_NAME

First name of the account holder. Required unless STD_ENTRY_CLASS is 'CCD', which stands for Corporate Credit or Debit Entry, in which case RECV_NAME is required.

LAST_NAME

Last name of the account holder. Required unless STD_ENTRY_CLASS is 'CCD', which stands for Corporate Credit or Debit Entry, in which case RECV_NAME is required.

ADDRESS / CITY / STATE / ZIP_CODE

These fields are optional.

STD_ENTRY_CLASS

Optional. If not provided, the SEC code that is set in the merchant profile will be used.

RECV_NAME

Optional unless STD_ENTRY_CLASS is 'CCD', which stands for Corporate Credit or Debit Entry.

The HTTPS method creates an individual connection to the Pay-by-Bank (ACH) API for each transaction request, and the connection is closed after the response is received. The key portion of each pair represents the field name from the EPX Data Dictionary, while the value portion represents the merchant’s data that will be the value for that field. In the sample provided, the “CUST_NBR” is a key or EPX field, and “1234” is the value or merchant’s data.

For more information on available fields and transaction types for the Pay-by-Bank (ACH) API, please refer to the EPX Data Dictionary   and Transaction Specs - ACH   documents.


Fraud Protection

North validates that the payment bank account is open and in good standing before processing ACH payments by validating the bank routing number and account number (note that this does not check the balance or whether an ACH payment will process). If a bank account is closed, does not exist, or is not in good standing, the transaction will be declined at the time of the request.


Making a Sale

A transaction request can be submitted with the CKC2 transaction type for checking accounts, or CKS2 for savings accounts, along with the bank account number and routing number. Please refer to the API specification for more details.


Issuing a Refund

The full or partial amount of the original transaction can be refunded using the CKC3 transaction type for checking accounts, or CKS3 for savings accounts.


Funding

The ACH standard funding timeframe is as follows: If a transaction is submitted on Monday before the settlement cut-off time, the merchant will receive those funds in their bank account on Thursday morning. If the customer’s bank rejects the funding for any reason, such as the account having insufficient funds, the merchant will not be funded. See the Bank Rejects section below for more information.


Reporting

ACH transaction information can be accessed in multiple locations in Payments Hub:

  1. Payments Hub Dashboard On the Dashboard “Home” screen, the Activity, Transaction Volume, and Payment Method Breakdown summary tiles include ACH transaction information. Hovering over data elements on these tiles provides additional detail about the information in the charts.
  2. Payments Hub Sales On the “Sales” tab, the Volume chart shows all transactions for the period and the associated data in the table at the bottom. On the “Method” tab, the ACH transaction information is displayed in the chart on the left as “Bank Account” and broken out in the chart on the right as the specific payment method type “Checking Account” or “Savings Account”. The data table at the bottom includes the ACH transaction information including transaction count, gross sales, refunds, voids, and net sales.
  3. Payments Hub Transactions ACH transactions, along with all transactions, are displayed on the “Transactions” tab. Merchants can easily differentiate between ACH and other transactions looking at the Transaction Type column. Merchants can filter to show only ACH transactions by selecting the “Bank Account Sales” filter on the left. By clicking a transaction row a merchant can open the detailed transaction view where they can see more information about the transaction or take actions like resending the receipt, printing the receipt, voiding the transaction, or refunding the transaction.
  4. Payments Hub Reports ACH transactions will display in the Payments Hub reports tab. The report “Brand Summary” shows all activity for ACH and card payment methods by brand (Visa, MasterCard, Checking Account, etc.). This is different from the “Card Brand Summary Report” which only shows card activity. All of the reports on Payments Hub continue to operate the same way and merchants who accept ACH will have that data included in their reports.


ACH Transaction Response Codes


CodeDisplay Description
00 ACCEPTED ACCEPTED
03 INVALID MERCHANT INVALID MERCHANT OR SERVICE PROVIDER
06 ERROR ERROR
12 INVALID TRANS INVALID TRANSACTION
13 AMOUNT ERROR INVALID AMOUNT
14 INVALID ACCT NBR INVALID ACCOUNT NUMBER
19 RE ENTER RE-ENTER TRANSACTION
21 NO ACTION TAKEN NO ACTION TAKEN
25 UNABLE TO LOCATE UNABLE TO LOCATE RECORD IN FILE
52 NO CHECK ACCOUNT NO CHECKING ACCOUNT
53 NO SAVE ACCOUNT NO SAVINGS ACCOUNT
58 SERV NOT ALLOWED TRANSACTION NOT ALLOWED AT TERMINAL
61 DECLINE ACTIVITY AMOUNT LIMIT EXCEEDED
76 NO ACTION TAKEN UNABLE TO LOCATE PREVIOUS MESSAGE (NO MATCH ON RRN)
77 NO ACTION TAKEN NO MATCH ON ORIGINAL MESSAGE
78 INVALID RTN NBR INVALID ROUTING NUMBER
80 DATE ERROR INVALID DATE
96 SYSTEM ERROR SYSTEM ERROR
E1 INVALID SEC INVALID OR UNSUPPORTED SEC
E7 TERMINAL ID ERROR TERMINAL ID ERROR
EA AUTH TO OLD AUTH TO OLD
EQ NO NETWORK GATEWAY AVAILABLENO NETWORK GATEWAY AVAILABLE
ES DECLINE Transaction not allowed due to failure of internal validations



ACH Transaction Rejects

An ACH transaction may be rejected if the transaction cannot be posted (for example, if the account has insufficient funds), or if an entry is disputed. After the ACH transaction is submitted, a 60 day period begins during which the customer can dispute the transaction and the funds for the transaction amount may be removed from the merchant’s account. After 60 days, the funds may not be removed from the merchant’s account.

Common reject response codes are listed below.

Return CodeReason For Return Applicable
SEC Codes
Deadline For
Return
R01 Insufficient Funds – Available balance is not sufficient to cover the dollar amount of the debit entryALL 24 Hours
R02 Account Closed – A previously open account is no longer openALL 24 Hours
R03 No Account / Unable to Locate – The account number does not correspond to the individual identified in the entry or a valid accountALL 24 Hours
R04 Invalid Account Number – The account number fails the check digit validation or may contain an incorrect number of digitsALL 24 Hours
R05 Unauthorized Debit to Consumer Account using Corporate SEC Code – A business (corporate) debit entry was transmitted to a member’s consumer account, and the member had not authorized the entryCCD, CTX 60 Days – Written statement of
unauthorized
ACH debit
R06 Returned per ODFI’s Request – The ODFI has requested that the RDFI return the entryALL Not Applicable
R07 Authorization Revoked – Member who previously authorized recurring entry has revoked authorization with the OriginatorPPD &
Recurring
WEB
60 Days – Written statement of
unauthorized ACH debit
R08 Payment Stopped - Member had previously requested a stop payment of a single on recurring entryALL 24 HOURS
R09 Uncollected Funds – Available balance is sufficient, but collected balance is not sufficient to cover the entryALL 24 HOURS
R10 Member advises not authorized, notice not provided, improper source document, or amount of entry not accurately obtained from source documentARC, POP,
PPD, TEL,
WEB, BOC
60 DAYS – Written statement of
unauthorized ACH debit
R14 Representative Payee Deceased –
Representative payee is deceased or unable to continue in that capacity, beneficiary is not deceased
ALL except
CCD & CTX
24 HOURS
R15 Beneficiary or Account Holder Deceased ALL except
CCD & CTX
24 HOURS
R16 Account Frozen – Access to account is restricted due to specific action taken by the RDFI or by legal actionALL 24 HOURS
R20 Non-Transaction Account – Policies or regulations (such as Regulation D) prohibit or limit activity to the account indicatedALL 24 HOURS
R29 Corporate Entry Unauthorized – RDFI has been notified by business account holder that a specific transaction is unauthorizedCCD & CTX 24 HOURS
R31 Permissible Return Entry – ODFI agrees to accept a return of an unauthorized corporate entry after the 24 hour deadlineCCD & CTX Not Applicable
R37Improper Source Document / Source Document Presented for Payment RDFI determines that the document (share draft/check) used for an ARC, BOC or POP entry is not eligible for conversion – or the share draft has already been paid as a normal check postingARC, POP,
BOC
24 HOURS
R38 Stop Payment on Source Document – Stop payment has been placed on a check used for an ARC entryBOC, ARC 60 DAYS
R39 Improper Source Document / Source Document Presented for Payment RDFI determines that the document (share draft/check) used for an ARC, BOC or POP entry is not eligible for conversion – or the share draft has already been paid as a normal check postingARC, POP,
BOC
24 HOURS



Dishonored Return Entry

Dishonored Return Code (Submitted
by ODFI)
Code Explanation Possible Action by RDFI
R61 Misrouted Return – Return entry was sent by RDFI to an incorrect ODFI routing/transit numberRDFI should resubmit return to the correct ODFI routing/transit number
R67 Duplicate Return – ODFI has received more than one return entry for the same original entryRDFI should research returns, and contest with return code R75 if no duplication can be found
R68 Untimely Return – Return entry did not meet the return deadlineRDFI should verify timeliness of return entry, and submit contested dishonored return if necessary (R73)
R69 Field Errors – One or more of the following fields contains
incorrect information. Addenda Record Information Field Codes:
∙ 01 Incorrect DFI Account Number
∙ 02 Incorrect Original Entry Trace Number
∙ 03 Incorrect Dollar Amount
∙ 04 Incorrect Individual
Identification Number
∙ 05 Incorrect Transaction Code
∙ 06 Incorrect Company Identification Number
∙ 07 Invalid Effective Entry Date
RDFI should submit corrected return with the correct information (R74)



Contested Dishonored/ Corrected REC

Dishonored Return Code (Submitted by RDFI)Code Explanation
R71 Misrouted Dishonored Return – ODFI misrouted the Dishonored Return entry to the wrong RDFI using an incorrect routing/transit number
R72 Untimely Dishonored Return – ODFI did not submit the Dishonored Return entry within the 5 day deadline
R73 Timely Original Return – RDFI certifies that the original return entry was submitted within the applicable deadline
R74 RDFI is correcting a previous return entry that was dishonored using Return Code R69 because it contained incomplete or incorrect information
R75 Original Return Not a Duplicate – The original return entry was not a duplicate of an entry previously returned by the ODFI. This code may be used by the RDFI to contest an entry dishonored by the ODFI using Return Code R67 (Duplicate Return)
R76 No Errors Found – The original return entry did not contain the errors indicated by the ODFI in the Dishonored Return Entry bearing Return Code R69 (Field Errors)



Standard Entry Class (SEC) Codes

Code Application Title Application Description Account TypeTransaction Type
ARC Accounts Receivable CheckConverted checks received via the US mail or at a drop box locationConsumer accounts onlySingle debit only
CCD Corporate Credit or DebitTransfer of funds between business accounts or to consolidate funds from several accounts of the same businessBusiness accounts onlyDebit or credit
CIE Customer Initiated EntryCredit entry originated by an individual (usually through a bill payment service) used to pay some sort of obligationConsumer or business accountsCredit only
CTX Corporate Trade ExchangePayment or collection of commitments between separate businessesBusiness accounts onlyDebit or credit
DNE Death Notification EntryNotice entered by an agency of the Federal government to advise an RDFI of the death of an individual (Includes addenda record with details)Consumer accounts onlyCredit only (Non-dollar amount entry)
PPD Prearranged Payment and Deposit EntryRepeating entry for direct deposit of payroll, pension, etc., or for payment of recurring bills such as utilities, loans, insurance, etc.Consumer accounts onlyDebit or credit
RCK Represented Check EntryMerchant collection of checks that had been returned as NSF or Uncollected FundsConsumer accounts onlySingle debit only
TEL Telephone Authorized EntryTEL Entry submitted following an oral authorization obtained solely via the telephoneConsumer accounts onlySingle debit only
WEB Internet Authorized EntryEntry submitted pursuant to an authorization obtained solely via the InternetConsumer accounts onlyDebit only
©2025 North is a registered DBA of NorthAB, LLC. All rights reserved. North is a registered ISO of BMO Harris Bank N.A., Chicago, IL, Citizens Bank N.A., Providence, RI, The Bancorp Bank, Philadelphia, PA, FFB Bank, Fresno, CA, Wells Fargo Bank, N.A., Concord, CA, and PNC Bank, N.A.