Introduction
L'API Yavin permet aux développeurs et aux intégrateurs d'intégrer des fonctionnalités de paiement à leurs propres parcours utilisateur : traiter des paiements sur un terminal, générer des liens de paiement en ligne, imprimer et partager des tickets, et accéder aux données de transaction.
Cas d'usage typiques : paiement sur terminal depuis un logiciel de caisse, paiement en borne, paiement en ligne Click & Collect, Order & Pay via QR code, Pay at Table via QR code.
Choisir votre intégration
Posez-vous d'abord une question : où le paiement a-t-il lieu ?
| Votre situation | Intégration à utiliser |
|---|---|
| Logiciel de caisse et Yavin Pay sur le même appareil Android | Android Intent API |
| Logiciel de caisse sur un autre appareil, sur le même réseau local que le terminal | Local API |
| Logiciel de caisse sur un autre réseau, ou logiciel de caisse web | Cloud API |
| Paiement en ligne par lien (e-commerce, QR code, Pay at Table) | E-commerce API |
| Reporting et remboursements de serveur à serveur | Webservices API |
Les trois API en magasin (Local, Cloud, Android Intent) exposent les mêmes fonctionnalités de paiement. Seul le transport diffère : HTTP en local, HTTPS dans le cloud avec webhooks, ou deep links Android. Choisissez en fonction de la topologie de votre réseau, puis conservez la même intégration partout.
Configurer votre sandbox
Contactez notre équipe à l'adresse partnerships@yavin.com pour obtenir un environnement sandbox ainsi qu'un terminal de test si nécessaire.
Spécificités de la sandbox
- URL de base : remplacez
api.yavin.comparapi.sandbox.yavin.com(chemins identiques). La Local API n'est pas concernée (réseau local) ; son add-on HTTPS utilise des noms d'hôte sandbox dédiés - Les identifiants sont totalement distincts : une clé d'API sandbox ne fonctionne jamais en production, et inversement. Le backoffice sandbox affiche en permanence un bandeau orange SANDBOX
- Le backoffice sandbox est accessible via ce lien : my.sandbox.yavin.com
- La page de paiement e-commerce de la sandbox n'utilise aucune carte de test : le paiement est validé dès que vous cliquez sur Payer
Authentification
Yavin utilise un objet company pour représenter un point de vente physique. Chaque company possède sa propre clé d'API, disponible sur my.yavin.com dans l'onglet API.

| API | Authentification |
|---|---|
| Local API | Connexion du marchand dans Yavin Pay avec ses identifiants My Yavin |
| Android Intent API | Connexion du marchand dans Yavin Pay avec ses identifiants My Yavin |
| Cloud API | Clé d'API dans l'en-tête Authorization: Bearer YOUR_API_KEY |
| E-commerce API | Clé d'API dans l'en-tête Yavin-Secret |
| Webservices API | Clé d'API dans l'en-tête Yavin-Secret |
Chaque requête HTTPS doit être authentifiée et doit contenir Content-Type: application/json.
Conventions
- Les montants sont toujours des entiers, exprimés en centimes, et doivent être positifs (
1000= 10,00 €). N'envoyez jamais de montant négatif : toutes les API ne le rejettent pas (sur l'Android Intent API, sa valeur absolue est débitée) - Les codes de devise suivent la norme ISO 4217 (
EUR,CHF,GBP). La devise réellement utilisée est celle configurée sur le profil du marchand - Statuts : les résultats des transactions en magasin sont
okouko; les paiements e-commerce ajoutentpendingetauthorised - Idempotence : envoyez toujours un
idempotentUuiddans les requêtes de paiement, un par tentative de paiement. Voir Gestion de l'IdempotentUuid - Nommage : la convention (camelCase ou snake_case) varie selon l'API et est indiquée en haut de chaque page d'API
Flux de paiement en magasin
Les API Local, Cloud et Android Intent sont utilisées uniquement pour les paiements en magasin.
- Le marchand sélectionne les articles ou le montant sur le logiciel de caisse
- Le marchand appuie sur le bouton de paiement du logiciel de caisse
- Le logiciel de caisse appelle la route de paiement avec le type
debitet unidempotentUuid - Le client paie sur le terminal
Paiement réussi : la réponse est prise en compte sur le logiciel de caisse, y compris les pourboires (sous forme de trop-perçu, « trop perçu »), le cas échéant.
Paiement échoué : dans chacun des cas suivants, le paiement est abandonné, la réponse parvient au logiciel de caisse et vous pouvez lancer un nouveau paiement (avec un nouvel idempotentUuid) :
- Le client met plus de 60 secondes sur les écrans de pourboire ou d'avis
- Le client met plus de 60 secondes pour présenter sa carte
- La carte est refusée par la passerelle de paiement
Flux de paiement en ligne
- Le client sélectionne des articles sur votre site web et clique sur payer ; votre serveur est notifié
- Votre serveur appelle l'API Yavin pour générer un lien de paiement
- Le serveur Yavin renvoie un lien de paiement unique
- Votre serveur redirige le client vers le lien de paiement (page hébergée par Yavin)
- Le client saisit ses informations de paiement dans le widget
- Yavin appelle votre
return_url_successoureturn_url_cancelled(GET aveccartIdetstatusdans les paramètres de requête) et votrewebhook_urlavec le résultat du paiement - Votre serveur traite le résultat et affiche les informations pertinentes au client
Consultez la page E-commerce API pour les modes de capture (immédiate ou différée), la durée de vie du lien de paiement, les statuts et le comportement en cas de paiements multiples.
Codes d'erreur HTTP
| Code | Signification |
|---|---|
| 400 | Bad Request : la requête est invalide (la cause la plus fréquente est un en-tête Content-Type: application/json manquant) |
| 401 | Unauthorized : la clé d'API est invalide ou le terminal n'est pas accessible avec cette clé d'API |
| 404 | Not Found : la route n'existe pas |
| 405 | Method Not Allowed : méthode HTTP incorrecte pour cette route |
| 500 | Internal Server Error : problème de notre côté, réessayez plus tard et contactez le support si le problème persiste |
Formats des réponses d'erreur
La structure du corps de l'erreur dépend de la famille d'endpoints. Écrivez un gestionnaire par structure ; ne supposez pas un format unique pour toutes les API.
| Endpoints | Corps de l'erreur | Exemple |
|---|---|---|
| Endpoints de paiement en magasin (Local API avec HTTP 200, Cloud API) | {"status": "ko", "message": "..."} | {"status": "ko", "message": "Error: amount needs to be greater than 0"} |
E-commerce /generate_link/ (validation) | {"errors": {"field": ["message"]}} | {"errors": {"checkout_external_id": ["This checkout_external_id already exists"]}} |
E-commerce /cancel_link/, /capture_transactions/, /get_cart_information/ | {"error": "..."} | {"error": "Cart has already been cancelled"} |
| Remboursement Webservices, 400 requête malformée | Un objet indexé par champ | {"amount": ["cannot be greater than the transaction's total amount"]} |