Intégration API

Donner à chaque événement un instant, une zone et une règle métier que tous les systèmes interprètent de la même façon

Jérémy Chomel Dawap
  • Publié le : 4 août 2026
  • Temps de lecture : 15 minutes
  1. Reconnaître une ambiguïté temporelle
  2. Distinguer les quatre types de temps
  3. Écrire un contrat temporel opposable
  4. Conserver zone IANA et décalage
  5. Traiter les changements d’heure
  6. Définir clôtures et intervalles
  7. Mesurer un SLA sur la bonne horloge
  8. Ordonner les événements distribués
  9. Historiser sans réécrire le passé
  10. Implémenter stockage et transport
  11. Tester les frontières temporelles
  12. Appliquer la méthode à une clôture
  13. Éviter les erreurs fréquentes
  14. Plan d’action en six semaines
  15. Guides complémentaires API
  16. Conclusion : rendre le temps explicite
Portrait de Jérémy Chomel

Une commande créée à 2026-10-25 02:30 arrive dans l’ERP. Cette heure existe deux fois à Paris le jour du passage à l’heure d’hiver. L’API ne transmet ni décalage ni zone : deux systèmes peuvent donc ranger la même commande dans deux périodes comptables différentes sans produire d’erreur technique.

Le problème reste discret jusqu’à une clôture, une pénalité de SLA ou un remboursement, puis la douleur devient un blocage financier difficile à attribuer. Un signal faible apparaît lorsque le support corrige manuellement des commandes « du lendemain » alors que les payloads et les statuts HTTP semblent parfaitement valides.

Le vrai enjeu d’une intégration ne consiste pas à « tout mettre en UTC ». Vous allez comprendre comment distinguer l’instant physique, l’heure civile observée, la date métier et la durée mesurée, puis nommer l’autorité de chacune pour construire un contrat opposable et une preuve opérationnelle.

Notre expertise en intégration API relie ces choix aux schémas, bases, queues, reprises et règles de gestion. Ainsi, chaque producteur et consommateur prend la même décision au moment où le calendrier devient ambigu.

Reconnaître une ambiguïté temporelle avant l’incident

Un champ date peut désigner un instant, un jour civil, une échéance inclusive ou une simple valeur d’affichage. Un suffixe Z ne résout pas la sémantique : il dit seulement que la valeur sérialisée porte un décalage UTC nul.

Chercher les symptômes dans les opérations

Les symptômes typiques sont des commandes déplacées d’un jour, des exports incomplets autour de minuit, une durée négative, deux exécutions d’un batch ou un SLA différent entre le fournisseur et le client. Ils se concentrent souvent aux changements d’heure et aux frontières de clôture.

Le diagnostic conserve payload brut, en-têtes, horloge du producteur, instant de réception, zone configurée, version des règles et valeur persistée. Il compare la première transformation plutôt que l’écran final, déjà converti plusieurs fois.

Un deuxième signal faible est la multiplication des appels à startOfDay, des offsets fixes et des corrections « plus deux heures » dans le code. Ces raccourcis fonctionnent sur une saison puis deviennent faux sans changement applicatif visible.

Distinguer les quatre types de temps

L’instant désigne un point unique sur la chronologie. L’heure locale décrit ce qu’une personne lit dans une zone. La date métier classe une opération selon une convention commerciale. La durée mesure un écart avec une horloge adaptée.

Ces types ne doivent pas partager un même objet générique. Une date de naissance n’a ni fuseau ni heure ; un départ à 09:00 Europe/Paris a besoin d’une zone ; un événement technique exige un instant précis et une provenance.

Nommer la décision portée par chaque champ

Le champ occurred_at répond à « quand l’événement s’est-il produit ? », tandis que business_date indique dans quel jour de vente le comptabiliser et scheduled_local_time conserve l’heure civile choisie par l’utilisateur.

La documentation indique type, exemple, granularité, autorité, règle de conversion et comportement aux frontières. Le nom seul ne remplace pas cette définition, surtout lorsqu’un ancien consommateur interprète encore created_date comme une chaîne locale.

