v1.0

Ntradex API

The Ntradex API gives your business direct access to our cross-border payments and settlement network โ€” covering 4800+ corridors across Africa, North America, and Australia.

๐Ÿ’ธ
Send a payout
Pay beneficiaries across 40+ corridors
๐Ÿ”„
Convert currencies
FX exchange between your wallets
๐Ÿฆ
Virtual accounts
Issue NGN virtual accounts for collections

Base URL

All API requests are made to the base URL below. Append every endpoint path shown in this documentation to it.
https://api.ntradex.ca/api

Staging

A staging environment is available for integration testing. Credentials and transactions in staging are fully isolated from production.

https://staging.ntradex.ca/api

Rate Limits

TierLimit
Standard100 requests / minute
Elevated500 requests / minute โ€” contact business@ntradex.ca
Quick example โ€” list your wallets
curl -X GET \
  https://api.ntradex.ca/api/v1/business/{business_id}/wallets \
  -H "Authorization: Bearer YOUR_TOKEN"
const res = await fetch(
  `https://api.ntradex.ca/api/v1/business/${businessId}/wallets`,
  { headers: { 'Authorization': `Bearer ${token}` } }
);
const data = await res.json();
import requests
res = requests.get(
    f"https://api.ntradex.ca/api/v1/business/{business_id}/wallets",
    headers={"Authorization": f"Bearer {token}"}
)
Response
{
  "message": "success",
  "data": [
    {
      "id": "wal_cad_001",
      "currency": "CAD",
      "balance": 12450.00,
      "is_default": true,
      "status": "active"
    },
    {
      "id": "wal_ngn_002",
      "currency": "NGN",
      "balance": 5800000.00,
      "is_default": false,
      "status": "active"
    }
  ]
}

Authentication

The Ntradex API uses Bearer token authentication. After logging in, include the returned token in the Authorization header of every subsequent request.

Never expose your token in client-side code. Always make authenticated API calls from your server.

Login

Authenticate your business account. Returns an access token and a list of business accounts associated with the user.

POST/v1/business/login
ParameterTypeRequiredDescription
emailstringrequiredBusiness account email address
passwordstringoptionalAccount password
passcodestringoptional6-digit passcode (alternative to password)

OTP Login (2-step)

For enhanced security, use the two-step OTP login flow.

POST/v1/business/login-send-otp

Validates credentials and sends a one-time password to the user's registered email.

POST/v1/business/login-with-otp

Completes authentication using the OTP. Returns the access token.

Using the token

Authorization: Bearer <your_token>
POST /v1/business/login
curl -X POST \
  https://api.ntradex.ca/api/v1/business/login \
  -H "Content-Type: application/json" \
  -d '{"email":"ops@yourcompany.com","password":"your_password"}'
fetch('https://api.ntradex.ca/api/v1/business/login', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    email: 'ops@yourcompany.com',
    password: 'your_password'
  })
})
res = requests.post(
    "https://api.ntradex.ca/api/v1/business/login",
    json={"email": "ops@yourcompany.com", "password": "your_password"}
)
token = res.json()["data"]["token"]
Response
{
  "message": "Login successful",
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6...",
    "user": {
      "id": "usr_abc123",
      "email": "ops@yourcompany.com"
    },
    "businesses": [
      {
        "id": "biz_xyz789",
        "business_name": "Acme Transfers Ltd"
      }
    ]
  }
}

Customers

Customers represent your end-users or beneficiaries โ€” the people and entities your business sends money to. Each customer holds payout details for a specific corridor.

GET/v1/business/{business_id}/customers
POST/v1/business/{business_id}/customers
GET/v1/business/{business_id}/customers/{customer_id}
PATCH/v1/business/{business_id}/customers/{customer_id}
GET/v1/business/{business_id}/customers/recent

Create customer parameters

