List outbound ACH transfers
curl --request GET \
--url https://api.getlemma.com/v0/ach-transfer \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.getlemma.com/v0/ach-transfer"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.getlemma.com/v0/ach-transfer', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getlemma.com/v0/ach-transfer",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.getlemma.com/v0/ach-transfer"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.getlemma.com/v0/ach-transfer")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getlemma.com/v0/ach-transfer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "ach_transfer_Lk7nQx4mVp9bRt3d",
"account_id": "account_Rv4nBt8xKw2pMh6s",
"external_account_id": "external_account_Bx5nTm8hKw3pVd7c",
"amount": 150000,
"status": "submitted",
"statement_descriptor": "Acme payroll",
"transaction_id": "transaction_Fh3mPq7xRv2nKt8d",
"settled_at": "2026-03-17T14:30:00Z",
"submission": {
"submitted_at": "2026-03-15T14:30:00Z",
"expected_funds_settlement_at": "2026-03-17T14:30:00Z"
},
"return": null
},
{
"id": "ach_transfer_Qd8mKv2pRt5nBh9c",
"account_id": "account_Rv4nBt8xKw2pMh6s",
"external_account_id": "external_account_Tm6bXn9hRw3pFk7c",
"amount": 120000,
"status": "returned",
"statement_descriptor": "Lab services",
"transaction_id": "transaction_Gt4nRs8yWq3pLm6d",
"settled_at": "2026-03-11T14:30:00Z",
"submission": {
"submitted_at": "2026-03-09T14:30:00Z",
"expected_funds_settlement_at": "2026-03-11T14:30:00Z"
},
"return": {
"raw_return_reason_code": "R02",
"return_transaction_id": "transaction_Wm9nVx4tRp6bKd2c"
}
}
],
"has_next": false,
"cursor": null
}
Outbound ACH transfers
List outbound ACH transfers
Retrieve a paginated list of outbound ACH transfers, optionally filtered by account.
GET
/
v0
/
ach-transfer
List outbound ACH transfers
curl --request GET \
--url https://api.getlemma.com/v0/ach-transfer \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.getlemma.com/v0/ach-transfer"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.getlemma.com/v0/ach-transfer', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getlemma.com/v0/ach-transfer",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.getlemma.com/v0/ach-transfer"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.getlemma.com/v0/ach-transfer")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getlemma.com/v0/ach-transfer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "ach_transfer_Lk7nQx4mVp9bRt3d",
"account_id": "account_Rv4nBt8xKw2pMh6s",
"external_account_id": "external_account_Bx5nTm8hKw3pVd7c",
"amount": 150000,
"status": "submitted",
"statement_descriptor": "Acme payroll",
"transaction_id": "transaction_Fh3mPq7xRv2nKt8d",
"settled_at": "2026-03-17T14:30:00Z",
"submission": {
"submitted_at": "2026-03-15T14:30:00Z",
"expected_funds_settlement_at": "2026-03-17T14:30:00Z"
},
"return": null
},
{
"id": "ach_transfer_Qd8mKv2pRt5nBh9c",
"account_id": "account_Rv4nBt8xKw2pMh6s",
"external_account_id": "external_account_Tm6bXn9hRw3pFk7c",
"amount": 120000,
"status": "returned",
"statement_descriptor": "Lab services",
"transaction_id": "transaction_Gt4nRs8yWq3pLm6d",
"settled_at": "2026-03-11T14:30:00Z",
"submission": {
"submitted_at": "2026-03-09T14:30:00Z",
"expected_funds_settlement_at": "2026-03-11T14:30:00Z"
},
"return": {
"raw_return_reason_code": "R02",
"return_transaction_id": "transaction_Wm9nVx4tRp6bKd2c"
}
}
],
"has_next": false,
"cursor": null
}
Returns outbound ACH transfers, the ones initiated inside Lemma, ordered by most recent first. Results are paginated. For ACHs that arrive from outside, see list inbound ACH transfers.
Query parameters
string
Filter ACH transfers to a specific bank account, prefixed with
account_. You
can find account IDs using the List bank
accounts endpoint. Omit to list ACH
transfers across every account you can access.integer
default:"10"
The number of ACH transfers to return. Maximum is 100.
string
Cursor from the previous response. Omit to fetch from the beginning.
Response
object[]
The list of ACH transfer objects for the requested page.
Show ACH transfer object
Show ACH transfer object
string
Unique identifier for the ACH transfer.
string
The Lemma account the transfer moves money from or to.
string | null
The external account on the other side of
the transfer.
integer
The transfer amount in cents. A positive amount indicates a credit transfer
pushing funds to the receiving account. A negative amount indicates a debit
transfer pulling funds from the receiving account (an ACH pull).
string
Current status of the ACH transfer.
Show possible values
Show possible values
-
pending— in flight. -
submitted— sent to the ACH network. When the Federal Reserve settles the transfer, the status stayssubmittedandsettled_atis populated. -
canceled— we canceled the transfer after holding it for manual review. -
rejected— the ACH network rejected the transfer. -
returned— the transfer was returned.
string
The statement descriptor shown to the counterparty.
string | null
The settled transaction, once the transfer posts.
object | null
object | null
Return details, if the transfer was returned.
Show Return object
Show Return object
string
The three-character ACH return reason code.
Show ACH return reason codes
Show ACH return reason codes
| Code | Description |
|---|---|
R01 | Insufficient Funds |
R02 | Account Closed |
R03 | No Account on File |
R04 | Invalid Account Number Structure |
R05 | Unauthorized Debit to Consumer Account Using Corporate SEC Code |
R06 | Returned per ODFI’s Request |
R07 | Authorization Revoked by Customer |
R08 | Payment Stopped |
R09 | Uncollected Funds |
R10 | Customer Advises Unauthorized, Improper, Ineligible, or Incomplete |
R11 | Customer Advises Entry Not in Accordance with Terms of Authorization |
R12 | Account Sold to Another DFI |
R13 | Invalid ACH Routing Number |
R14 | Representative Payee Deceased or Unable to Continue in That Capacity |
R15 | Beneficiary or Account Holder Deceased |
R16 | Account Frozen or Entry Returned per OFAC Instruction |
R17 | File Record Edit Criteria |
R18 | Improper Effective Entry Date |
R19 | Amount Field Error |
R20 | Non-Transaction Account |
R21 | Invalid Company Identification |
R22 | Invalid Individual Identification Number |
R23 | Credit Entry Refused by Receiver |
R24 | Duplicate Entry |
R25 | Addenda Error |
R26 | Mandatory Field Error |
R27 | Trace Number Error |
R28 | Routing Number Check Digit Error |
R29 | Corporate Customer Advises Not Authorized |
R30 | RDFI Not Participant in Check Truncation Program |
R31 | Permissible Return Entry |
R32 | RDFI Non-Settlement |
R33 | Return of XCK Entry |
R34 | Limited Participation DFI |
R35 | Return of Improper Debit Entry |
R36 | Return of Improper Credit Entry |
R37 | Source Document Presented for Payment |
R38 | Stop Payment on Source Document |
R39 | Improper Source Document or Source Document Presented |
R40 | Return of ENR Entry |
R41 | Invalid Transaction Code |
R42 | Routing Number / Account Number Mismatch |
R43 | Invalid DFI Account Number |
R44 | Invalid Individual Identifier |
R45 | Invalid Individual Name |
R46 | Invalid Representative Payee Indicator |
R47 | Duplicate Enrollment |
R50 | State Law Affecting RCK Acceptance |
R51 | Item is Ineligible, Notice Not Provided |
R52 | Stop Payment on Item |
R53 | Item and ACH Entry Presented for Payment |
R61 | Misrouted Return |
R62 | Incorrect Trace Number |
R63 | Incorrect Dollar Amount |
R64 | Incorrect Individual Identification |
R65 | Incorrect Transaction Code |
R66 | Incorrect Company Identification |
R67 | Duplicate Return |
R68 | Untimely Return |
R69 | Multiple Errors |
R70 | Permissible Return Entry Not Accepted / Notice Not Provided |
R71 | Misrouted Dishonored Return |
R72 | Untimely Dishonored Return |
R73 | Timely Original Return |
R74 | Corrected Return |
R75 | Return Not a Duplicate |
R76 | No Errors Found |
R77 | Non-Acceptance of R62 Dishonored Return |
R78 | Non-Acceptance of R68 Dishonored Return |
R79 | Incorrect Data in Return Entry |
R80 | IAT Entry |
R81 | Non-Participant in IAT Program |
R82 | Invalid Foreign Receiving DFI Identification |
R83 | Foreign Receiving DFI Unable to Settle |
R84 | Entry Not Processed by Gateway |
R85 | Incorrectly Coded Outbound International Payment |
string | null
The transaction created when the transfer was returned.
boolean
Whether more ACH transfers exist after this page.
string | null
Pass this value as
cursor on the next request to fetch the following page.
null when this is the last page.{
"data": [
{
"id": "ach_transfer_Lk7nQx4mVp9bRt3d",
"account_id": "account_Rv4nBt8xKw2pMh6s",
"external_account_id": "external_account_Bx5nTm8hKw3pVd7c",
"amount": 150000,
"status": "submitted",
"statement_descriptor": "Acme payroll",
"transaction_id": "transaction_Fh3mPq7xRv2nKt8d",
"settled_at": "2026-03-17T14:30:00Z",
"submission": {
"submitted_at": "2026-03-15T14:30:00Z",
"expected_funds_settlement_at": "2026-03-17T14:30:00Z"
},
"return": null
},
{
"id": "ach_transfer_Qd8mKv2pRt5nBh9c",
"account_id": "account_Rv4nBt8xKw2pMh6s",
"external_account_id": "external_account_Tm6bXn9hRw3pFk7c",
"amount": 120000,
"status": "returned",
"statement_descriptor": "Lab services",
"transaction_id": "transaction_Gt4nRs8yWq3pLm6d",
"settled_at": "2026-03-11T14:30:00Z",
"submission": {
"submitted_at": "2026-03-09T14:30:00Z",
"expected_funds_settlement_at": "2026-03-11T14:30:00Z"
},
"return": {
"raw_return_reason_code": "R02",
"return_transaction_id": "transaction_Wm9nVx4tRp6bKd2c"
}
}
],
"has_next": false,
"cursor": null
}