Developpeurs
Documentation API
Une API qui rend la meme decomposition de frais que le site, ligne a ligne, sans marge cachee. Cette page decrit les conventions communes a tous les endpoints, et dit precisement ce qui est ouvert aujourd’hui.
Ce qui est ouvert aujourd’hui
1 endpoint est reellement expose et appelable : la cotation. Les 5 autres sont publies comme contrat, pour que vous puissiez construire avant qu’ils ouvrent, et ils portent tous une pastille explicite.
Nous documentons en avance parce que c’est utile a une integration. Laisser croire que c’est branche ne le serait pas : chaque endpoint indique son etat, et les exemples de reponse des endpoints ouverts sont des reponses reellement obtenues, pas des maquettes.
Base et versionnement
Deux bases coexistent : celle qui repond aujourd’hui, et celle de l’API versionnee qui accompagnera l’emission des cles.
- Aujourd’hui
- /api Ouvert
- API versionnee
- /api/v1 Contrat publie, non ouvert
La version est dans le chemin, pas dans un en-tete : une URL doit pouvoir etre collee dans un ticket sans perdre son contexte. Une modification cassante — champ retire, type change, semantique differente — ouvre une nouvelle version ; l’ancienne reste servie pendant au moins six mois, avec sa date de fin annoncee dans le journal des versions. Ajouter un champ n’est pas cassant : votre client doit ignorer les champs qu’il ne connait pas.
Conventions
Elles sont valables sur tous les endpoints, ouverts comme a venir. La plupart existent pour une seule raison : ne jamais perdre un centime en route.
Les montants sont des chaines, ou des entiers d’unites mineures
Jamais un nombre flottant. En JSON, 0.1 + 0.2 ne fait pas 0.3, et un grand montant perd des unites mineures a la serialisation. Les montants en unite majeure sont donc transmis en chaine, et les montants internes en entier d’unites mineures accompagnes de leurs decimales.
{
"net": "912.28",
"currency": "EUR",
"currencyDecimals": 2
}Les decimales dependent de la devise
L’euro a deux decimales, le franc CFA et le dong vietnamien en ont zero. Ne codez pas « x 100 » en dur : lisez currencyDecimals, ou le champ decimals du referentiel.
{ "amount": "125000", "currency": "XOF", "currencyDecimals": 0 }Les montants crypto sont en unites de base
Le depot est rendu avec son nombre de decimales : 8 pour le bitcoin, 6 pour USDT, 18 pour l’ether. Le meme ticker peut exister avec des decimales differentes selon le reseau : fiez-vous au champ, pas a votre memoire.
{ "deposit": { "amount": "1000.000000", "ticker": "USDT", "decimals": 6 } }Les horodatages
Les dates sont en ISO 8601 UTC. Une exception assumee : rateAsOf est un horodatage Unix en millisecondes, parce qu’il sert a un calcul d’age, pas a un affichage. Il indique la date de la DONNEE de marche, pas celle de votre requete : c’est cette distinction qui permet de detecter un prix perime.
{ "rateAsOf": 1788356981608, "rateSource": "coingecko" }Les identifiants sont stables
Un identifiant d’actif, de rail ou de pays ne change pas et n’est jamais reattribue. Un rail ferme garde le sien, avec sa phase et son motif : votre integration voit pourquoi il a disparu de vos options, au lieu de constater un trou.
Les messages destines a un humain sont bilingues
Un motif de refus est rendu en francais et en anglais dans le meme objet. Vous affichez celui de votre utilisateur, sans table de traduction a maintenir de votre cote.
{ "reason": { "fr": "…", "en": "…" } }Premier appel
Aucune cle n’est necessaire pour coter. Cet appel fonctionne tel quel.
curl -sS -X POST https://fiatside.com/api/quote \
-H 'Content-Type: application/json' \
-d '{
"assetId": "usdt",
"railId": "sepa_instant",
"networkId": "tron",
"direction": "sell",
"amount": "1000"
}'{
"deposit": { "amount": "1000.000000", "ticker": "USDT", "decimals": 6 },
"gross": "921.68",
"net": "912.28",
"currency": "EUR",
"currencyDecimals": 2,
"midRate": "0.92168430",
"effectiveRate": "0.91228000",
"totalCostBps": 102,
"lines": [
{ "code": "network", "amount": "1.11", "basis": "Cout reseau tron, preleve en USDT" },
{ "code": "spread", "amount": "8.29", "basis": "0.90 % du montant converti" }
],
"settlement": { "p50Minutes": 1, "p95Minutes": 12 },
"lockSeconds": 1800,
"rateAsOf": 1788356981608,
"rateSource": "mock",
"limitError": null
}Le champ rateSource indique la source du prix. La valeur « mock » designe la source deterministe de developpement, qui ne peut pas demarrer en production : le processus refuse de se lancer plutot que de coter des prix figes.
Sections
- AuthentificationComment l’endpoint de cotation est protege aujourd’hui, comment les cles seront emises, et les regles de manipulation d’une cle de production.
- CotationL’endpoint de cotation, sa decomposition ligne a ligne, la gestion des limites de rail et la duree de verrouillage du taux.
- CommandesCreation d’une commande, cle d’idempotence, adresse de depot, memo obligatoire sur certains reseaux, et lecture des transitions d’etat.
- ReferentielsCatalogues de rails, d’actifs et de pays, schema de champs du beneficiaire pour generer votre formulaire de payout, et pagination par curseur.
- WebhooksEvenements emis, signature HMAC-SHA256, fenetre de rejeu, politique de reessai et verification en temps constant.
- ErreursChaque code d’erreur, son statut HTTP, ce qu’il signifie exactement, la conduite a tenir cote integration et lesquels meritent un reessai.
Ce que l’API ne fera pas
Les limites d’une API sont aussi utiles a connaitre que ses possibilites.
- Aucun payout vers un tiers. Le nom du beneficiaire doit correspondre a l’identite verifiee du titulaire de la commande, et les rails de paiement rapprochent desormais le nom et le compte.
- Aucune creation de compte ni verification d’identite par API. Ces etapes se font dans un parcours ou l’utilisateur voit ce qu’il accepte.
- Aucune cle en parametre d’URL. Les URL finissent dans les journaux, les en-tetes de referrer et les historiques : une cle passee ainsi est une cle a revoquer.
- Aucune mise en cache d’une cotation par nos soins. La reponse porte Cache-Control: no-store, et votre integration ne devrait pas la contourner : une cotation en cache est un prix perime presente comme ferme.
- Aucun endpoint d’achat de crypto. Le service va dans un seul sens, actif numerique vers monnaie ayant cours legal.