cURL
curl --request POST \
--url https://api.finosu.com/ach-confirms \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"customerId": "<string>",
"loanId": "<string>",
"paymentId": "<string>",
"settlementDate": "2023-11-07T05:31:56Z"
}
'import requests
url = "https://api.finosu.com/ach-confirms"
payload = {
"customerId": "<string>",
"loanId": "<string>",
"paymentId": "<string>",
"settlementDate": "2023-11-07T05:31:56Z"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customerId: '<string>',
loanId: '<string>',
paymentId: '<string>',
settlementDate: '2023-11-07T05:31:56Z'
})
};
fetch('https://api.finosu.com/ach-confirms', 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.finosu.com/ach-confirms",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'customerId' => '<string>',
'loanId' => '<string>',
'paymentId' => '<string>',
'settlementDate' => '2023-11-07T05:31:56Z'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.finosu.com/ach-confirms"
payload := strings.NewReader("{\n \"customerId\": \"<string>\",\n \"loanId\": \"<string>\",\n \"paymentId\": \"<string>\",\n \"settlementDate\": \"2023-11-07T05:31:56Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.finosu.com/ach-confirms")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customerId\": \"<string>\",\n \"loanId\": \"<string>\",\n \"paymentId\": \"<string>\",\n \"settlementDate\": \"2023-11-07T05:31:56Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finosu.com/ach-confirms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customerId\": \"<string>\",\n \"loanId\": \"<string>\",\n \"paymentId\": \"<string>\",\n \"settlementDate\": \"2023-11-07T05:31:56Z\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Payments
Confirm ACH Settlement
Confirm settlement of an existing ACH payment.
POST
/
ach-confirms
cURL
curl --request POST \
--url https://api.finosu.com/ach-confirms \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"customerId": "<string>",
"loanId": "<string>",
"paymentId": "<string>",
"settlementDate": "2023-11-07T05:31:56Z"
}
'import requests
url = "https://api.finosu.com/ach-confirms"
payload = {
"customerId": "<string>",
"loanId": "<string>",
"paymentId": "<string>",
"settlementDate": "2023-11-07T05:31:56Z"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customerId: '<string>',
loanId: '<string>',
paymentId: '<string>',
settlementDate: '2023-11-07T05:31:56Z'
})
};
fetch('https://api.finosu.com/ach-confirms', 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.finosu.com/ach-confirms",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'customerId' => '<string>',
'loanId' => '<string>',
'paymentId' => '<string>',
'settlementDate' => '2023-11-07T05:31:56Z'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.finosu.com/ach-confirms"
payload := strings.NewReader("{\n \"customerId\": \"<string>\",\n \"loanId\": \"<string>\",\n \"paymentId\": \"<string>\",\n \"settlementDate\": \"2023-11-07T05:31:56Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.finosu.com/ach-confirms")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customerId\": \"<string>\",\n \"loanId\": \"<string>\",\n \"paymentId\": \"<string>\",\n \"settlementDate\": \"2023-11-07T05:31:56Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finosu.com/ach-confirms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customerId\": \"<string>\",\n \"loanId\": \"<string>\",\n \"paymentId\": \"<string>\",\n \"settlementDate\": \"2023-11-07T05:31:56Z\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Request field names
Use camelCase request fields. Legacy snake_case names remain accepted, including within batches. If both names for a field are supplied, the camelCase value takes precedence. Response field names remain unchanged.Overview
This endpoint receives ACH settlement confirmation from external loan management systems (LMS) and marks the corresponding ACH payment as COMPLETED and payment transaction as SUCCESSFUL. Note: For submitting multiple ACH confirmations in a single request, use the batch endpoint.ID Mapping
The endpoint uses reference IDs to locate records:- customerId - Your customer reference ID
- loanId - Your loan reference ID
- paymentId - The payment processor transaction ID
2026-09-30T12:00:00Z.
Optional date/time fields may be omitted or null.
Request Body Fields
Identifiers (Required)
- customerId - Customer reference ID from your LMS
- loanId - Loan reference ID from your LMS
- paymentId - The processor transaction ID for the ACH payment
Settlement Fields
- settlementDate - Date the ACH payment settled
What the Endpoint Does
When you submit ACH settlement confirmation, Finosu:- Locates the records using the external reference IDs
-
Updates AchPayment with:
- Status set to COMPLETED
- Settlement date (if provided)
-
Updates PaymentTransaction with:
- Status set to SUCCESSFUL
Response
The endpoint returns a success response:- success - Boolean indicating success
- message - Success or error message
Example Usage
This endpoint is typically called by external LMS systems when they confirm that an ACH payment has successfully settled at the bank.Error Handling
The endpoint will return appropriate HTTP status codes:- 200 OK - Successfully confirmed ACH settlement
- 422 UNPROCESSABLE CONTENT - ACH payment does not belong to specified loan
- 404 NOT FOUND - Customer, loan, or payment not found with provided IDs
- 409 CONFLICT - Multiple ACH payments found with the same processor transaction ID
- 500 INTERNAL SERVER ERROR - Server error during processing
401; invalid request structure returns 422.Body
application/json
Request schema for ACH settlement confirmation from external LMS.
Maps to the same ID conventions as ACH returns. Use camelCase fields; legacy snake_case aliases are also accepted. If both spellings are supplied, camelCase takes precedence.