| Direct FX | Pan-African Ramp | |
|---|---|---|
| Currencies | NGN | NGN, GHS, KES, SLE, ZAR, UGX, ZMW, XAF |
| Endpoint | POST /transactions/v2/offramp | POST /transactions/v2/direct_ramp/withdraw |
| Quote first? | No | Yes — the withdrawal needs a quoteId |
| Payout account | In the request body | Registered beforehand, passed as payout_id |
- Direct FX
- Pan-African Ramp
Initiate a sell transaction
POST /transactions/v2/offramp
Body parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
stables | string | ✓ | Stablecoin the user is selling, e.g. USDC |
amount | string | ✓ | Amount of stablecoin |
currency | string | ✓ | Fiat to pay out: NGN |
chargeFeeOnRequest | boolean | Deduct the fee from the payout rather than the amount sent |
const options = {
method: 'POST',
headers: {
accept: 'application/json',
'ngnc-sec-key': 'YOUR_SECRET_KEY',
'content-type': 'application/json'
},
body: JSON.stringify({
stables: 'USDC',
amount: '315',
currency: 'NGN',
account_name: 'Okemdinachi Nwaejie',
account_number: '3338900202',
bank_name: 'Providus Bank'
})
};
fetch('https://api.linkio.world/transactions/v2/offramp', options)
.then(response => response.json())
.then(response => console.log(response))
.catch(err => console.error(err));
import requests
url = "https://api.linkio.world/transactions/v2/offramp"
payload = {
"stables": "USDC",
"amount": "315",
"currency": "NGN",
"account_name": "Okemdinachi Nwaejie",
"account_number": "3338900202",
"bank_name": "Providus Bank"
}
headers = {
"accept": "application/json",
"ngnc-sec-key": "YOUR_SECRET_KEY",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
Response
201 Created{
"code": "TXN_SUCCESSFUL",
"status": "success",
"message": "Transaction Request Successful",
"transaction": {
"transaction_id": "66f2a1c8e4b0f3a7d1c9e5b2",
"business": {
"business_id": "0847363729"
},
"reference": "ret-mukgw7ax-fx0jvi",
"type": "Sell",
"offramp_rate": 1572.4,
"offramp_stables": "USDC",
"amount": "315 USDC",
"payout_currency": "NGN",
"payout_amount": "495306 NGN",
"transaction_status": "Pending",
"account_name": "Okemdinachi Nwaejie",
"account_number": "3338900202",
"bank_name": "Providus Bank",
"date_created": "October 03, 2026 14:31:05",
"date_mongo": "2026-10-03T13:31:05.412Z"
}
}
Step 1 — Register the payout account
POST /transactions/v2/direct_ramp/payout_account
payout_id, so register it before the first withdrawal. You only do this once per account.Step 2 — Get a quote
GET /transactions/v2/direct_ramp/rate_quote
Step 3 — Initiate the withdrawal
POST /transactions/v2/direct_ramp/withdraw
| Parameter | Type | Required | Description |
|---|---|---|---|
quoteId | string | ✓ | From the quote in step 2 |
payout_id | string | ✓ | The registered payout account |
sender_address | string | ✓ | Wallet the stablecoin is sent from |
network | string | ✓ | Chain the stablecoin is sent on |
const params = new URLSearchParams({
quoteId: 'ba7f1d2c-9e44-4c0b-9a3f-2b7c5d8e1a66',
payout_id: '7c2e9f10-4a85-4a0e-bd21-9f3c6e5d8b14',
sender_address: '0x3f1e...a92c',
network: 'Base'
});
const options = {
method: 'POST',
headers: {
accept: 'application/json',
'ngnc-sec-key': 'YOUR_SECRET_KEY'
}
};
fetch(`https://api.linkio.world/transactions/v2/direct_ramp/withdraw?${params}`, options)
.then(response => response.json())
.then(response => console.log(response))
.catch(err => console.error(err));
import requests
url = "https://api.linkio.world/transactions/v2/direct_ramp/withdraw"
params = {
"quoteId": "ba7f1d2c-9e44-4c0b-9a3f-2b7c5d8e1a66",
"payout_id": "7c2e9f10-4a85-4a0e-bd21-9f3c6e5d8b14",
"sender_address": "0x3f1e...a92c",
"network": "Base"
}
headers = {
"accept": "application/json",
"ngnc-sec-key": "YOUR_SECRET_KEY"
}
response = requests.post(url, params=params, headers=headers)
print(response.text)
Response
200 OK{
"status": "Success",
"message": "offramp transaction, reference par-mukgw7ax-qrg0ii has been initiated.",
"date": "2026-10-03 14:35"
}
This response carries no amounts, rate or transaction id — only the reference inside
message. Keep the quoteId and reference from your own records, and rely on webhooks for the payout amount and final status.Retail On-Ramp Retail Rates

