IMTO Payment

Overview

Our IMTO service provides businesses with a comprehensive set of endpoints for managing International Money Transfer Operations. It covers authentication, partner management, wallet operations, FX rates, fees, user management, reporting, and more. Use this service to test, integrate, and automate workflows for IMTO-related business processes.

Key Features

  • Get Auth Token
  • Get Current FX Rate
  • Order Creation
  • Authorize Order
  • Get Transaction
  • Get Wallet Balance

Getting Integration Credentials

To call our IMTO service, you need to get your Client Id and Client Secret from the business portal.

Register on the portal as shown below.

Funding your Wallet

You can create and fund your wallet position on the portal as shown below.

IMTO Status

We currently have 3 main statuses:

StatusDescription
PROCESSINGTransactions is currently being processed
SUCCESSFULTransaction is successful, value has been given
FAILEDTransaction has failed. Funds have been reversed if they were originally debited.

IMTO Channels

The following IMTO channels for payment are available:

  • BANK_TRANSFER: Standard bank transfer

Get Auth Token

This endpoint handles authentication and token retrieval for secure access to IMTO services. Use these endpoints to obtain OAuth tokens required for subsequent API requests.

Endpoint: POST https://passport-v2.k8.isw.la/passport/oauth/token?scope=profile&grant_type=client_credentials

Request Headers

To authorize this request, you must include an Authorization header using the Basic Auth scheme. This requires your client_id and client_secret combined with a colon (client_id:client_secret) and then encoded to Base64.

KeyValueDescription
AuthorizationBasic <Base64 encoded client_id:client_secret>Replace the placeholder with your actual Base64 string.
Content-Typeapplication/x-www-form-urlencodedStandard content type for OAuth token requests.

Request Body

None required. (The necessary grant type and scope are already included in the URL query parameters).


How to generate the Base64 string:
If your Client ID is my_client and your Client Secret is my_secret, you format it as my_client:my_secret. Encoding that string into Base64 results in bXlfY2xpZW50Om15X3NlY3JldA==. Your final header would look like this:
Authorization: Basic bXlfY2xpZW50Om15X3NlY3JldA==

Sample Response

{
    "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
    "token_type": "bearer",
    "expires_in": 39999,
    "scope": "profile",
    "merchant-wallet-actions": [
        "transact",
        "reverse",
        "authenticate-pin"
    ],
    "business_code": "ISWIMTO20250618105314121",
    "client_name": "ISWIMTO20250618105314121",
    "jti": "b49fa89b-a02d-4089-9ac4-034cbebbb0de"
}

Response Fields

FieldDescription
access_tokenThe OAuth bearer token used to authenticate subsequent API requests
token_typeType of token issued (always bearer)
expires_inToken validity duration, in seconds
scopeGranted scope for the token
merchant-wallet-actionsList of wallet actions permitted for this client (e.g. transact, reverse, authenticate-pin)
business_codeUnique code identifying the registered business
client_nameName associated with the client credentials
jtiUnique identifier for this specific token (JWT ID)

Get Current FX Rate

This endpoint returns the current FX rate that will be used for conversion at the time of transaction.

Endpoint: GET /api/v1/fx/current-rate?senderCurrencyCode=USD&destinationCurrencyCode=NGN&amount=1

Response

{
    "responseCode": "00",
    "responseMessage": "Successful",
    "data": {
        "fxRate": 1390.00,
        "expiryTime": "2026-12-12T17:01:45.275",
        "beneficiaryValue": 1390.00,
        "fxSpread": 0,
        "fxReference": "2d897145-0f6a-454e-a869-45e1d1f5acc8"
    }
}

Response Fields

FieldDescription
responseCodeStatus code of the response (00 = success)
responseMessageHuman-readable status message
fxRateCurrent exchange rate applied for the conversion
expiryTimeTimestamp when this quoted rate expires
beneficiaryValueValue the beneficiary will receive based on this rate
fxSpreadSpread applied on top of the base FX rate
fxReferenceUnique reference for this FX rate quote

Order Creation

This endpoint generates a payment order using the current FX rate and includes an expiration window, allowing the business to review the rate and authorise the payment if they're comfortable with it.

Endpoint: POST /api/v1/order

Request

{
    "senderCurrencyCode":"USD",
    "destinationCurrencyCode":"NGN",
    "senderAmount":"2"
}

Request Body Fields

FieldDescription
senderCurrencyCodeCurrency code of the sending party (e.g. USD)
destinationCurrencyCodeCurrency code of the receiving party (e.g. NGN)
senderAmountAmount being sent, in sender's currency

Response

{
    "responseCode": "00",
    "responseMessage": "Successful",
    "data": {
        "createdOn": "2025-12-03 08:32:14",
        "createdBy": "[email protected]",
        "id": 20246,
        "senderAmountBeforeCharge": 2.00,
        "senderAmountAfterCharge": 2.00,
        "orderId": "55b73cce-14e2-4f8e-b3d7-22e830d56695",
        "charge": 0.00,
        "orderValidityPeriodInSeconds": 3600,
        "senderCurrency": "USD",
        "beneficiaryCurrency": "NGN",
        "fxRate": 1488.00,
        "businessId": 40135,
        "status": "NEW",
        "beneficiaryAmount": 2976.00,
        "fxReference": "0d23065a-4d1e-4e66-b48f-6ae6e785762c"
    }
}

Response Fields

