Remittances

Pay individuals abroad in local currency — one at a time or thousands at once.

✅ What you can build

Send money to individuals in 30+ countries, paid into their bank account or mobile wallet in local currency. Fund your account once, then pay recipients one at a time or thousands from a single instruction.

📘 Is this you?

  • You operate a remittance app or money transfer service
  • Your customers send money home to family abroad
  • You are a payment provider paying out on behalf of your own customers

How money moves for your business

You keep a funded balance with TransFi. When your customer initiates a transfer, you create a payout and the recipient receives local currency. Because the money legally comes from your customer rather than from you, both the sender and the recipient are registered and verified separately.

Your balance → recipient's local bank or wallet, on your sender's behalf

Flows you'll use

Flow GuideWhy you need it
Instant PayoutsFund each transfer as you make it, straight to the recipient — Flow 3 (fiat → fiat) or Flow 2 (crypto → fiat)
PayoutsPay from a pre-funded balance — Flow 10 (fiat), Flow 12 (crypto)
Add FundsTop up the balance ahead of a payout run — Flow 5 or 6
Who's on Each SideRegister and verify the sender whose money you are moving (PoBo)

→ Every flow number refers to one of the thirteen on the Flow Guides page.

Your integration, end to end

  1. Find out what a sender requiresPOST /v3/senders/mandatory-fields. Requirements vary by country and currency, so fetch them rather than hard-coding
  2. Create the senderPOST /v3/senders/individual
  3. Verify the senderPOST /v3/kyc/standard, then send them to the returned kycUrl
  4. Find out what a recipient requiresPOST /v3/recipients/mandatory-fields
  5. Create the recipient — POST /v3/recipients/individual
  6. Quote the transferGET /v3/exchange-rates for the rate and full fee breakdown
  7. Create the payoutPOST /v3/orders with orderType: "payout"
  8. Handle the webhook — confirm to your customer that the money arrived

Sample call sequence

# 1 — What does a sender in this corridor need?
curl -X POST 'https://sandbox-api.transfi.com/v3/senders/mandatory-fields' \
  -H 'Authorization: Basic YOUR_BASE64_CREDENTIALS' \
  -H 'mid: YOUR_MID' \
  -H 'Content-Type: application/json' \
  -d '{ "type": "individual", "country": "GB", "currencyType": "fiat" }'
# -> returns "inputs": the exact fields to collect, with validation rules

# 2 — Create the sender from those fields
curl -X POST 'https://sandbox-api.transfi.com/v3/senders/individual' \
  -H 'Authorization: Basic YOUR_BASE64_CREDENTIALS' \
  -H 'mid: YOUR_MID' \
  -H 'Content-Type: application/json' \
  -d '{ ...the fields returned by mandatory-fields... }'
# -> { "data": { "userId": "UX-SENDER-ID" } }

# 3 — Verify the sender
curl -X POST 'https://sandbox-api.transfi.com/v3/kyc/standard' \
  -H 'Authorization: Basic YOUR_BASE64_CREDENTIALS' \
  -H 'mid: YOUR_MID' \
  -H 'Content-Type: application/json' \
  -d '{ "userId": "UX-SENDER-ID" }'
# -> { "data": { "kycUrl": "https://..." } }

# 4 — Quote the transfer
curl -X GET 'https://sandbox-api.transfi.com/v3/rates?orderType=payout&fromCurrency=GBP&toCurrency=PHP&amount=200' \
  -H 'Authorization: Basic YOUR_BASE64_CREDENTIALS' \
  -H 'mid: YOUR_MID'

# 5 — Pay the recipient
curl -X POST 'https://sandbox-api.transfi.com/v3/orders' \
  -H 'Authorization: Basic YOUR_BASE64_CREDENTIALS' \
  -H 'mid: YOUR_MID' \
  -H 'Content-Type: application/json' \
  -d '{
    "userId": "UX-RECIPIENT-ID",
    "orderType": "payout",
    "purposeCode": "family_support",
    "partnerId": "remit-3001",
    "source": { "currency": "USDT" },
    "destination": { "currency": "PHP", "amount": "14000",
                     "paymentType": "bank_transfer" }
  }'
📘

A recipient can become a sender If someone you have paid later needs to send money, don't create them again. Promote the existing record with Change Individual User Role after checking what is needed via Role Change Mandatory Fields.

Set up first

  • Top up your balance — payouts draw from it. Required, not optional
  • Configure webhooks — for confirming delivery to your customer
  • Understand verification — mandatory for anyone sending funds

Good to know for your industry

  • Requirements are per corridor. Always fetch mandatory fields at runtime — a sender in one country needs different data from another.
  • Purpose codes matter. Every order carries a purposeCode describing why money is moving. See Purpose Codes.
  • Supporting documents. Some corridors need evidence beyond identity. Use Share Additional Docs for higher-volume senders.
  • Transaction limits depend on the verification level reached — check Get Transaction Limits.

Go-live checklist

  • Sender and recipient creation built from mandatory-fields, not hard-coded
  • Verification flow live, including handling rejections
  • Balance funded
  • Purpose codes mapped to your transfer reasons
  • Webhook signature verification tested

APIs you'll use

PurposeEndpoint
Sender requirementsGet Sender Mandatory Fields
Create a senderIndividual · Business
Recipient requirementsGet Recipient Mandatory Fields
Create a recipientIndividual · Business
Verify a senderStandard KYC · Advanced KYC · KYC Status
Rate and feesGet Exchange Rates
Create the payoutCreate Order
LimitsGet Transaction Limits

Did this page help you?