Get outbound ACH transfer
curl --request GET \
--url https://api.getlemma.com/v0/ach-transfer/{ach_transfer_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.getlemma.com/v0/ach-transfer/{ach_transfer_id}"
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/{ach_transfer_id}', 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/{ach_transfer_id}",
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/{ach_transfer_id}"
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/{ach_transfer_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getlemma.com/v0/ach-transfer/{ach_transfer_id}")
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{
"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_Lk7nQx4mVp9bRt3d",
"account_id": "account_Rv4nBt8xKw2pMh6s",
"external_account_id": "external_account_Bx5nTm8hKw3pVd7c",
"amount": 150000,
"status": "returned",
"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": {
"raw_return_reason_code": "R02",
"return_transaction_id": "transaction_Wm9nVx4tRp6bKd2c"
}
}
{
"statusCode": 404,
"error": "Not Found",
"message": "ACH transfer not found"
}
Outbound ACH transfers
Get outbound ACH transfer
Retrieve a single outbound ACH transfer by its ID.
GET
/
v0
/
ach-transfer
/
{ach_transfer_id}
Get outbound ACH transfer
curl --request GET \
--url https://api.getlemma.com/v0/ach-transfer/{ach_transfer_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.getlemma.com/v0/ach-transfer/{ach_transfer_id}"
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/{ach_transfer_id}', 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/{ach_transfer_id}",
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/{ach_transfer_id}"
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/{ach_transfer_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getlemma.com/v0/ach-transfer/{ach_transfer_id}")
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{
"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_Lk7nQx4mVp9bRt3d",
"account_id": "account_Rv4nBt8xKw2pMh6s",
"external_account_id": "external_account_Bx5nTm8hKw3pVd7c",
"amount": 150000,
"status": "returned",
"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": {
"raw_return_reason_code": "R02",
"return_transaction_id": "transaction_Wm9nVx4tRp6bKd2c"
}
}
{
"statusCode": 404,
"error": "Not Found",
"message": "ACH transfer not found"
}
Returns a single outbound ACH transfer object. These are ACH transfers initiated inside Lemma. Use the Get inbound ACH transfer endpoint for ACHs that arrive from outside. To enumerate transfers rather than fetch one, see List outbound ACH transfers.
Path parameters
string
required
The unique identifier of the ACH transfer to retrieve.
Response
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.
{
"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_Lk7nQx4mVp9bRt3d",
"account_id": "account_Rv4nBt8xKw2pMh6s",
"external_account_id": "external_account_Bx5nTm8hKw3pVd7c",
"amount": 150000,
"status": "returned",
"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": {
"raw_return_reason_code": "R02",
"return_transaction_id": "transaction_Wm9nVx4tRp6bKd2c"
}
}
{
"statusCode": 404,
"error": "Not Found",
"message": "ACH transfer not found"
}