Le Meta Ads CLI est l'outil en ligne de commande officiel de Meta pour la Marketing API, lancé le 29 avril 2026 dans le cadre de ses Ads AI Connectors. Il s'installe comme un package Python 3.12+, s'authentifie avec un token d'accès system user et exécute des commandes selon le schéma meta ads <resource> <action>. Il couvre les campagnes, les ad sets, les publicités, les créas, les insights, les catalogues et les datasets, avec une sortie en tableau, en JSON ou en texte brut que les scripts peuvent parser. Il permet aux développeurs et aux agents de code IA de gérer des publicités Meta sans écrire de code API.
Meta est l'une des premières plateformes publicitaires à sortir son propre outil en ligne de commande, et elle a dit clairement à qui il s'adressait : les développeurs et les agents IA. Si tu as essayé de le configurer depuis le lancement, tu as sûrement trouvé les pièces éparpillées sur huit pages de documentation, un article de blog de lancement et une foule de commentaires tiers qui ne sont même pas d'accord sur les bases, comme la méthode d'installation ou le fonctionnement de l'authentification.
Ce guide du Meta Ads CLI rassemble tout : l'installation exacte, la configuration du token system user (là où la plupart des gens bloquent), chaque groupe de commandes, l'utilisation sécurisée depuis Claude Code ou Codex, les limites actuelles, le dépannage et la comparaison avec le CLI d'Ads Uploader. Il est vérifié par rapport à la documentation actuelle de Meta et au dernier package, la version 1.1.0, et rédigé par une équipe qui développe son propre CLI Meta Ads et lance des publicités via la Marketing API tous les jours.
Pourquoi je pense qu'un CLI est la meilleure façon d'uploader des publicités
J'en ai déjà parlé dans notre comparatif Meta Ads MCP vs CLI, et le fond du sujet n'a pas changé. À mon avis, un CLI est la meilleure infrastructure pour uploader des publicités.
La première raison, ce sont les fichiers. Un CLI a un contrôle natif de ton système de fichiers. Les lancements partent généralement de ton disque dur, ou d'un stockage cloud streamé ou synchronisé sur ton ordinateur, et un CLI lit ces fichiers de facto. Un serveur MCP hébergé, comme celui de Meta sur mcp.facebook.com/ads, ne voit pas du tout ton disque, donc les fichiers doivent arriver par URL, par lien Drive ou en données inline. C'est ce contournement qui explique pourquoi les gens trouvent la vidéo plus compliquée que les images via un MCP hébergé. La liste d'outils MCP de Meta contient un outil de créa décrit comme « single-image link ad creative », plus des outils pour lister les images et vidéos existantes, mais aucun outil d'upload dédié et aucune limite de fichier documentée. Les images semblent faisables ; la vidéo n'est pas documentée. (Un MCP installé en local, c'est différent : il tourne sur ta machine et peut lire des fichiers, c'est pour ça que le MCP d'Ads Uploader existe aussi sous forme de package local qui lit depuis le disque.)
La deuxième raison, c'est la façon dont l'agent trouve son chemin. Je trouve le CLI plus déterministe. Le retour de la ligne de commande fonctionne comme des garde-fous : la sortie de --help, les codes de sortie et les erreurs structurées orientent l'agent sur un chemin précis. Avec un MCP, l'agent a besoin de mieux comprendre comment les outils s'articulent pour construire un lancement, et beaucoup de clients chargent toutes les définitions d'outils dans le contexte dès le départ, environ 90 pour celui de Meta. Certains clients chargent désormais les outils à la demande, mais un MCP peut consommer plus de tokens, et d'après mon expérience, le CLI est tout simplement plus direct.
Le MCP garde sa place pour le reporting conversationnel et les questions sur le compte, ce que couvre notre guide du Meta Ads MCP. Ce guide-ci reste centré sur le CLI.
Qu'est-ce que le Meta Ads CLI ?
Selon les mots de Meta, dans sa documentation de l'Ads CLI : « Ads CLI is a command-line tool for managing Meta advertising from your terminal. » C'est un wrapper Python autour de la Marketing API qui gère les parties que chaque développeur reconstruisait à la main : l'authentification, la pagination, le formatage de la sortie et la gestion des erreurs.
Les faits clés, au 23 septembre 2026 :
- Package :
meta-adssur PyPI, maintenu par Meta. L'exécutable s'appellemeta. - Dernière version : 1.1.0, publiée le 17 juin 2026.
- Statut : Meta a lancé la famille Ads AI Connectors (le CLI plus le serveur MCP hébergé) en bêta ouverte. PyPI classe le package en Alpha.
- Licence : propriétaire. Il est gratuit à installer mais pas open source, et il n'y a ni repo GitHub public ni outil de suivi des issues.
- Public : Meta cite les développeurs qui construisent des intégrations publicitaires, les équipes opérationnelles qui automatisent via des scripts et du CI/CD, et « AI agents and tools ».
La motivation derrière le Meta Ads CLI parlera à tous ceux qui ont déjà automatisé des publicités Meta. Un acheteur d'agence sur r/FacebookAds décrivait son setup d'avant le CLI, fait de scripts Python et de cron jobs, comme « brittle as hell », cassant à chaque fois que Meta modifiait quelque chose dans l'API. Un outil officiel transfère une bonne partie de cette maintenance vers Meta, mais pas toute.
Ce que le Meta Ads CLI peut faire
L'exécutable 1.1.0 expose 14 groupes de ressources. La référence publique des commandes en liste la plupart, et le package installé inclut quelques extras (product feeds, guidance et studies) que la documentation web documente mal.
| Ressource | Actions |
|---|---|
campaign | list, create, get, update, delete |
adset | list, create, get, update, delete |
ad | list, create, get, update, delete |
creative | list, create, get, update, delete |
insights | get |
catalog | list, create, get, update, delete |
product-item | list, create, get, update, delete |
product-set | list, create, get, update, delete |
product-feed | list, create, get, update, delete |
dataset | list, create, get, connect, disconnect, assign-user |
adaccount | list, get, current |
page | list, get |
guidance | list |
study | list |
Il n'y a pas de groupe audience, video, image ou lead-form indépendant. Les uploads de vidéos passent par creative create, et les Custom Audiences sont référencées dans le JSON de ciblage de l'ad set.
Ce sont les fonctionnalités d'automatisation qui rendent le Meta Ads CLI adapté aux agents :
- Trois formats de sortie :
table(par défaut, pour les humains),json(pour les agents etjq) etplain(séparé par des tabulations, pourawketcut). --no-inputsupprime les invites interactives pour qu'un script ne reste jamais bloqué à attendre un o/n.- Des codes de sortie standard de 0 à 5, pour qu'un script ou un agent puisse réagir selon le type d'échec.
- Les variables d'environnement et le support de
.env, pour que les tokens restent hors de l'historique des commandes.

