curl --request POST \
--url https://eapi.montereyfinancial.com/v1/payment-methods/bank \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"account_id": "01JABCDEF0123456789ABCDEFG",
"account_number": "000123456789",
"account_type": "checking",
"bank_name": "Bank of America",
"name_on_account": "Jane Q. Borrower",
"nickname": "Primary checking",
"routing_number": "121000358",
"set_default": true
}
'import requests
url = "https://eapi.montereyfinancial.com/v1/payment-methods/bank"
payload = {
"account_id": "01JABCDEF0123456789ABCDEFG",
"account_number": "000123456789",
"account_type": "checking",
"bank_name": "Bank of America",
"name_on_account": "Jane Q. Borrower",
"nickname": "Primary checking",
"routing_number": "121000358",
"set_default": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
account_id: '01JABCDEF0123456789ABCDEFG',
account_number: '000123456789',
account_type: 'checking',
bank_name: 'Bank of America',
name_on_account: 'Jane Q. Borrower',
nickname: 'Primary checking',
routing_number: '121000358',
set_default: true
})
};
fetch('https://eapi.montereyfinancial.com/v1/payment-methods/bank', 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://eapi.montereyfinancial.com/v1/payment-methods/bank",
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([
'account_id' => '01JABCDEF0123456789ABCDEFG',
'account_number' => '000123456789',
'account_type' => 'checking',
'bank_name' => 'Bank of America',
'name_on_account' => 'Jane Q. Borrower',
'nickname' => 'Primary checking',
'routing_number' => '121000358',
'set_default' => true
]),
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://eapi.montereyfinancial.com/v1/payment-methods/bank"
payload := strings.NewReader("{\n \"account_id\": \"01JABCDEF0123456789ABCDEFG\",\n \"account_number\": \"000123456789\",\n \"account_type\": \"checking\",\n \"bank_name\": \"Bank of America\",\n \"name_on_account\": \"Jane Q. Borrower\",\n \"nickname\": \"Primary checking\",\n \"routing_number\": \"121000358\",\n \"set_default\": true\n}")
req, _ := http.NewRequest("POST", 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.post("https://eapi.montereyfinancial.com/v1/payment-methods/bank")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": \"01JABCDEF0123456789ABCDEFG\",\n \"account_number\": \"000123456789\",\n \"account_type\": \"checking\",\n \"bank_name\": \"Bank of America\",\n \"name_on_account\": \"Jane Q. Borrower\",\n \"nickname\": \"Primary checking\",\n \"routing_number\": \"121000358\",\n \"set_default\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://eapi.montereyfinancial.com/v1/payment-methods/bank")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_id\": \"01JABCDEF0123456789ABCDEFG\",\n \"account_number\": \"000123456789\",\n \"account_type\": \"checking\",\n \"bank_name\": \"Bank of America\",\n \"name_on_account\": \"Jane Q. Borrower\",\n \"nickname\": \"Primary checking\",\n \"routing_number\": \"121000358\",\n \"set_default\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"party_id": "<string>",
"instrument_type": "<string>",
"is_active": true,
"last_four": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"holder_name": "<string>",
"nickname": "<string>",
"card_brand": "<string>",
"card_exp_month": 123,
"card_exp_year": 123,
"bank_name": "<string>",
"bank_account_type": "<string>",
"wallet_type": "<string>",
"validation_status": "<string>"
}{
"detail": {
"error_code": "<string>"
}
}Add a bank account
Adds an ACH bank account for a borrower on an account and returns the stored payment method. The routing and account numbers are verified with the bank network, then stored encrypted; responses only ever expose the last four digits.
Borrower. Omit party_id to use the account’s primary borrower. When
given, party_id must be an active borrower on the account.
Verification. On success validation_status is validated. If the
verification service is temporarily unavailable, the bank account is still
saved and returned with validation_status: pending_giact: it is stored but
verification is pending. An account the verification service declines is not
saved.
Default. set_default: true makes it the borrower’s default payment
method; a borrower’s first payment method becomes the default regardless.
Errors (detail.error_code):
- 403
insufficient_scope: the token lackspayment_methods:write. - 404
account_not_found: the account isn’t reachable by this token. - 409
duplicate_bank_account: this borrower already has this bank account.detail.existing_payment_method_idnames it when visible to this token. - 422
invalid_routing_number: the routing number fails the ABA checksum. - 422
bank_account_declined: verification declined the bank account; nothing was saved. Do not retry with the same numbers. - 422
party_not_on_account:party_idis not an active borrower on the account. - 422
account_has_no_primary_borrower:party_idwas omitted and the account has no primary borrower. - 422
invalid_bank_account: the bank details could not be accepted. - 503
bank_capture_unavailable: bank-account capture is not enabled.
Request bodies that fail schema validation return the standard 422 detail
list (submitted values are never echoed).
curl --request POST \
--url https://eapi.montereyfinancial.com/v1/payment-methods/bank \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"account_id": "01JABCDEF0123456789ABCDEFG",
"account_number": "000123456789",
"account_type": "checking",
"bank_name": "Bank of America",
"name_on_account": "Jane Q. Borrower",
"nickname": "Primary checking",
"routing_number": "121000358",
"set_default": true
}
'import requests
url = "https://eapi.montereyfinancial.com/v1/payment-methods/bank"
payload = {
"account_id": "01JABCDEF0123456789ABCDEFG",
"account_number": "000123456789",
"account_type": "checking",
"bank_name": "Bank of America",
"name_on_account": "Jane Q. Borrower",
"nickname": "Primary checking",
"routing_number": "121000358",
"set_default": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
account_id: '01JABCDEF0123456789ABCDEFG',
account_number: '000123456789',
account_type: 'checking',
bank_name: 'Bank of America',
name_on_account: 'Jane Q. Borrower',
nickname: 'Primary checking',
routing_number: '121000358',
set_default: true
})
};
fetch('https://eapi.montereyfinancial.com/v1/payment-methods/bank', 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://eapi.montereyfinancial.com/v1/payment-methods/bank",
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([
'account_id' => '01JABCDEF0123456789ABCDEFG',
'account_number' => '000123456789',
'account_type' => 'checking',
'bank_name' => 'Bank of America',
'name_on_account' => 'Jane Q. Borrower',
'nickname' => 'Primary checking',
'routing_number' => '121000358',
'set_default' => true
]),
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://eapi.montereyfinancial.com/v1/payment-methods/bank"
payload := strings.NewReader("{\n \"account_id\": \"01JABCDEF0123456789ABCDEFG\",\n \"account_number\": \"000123456789\",\n \"account_type\": \"checking\",\n \"bank_name\": \"Bank of America\",\n \"name_on_account\": \"Jane Q. Borrower\",\n \"nickname\": \"Primary checking\",\n \"routing_number\": \"121000358\",\n \"set_default\": true\n}")
req, _ := http.NewRequest("POST", 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.post("https://eapi.montereyfinancial.com/v1/payment-methods/bank")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": \"01JABCDEF0123456789ABCDEFG\",\n \"account_number\": \"000123456789\",\n \"account_type\": \"checking\",\n \"bank_name\": \"Bank of America\",\n \"name_on_account\": \"Jane Q. Borrower\",\n \"nickname\": \"Primary checking\",\n \"routing_number\": \"121000358\",\n \"set_default\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://eapi.montereyfinancial.com/v1/payment-methods/bank")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_id\": \"01JABCDEF0123456789ABCDEFG\",\n \"account_number\": \"000123456789\",\n \"account_type\": \"checking\",\n \"bank_name\": \"Bank of America\",\n \"name_on_account\": \"Jane Q. Borrower\",\n \"nickname\": \"Primary checking\",\n \"routing_number\": \"121000358\",\n \"set_default\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"party_id": "<string>",
"instrument_type": "<string>",
"is_active": true,
"last_four": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"holder_name": "<string>",
"nickname": "<string>",
"card_brand": "<string>",
"card_exp_month": 123,
"card_exp_year": 123,
"bank_name": "<string>",
"bank_account_type": "<string>",
"wallet_type": "<string>",
"validation_status": "<string>"
}{
"detail": {
"error_code": "<string>"
}
}Authorizations
Short-lived access token minted by POST /v1/oauth/token.
Body
Add an ACH bank account for a borrower on an account. The routing and account numbers are verified, then stored encrypted; responses only ever expose the last four digits.
String, required. ID of the account the borrower is on. Must be reachable by the calling access token.
1String, required. ABA routing number: exactly 9 digits, and it must pass the ABA checksum.
^[0-9]{9}$String, required. Bank account number: 4 to 17 digits.
^[0-9]{4,17}$String, required. One of checking or savings.
checking, savings String, optional. The borrower who owns the bank account. When omitted, the account's primary borrower is used. When given, it must be an active borrower on the account.
1String, optional, at most 255 characters. Account holder name as it appears at the bank.
255String, optional, at most 255 characters. Bank name for display.
255String, optional, at most 100 characters. Borrower-chosen label for this payment method.
100Boolean, optional, default false. Make this the borrower's default payment method. A borrower's first payment method becomes the default regardless.
Response
Bank account saved. validation_status is validated, or pending_giact when it is saved but verification is pending.
A stored payment instrument (card, bank account, or wallet) belonging to a borrower. Carries display-safe metadata only — never full card or account numbers.
The person (borrower) this payment method belongs to.
Kind of instrument. One of: card, bank_account, wallet.
False once the payment method has been removed. Inactive methods cannot be attached to autopay or payments.
Last four digits of the card or account number.
Name of the card or account holder.
Borrower-chosen label for this payment method.
Card network (e.g. visa, mastercard). Cards only.
Card expiration month (1-12). Cards only.
Card expiration year (four digits). Cards only.
Bank name. Bank accounts only.
Bank account type (e.g. checking, savings). Bank accounts only.
Wallet provider (e.g. apple_pay, google_pay). Wallets only.
Bank-account verification state. validated: the account passed verification. pending_giact: the account is saved but verification could not complete yet and is pending. Null for instruments that are not verified this way.