Prerequisites
Complete these once per customer before running the flow below. They are not part of the numbered steps.
PREOnboard the senderPOST
/api/FE/NewClient

Create the sender with KYC details. An Active account status means the sender can fund.

Request Body Parameters — enter values to build the request
FieldTypeRequiredDescriptionValue
firstNamestringREQUIREDClient's legal first name.
lastNamestringREQUIREDClient's legal last name.
addressstringREQUIREDStreet address.
citystringREQUIREDCity.
statestringREQUIREDState code.
zipstringREQUIREDZIP code.
taxIDstringREQUIREDSSN (or EIN for business accounts).
dobstring (date)REQUIREDDate of birth (YYYY-MM-DD).
clientIDstringREQUIREDYour external identifier for this client.
emailstringREQUIREDEmail address (validated).
curl --request POST \ --url 'https://FQDN/api/FE/NewClient' \ --header 'Authorization: Bearer <SHORT_TERM_TOKEN>' \ --header 'X-OTP: <X_OTP>' \ --header 'Content-Type: application/json' \ --data '{ "firstName": "string", "lastName": "string", "taxID": "string", "clientID": "sender-001", "email": "sender@example.com" }'
const options = { method: 'POST', headers: { 'Authorization': 'Bearer <SHORT_TERM_TOKEN>', 'X-OTP': '<X_OTP>', 'Content-Type': 'application/json' }, body: JSON.stringify({ "firstName": "string", "lastName": "string", "taxID": "string", "clientID": "sender-001", "email": "sender@example.com" }) }; fetch('https://FQDN/api/FE/NewClient', options) .then(r => r.json()) .then(console.log) .catch(console.error);
import requests url = "https://FQDN/api/FE/NewClient" headers = { "Authorization": "Bearer <SHORT_TERM_TOKEN>", "X-OTP": "<X_OTP>", "Content-Type": "application/json" } payload = { "firstName": "string", "lastName": "string", "taxID": "string", "clientID": "sender-001", "email": "sender@example.com" } resp = requests.post(url, headers=headers, json=payload) print(resp.json())
{ "clientID": "sender-001", "accountStatus": "Active" }
clientID
Your unique sender identifier, used on every later call.
accountStatus
Active means KYC passed.
Show full interaction diagram
Sender AppRAMFi (Reliant)Recipient1Fund in USDcall POST /AddClientFundsCredit USD balancefunds clear in about 2 business days2Read the campaigncall GET /Disbursement/Campaign3Add the recipientcall POST /Disbursement/ConsumersEmail delivery linkReliant emails the recipientChoose deliveryrecipient confirms cross-border payoutDeliver fiatReliant handles FX and local delivery4List the recipientscall GET /Disbursement/Consumers

Fiat remittance sequence. The sender side is standard onboarding and ACH funding; delivery rides the Cross Border disbursement rail.

Your application orchestrates; RAMFi performs. Your app issues the requests; Reliant performs KYC, clears funds, emails the recipient, and executes the cross-border payout.
Steps
1Fund the sender in USDPOST
/api/FE/AddClientFunds

Draft the remittance amount from the sender's linked bank (open banking) or pull from a card with PullFromCard. Funds are pending about 2 business days before they can be disbursed.

Request Body Parameters — enter values to build the request
FieldTypeRequiredDescriptionValue
clientIDstringREQUIREDThe client to fund.
amountnumberREQUIREDUSD amount to draft via ACH.
transactionDatestring (date)optionalDate to initiate the ACH draft (YYYY-MM-DD).
externalReferencestringREQUIREDYour unique reconciliation key.
curl --request POST \ --url 'https://FQDN/api/FE/AddClientFunds' \ --header 'Authorization: Bearer <SHORT_TERM_TOKEN>' \ --header 'X-OTP: <X_OTP>' \ --header 'Content-Type: application/json' \ --data '{ "clientID": "sender-001", "amount": 500.00, "transactionDate": "2026-01-15", "externalReference": "remit-fund-01" }'
const options = { method: 'POST', headers: { 'Authorization': 'Bearer <SHORT_TERM_TOKEN>', 'X-OTP': '<X_OTP>', 'Content-Type': 'application/json' }, body: JSON.stringify({ "clientID": "sender-001", "amount": 500.00, "transactionDate": "2026-01-15", "externalReference": "remit-fund-01" }) }; fetch('https://FQDN/api/FE/AddClientFunds', options) .then(r => r.json()) .then(console.log) .catch(console.error);
import requests url = "https://FQDN/api/FE/AddClientFunds" headers = { "Authorization": "Bearer <SHORT_TERM_TOKEN>", "X-OTP": "<X_OTP>", "Content-Type": "application/json" } payload = { "clientID": "sender-001", "amount": 500.00, "transactionDate": "2026-01-15", "externalReference": "remit-fund-01" } resp = requests.post(url, headers=headers, json=payload) print(resp.json())
1101
amount
USD amount being sent.
externalReference
Unique reference for reconciliation.
2Read the cross-border campaignGET
/api/Disbursement/Campaign

