Aller au contenu principal

API - Retrait

Les conventions générales s'appliquent : en-têtes, enveloppe de réponse, pagination et codes d'erreur.

Demander un retrait​

POST /api/public/v1/cash-outs/{wallet}/create

Le portefeuille source est passé dans l'URL. La destination provient de la configuration cash_out de ce portefeuille — elle ne se transmet pas dans le corps de la requête.

Paramètres​

ChampTypeObligatoireDescription
amountentierNonMontant en ariary. Si omis, l'API retire le maximum possible, sorties en attente et frais déduits.
descriptionstringNonMémo métier, 100 caractères maximum.

Exemple​

curl --request POST \
"https://efn.efaina.com/api/public/v1/cash-outs/a3bb189e-b1be-49d4-aec2-a9b02d7a5c20/create" \
--header "Authorization: Bearer VOTRE_TOKEN" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{
"amount": 250000,
"description": "Règlement fournisseur mensuel"
}'

Erreurs spécifiques​

CodeCas
422 sur amountSolde disponible insuffisant, ou un retrait est déjà en cours sur ce portefeuille.
422 sur detail_methodLe portefeuille n'a pas de configuration cash_out. Mettez-le à jour d'abord.
422 sur detail_method.phoneLe numéro ne correspond à aucun opérateur mobile connu.
403Le portefeuille appartient à un autre compte.

Retraits en masse​

POST /api/public/v1/cash-outs/mass/create
ChampTypeObligatoireDescription
itemstableauOuiListe des retraits à effectuer.
items[].wallet_iduuidOuiPortefeuille à débiter, appartenant à votre compte.
items[].amountentierNonMontant ; vide pour retirer le maximum.
items[].descriptionstringNonMémo propre à cette ligne.
curl --request POST \
"https://efn.efaina.com/api/public/v1/cash-outs/mass/create" \
--header "Authorization: Bearer VOTRE_TOKEN" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{
"items": [
{ "wallet_id": "8f7e39c2-0b3f-4a1c-9b2d-7f3e9b4c1d2a", "amount": 150000, "description": "Paie semaine 12" },
{ "wallet_id": "a3bb189e-b1be-49d4-aec2-a9b02d7a5c20" }
]
}'

La réponse est un 202 : le lot est mis en file et traité de façon asynchrone.

{
"statusHttp": "success",
"message": "…",
"response": {
"batch_id": "e4c2a1f0-9d3b-4c58-8a71-2f6b0d9e4c11",
"total": 2
}
}

Chaque ligne est traitée indépendamment : une ligne en échec n'annule pas les autres. Le suivi passe par les évènements cash-out.mass.completed et cash-out.mass.failed de votre webhook, qui portent le batch_id et la position de la ligne concernée.

Lister les retraits​

GET /api/public/v1/cash-outs

Renvoie vos retraits sous forme paginée, avec les filtres communs. Champs filtrables notables : filter[wallet_id], filter[status.slug], between[amount], between[created_at].

{
"id": "09c18b51-f7f8-4b36-a49f-89f003eb1a3e",
"amount": 250000,
"date": "2024-06-15T09:20:03.000000Z",
"wallet": "a3bb189e-b1be-49d4-aec2-a9b02d7a5c20",
"status": "pending"
}

Référence complète​

Référence API générée.