Send Bank Payments
This use case demonstrates how to send a bank payment from your FV account to a beneficiary using Domestic ACH (USD).
The same flow can be used for other fiat payment types (e.g., Wire). Only the Payment_Type and related banking details need to be adjusted based on the payment method.
🔄 Flow Overview
Create Beneficiary → Add Payment Instrument → Upload File → Initiate Payment → Track Transaction
📊 Data Flow (IDs Across Steps)
BeneficiaryID → PaymentInstrumentID → FileId → TransactionID
✅ Prerequisites
- A valid
SessionToken - Include the following header in all requests:
X-AUTH-TOKEN: {{session_token}}
- (Optional but required for some payments) Upload a supporting document using the Files API to obtain a
FileId
Create Beneficiary
async function createBeneficiary() {
try {
const response = await axios.post(
`${baseUrl}/beneficiary/create`,
[
{ "field": "Beneficiary_Type", "value": "individual" },
{ "field": "Beneficiary_Email", "value": "john.doe@example.com" },
{ "field": "Beneficiary_Address", "value": "123 Main Street" },
{ "field": "Beneficiary_City", "value": "New York" },
{ "field": "Beneficiary_Postal_Code", "value": "10001" },
{ "field": "Beneficiary_Country", "value": "US" },
…Response:
{
"ResponseData": {
"BeneficiaryId": "4650983997967871956",
"message": "Please allow 10 minutes for the beneficiary to turn Active. Once the beneficiary status is Active, You can create payment instruments."
}
}
Add Payment Instrument (ACH Bank Account)
async function createACHInstrument() {
try {
const response = await axios.post(
`${baseUrl}/payment-instrument/create`,
[
{
"field": "Payment_Type",
"value": "BUS_USD_Account.Business_ACH"
},
{
"field": "BeneficiaryId",
…Response:
{
ResponseCode: 200,
ResponseMessage: 'Success',
ResponseData: { PaymentInstrumentID: '-6477410681264623860' }
}
Upload Supporting Document
Use this endpoint to upload supporting documents (e.g., invoices) that can be attached to payments or other workflows.
const axios = require('axios');
const fs = require('fs');
const baseUrl = "https://sandbox.merchant.fvbank.us/v2";
const sessionToken = "your_session_token_here";
// 🔁 Update file path accordingly
const filePath = "/Users/rishav/Documents/Sample/Form_6_English.pdf";
async function uploadFile() {
try {
const response = await axios.post(
`${baseUrl}/files/upload?customField=Payment_Invoice&fileName=Ducket.pdf`,
fs.createReadStream(filePath),
…📌 Note
Refer to the Files Upload endpoint in the API Reference section to better understand:
- Supported file types
- Required query parameters (
customField,fileName) - How uploaded files are used across flows (e.g., attaching documents to payments)
{
"ResponseCode": 200,
"ResponseMessage": "Success",
"ResponseData": {
"ID": "-4004934485838221358"
}
}
Initiate Payment
💳 Create Bank Payment (Node.js)
Use this endpoint to initiate a bank payment (e.g., ACH/Wire) using a previously created payment instrument.
const axios = require('axios');
const baseUrl = "https://sandbox.merchant.fvbank.us/v2";
const sessionToken = "your_session_token_here";
async function createBankPayment() {
try {
const response = await axios.post(
`${baseUrl}/payment/bank`,
{
"BeneficiaryPaymentInstrumentID": "-6391842288344584436",
"Purpose": "Loan_Payments",
"Currency": "USD",
…📌 Note
BeneficiaryPaymentInstrumentIDis obtained from the Create Payment Instrument stepSupportingDocumentis the File ID received after uploading a file via the Files Upload endpoint- Ensure all required compliance fields (e.g., Purpose, Description) are provided correctly
Response:
{
"ResponseCode": 200,
"ResponseMessage": "Success",
"ResponseData": {
"TransactionNumber": "FV000007938"
}
}
Track Transaction Status
Use this endpoint to fetch detailed information about a specific transaction using the TransactionNumber.
const axios = require('axios');
const baseUrl = "https://sandbox.merchant.fvbank.us/v2";
const sessionToken = "your_session_token_here";
// 🔁 Replace with your actual Transaction Number
const transactionNumber = "FV000462103";
async function getTransactionDetails() {
try {
const response = await axios.get(
`${baseUrl}/transactions/details/${transactionNumber}`,
{
headers: {
…📌 Note
-
TransactionNumberis obtained from:-
Payment creation response
-
Transaction listing APIs
-
Webhook payloads
-
-
Use this endpoint to:
-
Track transaction status
-
View complete transaction details
-
Reconcile payments in your system
-
⚠️ Common Errors
- Missing or invalid
SessionToken - Incorrect
BeneficiaryIDorPaymentInstrumentID - Missing
SupportingDocumentwhen required - Invalid bank details (routing/account number)
- Expired session without refresh handling
📌 Summary
BeneficiaryID → PaymentInstrumentID → FileId → TransactionID
This flow can be reused for all fiat payment types by adjusting the Payment_Type and required banking details.