curl --request POST \
--url https://api.pay.izichange.com/v1/payouts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"assetCode": "USDT.TRC20",
"amount": "125.50",
"destinationAddress": "TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC",
"amountType": "crypto",
"fiatCurrency": "XOF",
"destinationMemo": "1234567890",
"note": "Paiement fournisseur juillet",
"merchantReference": "facture-4821",
"idempotencyKey": "payout-2026-07-08-0001",
"totpCode": "123456",
"feeBearer": "merchant"
}
'import requests
url = "https://api.pay.izichange.com/v1/payouts"
payload = {
"assetCode": "USDT.TRC20",
"amount": "125.50",
"destinationAddress": "TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC",
"amountType": "crypto",
"fiatCurrency": "XOF",
"destinationMemo": "1234567890",
"note": "Paiement fournisseur juillet",
"merchantReference": "facture-4821",
"idempotencyKey": "payout-2026-07-08-0001",
"totpCode": "123456",
"feeBearer": "merchant"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
assetCode: 'USDT.TRC20',
amount: '125.50',
destinationAddress: 'TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC',
amountType: 'crypto',
fiatCurrency: 'XOF',
destinationMemo: '1234567890',
note: 'Paiement fournisseur juillet',
merchantReference: 'facture-4821',
idempotencyKey: 'payout-2026-07-08-0001',
totpCode: '123456',
feeBearer: 'merchant'
})
};
fetch('https://api.pay.izichange.com/v1/payouts', 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/payouts",
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([
'assetCode' => 'USDT.TRC20',
'amount' => '125.50',
'destinationAddress' => 'TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC',
'amountType' => 'crypto',
'fiatCurrency' => 'XOF',
'destinationMemo' => '1234567890',
'note' => 'Paiement fournisseur juillet',
'merchantReference' => 'facture-4821',
'idempotencyKey' => 'payout-2026-07-08-0001',
'totpCode' => '123456',
'feeBearer' => 'merchant'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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/payouts"
payload := strings.NewReader("{\n \"assetCode\": \"USDT.TRC20\",\n \"amount\": \"125.50\",\n \"destinationAddress\": \"TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC\",\n \"amountType\": \"crypto\",\n \"fiatCurrency\": \"XOF\",\n \"destinationMemo\": \"1234567890\",\n \"note\": \"Paiement fournisseur juillet\",\n \"merchantReference\": \"facture-4821\",\n \"idempotencyKey\": \"payout-2026-07-08-0001\",\n \"totpCode\": \"123456\",\n \"feeBearer\": \"merchant\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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/payouts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"assetCode\": \"USDT.TRC20\",\n \"amount\": \"125.50\",\n \"destinationAddress\": \"TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC\",\n \"amountType\": \"crypto\",\n \"fiatCurrency\": \"XOF\",\n \"destinationMemo\": \"1234567890\",\n \"note\": \"Paiement fournisseur juillet\",\n \"merchantReference\": \"facture-4821\",\n \"idempotencyKey\": \"payout-2026-07-08-0001\",\n \"totpCode\": \"123456\",\n \"feeBearer\": \"merchant\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pay.izichange.com/v1/payouts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assetCode\": \"USDT.TRC20\",\n \"amount\": \"125.50\",\n \"destinationAddress\": \"TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC\",\n \"amountType\": \"crypto\",\n \"fiatCurrency\": \"XOF\",\n \"destinationMemo\": \"1234567890\",\n \"note\": \"Paiement fournisseur juillet\",\n \"merchantReference\": \"facture-4821\",\n \"idempotencyKey\": \"payout-2026-07-08-0001\",\n \"totpCode\": \"123456\",\n \"feeBearer\": \"merchant\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"merchantReference": {},
"payoutType": "<string>",
"amount": "<string>",
"assetCode": "<string>",
"destinationAddress": "<string>",
"destinationType": "<string>",
"destinationMemo": {},
"feeAmount": "<string>",
"networkFeeAmount": {},
"networkFeeAssetCode": {},
"networkFeeUsdEquivalent": {},
"txid": "9f4c1a2b3d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8",
"txUrl": "https://tronscan.org/#/transaction/9f4c1a2b3d5e6f70",
"status": "<string>",
"failureReason": {},
"feeBearer": "<string>",
"kytStatus": {},
"createdAt": "<string>",
"updatedAt": "<string>",
"statusHistory": [
{}
]
}Créer un retrait
Crée un payout (retrait crypto). La destination peut être une adresse blockchain ou un email d’un autre compte IzichangePay (route automatiquement vers un transfert interne). Pour les chaînes memo-type (XRP, TON, Stellar), destinationMemo est obligatoire. Le header Idempotency-Key est recommandé pour permettre les retries sûrs.
curl --request POST \
--url https://api.pay.izichange.com/v1/payouts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"assetCode": "USDT.TRC20",
"amount": "125.50",
"destinationAddress": "TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC",
"amountType": "crypto",
"fiatCurrency": "XOF",
"destinationMemo": "1234567890",
"note": "Paiement fournisseur juillet",
"merchantReference": "facture-4821",
"idempotencyKey": "payout-2026-07-08-0001",
"totpCode": "123456",
"feeBearer": "merchant"
}
'import requests
url = "https://api.pay.izichange.com/v1/payouts"
payload = {
"assetCode": "USDT.TRC20",
"amount": "125.50",
"destinationAddress": "TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC",
"amountType": "crypto",
"fiatCurrency": "XOF",
"destinationMemo": "1234567890",
"note": "Paiement fournisseur juillet",
"merchantReference": "facture-4821",
"idempotencyKey": "payout-2026-07-08-0001",
"totpCode": "123456",
"feeBearer": "merchant"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
assetCode: 'USDT.TRC20',
amount: '125.50',
destinationAddress: 'TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC',
amountType: 'crypto',
fiatCurrency: 'XOF',
destinationMemo: '1234567890',
note: 'Paiement fournisseur juillet',
merchantReference: 'facture-4821',
idempotencyKey: 'payout-2026-07-08-0001',
totpCode: '123456',
feeBearer: 'merchant'
})
};
fetch('https://api.pay.izichange.com/v1/payouts', 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/payouts",
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([
'assetCode' => 'USDT.TRC20',
'amount' => '125.50',
'destinationAddress' => 'TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC',
'amountType' => 'crypto',
'fiatCurrency' => 'XOF',
'destinationMemo' => '1234567890',
'note' => 'Paiement fournisseur juillet',
'merchantReference' => 'facture-4821',
'idempotencyKey' => 'payout-2026-07-08-0001',
'totpCode' => '123456',
'feeBearer' => 'merchant'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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/payouts"
payload := strings.NewReader("{\n \"assetCode\": \"USDT.TRC20\",\n \"amount\": \"125.50\",\n \"destinationAddress\": \"TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC\",\n \"amountType\": \"crypto\",\n \"fiatCurrency\": \"XOF\",\n \"destinationMemo\": \"1234567890\",\n \"note\": \"Paiement fournisseur juillet\",\n \"merchantReference\": \"facture-4821\",\n \"idempotencyKey\": \"payout-2026-07-08-0001\",\n \"totpCode\": \"123456\",\n \"feeBearer\": \"merchant\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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/payouts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"assetCode\": \"USDT.TRC20\",\n \"amount\": \"125.50\",\n \"destinationAddress\": \"TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC\",\n \"amountType\": \"crypto\",\n \"fiatCurrency\": \"XOF\",\n \"destinationMemo\": \"1234567890\",\n \"note\": \"Paiement fournisseur juillet\",\n \"merchantReference\": \"facture-4821\",\n \"idempotencyKey\": \"payout-2026-07-08-0001\",\n \"totpCode\": \"123456\",\n \"feeBearer\": \"merchant\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pay.izichange.com/v1/payouts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assetCode\": \"USDT.TRC20\",\n \"amount\": \"125.50\",\n \"destinationAddress\": \"TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC\",\n \"amountType\": \"crypto\",\n \"fiatCurrency\": \"XOF\",\n \"destinationMemo\": \"1234567890\",\n \"note\": \"Paiement fournisseur juillet\",\n \"merchantReference\": \"facture-4821\",\n \"idempotencyKey\": \"payout-2026-07-08-0001\",\n \"totpCode\": \"123456\",\n \"feeBearer\": \"merchant\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"merchantReference": {},
"payoutType": "<string>",
"amount": "<string>",
"assetCode": "<string>",
"destinationAddress": "<string>",
"destinationType": "<string>",
"destinationMemo": {},
"feeAmount": "<string>",
"networkFeeAmount": {},
"networkFeeAssetCode": {},
"networkFeeUsdEquivalent": {},
"txid": "9f4c1a2b3d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8",
"txUrl": "https://tronscan.org/#/transaction/9f4c1a2b3d5e6f70",
"status": "<string>",
"failureReason": {},
"feeBearer": "<string>",
"kytStatus": {},
"createdAt": "<string>",
"updatedAt": "<string>",
"statusHistory": [
{}
]
}Autorisations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Corps
Cryptomonnaie à envoyer. Doit figurer parmi les actifs supportés par votre compte, par exemple USDT.TRC20, USDT.BEP20 ou BTC.
32^[A-Z0-9_.\-]{1,32}$"USDT.TRC20"
Montant à envoyer, en unités de l'actif. Chaîne de caractères, jamais un nombre JSON : un montant crypto passé en number est arrondi par la précision flottante. Jusqu'à 18 décimales.
^(?=.*[1-9])\d{1,18}(\.\d{1,18})?$"125.50"
Adresse crypto du destinataire, sur le réseau correspondant à assetCode. Une adresse d'un autre réseau entraîne une perte définitive des fonds.
3 - 255"TJRyWwFs9wTFGZg3JbrVriFbNfCug5tDeC"
Unité de amount.
crypto(défaut) :amountest libellé dansassetCodeet envoyé tel quel.fiat:amountest libellé dansfiatCurrencyet CONVERTI enassetCodeau taux marché (spot) au moment de la création — c'est le montant crypto équivalent qui est envoyé à l'adresse.
crypto, fiat "crypto"
Devise fiat dans laquelle amount est exprimé quand amountType='fiat' (ex. XOF, USD, EUR). Requis en mode fiat, ignoré en mode crypto.
8"XOF"
Mémo / tag de destination. Obligatoire pour les réseaux qui en exigent un (XRP, TON, Stellar…) ; à omettre pour tous les autres.
120"1234567890"
Note libre attachée au retrait, visible dans votre historique.
255"Paiement fournisseur juillet"
Référence libre côté marchand, reportée telle quelle sur le retrait.
255"facture-4821"
Clé d'idempotence. Rejouer la même clé retourne le retrait 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.
120^[A-Za-z0-9_.\-:]+$"payout-2026-07-08-0001"
Code TOTP à 6 chiffres, issu de votre application d'authentification. Requis uniquement pour les appels authentifiés par session utilisateur (dashboard) ; les appels par clé API n'en ont pas besoin.
^[0-9]{6}$"123456"
Qui supporte les frais de ce retrait, pour cet appel uniquement.
merchant: les frais s'ajoutent au montant. Le destinataire reçoitamounten entier, votre solde est débité deamount+ frais.customer: les frais sont prélevés sur le montant. Le destinataire reçoitamountmoins les frais, votre solde est débité deamount. Omis, ce champ retombe sur la configuration de votre compte (merchantpar défaut).
merchant, customer "merchant"
Réponse
Payout créé.
Identifiant unique du payout.
Référence libre attachée par le marchand (optionnelle).
Catégorie du payout : retrait crypto standard, transfert interne entre marchands, remboursement d'un paiement, ou leg crypto d'un settlement.
Montant brut envoyé — chaîne décimale (préserve la précision).
Code de l'actif crypto (USDT.TRC20, BTC, …).
Adresse de destination — adresse blockchain, email interne ou identifiant d'un autre compte IzichangePay selon destinationType.
Type de destination : adresse blockchain, email interne ou identifiant d'un autre compte marchand de la plateforme.
Mémo/tag requis pour les chaînes memo-type (XRP, TON, Stellar).
Frais facturés par IzichangePay — chaîne décimale.
Frais réseau (gas) effectivement payés à la blockchain — chaîne décimale, renseigné après diffusion.
Asset dans lequel les frais réseau ont été payés : le BASE COIN de la chaîne (ex. TRX pour un retrait USDT.TRC20, BNB pour USDT.BEP20), jamais l'asset du retrait. À utiliser pour libeller networkFeeAmount.
Contre-valeur USD des frais réseau, pour comparer des frais payés dans des monnaies natives différentes. Indicatif de reporting : rien n'est facturé en USD. Renseigné seulement à la CONFIRMATION, quand le coût réel est constaté on-chain — null tant que le payout n'est pas confirmé.
Hash de la transaction on-chain, vérifiable sur un explorateur de blocs. Renseigné une fois la transaction diffusée : null tant que le retrait n'a pas atteint la chaîne, et sur ce qui n'y arrive jamais (transferts internes, confirmations manuelles hors-chaîne).
"9f4c1a2b3d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8"
URL de la transaction sur un explorateur de blocs, pré-résolue par le serveur. null si le hash n'est pas encore connu ou si aucun explorateur n'est configuré pour cet actif.
"https://tronscan.org/#/transaction/9f4c1a2b3d5e6f70"
Statut courant du payout (pending, approved, confirmed, failed, etc.).
Message d'erreur sécurisé pour les payouts non finalisés (échec, en attente d'examen). null pour les payouts en bonne marche.
Indique qui supporte les frais : le marchand (montant débité = amount + fee) ou le client (sur les remboursements).
Statut du contrôle KYT (Know Your Transaction) si applicable.
Date de création — ISO 8601.
Date de dernière mise à jour — ISO 8601.
Historique des transitions de statut, chaque entrée comportant le statut, l'horodatage, la source et une note éventuelle.