Das Meta Ads CLI ist Metas offizielles Kommandozeilen-Tool für die Marketing API, gestartet am 29. April 2026 als Teil der Ads AI Connectors. Es wird als Python-3.12+-Paket installiert, authentifiziert sich mit einem System-User-Access-Token und führt Befehle nach dem Muster meta ads <resource> <action> aus. Es deckt Kampagnen, Ad Sets, Ads, Creatives, Insights, Kataloge und Datasets ab, mit Tabellen-, JSON- oder Plain-Ausgabe, die Skripte parsen können. Damit können Entwickler und KI-Coding-Agenten Meta Ads verwalten, ohne API-Code zu schreiben.
Meta ist eine der ersten Werbeplattformen, die ein eigenes Kommandozeilen-Tool herausbringt, und hat klar gesagt, für wen es gedacht ist: Entwickler und KI-Agenten. Wenn du seit dem Launch versucht hast, es einzurichten, hast du wahrscheinlich gemerkt, dass die Infos über acht Dokumentationsseiten, einen Launch-Blogpost und jede Menge Kommentare von Dritten verstreut sind, die sich schon bei Grundlagen wie dem Installationsweg und der Authentifizierung widersprechen.
Dieser Meta Ads CLI Guide bringt alles zusammen: die genaue Installation, das Setup des System-User-Tokens (wo die meisten hängen bleiben), jede Befehlsgruppe, die sichere Nutzung aus Claude Code oder Codex, aktuelle Grenzen, Troubleshooting und den Vergleich mit dem Ads Uploader CLI. Er ist mit Metas aktueller Dokumentation und dem neuesten Paket, Version 1.1.0, abgeglichen und stammt von einem Team, das sein eigenes Meta Ads CLI baut und jeden Tag Ads über die Marketing API startet.
Warum ich ein CLI für den besseren Weg halte, Ads hochzuladen
Ich habe darüber schon in unserem Vergleich Meta Ads MCP vs CLI geschrieben, und der Kern hat sich nicht geändert. Meiner Meinung nach ist ein CLI die bessere Infrastruktur, um Ads hochzuladen.
Der erste Grund sind Dateien. Ein CLI hat nativen Zugriff auf dein Dateisystem. Launches starten meist von deiner Festplatte oder von Cloud-Speicher, der auf deinen Rechner gestreamt oder synchronisiert wird, und ein CLI liest diese Dateien ganz selbstverständlich. Ein gehosteter MCP-Server wie der von Meta unter mcp.facebook.com/ads sieht deine Festplatte überhaupt nicht, also müssen Dateien per URL, Drive-Link oder als Inline-Daten ankommen. Dieser Umweg ist der Grund, warum Leute Videos über ein gehostetes MCP schwieriger finden als Bilder. Metas eigene MCP-Tool-Liste enthält ein Creative-Tool, das als "single-image link ad creative" beschrieben wird, dazu Tools zum Auflisten vorhandener Bilder und Videos, aber kein eigenes Upload-Tool und keine dokumentierten Dateilimits. Bilder scheinen machbar, Video ist nicht dokumentiert. (Ein lokal installiertes MCP ist etwas anderes: Es läuft auf deinem Rechner und kann Dateien lesen, deshalb gibt es auch das MCP von Ads Uploader als lokales Paket, das von der Festplatte liest.)
Der zweite Grund ist, wie der Agent seinen Weg findet. Ich finde das CLI deterministischer. Das Feedback der Kommandozeile wirkt wie Leitplanken: --help-Ausgaben, Exit-Codes und strukturierte Fehler schicken den Agenten auf einen bestimmten Pfad. Mit einem MCP braucht der Agent mehr Wissen darüber, wie die Tools zusammenpassen, um einen Launch zusammenzustellen, und viele Clients laden jede Tool-Definition vorab in den Kontext, bei Meta sind das rund 90. Manche Clients laden Tools inzwischen bei Bedarf, aber ein MCP kann mehr Tokens fressen, und meiner Erfahrung nach ist das CLI einfach geradliniger.
Das MCP hat trotzdem seinen Platz für konversationelles Reporting und Fragen zum Konto, darum geht es in unserem Meta Ads MCP Guide. Dieser Guide bleibt beim CLI.
Was ist das Meta Ads CLI?
In Metas eigenen Worten, aus der Ads CLI Dokumentation: "Ads CLI is a command-line tool for managing Meta advertising from your terminal." Es ist ein Python-Wrapper um die Marketing API, der die Teile übernimmt, die früher jeder Entwickler von Hand nachbauen musste: Authentifizierung, Pagination, Ausgabeformatierung und Fehlerbehandlung.
Die wichtigsten Fakten, Stand 23. September 2026:
- Paket:
meta-adsauf PyPI, gepflegt von Meta. Das Executable heißtmeta. - Neueste Version: 1.1.0, veröffentlicht am 17. Juni 2026.
- Status: Meta hat die Ads AI Connectors (das CLI plus den gehosteten MCP-Server) als offene Beta gestartet. PyPI stuft das Paket als Alpha ein.
- Lizenz: proprietär. Die Installation ist kostenlos, aber es ist nicht Open Source, und es gibt kein öffentliches GitHub-Repo und keinen Issue-Tracker.
- Zielgruppe: Meta nennt Entwickler, die Ad-Integrationen bauen, Operations-Teams, die über Skripte und CI/CD automatisieren, und "AI agents and tools".
Die Motivation hinter dem Meta Ads CLI kennt jeder, der schon einmal Meta Ads automatisiert hat. Ein Agentur-Buyer auf r/FacebookAds beschrieb sein Setup vor dem CLI aus Python-Skripten und Cron-Jobs als "brittle as hell", weil es jedes Mal kaputtging, wenn Meta etwas an der API geändert hat. Ein offizielles Tool verlagert einen großen Teil dieser Wartung zu Meta, aber nicht alles.
Was das Meta Ads CLI kann
Das Executable in Version 1.1.0 stellt 14 Ressourcengruppen bereit. Die öffentliche Befehlsreferenz listet die meisten davon, und das installierte Paket enthält ein paar Extras (Produkt-Feeds, Guidance und Studies), die in der Web-Doku kaum dokumentiert sind.
| Ressource | Aktionen |
|---|---|
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 |
Es gibt keine eigene Gruppe für audience, video, image oder lead-form. Video-Uploads laufen über creative create, und Custom Audiences werden im Targeting-JSON des Ad Sets referenziert.
Die Automatisierungsfunktionen machen das Meta Ads CLI agentenfreundlich:
- Drei Ausgabeformate:
table(der Standard, für Menschen),json(für Agenten undjq) undplain(tabulatorgetrennt, fürawkundcut). --no-inputunterdrückt interaktive Abfragen, damit ein Skript nie hängen bleibt und auf ein y/n wartet.- Standard-Exit-Codes von 0 bis 5, damit ein Skript oder Agent je nach Fehlerart verzweigen kann.
- Umgebungsvariablen und
.env-Support, damit Tokens nicht in der Befehlshistorie landen.

