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

Your app sends the customer's details; RAMFi runs KYC, opens the account, and returns a client record with Active status when verification passes.

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": "player-id", "email": "user@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": "player-id", "email": "user@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": "player-id", "email": "user@example.com" } resp = requests.post(url, headers=headers, json=payload) print(resp.json())
{ "id": "string", "clientID": "player-id", "accountStatus": "Active", "email": "user@example.com" }
firstName / lastName
Customer's legal name, used for KYC.
taxID
SSN / tax identifier for identity verification.
clientID
Your unique identifier for this customer, used on every later call.
email
Customer contact email.
accountStatus
Active means the client is verified and can transact.
  • PlayerStore card / link bank
    player provides a card on file / links a bank (Bank SDK)
    Reference →
  • RAMFiTokenize & store
    RAMFi returns cardId / saves bank
  • 1
    Game AppTake deposit
    call PullFromCard or AddClientFunds
    Reference →
  • RAMFiCredit player balance
    RAMFi debits card / drafts bank
  • 2
    Game AppPay out winnings
    call PushToCard or WithdrawClientFunds
    Reference →
  • RAMFiDisburse to player
    RAMFi pushes funds out
  • PlayerPlayer paid
    funds on card / in bank
Show full interaction diagram
Game AppRAMFiPlayerStore card / link bankplayer uses Card Capture or Bank SDKTokenize & storeRAMFi returns cardId / saves bank1Take depositcall PullFromCard or AddClientFundsCredit player balanceRAMFi debits card / drafts bank2Pay out winningscall PushToCard or WithdrawClientFundsDisburse to playerRAMFi pushes funds outPlayer paidfunds on card / in bank

Player wallet lifecycle. App-lane boxes are API calls; RAMFi tokenizes, debits, credits, and disburses. Card rails are instant; ACH is the lower-cost alternative.

Your application orchestrates; RAMFi performs. Every call below runs against RAMFi. RAMFi performs KYC, moves the money, AML-screens addresses, and settles. Your app issues the requests; it never performs KYC or holds funds or keys itself.
Steps
1Take the deposit (instant)POST
/api/FE/Card/PullFromCard

Pull a deposit from the player's card on file and credit the player's balance instantly.

Request Body Parameters — enter values to build the request
FieldTypeRequiredDescriptionValue
clientIDstringREQUIREDThe RAMFi clientID of the end user whose account will be credited.
cardIdstringREQUIREDThe tokenized card ID returned from the Card Capture SDK or GetCardOnFile. Never pass raw card numbers.
amountnumberREQUIREDTransaction amount.
externalReferencestringREQUIREDUnique transaction ID from your system, used for reconciliation. Character limit not yet confirmed.
currencystringoptionalISO 4217 currency code.
memostringoptionalOptional descriptor.
curl --request POST \ --url 'https://FQDN/api/FE/Card/PullFromCard' \ --header 'Authorization: Bearer <SHORT_TERM_TOKEN>' \ --header 'X-OTP: <X_OTP>' \ --header 'Content-Type: application/json' \ --data '{ "clientID": "player-id", "cardId": "card-token", "amount": 50.00, "externalReference": "dep-001" }'
const options = { method: 'POST', headers: { 'Authorization': 'Bearer <SHORT_TERM_TOKEN>', 'X-OTP': '<X_OTP>', 'Content-Type': 'application/json' }, body: JSON.stringify({ "clientID": "player-id", "cardId": "card-token", "amount": 50.00, "externalReference": "dep-001" }) }; fetch('https://FQDN/api/FE/Card/PullFromCard', options) .then(r => r.json()) .then(console.log) .catch(console.error);
import requests url = "https://FQDN/api/FE/Card/PullFromCard" headers = { "Authorization": "Bearer <SHORT_TERM_TOKEN>", "X-OTP": "<X_OTP>", "Content-Type": "application/json" } payload = { "clientID": "player-id", "cardId": "card-token", "amount": 50.00, "externalReference": "dep-001" } resp = requests.post(url, headers=headers, json=payload) print(resp.json())
{ "isSuccess": true, "result": "tx-7001", "errorMessage": null }
cardId
Tokenized cardId (retrieve via GetCardOnFile).
amount
Deposit amount.
externalReference
Unique reference.
ALT(Alternative) Deposit via ACHPOST
/api/FE/AddClientFunds

For lower-cost, non-instant funding, draft the player's linked bank (open banking) instead.

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": "player-id", "amount": 50.00, "transactionDate": "2026-01-15", "externalReference": "dep-002" }'
const options = { method: 'POST', headers: { 'Authorization': 'Bearer <SHORT_TERM_TOKEN>', 'X-OTP': '<X_OTP>', 'Content-Type': 'application/json' }, body: JSON.stringify({ "clientID": "player-id", "amount": 50.00, "transactionDate": "2026-01-15", "externalReference": "dep-002" }) }; 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": "player-id", "amount": 50.00, "transactionDate": "2026-01-15", "externalReference": "dep-002" } resp = requests.post(url, headers=headers, json=payload) print(resp.json())
6001
amount
Deposit amount.
transactionDate
ACH draft date.
2Pay out winnings (instant)POST
/api/FE/Card/PushToCard

