---
title: "Create IRT transfer"
method: POST
path: "/irt/transfer/verified-recipient"
tags: ["IRT"]
---

# Create IRT transfer

`POST /irt/transfer/verified-recipient`

## Request

- The document declares no server URL.
- Auth: none declared. Required headers: `ApiKey`, `MerchantId`, `Environment`

Make an IRT transfer to a verified recipient

## Headers

- `ApiKey` string, required
- `MerchantId` string, required
- `Environment` 'live' | 'sandbox', required

## Request body

- InitiateVerifiedTransferIrtDto
  - `reference` string, required: A reference provided by the client during the creation of this Transfer, at most 255 characters
  - `rejectionId` string: Confirms a payout refused with `409 possible_duplicate`: the `rejection_id` of that response. Resend the refused payout unchanged, to the same endpoint and with the same reference (the `externalId`, for a cross-border transaction), before the response's `expires_at`. A rejection confirms one payout only: resending the confirmed payout again gets the idempotent replay, while an unknown or expired rejection, one replaced by a later refusal of its confirmation, one already used by another payout, or one that refused a different payout is answered `422 invalid_duplicate_confirmation`. Ignored unless duplicate protection and near-duplicate protection are both enforced for your account.
  - `srcCountry` 'AF' | 'AX' | 'AL' | 'DZ' | 'AS' | 'AD' | 'AO' | 'AI' | 'AQ' | 'AG' | 'AR' | 'AM' | 'AW' | 'AU' | 'AT' | 'AZ' | 'BS' | 'BH' | 'BD' | 'BB' | 'BY' | 'BE' | 'BZ' | 'BJ' | 'BM' | 'BT' | 'BO' | 'BQ' | 'BA' | 'BW' | 'BV' | 'BR' | 'IO' | 'BN' | 'BG' | 'BF' | 'BI' | 'KH' | 'CM' | 'CA' | 'CV' | 'KY' | 'CF' | 'TD' | 'CL' | 'CN' | 'CX' | 'CC' | 'CO' | 'KM' | 'CG' | 'CD' | 'CK' | 'CR' | 'CI' | 'HR' | 'CU' | 'CW' | 'CY' | 'CZ' | 'DK' | 'DJ' | 'DM' | 'DO' | 'EC' | 'EG' | 'SV' | 'GQ' | 'ER' | 'EE' | 'ET' | 'FK' | 'FO' | 'FJ' | 'FI' | 'FR' | 'GF' | 'PF' | 'TF' | 'GA' | 'GM' | 'GE' | 'DE' | 'GH' | 'GI' | 'GR' | 'GL' | 'GD' | 'GP' | 'GU' | 'GT' | 'GG' | 'GN' | 'GW' | 'GY' | 'HT' | 'HM' | 'VA' | 'HN' | 'HK' | 'HU' | 'IS' | 'IN' | 'ID' | 'IR' | 'IQ' | 'IE' | 'IM' | 'IL' | 'IT' | 'JM' | 'JP' | 'JE' | 'JO' | 'KZ' | 'KE' | 'KI' | 'KR' | 'KP' | 'KW' | 'KG' | 'LA' | 'LV' | 'LB' | 'LS' | 'LR' | 'LY' | 'LI' | 'LT' | 'LU' | 'MO' | 'MK' | 'MG' | 'MW' | 'MY' | 'MV' | 'ML' | 'MT' | 'MH' | 'MQ' | 'MR' | 'MU' | 'YT' | 'MX' | 'FM' | 'MD' | 'MC' | 'MN' | 'ME' | 'MS' | 'MA' | 'MZ' | 'MM' | 'NA' | 'NR' | 'NP' | 'NL' | 'NC' | 'NZ' | 'NI' | 'NE' | 'NG' | 'NU' | 'NF' | 'MP' | 'NO' | 'OM' | 'PK' | 'PW' | 'PS' | 'PA' | 'PG' | 'PY' | 'PE' | 'PH' | 'PN' | 'PL' | 'PT' | 'PR' | 'QA' | 'RE' | 'RO' | 'RU' | 'RW' | 'BL' | 'SH' | 'KN' | 'LC' | 'MF' | 'PM' | 'VC' | 'WS' | 'SM' | 'ST' | 'SA' | 'SN' | 'RS' | 'SC' | 'SL' | 'SG' | 'SX' | 'SK' | 'SI' | 'SB' | 'SO' | 'ZA' | 'GS' | 'SS' | 'ES' | 'LK' | 'SD' | 'SR' | 'SJ' | 'SZ' | 'SE' | 'CH' | 'SY' | 'TW' | 'TJ' | 'TZ' | 'TH' | 'TL' | 'TG' | 'TK' | 'TO' | 'TT' | 'TN' | 'TR' | 'TM' | 'TC' | 'TV' | 'UG' | 'UA' | 'AE' | 'GB' | 'US' | 'UM' | 'UY' | 'UZ' | 'VU' | 'VE' | 'VN' | 'VG' | 'VI' | 'WF' | 'EH' | 'YE' | 'ZM' | 'ZW', required: Source country
  - `srcZone` 'uemoa' | 'cemac' | 'africa' | 'world' | 'eur': Zone of the source country. If the country does not belong to a zone, set it to 'other'
  - `srcCurrency` 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHF' | 'CLP' | 'CNY' | 'COP' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'UYU' | 'UZS' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAF' | 'XCD' | 'XOF' | 'XPF' | 'YER' | 'ZAR' | 'ZMW' | 'ZWL', required: Currency of source country
  - `srcAmount` number, required: Amount at the originating transaction
  - `forexRate` string: Forex rate between corridors
  - `purpose` string, required: Purpose of the transfer
  - `srcOriginFunds` 'salary' | 'personal_savings' | 'pension_releases' | 'share_sales_and_dividends' | 'property_sales' | 'gambling_winnings' | 'inheritances_and_gift' | 'compensation_from_legal_rulings', required: Origin of funds
  - `srcOperator` string, required: Source operator
  - `destinationCurrency` 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHF' | 'CLP' | 'CNY' | 'COP' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'UYU' | 'UZS' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAF' | 'XCD' | 'XOF' | 'XPF' | 'YER' | 'ZAR' | 'ZMW' | 'ZWL', required: Destination currency
  - `recipientId` string, required: Internal id of the recipient
  - `senderKyc` SenderCustomerInformation, required
    - `payoutType` 'individual' | 'business': Type of sender. Defaults to `individual` when omitted, preserving the existing C2C behaviour. Set to `business` to send business sender fields instead of individual ones.
    - `firstName` string: First name of the sender (individual senders only)
    - `lastName` string: Last name of the sender (individual senders only)
    - `contactPhone` string: Contact phone number of the sender (individual senders only)
    - `dateOfBirth` string: Date of birth of the sender in YYYY-MM-DD format (individual senders only)
    - `nationality` 'AF' | 'AX' | 'AL' | 'DZ' | 'AS' | 'AD' | 'AO' | 'AI' | 'AQ' | 'AG' | 'AR' | 'AM' | 'AW' | 'AU' | 'AT' | 'AZ' | 'BS' | 'BH' | 'BD' | 'BB' | 'BY' | 'BE' | 'BZ' | 'BJ' | 'BM' | 'BT' | 'BO' | 'BQ' | 'BA' | 'BW' | 'BV' | 'BR' | 'IO' | 'BN' | 'BG' | 'BF' | 'BI' | 'KH' | 'CM' | 'CA' | 'CV' | 'KY' | 'CF' | 'TD' | 'CL' | 'CN' | 'CX' | 'CC' | 'CO' | 'KM' | 'CG' | 'CD' | 'CK' | 'CR' | 'CI' | 'HR' | 'CU' | 'CW' | 'CY' | 'CZ' | 'DK' | 'DJ' | 'DM' | 'DO' | 'EC' | 'EG' | 'SV' | 'GQ' | 'ER' | 'EE' | 'ET' | 'FK' | 'FO' | 'FJ' | 'FI' | 'FR' | 'GF' | 'PF' | 'TF' | 'GA' | 'GM' | 'GE' | 'DE' | 'GH' | 'GI' | 'GR' | 'GL' | 'GD' | 'GP' | 'GU' | 'GT' | 'GG' | 'GN' | 'GW' | 'GY' | 'HT' | 'HM' | 'VA' | 'HN' | 'HK' | 'HU' | 'IS' | 'IN' | 'ID' | 'IR' | 'IQ' | 'IE' | 'IM' | 'IL' | 'IT' | 'JM' | 'JP' | 'JE' | 'JO' | 'KZ' | 'KE' | 'KI' | 'KR' | 'KP' | 'KW' | 'KG' | 'LA' | 'LV' | 'LB' | 'LS' | 'LR' | 'LY' | 'LI' | 'LT' | 'LU' | 'MO' | 'MK' | 'MG' | 'MW' | 'MY' | 'MV' | 'ML' | 'MT' | 'MH' | 'MQ' | 'MR' | 'MU' | 'YT' | 'MX' | 'FM' | 'MD' | 'MC' | 'MN' | 'ME' | 'MS' | 'MA' | 'MZ' | 'MM' | 'NA' | 'NR' | 'NP' | 'NL' | 'NC' | 'NZ' | 'NI' | 'NE' | 'NG' | 'NU' | 'NF' | 'MP' | 'NO' | 'OM' | 'PK' | 'PW' | 'PS' | 'PA' | 'PG' | 'PY' | 'PE' | 'PH' | 'PN' | 'PL' | 'PT' | 'PR' | 'QA' | 'RE' | 'RO' | 'RU' | 'RW' | 'BL' | 'SH' | 'KN' | 'LC' | 'MF' | 'PM' | 'VC' | 'WS' | 'SM' | 'ST' | 'SA' | 'SN' | 'RS' | 'SC' | 'SL' | 'SG' | 'SX' | 'SK' | 'SI' | 'SB' | 'SO' | 'ZA' | 'GS' | 'SS' | 'ES' | 'LK' | 'SD' | 'SR' | 'SJ' | 'SZ' | 'SE' | 'CH' | 'SY' | 'TW' | 'TJ' | 'TZ' | 'TH' | 'TL' | 'TG' | 'TK' | 'TO' | 'TT' | 'TN' | 'TR' | 'TM' | 'TC' | 'TV' | 'UG' | 'UA' | 'AE' | 'GB' | 'US' | 'UM' | 'UY' | 'UZ' | 'VU' | 'VE' | 'VN' | 'VG' | 'VI' | 'WF' | 'EH' | 'YE' | 'ZM' | 'ZW': Nationality of the sender (individual senders only)
    - `idDocument` IdDocumentDto
      - `expiryDate` string, date-time: Expiry date of the ID document in ISO 8601 format
      - `idNumber` string, required: The ID document number
      - `idType` 'alienregistration' | 'birthcertificate' | 'drivinglicence' | 'employer' | 'healthcard' | 'marriagecertificate' | 'nationalidcard' | 'nationalregistration' | 'officialletter' | 'othered' | 'pancard' | 'passport' | 'seniorcitizenscard' | 'socialsecurity' | 'taxid' | 'villageelderletter' | 'votersid', required: Type of ID document
      - `issueDate` string, date-time: Issue date of the ID document in ISO 8601 format
      - `issuer` string: Issuing authority of the ID document
      - `issuerCountry` 'AF' | 'AX' | 'AL' | 'DZ' | 'AS' | 'AD' | 'AO' | 'AI' | 'AQ' | 'AG' | 'AR' | 'AM' | 'AW' | 'AU' | 'AT' | 'AZ' | 'BS' | 'BH' | 'BD' | 'BB' | 'BY' | 'BE' | 'BZ' | 'BJ' | 'BM' | 'BT' | 'BO' | 'BQ' | 'BA' | 'BW' | 'BV' | 'BR' | 'IO' | 'BN' | 'BG' | 'BF' | 'BI' | 'KH' | 'CM' | 'CA' | 'CV' | 'KY' | 'CF' | 'TD' | 'CL' | 'CN' | 'CX' | 'CC' | 'CO' | 'KM' | 'CG' | 'CD' | 'CK' | 'CR' | 'CI' | 'HR' | 'CU' | 'CW' | 'CY' | 'CZ' | 'DK' | 'DJ' | 'DM' | 'DO' | 'EC' | 'EG' | 'SV' | 'GQ' | 'ER' | 'EE' | 'ET' | 'FK' | 'FO' | 'FJ' | 'FI' | 'FR' | 'GF' | 'PF' | 'TF' | 'GA' | 'GM' | 'GE' | 'DE' | 'GH' | 'GI' | 'GR' | 'GL' | 'GD' | 'GP' | 'GU' | 'GT' | 'GG' | 'GN' | 'GW' | 'GY' | 'HT' | 'HM' | 'VA' | 'HN' | 'HK' | 'HU' | 'IS' | 'IN' | 'ID' | 'IR' | 'IQ' | 'IE' | 'IM' | 'IL' | 'IT' | 'JM' | 'JP' | 'JE' | 'JO' | 'KZ' | 'KE' | 'KI' | 'KR' | 'KP' | 'KW' | 'KG' | 'LA' | 'LV' | 'LB' | 'LS' | 'LR' | 'LY' | 'LI' | 'LT' | 'LU' | 'MO' | 'MK' | 'MG' | 'MW' | 'MY' | 'MV' | 'ML' | 'MT' | 'MH' | 'MQ' | 'MR' | 'MU' | 'YT' | 'MX' | 'FM' | 'MD' | 'MC' | 'MN' | 'ME' | 'MS' | 'MA' | 'MZ' | 'MM' | 'NA' | 'NR' | 'NP' | 'NL' | 'NC' | 'NZ' | 'NI' | 'NE' | 'NG' | 'NU' | 'NF' | 'MP' | 'NO' | 'OM' | 'PK' | 'PW' | 'PS' | 'PA' | 'PG' | 'PY' | 'PE' | 'PH' | 'PN' | 'PL' | 'PT' | 'PR' | 'QA' | 'RE' | 'RO' | 'RU' | 'RW' | 'BL' | 'SH' | 'KN' | 'LC' | 'MF' | 'PM' | 'VC' | 'WS' | 'SM' | 'ST' | 'SA' | 'SN' | 'RS' | 'SC' | 'SL' | 'SG' | 'SX' | 'SK' | 'SI' | 'SB' | 'SO' | 'ZA' | 'GS' | 'SS' | 'ES' | 'LK' | 'SD' | 'SR' | 'SJ' | 'SZ' | 'SE' | 'CH' | 'SY' | 'TW' | 'TJ' | 'TZ' | 'TH' | 'TL' | 'TG' | 'TK' | 'TO' | 'TT' | 'TN' | 'TR' | 'TM' | 'TC' | 'TV' | 'UG' | 'UA' | 'AE' | 'GB' | 'US' | 'UM' | 'UY' | 'UZ' | 'VU' | 'VE' | 'VN' | 'VG' | 'VI' | 'WF' | 'EH' | 'YE' | 'ZM' | 'ZW': Country that issued the ID document
      - `issuerPlace` string: Place where the ID document was issued
      - `otherIdDescription` string: Description for other types of ID documents
    - `name` string: Registered legal name of the business sender (business senders only)
    - `countryOfIncorporation` string: Country of incorporation as an ISO 3166-1 alpha-2 code (business senders only)
    - `legalEntityType` 'sole_proprietorship' | 'partnership' | 'privately_owned_company' | 'publicly_listed_company' | 'government_entity' | 'non_profit_organisation' | 'trust' | 'cooperative' | 'other': Legal entity type of the business sender (business senders only)
    - `registrationDate` string: Business registration date in YYYY-MM-DD format, must be in the past (business senders only)
    - `registrationNumber` string: Business registration number (business senders only)
    - `tradingCountry` string: Trading address country as an ISO 3166-1 alpha-2 code (business senders only)
    - `tradingCity` string: Trading address city (business senders only)
    - `tradingStreet` string: Trading address street (business senders only)
    - `tradingPostalCode` string: Trading address postal code (business senders only)
    - `natureOfBusiness` 'agriculture' | 'construction' | 'education' | 'financial_services' | 'healthcare' | 'hospitality' | 'information_technology' | 'manufacturing' | 'mining_and_energy' | 'professional_services' | 'real_estate' | 'retail_trade' | 'telecommunications' | 'transportation' | 'wholesale_trade' | 'other': Primary business activity of the sender (business senders only)
    - `phoneNumber` string: Business contact phone number in E.164 format (business senders only)
    - `email` string: Business contact email address (business senders only)
  - `description` string: An arbitrary string attached to the Transfer. Mostly useful for displaying to user.
  - `overrideBusinessName` string: This field is mandatory for aggregators and allows you to override the business name displayed to the end users. This is useful if you don't want your clients to see "Hub2" as the target of their payment but your company name instead.
  - `bankName` string: Bank name