Comment installer le Meta Ads CLI
Les prérequis de Meta sont courts : Python 3.12 ou plus récent, et pip ou uv.
La commande d'installation officielle est :
pip install meta-ads
La page de démarrage de Meta enchaîne avec un simple uv sync, qui ne fonctionne que si tu es déjà dans un projet uv avec un pyproject.toml. Après une installation pip classique, tu n'en as pas besoin. Pour une installation propre et reproductible, utilise un environnement virtuel et fige la version :
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install meta-ads==1.1.0
meta --version
Deux pièges d'installation valent la peine d'être connus dès le départ :
- « No matching distribution found for meta-ads. » Le package est distribué sous forme de wheels compilés, pas de distribution source. Si ton Python est antérieur à 3.12, ou si ta plateforme ne correspond à aucun wheel publié, pip ne le trouve pas. Un utilisateur de r/FacebookAds est tombé exactement là-dessus la première semaine. Vérifie
python --versionavant de supposer que le nom du package est faux. - La version de l'API n'est pas figée. Le CLI ne fige pas de version de la Marketing API. Il hérite de celle qu'utilise le SDK
facebook-businessinstallé, et une installation fraîche le 23 septembre 2026 résout le SDK 26.0.2, soit la Marketing API v26.0. Mettre à jour les dépendances peut changer silencieusement la version de l'API sous tes scripts, donc fige à la foismeta-adsetfacebook-businesspour tout ce que tu automatises.
Dans Claude Code ou Codex, tu peux demander à l'agent d'installer le Meta Ads CLI pour toi. Ce qu'il ne peut pas faire, c'est la configuration côté Meta décrite dans la section suivante.
S'authentifier avec un token d'accès system user
Meta dit clairement que le Meta Ads CLI a besoin d'un token : « Ads CLI requires a system user access token to authenticate for programmatic access. » Il n'y a pas de commande meta auth login, pas de flux OAuth dans le navigateur et pas de whoami. Tu génères un token dans Business Manager et tu le fournis au CLI via une variable d'environnement.
C'est là que la plupart des configurations bloquent, alors voici la séquence complète.
Créer l'app Meta et le system user
- Dans Meta Business Suite, va dans Settings > Users > System Users.
- Crée un system user avec le rôle Admin.
- Crée ou sélectionne une app développeur Meta pour le business.
- Ajoute le system user à l'app en tant qu'App Admin.
Une app développeur est obligatoire pour passer par le CLI. C'est une vraie différence avec le MCP hébergé, qui fonctionne via un connecteur OAuth standard sans app à toi.
Assigner les assets et générer le token
- Assigne au system user chaque asset que le CLI va toucher : comptes publicitaires, Pages Facebook, datasets (Pixels) et catalogues produits si tu en utilises. Un asset non assigné est la raison la plus fréquente pour laquelle
meta ads adaccount listrevient vide. - Génère un token pour l'app avec ces scopes, listés dans le guide de configuration de Meta :
business_management
ads_management
pages_show_list
pages_read_engagement
pages_manage_ads
catalog_management
read_insights
La documentation Postman de Meta indique que les tokens system user peuvent durer jusqu'à 60 jours ou ne jamais expirer, selon l'option choisie et l'éligibilité de ton business.

