Skip to content

POST /inbound

POST /api/v1/remittance/inbound

Submit 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

FieldTypeDescription
amountnumberTransaction amount in source currency.
currencystringSource currency. See supported currencies. Receiver always gets USD on DRC corridor.
customer_numberstringBeneficiary MSISDN (243…).
referencestringYour unique transfer reference (max 80 chars). Idempotent — a repeat call returns the first result.
operatorstringmpesa, airtel, orange, afrimoney, or fbnbank (cash pickup).
expected_receiver_namestringReceiver name confirmed with your end-user. Fuzzy-matched against the telco record.

Sender KYC — FATF R.16 + BCC RTS Art.66

FieldTypeDescription
sender_first_namestringLegal first name as on the sender's identity document.
sender_last_namestringLegal last name as on the sender's identity document.
sender_nationalitystringSender nationality.
sender_birthdatestring (ISO date)Date of birth, YYYY-MM-DD.
sender_birthplacestringCity of birth.
sender_document_typestring (enum)One of: PASSPORT, NATIONAL_ID, DRIVING_LICENCE, VOTER_CARD, OTHER. Invalid values return RMT-1015.
identity_numberstringSender ID / passport number matching sender_document_type.
sending_countrystringISO-3166-1 alpha-2 country code of the sending country.

Receiver KYC — FATF R.16 + BCC RTS Art.66

FieldTypeDescription
receiver_first_namestringLegal first name.
receiver_last_namestringLegal last name.
receiver_nationalitystringReceiver nationality.
receiver_birthdatestring (ISO date)YYYY-MM-DD.
receiver_document_typestring (enum)One of: PASSPORT, NATIONAL_ID, DRIVING_LICENCE, VOTER_CARD. Required for all operators, not just cash pickup.
receiver_document_numberstringReceiver ID / passport number.
receiving_countrystringISO country code (typically CD for DRC).
receiver_current_address or receiver_permanent_addressstringAt least one must be provided. Missing both returns RMT-1018.

Transaction context — FATF R.16

FieldTypeDescription
reason_of_transactionstring (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_fundsstring (enum)SALARY, BUSINESS_INCOME, SAVINGS, INVESTMENT, PENSION, GIFT, LOAN, SALE_OF_ASSET, INHERITANCE, OTHER. Invalid → RMT-1017.

Optional fields

FieldTypeDescription
sender_middle_namestringCulture-dependent; send when the sender has a middle name on their ID.
receiver_middle_namestringCulture-dependent; send when the receiver has a middle name on their ID.
sender_msisdnstringThe 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_detailsstringFree-text qualifier of reason_of_transaction. Example: reason_of_transaction=EDUCATION, reason_details="tuition for Nairobi university".
sender_citystringSender city of residence (in addition to birthplace).
current_address, permanent_addressstringSender addresses (distinct from the receiver addresses).
professionstringSender profession.
receiver_birthplacestringReceiver city of birth.
document_issue_date, document_expiration_datestring (ISO date)Receiver document dates.
provider_namestringSender-side provider label if useful for your reconciliation.
callback_urlstringPer-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-001 to TC-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-001 to TC-INB-KYC-008 — the new v2.1 KYC field tests (missing sender_birthplace, invalid enums, both addresses missing, full-compliance happy path)

See also

Operated by SODOTECH SARL (RCCM CD/KNG/RCCM/24-B-00910). Documentation is versioned alongside the API. Confidential — for integration partners.