POST /inbound
POST /api/v1/remittance/inboundSubmit a money transfer to a beneficiary's DRC mobile money wallet or FBN Bank cash pickup. Returns HTTP 202 Accepted with an acknowledgement. The final status (Successful / Failed) is delivered later via webhook.
Auth: Basic merchant_code:merchant_secret
Required fields
All fields below are hard-required. A missing value returns RMT-1005 MISSING_FIELD (or RMT-1018 for the address either-or).
Transaction identity & routing
| Field | Type | Description |
|---|---|---|
amount | number | Transaction amount in source currency. |
currency | string | Source currency. See supported currencies. Receiver always gets USD on DRC corridor. |
customer_number | string | Beneficiary MSISDN (243…). |
reference | string | Your unique transfer reference (max 80 chars). Idempotent — a repeat call returns the first result. |
operator | string | mpesa, airtel, orange, afrimoney, or fbnbank (cash pickup). |
expected_receiver_name | string | Receiver name confirmed with your end-user. Fuzzy-matched against the telco record. |
Sender KYC — FATF R.16 + BCC RTS Art.66
| Field | Type | Description |
|---|---|---|
sender_first_name | string | Legal first name as on the sender's identity document. |
sender_last_name | string | Legal last name as on the sender's identity document. |
sender_nationality | string | Sender nationality. |
sender_birthdate | string (ISO date) | Date of birth, YYYY-MM-DD. |
sender_birthplace | string | City of birth. |
sender_document_type | string (enum) | One of: PASSPORT, NATIONAL_ID, DRIVING_LICENCE, VOTER_CARD, OTHER. Invalid values return RMT-1015. |
identity_number | string | Sender ID / passport number matching sender_document_type. |
sending_country | string | ISO-3166-1 alpha-2 country code of the sending country. |
Receiver KYC — FATF R.16 + BCC RTS Art.66
| Field | Type | Description |
|---|---|---|
receiver_first_name | string | Legal first name. |
receiver_last_name | string | Legal last name. |
receiver_nationality | string | Receiver nationality. |
receiver_birthdate | string (ISO date) | YYYY-MM-DD. |
receiver_document_type | string (enum) | One of: PASSPORT, NATIONAL_ID, DRIVING_LICENCE, VOTER_CARD. Required for all operators, not just cash pickup. |
receiver_document_number | string | Receiver ID / passport number. |
receiving_country | string | ISO country code (typically CD for DRC). |
receiver_current_address or receiver_permanent_address | string | At least one must be provided. Missing both returns RMT-1018. |
Transaction context — FATF R.16
| Field | Type | Description |
|---|---|---|
reason_of_transaction | string (enum) | FAMILY_SUPPORT, EDUCATION, MEDICAL, BUSINESS_PAYMENT, SALARY, GIFT, SAVINGS, PROPERTY_PURCHASE, TRAVEL, LOAN_REPAYMENT, INVESTMENT, CONSTRUCTION, RENT, GENERAL, FUEL, REPAIRS, PERSONAL_CARE, FOOD_AND_GROCERIES, TRANSPORT, SHOPPING, ENTERTAINMENT, DONATIONS, OTHER (23 values). Invalid → RMT-1016. |
source_of_funds | string (enum) | SALARY, BUSINESS_INCOME, SAVINGS, INVESTMENT, PENSION, GIFT, LOAN, SALE_OF_ASSET, INHERITANCE, OTHER. Invalid → RMT-1017. |
Optional fields
| Field | Type | Description |
|---|---|---|
sender_middle_name | string | Culture-dependent; send when the sender has a middle name on their ID. |
receiver_middle_name | string | Culture-dependent; send when the receiver has a middle name on their ID. |
sender_msisdn | string | The originating sender's own MSISDN (not the beneficiary's). Send when the sender initiated the transfer from a mobile wallet (Wave, Orange Money app…). Cash-counter (Western Union guichet) and web-only channels have no MSISDN — leave empty. Used by Vodacom Reporting. |
reason_details | string | Free-text qualifier of reason_of_transaction. Example: reason_of_transaction=EDUCATION, reason_details="tuition for Nairobi university". |
sender_city | string | Sender city of residence (in addition to birthplace). |
current_address, permanent_address | string | Sender addresses (distinct from the receiver addresses). |
profession | string | Sender profession. |
receiver_birthplace | string | Receiver city of birth. |
document_issue_date, document_expiration_date | string (ISO date) | Receiver document dates. |
provider_name | string | Sender-side provider label if useful for your reconciliation. |
callback_url | string | Per-request webhook URL override. If unset, uses the merchant-channel default. |
Full-compliance request example
bash
curl -X POST https://staging.remittance.gofreshpay.com/api/v1/remittance/inbound \
-u 'MKA-XXXX-XXXX:sk_live_XXXXX' \
-H 'Content-Type: application/json' \
-d '{
"amount": 10,
"currency": "USD",
"customer_number": "243812345678",
"reference": "TXN_001",
"operator": "mpesa",
"expected_receiver_name": "Marie Kabila",
"sender_first_name": "John",
"sender_last_name": "Doe",
"sender_nationality": "Ugandan",
"sender_birthdate": "1985-04-12",
"sender_birthplace": "Kampala",
"sender_document_type": "PASSPORT",
"identity_number": "UG123456789",
"sending_country": "UG",
"receiver_first_name": "Marie",
"receiver_last_name": "Kabila",
"receiver_nationality": "Congolaise",
"receiver_birthdate": "1990-08-22",
"receiver_document_type": "NATIONAL_ID",
"receiver_document_number": "CD-NAT-990822-4567",
"receiver_current_address": "Avenue Kabambare 12, Gombe, Kinshasa",
"receiving_country": "CD",
"reason_of_transaction": "FAMILY_SUPPORT",
"source_of_funds": "SALARY",
"sender_msisdn": "256770000001",
"reason_details": "monthly family support"
}'Response (202 Accepted)
json
{
"status": "accepted",
"message": "Transaction received and is being processed. Final status will be sent via callback.",
"data": {
"transaction_id": "IMT-IN-20260814-A1B2C3-D4E5",
"reference": "TXN_001",
"amount": 10,
"currency": "USD",
"operator": "mpesa",
"customer_number": "243812345678",
"subscriber_name": "MARIE KABILA",
"created_at": "2026-08-14T14:00:00.000000"
},
"timestamp": "2026-08-14T14:00:00.000000"
}Errors
RMT-1005 — missing required field
json
{
"status": "error",
"error": {
"code": "RMT-1005",
"field": "sender_birthplace",
"message": "Required field missing: sender_birthplace"
},
"timestamp": "2026-08-14T14:00:00.000000"
}For expected_receiver_name specifically, the response also includes a telco_name_hint so you can retry with the right name without re-calling /account-lookup:
json
{
"status": "error",
"error": {
"code": "RMT-1005",
"field": "expected_receiver_name",
"message": "Required field missing: expected_receiver_name.",
"telco_name_hint": "MARIE KABILA"
},
"timestamp": "2026-08-14T14:00:00.000000"
}RMT-1015 / 1016 / 1017 — invalid enum value
json
{
"status": "error",
"error": {
"code": "RMT-1016",
"field": "reason_of_transaction",
"message": "reason_of_transaction must be one of ['BUSINESS_PAYMENT', 'CONSTRUCTION', 'DONATIONS', 'EDUCATION', 'ENTERTAINMENT', 'FAMILY_SUPPORT', 'FOOD_AND_GROCERIES', 'FUEL', 'GENERAL', 'GIFT', 'INVESTMENT', 'LOAN_REPAYMENT', 'MEDICAL', 'OTHER', 'PERSONAL_CARE', 'PROPERTY_PURCHASE', 'RENT', 'REPAIRS', 'SALARY', 'SAVINGS', 'SHOPPING', 'TRANSPORT', 'TRAVEL']"
},
"timestamp": "2026-08-14T14:00:00.000000"
}RMT-1018 — both receiver addresses missing
json
{
"status": "error",
"error": {
"code": "RMT-1018",
"field": "receiver_current_address|receiver_permanent_address",
"message": "At least one of receiver_current_address or receiver_permanent_address is required"
},
"timestamp": "2026-08-14T14:00:00.000000"
}RMT-4006 — receiver name mismatch
json
{
"status": "error",
"error": {
"code": "RMT-4006",
"message": "Receiver name mismatch with telco record",
"expected": "John Smith",
"telco": "MARIE KABILA",
"score": 0.0,
"reason": "insufficient match: 0/2 matched, unmatched=['john', 'smith']"
},
"timestamp": "2026-08-14T14:00:00.000000"
}Test cases in Postman
The Postman collection includes 20 test cases for /inbound:
TC-INB-001toTC-INB-009— happy paths + variants (M-Pesa, Airtel, Orange, FX conversion, duplicate reference…)TC-INB-NAME-001/002/004— name-match tests (missing, mismatch, happy path)TC-INB-KYC-001toTC-INB-KYC-008— the new v2.1 KYC field tests (missing sender_birthplace, invalid enums, both addresses missing, full-compliance happy path)
See also
- Aggregator model — who owns which side of the KYC
- Compliance & KYC — the exhaustive rules Moko enforces
- Callbacks — how the final status reaches you
/account-lookup— mandatory pre-flight to fetch the telco name
