{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-docs/sidebars.yaml","api-docs-apis/openapi.yaml":"api-docs-apis/openapi.yaml"},"props":{"metadata":{"markdoc":{"tagList":["replay-openapi"]},"type":"markdown"},"seo":{"title":"Reefpay Docs","description":"Reefpay is the groundbreaking payment gateway that lets you integrate with the future of payments."},"dynamicMarkdocComponents":["openapi"],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"accept-an-ach-payment","__idx":0},"children":["Accept an ACH payment"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["An ACH debit pulls funds from a customer's checking or savings account. It costs"," ","less than a card payment and suits large or recurring amounts, but it settles"," ","more slowly and it can come back days later as a return."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["ACH runs through VeriCheck. Card transactions run through TSYS. A merchant"," ","account is configured for one or the other, so the payment method and the"," ","credentials have to agree."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"before-you-start","__idx":1},"children":["Before you start"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Api-Key"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Client-Id"]}," — see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/get-started/authentication"},"children":["Authentication"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A processor integration configured for ACH"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The customer's authorization to debit the account, in a form the SEC code below"," ","describes"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"send-the-debit","__idx":2},"children":["Send the debit"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/transactions"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SALE"]}," and a bank account as the"," ","payment method."]},{"$$mdtype":"Tag","name":"ReplayOpenApi","attributes":{"descriptionFile":"api-docs-apis/openapi.yaml","operationId":"createTransaction","exampleKey":"saleWithBankAccount","parameters":{},"options":{},"environments":{}},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["ACH asks for more required fields than a card does. All six of these must be"," ","present:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Notes"},"children":["Notes"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment_method.type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ACH"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment_method.routing_number"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Exactly 9 digits"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment_method.account_number"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["4 to 20 digits"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment_method.account_type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CHECKING"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SAVINGS"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment_method.first_name"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Required, unlike on a card"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment_method.last_name"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Required, unlike on a card"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Two optional fields matter more than they look:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["standard_entry_class"]}]}," defaults to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["WEB"]},". It declares how the customer"," ","authorized the debit, and the right value is a compliance question, not a"," ","preference. See the table below."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["description"]}]}," is at most 30 characters."," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Only the first 10 reach the customer's bank statement."]}," ","Left blank, it falls back to the merchant name."," ","Put something recognizable in the first 10 characters or expect disputes."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"choosing-a-sec-code","__idx":3},"children":["Choosing a SEC code"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Standard Entry Class code records how you obtained authorization. Send the"," ","one that matches what actually happened."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Use it for"},"children":["Use it for"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["WEB"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Consumer authorized over the internet. The default"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PPD"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Consumer authorized in writing"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TEL"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Consumer authorized by telephone"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CCD"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Business-to-business"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POP"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Check converted at the point of sale"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BOC"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Check converted after the sale"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"ach-takes-only-sale-and-payout","__idx":4},"children":["ACH takes only SALE and PAYOUT"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A bank account accepts ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SALE"]}," to pull funds in, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAYOUT"]}," to send"," ","them out. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["There is no ACH authorization"]},", so ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type: AUTH"]}," with a bank account"," ","returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INVALID_ACTION"]}," and the message \"Payment method not supported"," ","for this transaction type\"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["That also means the capture flow does not apply to ACH. An ACH sale is a single"," ","step."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"approved-is-not-final","__idx":5},"children":["Approved is not final"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is the part that catches card-shaped integrations."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A card decline arrives in the response. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["An ACH return arrives days later"]},", long"," ","after you saw ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["APPROVED"]},", and often after the transaction has already settled."," ","Insufficient funds, a closed account, or a customer revoking authorization all"," ","surface this way."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["So an approved ACH transaction is provisional. Do not treat it as final for"," ","anything expensive to reverse — shipping goods, crediting an account balance —"," ","until you have given returns time to arrive."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Four fields on the transaction carry it:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Behavior"},"children":["Behavior"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_returned"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]}," once returned. Always present. Always ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]}," on a card"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["returned_at"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["When the processor sent the return. Always present, null if none"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_code"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The three-character NACHA code. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Omitted entirely"]},", not null, when there is no return"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_reason"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The same in words. Also omitted rather than null"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Two consequences for your code:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Read ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_returned"]}," alongside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_settled"]},", not instead of it."]}," A returned"," ","transaction may well have settled first."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_code"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_reason"]}," are absent, not null."]}," Code that reads"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body[\"return_code\"]"]}," without checking for the key will throw on every"," ","transaction that was never returned — which is nearly all of them."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["There are no webhooks, so poll ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/transactions"]}," to find returns."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"next-steps","__idx":6},"children":["Next steps"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/payments/send-a-payout"},"children":["Send a payout"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/concepts/ach-and-nacha"},"children":["ACH and NACHA basics"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/after-the-payment/find-and-report-on-transactions"},"children":["Find and report on transactions"]}]}]}]},"headings":[{"value":"Accept an ACH payment","id":"accept-an-ach-payment","depth":1},{"value":"Before you start","id":"before-you-start","depth":2},{"value":"Send the debit","id":"send-the-debit","depth":2},{"value":"Choosing a SEC code","id":"choosing-a-sec-code","depth":2},{"value":"ACH takes only SALE and PAYOUT","id":"ach-takes-only-sale-and-payout","depth":2},{"value":"Approved is not final","id":"approved-is-not-final","depth":2},{"value":"Next steps","id":"next-steps","depth":2}],"frontmatter":{"title":"Accept an ACH payment","shortTitle":"ACH payment","intro":"Debit a US bank account. ACH is cheaper than cards and slower to settle, and it can be returned days after it was approved.","type":"how-to","seo":{"title":""}},"lastModified":"2026-09-17T08:54:39.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/payments/accept-an-ach-payment","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}