Sous-comptes
Créez et gérez les sous-comptes marchands des marketplaces et des plateformes.
Les sous-comptes permettent à une plateforme de connecter des marchands et d'agir pour leur
compte, dans le cadre de Sync. Un paiement fait par une connexion appartient au marchand ;
la commission de la plateforme, fixée par la pricing de la connexion, est créditée à la
plateforme, ou lui est due quand le marchand encaisse sur ses propres prestataires
(Paiements fractionnés).
Clé privée requise
Créer et gérer des sous-comptes exige la clé privée (sk...).
Endpoints
| Méthode | Chemin | Description |
|---|---|---|
POST | /accounts | Créer |
GET | /accounts/{id} | Récupérer |
GET | /accounts | Lister |
PUT | /accounts/{id} | Modifier |
DELETE | /accounts/{id} | Supprimer |
POST | /accounts/{id}/token | Régénérer le jeton d'autorisation OAuth |
POST | /accounts/{id}/payouts | Payer un marchand Lite tout de suite (live uniquement) |
GET | /accounts/{id}/commission-receivables | Ce que vous doivent les marchands qui encaissent sur leurs propres contrats |
Le chemin est /accounts
Cette ressource est exposée sous /accounts, et non /subaccounts : subaccounts désigne ici le
concept produit (les marchands connectés à votre plateforme), qui correspond au nom du produit
« Sync ».
L'objet Account (sous-compte)
idstringfacultatifreferencestring?facultatifsandboxbooleanfacultatiftrue pour un sous-compte du mode test.capabilitiesstring[]facultatifprofileobjectfacultatifprofile.email, l'adresse du marchand que vous donnez avec email sur POST ou PUT /accounts, à laquelle est envoyé le rappel d'invitation.metadataobjectfacultatifmetadata sur POST /accounts. PUT /accounts/{id} y fusionne ce que vous envoyez, et une clé envoyée à null est supprimée. {} quand il n'y en a pas.callbackstring?facultatifhttp://localhost et http://127.0.0.1 sont acceptés avec une clé sandbox, tout le reste répond 422. Elle enregistre aussi l'origine : un redirect_uri sur le lien d'autorisation n'est respecté que s'il partage cette origine, et refusé sinon. Sans callback, aucun redirect_uri n'est accepté.account_typeenumfacultatifdirect (le marchand gère un compte Wajub complet), lite (un portail hébergé, qui encaisse toujours via Wajub) ou relay (pas de compte marchand : vous encaissez et Wajub relaie les versements). direct par défaut, et non modifiable ensuite.commission_refund_policyenumfacultatifprorata (par défaut, en proportion du remboursement), full (en totalité, au premier remboursement) ou none. Définie à la création, et modifiable seulement tant que la connexion est en attente.statusenumfacultatifpending, active, expired ou cancelled : voir [le cycle de vie](/sync/onboarding#the-lifecycle). GET /accounts?status= filtre sur cette même valeur.payment_statusenumfacultatifactive, inactive (la vérification du marchand est encore en cours) ou suspended (par vous, ou par Wajub quand la vérification a été rejetée) : indique si les appels qui déplacent de l'argent s'exécutent.payout_scheduleenumfacultatiflite uniquement : manual, daily, weekly ou monthly, la fréquence à laquelle Wajub paie le marchand.payout_min_amountnumber?facultatiflite uniquement : rien n'est versé en dessous de ce montant, dans la devise du marchand. null signifie la valeur par défaut, 1 000.last_payout_atdatetime?facultatiflite uniquement : date du dernier versement au marchand.pending_changesobject[]facultatif{ id, type, proposed, current, requested_at }.authorization_urlstring?facultatifrelay n'en a pas : il y vaut toujours null, et le régénérer répond 422.masterobject?facultatif{ name }.connected_merchantobject?facultatif{ name, email }.pricingobject?facultatif{ percentage_fee, fixed_fee, min_fee, max_fee, currency }.expires_atdatetime?facultatifnull une fois qu'un marchand a accepté, puisqu'un sous-compte accepté n'expire jamais, et toujours null sur une connexion relay, qui n'a pas d'invitation.created_atdatetimefacultatifupdated_atdatetimefacultatifCréer un sous-compte
L'objet pricing accepte percentage_fee, fixed_fee, max_fee, min_fee (tous facultatifs,
numériques) et currency (obligatoire dès qu'un frais fixe, minimum ou maximum est défini).
email est l'adresse du marchand : Wajub y envoie le rappel d'invitation trois jours avant
l'expiration de l'invitation. Elle est conservée dans profile.email, et PUT /accounts/{id} la
modifie. metadata vous appartient et est renvoyé sur l'objet. Une reference déjà utilisée par
l'une de vos connexions de l'environnement, connexions annulées comprises, répond 422. Au-delà de
50 invitations ouvertes, l'appel répond 429
(la limite) :
curl https://api.wajub.com/accounts \
-H "Authorization: sk.xxxxxxxxxxxxxxxx…" \
-H "Content-Type: application/json" \
-d '{
"reference": "vendor-482",
"capabilities": ["payments"],
"email": "contact@vendor-482.example",
"pricing": { "percentage_fee": 10, "currency": "XAF" }
}'Agir pour le compte d'un sous-compte : l'en-tête X-Sync
Une fois un sous-compte active, la plateforme peut agir en tant que ce sous-compte en
envoyant son id dans l'en-tête X-Sync, avec sa propre clé d'API. Quand il est présent et valide,
la requête s'exécute sur le sous-compte au lieu de la plateforme, les ressources
sont créées sous le sous-compte, et sa propre pricing s'applique automatiquement.
Ce que la plateforme atteint, c'est ce que cette connexion a apporté : ses paiements, avec leurs
remboursements et leurs litiges, les clients qui ont acheté par elle ou qu'elle a créés ou désignés
par e-mail ou téléphone (sans les notes, le motif de blocage ni les metadata du marchand, et jamais
supprimés par elle), les liens, factures et bénéficiaires qu'elle a créés, les payouts qu'elle a envoyés et les
événements qui concernent tout cela. Les ventes, liens, factures et bénéficiaires propres au
marchand, et ce qu'ont apporté d'autres plateformes, restent hors de portée quelles que soient les
capacités accordées, et répondent 404.
Types de compte détaille
chaque ressource.
X-Syncheaderfacultatifid du sous-compte (par exemple acc_7Yh2Mp), et non sa reference. Envoyé avec la clé Authorization de la plateforme.curl https://api.wajub.com/payments \
-H "Authorization: sk.xxxxxxxxxxxxxxxx…" \
-H "X-Sync: acc_7Yh2Mp" \
-d '{ "amount": 10000, "currency": "XAF", "email": "client@example.com" }'Sur une connexion live, PUT /accounts/{id} ne change pas capabilities ni pricing directement :
il répond 202 Accepted avec la proposition dans pending_changes, et le marchand l'accepte ou la
refuse dans son propre dashboard. payment_status et callback s'appliquent toujours
immédiatement.
Chaque ressource indique la capacité qu'elle exige, et une ressource qui n'en indique aucune ne peut
pas du tout être atteinte avec X-Sync. C'est le cas de /accounts/*, que vous gérez toujours avec
votre propre clé, et de ce qui appartient à tout le compte du marchand plutôt qu'à une connexion : le
solde, les endpoints de webhook, Shield, Tax et wajub listen.
| Si la requête touche | Capacité requise |
|---|---|
/payments, /links | payments |
/invoices | invoices |
/customers, /customers/{id}/tax_ids | customers |
/refunds | refunds |
GET /payments/{id}/refunds, POST /payments/{id}/close avec outcome: refund | payments et refunds |
/disputes | disputes |
/transfers, /beneficiaries, /identity | withdrawals |
/, /providers, /events | read |
/channels, /countries, /currencies | aucune, catalogues |
/balance, /webhooks, /shield, /tax | indisponible avec X-Sync |
/accounts | indisponible avec X-Sync |
Quand un appel avec `X-Sync` est refusé
Seule la plateforme qui a créé un sous-compte peut agir pour son compte, et seulement dans
l'environnement de la clé : le sous-compte d'une autre plateforme, ou un sous-compte sandbox appelé
avec une clé live (ou l'inverse), est hors d'atteinte : il répond 404 Sync account not found., comme un identifiant qui n'existe pas. Un sous-compte qui n'est pas active
(encore pending, ou cancelled/expired), à qui il manque la capacité exigée par la ressource,
ou appelé sur une ressource indisponible avec X-Sync (voir les dernières lignes ci-dessus) répond
403. Pour payments, withdrawals et refunds, un appel qui déplace de l'argent est aussi
refusé avec 403 tant que le payment_status du sous-compte n'est pas active :
encaissements, payouts et remboursements sont suspendus ensemble, même si capabilities les liste
encore. Les lectures (GET) s'exécutent toujours, de même que l'annulation d'un paiement, la
suppression d'un lien ou d'un bénéficiaire et les recherches /identity.
Ce qui est refusé