ParameterTypeDescription
customer_namestringFull name of the customer
emailstringCustomer email
phone_numberstringCustomer phone number
currencystringPayout currency (e.g. NGN, GHS, CAD, AUD)
account_numberstringBank account number (Africa corridors)
bank_namestringBank name
bank_codestringBank sort/routing code
interac_e_transfer_emailstringInterac e-Transfer email (Canada)
bsb_codestringBSB code (Australia)
iban / bicstringIBAN and BIC (European corridors)
countrystringCustomer's country
categorystringInternal customer segment
POST โ€” Create customer (NGN corridor)
curl -X POST \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/customers \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_name": "Emeka Okafor",
    "email": "emeka@email.com",
    "phone_number": "+2348012345678",
    "currency": "NGN",
    "account_number": "0123456789",
    "bank_name": "Access Bank",
    "bank_code": "044",
    "country": "Nigeria"
  }'
fetch(`.../${businessId}/customers`, {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    customer_name: 'Emeka Okafor',
    currency: 'NGN',
    account_number: '0123456789',
    bank_code: '044',
    country: 'Nigeria'
  })
})
requests.post(
    f".../{business_id}/customers",
    headers={"Authorization": f"Bearer {token}"},
    json={
        "customer_name": "Emeka Okafor",
        "currency": "NGN",
        "account_number": "0123456789",
        "bank_code": "044"
    }
)
Response
{
  "message": "Customer created",
  "data": {
    "id": "cust_abc001",
    "customer_name": "Emeka Okafor",
    "currency": "NGN",
    "bank_name": "Access Bank",
    "account_number": "0123456789",
    "created_at": "2026-03-27T09:00:00Z"
  }
}

Wallets

Each business holds multiple wallets across currencies. Wallets are the source and destination of all money movement on the platform.

GET/v1/business/{business_id}/wallets

Returns all wallets with live balance and currency details.

POST/v1/business/{business_id}/wallets/create
ParameterTypeRequiredDescription
currencystringrequiredISO 4217 currency code (e.g. CAD, NGN, GHS, AUD)
GET/v1/business/{business_id}/wallets/limits

Returns transaction and balance limits applicable to each wallet.

GET/v1/wallets/balance

Get wallet balances for the authenticated session.

POST โ€” Create wallet
curl -X POST \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/wallets/create \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"currency": "AUD"}'
fetch(`.../${businessId}/wallets/create`, {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ currency: 'AUD' })
})
requests.post(
    f".../{business_id}/wallets/create",
    headers={"Authorization": f"Bearer {token}"},
    json={"currency": "AUD"}
)
GET wallets โ€” Response
{
  "message": "success",
  "data": [
    {
      "id": "wal_cad_001",
      "currency": "CAD",
      "balance": 12450.00,
      "is_default": true,
      "status": "active"
    },
    {
      "id": "wal_ngn_002",
      "currency": "NGN",
      "balance": 5800000.00,
      "is_default": false,
      "status": "active"
    }
  ]
}

Exchange Rates

Retrieve live exchange rates for the currency pairs available to your business. Rates are real-time and reflect current market conditions plus Ntradex's blended spread.

GET/v1/business/{business_id}/exchange-rates

Returns rates for all currency pairs configured for the business.

GET/v1/currencies

Returns the full list of currencies supported on the Ntradex network.

Key corridors

NG โ†’ CA GH โ†’ CA NG โ†’ AU KE โ†’ AU ZA โ†’ CA ZA โ†’ AU GH โ†’ AU DA โ†’ NG
GET /v1/business/{business_id}/exchange-rates
curl -X GET \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/exchange-rates \
  -H "Authorization: Bearer YOUR_TOKEN"
fetch(`.../${businessId}/exchange-rates`,
  { headers: { 'Authorization': `Bearer ${token}` } }
)
requests.get(
    f".../{business_id}/exchange-rates",
    headers={"Authorization": f"Bearer {token}"}
)
Response
{
  "message": "success",
  "data": [
    {
      "from_currency": "CAD",
      "to_currency": "NGN",
      "rate": 1205.50,
      "updated_at": "2026-03-27T12:00:00Z"
    },
    {
      "from_currency": "CAD",
      "to_currency": "GHS",
      "rate": 10.84,
      "updated_at": "2026-03-27T12:00:00Z"
    }
  ]
}

Payouts