Contre-intuitivement, convertir immédiatement toute valeur en UTC peut détruire l’intention. Une réunion prévue chaque lundi à 09:00 Paris doit rester à 09:00 après un changement d’heure ; répéter un instant UTC fixe la déplacerait à 10:00 local.

Écrire un contrat temporel opposable

Le contrat précise format RFC 3339, présence obligatoire du décalage, précision maximale, intervalle autorisé et sémantique métier. Il interdit les dates naïves lorsqu’un instant unique est attendu et refuse de deviner une zone depuis le serveur.

Chaque champ possède des exemples valides et invalides : seconde intercalaire selon la politique choisie, fraction excessive, offset absent, heure inexistante ou date hors plage. Les SDK ne corrigent jamais silencieusement une valeur impossible.

Si le domaine attend un instant unique, alors le décalage devient obligatoire et une valeur naïve est rejetée. En revanche, si l’utilisateur choisit un horaire civil futur, la zone IANA reste nécessaire pour préserver son intention après un changement saisonnier.

Associer valeur, contexte et provenance

Pour un événement, la sortie contient occurred_at, occurred_zone, recorded_at et éventuellement business_date. La première valeur vient du domaine, la deuxième explique l’intention civile, la troisième établit l’entrée dans la plateforme.

Le producteur reste owner de l’instant métier ; la passerelle contrôle le format et journalise l’écart avec son horloge. Le monitoring suit valeurs futures, trop anciennes, naïves ou incohérentes avec la date métier. Le repli met l’événement en quarantaine au lieu d’inventer l’heure.

Le schéma versionné rend tout assouplissement visible. Accepter temporairement un ancien format exige cohorte, métrique d’usage, date de retrait et message de dépréciation destiné au consommateur concerné.

Conserver zone IANA et décalage observé

Un décalage comme +02:00 identifie un rapport à UTC à cet instant, pas les règles futures de Paris. Une zone IANA comme Europe/Paris permet de calculer les transitions historiques et futures selon une base de règles versionnée.

Si la date porte uniquement sur un événement passé, alors instant et décalage observé suffisent souvent à la preuve. En revanche, une planification récurrente exige zone, règle de résolution des heures impossibles et version de la base temporelle.

Pour un instant déjà produit, conservez l’instant canonique et le décalage reçu afin de prouver ce que le producteur a déclaré. Pour un horaire futur civil, conservez aussi la zone IANA et l’intention locale afin de recalculer correctement si les règles légales changent.

Versionner la dépendance aux règles de zone

Les runtimes n’embarquent pas toujours la même version de tzdata. Deux services peuvent donc projeter différemment un horaire futur dans une zone dont la loi vient de changer, même si leur code applicatif est identique.

L’inventaire enregistre version tzdata, image de runtime et date de déploiement. Une alerte compare les projections des échéances sensibles après une mise à jour ; le runbook prévoit relecture, communication métier et rollback de l’image si la nouvelle règle n’est pas encore applicable.

Ne stockez pas CET, EST ou un nom traduit comme identifiant de zone : ces abréviations sont ambiguës. Le contrat utilise un identifiant IANA autorisé et expose séparément le libellé destiné à l’utilisateur.

Traiter explicitement les changements d’heure

Au printemps, certaines heures locales n’existent pas ; à l’automne, certaines existent deux fois. Une bibliothèque peut avancer automatiquement l’heure inexistante ou choisir la première occurrence, mais ce choix technique n’est pas forcément la décision métier.

Le contrat définit une politique par cas d’usage : refuser et demander une correction, décaler au prochain instant valide, sélectionner l’occurrence précoce ou tardive, ou exiger le décalage explicite. Cette politique porte un identifiant versionné.

Rendre les deux occurrences discernables

Par exemple, 2026-10-25T02:30:00+02:00 et 2026-10-25T02:30:00+01:00 ont la même représentation civile à Paris mais désignent deux instants séparés d’une heure. Le payload complet ne peut pas les confondre.

