curl --request POST \
--url https://api.linkio.world/otc/onramp \
--header 'Content-Type: application/json' \
--header 'ngnc-sec-key: <api-key>' \
--data '
{
"customer_id": "<string>",
"amount": "<string>",
"wallet_address": "<string>",
"paymentDetails": {
"accountNumber": "<string>",
"routingNumber": "<string>",
"accountName": "<string>",
"bankName": "<string>"
}
}
'import requests
url = "https://api.linkio.world/otc/onramp"
payload = {
"customer_id": "<string>",
"amount": "<string>",
"wallet_address": "<string>",
"paymentDetails": {
"accountNumber": "<string>",
"routingNumber": "<string>",
"accountName": "<string>",
"bankName": "<string>"
}
}
headers = {
"ngnc-sec-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'ngnc-sec-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_id: '<string>',
amount: '<string>',
wallet_address: '<string>',
paymentDetails: {
accountNumber: '<string>',
routingNumber: '<string>',
accountName: '<string>',
bankName: '<string>'
}
})
};
fetch('https://api.linkio.world/otc/onramp', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.linkio.world/otc/onramp",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'customer_id' => '<string>',
'amount' => '<string>',
'wallet_address' => '<string>',
'paymentDetails' => [
'accountNumber' => '<string>',
'routingNumber' => '<string>',
'accountName' => '<string>',
'bankName' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"ngnc-sec-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.linkio.world/otc/onramp"
payload := strings.NewReader("{\n \"customer_id\": \"<string>\",\n \"amount\": \"<string>\",\n \"wallet_address\": \"<string>\",\n \"paymentDetails\": {\n \"accountNumber\": \"<string>\",\n \"routingNumber\": \"<string>\",\n \"accountName\": \"<string>\",\n \"bankName\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("ngnc-sec-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.linkio.world/otc/onramp")
.header("ngnc-sec-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customer_id\": \"<string>\",\n \"amount\": \"<string>\",\n \"wallet_address\": \"<string>\",\n \"paymentDetails\": {\n \"accountNumber\": \"<string>\",\n \"routingNumber\": \"<string>\",\n \"accountName\": \"<string>\",\n \"bankName\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linkio.world/otc/onramp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["ngnc-sec-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_id\": \"<string>\",\n \"amount\": \"<string>\",\n \"wallet_address\": \"<string>\",\n \"paymentDetails\": {\n \"accountNumber\": \"<string>\",\n \"routingNumber\": \"<string>\",\n \"accountName\": \"<string>\",\n \"bankName\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"code": "TXN_SUCCESSFUL",
"status": "Success",
"message": "<string>",
"data": {
"transaction_id": "<string>",
"reference": "link-otc-12345678",
"type": "onramp",
"currency": "<string>",
"amount": "<string>",
"stables": "<string>",
"payout_amount": "<string>",
"rate": 123,
"transaction_status": "pending",
"payment_method": "<string>",
"date_created": "<string>"
}
}B2B Onramp
Initiate a fiat → stablecoin onramp via LINK’s B2B API. Provide core transaction details plus your banking details (the account you are paying FROM). Once a transaction (onramp) has been initiated, settlement account details are delivered to you through a banking_details_received webhook.
curl --request POST \
--url https://api.linkio.world/otc/onramp \
--header 'Content-Type: application/json' \
--header 'ngnc-sec-key: <api-key>' \
--data '
{
"customer_id": "<string>",
"amount": "<string>",
"wallet_address": "<string>",
"paymentDetails": {
"accountNumber": "<string>",
"routingNumber": "<string>",
"accountName": "<string>",
"bankName": "<string>"
}
}
'import requests
url = "https://api.linkio.world/otc/onramp"
payload = {
"customer_id": "<string>",
"amount": "<string>",
"wallet_address": "<string>",
"paymentDetails": {
"accountNumber": "<string>",
"routingNumber": "<string>",
"accountName": "<string>",
"bankName": "<string>"
}
}
headers = {
"ngnc-sec-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'ngnc-sec-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_id: '<string>',
amount: '<string>',
wallet_address: '<string>',
paymentDetails: {
accountNumber: '<string>',
routingNumber: '<string>',
accountName: '<string>',
bankName: '<string>'
}
})
};
fetch('https://api.linkio.world/otc/onramp', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.linkio.world/otc/onramp",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'customer_id' => '<string>',
'amount' => '<string>',
'wallet_address' => '<string>',
'paymentDetails' => [
'accountNumber' => '<string>',
'routingNumber' => '<string>',
'accountName' => '<string>',
'bankName' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"ngnc-sec-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.linkio.world/otc/onramp"
payload := strings.NewReader("{\n \"customer_id\": \"<string>\",\n \"amount\": \"<string>\",\n \"wallet_address\": \"<string>\",\n \"paymentDetails\": {\n \"accountNumber\": \"<string>\",\n \"routingNumber\": \"<string>\",\n \"accountName\": \"<string>\",\n \"bankName\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("ngnc-sec-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.linkio.world/otc/onramp")
.header("ngnc-sec-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customer_id\": \"<string>\",\n \"amount\": \"<string>\",\n \"wallet_address\": \"<string>\",\n \"paymentDetails\": {\n \"accountNumber\": \"<string>\",\n \"routingNumber\": \"<string>\",\n \"accountName\": \"<string>\",\n \"bankName\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linkio.world/otc/onramp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["ngnc-sec-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_id\": \"<string>\",\n \"amount\": \"<string>\",\n \"wallet_address\": \"<string>\",\n \"paymentDetails\": {\n \"accountNumber\": \"<string>\",\n \"routingNumber\": \"<string>\",\n \"accountName\": \"<string>\",\n \"bankName\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"code": "TXN_SUCCESSFUL",
"status": "Success",
"message": "<string>",
"data": {
"transaction_id": "<string>",
"reference": "link-otc-12345678",
"type": "onramp",
"currency": "<string>",
"amount": "<string>",
"stables": "<string>",
"payout_amount": "<string>",
"rate": 123,
"transaction_status": "pending",
"payment_method": "<string>",
"date_created": "<string>"
}
}Authorizations
Body
Your platform’s customer ID for this transaction.
Fiat currency being sent.
AED, AOA, BIF, CDF, DZD, EGP, ETB, EUR, GBP, GHS, LYD, MAD, MUR, MWK, MZN, NGN, SGD, SLE, SSP, TRY, TZS, UGX, USD, XAF, XOF Fiat amount being sent.
Stablecoin to receive.
USDC, USDT Destination wallet address for the stablecoin.
Blockchain network for the stablecoin. USDT → TRON, POLYGON, or SOLANA. USDC → ETHEREUM, BSC, POLYGON, BASE, SOLANA, or STELLAR.
TRON, ETHEREUM, BSC, POLYGON, SOLANA, BASE, STELLAR Your banking details — the account you are paying FROM. Required fields depend on your currency’s payment method. Call GET /otc/rate_quote first to get the paymentMethod for your currency.
- ACH (USD)
- Local Bank Transfer (NGN, BIF, CDF, DZD, ETB, GBP, GHS, LYD, MUR, MWK, MZN, SGD, SLE, SSP, TZS, UGX)
- IBAN (AED, AOA, EGP, EUR, GBP, TRY)
- RIB (MAD, XAF, XOF)
Show child attributes
Show child attributes