Push winnings to the player's tokenized card.

Request Body Parameters — enter values to build the request
FieldTypeRequiredDescriptionValue
clientIDstringREQUIREDThe RAMFi clientID of the end user whose card will receive funds.
cardIdstringREQUIREDThe tokenized card ID from the Card Capture SDK.
amountnumberREQUIREDAmount to send.
externalReferencestringREQUIREDUnique transaction ID from your system, used for reconciliation. Character limit not yet confirmed.
currencystringoptionalISO 4217 currency code.
memostringoptionalOptional descriptor.
curl --request POST \ --url 'https://FQDN/api/FE/Card/PushToCard' \ --header 'Authorization: Bearer <SHORT_TERM_TOKEN>' \ --header 'X-OTP: <X_OTP>' \ --header 'Content-Type: application/json' \ --data '{ "clientID": "player-id", "cardId": "card-token", "amount": 120.00, "externalReference": "pay-001" }'
const options = { method: 'POST', headers: { 'Authorization': 'Bearer <SHORT_TERM_TOKEN>', 'X-OTP': '<X_OTP>', 'Content-Type': 'application/json' }, body: JSON.stringify({ "clientID": "player-id", "cardId": "card-token", "amount": 120.00, "externalReference": "pay-001" }) }; fetch('https://FQDN/api/FE/Card/PushToCard', options) .then(r => r.json()) .then(console.log) .catch(console.error);
import requests url = "https://FQDN/api/FE/Card/PushToCard" headers = { "Authorization": "Bearer <SHORT_TERM_TOKEN>", "X-OTP": "<X_OTP>", "Content-Type": "application/json" } payload = { "clientID": "player-id", "cardId": "card-token", "amount": 120.00, "externalReference": "pay-001" } resp = requests.post(url, headers=headers, json=payload) print(resp.json())
{ "isSuccess": true, "result": "tx-7050", "errorMessage": null }
cardId
The player's stored card token.
amount
Payout amount.
externalReference
Unique reference.
EXTRARefund a depositPOST
/api/FE/Card/PushToCard

Return funds to the player over the card rail (or use WithdrawClientFunds for ACH).

Request Body Parameters — enter values to build the request
FieldTypeRequiredDescriptionValue
clientIDstringREQUIREDThe RAMFi clientID of the end user whose card will receive funds.
cardIdstringREQUIREDThe tokenized card ID from the Card Capture SDK.
amountnumberREQUIREDAmount to send.
externalReferencestringREQUIREDUnique transaction ID from your system, used for reconciliation. Character limit not yet confirmed.
currencystringoptionalISO 4217 currency code.
memostringoptionalOptional descriptor.
curl --request POST \ --url 'https://FQDN/api/FE/Card/PushToCard' \ --header 'Authorization: Bearer <SHORT_TERM_TOKEN>' \ --header 'X-OTP: <X_OTP>' \ --header 'Content-Type: application/json' \ --data '{ "clientID": "player-id", "cardId": "card-token", "amount": 50.00, "externalReference": "ref-001" }'
const options = { method: 'POST', headers: { 'Authorization': 'Bearer <SHORT_TERM_TOKEN>', 'X-OTP': '<X_OTP>', 'Content-Type': 'application/json' }, body: JSON.stringify({ "clientID": "player-id", "cardId": "card-token", "amount": 50.00, "externalReference": "ref-001" }) }; fetch('https://FQDN/api/FE/Card/PushToCard', options) .then(r => r.json()) .then(console.log) .catch(console.error);
import requests url = "https://FQDN/api/FE/Card/PushToCard" headers = { "Authorization": "Bearer <SHORT_TERM_TOKEN>", "X-OTP": "<X_OTP>", "Content-Type": "application/json" } payload = { "clientID": "player-id", "cardId": "card-token", "amount": 50.00, "externalReference": "ref-001" } resp = requests.post(url, headers=headers, json=payload) print(resp.json())
{ "isSuccess": true, "result": "tx-7051", "errorMessage": null }
amount
Refund amount.
externalReference
Unique reference.
Same composition as debt settlement: money in → balance held → money out. Swap rails to fit the product, cards for instant UX, ACH for lower cost. Store an externalReference on every movement for reconciliation via GET /Reporting/Transactions.
Cards are referenced by a tokenized cardId. PullFromCard and PushToCard operate on a tokenized cardId (never a raw PAN), retrieved via GetCardOnFile; raw card numbers never reach your app. Card endpoints are not yet enabled, confirm availability with RAMFi.
RAMFi Developer Documentation · Version 1.1