FieldDescription
responseCodeStatus code of the response
responseMessageHuman-readable status message
createdOnTimestamp the order was created
createdByEmail/identifier of the user who created the order
idInternal numeric ID of the order
senderAmountBeforeChargeAmount before any charges applied
senderAmountAfterChargeAmount after charges applied
orderIdUnique order identifier (used to authorize the order)
chargeFee charged for creating this order
orderValidityPeriodInSecondsHow long the order/rate remains valid before expiring
senderCurrencyCurrency of the sender
beneficiaryCurrencyCurrency of the beneficiary
fxRateLocked-in exchange rate for this order
businessIdID of the business that created the order
statusCurrent status of the order (e.g. NEW)
beneficiaryAmountAmount the beneficiary will receive
fxReferenceReference tying this order to its FX rate quote

Authorize Order

This allows the partner to authorise the order using the order ID generated by the create-order endpoint.

Endpoint: POST /api/v1/order/authorize

Request

{
    "orderId": "55b73cce-14e2-4f8e-b3d7-22e830d56695",
    "senderWalletId": "3570003235",
    "senderWalletPin": "1111",
    "recipientBank": "HAK",
    "recipientAccount": "0037320662",
    "partnerReference": "TESTREFERENCE107",
    "payoutChannel": "BANK_TRANSFER",
    "narration": "TestRef101"
}

Request Body Fields

FieldDescription
orderIdThe order ID generated by the Order Creation endpoint
senderWalletIdWallet ID the funds will be debited from
senderWalletPinPIN authorizing the wallet debit
recipientBankBank code of the recipient's bank
recipientAccountRecipient's bank account number
partnerReferencePartner-supplied reference for tracking
payoutChannelChannel used to disburse funds (must be one of the listed IMTO Channels)
narrationDescription/narration for the transaction

Note: payoutChannel should be one of the available IMTO Channels listed above.

Response

{
    "responseCode": "00",
    "responseMessage": "SUCCESS",
    "data": {
        "id": 72822,
        "reference": "b09e0e59-3451-4d18-896f-f7d479629be3",
        "transactionReference": "IMTO20251203083240441000955",
        "clientId": "MX192446",
        "recipientAccount": "0037320662",
        "recipientBank": "HAK",
        "recipientName": "ROTIMI MODUPE AKINRIMISI",
        "sourceAccount": "3570003369",
        "provider": "TS",
        "channel": "BANK_TRANSFER",
        "amount": 2976.00,
        "fee": 13.20,
        "commission": 0.00,
        "currencyCode": "NGN",
        "retryCount": 0,
        "status": "SUCCESSFUL",
        "narration": "TestRef101",
        "reversed": false,
        "walletDebit": true,
        "createdOn": "2025-12-03T08:32:43.77",
        "lastUpdatedOn": "2025-12-03T08:32:53.429307",
        "processingReference": "CR|AFZ|HAK|031225083241|049691"
    }
}

Response Fields

FieldDescription
responseCodeStatus code of the response
responseMessageHuman-readable status message
idInternal numeric ID of the transaction
referenceInternal transaction reference
transactionReferenceUnique transaction reference number
clientIdID of the client that initiated the transaction
recipientAccountRecipient's account number
recipientBankRecipient's bank code
recipientNameName of the recipient on the account
sourceAccountAccount the funds were debited from
providerProcessing provider used
channelPayout channel used
amountAmount disbursed
feeFee charged for the transaction
commissionCommission applied, if any
currencyCodeCurrency of the transaction
retryCountNumber of retry attempts
statusFinal status of the transaction
narrationNarration/description provided
reversedWhether the transaction was reversed
walletDebitWhether the sender's wallet was debited
createdOnTimestamp transaction was created
lastUpdatedOnTimestamp of last update
processingReferenceReference from the downstream processor

Get Transaction

Retrieves an IMTO transaction using orderId.

Endpoint: GET /api/v1/order/transaction/{orderId}

Response

{
    "responseCode": "00",
    "responseMessage": "Successful",
    "data": [
        {
            "createdOn": "2025-12-03 08:32:53",
            "updatedOn": "2025-12-03 08:32:53",
            "lastUpdatedBy": "[email protected]",
            "id": 15137,
            "transactionReference": "IMTO20251203083240441000955",
            "clientId": "MX192446",
            "channel": "BANK_TRANSFER",
            "amount": 2976.00,
            "fee": 13.20,
            "responseCode": "00",
            "responseDescription": "SUCCESS",
            "status": "SUCCESSFUL",
            "narration": "TestRef101",
            "processingReference": "CR|AFZ|HAK|031225083241|049691",
            "walletDebitReference": "357000323580AJDFR0FFZL7WF",
            "orderId": 20246,
            "action": "DEBIT",
            "commission": 0.00
        }
    ]
}

Response Fields

FieldDescription
createdOnTimestamp transaction was created
updatedOnTimestamp of last update
lastUpdatedByUser/system that last updated the record
idInternal numeric ID
transactionReferenceUnique transaction reference
clientIdID of the client
channelPayout channel used
amountTransaction amount
feeFee charged
responseCodeStatus code
responseDescriptionStatus description
statusCurrent transaction status
narrationNarration/description
processingReferenceDownstream processor reference
walletDebitReferenceReference for the wallet debit
orderIdAssociated order ID
actionType of action performed (e.g. DEBIT)
commissionCommission applied

Get Wallet Balance

Retrieve the balance on a wallet.

curl --location '/api/v1/wallet/balance?partnerWalletId={insert wallet id here}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer xx'

The response contains the relevant balance(s) tied to the wallet, please note that balance returned in minor currency.

{
    "responseCode": "00",
    "responseMessage": "Balance retrieved successfully!",
    "data": {
        "ledgerBalance": 25600,
        "availableBalance": 25600
    }
}

Response Fields

FieldDescription
responseCodeStatus code of the response
responseMessageHuman-readable status message
ledgerBalanceTotal ledger balance, in minor currency unit
availableBalanceAvailable (spendable) balance, in minor currency unit