So installierst du das Meta Ads CLI
Metas Anforderungen sind kurz: Python 3.12 oder neuer und pip oder uv.
Der offizielle Installationsbefehl lautet:
pip install meta-ads
Metas Get-started-Seite lässt darauf ein nacktes uv sync folgen, das nur funktioniert, wenn du dich bereits in einem uv-Projekt mit einer pyproject.toml befindest. Nach einer normalen pip-Installation brauchst du es nicht. Für ein sauberes, reproduzierbares Setup nimmst du eine virtuelle Umgebung und pinnst die Version:
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install meta-ads==1.1.0
meta --version
Zwei Stolperfallen bei der Installation solltest du vorab kennen:
- "No matching distribution found for meta-ads." Das Paket wird als kompilierte Wheels ausgeliefert, nicht als Source-Distribution. Wenn dein Python älter als 3.12 ist oder deine Plattform zu keinem veröffentlichten Wheel passt, findet pip es nicht. Ein Nutzer auf r/FacebookAds ist in der ersten Woche genau darüber gestolpert. Prüfe
python --version, bevor du annimmst, dass der Paketname falsch ist. - Die API-Version ist nicht fixiert. Das CLI pinnt keine Marketing-API-Version. Es übernimmt, was das installierte
facebook-businessSDK verwendet, und eine frische Installation am 23. September 2026 löst SDK 26.0.2 auf, also Marketing API v26.0. Ein Dependency-Upgrade kann die API-Version unter deinen Skripten stillschweigend ändern, also pinne sowohlmeta-adsals auchfacebook-businessfür alles, was du automatisierst.
In Claude Code oder Codex kannst du den Agenten bitten, das Meta Ads CLI für dich zu installieren. Was er nicht übernehmen kann, ist das Setup auf Meta-Seite im nächsten Abschnitt.
Authentifizierung mit einem System-User-Access-Token
Meta sagt klar, dass das Meta Ads CLI einen Token braucht: "Ads CLI requires a system user access token to authenticate for programmatic access." Es gibt keinen Befehl meta auth login, keinen OAuth-Flow im Browser und kein whoami. Du generierst einen Token im Business Manager und gibst ihn dem CLI über eine Umgebungsvariable.
Hier bleiben die meisten Setups hängen, deshalb kommt hier die komplette Abfolge.
Meta-App und System-User anlegen
- Geh in der Meta Business Suite zu Settings > Users > System Users.
- Leg einen System-User mit der Rolle Admin an.
- Erstelle oder wähle eine Meta-Entwickler-App für das Business.
- Füge den System-User der App als App Admin hinzu.
Für den CLI-Weg ist eine Entwickler-App Pflicht. Das ist ein echter Unterschied zum gehosteten MCP, das über einen Standard-OAuth-Connector ohne eigene App funktioniert.
Assets zuweisen und den Token generieren
- Weise dem System-User jedes Asset zu, das das CLI anfassen soll: Werbekonten, Facebook Pages, Datasets (Pixels) und Produktkataloge, falls du sie nutzt. Ein nicht zugewiesenes Asset ist der häufigste Grund, warum
meta ads adaccount listleer zurückkommt. - Generiere einen Token für die App mit diesen Scopes, die Metas Setup-Guide auflistet:
business_management
ads_management
pages_show_list
pages_read_engagement
pages_manage_ads
catalog_management
read_insights
Laut Metas Postman-Dokumentation können System-User-Tokens bis zu 60 Tage gültig sein oder nie ablaufen, je nach gewählter Option und Berechtigung deines Business.