Permissions de l'app et App Review
Le Meta Ads CLI passe toujours par ta propre app développeur Meta, et ce sont les permissions de cette app qui décident de ce que le CLI peut faire. Quand une nouvelle tâche ou un autre type de campagne échoue, la cause est souvent un blocage de permission plutôt qu'un bug du CLI :
- Les créas adossées à une Page nécessitent
pages_manage_ads. - Les catalogues nécessitent
catalog_management. - Les partnership ads nécessitent les permissions de branded content en plus des scopes publicitaires.
- Certains chemins de créa sont bloqués tant que l'app est en mode développement, ce qui se traduit par l'erreur 1885183. Une démo YouTube de mai montrait une campagne et un ad set créés sans problème alors que les publicités échouaient jusqu'à ce que l'app passe en Live.
Le niveau d'accès compte aussi. Meta décrit désormais l'accès à la Marketing API comme Limited ou Full. Le Limited Access suffit pour les comptes publicitaires de ton propre business, mais gérer les comptes d'autres business, ce que font les agences et les partenaires, nécessite le Full Access et l'App Review.
L'App Review n'est pas non plus un passage unique. À mesure que les exigences de Meta évoluent, tu dois la repasser pour rester à jour. D'après notre expérience, des reviews qui prenaient quelques jours il y a un an, avant que tout le monde utilise l'IA, prennent maintenant environ 10 à 20 jours, parfois plus. Meta ne publie aucun engagement sur la durée des reviews, donc demande les nouvelles permissions bien avant le lancement qui en a besoin.
Définir les variables d'environnement et l'ordre de priorité de la config
Le CLI lit trois variables :
| Variable | Rôle | Obligatoire |
|---|---|---|
ACCESS_TOKEN | Token d'accès system user | Oui |
AD_ACCOUNT_ID | Compte publicitaire par défaut, au format act_ | Pour la plupart des commandes ads |
BUSINESS_ID | Business par défaut pour les catalogues et les datasets | Facultatif |
Mets-les dans un fichier .env de projet exclu du contrôle de version :
ACCESS_TOKEN=<SYSTEM_USER_TOKEN>
AD_ACCOUNT_ID=act_123456789
BUSINESS_ID=123456789
Les paramètres sont résolus dans cet ordre, du plus prioritaire au moins prioritaire : les flags en ligne de commande, les variables d'environnement du shell, le .env du projet, puis la config utilisateur sous ~/.config/meta/. Vérifie ensuite que tout fonctionne :
meta auth status
meta ads adaccount current
meta ads page list
meta auth status indique si tu es authentifié, avec un token masqué. Si adaccount current renvoie le bon ID act_, tu es prêt.
Commandes du Meta Ads CLI : un aide-mémoire pratique
Une règle de syntaxe compte avant tout le reste : les options racines comme --output se placent avant ads, et les options de compte se placent après ads mais avant la ressource.
meta --output json ads campaign list
meta ads --ad-account-id act_123456789 campaign list
Vous hésitez à brancher l’IA directement sur Meta ?
Ads Uploader est apprécié par les media buyers exigeants et les agences, qui lui confient le lancement de centaines de milliers de publicités Meta chaque mois.
Essayer Ads Uploader gratuitementSans carte bancaire • Essai gratuit de 7 jours
Commandes de lecture (comptes, campagnes, insights)
meta ads adaccount list
meta ads campaign list
meta ads adset list
meta ads ad list
meta ads insights get --date-preset last_7d
Insights utilise last_30d par défaut, renvoie spend,impressions,clicks,ctr,cpc,reach et se limite à 50 lignes sauf si tu changes ce réglage. Tu peux filtrer sur un seul objet et ajouter des breakdowns :
meta --output json ads insights get \
--campaign-id <CAMPAIGN_ID> \
--date-preset last_7d \
--fields spend,impressions,clicks,ctr,cpc \
--breakdown publisher_platform
Des filtres existent pour --campaign-id, --adset-id et --ad-id, et les breakdowns incluent l'âge, le genre, le pays, la plateforme de diffusion, la plateforme de l'appareil et la position sur la plateforme.
Construire une campagne de bout en bout
Voici la séquence documentée par Meta. Chaque commande de création accepte --status, donc tu choisis si chaque objet démarre en pause ou actif. Ces exemples créent tout en pause et activent l'ensemble à la fin :
# 1. Campaign (budget in cents: 5000 = $50.00 on a USD account)
meta ads campaign create \
--name "Spring Test | Traffic" \
--objective OUTCOME_TRAFFIC \
--daily-budget 5000 \
--status PAUSED
# 2. Ad set
meta ads adset create <CAMPAIGN_ID> \
--name "US | Broad" \
--optimization-goal LINK_CLICKS \
--billing-event IMPRESSIONS \
--targeting-countries US \
--status PAUSED
# 3. Creative (image or --video ./file.mp4)
meta ads creative create \
--name "Hero Banner" \
--page-id <PAGE_ID> \
--image ./banner.jpg \
--body "Check out our latest deals!" \
--title "Shop Now" \
--link-url https://example.com/sale \
--call-to-action SHOP_NOW \
--status PAUSED
# 4. Ad
meta ads ad create <AD_SET_ID> \
--name "Hero Banner Ad" \
--creative-id <CREATIVE_ID> \
--status PAUSED
Quelques règles que les flags ne te diront pas :
- Les budgets sont exprimés dans la plus petite unité de la devise du compte.
5000correspond à $50.00 en USD. Vérifie la devise du compte avant qu'un agent écrive un budget. - Le budget se place à un seul endroit. Mets-le sur la campagne (CBO) ou sur les ad sets (ABO), pas les deux. Les deux à la fois renvoient généralement l'erreur 1885621.
--targeting-countriesest le seul flag de ciblage simple. L'âge, le genre, les centres d'intérêt, les Custom Audiences, les exclusions et les placements manuels passent par--targetingen JSON ou via@file.json.- Dynamic Creative nécessite un ad set dynamique. Crée d'abord l'ad set avec
--dynamic-creative. - Le flag Instagram a changé. La référence web indique
--instagram-actor-id; le package 1.1.0 utilise--instagram-user-id. Lancemeta ads creative create --helpsur ta version installée.
Des noms cohérents comptent encore plus quand c'est un script ou un agent qui crée les objets, parce que tu les reliras plus tard dans des listes. Fixe une convention de nommage avant d'automatiser quoi que ce soit.