Un batch planifié à 02:30 précise s’il s’exécute zéro, une ou deux fois le jour de transition. Sa clé idempotente dérive de l’occurrence choisie et non du seul libellé local, afin qu’un retry reste le même travail.

Les tests exécutent les transitions réelles des zones supportées, pas seulement une date artificielle. Ils prouvent également le comportement si le producteur envoie une heure ambiguë sans offset.

Définir clôtures et intervalles sans trou ni doublon

Une période fiable utilise des bornes semi-ouvertes : début inclus, fin exclue. Deux fenêtres consécutives [début, fin[ se touchent sans compter deux fois l’événement exactement placé sur la frontière.

La « journée du 4 août à Paris » se convertit depuis deux minuits civils dans Europe/Paris. Sa durée peut être 23, 24 ou 25 heures selon la transition ; ajouter mécaniquement 86 400 secondes à un instant ne reconstruit donc pas toujours le lendemain métier.

Séparer fenêtre de sélection et date comptable

La requête sélectionne les instants selon la fenêtre canonique, puis la règle de clôture calcule la date métier. Une vente après minuit peut appartenir au jour précédent si le commerce ferme à 03:00, mais cette convention reste explicite et datée.

Les exports portent window_start, window_end_exclusive, zone, règle de clôture et watermark de données. Un rejeu reprend exactement ces bornes ; il ne reconstruit pas « hier » depuis l’horloge du moment.

Le contrôle rapproche nombre, montant et identifiants aux frontières. Une différence sur les premières ou dernières minutes déclenche l’analyse de fenêtre avant toute correction comptable manuelle.

Mesurer un SLA sur la bonne horloge

Soustraire deux timestamps d’horloges différentes mélange latence métier et dérive des machines. Une durée interne doit utiliser une horloge monotone ; une durée distribuée nécessite des points d’observation nommés et une tolérance liée à la synchronisation.

Le SLA précise son départ : acceptation HTTP, persistance, émission dans la queue ou événement métier du partenaire. Il précise également l’arrêt, les heures ouvrées éventuelles, la zone du calendrier et les pauses autorisées.

Instrumenter les étapes plutôt qu’un total opaque

Chaque message conserve occurred_at, received_at, queued_at, processed_at et published_at. Les métriques calculent attente réseau, queue, traitement et publication sans attribuer toute la latence au mauvais propriétaire.

L’entrée est l’événement signé, la sortie est l’état publié, l’owner est défini par segment. Les seuils, dashboards, traces corrélées, dépendances NTP, alertes de dérive et procédure de repli figurent dans le runbook du SLA.

Un calendrier ouvré est une donnée versionnée : jours fériés, demi-journées et heures locales changent. Le calcul conserve la version utilisée afin qu’une pénalité reste reproductible après modification du calendrier.

Ordonner les événements distribués sans fausse certitude

Un timestamp ne garantit pas l’ordre causal entre services. Les horloges dérivent, les messages sont retardés et un événement ancien peut être rejoué après un événement récent. Trier uniquement par date de réception peut donc inverser deux décisions métier.

Le domaine fournit une version d’agrégat, un numéro de séquence ou un curseur producteur. Le consommateur utilise cette preuve pour appliquer, différer ou ignorer une transition, tandis que les instants servent à l’audit et à la mesure.

Combiner idempotence, séquence et temporalité

La clé d’événement empêche un double effet ; la version protège l’ordre par entité ; occurred_at raconte le moment métier ; received_at raconte le transport. Aucun de ces champs ne remplace les trois autres.

Un trou de séquence met les messages suivants en attente pendant un délai borné. Le monitoring signale agrégat, version attendue, owner, profondeur de file et âge ; le runbook choisit récupération, snapshot autoritaire ou reprise contrôlée.

Si deux producteurs peuvent modifier le même objet, le contrat définit une règle de concurrence métier. « Le timestamp le plus récent gagne » reste dangereux lorsqu’une horloge avancée peut effacer une décision légitime.

Historiser sans réécrire le passé

Corriger une zone mal configurée ne signifie pas remplacer toutes les valeurs historiques. Il faut distinguer l’instant réellement déclaré, l’interprétation faite à l’époque et la correction métier approuvée.

Le stockage append-only conserve payload source, instant d’ingestion, valeur normalisée, version du parseur et motif de correction. Une projection peut exposer la valeur corrigée sans effacer la preuve utile à l’audit.

Bitemporaliser les décisions sensibles

Le temps valide décrit quand une information s’applique au métier ; le temps système décrit quand la plateforme l’a connue. Cette distinction répond à « que croyions-nous lors de la clôture ? » et « que savons-nous maintenant ? ».

Une correction porte valid_from, recorded_at, auteur, justification et référence de ticket. Les requêtes historiques choisissent explicitement le point de vue au lieu de mélanger état actuel et vérité de l’époque.

Le coût de cette piste d’audit se justifie sur commandes, factures, prix, droits et SLA. Pour une donnée purement éphémère, un historique complet peut être disproportionné : la décision d’architecture dépend du risque de contestation.

Implémenter stockage, transport et observabilité

La base utilise un type capable de conserver l’instant avec la précision attendue ; le code convertit aux frontières et ne dépend jamais du fuseau système. Les dates civiles utilisent un type date, les durées un type durée, les zones un identifiant validé.

Le JSON sérialise les instants avec offset explicite et format stable. Les bases et drivers sont testés pour la précision, les années limites et les conversions automatiques. Une colonne locale héritée reste isolée derrière un adaptateur dont la zone source est configurée.

Définir un chemin de traitement observable

L’entrée brute est journalisée avec identifiant de corrélation ; le parseur produit valeur typée ou erreur structurée ; la normalisation conserve version et provenance ; la sortie publie contrat, séquence et timestamps d’étape.

Le responsable du contrat possède le dictionnaire temporel. L’instrumentation mesure erreurs de parsing, offsets inattendus, dérive, événements futurs et délais par étape. Les seuils ouvrent une alerte avant la clôture et la file de quarantaine constitue le repli.

La procédure de reprise relit le payload initial avec une version choisie, écrit une nouvelle décision et préserve l’idempotence. Elle ne modifie jamais directement la colonne finale sans trace ni comparaison d’impact.

Tester les frontières temporelles et les contrats

Les tests couvrent davantage que plusieurs fuseaux. Ils incluent heures inexistantes et doublées, minuit, fin de mois, année bissextile, précision fractionnaire, offset extrême, calendrier ouvré et versions différentes de tzdata.

Une horloge injectable fixe le temps des tests. Les scénarios ne dépendent pas de la machine CI, de sa locale ou du jour d’exécution. Les contract tests exécutent les mêmes vecteurs côté producteur, SDK et consommateur.

Prouver les invariants par génération

Les tests de propriétés génèrent zones, instants et intervalles. Ils vérifient qu’une conversion instant vers local puis vers instant restitue la valeur, que deux fenêtres semi-ouvertes ne se chevauchent pas et que la sérialisation reste stable.

Les golden tests conservent les décisions de clôture sur des dates de transition. Une mise à jour de bibliothèque ou tzdata qui les modifie exige une revue métier explicite plutôt qu’une simple régénération des résultats attendus.

En préproduction, une comparaison miroir calcule ancien et nouveau contrat sur des données réelles. Le déploiement s’arrête si un déplacement de date métier, une perte de précision ou une différence de SLA reste inexpliqué.

Dans quel cas appliquer la méthode : clôture multi-pays

Les commandes du Québec entrent dans une marketplace française, puis un ERP européen les confirme avant le calcul du reversement vendeur à 03:00 heure de Paris. Le partenaire envoie parfois une heure locale sans offset.

Réconcilier trois temporalités sans approximation

Le connecteur refuse la valeur naïve et demande occurred_at avec offset. Il conserve America/Toronto pour l’affichage, convertit l’instant en UTC et calcule business_date selon la règle de clôture Europe/Paris versionnée.

Par exemple, une commande à 21:30 Montréal peut arriver après minuit en France tout en appartenant à la clôture précédente. La règle produit cette décision ; aucun service ne retranche une journée selon son intuition locale.

L’export vendeur porte fenêtre, zone, version et watermark. Le rapprochement compare les identifiants aux bornes et le SLA sépare transport transatlantique, queue et traitement ERP. Une anomalie devient attribuable au lieu d’être classée « problème de fuseau ».

Éviter les erreurs fréquentes

Les erreurs classiques sont l’offset fixe, le fuseau du serveur, la date naïve, l’ajout de 24 heures, la borne de fin inclusive et la conversion multiple entre couches. Elles passent souvent les tests écrits en hiver dans une seule locale.

Refuser les corrections silencieuses

Une bibliothèque qui transforme 02:30 inexistant en 03:30 prend une décision. Le système doit l’exposer, la mesurer et l’assumer par politique ; sinon le client croit que son horaire a été respecté.

Autre erreur : utiliser created_at pour mesurer un SLA métier alors que le champ est généré après plusieurs reprises. Le départ et l’arrêt doivent correspondre aux engagements contractuels, pas aux colonnes les plus faciles à requêter.

À refuser enfin : réécrire les historiques après une correction de zone sans journal. Une clôture déjà signée doit rester explicable avec la règle et les données disponibles au moment de la décision.

Plan d’action : fiabiliser le temps en six semaines

Le chantier commence par les flux qui déclenchent argent, droits, pénalités et clôtures. Il stabilise le vocabulaire puis prouve les frontières avant de migrer les anciennes colonnes.

Semaines 1 et 2 : inventorier et décider

Recensez champs, formats, zones supposées, précision, conversions, calendriers, batchs et systèmes autoritaires. Échantillonnez les anomalies proches de minuit, des changements d’heure et des fins de période avec leur impact métier.

La sortie comprend taxonomie, dictionnaire, politiques DST, intervalles semi-ouverts, versions de calendrier et corpus de test. Chaque champ ambigu reçoit un owner et une cible de migration.

Semaines 3 et 4 : implémenter et comparer

Ajoutez types dédiés, parseur strict, timestamps d’étape, séquences et file de quarantaine. Exécutez les contrats sur les trois dernières clôtures et les prochaines transitions des zones réellement utilisées.

Le monitoring suit formats hérités, heures impossibles, dérive, retards et différences de date métier. Le runbook précise seuil d’arrêt, dépendance tzdata, correction, rejeu idempotent et rollback par version.

Semaines 5 et 6 : migrer et exercer

Activez une cohorte, comparez projections puis clôtures et simulez retard, message désordonné, panne NTP et changement d’heure. Corrigez les historiques par ajout de preuve, jamais par écrasement massif.

La porte de généralisation exige zéro date naïve nouvelle, des fenêtres réconciliées, des écarts de SLA attribuables, des contrats verts et une reprise testée puis signée par l’équipe d’astreinte.

  1. D’abord, typer chaque valeur comme instant, date civile, horaire local, durée ou date métier.
  2. Ensuite, rendre zone, offset, précision, bornes, règle de clôture et autorité explicites dans le contrat versionné partagé avec chaque consommateur.
  3. Puis, instrumenter chaque étape et ordonner les événements avec une séquence plutôt qu’une horloge supposée parfaite.
  4. À faire enfin : tester transitions réelles, rejouer une clôture et prouver que le passé reste explicable.

Guides complémentaires API et données

La fiabilité temporelle dépend d’une sémantique partagée et d’un mécanisme de reprise qui conserve l’ordre, l’idempotence, la provenance et la preuve de chaque transformation jusque dans le système consommateur.

Stabiliser sens et échange

Le mapping sémantique API versionné distingue grain, unité, temporalité et autorité. Le contrat d’échange ERP–e-commerce relie ces décisions au mapping, au versioning et aux reprises.

Le contrat temporel spécialise cette méthode : une même chaîne ne suffit plus lorsque l’instant, la date métier et l’heure choisie par un utilisateur portent des décisions distinctes.

Protéger doublons et montants

L’idempotence API contre les doublons sécurise les rejeux aux frontières temporelles. Le contrat de montants et devises API conserve ensuite taux, instant de conversion et décision financière réconciliable.

  • À prioriser : paiements, commandes, droits, clôtures, SLA et planifications qui traversent plusieurs zones ou dont un décalage change directement la décision métier.
  • À différer : l’uniformisation des libellés d’affichage tant que les types et autorités métier restent ambigus.
  • À refuser : toute conversion implicite fondée sur le fuseau d’un serveur, un offset fixe ou l’heure du rejeu.

Conclusion : rendre le temps explicite

Une date API fiable n’est jamais une chaîne isolée. Elle porte un type, une précision, un offset ou une zone, une autorité et la règle qui transforme l’instant en décision métier.

L’UTC aligne les instants ; la zone IANA préserve l’intention civile ; les intervalles semi-ouverts protègent les clôtures ; séquence et idempotence protègent enfin les événements distribués contre les reprises hors ordre.

La qualité devient visible lorsque le changement d’heure ne déplace plus une commande, qu’un SLA reste reproductible et qu’une correction historique ajoute une preuve au lieu d’effacer le passé.

Pour construire ce contrat de bout en bout, l’accompagnement de notre expertise en intégration API relie schémas, code, données, observabilité et procédures de reprise autour d’une même vérité temporelle.

Portrait de Jérémy Chomel

Transformez ce besoin en flux API fiable.

Dawap clarifie les systèmes concernés, les risques, le premier lot livrable et les conditions d’exploitation avant de construire le flux.

Vous préférez échanger ? Planifier un rendez-vous

Articles recommandés

Mapping sémantique versionné entre deux modèles de données API incompatibles Intégration API Versionner le sens, pas seulement le schéma Lire l'article
  • 2 août 2026
  • Lecture ~12 min

Deux champs nommés montant, statut ou client peuvent transporter des réalités incompatibles malgré un JSON valide. Cette méthode définit grain, autorité, unité, temporalité et règles de transformation, puis versionne chaque décision afin de tester, réconcilier et faire évoluer une intégration sans corruption silencieuse.

Flux API réconciliant montants décimaux, devises, taux de change, arrondis, taxes, remises et totaux comptables Intégration API Montants API : devises et arrondis sans écart comptable Lire l'article
  • 3 août 2026
  • Lecture ~13 min

Un montant sans devise, précision, règle d’arrondi et instant de conversion n’est pas un contrat financier. Cette méthode impose un type Money, des décimaux exacts, des allocations conservant les totaux, des exemples opposables et une réconciliation qui retrouve le premier centime divergent entre facture, paiement et comptabilité.

Contrat d’échange versionné entre ERP et e-commerce Intégration API Contrat d’échange ERP–e-commerce : le modèle Lire l'article
  • 22 juillet 2026
  • Lecture ~7 min

Un mapping ERP–e-commerce fiable décrit plus que des champs. Ce modèle attribue sources de vérité, identités, sens, cardinalités, unités, statuts, transformations, idempotence, erreurs, versions, sécurité et SLA. Il ajoute recette consommateur, observabilité et protocole de reprise pour faire évoluer catalogue, stock, clients et commandes sans correction silencieuse.

Idempotence API doublons commandes paiements factures Intégration API Idempotence API : éviter les doublons Lire l'article
  • 6 août 2024
  • Lecture ~3 min

Clés d'idempotence, retries, webhooks, paiements, commandes et factures doivent être conçus ensemble pour rejouer sans doublons. L'article aide à protéger les flux où une seconde tentative peut créer une commande, un paiement, une facture ou une écriture comptable en trop au run ou côté finance interne.