Campaigns are configured by Reliant administrators, so the API is read-only for campaigns. Read the pre-configured cross-border campaign to get its campaignGuid and confirm the international-transfer (Cross Border) rail and its fee. Pass payeeId to fetch a single campaign.

Query Parameters — enter values to build the request
FieldTypeRequiredDescriptionValue
payeeIdintegeroptionalFilter to a single campaign by payee ID. When omitted, all campaigns for the authenticated company are returned.
curl --request GET \ --url 'https://FQDN/api/Disbursement/Campaign' \ --header 'Authorization: Bearer <SHORT_TERM_TOKEN>' \ --header 'X-OTP: <X_OTP>'
const options = { method: 'GET', headers: { 'Authorization': 'Bearer <SHORT_TERM_TOKEN>', 'X-OTP': '<X_OTP>' } }; fetch('https://FQDN/api/Disbursement/Campaign', options) .then(r => r.json()) .then(console.log) .catch(console.error);
import requests url = "https://FQDN/api/Disbursement/Campaign" headers = { "Authorization": "Bearer <SHORT_TERM_TOKEN>", "X-OTP": "<X_OTP>" } resp = requests.get(url, headers=headers) print(resp.json())
{ "resultModel": [ { "campaignGuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "payeeId": 1024, "disbursementAmount": 500.00, "numberOfBeneficiaries": 1, "internationalTransfer": true, "internationalTransferFeePct": 1.0, "internationalTransferFlat": 4.00, "destinationCurrency": "USD", "hwInstantTransfer": false } ], "isSuccess": true, "errorMessage": null }
campaignGuid
Identifies the campaign; pass it when adding the recipient.
internationalTransfer
The Cross Border rail; its fee is disclosed to the recipient.
3Add the recipientPOST
/api/Disbursement/Consumers

Provision the recipient into the campaign with their name, email, and amount, and mark their eligible rails. Reliant emails them a secure link to confirm delivery; FX and local payout are handled by Reliant. The response reports success per recipient.

Request Body Parameters — enter values to build the request
FieldTypeRequiredDescriptionValue
campaignGuidstring (UUID)REQUIREDThe campaign to add the payees to (from Get Campaign).
consumersarray<Consumer>REQUIREDOne or more payees to provision — see the Consumer fields below.see fields below
consumers[].firstNamestringREQUIREDPayee first name.
consumers[].lastNamestringREQUIREDPayee last name.
consumers[].emailstringREQUIREDWhere Reliant sends the payout-method selection link.
consumers[].amountnumber (decimal)REQUIREDGross payout amount for this payee.
consumers[].middleInitialstringoptionalOptional contact details.
consumers[].phonestringoptionalOptional contact details.
consumers[].streetAddress1stringoptionalMailing address (required for check-by-mail).
consumers[].streetAddress2stringoptionalMailing address (required for check-by-mail).
consumers[].citystringoptionalMailing address (required for check-by-mail).
consumers[].statestringoptionalMailing address (required for check-by-mail).
consumers[].zipstringoptionalMailing address (required for check-by-mail).
consumers[].taxIdstringoptionalTax identifier, where required for reporting.
consumers[].miscellaneousstringoptionalFree-form reference on the payee.
consumers[].achbooleanoptionalEligible payout rails to offer this payee.
consumers[].checkMailbooleanoptionalEligible payout rails to offer this payee.
consumers[].prepaidCardbooleanoptionalEligible payout rails to offer this payee.
consumers[].routingNumberstringoptionalBank details; apply when ach is enabled.
consumers[].accountNumberstringoptionalBank details; apply when ach is enabled.
curl --request POST \ --url 'https://FQDN/api/Disbursement/Consumers' \ --header 'Authorization: Bearer <SHORT_TERM_TOKEN>' \ --header 'X-OTP: <X_OTP>' \ --header 'Content-Type: application/json' \ --data '{ "campaignGuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "consumers": [ { "firstName": "Maria", "lastName": "Santos", "email": "maria@example.com", "amount": 500.00, "ach": true } ] }'
const options = { method: 'POST', headers: { 'Authorization': 'Bearer <SHORT_TERM_TOKEN>', 'X-OTP': '<X_OTP>', 'Content-Type': 'application/json' }, body: JSON.stringify({ "campaignGuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "consumers": [ { "firstName": "Maria", "lastName": "Santos", "email": "maria@example.com", "amount": 500.00, "ach": true } ] }) }; fetch('https://FQDN/api/Disbursement/Consumers', options) .then(r => r.json()) .then(console.log) .catch(console.error);
import requests url = "https://FQDN/api/Disbursement/Consumers" headers = { "Authorization": "Bearer <SHORT_TERM_TOKEN>", "X-OTP": "<X_OTP>", "Content-Type": "application/json" } payload = { "campaignGuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "consumers": [ { "firstName": "Maria", "lastName": "Santos", "email": "maria@example.com", "amount": 500.00, "ach": True } ] } resp = requests.post(url, headers=headers, json=payload) print(resp.json())
{ "resultModel": { "isSuccess": true, "results": [ { "isSuccess": true, "errorMessages": [], "response": { "consumerID": 90231, "email": "maria@example.com", "firstName": "Maria", "lastName": "Santos" } } ] }, "isSuccess": true, "errorMessage": null }
campaignGuid
From step 3; the campaign the recipient is added to.
email
Where Reliant sends the delivery link.
results[]
Per-recipient outcome — a batch can partially succeed.
4List the recipientsGET
/api/Disbursement/Consumers

List the campaign's recipients to confirm who is enrolled. Filter by campaignGuid (or consumerId / email). This returns recipient profiles; a payout-status field is not part of this response.

Query Parameters — enter values to build the request
FieldTypeRequiredDescriptionValue
campaignGuidstring (UUID)optionalScope results to a single campaign.
consumerIdintegeroptionalFetch a single consumer by ID.
emailstringoptionalMatch consumers by email address.
curl --request GET \ --url 'https://FQDN/api/Disbursement/Consumers?campaignGuid=3fa85f64-5717-4562-b3fc-2c963f66afa6' \ --header 'Authorization: Bearer <SHORT_TERM_TOKEN>' \ --header 'X-OTP: <X_OTP>'
const options = { method: 'GET', headers: { 'Authorization': 'Bearer <SHORT_TERM_TOKEN>', 'X-OTP': '<X_OTP>' } }; fetch('https://FQDN/api/Disbursement/Consumers?campaignGuid=3fa85f64-5717-4562-b3fc-2c963f66afa6', options) .then(r => r.json()) .then(console.log) .catch(console.error);
import requests url = "https://FQDN/api/Disbursement/Consumers" params = { "campaignGuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6" } headers = { "Authorization": "Bearer <SHORT_TERM_TOKEN>", "X-OTP": "<X_OTP>" } resp = requests.get(url, headers=headers, params=params) print(resp.json())
{ "resultModel": [ { "userId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "clientfname": "Maria", "clientlname": "Santos", "vendoraccountnumber": "string", "vendorid": 42, "savingsBalance": 0.00, "dscid": 1024 } ], "isSuccess": true, "errorMessage": null }
campaignGuid
Filter to this campaign's recipients (or use consumerId / email).
dscid
The payeeId you can pass to Get Campaign.
Corridors, FX, and availability. Cross-border fiat delivery rides the Disbursements CrossBorder rail. Supported corridors, FX treatment, and delivery timing are commercial details to confirm with RAMFi; this recipe documents the API mechanics.
RAMFi Developer Documentation · Version 1.1