Send funds from a business wallet to a registered customer. The payout debits the specified wallet and delivers to the customer's bank account, mobile money, or Interac e-Transfer.

Always call the fee endpoint before initiating a payout so you can show the total cost to your users before they confirm.
POST/v1/business/{business_id}/payout/fee
ParameterTypeRequiredDescription
amountnumberrequiredAmount to send
currencystringrequiredCurrency of the sending wallet
POST/v1/business/{business_id}/payout
ParameterTypeRequiredDescription
wallet_idstringrequiredID of the sending wallet
customer_idstringrequiredID of the recipient customer
amountnumberrequiredAmount in the wallet's currency
remarkstringoptionalPayment reference or memo visible to recipient
POST โ€” Fee check then payout
# 1. Check fee
curl -X POST \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/payout/fee \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"amount": 500, "currency": "CAD"}'

# 2. Send payout
curl -X POST \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/payout \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "wallet_id": "wal_cad_001",
    "customer_id": "cust_abc001",
    "amount": 500,
    "remark": "Invoice #1042"
  }'
// 1. Fee check
const fee = await fetch(`.../${businessId}/payout/fee`, {
  method: 'POST',
  body: JSON.stringify({ amount: 500, currency: 'CAD' })
}).then(r => r.json());

// 2. Payout
const payout = await fetch(`.../${businessId}/payout`, {
  method: 'POST',
  body: JSON.stringify({
    wallet_id: 'wal_cad_001',
    customer_id: 'cust_abc001',
    amount: 500, remark: 'Invoice #1042'
  })
}).then(r => r.json());
fee = requests.post(
    f".../{bid}/payout/fee", headers=auth,
    json={"amount": 500, "currency": "CAD"}
).json()

payout = requests.post(
    f".../{bid}/payout", headers=auth,
    json={
        "wallet_id": "wal_cad_001",
        "customer_id": "cust_abc001",
        "amount": 500,
        "remark": "Invoice #1042"
    }
).json()
Payout response
{
  "message": "Payout initiated",
  "data": {
    "transaction_id": "txn_8a9b3c",
    "status": "processing",
    "amount": 500.00,
    "currency": "CAD",
    "fee": 4.50,
    "recipient": "Emeka Okafor",
    "created_at": "2026-03-27T12:05:00Z"
  }
}

Deposits

Fund a business wallet by initiating a deposit. After initiation, the deposit must be confirmed with payment proof or a reference before it is credited.

POST/v1/business/{business_id}/deposit
ParameterTypeRequiredDescription
wallet_idstringrequiredWallet to credit
amountnumberrequiredAmount to deposit
payment_method_idstringrequiredPayment method to use (from /payment-methods)
referencestringoptionalYour internal deposit reference
POST/v1/business/{business_id}/deposit/confirm

Confirm a pending deposit once payment is complete.

POST โ€” Initiate deposit
curl -X POST \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/deposit \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "wallet_id": "wal_cad_001",
    "amount": 10000,
    "payment_method_id": "pm_interac_001",
    "reference": "DEP-2026-0042"
  }'
fetch(`.../${businessId}/deposit`, {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    wallet_id: 'wal_cad_001', amount: 10000,
    payment_method_id: 'pm_interac_001'
  })
})
requests.post(
    f".../{business_id}/deposit",
    headers={"Authorization": f"Bearer {token}"},
    json={
        "wallet_id": "wal_cad_001",
        "amount": 10000,
        "payment_method_id": "pm_interac_001"
    }
)
Response
{
  "message": "Deposit initiated",
  "data": {
    "deposit_id": "dep_001",
    "status": "pending",
    "amount": 10000.00,
    "currency": "CAD"
  }
}

FX Exchange

Convert funds between your business wallets at the prevailing Ntradex rate. Use the fee endpoint first to show your users the exact rate and cost before they confirm.