Mettre en ligne, mettre en pause et nettoyer
L'activation se fait en trois mises à jour séparées, une par niveau de diffusion :
meta ads campaign update <CAMPAIGN_ID> --status ACTIVE
meta ads adset update <AD_SET_ID> --status ACTIVE
meta ads ad update <AD_ID> --status ACTIVE
La mise en pause, c'est la même commande avec --status PAUSED. Les suppressions demandent une confirmation sauf si tu passes --force, et elles se propagent en cascade : supprimer une campagne supprime ses ad sets et ses publicités, et supprimer un ad set supprime ses publicités.
meta ads campaign delete <CAMPAIGN_ID>
Catalogues et datasets
Les commandes de catalogue et de dataset déterminent le business à partir de --business-id, puis de BUSINESS_ID, puis du compte publicitaire configuré.
meta ads dataset create --name "Website Pixel"
meta ads dataset connect <PIXEL_ID> --ad-account-id act_123456789
meta ads dataset connect <PIXEL_ID> --catalog-id <CATALOG_ID>
meta ads catalog create --name "My Product Catalog"
meta ads product-set list --catalog-id <CATALOG_ID>
La création d'un dataset nécessite qu'un admin du business ait accepté les conditions des Business Tools de Meta (erreur 1870092 sinon). Les datasets sont les mêmes Pixels que ceux que tu vois dans Events Manager, donc tout ce que tu crées ici y apparaît aussi.
Le Meta Ads CLI crée-t-il les publicités en pause ou actives ?
Les campagnes, les ad sets et les publicités démarrent en pause sauf si tu passes --status ACTIVE. Le tutoriel de l'Ads CLI de Meta dit : « Ads CLI creates everything in PAUSED status by default. » Dans la version 1.1.0, les créas font exception et sont actives par défaut. Dans tous les cas, c'est toi qui décides : définis --status à chaque création, et active ou désactive les objets ensuite avec update.
Utiliser le Meta Ads CLI depuis Claude Code ou Codex
Rien de spécial n'est nécessaire pour connecter un agent. Claude Code, Codex et les outils similaires exécutent des commandes shell, donc ils lancent le Meta Ads CLI exactement comme toi et parsent --output json. C'est toute l'intégration.
Le point important à comprendre, c'est que l'agent hérite de toutes les permissions du token. Le commentaire le plus pertinent d'un des premiers fils de r/FacebookAds le soulignait : le même setup qui rédige des créas de remplacement peut aussi modifier des budgets et mettre des campagnes en pause, donc ton étape de validation est la seule chose entre un brouillon et un changement en production, et elle ne fonctionne que si l'agent n'approuve pas automatiquement les écritures. La répartition recommandée est celle à copier : approuver automatiquement les lectures, contrôler tout ce qui modifie la dépense ou le statut.
Dans Claude Code, cela correspond directement aux règles de permission dans .claude/settings.json :
{
"permissions": {
"allow": [
"Bash(meta --output json ads campaign list:*)",
"Bash(meta --output json ads insights get:*)",
"Bash(meta ads adaccount current:*)"
],
"ask": [
"Bash(meta ads campaign create:*)",
"Bash(meta ads campaign update:*)",
"Bash(meta ads adset update:*)",
"Bash(meta ads ad update:*)"
],
"deny": [
"Bash(meta ads campaign delete:*)"
]
}
}
Codex a ses propres paramètres d'approbation ; utilise-les de la même façon, pour que les lectures passent librement et que les écritures attendent ton feu vert.
Quelques garde-fous supplémentaires qui tiennent la route en pratique :
- Utilise un system user dédié pour l'agent, assigné uniquement aux comptes dont il a besoin. Ne réutilise pas un token partagé aux droits larges.
- Garde le token dans
.env, jamais dans un prompt, un fichierCLAUDE.mdou un argument de commande. - Demande un plan écrit avant toute construction : ID du compte, IDs parents, objectif, budgets en centimes et en dollars, ciblage, Pixel et statut final de chaque objet. Ensuite, fais relire chaque objet en JSON par l'agent et compare.
- Ne laisse jamais l'agent utiliser
--forcede lui-même. Et note que--no-inputsupprime seulement les invites. Ce n'est pas une fonctionnalité de sécurité. - Plafonne les boucles et les nouvelles tentatives. Une boucle de retry sur une création échouée, c'est comme ça qu'on se retrouve avec cinq campagnes en double.
Les workflows d'agent les plus utiles sont côté lecture. Le même praticien sur Reddit fait tourner un check matinal qui récupère les campagnes actives, compare la dépense, le ROAS et le CPL sur les 72 dernières heures, et signale tout ce qui dépasse des seuils définis par client (un CPL de $5 est excellent pour un compte et catastrophique pour un autre). Il indiquait gagner environ 45 minutes par jour. Sa règle de fatigue est aussi un bon point de départ : une fréquence qui monte pendant que le CTR baisse sur trois jours ou plus déclenche un brouillon de nouveau texte, qu'un humain relit. Et les bons agents ajoutent un contexte qu'un seuil ne peut pas saisir, comme le fait de ne pas toucher à une campagne dont le CPL a bondi parce que tu as augmenté son budget il y a deux jours.
Limites et lacunes connues
Le Meta Ads CLI est une brique de base solide, mais il y a des choses qu'il ne fait pas encore :
- Pas de dry run ni d'aperçu. Il n'y a pas de
--dry-run,--previewou--validate-only. Ton étape de validation doit être un plan écrit plus une relecture. - Pas de transactions. Une construction, ce sont quatre appels API séparés. Si la publicité échoue après la réussite de la campagne et de l'ad set, ces objets restent en place et c'est à toi de les nettoyer.
- Pas de commande batch. Le travail en masse passe par des boucles shell, ce qui augmente le risque d'échecs partiels, de doublons et de rate limits.
- Les fonctionnalités avancées nécessitent du JSON brut. Les carrousels, les contrôles de créa Advantage+ (
--degrees-of-freedom-spec,--asset-feed-spec), la personnalisation des assets par placement et le ciblage complexe passent tous par du JSON de la Marketing API. À ce stade, tu dois connaître le schéma de l'API. - Insights est plus limité que l'API. Tu peux filtrer par campagne, ad set ou publicité, mais il n'y a pas de flag
--levelexplicite, pas de rapports asynchrones et pas de contrôle de la fenêtre d'attribution. - Pas de profils de compte nommés. Le travail multi-comptes passe par
AD_ACCOUNT_IDet--ad-account-id, sans sélecteurclient-a/client-b. - Certains champs de créa ne sont plus modifiables après la création. Prévois de créer une créa de remplacement à la place.
- La documentation est en retard sur le package. La version 1.1.0 installée a plus de flags et de groupes de ressources que la référence publique, et il n'y a pas de changelog public. Les premiers utilisateurs sur Reddit disaient avoir trouvé certaines commandes par tâtonnement, et
--helpsur ta version installée reste la référence la plus fiable.
Certaines limites du début ont été corrigées. Les retours de la semaine de lancement disaient que les uploads de vidéos étaient impossibles et que les insights ne fonctionnaient qu'au niveau de la campagne. Les versions actuelles prennent en charge --video sur les créas et des filtres pour les insights au niveau de l'ad set et de la publicité.
Résoudre les erreurs courantes
Commence par le code de sortie, qui t'indique quelle couche a échoué :
| Code de sortie | Signification |
|---|---|
| 0 | Succès |
| 1 | Erreur générale |
| 2 | Erreur d'utilisation ou d'argument |
| 3 | Erreur d'authentification |
| 4 | Erreur API |
| 5 | Ressource introuvable |
Dans les scripts, traite-les différemment. Relancer après une erreur d'utilisation (2) ou d'authentification (3) ne marche jamais. Seules certaines erreurs API (4) valent la peine d'être relancées.
Les erreurs Meta que tu risques le plus de rencontrer :
| Symptôme | Cause probable | Solution |
|---|---|---|
| Sortie 3, erreur API 190 | Token manquant, expiré ou révoqué | Régénère le token, lance meta auth status |
| Erreurs 10, 200 ou 294 | Scope ou niveau d'accès manquant | Vérifie les scopes du token, l'accès de l'app et l'assignation des assets |
adaccount list est vide | System user non assigné au compte | Assigne le compte publicitaire dans Business Settings |
| Erreur 1885183 | Post de créa créé par une app en mode développement | Passe l'app en Live et vérifie le niveau d'accès |
| Erreur 1885621 | Budget sur la campagne et sur l'ad set | Choisis CBO ou ABO, pas les deux |
| Erreur 1870092 | Conditions des Business Tools non acceptées | Un admin du business accepte les conditions |
| Sortie 4 avec erreur 17 ou 613 | Rate limit | Ralentis ; ne relance pas dans une boucle serrée |
Le Meta Ads CLI n'a pas de quota de rate limit séparé. Il partage les limites de la Marketing API, que Meta documente sur sa page sur le rate limiting. Avec le Limited Access, le score du compte publicitaire plafonne à 60 (une lecture coûte environ un point, une écriture environ trois) et un blocage dure cinq minutes. Le Full Access relève le plafond à 9,000. Les changements de budget ont leur propre limite d'environ quatre par ad set et par heure, ce qui compte si un agent aime bricoler.
Le Meta Ads CLI est-il sûr pour ton compte publicitaire ?
Si tu passes du temps sur X ou dans les communautés de media buying, tu as forcément vu le bruit : des annonceurs qui ont connecté les AI connectors de Meta, ou lâché un agent sur leur compte, puis ont publié que le compte avait été restreint pour automatisation. Ça mérite d'être pris au sérieux. Ça mérite aussi d'être lu attentivement, parce que chaque cas est différent, que les restrictions ont rarement une seule cause, et que nous ne pouvons pas commenter les détails d'un compte en particulier.
La position officielle de Meta, c'est ce que dit sa documentation. Le CLI est un outil conçu par Meta et explicitement destiné aux développeurs et aux agents IA, et il appelle la même Marketing API que toutes les autres intégrations, donc les mêmes politiques publicitaires, niveaux d'accès et rate limits s'appliquent. Meta n'a pas dit que le CLI exempte un compte de quoi que ce soit, et n'a pas non plus dit que son utilisation provoque des restrictions.
Ce qu'un agent change, c'est le profil d'activité. Un media buyer dans Ads Manager travaille à vitesse humaine. Un agent dans une boucle peut enchaîner des dizaines d'écritures en une minute, relancer des appels échoués, ré-uploader les mêmes médias et faire des allers-retours sur les budgets, et vu de l'extérieur, ce profil est très différent d'un appel isolé. Les risques que tu maîtrises sont ceux vus plus haut : des écritures sur le mauvais compte act_, des budgets dans la mauvaise unité, des retries en boucle et des tokens qui fuitent. Contrôle les écritures, plafonne les boucles et respecte les erreurs de rate limit, et le CLI se comporte comme n'importe quelle autre intégration bien construite.
Où se situe le CLI d'Ads Uploader
Le CLI et le MCP de Meta exposent essentiellement la Marketing API sous une forme plus pratique à appeler pour les agents. C'est utile, et c'est ce que Meta a voulu construire. Ce à quoi une couche fine et généraliste a probablement moins réfléchi, c'est tout ce qui entoure les appels : cadencer les requêtes sous les rate limits, le profil des actions qu'un agent effectue sur un compte au fil d'une journée, et l'upload sécurisé des médias. La documentation du CLI de Meta ne décrit aucune couche de cadencement ou de retry ; l'outil hérite des limites de la Marketing API telles quelles. Ce sont exactement les choses qu'Ads Uploader a intégrées et gère sur son propre backend.
Il y a aussi un problème plus discret. Obtenir des campagnes, des ad sets et des publicités avec exactement la cible et le setup que tu veux est un art sous-estimé. L'objectif, l'objectif d'optimisation, les placements, l'identité, le tracking, le nommage et le format de créa doivent tous s'aligner, et les combinaisons qui fonctionnent ne sont écrites nulle part au même endroit. C'est toute la raison d'être d'Ads Uploader.
Le CLI d'Ads Uploader est conçu pour être piloté par un agent comme Claude Code ou Codex, et il te permet de modeler tes nouvelles publicités sur tes publicités existantes : enregistre une publicité déjà configurée comme tu l'aimes en tant que preset (ads presets:save --from-ad), et les nouveaux lancements héritent de ces réglages. Sur des millions de publicités lancées, nous savons quelles combinaisons de réglages vont ensemble et où les gens rencontrent des problèmes, et ce savoir collectif est intégré au workflow plutôt que dans un prompt. Ton agent uploade un dossier de créas, lance ads create:preview pour vérifier exactement ce qui sera créé, puis crée les publicités, en utilisant les mêmes presets et builds enregistrés que l'app web. La documentation du CLI couvre l'ensemble des commandes.
Trois différences pratiques apparaissent vite :
- Configuration. L'installation, c'est
npm install -g @adsuploader/cli(il faut Node.js 18+), puisads logint'authentifie dans ton navigateur avec ton compte Ads Uploader. Pas d'app développeur, pas de token system user. Lepip install meta-adsde Meta tient aussi en une ligne si Python 3.12+ est présent ; la vraie galère, c'est l'authentification : une app développeur, un system user admin, l'assignation des assets et un token avec scopes. - Stockage cloud. Les créas se trouvent souvent dans Google Drive.
ads upload:drive "<shared folder link>"transmet un dossier Drive partagé par lien à notre infrastructure, qui télécharge et traite les médias côté serveur, et le MCP hébergé d'Ads Uploader accepte un lien de dossier ou de fichier Drive de la même façon. C'est souvent plus rapide que de déplacer les fichiers toi-même. - Des builds enregistrés que tu peux ouvrir. L'app web, le CLI et le MCP partagent le même build. Un agent peut assembler une campagne entière via le CLI ou le MCP et renvoyer un lien vers le build. Ouvre-le dans l'uploader d'Ads Uploader et tu peux modifier les textes, la configuration des ad sets et les améliorations ou ajouter des médias, puis lancer depuis le web ou continuer via le CLI ou le MCP avec le même build. Un onglet uploader ouvert récupère automatiquement les modifications de l'agent. Dans un workflow uniquement en chat, tu ne vois pas vraiment le résultat prévu avant le lancement des publicités, et c'est surtout important sur les comptes des autres.
La bonne option dépend de ton setup :
- Un setup simple : un seul compte publicitaire, des images statiques en quelques formats, une seule structure de campagne. Tu peux construire tes propres skills sur le CLI ou le MCP de Meta pour uploader exactement comme tu veux, et c'est une bonne façon d'apprendre l'API.
- Agences et partenaires : de nombreux comptes, des setups de campagne différents par client, et les complications qui vont avec. C'est là que les skills faits maison ont tendance à coincer, parce que chaque nouveau compte ajoute des combinaisons à gérer. Ads Uploader est le filet de sécurité dans ce cas. Tu externalises le savoir et l'implémentation vers un workflow éprouvé par des milliers de media buyers et d'agences, à un prix très abordable.
Il y a aussi la maintenance. Les outils, les permissions et les règles d'approbation de Meta bougent sans cesse : les niveaux d'accès ont été renommés Limited et Full, les nouveaux types de campagne apportent de nouvelles permissions, l'App Review s'applique dès qu'une app gère les comptes d'autres business et doit être repassée quand les exigences changent, et d'après notre expérience, ces reviews prennent désormais beaucoup plus de temps qu'avant. Laisser quelqu'un d'autre suivre les outils, les permissions et les approbations t'évite d'être à la traîne quand ils changent. Ads Uploader est une app Meta approuvée, maintenue par nous, avec des canaux établis pour remonter les problèmes de plateforme et d'API à Meta quand quelque chose casse de leur côté, donc suivre ces changements, c'est notre travail et pas le tien.
Meta Ads CLI vs CLI d'Ads Uploader
Voici comment les deux se comparent, côte à côte :
| Meta Ads CLI | CLI d'Ads Uploader | |
|---|---|---|
| Installation | pip install meta-ads (Python 3.12+) | npm install -g @adsuploader/cli (Node.js 18+) |
| Authentification et configuration | Ta propre app développeur Meta, un system user admin, l'assignation des assets et un token avec scopes | ads login dans le navigateur avec ton compte Ads Uploader |
| Aperçu | Pas de dry run ni d'aperçu ; validation en relisant les objets | ads create:preview montre ce qui sera créé avant la création |
| Import cloud | Lit les fichiers locaux ; le stockage cloud doit être synchronisé sur le disque | ads upload:drive importe côté serveur un dossier Google Drive partagé par lien |
| Builds et validation | Chaque commande est un appel API isolé, sans plan enregistré | Builds enregistrés partagés avec l'app web et le MCP ; ouvre le lien du build pour vérifier et modifier dans l'interface |
| Maintenance et approbations de l'app | Tu maintiens l'app, le token, le niveau d'accès et toute App Review | App Meta approuvée, maintenue par nous |
| Coût | Gratuit ; tu ne paies que la dépense publicitaire | Abonnements payants |
Si tu veux donner à un agent de code l'API de Meta sans rien entre les deux, le Meta Ads CLI officiel est le point de départ évident, et pour un setup simple, c'est un bon choix. Si tu préfères ne pas construire et maintenir toi-même l'aperçu, la logique de lancement et les approbations, c'est exactement le travail que fait le CLI d'Ads Uploader.
Offrez un Filet de Sécurité à Votre Agent IA
Lancez sur tous vos comptes clients avec un MCP et une CLI conçus pour les media buyers exigeants et les agences.
Essayer Ads Uploader gratuitementSans carte bancaire • Essai gratuit de 7 jours
Questions fréquentes
Le Meta Ads CLI est-il gratuit ?
Oui. Meta ne facture aucun frais séparé pour le CLI. Tu installes le package meta-ads depuis PyPI gratuitement et tu ne paies que tes dépenses publicitaires habituelles. Le package est propriétaire et non open source, et il te faut quand même une app développeur Meta et un token system user.
Existe-t-il un CLI officiel pour Facebook Ads ?
Oui. Le CLI officiel de Meta pour les publicités Facebook et Instagram est le package Python meta-ads, lancé le 29 avril 2026, avec des commandes sous meta ads.
Le Meta Ads CLI peut-il uploader des publicités vidéo ?
Oui. Passe un fichier local à meta ads creative create avec --video et le CLI l'uploade. Meta documente les fichiers mp4, mov, avi, mkv et wmv, et Dynamic Creative accepte jusqu'à 10 vidéos via des flags --videos répétables.
Faut-il être développeur pour utiliser le Meta Ads CLI ?
Tu n'as pas besoin d'écrire du code API, mais la configuration a un côté très développeur : Python 3.12+, une app développeur Meta, un system user admin avec des assets assignés et un token avec les bons scopes. Beaucoup de media buyers laissent un agent de code IA gérer l'installation et lancer les commandes.
Puis-je gérer plusieurs comptes publicitaires avec le Meta Ads CLI ?
Oui, si le system user est assigné à chaque compte. Liste-les avec meta ads adaccount list, définis un compte par défaut avec AD_ACCOUNT_ID, ou remplace-le commande par commande avec --ad-account-id. Il n'y a pas de profils nommés, donc indique le compte explicitement à chaque écriture.
Quelle version de Python le Meta Ads CLI nécessite-t-il ?
Python 3.12 ou plus récent. Le package est distribué sous forme de wheels compilés, donc un Python plus ancien ou une plateforme non prise en charge renvoie « No matching distribution found ». Un environnement virtuel Python 3.12 ou 3.13 évite le problème.
Le Meta Ads CLI fonctionne-t-il avec Claude Code et Codex ?
Oui. Meta cite les agents IA parmi le public visé, et n'importe quel agent qui lance des commandes shell et lit du JSON peut le piloter. Aucun des deux agents n'ajoute de sécurité par lui-même, donc approuve automatiquement les lectures et exige ton accord pour les créations, les activations, les changements de budget et les suppressions.
Utiliser le Meta Ads CLI peut-il faire bannir mon compte publicitaire ?
Il n'y a pas de réponse simple. Le CLI est l'outil de Meta lui-même pour les développeurs et les agents IA, et Meta n'a pas dit que son utilisation provoque des restrictions ni qu'elle t'en exempte. Les politiques, les niveaux d'accès et les rate limits s'appliquent comme pour n'importe quelle intégration. Certains annonceurs signalent des restrictions après avoir automatisé avec des agents, mais chaque cas est différent, donc garde les écritures sous contrôle et les boucles plafonnées.
Quelle est la différence entre le Meta Ads CLI et le Meta Ads MCP ?
Le CLI est un outil Python local qui lance des commandes shell avec un token system user. Le Meta Ads MCP est un serveur hébergé par Meta sur mcp.facebook.com/ads auquel les clients de chat IA se connectent via OAuth, sans app développeur dans le flux de connecteur standard. Le CLI convient aux scripts et aux agents de code ; le MCP convient au travail conversationnel.
Bien démarrer avec le Meta Ads CLI
Le Meta Ads CLI donne aux développeurs et aux agents IA un accès first-party et scriptable à la Marketing API, et la version 1.1.0 couvre bien plus que la version de la semaine de lancement. En résumé :
- Installe
meta-adsdans un environnement virtuel Python 3.12+ et fige sa version en même temps que celle defacebook-business. - Authentifie-toi avec un token de system user admin, assigné uniquement aux assets dont tu as besoin, stocké dans
.env. - Décide ce que tu veux construire : un setup simple sur un seul compte est facile à scripter toi-même ; le travail d'agence multi-comptes, c'est là qu'un workflow de lancement maintenu prouve sa valeur.
- Anticipe les lacunes : pas de dry run, pas de transactions, pas de commande batch, du JSON brut pour les formats avancés.
- Avec un agent, approuve automatiquement les lectures et contrôle chaque écriture.
Consacre ta première semaine avec le Meta Ads CLI à la lecture seule. Récupère des insights en JSON, puis construis une campagne de test et fais-lui passer la validation et l'activation à la main. Une fois que cette boucle te semble routinière, tu sauras quelles parties automatiser et lesquelles garder entre tes mains.
