Tester l'API de bout en bout
La préproduction est une copie complète de StarBridge : même code, même base, mêmes règles qu'en production, mais avec des données fictives. Vous pouvez y essayer chacune des 193 opérations de l'API et recevoir ses 29 événements par webhook, de la connexion à la commission du partenaire, sans rien risquer.
Sommaire
Les adresses
Une seule adresse pour tout : https://preprod-api.satelica.com. On s'y connecte (/auth/v1/…) et on y appelle l'API (/api/v1/…). La production (api.satelica.com) porte des données réelles et vos comptes d'essai n'y existent pas : tout appel y est refusé (401).
| Usage | Adresse |
|---|---|
| Racine de l'API | https://preprod-api.satelica.com/api/v1 |
| Référence interactive (Swagger) | https://preprod-api.satelica.com/reference |
| Contrat OpenAPI 3.1 (JSON) | https://preprod-api.satelica.com/openapi/satelica.openapi.json |
| Connexion (jeton d'accès) | https://preprod-api.satelica.com/auth/v1 |
| Back-office (mêmes comptes) | https://preprod-admin.satelica.com |
| État du service, sans jeton | GET https://preprod-api.satelica.com/api/v1/sante |
Le contrat se télécharge et s'importe tel quel dans Postman, Insomnia ou un générateur de client. Il décrit les 193 opérations de l'API, les 5 opérations de connexion et les 29 événements envoyés par webhook. Pour chacune, il donne les champs attendus et un exemple de réponse réelle relevé en préproduction.
Y a-t-il deux API ? Non. /auth/v1/… sert seulement à se connecter (obtenir puis renouveler le jeton), /api/v1/… à tout le reste, et les deux passent par la même adresse.
Où lire les sites d'un client ? Dans sa fiche, GET /api/v1/clients/{id}, champ sites. GET /clients/{id}/sites et GET /sites/{id} n'existent pas et répondent 404 : ces adresses servent seulement à ajouter un site (POST) et à en supprimer un (DELETE).
Où sont la latitude et la longitude d'un ordre d'installation ? Dans l'objet site de la liste GET /api/v1/ordres-installation et de la fiche GET /api/v1/ordres-installation/{id} : deux nombres en degrés décimaux, ou null si le site n'a pas été positionné.
Les comptes d'essai
Trois comptes, un par profil. Chacun voit et fait exactement ce que son rôle permet en production.
Administrateur CYBASTION
Rôle cybastion_administrateur : les 60 permissions. Il valide, encaisse, facture, installe et verse.
Distributeur de démonstration Odoo
Rôle partenaire_administrateur : 19 permissions. Il enregistre ses clients, vend, déclare les règlements et demande ses commissions.
Entreprise de démonstration Odoo
Rôle client_validateur : 9 permissions. Il accepte et signe les devis, paie en ligne et valide ses procès-verbaux.
Les mots de passe vous sont transmis à part par CYBASTION, jamais par ce portail. La clé publique de l'environnement (en-tête apikey du service d'authentification) est publique par nature : elle est préremplie dans la référence interactive et vous est rappelée avec les comptes.
La liste complète des rôles et de leurs permissions se lit avec GET /roles (compte CYBASTION). Chaque opération de la référence indique la permission qu'elle exige et ce que l'appelant peut voir.
Se connecter
Une connexion par e-mail et mot de passe donne un jeton d'accès. Ce jeton accompagne ensuite chaque appel.
1. Obtenir un jeton
curl -X POST 'https://preprod-api.satelica.com/auth/v1/token?grant_type=password' \
-H 'apikey: <clé publique>' \
-H 'Content-Type: application/json' \
-d '{"email": "odoo.partenaire@preprod.satelica.test", "password": "<mot de passe>"}'
La réponse contient access_token (valable 3 600 secondes, soit une heure), expires_at et refresh_token.
2. Appeler l'API
curl 'https://preprod-api.satelica.com/api/v1/moi' \
-H 'Authorization: Bearer <access_token>'
GET /moi rend le compte, son organisation, son rôle et la liste de ses permissions : c'est le premier appel à faire pour vérifier la connexion.
3. Renouveler sans redemander le mot de passe
curl -X POST 'https://preprod-api.satelica.com/auth/v1/token?grant_type=refresh_token' \
-H 'apikey: <clé publique>' -H 'Content-Type: application/json' \
-d '{"refresh_token": "<refresh_token>"}'
Chaque renouvellement rend un nouveau refresh_token : conservez le dernier reçu. Renouvelez un peu avant expires_at. Si l'API répond 401 jeton_invalide, renouvelez puis rejouez l'appel.
4. Se déconnecter
curl -X POST 'https://preprod-api.satelica.com/auth/v1/logout?scope=local' \
-H 'apikey: <clé publique>' -H 'Authorization: Bearer <access_token>'
Réponse 204. Le jeton de renouvellement est révoqué. Le jeton d'accès déjà émis expire de lui-même dans l'heure (voir Comportements voulus).
Exemple en Python (Odoo)
import requests
AUTH = "https://preprod-api.satelica.com/auth/v1"
API = "https://preprod-api.satelica.com/api/v1"
CLE_PUBLIQUE = "<clé publique>"
def connecter(email, mot_de_passe):
reponse = requests.post(f"{AUTH}/token", params={"grant_type": "password"},
headers={"apikey": CLE_PUBLIQUE},
json={"email": email, "password": mot_de_passe}, timeout=30)
reponse.raise_for_status()
return reponse.json() # access_token, refresh_token, expires_at
def renouveler(refresh_token):
reponse = requests.post(f"{AUTH}/token", params={"grant_type": "refresh_token"},
headers={"apikey": CLE_PUBLIQUE},
json={"refresh_token": refresh_token}, timeout=30)
reponse.raise_for_status()
return reponse.json()
session = connecter("odoo.partenaire@preprod.satelica.test", "<mot de passe>")
entetes = {"Authorization": f"Bearer {session['access_token']}"}
moi = requests.get(f"{API}/moi", headers=entetes, timeout=30).json()
clients = requests.get(f"{API}/clients", headers=entetes,
params={"page": 1, "taille": 50}, timeout=30).json()
print(moi["role"]["code"], clients["pagination"]["total"])
Un compte nouvellement ouvert reçoit un lien de bienvenue. Un mot de passe oublié se redemande par POST /public/mot-de-passe/lien. Le lien porte un token_hash qui s'échange par POST /auth/v1/verify ; la session obtenue choisit ensuite le mot de passe par PUT /auth/v1/user. Un lien vaut 20 minutes et ne sert qu'une fois, et seul le dernier demandé fonctionne.
Essayer depuis la référence
La référence interactive envoie de vraies requêtes à la préproduction.
- Ouvrez la référence de préproduction et remplissez l'encadré Obtenir un jeton d'accès, en haut de page. Sans jeton, chaque essai répond 401.
- Saisissez l'e-mail et le mot de passe d'un compte d'essai. Le jeton obtenu reste dans l'onglet, s'efface à sa fermeture, et le mot de passe n'est jamais conservé.
- Choisissez une opération puis Tester : le jeton est déjà placé dans
Authorization. Pour une lecture, l'identifiant de l'adresse ({id}) est prérempli avec un objet réel de la préproduction : cliquez sur Send. Pour une écriture, il n'est pas prérempli, pour qu'un clic d'exploration n'annule ni ne supprime rien : l'identifiant à coller est donné dans la description du paramètre. Les champs du corps sont préremplis avec un exemple réel, à adapter. - Pour changer de profil, utilisez Oublier le jeton, puis connectez-vous avec un autre compte.
Les cinq opérations du groupe Authentification visent le service d'authentification, et non l'API. Leur clé publique apikey est déjà renseignée.
Conventions
Les mêmes règles valent pour toutes les opérations.
| Format | JSON en UTF-8, champs en snake_case français. Corps limité à 1 Mo. |
|---|---|
| Identifiants | UUID. Un identifiant mal formé répond 400. |
| Listes | ?page=1&taille=20 (100 au plus). Réponse { donnees: [...], pagination: { page, taille, total, pages } }. Certaines listes ajoutent des compteurs (non_lues, en_retard…). |
| Dates | ISO 8601 en UTC ; un jour seul s'écrit AAAA-MM-JJ. |
| Montants | Francs CFA (XOF), nombres. Les totaux d'un devis (remise, TVA, commission) sont calculés par la plateforme à partir du catalogue, puis figés ; la commande les reprend. |
| Fichiers | D'abord POST /fichiers (multipart/form-data, champ fichier, champ bucket : kyc, devis, paiements, proces-verbaux, versements ou depots). L'identifiant rendu se joint ensuite à l'opération (pièce, signature, procès-verbal, facture de commission). |
| Idempotence | Les déclarations de règlement et les paiements en ligne prennent une cle_idempotence : rejouer la même clé ne crée rien de plus. |
Erreurs
Toujours { "code", "message", "details"? } : un code stable, un message en français, et parfois des précisions par champ.
{
"code": "requete_invalide",
"message": "La demande de règlement est invalide.",
"details": [
{ "code": "invalid_format", "format": "uuid", "path": ["commande_id"], "message": "Invalid UUID" },
{ "code": "custom", "path": [], "message": "Précisez la commande ou la facture à régler." }
]
}
| Statut | Code | Sens |
|---|---|---|
| 400 | requete_invalide | Champ manquant, mal formé, ou règle de saisie non respectée. |
| 401 | authentification_requise · jeton_invalide | Jeton absent, ou expiré, faux, révoqué. |
| 403 | permission_refusee · compte_inactif | Le rôle n'a pas la permission, ou le compte est désactivé. |
| 404 | introuvable | Inexistant, ou hors du périmètre de l'appelant. |
| 409 | conflit | Contraire à l'état de l'objet : statut, doublon, règle métier. Le message dit pourquoi. |
| 429 | debit_depasse | Trop de requêtes ; l'en-tête retry-after donne le délai. |
| 500 · 503 | erreur_interne · service_indisponible | Incident de notre côté : merci de nous le signaler avec l'heure et l'opération. |
Le service d'authentification a son propre format : { "code": 400, "error_code": "invalid_credentials", "msg": "…" }.
Parcours de A à Z : un nouveau client
L'enchaînement que nos recettes automatiques rejouent à chaque livraison. Chaque appel est décrit en détail dans la référence.
CYBASTION odoo.cybastion · Partenaire odoo.partenaire · Client odoo.client
-
Se connecter avec les trois comptes
- POST
/auth/v1/token?grant_type=passwordchacun - GET
/moichacun
- POST
-
Le partenaire enregistre un client, avec ses pièces
- GET
/types-documents— les pièces marquéesexigee_creationpourcible: clientPartenaire - POST
/fichiers— une fois par pièce,bucket=kycPartenaire - POST
/clients/controle-doublonpuisPOST /clients— entreprise, contact, premier site, piècesPartenaire
- GET
-
CYBASTION arbitre la réservation et examine les pièces
- POST
/reservations/{id}/decision—{"decision": "validee"}: le client entre au portefeuilleCYBASTION - GET
/documents-kyc?statut=deposepuisPOST /documents-kyc/{id}/decisionCYBASTION - POST
/clients/{id}/acces— ouvre le compte du contact principal et lui envoie sa bienvenuePartenaire
- POST
-
Le partenaire chiffre et envoie un devis
Pour que le compte client d'essai puisse répondre, menez la vente sur l'Entreprise de démonstration Odoo.
- POST
/opportunites—type_transaction: "nouveau_besoin"Partenaire - GET
/offresetGET /tarifs— une offre active et tariféePartenaire - POST
/devis/simulationpuisPOST /devis— mêmes montants, devisbrouillonnuméroté DEVPartenaire - POST
/devis/{id}/envoi— le PDF est produit, le devis passeenvoyePartenaire
- POST
-
Le client accepte et signe
- POST
/devis/{id}/reponse—{"decision": "accepte"}Client - POST
/signatures—{"objet": "devis", "objet_id": …}: un code à six chiffres part par e-mailClient - POST
/signatures/{signature_id}/confirmer— le code et le tracé (image PNG ou JPEG en data URI)Client
Autre voie : le partenaire dépose le devis signé sur papier (
POST /fichiersavecbucket=devis, puisPOST /devis/{id}/signature). Dans les deux cas naissent la commande (CMD), le contrat en projet (CTR), l'échéancier et la commission latente du partenaire. - POST
-
Le règlement
- POST
/paiements/en-ligne— rend l'adresse de paiement Paystack (voir Paiements de test)Client - POST
/paiements/{id}/verification— après le paiement : la plateforme interroge Paystack et constate le règlementClient
Ou hors ligne :
POST /paiements(virement, aveccle_idempotence) par le partenaire, puisPOST /paiements/{id}/decision{"decision": "valide"}par CYBASTION. Soldée, la commande passepayee, sa commission devientrealiseeet l'ordre d'installation s'ouvre de lui-même. - POST
-
La facture
- POST
/commandes/{id}/factures— corps facultatif, numéro FACCYBASTION - PATCH
/factures/{id}/reference-fne— la référence de la facture normaliséeCYBASTION
- POST
-
L'installation et la mise en service
- GET
/ordres-installation?commande_id=…CYBASTION - POST
/ordres-installation/{id}/technicienpuis…/technicien/contact— un technicien du registre (GET /techniciens)CYBASTION - POST
/ordres-installation/{id}/transmission— l'ordre part chez VIP NetCYBASTION - POST
/fichiers(bucket=proces-verbaux),POST /proces-verbaux,POST /proces-verbaux/{id}/decisionCYBASTION - GET
/activationspuisPOST /activations/{id}/decision—activeeavecidentifiant_connexionCYBASTION
- GET
-
La commission du partenaire
- GET
/commissionsetGET /commissions/totauxPartenaire - POST
/fichiers(bucket=versements, sa facture) puisPOST /demandes-versementPartenaire - POST
/demandes-versement/{id}/decisionpuis…/versement— commissionspayeeCYBASTION
- GET
Et toutes les autres opérations
Corrections et suppressions, transferts de client entre partenaires, avoirs et remboursements, relances, support, notifications, catalogue, paramètres, tableaux de bord et journal d'audit : toutes s'essaient de la même façon. Avant la publication de ce guide, chacune a été appelée avec succès en préproduction, à deux exceptions près : la notification Paystack et son rejeu, réservés à Paystack. La référence décrit, opération par opération, les cas où elle refuse.
CYBASTION prépare ces documents pour chaque partenaire. En préproduction, le Distributeur de démonstration Odoo a reçu des conditions à accepter et un contrat-cadre à signer : GET /partenaires/{id}, puis POST /conditions-commerciales/{id}/decision et POST /contrats-cadres/{id}/signature. Ces deux décisions ne se prennent qu'une fois : demandez-nous un nouvel exemplaire pour les rejouer.
Webhooks : être prévenu de chaque événement
StarBridge prévient Odoo de lui-même, dans les secondes qui suivent chaque événement métier. Plus besoin d'interroger l'API en boucle.
-
Déclarer une adresse de réception
- POST
/webhooks—{"url": "https://…", "evenements": ["*"]}: le secret de signature est rendu une seule foisCYBASTION - GET
/webhooks/evenements— les 29 événements, pour n'en choisir que certainsCYBASTION
- POST
-
Vérifier la réception
- POST
/webhooks/{id}/test— un événementwebhook.testpart aussitôt ; la réponse dit ce que votre adresse a réponduCYBASTION
- POST
-
Dérouler le parcours de A à Z
Chaque étape produit son événement :
client.cree,devis.signe,paiement.valide,facture.emise,ordre_installation.cree,pv.valide,activation.realisee,commission.realisee,versement.paye… -
Suivre et rejouer
- GET
/webhooks/{id}/livraisons— statut, tentatives, code HTTP reçu, prochaine relanceCYBASTION - POST
/webhook-livraisons/{id}/rejeu— renvoyer un envoi, par exemple après une panne de votre côtéCYBASTION
- GET
Le message reçu
| Envoi | POST JSON vers votre adresse HTTPS. Répondez 2xx en moins de 10 secondes, puis traitez de votre côté. |
|---|---|
| Enveloppe | id (clé de dédoublonnage), type, version, cree_le, environnement, objet (type, id, adresse de relecture), auteur, donnees. |
| En-têtes | Satelica-Evenement, Satelica-Evenement-Id, Satelica-Tentative, Satelica-Signature. |
| Signature | t=<horodatage>,v1=<hex(HMAC_SHA256(secret, t + "." + corps_brut))>. Refusez une signature fausse ou un horodatage de plus de 5 minutes. |
| Relances | Sans 2xx : 1 min, 5 min, 30 min, 2 h, 6 h, 12 h, 24 h (8 tentatives). Livraison au moins une fois : dédoublonnez sur id. |
import hashlib, hmac, time
def signature_valide(secret: str, entete: str, corps_brut: bytes, tolerance: int = 300) -> bool:
elements = [partie.split("=", 1) for partie in entete.split(",") if "=" in partie]
horodatage = int(next(valeur for cle, valeur in elements if cle == "t"))
if abs(time.time() - horodatage) > tolerance:
return False
attendu = hmac.new(secret.encode(), f"{horodatage}.".encode() + corps_brut, hashlib.sha256).hexdigest()
return any(hmac.compare_digest(attendu, valeur) for cle, valeur in elements if cle == "v1")
Les 29 événements, le schéma exact de leurs données et un exemple de chaque message sont dans la référence interactive, section Webhooks. Pour les essais, toute adresse HTTPS publique que vous contrôlez convient ; les adresses privées ou locales sont refusées.
Paiements de test
La préproduction est reliée à Paystack en mode test : aucun argent ne circule.
POST /paiements/en-ligne rend adresse_paiement, une page de paiement Paystack de test. Les références de la préproduction commencent par PPAY-. Moyens de test publiés par Paystack (documentation Paystack) :
| Moyen | Valeurs | Résultat |
|---|---|---|
| Carte, sans validation | 4084 0840 8408 4081 · CVV 408 · date d'expiration future | Réussi |
| Carte refusée | 4084 0800 0000 5408 · CVV 001 | Refusé |
| Orange Money (Côte d'Ivoire) | 0700000000 · OTP 1234 | Réussi |
Après le paiement, Paystack renvoie vers une page de retour, qui ne fait qu'informer le payeur. C'est la vérification qui constate le règlement : le client ou CYBASTION appelle POST /paiements/{id}/verification, et la plateforme interroge Paystack. Tant que le paiement n'est pas fait, la réponse le dit (initie) sans rien modifier.
POST /paiements/paystack/notification est réservée à Paystack. Elle exige une signature HMAC SHA-512 et une adresse d'expédition de Paystack. Un appel depuis vos postes répond 401, et c'est le comportement attendu.
Courriels de test
La préproduction n'envoie aucun courriel à l'extérieur. Bienvenue, lien de mot de passe, code de signature et avis : tout est retenu dans une boîte de réception de test. Pour lire un code de signature ou suivre un lien d'accès, demandez à CYBASTION l'accès à cette boîte. Pour essayer la signature sans boîte de réception, utilisez la voie papier (POST /devis/{id}/signature).
Sécurité
Ce que la plateforme garantit, à éprouver en préproduction.
Authentification
- Jeton d'accès JWT signé (ES256) par le service d'authentification. L'API vérifie sa signature, son émetteur et son expiration à chaque appel.
- Durée de vie d'une heure, renouvelable par un jeton de renouvellement à usage unique.
- À chaque appel, l'API relit le compte : un compte désactivé est refusé sur-le-champ (
403 compte_inactif), même avec un jeton encore valable. - Les liens d'accès valent 20 minutes, ne servent qu'une fois, et seul le dernier demandé fonctionne.
POST /public/mot-de-passe/lienrépond de la même façon que l'adresse ait un compte ou non : elle ne révèle rien.
Autorisations et cloisonnement
- 12 rôles, 60 permissions. Chaque opération exige une permission précise, indiquée dans la référence ; sans elle :
403 permission_refusee. - Un partenaire ne voit que son portefeuille, et un client que son propre dossier. Une ressource hors périmètre répond 404 et non 403, pour ne pas révéler qu'elle existe.
- Les données sont aussi protégées en base, par des politiques de sécurité au niveau des lignes (RLS).
- Un fichier ne peut être joint que par le compte qui l'a déposé.
Entrées et fichiers
- Chaque corps, paramètre et identifiant est validé avant tout traitement. Un champ manquant ou mal formé répond
400, un champ inconnu est ignoré, et un corps ne dépasse pas 1 Mo. - Fichiers : 10 Mo au plus. Seuls sont admis PDF, JPEG, PNG, WebP et HEIC, et le contenu réel est contrôlé, pas seulement l'extension. Chaque fichier passe un antivirus avant de pouvoir être joint. Un compte dépose 60 fichiers par heure au plus ; un PDF compte 50 pages au plus, une image 50 mégapixels au plus.
- La lecture d'un fichier passe par une adresse signée, valable 5 minutes.
- Le montant d'un paiement en ligne est le reste dû, recalculé par la plateforme : l'appelant n'en transmet aucun. Un règlement déclaré hors ligne n'a d'effet qu'après validation par la Finance.
Débit et transport
- 300 requêtes par minute et par compte, ou par adresse IP sans jeton ; au-delà,
429avecretry-after. La demande de lien de mot de passe est limitée à 10 par adresse IP et par quart d'heure. - HTTPS seulement, avec HSTS,
X-Content-Type-Options: nosniffet une politique de référent stricte. - CORS : depuis un navigateur, seuls le back-office et ce portail sont admis. Un appel de serveur à serveur (Odoo) n'est pas concerné.
Traçabilité et paiements
- Les actions métier (créations, décisions, corrections, suppressions) sont inscrites au journal d'audit, qui n'accepte que des ajouts :
GET /journal-audit(compte CYBASTION). - Signature électronique : code à six chiffres envoyé par e-mail, valable 10 minutes, 3 essais au plus. La preuve (adresse IP, appareil, empreintes du document) est conservée et le PDF scellé.
- Notifications Paystack : signature HMAC SHA-512 et adresses d'expédition vérifiées, notification enregistrée avant traitement, traitement idempotent (une notification rejouée ne crédite rien de plus).
- Les messages d'erreur ne contiennent aucun détail technique interne.
Comportements voulus
Ces comportements surprennent parfois lors d'un audit. Ils sont délibérés.
| Constat | Explication |
|---|---|
| Après déconnexion, le jeton d'accès reste accepté. | Le jeton est vérifié par sa signature, sans état. Il expire au plus tard une heure après son émission ; la déconnexion révoque son renouvellement. Pour couper un accès immédiatement, CYBASTION désactive le compte. |
| Une ressource d'un autre partenaire répond 404, pas 403. | Le cloisonnement ne révèle pas l'existence de ce que l'appelant ne doit pas voir. |
La clé apikey figure dans le portail. | C'est la clé publique de l'environnement, embarquée par le back-office et l'application. Elle n'ouvre aucun droit sans compte. |
PUT /roles/{id}/permissions répond 409. | Les 12 rôles livrés sont des rôles système, non modifiables. La route sert aux rôles qui seraient créés plus tard. |
| Une demande de lien pour une adresse inconnue répond 202. | La réponse ne doit pas permettre de savoir si un compte existe. |
| Un refus métier répond 409 avec un message explicite. | Ce n'est pas une panne : l'opération contredit l'état de l'objet (devis déjà signé, règlement dont dépend une installation lancée…). |
Règles d'essai
Les tests de sécurité sont bienvenus, dans ce cadre.
- Toutes les opérations de l'API et du service d'authentification de la préproduction, avec les comptes d'essai.
- Les essais de contournement : changer d'identifiant, de rôle ou de jeton, falsifier un jeton, injecter des valeurs inattendues, déposer des fichiers piégés (la chaîne de test EICAR suffit pour l'antivirus).
- Atteindre la limite de débit pour constater le
429.
- Tout essai sur la production (
api.satelica.com,admin.satelica.com,supabase.satelica.com) : elle porte des données réelles, et vos comptes d'essai n'y existent pas. - Les tests de charge et de déni de service, les analyses automatisées massives, la recherche de mots de passe par force brute.
- Toute cible hors de l'API et de l'authentification : serveur, ports, consoles d'administration, autres sites. La boîte de courriels de test sert à lire vos messages, pas à être éprouvée.
- Les données réelles : personnes, sociétés, cartes bancaires. Seuls les moyens de test Paystack sont admis.
- Partager les comptes d'essai en dehors de l'équipe d'intégration.
Une faille trouvée se signale à CYBASTION, en privé, avec l'opération, la requête et l'heure. Elle n'est divulguée nulle part avant sa correction.
Données et assistance
- Les données de la préproduction sont fictives et partagées : nos recettes automatiques y créent aussi des objets, reconnaissables au préfixe « ZZ Recette » et effacés régulièrement.
- La préproduction peut être remise à neuf entre deux campagnes d'essai ; les comptes d'essai sont alors rouverts.
- Elle reçoit chaque nouvelle version avant la production : le contrat publié ici est toujours celui du code en service.
Pour une question, un compte supplémentaire, un exemplaire de document à rejouer ou un incident, adressez-vous à votre interlocuteur CYBASTION. Indiquez l'opération, l'heure, le compte employé et, en cas d'erreur, la réponse reçue.