POST/v1/business/{business_id}/exchange/fee
ParameterTypeRequiredDescription
amountnumberrequiredAmount to convert
from_currencystringrequiredSource currency (e.g. CAD)
to_currencystringrequiredTarget currency (e.g. NGN)
POST/v1/business/{business_id}/exchange
ParameterTypeRequiredDescription
from_wallet_idstringrequiredWallet to debit
to_wallet_idstringrequiredWallet to credit
amountnumberrequiredAmount in source currency
POST โ€” FX exchange CAD to NGN
# 1. Check fee
curl -X POST \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/exchange/fee \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 1000,
    "from_currency": "CAD",
    "to_currency": "NGN"
  }'

# 2. Execute exchange
curl -X POST \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/exchange \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "from_wallet_id": "wal_cad_001",
    "to_wallet_id": "wal_ngn_002",
    "amount": 1000
  }'
fetch(`.../${businessId}/exchange`, {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    from_wallet_id: 'wal_cad_001',
    to_wallet_id: 'wal_ngn_002',
    amount: 1000
  })
})
requests.post(
    f".../{business_id}/exchange",
    headers={"Authorization": f"Bearer {token}"},
    json={
        "from_wallet_id": "wal_cad_001",
        "to_wallet_id": "wal_ngn_002",
        "amount": 1000
    }
)
Exchange response
{
  "message": "Exchange successful",
  "data": {
    "transaction_id": "txn_fx_001",
    "from_currency": "CAD",
    "to_currency": "NGN",
    "amount_sent": 1000.00,
    "amount_received": 1205500.00,
    "rate": 1205.50,
    "fee": 9.00,
    "status": "completed"
  }
}

Transactions

Query the full transaction history for your business with rich filtering, search, and pagination.

GET/v1/business/{business_id}/transactions

Query parameters

ParameterTypeDescription
transaction_typestringFilter by type: payout, deposit, exchange
statusstringpending, processing, completed, failed
currencystringFilter by currency code
amount_gt / amount_lt / amount_eqnumberAmount range filters
date_after / date_before / date_exactstringDate range filters (ISO 8601)
searchstringSearch across tracking ID, reference, beneficiary, remark
orderingstringSort field โ€” prefix - for descending (e.g. -created_at)
page / page_sizeintegerPagination (default page_size: 20)
GET/v1/business/{business_id}/transactions/{transaction_id}

Full detail for a single transaction, including status history and payout breakdown.

GET โ€” List with filters
curl -G \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/transactions \
  -H "Authorization: Bearer YOUR_TOKEN" \
  --data-urlencode "status=completed" \
  --data-urlencode "currency=CAD" \
  --data-urlencode "ordering=-created_at" \
  --data-urlencode "page_size=20"
const params = new URLSearchParams({
  status: 'completed', currency: 'CAD',
  ordering: '-created_at', page_size: '20'
});
fetch(`.../${businessId}/transactions?${params}`, {
  headers: { 'Authorization': `Bearer ${token}` }
})
requests.get(
    f".../{business_id}/transactions",
    headers={"Authorization": f"Bearer {token}"},
    params={
        "status": "completed",
        "currency": "CAD",
        "ordering": "-created_at",
        "page_size": 20
    }
)
Response
{
  "message": "success",
  "data": {
    "count": 143,
    "next": "https://api.ntradex.ca/api/v1/.../transactions?page=2",
    "previous": null,
    "results": [
      {
        "id": "txn_8a9b3c",
        "type": "payout",
        "status": "completed",
        "amount": 500.00,
        "currency": "CAD",
        "created_at": "2026-03-27T12:05:00Z"
      }
    ]
  }
}

Virtual Accounts

Issue dedicated virtual bank accounts to collect inbound payments. Currently supports NGN virtual accounts for Nigerian collections via local bank transfer.

GET/v1/business/{business_id}/virtual-accounts

Returns all virtual accounts issued to the business.

POST/v1/business/{business_id}/ngn-virtual-account/onboard

Issue a new NGN virtual account. Transfers to this account automatically credit your NGN wallet.

POST โ€” Issue NGN virtual account
curl -X POST \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/ngn-virtual-account/onboard \
  -H "Authorization: Bearer YOUR_TOKEN"
