curl --request PATCH \
--url https://api-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"account_holder_name": "John Doe",
"bank_account_number": "1234567890",
"routing_number": "021000021",
"account_type": "checking"
}
'import requests
url = "https://api-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id}"
payload = {
"account_holder_name": "John Doe",
"bank_account_number": "1234567890",
"routing_number": "021000021",
"account_type": "checking"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
account_holder_name: 'John Doe',
bank_account_number: '1234567890',
routing_number: '021000021',
account_type: 'checking'
})
};
fetch('https://api-sandbox.finogates.com/v1/platform/bank/update/{bank_account_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-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'account_holder_name' => 'John Doe',
'bank_account_number' => '1234567890',
'routing_number' => '021000021',
'account_type' => 'checking'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id}"
payload := strings.NewReader("{\n \"account_holder_name\": \"John Doe\",\n \"bank_account_number\": \"1234567890\",\n \"routing_number\": \"021000021\",\n \"account_type\": \"checking\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"account_holder_name\": \"John Doe\",\n \"bank_account_number\": \"1234567890\",\n \"routing_number\": \"021000021\",\n \"account_type\": \"checking\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_holder_name\": \"John Doe\",\n \"bank_account_number\": \"1234567890\",\n \"routing_number\": \"021000021\",\n \"account_type\": \"checking\"\n}"
response = http.request(request)
puts response.read_body{
"status_code": 200,
"data": {
"payment_method_id": "e5f6a7b8-c9d0-1234-5678-9abcdef01234",
"user_id": "b3a9b622-cc63-4d3c-aad6-2d8e29e6f9d4",
"method_type": "bank",
"status": "active",
"bank_name": "Example Bank",
"account_mask": "****7890",
"routing_last4": "0021",
"account_type": "checking",
"account_holder_name": "John Doe",
"rail_code": "ach",
"created_at": "2026-04-01T10:30:00Z"
},
"query_generated_time": 1712847600000
}Edit a Manually Added Bank Account
Correct the details of a bank account that was added with its routing and account number, before it has been verified. Send only the fields you want to change — anything you leave out is kept as it is.
What you can change
account_holder_name— the name on the bank accountbank_account_number— the full bank account numberrouting_number— the bank’s 9-digit routing numberaccount_type— for examplecheckingorsavings
The bank’s name follows the routing number, so it is updated for you when the
routing number changes. New numbers are stored encrypted and only ever shown
masked, exactly as when the bank was added. The bank keeps its
payment_method_id.
When an edit is refused
bank_not_editable— the bank was verified instantly (its details came from the bank itself), was removed, or is not a domestic bank added with its numbers.bank_payment_in_progress— a payment to or from this bank is still in progress; the numbers cannot change under it. Other fields can still be edited.409“Bank account already exists for user” — the new numbers match another bank this user already has.
curl --request PATCH \
--url https://api-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"account_holder_name": "John Doe",
"bank_account_number": "1234567890",
"routing_number": "021000021",
"account_type": "checking"
}
'import requests
url = "https://api-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id}"
payload = {
"account_holder_name": "John Doe",
"bank_account_number": "1234567890",
"routing_number": "021000021",
"account_type": "checking"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
account_holder_name: 'John Doe',
bank_account_number: '1234567890',
routing_number: '021000021',
account_type: 'checking'
})
};
fetch('https://api-sandbox.finogates.com/v1/platform/bank/update/{bank_account_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-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'account_holder_name' => 'John Doe',
'bank_account_number' => '1234567890',
'routing_number' => '021000021',
'account_type' => 'checking'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id}"
payload := strings.NewReader("{\n \"account_holder_name\": \"John Doe\",\n \"bank_account_number\": \"1234567890\",\n \"routing_number\": \"021000021\",\n \"account_type\": \"checking\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"account_holder_name\": \"John Doe\",\n \"bank_account_number\": \"1234567890\",\n \"routing_number\": \"021000021\",\n \"account_type\": \"checking\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.finogates.com/v1/platform/bank/update/{bank_account_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_holder_name\": \"John Doe\",\n \"bank_account_number\": \"1234567890\",\n \"routing_number\": \"021000021\",\n \"account_type\": \"checking\"\n}"
response = http.request(request)
puts response.read_body{
"status_code": 200,
"data": {
"payment_method_id": "e5f6a7b8-c9d0-1234-5678-9abcdef01234",
"user_id": "b3a9b622-cc63-4d3c-aad6-2d8e29e6f9d4",
"method_type": "bank",
"status": "active",
"bank_name": "Example Bank",
"account_mask": "****7890",
"routing_last4": "0021",
"account_type": "checking",
"account_holder_name": "John Doe",
"rail_code": "ach",
"created_at": "2026-04-01T10:30:00Z"
},
"query_generated_time": 1712847600000
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Path Parameters
The unique ID of the manually added bank account to edit.
"e5f6a7b8-c9d0-1234-5678-9abcdef01234"
Body
Correct a bank account added manually, before it is verified.
PATCH semantics: only the fields sent change. bank_name and
nickname are refused for the reason PlatformBankAccountCreate
gives — the bank's name follows the routing number.
Name of the account holder.
1 - 120"John Doe"
Full bank account number.
4 - 34"1234567890"
ACH routing number (9 digits).
9"021000021"
Account type (e.g. checking, savings).
1 - 30"checking"
Response
The updated bank account (sensitive numbers masked).

