curl --request POST \
--url https://api.pay.izichange.com/v1/payment-intents/direct \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'idempotency-key: <idempotency-key>' \
--data '
{
"requestedCoin": "USDT.TRC20",
"amount": "100",
"customer": {
"firstName": "Awa",
"lastName": "Diallo",
"email": "client@example.com",
"refundAddress": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8"
},
"requestedCurrencyType": "fiat",
"currencyRequested": "XOF",
"merchantReference": "commande-4821",
"idempotencyKey": "charge-2026-07-08-0001",
"metadata": {
"orderId": "4821",
"channel": "web"
}
}
'import requests
url = "https://api.pay.izichange.com/v1/payment-intents/direct"
payload = {
"requestedCoin": "USDT.TRC20",
"amount": "100",
"customer": {
"firstName": "Awa",
"lastName": "Diallo",
"email": "client@example.com",
"refundAddress": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8"
},
"requestedCurrencyType": "fiat",
"currencyRequested": "XOF",
"merchantReference": "commande-4821",
"idempotencyKey": "charge-2026-07-08-0001",
"metadata": {
"orderId": "4821",
"channel": "web"
}
}
headers = {
"idempotency-key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'idempotency-key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
requestedCoin: 'USDT.TRC20',
amount: '100',
customer: {
firstName: 'Awa',
lastName: 'Diallo',
email: 'client@example.com',
refundAddress: 'TJRabPrwbZy45sbavfcjinPJC18kjpRTv8'
},
requestedCurrencyType: 'fiat',
currencyRequested: 'XOF',
merchantReference: 'commande-4821',
idempotencyKey: 'charge-2026-07-08-0001',
metadata: {orderId: '4821', channel: 'web'}
})
};
fetch('https://api.pay.izichange.com/v1/payment-intents/direct', 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.pay.izichange.com/v1/payment-intents/direct",
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([
'requestedCoin' => 'USDT.TRC20',
'amount' => '100',
'customer' => [
'firstName' => 'Awa',
'lastName' => 'Diallo',
'email' => 'client@example.com',
'refundAddress' => 'TJRabPrwbZy45sbavfcjinPJC18kjpRTv8'
],
'requestedCurrencyType' => 'fiat',
'currencyRequested' => 'XOF',
'merchantReference' => 'commande-4821',
'idempotencyKey' => 'charge-2026-07-08-0001',
'metadata' => [
'orderId' => '4821',
'channel' => 'web'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"idempotency-key: <idempotency-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.pay.izichange.com/v1/payment-intents/direct"
payload := strings.NewReader("{\n \"requestedCoin\": \"USDT.TRC20\",\n \"amount\": \"100\",\n \"customer\": {\n \"firstName\": \"Awa\",\n \"lastName\": \"Diallo\",\n \"email\": \"client@example.com\",\n \"refundAddress\": \"TJRabPrwbZy45sbavfcjinPJC18kjpRTv8\"\n },\n \"requestedCurrencyType\": \"fiat\",\n \"currencyRequested\": \"XOF\",\n \"merchantReference\": \"commande-4821\",\n \"idempotencyKey\": \"charge-2026-07-08-0001\",\n \"metadata\": {\n \"orderId\": \"4821\",\n \"channel\": \"web\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("idempotency-key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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.pay.izichange.com/v1/payment-intents/direct")
.header("idempotency-key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"requestedCoin\": \"USDT.TRC20\",\n \"amount\": \"100\",\n \"customer\": {\n \"firstName\": \"Awa\",\n \"lastName\": \"Diallo\",\n \"email\": \"client@example.com\",\n \"refundAddress\": \"TJRabPrwbZy45sbavfcjinPJC18kjpRTv8\"\n },\n \"requestedCurrencyType\": \"fiat\",\n \"currencyRequested\": \"XOF\",\n \"merchantReference\": \"commande-4821\",\n \"idempotencyKey\": \"charge-2026-07-08-0001\",\n \"metadata\": {\n \"orderId\": \"4821\",\n \"channel\": \"web\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pay.izichange.com/v1/payment-intents/direct")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["idempotency-key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"requestedCoin\": \"USDT.TRC20\",\n \"amount\": \"100\",\n \"customer\": {\n \"firstName\": \"Awa\",\n \"lastName\": \"Diallo\",\n \"email\": \"client@example.com\",\n \"refundAddress\": \"TJRabPrwbZy45sbavfcjinPJC18kjpRTv8\"\n },\n \"requestedCurrencyType\": \"fiat\",\n \"currencyRequested\": \"XOF\",\n \"merchantReference\": \"commande-4821\",\n \"idempotencyKey\": \"charge-2026-07-08-0001\",\n \"metadata\": {\n \"orderId\": \"4821\",\n \"channel\": \"web\"\n }\n}"
response = http.request(request)
puts response.read_bodyCreer une charge crypto directe (adresse retournee)
Cree une intention de paiement mono-crypto et retourne directement l’adresse de depot, pour afficher l’adresse + le montant + le QR au client sur le site du marchand sans passer par le widget heberge. Le marchand designe une crypto via requestedCoin (au lieu d’une devise et d’une liste acceptedCoins) et fournit les informations du client. Idempotent via l’en-tete Idempotency-Key.
curl --request POST \
--url https://api.pay.izichange.com/v1/payment-intents/direct \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'idempotency-key: <idempotency-key>' \
--data '
{
"requestedCoin": "USDT.TRC20",
"amount": "100",
"customer": {
"firstName": "Awa",
"lastName": "Diallo",
"email": "client@example.com",
"refundAddress": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8"
},
"requestedCurrencyType": "fiat",
"currencyRequested": "XOF",
"merchantReference": "commande-4821",
"idempotencyKey": "charge-2026-07-08-0001",
"metadata": {
"orderId": "4821",
"channel": "web"
}
}
'import requests
url = "https://api.pay.izichange.com/v1/payment-intents/direct"
payload = {
"requestedCoin": "USDT.TRC20",
"amount": "100",
"customer": {
"firstName": "Awa",
"lastName": "Diallo",
"email": "client@example.com",
"refundAddress": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8"
},
"requestedCurrencyType": "fiat",
"currencyRequested": "XOF",
"merchantReference": "commande-4821",
"idempotencyKey": "charge-2026-07-08-0001",
"metadata": {
"orderId": "4821",
"channel": "web"
}
}
headers = {
"idempotency-key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'idempotency-key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
requestedCoin: 'USDT.TRC20',
amount: '100',
customer: {
firstName: 'Awa',
lastName: 'Diallo',
email: 'client@example.com',
refundAddress: 'TJRabPrwbZy45sbavfcjinPJC18kjpRTv8'
},
requestedCurrencyType: 'fiat',
currencyRequested: 'XOF',
merchantReference: 'commande-4821',
idempotencyKey: 'charge-2026-07-08-0001',
metadata: {orderId: '4821', channel: 'web'}
})
};
fetch('https://api.pay.izichange.com/v1/payment-intents/direct', 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.pay.izichange.com/v1/payment-intents/direct",
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([
'requestedCoin' => 'USDT.TRC20',
'amount' => '100',
'customer' => [
'firstName' => 'Awa',
'lastName' => 'Diallo',
'email' => 'client@example.com',
'refundAddress' => 'TJRabPrwbZy45sbavfcjinPJC18kjpRTv8'
],
'requestedCurrencyType' => 'fiat',
'currencyRequested' => 'XOF',
'merchantReference' => 'commande-4821',
'idempotencyKey' => 'charge-2026-07-08-0001',
'metadata' => [
'orderId' => '4821',
'channel' => 'web'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"idempotency-key: <idempotency-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.pay.izichange.com/v1/payment-intents/direct"
payload := strings.NewReader("{\n \"requestedCoin\": \"USDT.TRC20\",\n \"amount\": \"100\",\n \"customer\": {\n \"firstName\": \"Awa\",\n \"lastName\": \"Diallo\",\n \"email\": \"client@example.com\",\n \"refundAddress\": \"TJRabPrwbZy45sbavfcjinPJC18kjpRTv8\"\n },\n \"requestedCurrencyType\": \"fiat\",\n \"currencyRequested\": \"XOF\",\n \"merchantReference\": \"commande-4821\",\n \"idempotencyKey\": \"charge-2026-07-08-0001\",\n \"metadata\": {\n \"orderId\": \"4821\",\n \"channel\": \"web\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("idempotency-key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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.pay.izichange.com/v1/payment-intents/direct")
.header("idempotency-key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"requestedCoin\": \"USDT.TRC20\",\n \"amount\": \"100\",\n \"customer\": {\n \"firstName\": \"Awa\",\n \"lastName\": \"Diallo\",\n \"email\": \"client@example.com\",\n \"refundAddress\": \"TJRabPrwbZy45sbavfcjinPJC18kjpRTv8\"\n },\n \"requestedCurrencyType\": \"fiat\",\n \"currencyRequested\": \"XOF\",\n \"merchantReference\": \"commande-4821\",\n \"idempotencyKey\": \"charge-2026-07-08-0001\",\n \"metadata\": {\n \"orderId\": \"4821\",\n \"channel\": \"web\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pay.izichange.com/v1/payment-intents/direct")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["idempotency-key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"requestedCoin\": \"USDT.TRC20\",\n \"amount\": \"100\",\n \"customer\": {\n \"firstName\": \"Awa\",\n \"lastName\": \"Diallo\",\n \"email\": \"client@example.com\",\n \"refundAddress\": \"TJRabPrwbZy45sbavfcjinPJC18kjpRTv8\"\n },\n \"requestedCurrencyType\": \"fiat\",\n \"currencyRequested\": \"XOF\",\n \"merchantReference\": \"commande-4821\",\n \"idempotencyKey\": \"charge-2026-07-08-0001\",\n \"metadata\": {\n \"orderId\": \"4821\",\n \"channel\": \"web\"\n }\n}"
response = http.request(request)
puts response.read_bodyAutorisations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
En-têtes
Cle d'idempotence (recommandee) pour eviter les doublons en cas de rejeu.
Corps
Cryptomonnaie demandée, qualifiée par son réseau. Ex : USDT.TRC20, USDT.BEP20, BTC, ETH. Un code sans réseau (ex : USDT) n'est accepté que s'il ne reste qu'un seul réseau actif pour cette cryptomonnaie sur votre compte.
"USDT.TRC20"
Montant à recevoir, libellé dans requestedCoin. Chaîne de caractères, jamais un nombre JSON : un montant passé en number est arrondi par la précision flottante. Jusqu'à 18 décimales, et strictement supérieur à zéro.
^(?=.*[1-9])\d{1,18}(\.\d{1,18})?$"100"
Identité du client final. Obligatoire : ce parcours se déroule sur votre site, IzichangePay ne collecte donc pas ces informations lui-même.
Show child attributes
Show child attributes
Devise dans laquelle amount est libellé, comme pour POST /v1/payment-intents :
crypto(défaut) :amountest exprimé dansrequestedCoin, et c'est exactement ce que le client doit envoyer.fiat:amountest exprimé dans la devise fiatcurrencyRequested(ex.XOF). Il est converti enrequestedCoinau cours du moment, et la réponse renvoie le montant crypto à envoyer (amountToSend), verrouillé jusqu'à l'expiration.
crypto, fiat "fiat"
Devise fiat de amount (code ISO-4217 : XOF, EUR, USD…). Obligatoire quand requestedCurrencyType vaut fiat, ignorée sinon.
"XOF"
Référence libre côté marchand (numéro de commande, identifiant ERP…). Reprise telle quelle dans les réponses de l'API, les webhooks et le tableau de bord.
"commande-4821"
Clé d'idempotence. Rejouer la même clé retourne le paiement déjà créé au lieu d'en créer un second — indispensable pour un retry réseau sûr. Peut aussi être transmise via l'en-tête Idempotency-Key.
"charge-2026-07-08-0001"
Données arbitraires (paires clé/valeur) attachées au paiement. Restituées telles quelles dans les réponses de l'API et les webhooks.
{ "orderId": "4821", "channel": "web" }
Reverse automatiquement ce paiement en fiat dès qu'il est complété — mêmes champs et mêmes règles que autoSettlement sur POST /v1/payment-intents. Vérifié à la création : une destination inutilisable, ou une requestedCoin que le partenaire ne sait pas reverser vers votre compte, renvoie une erreur AUTO_SETTLEMENT_… immédiatement.
Show child attributes
Show child attributes
Réponse
Intention creee + adresse allouee. Renvoie depositAddress, memo/memoType (chaines a tag), amountToSend/amountCryptoExpected, expiresAt/expiryHours.