## Response `200`

Idempotent replay. Duplicate protection is enforced for your account, and a payout with this reference and the same payout details already exists: it is returned as it is now, and nothing is created or charged. Only ever sent with the `X-Idempotent-Replay: true` header and the body field `idempotentReplay: true`, which is absent from a normal creation. The payout details compared are the destination type, country, beneficiary, operator, requested amount and currency; on IRT and cross-border routes, also the sender identity and, on cross-border, the `rateId`, unless the reference was recorded by an earlier version of this check, which compared neither; other names (recipient, bank, display name), descriptions and metadata are ignored.

- TransferDto
  - `id` string, required: Unique identifier for the Transfer
  - `merchantId` string, required: Identifier of the merchant owning this Transfer
  - `createdAt` string, required: Datetime in UTC timezone at which this object was created. Follows the [Datetime ISO](https://en.wikipedia.org/wiki/ISO_8601).
  - `updatedAt` string, required: Datetime in UTC timezone at which this object was updated for the last time . Follows the [Datetime ISO](https://en.wikipedia.org/wiki/ISO_8601).
  - `reference` string, required: A reference provided by the client during the creation of this Transfer
  - `description` string, required: An arbitrary string attached to the Transfer. Mostly useful for displaying to user.
  - `status` 'created' | 'successful' | 'pending' | 'failed', required: The current status of this Transfer
  - `amount` number, required: Amount intended to be sent to the recipient. A positive integer representing how much to charge in the smallest currency unit (e.g., 100 cents to charge €1.00 or 100 to charge FCFA100, a zero-decimal currency).
  - `currency` string, required: Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html).
  - `mode` 'live' | 'sandbox', required: Mode in which this transfer exists. The sandbox mode can be used during the integration phase and is available as soon as the merchant account is created. No real transactions are made in this mode. The live mode has to be used to make real transactions.
  - `destination` union, required: Information about the recipient of this Transfer
    - MobileMoneyDto
      - `type` 'mobile_money' | 'bank_transfer' | 'airtime' | 'instant_payment', required: The method selected to make this Transfer
      - `country` string, required: Two-letter [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Represents the country where the provider selected by the customer is localized.
      - `recipientName` string: recipient's Name
      - `number` string, required: The identifier referencing the payment method of the customer. - In case of a payment by Mobile Money, it corresponds to the customer phone number corresponding to his Mobile Money account
      - `provider` string, required: The name of the provider selected by the customer, in lowercase. The list of supported providers can be found at [/data/providers](#operation/DataController_getProviders)
    - BankTransferDto
      - `type` 'mobile_money' | 'bank_transfer' | 'airtime' | 'instant_payment', required: The method selected to make this Transfer
      - `country` string, required: Two-letter [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Represents the country where the provider selected by the customer is localized.
      - `recipientName` string: recipient's Name
      - `number` string, required: The identifier referencing the payment method of the customer. - In case of a payment by Bank Transfer, it corresponds to the customer bank account number
      - `accountOwner` string, required: The Bank account owner name to which the money must be sent.
      - `bankCode` string, required: The Bank code.
      - `bankName` string, required: The Bank name.
      - `beneficiaryPhone` string, required: The Beneficiary phone
    - AirtimeDto
      - `type` 'mobile_money' | 'bank_transfer' | 'airtime' | 'instant_payment', required: The method selected to make this Transfer
      - `country` string, required: Two-letter [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Represents the country where the provider selected by the customer is localized.
      - `recipientName` string: recipient's Name
      - `number` string, required: The identifier referencing the payment method of the customer. - In case of a payment by Airtime, it corresponds to the customer phone number corresponding to his Airtime account
      - `provider` string, required: The name of the provider selected by the customer, in lowercase. The list of supported providers can be found at [/data/providers](#operation/DataController_getProviders)
    - InstantPaymentDto
      - `type` 'mobile_money' | 'bank_transfer' | 'airtime' | 'instant_payment', required: The method selected to make this Transfer
      - `country` string, required: Two-letter [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Represents the country where the provider selected by the customer is localized.
      - `recipientName` string: recipient's Name
      - `provider` string, required: The provider serving this destination. Always `pispi` for instant payment.
      - `payerAlias` string: The alias of the account debited — the merchant's own transfer account. On `POST /transfers` it is chosen by HUB2 from the merchant's registered aliases rather than taken from the request.
      - `payeeAlias` string: The alias of the beneficiary paid, as supplied on the request.
  - `fees` TransferFeeDto[], required: Fees applied to merchant's transfer-account uppon success
    - `id` string, required: Unique identifier of the applied Fee object.
    - `rate` number, required: A rate corresponding to the amount (flat or percentage) applied by the fees.
    - `type` 'flat' | 'percent', required: The type of fee applied to the transfer's amount - flat: A fixed amount applied as is to the amount. - percent: A rate applied to the amount as a percentage of the latter.
    - `amount` number, required: Amount applied by this Fees. A positive integer representing how much to charge in the smallest currency unit (e.g., 100 cents to charge €1.00 or 100 to charge FCFA100, a zero-decimal currency).
    - `currency` string, required: Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html).
    - `label` string: An optional label giving information on the reason of this fees.
    - `taxes` string[], required: An array containing every taxes applied to a fee
  - `failureCause` TransferFailureCauseDto
    - `code` string, required
    - `message` string, required
    - `params` string[], required
  - `origin` OriginDto
    - `name` string: Sender's name
    - `country` string: Sender's country. Two-letter [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
  - `overrideBusinessName` string: override business name for aggregator
  - `overrideBusinessId` string: override business id for merchant
  - `isIrt` boolean, required: indicate if the transfer was international
  - `providerReference` string, required: provider reference that identify this transfer
  - `isDelegated` boolean, required: Indicates if the transfer is delegated
  - `aggregatedMerchantId` string, required: Aggregated merchant id
  - `subMerchantId` string: Submerchant ID
  - `transferInformation` TransferInformationDto
    - `recipient_name_hashmac` string: HMAC-SHA256 of the full name of the person receiving the funds, computed on the partner side and hex-encoded (64 characters). Case-insensitive on input, returned in lower case.
    - `customer_id_hashmac` string: HMAC-SHA256, hex-encoded (64 characters), of your identifier for the end user receiving the funds: your customer id, or the end-user phone number when you have no customer id. Expected from every merchant on a payout: currently monitored, it will become mandatory on a date announced in advance. Case-insensitive on input, returned in lower case.
    - `transaction_purpose` 'SALARY' | 'LOAN_DISBURSEMENT' | 'COMMISSION' | 'REFUND' | 'CASHOUT' | 'OTHER': Declared purpose of the payout for compliance and monitoring. Expected from every merchant on a payout (map it from the note or comment you already attach to the payout): currently monitored, it will become mandatory on a date announced in advance.
  - `idempotentReplay` true: Present, and `true`, only when the response replays an existing payout (idempotent replay, HTTP 200 with the `X-Idempotent-Replay: true` header). Absent when the transfer has just been created.
  - `duplicateConfirmation` DuplicateConfirmationDto
    - `rejectionId` string, required: The `rejection_id` of the `possible_duplicate` refusal this payout confirmed.

## Other responses

- `201`
- `400`: Bad Request Bad Request: DTO validation failure, or, with duplicate protection enforced, code `reference_required` when the reference (`externalId` on cross-border) is blank — empty or only whitespace. Where the route's validation already refuses an empty value (`/irt/*`, cross-border), only a whitespace-only value reaches `reference_required`.
- `401`: Wrong credentials
- `409`: Conflict. With code `duplicate_reference` (duplicate protection enforced): the reference is already used by a payout with different details, or by a payout of another kind. The refusal does not mean that a payout failed: the body carries `original_transaction_id`, the id of the payout that already holds the reference, to fetch its status. It is absent in two cases, when there is no payout id to give: the payout holding the reference does not belong to your merchant scope and environment, or it cannot be read. With code `possible_duplicate` (near-duplicate protection enforced): a payout with the same details was created under another reference in the last 15 minutes, on this or another duplicate-protected payout endpoint, whatever its status — a failed or cancelled payout counts too; the reference stays free. The body then also carries `matching_transfers` (the earlier payouts: `id`, `reference`, `status`, `created_at`, `operator`, `amount`, `currency`; an internal `awaiting_confirmation` status is shown as `pending`), `end_user_message` (a text in `en` and `fr` that a merchant can show its end user, depending on whether the most advanced of the earlier payouts is sent, in progress or reported as failed), `rejection_id` and `expires_at`: resend the payout unchanged, to the same endpoint and with the same reference (the `externalId`, for a cross-border transaction), with `rejectionId` set to `rejection_id` before `expires_at` to confirm it. A confirmation is refused again, with a new `rejection_id`, when it finds such a payout the refusal had not seen — typically one created since; only that new `rejection_id` can then confirm it, and the one sent is answered `422` with reason `expired`. It is checked last, so a request that another check refuses or replays — validation, `reference_required`, `duplicate_reference`, the idempotent replay, the testing-merchant limit, on cross-border the quote and float checks, or an invalid `rejectionId`'s 422 — gets that answer instead. Nothing is created. The route's other conflicts keep their own code.
- `422`: Unprocessable Entity. With code `invalid_duplicate_confirmation` (near-duplicate protection enforced): the `rejectionId` sent cannot confirm this payout — it is expired, replaced by a later refusal of its confirmation, or already used, the payout or its reference, or its flow, differs from the one it refused, or it is unknown — including one that belongs to another merchant, scope or mode. A flow is one of: transfers, delegated transfers, IRT transfers, delegated IRT transfers, cross-border transactions. The `reason` field says which: `expired`, `used`, `content_changed` or `unknown`. Nothing is created; resend the payout without `rejectionId` to get a new one if it is still a possible duplicate. A retry of a confirmation that already created its payout gets the idempotent replay, not this error. The route's other unprocessable requests keep their own code — on cross-border, `Unprocessable Entity` with the reason in `message` (`quote_not_found`, `rate_expired`, `transaction_not_created`, …).
- `429`: ThrottlerException: Too Many Requests
- `500`: Internal error
- `503`: Service unavailable

## Changes

- **2026-11-03** `f6d3f87df5e0`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/hub2/apis/hub2-service-api/changes/irt/transfer/verified-recipient/post.md)

---

[API](https://skmtc.dev/hub2/apis/hub2-service-api.md) - [All operations](https://skmtc.dev/hub2/apis/hub2-service-api/llms.txt) - [OpenAPI document](https://skmtc.dev/hub2/apis/hub2-service-api/revisions/f6d3f87df5e0?raw)
