neo-pays

Versements

Envoyer des fonds depuis votre solde vers un porte-monnaie mobile ou un compte bancaire.

Créer un versement

POST /v1/payouts

Passez un Idempotency-Key — c'est encore plus important qu'à l'encaissement : un versement rejoué sans idempotence paierait deux fois.

Champ Requis Description
asset_id oui L'actif, par son identifiant
amount_minor oui Chaîne, en unités mineures
country oui Pays de l'opération (ISO 3166-1 alpha-2)
platform_id oui La plateforme de versement (GET /v1/corridors)
recipient oui Le destinataire — voir ci-dessous
platform_account_handle Le sous-compte débité. Vide = le primaire du corridor
rail Force un rail précis
client_ref Votre référence
description Texte libre

Le destinataire est typé

"recipient": {
  "name": "Mouhamadou Sy",
  "identifier_type": "msisdn",
  "identifier": "+221771234567"
}

identifier_type dit quelle sorte d'adresse vous détenez (msisdn, iban, un alias…) et identifier la porte. C'est ce qui permet à une plateforme portant plusieurs rails de résoudre sans que vous ayez à en nommer un.

phone seul reste pleinement accepté et s'interprète comme (msisdn, phone). Fournir les deux formes, ou un type sans valeur, est refusé — jamais deviné.

Le solde d'abord

Un versement se débite sur votre solde disponible :

GET /v1/balances

Les soldes sont rendus par actif et par (plateforme, pays), avec le disponible, l'en attente et le réservé. Le réservé couvre les sorties déjà engagées : il n'est pas dépensable.

Les soldes ne s'additionnent jamais entre actifs. Il n'existe aucune conversion de devise sur cette plateforme, donc un total tous actifs confondus n'aurait pas de sens.

Un versement qui dépasserait le disponible est refusé immédiatement, dans la réponse même : 422 avec le code insufficient_funds. Il n'est jamais mis en attente de fonds — il n'existe aucun découvert.

Demander un retrait de votre solde

POST /v1/payout-requests
GET  /v1/payout-requests
GET  /v1/payout-requests/{id}

C'est une demande, pas un versement. Aucun argent ne bouge et rien n'est réservé : l'opération s'ouvre au statut requested, et une personne la décide dans le tableau de bord. C'est la séparation maker-checker — la clé API demande, un propriétaire du compte décide. Il n'existe délibérément aucune annulation : une demande en attente ne retient rien, donc elle se rejette côté décideur.

Le montant est BRUT : les frais de retrait en sont déduits, ils ne s'y ajoutent pas. Sans grille de frais configurée pour l'actif, la demande est refusée en 409 — un retrait gratuit est une ligne à zéro saisie exprès, jamais une absence.

Suivi

payout.success, payout.failed, payout.cancelled arrivent en webhook ; GET /v1/payouts/{id} donne l'état à la demande.