fetch(`.../${businessId}/ngn-virtual-account/onboard`, {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${token}` }
})
requests.post(
    f".../{business_id}/ngn-virtual-account/onboard",
    headers={"Authorization": f"Bearer {token}"}
)
Response
{
  "message": "Virtual account issued",
  "data": {
    "account_number": "0123456789",
    "bank_name": "Wema Bank",
    "account_name": "Acme Transfers / Ntradex",
    "currency": "NGN",
    "status": "active"
  }
}

Payment Methods

Retrieve the payment methods available to your business for funding wallets. Available methods vary by country and configured currencies.

GET/v1/business/{business_id}/payment-methods

Returns all active payment methods including type, supported currencies, and deposit limits.

GET/v1/banks/

Returns supported banks for a given country. Use when creating customers for bank transfer corridors.

GET /v1/business/{business_id}/payment-methods
curl -X GET \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/payment-methods \
  -H "Authorization: Bearer YOUR_TOKEN"
fetch(`.../${businessId}/payment-methods`,
  { headers: { 'Authorization': `Bearer ${token}` } }
)
requests.get(
    f".../{business_id}/payment-methods",
    headers={"Authorization": f"Bearer {token}"}
)
Response
{
  "message": "success",
  "data": [
    {
      "id": "pm_interac_001",
      "name": "Interac e-Transfer",
      "currency": "CAD",
      "min_amount": 10.00,
      "max_amount": 25000.00,
      "status": "active"
    }
  ]
}

Team Management

Invite team members to your business account. Invited users must have a verified Ntradex account (KYC Cadre 1) before accepting.

GET/v1/business/{business_id}/invites
POST/v1/business/{business_id}/invites
GET/v1/business/invites/me

Returns all pending business invites for the authenticated user.

POST/v1/business/invites/{invite_id}/accept

Accept a business invite. User is added to the business upon acceptance.

POST โ€” Invite a team member
curl -X POST \
  https://api.ntradex.ca/api/v1/business/biz_xyz789/invites \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"email": "teammate@yourcompany.com"}'
fetch(`.../${businessId}/invites`, {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ email: 'teammate@yourcompany.com' })
})
requests.post(
    f".../{business_id}/invites",
    headers={"Authorization": f"Bearer {token}"},
    json={"email": "teammate@yourcompany.com"}
)
Response
{
  "message": "Invite sent",
  "data": {
    "invite_id": "inv_001",
    "email": "teammate@yourcompany.com",
    "status": "pending",
    "expires_at": "2026-04-03T12:00:00Z"
  }
}

Errors

The Ntradex API uses standard HTTP status codes. Error responses return a JSON body with a message field and, where applicable, an errors object with field-level detail.

CodeMeaning
200 OKRequest succeeded
201 CreatedResource created successfully
400 Bad RequestInvalid request โ€” check the errors field
401 UnauthorizedMissing or invalid Bearer token
403 ForbiddenAuthenticated but not permitted (e.g. KYB pending)
404 Not FoundResource does not exist
429 Too Many RequestsRate limit exceeded
500 Internal Server ErrorServer-side error โ€” contact support
401 โ€” Missing token
HTTP/1.1 401 Unauthorized

{
  "message": "Authentication credentials were not provided.",
  "errors": {}
}
400 โ€” Validation error
HTTP/1.1 400 Bad Request

{
  "message": "Validation error",
  "errors": {
    "customer_id": [
      "Customer does not belong to this business."
    ],
    "amount": [
      "Insufficient wallet balance."
    ]
  }
}
403 โ€” KYB required
HTTP/1.1 403 Forbidden

{
  "message": "KYB verification required before processing transactions.",
  "errors": {}
}

Changelog

v1.0 โ€” March 2026

Initial release of the Ntradex Business API.

Includes: business registration and authentication, KYB and director management, multi-currency wallets, payouts to 40+ corridors, FX exchange, deposits, NGN virtual accounts, full transaction history with filtering and pagination, team invites, payment methods, and exchange rates.

This is a living document. As new endpoints go live, this page will be updated. Questions? business@ntradex.ca
Coming soon
Webhooks       real-time transaction event notifications
Bulk payouts   batch multiple transfers in one call
SDKs           Node.js  ยท  Python  ยท  PHP
Sandbox keys  self-serve test credentials via dashboard