App-Berechtigungen und App Review
Das Meta Ads CLI läuft immer über deine eigene Meta-Entwickler-App, und die Berechtigungen dieser App entscheiden, was das CLI kann. Wenn ein neuer Job oder ein anderer Kampagnentyp fehlschlägt, liegt es oft an einer fehlenden Berechtigung statt an einem Bug im CLI:
- Page-basierte Creatives brauchen
pages_manage_ads. - Kataloge brauchen
catalog_management. - Partnership Ads brauchen zusätzlich zu den Ads-Scopes die Branded-Content-Berechtigungen.
- Manche Creative-Wege sind blockiert, solange die App im Entwicklungsmodus ist, was sich als Fehler 1885183 zeigt. Ein YouTube-Walkthrough vom Mai zeigte, wie Kampagne und Ad Set problemlos erstellt wurden, während die Ads fehlschlugen, bis die App auf Live umgestellt wurde.
Auch die Zugriffsstufe spielt eine Rolle. Meta beschreibt den Marketing-API-Zugriff inzwischen als Limited oder Full. Limited Access reicht für die Werbekonten deines eigenen Business, aber für die Verwaltung von Konten anderer Businesses, also genau das, was Agenturen und Partner machen, brauchst du Full Access und App Review.
App Review ist auch keine einmalige Sache. Wenn sich Metas Anforderungen ändern, musst du erneut durch, um mitzuhalten. Unserer Erfahrung nach dauern Reviews, die vor einem Jahr, bevor alle KI nutzten, ein paar Tage gebraucht haben, jetzt ungefähr 10 bis 20 Tage, manchmal länger. Meta veröffentlicht keine Zusage zur Review-Dauer, also beantrage neue Berechtigungen lange vor dem Launch, der sie braucht.
Umgebungsvariablen setzen und Konfigurationsreihenfolge
Das CLI liest drei Variablen:
| Variable | Zweck | Erforderlich |
|---|---|---|
ACCESS_TOKEN | System-User-Access-Token | Ja |
AD_ACCOUNT_ID | Standard-Werbekonto, im act_-Format | Für die meisten Ads-Befehle |
BUSINESS_ID | Standard-Business für Kataloge und Datasets | Optional |
Leg sie in einer .env-Datei im Projekt ab, die von der Versionskontrolle ausgeschlossen ist:
ACCESS_TOKEN=<SYSTEM_USER_TOKEN>
AD_ACCOUNT_ID=act_123456789
BUSINESS_ID=123456789
Einstellungen werden in dieser Reihenfolge aufgelöst, höchste Priorität zuerst: Kommandozeilen-Flags, Umgebungsvariablen der Shell, die .env des Projekts, dann die Nutzerkonfiguration unter ~/.config/meta/. Dann prüfst du, ob alles funktioniert:
meta auth status
meta ads adaccount current
meta ads page list
meta auth status zeigt mit einem maskierten Token, ob du authentifiziert bist. Wenn adaccount current die richtige act_-ID zurückgibt, bist du startklar.
Meta Ads CLI Befehle: ein praktischer Spickzettel
Eine Syntaxregel ist wichtiger als alles andere: Root-Optionen wie --output stehen vor ads, und Konto-Optionen stehen nach ads, aber vor der Ressource.
meta --output json ads campaign list
meta ads --ad-account-id act_123456789 campaign list
Bedenken, KI direkt mit Meta zu verbinden?
Ads Uploader wird von Power-Media-Buyern und Agenturen geschätzt und jeden Monat mit dem Launch von Hunderttausenden Meta-Anzeigen betraut.
Ads Uploader kostenlos testenKeine Kreditkarte nötig • 7 Tage kostenlos testen
Lesebefehle (Konten, Kampagnen, 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 nutzt standardmäßig last_30d, liefert spend,impressions,clicks,ctr,cpc,reach und ist auf 50 Zeilen begrenzt, solange du nichts änderst. Du kannst auf ein Objekt filtern und Breakdowns hinzufügen:
meta --output json ads insights get \
--campaign-id <CAMPAIGN_ID> \
--date-preset last_7d \
--fields spend,impressions,clicks,ctr,cpc \
--breakdown publisher_platform
Filter gibt es für --campaign-id, --adset-id und --ad-id, und zu den Breakdowns gehören Alter, Geschlecht, Land, Publisher-Plattform, Geräteplattform und Plattformposition.
Eine Kampagne von Anfang bis Ende bauen
Das ist Metas dokumentierte Abfolge. Jeder Create-Befehl akzeptiert --status, du entscheidest also, ob jedes Objekt pausiert oder aktiv startet. Diese Beispiele erstellen alles pausiert und schalten es am Ende ein:
# 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
Ein paar Regeln, die dir die Flags nicht verraten:
- Budgets sind in der kleinsten Währungseinheit des Kontos.
5000sind $50.00 in USD. Prüfe die Kontowährung, bevor ein Agent ein Budget schreibt. - Das Budget liegt an genau einer Stelle. Setz es auf die Kampagne (CBO) oder auf die Ad Sets (ABO), nicht auf beide. Beides gleichzeitig führt meist zu Fehler 1885621.
--targeting-countriesist das einzige einfache Targeting-Flag. Alter, Geschlecht, Interessen, Custom Audiences, Ausschlüsse und manuelle Platzierungen laufen über--targetingals JSON oder@file.json.- Dynamic Creative braucht ein dynamisches Ad Set. Erstelle das Ad Set zuerst mit
--dynamic-creative. - Das Instagram-Flag hat sich geändert. Die Web-Referenz nennt
--instagram-actor-id, das Paket 1.1.0 nutzt--instagram-user-id. Führemeta ads creative create --helpmit deiner installierten Version aus.
Einheitliche Namen sind noch wichtiger, wenn ein Skript oder Agent Objekte erstellt, weil du sie später in Listen wieder lesen musst. Leg eine Namenskonvention fest, bevor du irgendetwas automatisierst.

Live schalten, pausieren und aufräumen
Die Aktivierung besteht aus drei separaten Updates, eines pro Auslieferungsebene:
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
Pausieren ist derselbe Befehl mit --status PAUSED. Löschvorgänge fragen nach einer Bestätigung, außer du übergibst --force, und sie kaskadieren: Wenn du eine Kampagne löschst, werden ihre Ad Sets und Ads gelöscht, und wenn du ein Ad Set löschst, werden seine Ads gelöscht.
meta ads campaign delete <CAMPAIGN_ID>
Kataloge und Datasets
Katalog- und Dataset-Befehle ermitteln das Business zuerst über --business-id, dann über BUSINESS_ID, dann über das konfigurierte Werbekonto.
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>
Um ein Dataset zu erstellen, muss ein Business-Admin Metas Business-Tools-Nutzungsbedingungen akzeptiert haben (sonst Fehler 1870092). Datasets sind dieselben Pixels, die du im Events Manager siehst, also taucht alles, was du hier erstellst, auch dort auf.
Erstellt das Meta Ads CLI Ads pausiert oder aktiv?
Kampagnen, Ad Sets und Ads starten pausiert, außer du übergibst --status ACTIVE. Metas Ads CLI Tutorial sagt: "Ads CLI creates everything in PAUSED status by default." In Version 1.1.0 sind Creatives die Ausnahme und standardmäßig aktiv. So oder so entscheidest du: Setz --status bei jedem Create und schalte Objekte danach mit update ein oder aus.
Das Meta Ads CLI aus Claude Code oder Codex nutzen
Um einen Agenten anzubinden, brauchst du nichts Besonderes. Claude Code, Codex und ähnliche Tools führen Shell-Befehle aus, sie nutzen das Meta Ads CLI also genau wie du und parsen --output json. Das ist die ganze Integration.
Wichtig ist zu verstehen, dass der Agent jede Berechtigung erbt, die der Token hat. Der treffendste Kommentar in einem frühen Thread auf r/FacebookAds hat genau das betont: Dasselbe Setup, das Ersatz-Creatives entwirft, kann auch Budgets ändern und Kampagnen pausieren, also ist dein Review-Schritt das Einzige, was zwischen einem Entwurf und einer Live-Änderung steht, und das funktioniert nur, wenn der Agent Schreibvorgänge nicht automatisch genehmigt. Die empfohlene Aufteilung solltest du übernehmen: Lesevorgänge automatisch genehmigen, alles, was Spend oder Status verändert, absichern.
In Claude Code lässt sich das direkt auf Berechtigungsregeln in .claude/settings.json übertragen:
{
"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 hat eigene Freigabeeinstellungen. Nutze sie genauso, damit Lesevorgänge frei laufen und Schreibvorgänge auf dich warten.
Ein paar weitere Leitplanken, die sich in der Praxis bewähren:
- Nutze einen eigenen System-User für den Agenten, der nur den Konten zugewiesen ist, die er braucht. Verwende keinen breit geteilten Token wieder.
- Bewahre den Token in
.envauf, nie in einem Prompt, einerCLAUDE.md-Datei oder einem Befehlsargument. - Verlange vor jedem Build einen schriftlichen Plan: Konto-ID, Parent-IDs, Ziel, Budgets in Cent und Dollar, Targeting, Pixel und den finalen Status jedes Objekts. Lass den Agenten dann jedes Objekt als JSON zurücklesen und vergleichen.
- Lass den Agenten
--forcenie eigenständig nutzen. Und beachte, dass--no-inputnur Abfragen unterdrückt. Eine Sicherheitsfunktion ist es nicht. - Begrenze Schleifen und Retries. Eine Retry-Schleife bei einem fehlgeschlagenen Create ist genau der Weg, auf dem du mit fünf doppelten Kampagnen endest.
Die nützlichsten Agenten-Workflows sind lesend. Derselbe Praktiker auf Reddit lässt morgens einen Check laufen, der aktive Kampagnen abruft, Spend, ROAS und CPL der letzten 72 Stunden vergleicht und alles markiert, was über kundenspezifischen Schwellenwerten liegt (ein CPL von $5 ist für ein Konto großartig und für ein anderes furchtbar). Laut eigener Aussage spart ihm das rund 45 Minuten am Tag. Seine Fatigue-Regel ist ebenfalls ein sinnvoller Ausgangspunkt: Steigt die Frequency, während die CTR drei oder mehr Tage fällt, wird ein Entwurf für Ersatz-Copy ausgelöst, den ein Mensch prüft. Und gute Agenten ergänzen Kontext, den ein Schwellenwert nicht liefern kann, etwa bei einer Kampagne abzuwarten, deren CPL gestiegen ist, weil du ihr Budget vor zwei Tagen hochskaliert hast.
Einschränkungen und bekannte Lücken
Das Meta Ads CLI ist ein starkes Grundwerkzeug, aber manches kann es noch nicht:
- Kein Dry Run und keine Vorschau. Es gibt kein
--dry-run,--previewoder--validate-only. Dein Review-Schritt muss aus einem schriftlichen Plan plus Rücklesen bestehen. - Keine Transaktionen. Ein Build besteht aus vier separaten API-Calls. Wenn die Ad fehlschlägt, nachdem Kampagne und Ad Set erfolgreich waren, bleiben diese Objekte zurück und du räumst sie selbst auf.
- Kein Batch-Befehl. Massenarbeit heißt Shell-Schleifen, was das Risiko für Teilfehler, Duplikate und Rate-Limits erhöht.
- Fortgeschrittene Funktionen brauchen rohes JSON. Carousels, Advantage+ Creative-Steuerung (
--degrees-of-freedom-spec,--asset-feed-spec), Asset-Anpassung pro Platzierung und komplexes Targeting nehmen alle Marketing-API-JSON entgegen. Spätestens dann musst du das API-Schema kennen. - Insights ist enger als die API. Du kannst nach Kampagne, Ad Set oder Ad filtern, aber es gibt kein explizites
--level-Flag, keine asynchronen Reports und keine Steuerung des Attributionsfensters. - Keine benannten Kontoprofile. Arbeit mit mehreren Konten läuft über
AD_ACCOUNT_IDund--ad-account-id, ohne Umschalter wieclient-a/client-b. - Manche Creative-Felder lassen sich nach der Erstellung nicht bearbeiten. Plane stattdessen, ein Ersatz-Creative zu erstellen.
- Die Doku hinkt dem Paket hinterher. Die installierte Version 1.1.0 hat mehr Flags und Ressourcengruppen als die öffentliche Referenz, und es gibt kein öffentliches Changelog. Frühe Nutzer auf Reddit sagten, sie hätten manche Befehle per Trial and Error herausgefunden, und
--helpin deiner installierten Version ist weiterhin die zuverlässigste Referenz.
Einige frühe Grenzen wurden behoben. Berichte aus der Launch-Woche sagten, Video-Uploads seien nicht möglich und Insights funktioniere nur auf Kampagnenebene. Aktuelle Versionen unterstützen --video bei Creatives und Filter für Insights auf Ad-Set- und Ad-Ebene.
Troubleshooting häufiger Fehler
Fang mit dem Exit-Code an, er sagt dir, welche Ebene fehlgeschlagen ist:
| Exit-Code | Bedeutung |
|---|---|
| 0 | Erfolg |
| 1 | Allgemeiner Fehler |
| 2 | Nutzungs- oder Argumentfehler |
| 3 | Authentifizierungsfehler |
| 4 | API-Fehler |
| 5 | Ressource nicht gefunden |
Behandle sie in Skripten unterschiedlich. Einen Nutzungsfehler (2) oder Auth-Fehler (3) erneut zu versuchen, bringt nie etwas. Nur manche API-Fehler (4) sind einen Retry wert.
Die Meta-Fehler, auf die du am wahrscheinlichsten stößt:
| Symptom | Wahrscheinliche Ursache | Lösung |
|---|---|---|
| Exit 3, API-Fehler 190 | Token fehlt, ist abgelaufen oder widerrufen | Token neu generieren, meta auth status ausführen |
| Fehler 10, 200 oder 294 | Fehlender Scope oder fehlende Zugriffsstufe | Token-Scopes, App-Zugriff und Asset-Zuweisung prüfen |
adaccount list ist leer | System-User ist dem Konto nicht zugewiesen | Das Werbekonto in den Business Settings zuweisen |
| Fehler 1885183 | Creative-Post von einer App im Entwicklungsmodus | App auf Live stellen und Zugriffsstufe bestätigen |
| Fehler 1885621 | Budget auf Kampagne und Ad Set | CBO oder ABO wählen, nicht beides |
| Fehler 1870092 | Business-Tools-Nutzungsbedingungen nicht akzeptiert | Ein Business-Admin akzeptiert die Bedingungen |
| Exit 4 mit Fehler 17 oder 613 | Rate-Limit | Pausieren, nicht in einer engen Schleife erneut versuchen |
Das Meta Ads CLI hat kein eigenes Rate-Limit-Kontingent. Es teilt sich die Limits der Marketing API, die Meta auf seiner Seite zum Rate Limiting dokumentiert. Mit Limited Access ist der Score des Werbekontos auf 60 begrenzt (ein Lesevorgang kostet etwa einen Punkt, ein Schreibvorgang etwa drei), und eine Sperre dauert fünf Minuten. Full Access hebt das Limit auf 9,000. Budgetänderungen haben ein eigenes Limit von etwa vier pro Ad Set und Stunde, was wichtig ist, wenn ein Agent gern herumschraubt.
Ist das Meta Ads CLI sicher für dein Werbekonto?
Wenn du Zeit auf X oder in Media-Buying-Communities verbringst, hast du den Wirbel gesehen: Werbetreibende, die Metas AI Connectors verbunden oder einen Agenten auf ihr Konto losgelassen haben und dann posteten, dass ihr Konto wegen Automatisierung eingeschränkt wurde. Das sollte man ernst nehmen. Man sollte es aber auch genau lesen, denn jeder Fall ist anders, Einschränkungen haben selten eine einzige Ursache, und wir können uns nicht zu den Details einzelner Konten äußern.
Metas offizielle Position ist das, was in der Dokumentation steht. Das CLI ist ein von Meta gebautes Tool, das sich ausdrücklich an Entwickler und KI-Agenten richtet, und es ruft dieselbe Marketing API auf wie jede andere Integration, also gelten dieselben Werberichtlinien, Zugriffsstufen und Rate-Limits. Meta hat nicht gesagt, dass das CLI ein Konto von irgendetwas davon ausnimmt, und auch nicht, dass die Nutzung des CLI Einschränkungen verursacht.
Was ein Agent verändert, ist das Aktivitätsmuster. Ein Media Buyer im Ads Manager arbeitet in menschlichem Tempo. Ein Agent in einer Schleife kann Dutzende Schreibvorgänge pro Minute abfeuern, fehlgeschlagene Calls wiederholen, dieselben Medien erneut hochladen und Budgets hin- und herschalten, und dieses Muster sieht von außen ganz anders aus als jeder einzelne Call. Die Risiken, die du kontrollierst, sind die weiter oben beschriebenen: Schreibvorgänge im falschen act_-Konto, Budgets in der falschen Einheit, außer Kontrolle geratene Retries und geleakte Tokens. Sichere Schreibvorgänge ab, begrenze Schleifen und respektiere Rate-Limit-Fehler, dann verhält sich das CLI wie jede andere gut gebaute Integration.
Wo das Ads Uploader CLI ins Spiel kommt
Metas CLI und MCP stellen die Marketing API im Grunde in einer freundlicheren Form bereit, die Agenten aufrufen können. Das ist nützlich, und genau das wollte Meta bauen. Worüber bei einer dünnen, universellen Schicht vermutlich weniger nachgedacht wurde, ist alles rund um die Calls: Requests unter den Rate-Limits zu takten, das Aktivitätsmuster, das ein Agent über einen Tag auf einem Konto erzeugt, und das sichere Hochladen von Medien. Metas CLI-Doku beschreibt keine Taktungs- oder Retry-Schicht, das Tool übernimmt die Limits der Marketing API so, wie sie sind. Genau diese Dinge hat Ads Uploader eingebaut und erledigt sie im eigenen Backend.
Dazu kommt ein leiseres Problem. Kampagnen, Ad Sets und Ads genau so aufzusetzen, wie du sie haben willst, ist eine unterschätzte Kunst. Ziel, Optimierungsziel, Platzierungen, Identität, Tracking, Benennung und Creative-Format müssen alle zusammenpassen, und die Kombinationen, die funktionieren, stehen nirgends an einer Stelle. Genau dafür gibt es Ads Uploader.
Das Ads Uploader CLI ist dafür gebaut, von einem Agenten wie Claude Code oder Codex gesteuert zu werden, und du kannst neue Ads nach dem Vorbild deiner bestehenden Ads anlegen: Speichere eine Ad, die schon so eingerichtet ist, wie du sie magst, als Preset (ads presets:save --from-ad), und neue Launches übernehmen diese Einstellungen. Aus Millionen gestarteter Ads wissen wir, welche Einstellungen zusammengehören und wo Leute auf Probleme stoßen, und dieses gesammelte Wissen steckt im Workflow statt in einem Prompt. Dein Agent lädt einen Ordner mit Creatives hoch, führt ads create:preview aus, um genau zu prüfen, was erstellt wird, und erstellt dann die Ads, mit denselben Presets und gespeicherten Builds wie die Web-App. Die CLI-Doku deckt alle Befehle ab.
Drei praktische Unterschiede fallen schnell auf:
- Setup. Die Installation ist
npm install -g @adsuploader/cli(dafür brauchst du Node.js 18+), dann authentifiziert dichads loginim Browser mit deinem Ads Uploader Konto. Es gibt keine Entwickler-App und keinen System-User-Token. Metaspip install meta-adsist ebenfalls eine Zeile, wenn Python 3.12+ vorhanden ist; das eigentliche Theater dort ist die Authentifizierung: eine Entwickler-App, ein Admin-System-User, Asset-Zuweisung und ein Token mit Scopes. - Cloud-Speicher. Creatives liegen oft in Google Drive.
ads upload:drive "<shared folder link>"übergibt einen per Link geteilten Drive-Ordner an unsere Infrastruktur, die die Medien serverseitig herunterlädt und verarbeitet, und das gehostete Ads Uploader MCP nimmt einen Drive-Ordner- oder Datei-Link genauso an. Das ist oft schneller, als Dateien selbst hin- und herzuschieben. - Gespeicherte Builds, die du öffnen kannst. Web-App, CLI und MCP teilen sich denselben Build. Ein Agent kann eine ganze Kampagne über CLI oder MCP zusammenstellen und einen Build-Link zurückgeben. Öffne ihn im Ads Uploader Uploader, und du kannst Texte, die Ad-Set-Konfiguration und Enhancements ändern oder weitere Medien hinzufügen und dann aus dem Web starten oder mit demselben Build über CLI oder MCP weitermachen. Ein offener Uploader-Tab übernimmt die Änderungen des Agenten automatisch. In einem reinen Chat-Workflow siehst du das beabsichtigte Ergebnis eigentlich erst, wenn die Ads starten, und das zählt am meisten bei Konten anderer Leute.
Welcher Weg sinnvoll ist, hängt von deinem Setup ab:
- Ein einfaches Setup: ein Werbekonto, statische Bilder in ein paar Größen, eine Kampagnenstruktur. Du kannst eigene Skills auf Metas CLI oder MCP bauen, um genau so hochzuladen, wie du willst, und es ist eine gute Möglichkeit, die API kennenzulernen.
- Agenturen und Partner: viele Konten, unterschiedliche Kampagnen-Setups pro Kunde und die Komplikationen, die jedes davon mit sich bringt. Genau dort geraten selbst gebaute Skills gern ins Straucheln, weil jedes neue Konto weitere Kombinationen hinzufügt. Ads Uploader ist dort das Sicherheitsnetz. Du lagerst das Wissen und die Umsetzung an einen Workflow aus, der von Tausenden Media Buyern und Agenturen erprobt ist, zu einem sehr erschwinglichen Preis.
Dann ist da noch die Pflege. Metas Tools, Berechtigungen und Freigaberegeln ändern sich ständig: Zugriffsstufen wurden in Limited und Full umbenannt, neue Kampagnentypen bringen neue Berechtigungen, App Review greift, sobald eine App Konten anderer Businesses verwaltet, und muss wiederholt werden, wenn sich Anforderungen ändern, und unserer Erfahrung nach dauern diese Reviews heute viel länger als früher. Wenn jemand anderes Tools, Berechtigungen und Freigaben im Blick behält, wirst du nicht abgehängt, wenn sie sich ändern. Ads Uploader ist eine freigegebene Meta-App, die wir pflegen, mit etablierten Kanälen, um Plattform- und API-Probleme bei Meta zu melden, wenn auf Metas Seite etwas kaputtgeht, also ist es unser Job, diese Änderungen zu verfolgen, nicht deiner.
Meta Ads CLI vs Ads Uploader CLI
So schneiden die beiden im direkten Vergleich ab:
| Meta Ads CLI | Ads Uploader CLI | |
|---|---|---|
| Installation | pip install meta-ads (Python 3.12+) | npm install -g @adsuploader/cli (Node.js 18+) |
| Auth und Setup | Deine eigene Meta-Entwickler-App, ein Admin-System-User, Asset-Zuweisung und ein Token mit Scopes | ads login im Browser mit deinem Ads Uploader Konto |
| Vorschau | Kein Dry Run und keine Vorschau; Prüfung durch Zurücklesen der Objekte | ads create:preview zeigt, was erstellt wird, bevor du es erstellst |
| Cloud-Import | Liest lokale Dateien; Cloud-Speicher muss auf die Festplatte synchronisiert werden | ads upload:drive importiert einen per Link geteilten Google-Drive-Ordner serverseitig |
| Builds und Review | Jeder Befehl ist ein eigenständiger API-Call, ohne gespeicherten Plan | Gespeicherte Builds, geteilt mit Web-App und MCP; öffne den Build-Link, um in der UI zu prüfen und zu bearbeiten |
| Wartung und App-Freigaben | Du pflegst App, Token, Zugriffsstufe und jedes App Review | Freigegebene Meta-App, von uns gepflegt |
| Kosten | Kostenlos; du zahlst nur die Werbeausgaben | Bezahlte Pläne |
Wenn du einem Coding-Agenten Metas API ohne irgendetwas dazwischen geben willst, ist das offizielle Meta Ads CLI der naheliegende Startpunkt, und für ein einfaches Setup ist es ein guter. Wenn du Vorschau, Launch-Logik und Freigaben lieber nicht selbst bauen und pflegen willst, genau diesen Job übernimmt das Ads Uploader CLI.
Gib deinem KI-Agenten ein Sicherheitsnetz
Launche über alle Kundenkonten hinweg, mit einem MCP und CLI für Power-Media-Buyer und Agenturen.
Ads Uploader kostenlos testenKeine Kreditkarte nötig • 7 Tage kostenlos testen
Häufig gestellte Fragen
Ist das Meta Ads CLI kostenlos?
Ja. Meta verlangt keine separate Gebühr für das CLI. Du installierst das Paket meta-ads kostenlos über PyPI und zahlst nur deine normalen Werbeausgaben. Das Paket ist proprietär statt Open Source, und du brauchst trotzdem eine Meta-Entwickler-App und einen System-User-Token.
Gibt es ein offizielles Facebook Ads CLI?
Ja. Metas offizielles CLI für Facebook- und Instagram-Ads ist das Python-Paket meta-ads, gestartet am 29. April 2026, mit Befehlen unter meta ads.
Kann das Meta Ads CLI Video-Ads hochladen?
Ja. Übergib eine lokale Datei mit --video an meta ads creative create, und das CLI lädt sie hoch. Meta dokumentiert mp4-, mov-, avi-, mkv- und wmv-Dateien, und Dynamic Creative akzeptiert bis zu 10 Videos über wiederholbare --videos-Flags.
Muss ich Entwickler sein, um das Meta Ads CLI zu nutzen?
Du musst keinen API-Code schreiben, aber das Setup ist recht entwicklerlastig: Python 3.12+, eine Meta-Entwickler-App, ein Admin-System-User mit zugewiesenen Assets und ein Token mit den richtigen Scopes. Viele Media Buyer lassen einen KI-Coding-Agenten die Installation übernehmen und die Befehle ausführen.
Kann ich mit dem Meta Ads CLI mehrere Werbekonten verwalten?
Ja, wenn der System-User jedem Konto zugewiesen ist. Liste sie mit meta ads adaccount list auf, setze mit AD_ACCOUNT_ID einen Standard oder überschreibe ihn pro Befehl mit --ad-account-id. Es gibt keine benannten Profile, also gib das Konto bei jedem Schreibvorgang explizit an.
Welche Python-Version braucht das Meta Ads CLI?
Python 3.12 oder neuer. Das Paket wird als kompilierte Wheels ausgeliefert, daher gibt es bei einer älteren Python-Version oder einer nicht unterstützten Plattform den Fehler "No matching distribution found." Eine virtuelle Umgebung mit Python 3.12 oder 3.13 vermeidet das.
Funktioniert das Meta Ads CLI mit Claude Code und Codex?
Ja. Meta nennt KI-Agenten ausdrücklich als Zielgruppe, und jeder Agent, der Shell-Befehle ausführt und JSON liest, kann es steuern. Keiner der beiden Agenten bringt von sich aus Sicherheit mit, also genehmige Lesevorgänge automatisch und verlange deine Zustimmung für Erstellungen, Aktivierungen, Budgetänderungen und Löschungen.
Wird mein Werbekonto gesperrt, wenn ich das Meta Ads CLI nutze?
Ein einfaches Ja oder Nein gibt es nicht. Das CLI ist Metas eigenes Tool für Entwickler und KI-Agenten, und Meta hat weder gesagt, dass seine Nutzung Einschränkungen verursacht, noch dass sie davon ausnimmt. Richtlinien, Zugriffsstufen und Rate-Limits gelten wie bei jeder anderen Integration. Manche Werbetreibende berichten von Einschränkungen, nachdem sie mit Agenten automatisiert haben, aber jeder Fall ist anders, also halte Schreibvorgänge unter Kontrolle und begrenze Schleifen.
Was ist der Unterschied zwischen dem Meta Ads CLI und dem Meta Ads MCP?
Das CLI ist ein lokales Python-Tool, das Shell-Befehle mit einem System-User-Token ausführt. Das Meta Ads MCP ist ein von Meta gehosteter Server unter mcp.facebook.com/ads, mit dem sich KI-Chat-Clients per OAuth verbinden, ohne Entwickler-App im Standard-Connector-Flow. Das CLI passt zu Skripten und Coding-Agenten, das MCP zu konversationeller Arbeit.
Erste Schritte mit dem Meta Ads CLI
Das Meta Ads CLI gibt Entwicklern und KI-Agenten einen offiziellen, skriptfähigen Zugang zur Marketing API, und Version 1.1.0 kann weit mehr als das Release aus der Launch-Woche. Die Kurzfassung:
- Installiere
meta-adsin einer virtuellen Umgebung mit Python 3.12+ und pinne es zusammen mitfacebook-business. - Authentifiziere dich mit dem Token eines Admin-System-Users, der nur den Assets zugewiesen ist, die du brauchst, gespeichert in
.env. - Entscheide, was du bauen willst: Ein einfaches Setup mit einem Konto lässt sich leicht selbst skripten; Agenturarbeit mit mehreren Konten ist der Punkt, an dem sich ein gepflegter Launch-Workflow bezahlt macht.
- Plane um die Lücken herum: kein Dry Run, keine Transaktionen, kein Batch-Befehl, rohes JSON für fortgeschrittene Formate.
- Mit einem Agenten genehmigst du Lesevorgänge automatisch und sicherst jeden Schreibvorgang ab.
Nutze das Meta Ads CLI in deiner ersten Woche nur lesend. Ruf Insights als JSON ab, dann baue eine Testkampagne und führe sie von Hand durch Review und Aktivierung. Sobald sich dieser Ablauf routiniert anfühlt, weißt du, welche Teile du automatisieren und welche du selbst in der Hand behalten willst.
