OpenAPI Diff
Un diff OpenAPI compare deux versions d’une spécification d’API — l’ancien contrat et le nouveau — et signale ce qui a réellement changé : points de terminaison supprimés, paramètres devenus obligatoires, champs dont le type a changé, valeurs d’énumération disparues. Chargez ou collez les deux spécifications ci-dessous et cette page classe chaque changement comme incompatible ou compatible, pour juger une mise à niveau d’un fournisseur, ou votre propre version, avant qu’elle n’arrive en production. Les deux fichiers sont analysés dans cette page, sur votre appareil — rien n’est téléversé, ce qui compte parce que les spécifications décrivent des points de terminaison internes que vous ne voulez pas forcément sur le serveur d’un autre. Nouveau dans ce vocabulaire ? L’article compagnon, les changements incompatibles d’API, expliqués, définit chaque terme utilisé ici.
Dernière mise à jour:
Ancienne spécification (le contrat que les clients utilisent aujourd’hui)
Déposez un fichier n’importe où dans ce panneau, choisissez-en un, ou collez le texte. L’analyse est locale ; rien ne quitte cet appareil.
Nouvelle spécification (le contrat candidat)
Déposez un fichier n’importe où dans ce panneau, choisissez-en un, ou collez le texte. L’analyse est locale ; rien ne quitte cet appareil.
Résultat de la comparaison
Résumé copié dans le presse-papiers.
Ce que ce comparateur vérifie — et ce que « incompatible » signifie vraiment
Un changement est incompatible quand un client écrit correctement contre l’ancienne spécification peut échouer contre la nouvelle sans changer une ligne de son propre code. Cette définition guide chaque verdict de cette page. Supprimer un chemin ou une opération est incompatible parce que les appels existants n’ont nulle part où aller. Supprimer un statut de réponse — surtout un 2xx — est incompatible parce que la gestion d’erreurs du client a été écrite autour de l’ancien ensemble. Ajouter un paramètre obligatoire ou une propriété de requête obligatoire est incompatible parce que la requête valide d’hier est soudain rejetée. Changer le type ou le format d’un champ est incompatible parce que les analyseurs, validateurs et SDK générés reposent tous sur le type déclaré. Retirer une valeur d’énumération est incompatible parce qu’un client peut encore l’envoyer, ou conserver des données qu’il ne peut plus interpréter. Tout le reste — un nouveau point de terminaison, un paramètre facultatif, un nouveau champ de réponse, une nouvelle valeur d’énumération, un nouveau code de statut — est signalé comme compatible : les anciens clients continuent de fonctionner, même s’ils ne peuvent pas encore utiliser la nouvelle capacité.
La comparaison est structurelle, pas textuelle. Les deux documents sont normalisés dans le même modèle avant toute comparaison : chaque chemin et chaque opération, leurs paramètres indexés par nom et emplacement, leur corps de requête et chaque réponse réduits à une signature de schéma — un résumé déterministe des types, formats, noms de propriétés, listes de champs obligatoires et valeurs d’énumération, construit récursivement et avec les références locales $ref résolues. C’est pourquoi réordonner les clés, reformater les espaces ou réécrire chaque description produit un diff vide : rien de tout cela ne change le contrat. Et c’est pourquoi un changement enfoui à trois niveaux dans un schéma référencé est quand même trouvé — la signature développe la référence au lieu de comparer son nom.
Deux formes d’entrée sont acceptées parce que l’écosystème publie les deux : le JSON est essayé d’abord et, quand cela échoue, le texte est analysé comme YAML, le format qu’utilisent la plupart des documents OpenAPI écrits à la main. Les documents Swagger 2.0 fonctionnent aussi, y compris leurs paramètres in: body et leurs schémas par réponse. Il n’y a délibérément ni récupération distante ni téléversement : collez les documents ou déposez les fichiers, exactement comme vous le feriez avec une capture HAR, et la comparaison s’exécute quand vous appuyez sur le bouton — pas à chaque frappe —, de sorte que deux grandes spécifications collées restent réactives.
Utilisez le résultat comme une porte de publication, pas comme une décoration. Dans une revue, la liste des incompatibles est l’ordre du jour : chaque entrée a besoin d’un correctif, d’une montée de version, d’une fenêtre d’obsolescence ou d’une décision écrite que la rupture est voulue et communiquée. La liste des compatibles est le brouillon du journal des changements. Exporter le diff en JSON permet d’archiver cette décision à côté de la version, et le résumé copiable entre directement dans une demande de tirage — la même discipline que vous appliqueriez à un changement de contrat de webhook, où une charge utile modifiée en silence casse tous les abonnés d’un coup.
Limites honnêtes, dites clairement. Ce comparateur compare le contrat déclaré : il ne peut pas voir le comportement que la spécification ne déclare pas, comme un champ qui garde son type mais change de sens, une nouvelle règle métier, des limites de débit plus strictes ou un message d’erreur que les clients analysaient (imprudemment). Il suit les références locales et compare les schémas jusqu’à une profondeur bornée, de sorte que les schémas pathologiquement imbriqués ou mutuellement récursifs sont résumés plutôt que développés à l’infini. Et un diff avec zéro changement incompatible n’est pas une promesse qu’une mise à niveau est sûre — c’est la preuve que le contrat documenté a tenu, ce qui est exactement la preuve qu’il vaut la peine d’avoir avant de déployer.
Le tableau de classification contre lequel cette page évalue
| Chemin ou opération supprimé | Incompatible. Les appels à un point de terminaison qui n’existe plus échouent purement et simplement ; il n’existe aucun moyen compatible de faire continuer un ancien client contre lui. |
| Statut de réponse supprimé | Incompatible. La logique de nouvelle tentative, de gestion d’erreurs et de supervision du client est écrite contre l’ensemble de statuts déclaré ; perdre un 2xx en est la forme la plus grave. |
| Paramètre devenu obligatoire / champ obligatoire ajouté | Incompatible. Les requêtes valides sous l’ancienne spécification sont rejetées par la nouvelle, donc chaque client existant doit changer avant de pouvoir appeler le point de terminaison. |
| Type ou format changé | Incompatible. Les analyseurs, validateurs et SDK générés sont construits à partir du type déclaré ; passer d’integer à string (ou d’int32 à int64) casse les clients stricts même quand les valeurs sur le fil se ressemblent. |
| Propriété supprimée (requête ou réponse) | Incompatible. Une propriété de requête que les clients envoient est ignorée ou rejetée ; une propriété de réponse que les clients lisent devient nulle ou absente dans leur code. |
| Valeur d’énumération retirée | Incompatible. Les clients peuvent encore envoyer la valeur retirée, ou conserver des données qui l’utilisent. Les valeurs d’énumération ajoutées sont compatibles et sont signalées séparément. |
| Ajouts | Compatible. Les nouveaux chemins, opérations, paramètres facultatifs, propriétés de requête facultatives, propriétés de réponse, statuts de réponse et valeurs d’énumération n’invalident jamais une interaction auparavant valide. |
Questions fréquentes
Mes fichiers de spécification sont-ils téléversés quelque part ?
Non. Les deux documents sont analysés et comparés dans cette page, sur votre appareil ; les comparer n’émet aucune requête réseau et rien n’est stocké. C’est une règle délibérée : une spécification est une carte de votre API — y compris les points de terminaison internes et non documentés — et un outil qui vous demanderait de la téléverser pour la comparer collecterait exactement la carte que vous devez garder privée.
Quels formats sont acceptés ?
OpenAPI 3.x et Swagger 2.0, en JSON ou en YAML. Le texte est d’abord essayé comme JSON et analysé comme YAML quand cela échoue. Un document doit porter un objet paths pour être reconnu comme spécification ; tout le reste est signalé comme « pas une spécification » plutôt que de produire en silence un diff vide.
Qu’est-ce qui compte ici comme changement incompatible ?
Tout ce qui peut faire échouer un ancien client correctement écrit : chemins, opérations ou statuts de réponse supprimés ; paramètres ou propriétés de requête devenus obligatoires ; changements de type ou de format ; propriétés de requête ou de réponse supprimées ; et valeurs d’énumération retirées. Ajouter quoi que ce soit de facultatif est compatible. Les changements de description, de titre et de formatage sont entièrement ignorés — ce ne sont pas des changements de contrat.
Comment les schémas référencés sont-ils traités ?
Les références locales comme #/components/schemas/Pet (ou #/definitions/Pet en Swagger 2.0) sont résolues lors de la construction des signatures, de sorte qu’un changement dans un schéma partagé est signalé sur chaque opération qui l’utilise. La résolution est bornée en profondeur et sûre face aux cycles, de sorte que les schémas récursifs ne peuvent pas bloquer la comparaison.
Puis-je archiver ou partager un résultat ?
Oui. Le bouton de téléchargement exporte le diff complet en JSON — les compteurs du résumé plus chaque changement avec sa gravité, son type, son chemin, sa méthode et son détail structuré — et le bouton de copie produit un résumé en texte brut pour une demande de tirage ou une note de version. Les deux sont générés localement à partir de la comparaison que vous venez d’exécuter.