curl --request POST \
--url https://api.alphapay.me/api/v1/wallet-transfers/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from_country": "BJ",
"to_country": "CM",
"from_amount": "50000.00"
}
'import requests
url = "https://api.alphapay.me/api/v1/wallet-transfers/"
payload = {
"from_country": "BJ",
"to_country": "CM",
"from_amount": "50000.00"
}
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({from_country: 'BJ', to_country: 'CM', from_amount: '50000.00'})
};
fetch('https://api.alphapay.me/api/v1/wallet-transfers/', 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.alphapay.me/api/v1/wallet-transfers/",
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([
'from_country' => 'BJ',
'to_country' => 'CM',
'from_amount' => '50000.00'
]),
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.alphapay.me/api/v1/wallet-transfers/"
payload := strings.NewReader("{\n \"from_country\": \"BJ\",\n \"to_country\": \"CM\",\n \"from_amount\": \"50000.00\"\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.alphapay.me/api/v1/wallet-transfers/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from_country\": \"BJ\",\n \"to_country\": \"CM\",\n \"from_amount\": \"50000.00\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.alphapay.me/api/v1/wallet-transfers/")
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 \"from_country\": \"BJ\",\n \"to_country\": \"CM\",\n \"from_amount\": \"50000.00\"\n}"
response = http.request(request)
puts response.read_body{
"id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
"reference": "9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c",
"merchant": "8a1f5c3e-0000-1111-2222-333344445555",
"requested_by_member": null,
"from_country": "BJ",
"to_country": "CM",
"from_amount": "50000.00",
"from_currency": "XOF",
"to_amount": "82000.00",
"to_currency": "XAF",
"exchange_rate": "1.64000000",
"fee_amount": "820.00",
"fee_percent_applied": "1.00",
"status": "PENDING",
"approved_by_admin": null,
"approved_at": null,
"completed_at": null,
"rejection_reason": "",
"created_at": "2026-09-24T10:00:00Z",
"updated_at": "2026-09-24T10:00:00Z"
}{
"message": "Cette clé API n'est pas autorisée pour les opérations payout (décaissement) (scope actuel : Encaissement uniquement).",
"code": "api_key_scope_forbidden"
}{
"message": "Solde disponible insuffisant.",
"code": "insufficient_balance"
}Initier un transfert interwallet
Déplace des fonds entre deux wallets pays du même marchand
curl --request POST \
--url https://api.alphapay.me/api/v1/wallet-transfers/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from_country": "BJ",
"to_country": "CM",
"from_amount": "50000.00"
}
'import requests
url = "https://api.alphapay.me/api/v1/wallet-transfers/"
payload = {
"from_country": "BJ",
"to_country": "CM",
"from_amount": "50000.00"
}
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({from_country: 'BJ', to_country: 'CM', from_amount: '50000.00'})
};
fetch('https://api.alphapay.me/api/v1/wallet-transfers/', 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.alphapay.me/api/v1/wallet-transfers/",
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([
'from_country' => 'BJ',
'to_country' => 'CM',
'from_amount' => '50000.00'
]),
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.alphapay.me/api/v1/wallet-transfers/"
payload := strings.NewReader("{\n \"from_country\": \"BJ\",\n \"to_country\": \"CM\",\n \"from_amount\": \"50000.00\"\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.alphapay.me/api/v1/wallet-transfers/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from_country\": \"BJ\",\n \"to_country\": \"CM\",\n \"from_amount\": \"50000.00\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.alphapay.me/api/v1/wallet-transfers/")
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 \"from_country\": \"BJ\",\n \"to_country\": \"CM\",\n \"from_amount\": \"50000.00\"\n}"
response = http.request(request)
puts response.read_body{
"id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
"reference": "9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c",
"merchant": "8a1f5c3e-0000-1111-2222-333344445555",
"requested_by_member": null,
"from_country": "BJ",
"to_country": "CM",
"from_amount": "50000.00",
"from_currency": "XOF",
"to_amount": "82000.00",
"to_currency": "XAF",
"exchange_rate": "1.64000000",
"fee_amount": "820.00",
"fee_percent_applied": "1.00",
"status": "PENDING",
"approved_by_admin": null,
"approved_at": null,
"completed_at": null,
"rejection_reason": "",
"created_at": "2026-09-24T10:00:00Z",
"updated_at": "2026-09-24T10:00:00Z"
}{
"message": "Cette clé API n'est pas autorisée pour les opérations payout (décaissement) (scope actuel : Encaissement uniquement).",
"code": "api_key_scope_forbidden"
}{
"message": "Solde disponible insuffisant.",
"code": "insufficient_balance"
}Statut après création
PENDING: votre marchand n’a pas l’auto-approbation activée — le transfert attend une validation admin avant que le wallet cible ne soit crédité. Un seul transfertPENDINGà la fois est autorisé par marchand.COMPLETED: le transfert a été exécuté immédiatement (auto-approbation activée).
Éviter un doublon en cas de coupure réseau
Le headerIdempotency-Key est optionnel : sans lui, un simple retry réseau réserve le montant une seconde fois sur le wallet source. Voir Idempotence.Authorizations
Clé API secrète du marchand — header Authorization: Bearer sk_live_xxx (ou sk_test_xxx en environnement de test).
Headers
Identifiant unique que vous générez pour cette tentative (un UUID par exemple). Optionnel : sans lui, chaque appel est traité comme une nouvelle demande. Avec lui, si vous renvoyez la même clé — après un timeout ou une coupure réseau — AlphaPay renvoie la réponse d'origine au lieu de créer un second paiement. Réutilisez la même clé pour les retrys d'une même tentative, changez-en pour toute nouvelle intention. La même clé avec un corps de requête différent renvoie une erreur 409. Voir Idempotence.
255Body
Code ISO du wallet source (débité).
2"BJ"
Code ISO du wallet cible (crédité, après conversion si devise différente).
2"CM"
Montant réservé sur le wallet source, dans sa devise.
"50000.00"
UUID du marchand visé. Ignoré pour une clé API (toujours vous-même).
Response
Transfert créé — status vaut COMPLETED si WALLET_TRANSFER_AUTO_APPROVE est activé pour votre marchand, PENDING sinon (validation admin requise avant que le wallet cible ne soit crédité).