Une ligne de facturation qui ne correspond à aucune fonctionnalité visible sur le site : voilà ce qui a déclenché, dans une agence de développement WordPress, un audit qui a fini par révéler que douze sites clients continuaient d’exécuter des appels de test vers une API de LLM, plusieurs mois après leur mise en production.
Le code en question avait été écrit pour valider, en phase de développement, qu’un endpoint de génération de résumés fonctionnait correctement. Un appel factice, déclenché à chaque chargement d’une page d’administration spécifique, n’avait jamais été retiré avant la mise en ligne, et s’était retrouvé dupliqué sur onze autres sites construits à partir du même gabarit de développement.
Comment cet oubli s’est propagé
L’agence utilise un squelette de projet commun pour démarrer chaque nouveau site WordPress, incluant un ensemble de fonctionnalités standard. Le code de test avait été intégré directement dans ce squelette par un développeur, à un moment où l’intégration de l’IA générative faisait l’objet d’une phase d’expérimentation interne. Une fois cette expérimentation validée, le code de test n’a jamais été retiré du squelette, et chaque nouveau projet créé ensuite en a hérité automatiquement.
Le résultat s’est propagé silencieusement : chaque site créé à partir de ce squelette exécutait, à chaque chargement d’une page d’administration précise, un appel vers l’API de LLM, sans que cet appel produise le moindre effet visible pour l’utilisateur final.
Pourquoi personne ne l’avait remarqué

Trois facteurs ont retardé la détection de ce problème :
- Le coût unitaire de chaque appel restait faible, ce qui rendait la ligne de facturation peu visible au milieu d’un volume global important.
- L’appel ne produisait aucune erreur ni ralentissement perceptible côté visiteur, puisqu’il se déclenchait uniquement en interface d’administration.
- Aucun processus de revue de code n’était en place pour identifier spécifiquement les appels vers des services facturés avant une mise en production.
C’est finalement un rapprochement manuel entre les factures mensuelles de l’API et le nombre de pages d’administration effectivement consultées qui a révélé l’écart : le nombre d’appels facturés dépassait largement ce que l’usage réel du site pouvait justifier.
Le processus d’audit mis en place ensuite
À la suite de cet incident, l’agence a instauré une revue de code systématique avant chaque mise en production, avec une étape spécifique dédiée à la recherche de tout appel vers un service facturé (API de LLM, service d’envoi d’e-mails, service de stockage) laissé actif depuis la phase de développement.
Un script de recherche simple, exécuté avant chaque déploiement, permet désormais de repérer les appels suspects :
grep -rn "call_llm_api\|wp_remote_post.*api\.openai\|wp_remote_post.*api\.anthropic" \
--include="*.php" wp-content/themes/ wp-content/plugins/mu-plugins/
Ce script ne remplace pas une revue de code complète, mais il attire l’attention sur les fichiers à examiner en priorité, en particulier ceux hérités d’un squelette de projet commun à plusieurs sites.
Le coût réel de l’oubli
Sur les douze sites concernés, le montant cumulé facturé pour ces appels superflus, étalé sur plusieurs mois, restait relativement modeste par site individuel, mais atteignait un total significatif une fois additionné sur l’ensemble du parc. L’agence a pris en charge ce montant sans le répercuter sur les clients, considérant qu’il s’agissait d’une erreur strictement interne.
Un appel de test qui ne coûte presque rien à l’unité peut, multiplié par plusieurs sites et plusieurs mois, représenter un montant qu’aucune agence ne souhaite découvrir a posteriori dans une facture.
En résumé
Un audit croisé entre les factures d’un service tiers et le code réellement déployé constitue le moyen le plus fiable de détecter ce type d’oubli, bien plus efficace qu’une simple relecture du code au moment du déploiement. La question de la sécurité des clés d’API elles-mêmes, distincte de celle des appels superflus, mérite un traitement séparé qui n’a pas été abordé dans cet audit.