Dokumentation

Anzeigenkonfiguration

CLI-Vollständige Referenz

Das ist die vollständige Referenz für das Ads Uploader CLI. Eine Einführung und den Einstiegsleitfaden findest du unter CLI-Konfiguration.

Befehle

Authentifizierung

BefehlWas er macht
ads loginAuthentifizierung per Browser (öffnet deinen Standardbrowser)
ads logoutGespeicherte Anmeldedaten löschen
ads whoamiDen aktuell angemeldeten Benutzer anzeigen
ads configKonfiguration anzeigen (Konto, API-URL, Pfad der Anmeldedaten)

Durchsuchen

BefehlWas er macht
ads accountsListet alle Werbekonten auf, die mit deinem Meta-Konto verbunden sind
ads account <id>Legt ein Standard-Werbekonto für zukünftige Befehle fest
ads pagesListet die Facebook-Seiten auf, mit denen du werben kannst, inklusive eines etwaigen verknüpften Instagram-Kontos, zur Verwendung mit Profil-Überschreibungen
ads targeting:search "Austin" --type cityFindet City-Keys für das Ad-Set-Targeting
ads targeting:search "90210" --type zipFindet Postleitzahl-Keys für das Ad-Set-Targeting
ads targeting:search "advertising" --type detailedFindet IDs und Typen für detailliertes Targeting
ads campaignsListet aktive Kampagnen auf
ads campaigns --status allSchließt pausierte und archivierte Kampagnen ein
ads campaigns --search "text"Filtert Kampagnen nach Name
ads campaign <id>Zeigt die Ad Sets innerhalb einer Kampagne
ads adsets --campaign <id>Listet Ad Sets in einer Kampagne auf (unterstützt --search, --status)
ads adset <id>Zeigt die Anzeigen innerhalb eines Ad Sets
ads ad <id>Zeigt vollständige Anzeigendetails inklusive Creative-Einstellungen
ads presetsListet deine gespeicherten API-Presets auf
ads presets <id>Zeigt Details zu einem bestimmten Preset
ads presets:save --from-ad <adId> --name "Preset Name"Speichert eine bestehende Anzeige als API-Preset
ads text-presetsListet deine gespeicherten Text-Presets auf
ads text-presets <id>Zeigt Details zu einem bestimmten Text-Preset
ads uploadsListet aktuelle Upload-Batches auf
ads uploads <batchId>Zeigt Batch-Details (Dateien, Varianten, Hashes)

Medien-Upload

BefehlWas er macht
ads upload <inputs...>Lädt lokale Pfade und öffentliche HTTPS-URLs in dein Werbekonto hoch
ads upload ./directory/Lädt ein ganzes Verzeichnis hoch
ads upload:drive <folderUrl>Importiert einen öffentlichen Google-Drive-Ordner als Hintergrundjob

HTTPS-Argumente, einschließlich öffentlicher Google-Drive-Dateilinks, werden automatisch erkannt. Du kannst lokale Pfade und URLs mischen: Lokale Dateien werden zuerst hochgeladen, dann importiert der Server URLs in denselben Batch, sodass die Gruppierung über alle Eingaben hinweg funktioniert. Öffentliche Drive-Ordner müssen als Anyone with the link (Viewer) freigegeben sein.

Lokale Dateien werden parallel bereitgestellt, und vorübergehende Netzwerkfehler werden automatisch mit Backoff erneut versucht. URL- und Drive-Ordner-Importe verwenden parallele Datei-Pipelines mit begrenzter Parallelität in einem Hintergrundjob, während das CLI einen Zähler für abgeschlossen/gesamt und jede aktive Datei anzeigt. Du musst diese Flags selten anfassen, aber sie sind verfügbar:

Upload-FlagBeschreibung
--concurrency <n>Anzahl der parallel bereitgestellten Dateien, 1-6 (Standard: 4). Große Videos werden automatisch gedrosselt, um im Speicherrahmen zu bleiben.
--upload-timeout <ms>Upload-Timeout pro Datei (Standard: 120000)
--api-timeout <ms>Timeout der API-Anfrage in Millisekunden (Standard: 60000)

Anzeigenerstellung

BefehlWas er macht
ads create spec.jsonErstellt Anzeigen aus einer Spec-Datei
ads create:preview spec.jsonProbelauf, der zeigt, was erstellt würde
ads create:interactiveGeführter Assistent (akzeptiert alle Create-Flags)

Job-Verwaltung

BefehlWas er macht
ads jobs <jobId>Prüft den Status eines Jobs
ads jobs <jobId> --followStreamt Live-Fortschrittsupdates
ads jobs cancel <jobId>Bricht einen laufenden Job ab

Create-Flags

Diese Flags gelten für ads create, ads create:preview und ads create:interactive. Sie können anstelle einer Spec-Datei oder zusammen mit ihr verwendet werden.

FlagBeschreibung
--account <id>Überschreibt das Standard-Werbekonto
--preset <id>Verwendet ein gespeichertes API-Preset (Alternative zur Spec-Datei)
--text-preset <id>Lädt ein gespeichertes Text-Preset
--copy-from <adId>Kopiert Einstellungen von einer bestehenden Anzeige
--upload <batchId>Gibt die Upload-Batch-ID an
--status <PAUSED|ACTIVE>Legt den Anzeigenstatus fest (Standard: ACTIVE)
--pause-at <level>Pausierungsebene: ad (Standard), adSet oder campaign
--daily-budget <amount>Überschreibt das Tagesbudget pro Ad Set (Währungseinheiten, z. B. 50 für 50 $)
--bid-amount <amount>Überschreibt Gebot/Kostenobergrenze pro Ad Set (Währungseinheiten)
--minimum-roas <ratio>Überschreibt das Mindest-ROAS-Ziel pro Ad Set (z. B. 1.5)
--campaign-daily-budget <amount>Legt ein tägliches CBO-Kampagnenbudget in ganzen Währungseinheiten fest. Schließt das Laufzeitbudget aus; lasse beide weg, um das Budget der Quellkampagne zu übernehmen.
--campaign-lifetime-budget <amount>Legt ein CBO-Laufzeitbudget in ganzen Währungseinheiten fest. Schließt das Tagesbudget aus; lasse beide weg, um das Budget der Quellkampagne zu übernehmen.
--adset-min-spend <amount>Legt die Mindestausgaben des Ad Sets unter CBO in ganzen Währungseinheiten fest; 0 entfernt das vom Quell-Ad-Set übernommene Limit.
--adset-max-spend <amount>Legt die Höchstausgaben des Ad Sets unter CBO in ganzen Währungseinheiten fest; 0 entfernt das vom Quell-Ad-Set übernommene Limit.
--adset-min-spend-pct <5-100>Legt die Mindestausgaben des Ad Sets als Prozentsatz des Kampagnenbudgets fest (in 5-%-Schritten). Funktioniert auch bei einer bestehenden CBO-Kampagne; schließt --adset-min-spend aus.
--adset-max-spend-pct <5-100>Legt die Höchstausgaben des Ad Sets als Prozentsatz des Kampagnenbudgets fest (in 5-%-Schritten). Funktioniert auch bei einer bestehenden CBO-Kampagne; schließt --adset-max-spend aus.
--location <ISO>Zielt per zweibuchstabigem ISO-Code auf ein Land. Wiederhole das Flag für mehrere Länder.
--age-min <n>Mindestalter, von 13 bis 65
--age-max <n>Höchstalter, von 13 bis 65 (65 bedeutet 65+)
--gender <gender>all, men oder women. all hebt eine vom Quell-Ad-Set übernommene Geschlechtseinschränkung auf.
--ai-disclosureLegt KI-generierte Creative-Inhalte selbst offen (Metas Transparenz für KI-Inhalte). Standardmäßig aus.
--page <id>Verwendet diese Facebook-Seite statt der des Templates (siehe Profiloptionen)
--instagram <id>Verwendet dieses Instagram-Konto statt dem des Templates
--use-page-identityVerwendet die Facebook-Seite als Instagram-Identität; kann nicht mit --instagram kombiniert werden
--threads <id>Verwendet dieses Threads-Profil statt dem des Templates
--text-file <path>Lädt die Textkonfiguration aus einer JSON-Datei
--expandedZeigt vollständige Werte für Überschrift, Primärtext und Beschreibung in Vorschauen

Browse-Flags

Diese Flags sind verfügbar bei campaigns, adsets, adset und campaign:

FlagBeschreibung
--status <status>active (Standard) oder all
--inactiveKurzform für --status all (bei campaigns)
--search <text>Nach Name filtern (bei campaigns, adsets)

Targeting-Suche

Städte, Postleitzahlen und detailliertes Targeting verwenden Meta-Identifier statt Namen. Suche über Ads Uploader, um Werte zu erhalten, die sich direkt in eine Spec einfügen lassen:

ads targeting:search "Austin" --type city
ads targeting:search "90210" --type zip
ads targeting:search "advertising" --type detailed
FlagBeschreibung
--type <type>Erforderlich. city liefert targeting.cities[].key-Werte; zip liefert targeting.zips[].key-Werte; detailed liefert Einträge für targeting.detailedTargetingGroups.
--account <id>Überschreibt das konfigurierte Standard-Werbekonto
--limit <n>Gibt 1-25 Treffer zurück
--jsonGibt strukturierte Ergebnisse zum Einfügen zurück

Ergebnisse für detailliertes Targeting enthalten id, name, type, eine Spanne der Zielgruppengröße und den Kategoriepfad. Der type benennt die Kategorie des detaillierten Targetings, etwa interests, behaviors, work_employers oder work_positions. Suche immer nach diesen Identifiern; rate sie nie.

Detail-Flags

Diese Flags sind verfügbar bei ad:

FlagBeschreibung
--expandedZeigt vollständige Werte für Überschrift, Primärtext und Beschreibung

Allgemeine Flags

FlagBeschreibung
--account <id>Überschreibt das Standard-Werbekonto für jeden Befehl
--jsonGibt rohes JSON aus (bei den meisten Befehlen verfügbar, für Skripting gedacht)

Format der Spec-Datei

Die JSON-Spec-Datei steuert jeden Aspekt der Anzeigenerstellung. Gib eine Template-Quelle (adPresetId oder copyFromAd) sowie entweder uploadId oder erfasste mediaItems mit einem Facebook-mediaHash für jedes Bild und mediaId für jedes Video an. Standard-, Karussell-, flexible und Placement-Videos brauchen zusätzlich thumbnailHash; Multi-Media-Videos verwenden ihre erfasste öffentliche Thumbnail-URL.

Minimale Spec

{
  "adPresetId": "your_preset_id",
  "uploadId": "batch_abc123"
}

Vollständiges Beispiel

{
  "adPresetId": "preset_id_here",
  "uploadId": "batch_abc123",
  "adSet": {
    "name": "My New Ad Set",
    "dailyBudget": 50
  },
  "adNamePattern": "{filename}",
  "texts": {
    "perAd": {
      "hero.jpg": {
        "headlines": ["Main Headline"],
        "bodies": ["Ad copy here."],
        "descriptions": ["Short description"],
        "cta": "SHOP_NOW",
        "link": "https://example.com/landing"
      }
    }
  },
  "creativeEnhancements": "none",
  "options": {
    "status": "PAUSED",
    "pauseAt": "adSet"
  }
}

Template-Quelle

Du brauchst eine davon, um dem CLI mitzuteilen, welche Anzeigenkonfiguration als Basis verwendet werden soll.

FeldBeschreibung
adPresetIdDie ID eines gespeicherten API-Presets. Legt Kampagne, Ad Set und Anzeigenkonfiguration fest.
copyFromAdEine Facebook-Anzeigen-ID, von der Einstellungen kopiert werden.

Wenn du copyFromAd verwendest, gib den Upload-Batch an oder starte einen gespeicherten Web-Build, dessen erfasste Bilder mediaHash und Videos mediaId haben. Optional kannst du Kampagne und Ad Set festlegen:

{
  "copyFromAd": "120233848667930472",
  "uploadId": "batch_abc123",
  "campaign": { "id": "120233848666410472" },
  "adSet": { "id": "120233848666620472" }
}

Um die richtige Anzeigen-ID zu finden, navigiere durch dein Konto: ads campaigns dann ads campaign <id> dann ads adset <id> dann ads ad <id>.

Profiloptionen

Standardmäßig erben neue Anzeigen die Facebook-Seite, das Instagram-Konto und das Threads-Profil von der Template-Anzeige oder dem Preset. Das ist dasselbe Profiloptionen-Steuerelement, das über das Standardwerte-Panel in der Web-App verfügbar ist. Überschreibe eines davon mit einem profile-Block (oder den Flags --page / --instagram / --use-page-identity / --threads, die Vorrang vor der Spec-Datei haben):

{
  "copyFromAd": "120233848667930472",
  "uploadId": "batch_abc123",
  "profile": {
    "pageId": "123456789012345",
    "instagramId": "17841400000000000",
    "threadsId": "987654321098765"
  }
}

Führe ads pages aus, um die Seiten-IDs aufzulisten, die du verwenden kannst, zusammen mit dem verknüpften Instagram-Konto jeder Seite.

Wenn du nur die Seite überschreibst, verwendet Ads Uploader automatisch deren verknüpftes Instagram-Konto. Ist kein Instagram-Konto verknüpft, wird die Facebook-Seite als Instagram-Identität verwendet. Threads wird trotzdem zurückgesetzt, da es zur alten Seite gehören könnte; lege es bei Bedarf explizit fest.

Für eine explizite Page-Actor-Wahl verwende --use-page-identity oder setze "useFacebookPage": true innerhalb von profile. Kombiniere das nicht mit --instagram oder instagramId. Du kannst auch nur das Instagram- oder Threads-Profil ändern, ohne die Seite anzufassen, indem du nur diese Felder festlegst.

Bei Multi-Kampagnen-Starts weist du Identitäten unabhängig voneinander mit profile.campaigns zu. Referenziere jede Überschreibung über die passende Kampagnen-id (empfohlen) oder über einen eindeutigen Kampagnennamen:

{
  "campaign": {
    "mode": "duplicate",
    "campaigns": [
      { "id": "prospecting", "name": "Prospecting" },
      { "id": "retargeting", "name": "Retargeting" }
    ]
  },
  "profile": {
    "campaigns": {
      "prospecting": { "pageId": "page_1", "instagramId": "ig_1", "threadsId": null },
      "retargeting": { "pageId": "page_2", "useFacebookPage": true, "threadsId": "threads_2" }
    }
  }
}

Jeder Key in profile.campaigns muss mit einer Kampagne in campaign.campaigns übereinstimmen; nicht zugeordnete oder mehrdeutige Keys werden vor dem Launch abgelehnt.

Kampagnenstruktur

Standardmäßig gehen Anzeigen in die Kampagne der Template-Anzeige. Du kannst eine neue Kampagne erstellen, indem du campaign.name angibst.

Für Multi-Kampagnen-Modi verwende campaign.mode mit einem campaigns-Array:

{
  "campaign": {
    "mode": "duplicate",
    "campaigns": [
      { "name": "Campaign A" },
      { "name": "Campaign B" }
    ]
  }
}
ModusVerhalten
"single"Standard. Eine Kampagne.
"duplicate"Alle Medien werden in jede Kampagne dupliziert.
"split"Medien werden gleichmäßig auf die Kampagnen aufgeteilt.

Ad-Set-Modi

Standardmäßig gehen Anzeigen in das bestehende Ad Set der Template-Anzeige. Die folgenden Modi geben dir Kontrolle darüber, wie Anzeigen auf Ad Sets verteilt werden.

Ein neues Ad Set erstellen:

{ "adSet": { "name": "My Ad Set" } }

Ein bestehendes Ad Set per ID verwenden:

{ "adSet": { "id": "120233848666620472" } }

Ein Ad Set pro hochgeladener Datei:

{ "adSet": { "mode": "perUpload" } }

Automatisches Gruppieren in Ad Sets fester Größe:

{ "adSet": { "mode": "autoGroup", "adsPerAdSet": 5 } }

Benutzerdefinierte Gruppen mit voller Kontrolle darüber, welche Dateien wohin gehen:

{
  "adSet": {
    "groups": [
      { "name": "Images - April 10", "media": ["hero.jpg", "banner.jpg"] },
      { "name": "Videos - April 10", "media": ["promo.mp4"] }
    ]
  }
}

Benennungsmuster für Ad Sets für Multi-Ad-Set-Modi:

{ "adSet": { "mode": "perUpload", "namePattern": "Ad Set {index:01}" } }

Variantengruppierung gruppiert Anzeigen nach Variationskennung in dasselbe Ad Set:

{ "adSet": { "mode": "autoGroup", "groupVariations": true, "variationIdentifier": "-" } }

Budget- und Gebotsüberschreibung

Überschreibe das Tagesbudget und/oder den Gebotsbetrag bei neuen Ad Sets. Die Werte sind in den Währungseinheiten deines Kontos (z. B. 50 für 50 $ oder 50 Euro).

dailyBudget und bidAmount verwenden Kontowährungseinheiten. minimumRoas ist ein Verhältnis, 1.5 bedeutet also ein 1,5-faches ROAS-Ziel.

  • ABO-Kampagnen (Budget liegt beim Ad Set): Kombiniere dailyBudget mit bidAmount für Gebots-/Kostenobergrenzen-Strategien, oder mit minimumRoas für LOWEST_COST_WITH_MIN_ROAS.
  • CBO-Kampagnen (Budget liegt bei der Kampagne): Lege dailyBudget nicht beim Ad Set fest. Mit campaign.dailyBudget oder campaign.lifetimeBudget (gegenseitig ausschließend) überschreibst du das Budget der Quellkampagne; lässt du beide weg, wird es übernommen. Mindest- und Höchstausgaben für das Ad Set lassen sich als ganze Währungsbeträge oder als 5-100 % des Kampagnenbudgets (in 5-%-Schritten) festlegen; Prozentwerte funktionieren auch bei einer bestehenden CBO-Kampagne. Lege bidAmount oder minimumRoas beim Ad Set fest, wenn dessen Quellstrategie dieses Steuerelement verwendet.

bidAmount und minimumRoas schließen sich gegenseitig aus, da sie zu unterschiedlichen Gebotsstrategien gehören.

{ "adSet": { "dailyBudget": 50 } }
{ "adSet": { "bidAmount": 5 } }
{ "adSet": { "minimumRoas": 1.5 } }
{ "adSet": { "dailyBudget": 50, "bidAmount": 5 } }

Auch als CLI-Flags verfügbar: --daily-budget 50, --bid-amount 5, --minimum-roas 1.5, --campaign-daily-budget 100, --campaign-lifetime-budget 1000, --adset-min-spend 20, --adset-max-spend 80, --adset-min-spend-pct 20 und --adset-max-spend-pct 80.

Ad-Set-Targeting

Targeting gilt für neue Ad Sets. Lass den targeting-Block auf oberster Ebene weg, um die Zielgruppe des Quell-Ad-Sets unverändert zu übernehmen. Jeder Modus kann adSet.targetingPerAdSet verwenden, mit Keys wie bei texts.perAdset nach finalem Ad-Set-Namen, Ad-Set-ID oder kollisionssicherem campaign::key. Der Custom-Modus unterstützt außerdem adSet.groups[].targeting. Die Rangfolge lautet targetingPerAdSet, dann groups[].targeting, dann der Build-Standard, dann die Quell-Zielgruppe. Ad-Set-individuelles Targeting ist nur über die Spec möglich, da CLI-Flags kein bestimmtes geplantes Ad Set adressieren können.

Bei mehreren Kampagnen wird die Kopie eines Ad Sets in jeder Kampagne separat angesteuert; verwende "Campaign name::Ad set name" als Key für eine bestimmte Kopie.

{
  "targeting": {
    "countries": ["US"],
    "cities": [
      {
        "key": "2525495",
        "name": "Austin",
        "region": "Texas",
        "countryCode": "US",
        "radius": 25,
        "distance_unit": "mile"
      }
    ],
    "zips": [
      {
        "key": "US:90210",
        "name": "90210",
        "region": "California",
        "countryCode": "US"
      }
    ],
    "selectionVersion": 4,
    "ageSelected": true,
    "ageMin": 21,
    "ageMax": 55,
    "genderSelected": true,
    "genders": "women",
    "detailedTargetingSelected": true,
    "detailedTargetingGroups": [[
      {
        "id": "112002898811624",
        "name": "Advertising agency",
        "type": "work_employers"
      }
    ]]
  }
}
{
  "targeting": { "countries": ["US"], "ageMin": 21, "ageMax": 55 },
  "adSet": {
    "mode": "perUpload",
    "namePattern": "Ad Set {index:01}",
    "targetingPerAdSet": {
      "Ad Set 02": { "countries": ["CA"], "genders": "women" },
      "Ad Set 01": { "countries": ["GB"] }
    }
  }
}

Für den Custom-Modus bleibt groups[].targeting weiterhin gültig und hält die Überschreibung neben ihrer Mediengruppe:

{
  "adSet": {
    "mode": "custom",
    "groups": [{
      "name": "Canada Women",
      "media": ["canada.jpg"],
      "targeting": { "countries": ["CA"], "genders": "women" }
    }]
  }
}

Nutze ads targeting:search, um den key einer Stadt (Typ city), den key einer Postleitzahl wie US:90210 (Typ zip) sowie id, name und type jeder detaillierten Auswahl (Typ detailed) zu finden. Lass Länder, Städte und Postleitzahlen weg, um die Standorte der Quelle zu übernehmen. Länder, Städte und Postleitzahlen werden als Alternativen kombiniert: Austin oder eine Postleitzahl zusätzlich zu countries: ["US"] zielt weiterhin auf die gesamten USA; lass die Länder weg, um nur die Stadt oder Postleitzahl anzusprechen. Postleitzahlen haben keinen Radius.

Textkonfiguration

Gemeinsamer Text wendet denselben Text auf alle Anzeigen an:

{
  "texts": {
    "common": {
      "headlines": ["Headline 1", "Headline 2"],
      "bodies": ["Primary text"],
      "descriptions": ["Description"]
    },
    "strategy": "flexible"
  }
}

Text pro Anzeige lässt dich einzigartigen Text für jede Datei festlegen:

{
  "texts": {
    "perAd": {
      "hero.jpg": {
        "headlines": ["Hero Headline"],
        "bodies": ["Hero copy"],
        "descriptions": ["Hero desc"],
        "cta": "LEARN_MORE",
        "link": "https://example.com/hero",
        "urlTags": "utm_content=hero"
      },
      "banner.jpg": {
        "headlines": ["Banner Headline"],
        "bodies": ["Banner copy"]
      }
    }
  }
}

Schlüssel pro Anzeige sind Dateinamen (keine vollständigen Pfade). Jeder Eintrag unterstützt: headlines, bodies, descriptions, cta, link, displayUrl, urlTags. Felder, die du nicht angibst, werden von der Template-Anzeige geerbt.

Text pro Ad Set wendet einen Textblock auf jede Anzeige in einem Ziel-Ad-Set an. Verwende einen einfachen Ad-Set-Namen bzw. eine ID, wenn dieser eindeutig ist, oder einen campaign::key-Eintrag, wenn derselbe Ad-Set-Name in mehr als einer Kampagne vorkommt:

{
  "texts": {
    "perAdset": {
      "Prospecting::prospecting_set": {
        "headlines": ["Prospecting headline"],
        "bodies": ["Prospecting copy"],
        "descriptions": ["Prospecting description"],
        "cta": "SHOP_NOW",
        "link": "https://example.com/prospecting",
        "displayUrl": "example.com/prospecting",
        "urlTags": "utm_campaign=prospecting",
        "aiDisclosure": false
      }
    }
  }
}

Jeder Key in texts.perAdset muss zu einem geplanten Ad Set passen. Nicht zugeordnete Keys werden abgelehnt, statt auf den gemeinsamen Text zurückzufallen.

Text-Presets lassen dich eine gespeicherte Textkonfiguration laden:

{ "textPresetId": "preset_id_here" }

Du kannst textPresetId nicht mit texts kombinieren.

Strategieoptionen steuern, wie mehrere Textvariationen behandelt werden:

  • "flexible" (Standard) lässt Meta über deine Textvariationen optimieren. Mehrere Überschriften und Texte werden zu Optionen, die Facebook frei kombiniert.
  • "separate" erstellt eine separate Anzeige für jede Textkombination.

Eine CTA auf oberster Ebene gilt für alle Anzeigen. CTAs pro Anzeige in texts.perAd und CTAs pro Ad Set in texts.perAdset überschreiben sie.

{
  "cta": {
    "type": "SHOP_NOW",
    "link": "https://example.com",
    "displayUrl": "example.com"
  },
  "urlTags": "utm_source=facebook&utm_medium=paid"
}

Standard-CTA-Typen: LEARN_MORE, SHOP_NOW, SIGN_UP, SUBSCRIBE, GET_OFFER, CONTACT_US, DOWNLOAD, ORDER_NOW, BUY_NOW, BOOK_NOW, APPLY_NOW, GET_QUOTE, GET_IN_TOUCH, WATCH_MORE, PLAY_GAME

Zielspezifische CTAs werden von der Template-Anzeige geerbt und sollten nicht manuell festgelegt werden. Sie beim falschen Kampagnentyp festzulegen, verursacht einen Facebook-API-Fehler.

CTAErforderliches Kampagnenziel
MESSAGE_PAGEMessenger-Ziel
WHATSAPP_MESSAGEWhatsApp-Ziel
INSTAGRAM_MESSAGEInstagram-DM-Ziel
CALL_NOWAnruf-Kampagne

URL-Split-Test (geteiltes Ziel)

Gib 2 bis 5 Ziel-URLs unter texts.urlVariants an, und jedes generierte Ad Set wird einmal pro URL dupliziert, sodass Meta jede Kombination aus Anzeige und Landingpage unabhängig optimiert.

{
  "texts": {
    "common": { "headlines": ["Hero"], "bodies": ["Copy"] },
    "urlVariants": [
      { "link": "https://example.com/homepage", "label": "homepage" },
      { "link": "https://example.com/quiz", "label": "quiz-v2" }
    ]
  }
}
  • label ist optional. Wenn weggelassen, wird der letzte Pfad-Slug der URL verwendet (/quiz-v2quiz-v2), mit Rückfall auf den Hostnamen bei Root-URLs.
  • Im Einzel-Ad-Set-Modus wird das Label jeder Variante zum vollständigen Ad-Set-Namen.
  • In den Modi perUpload und autoGroup hängt der Name jedes duplizierten Ad Sets _{label} an das Muster an (oder ersetzt einen {destination}-Token, falls du einen einfügst).
  • Der {date}-Token in einem Label wird zum heutigen Datum aufgelöst (z. B. launch-{date}launch-2026-04-27).
  • Jede Ziel-URL muss eindeutig sein. Identische URLs (oder Varianten desselben URL mit/ohne Schrägstrich am Ende oder mit anderer Groß-/Kleinschreibung) werden zu einem Eintrag zusammengefasst, stelle also sicher, dass du mindestens 2 unterschiedliche Ziele hast.
  • Dein Ad-Set-Budget wird mit der Anzahl der Varianten multipliziert, da jedes Duplikat ein eigenes Ad Set ist.
  • Nicht kompatibel mit Quell-Anzeigen mit Spezialziel (Lead-Formular, Messenger, WhatsApp, Instagram-DM, Anruf). Das CLI lehnt diese Kombination mit einem klaren Fehler ab, diese Formate werden nicht über cta.link geleitet.
  • link-Überschreibungen pro Anzeige in texts.perAd verlieren gegen die Varianten-URL, wenn beide festgelegt sind.

Creative Enhancements

Steuere die Advantage+ Creative Enhancements:

{ "creativeEnhancements": "none" }
WertEffekt
weggelassenAlle Funktionen aus
"metaDefaults"Veralteter Alias für "none"
"all"Alle Funktionen an
"none"Alle Funktionen aus
["feature1", "feature2"]Nur die aufgelisteten Funktionen an, der Rest aus

Verfügbare Funktionen: text_translation, inline_comment, enhance_cta, text_optimizations, reveal_details_over_time, show_destination_blurbs, image_brightness_and_contrast, image_touchups, video_auto_crop, video_filtering, pac_relaxation, image_animation, image_templates, adapt_to_placement, product_extensions, product_tags, description_automation, add_text_overlay, music, carousel_to_video, carousel_dynamic_description, multi_share_end_card, multi_share_optimized

Der Schlüssel show_destination_blurbs wird als Show spotlights angezeigt, pac_relaxation als Flex media.

Wenn du einzelne Funktionen auswählst, liste nur die auf, die für den Medientyp relevant sind. Videofunktionen (video_auto_crop, video_filtering) gelten nur für Videoanzeigen. Karussellfunktionen (carousel_to_video, carousel_dynamic_description, multi_share_end_card, multi_share_optimized) gelten nur für Karussellanzeigen.

product_tags gilt für Bild- und Videoanzeigen und nur beim Klonen. Die Funktion kann nur aktiviert werden, wenn die Quellanzeige einen zugeordneten Katalog und explizit positionierte Produkt-Tags hat; alle Tags der Quelle und ihre Positionen bleiben erhalten. "all" schließt sie nur bei einer geeigneten Quelle ein und erfindet nie ein Produkt-Tag.

Karussellanzeigen

Gruppiere hochgeladene Dateien in Karussellanzeigen mit Text pro Karte und optionalem Gesamttext für das Karussell. cardTexts steuert einzelne Karten. Der Gesamttext des Karussells kann am Karussell-Objekt mitgegeben oder in texts.perAd über den name des Karussells festgelegt werden; die am Objekt mitgegebenen Felder gewinnen, wenn beide vorhanden sind.

{
  "carousel": [
    {
      "name": "My Carousel",
      "cards": ["slide1.jpg", "slide2.jpg", "slide3.jpg"],
      "headlines": ["Overall Carousel Headline"],
      "bodies": ["Overall primary text"],
      "descriptions": ["Overall description"],
      "cta": "SHOP_NOW",
      "link": "https://example.com/carousel",
      "urlTags": "utm_content=my_carousel",
      "cardTexts": [
        { "headline": "Slide 1", "description": "First card", "link": "https://example.com/1" },
        { "headline": "Slide 2", "description": "Second card", "link": "https://example.com/2" }
      ]
    }
  ]
}

Alternative Form für den Gesamttext:

{
  "texts": {
    "perAd": {
      "My Carousel": {
        "headlines": ["Overall Carousel Headline"],
        "bodies": ["Overall primary text"],
        "descriptions": ["Overall description"],
        "cta": "SHOP_NOW",
        "link": "https://example.com/carousel",
        "urlTags": "utm_content=my_carousel"
      }
    }
  },
  "carousel": [
    {
      "name": "My Carousel",
      "cards": ["slide1.jpg", "slide2.jpg", "slide3.jpg"]
    }
  ]
}

Karten müssen auf Dateinamen aus dem Upload-Batch verweisen. Mindestens 2 Karten pro Karussell. Dateien, die von einem Karussell beansprucht werden, werden aus der Standard-Anzeigenliste entfernt.

Flexible Anzeigen

Gruppiere mehrere Assets in eine einzige flexible Anzeige, bei der Meta das beste Asset pro Platzierung auswählt:

{
  "flexible": [
    {
      "name": "Multi-Asset Ad",
      "assets": ["hero.jpg", "promo.mp4", "banner.jpg"]
    }
  ]
}

Mindestens 2 Assets pro Gruppe. Dateien, die von einer flexiblen Gruppe beansprucht werden, werden aus der Standard-Anzeigenliste entfernt.

Multi-Media-Anzeigen

Gruppiere 2-10 hochgeladene Bilder oder Videos in eine Meta-Multi-Media-Anzeige:

{
  "multimedia": [
    {
      "name": "Mixed Media Ad",
      "assets": ["hero.jpg", "promo.mp4", "banner.jpg"],
      "assetTexts": [
        {
          "headline": "Hero headline",
          "primaryText": "Hero primary text",
          "description": "Hero description",
          "link": "https://example.com/hero",
          "displayUrl": "example.com/hero"
        }
      ]
    }
  ]
}

Assets müssen auf Dateinamen aus dem Upload-Batch verweisen. assetTexts ist optional und richtet sich nach Index an assets aus; jedes Feld ist eine einzelne Überschreibung für dieses Asset, und leere Felder fallen auf den Haupttext und die URLs der Anzeige zurück. Das primär gerenderte Asset verwendet den Haupttext und die Haupt-URL der Anzeige, und jede Überschreibung des Primärtexts eines Assets wird zur ersten Haupttext-Option. Videos benötigen eine gecachte öffentliche Thumbnail-URL aus der Upload-Verarbeitung. Dateien, die von einer Multi-Media-Gruppe beansprucht werden, werden aus der Standard-Anzeigenliste entfernt.

Anzeigenbenennung

Passe an, wie deine Anzeigen benannt werden:

{ "adNamePattern": "{filename} - {date}" }
PlatzhalterWas er einfügt
{filename}Ursprünglicher Dateiname ohne Erweiterung
{index:01}Mit Nullen aufgefüllter Index (01, 02, 03...)
{variation}Variationskennung, falls Variantengruppierung aktiv ist
{campaign}Kampagnenname
{date}Aktuelles Datum (JJJJ-MM-TT)
{date:short}Kurzes Datum (MM-TT)
{timestamp}Unix-Timestamp

Optionen

{
  "options": {
    "status": "PAUSED",
    "pauseAt": "adSet",
    "schedule": {
      "startTime": "2026-04-01T09:00:00",
      "endTime": "2026-04-30T23:59:59"
    }
  }
}
FeldWerteBeschreibung
status"PAUSED", "ACTIVE"Anzeigen-Startstatus (Standard: ACTIVE)
pauseAt"ad", "adSet", "campaign"Auf welcher Ebene pausiert wird (Standard: ad)
schedule.startTimeISO-8601-StringGeplante Startzeit (verwendet die Zeitzone des Werbekontos)
schedule.endTimeISO-8601-StringGeplante Endzeit (optional)

Upload und Varianten-Erkennung

Variantengruppen werden automatisch aus Dateinamenskonventionen erkannt, genau wie in der Webanwendung. Siehe Variationen des Seitenverhältnisses für alle Details zu den Benennungskonventionen.

Verhältnis-Suffixe: hero_1x1.jpg + hero_4x5.jpg + hero_9x16.jpg + hero_16x9.jpg + hero_1.91x1.jpg werden als eine Varianten-Anzeige gruppiert. Bis zu 5 Verhältnisse pro Gruppe.

Token-Position: Der Verhältnis-Token kann am Ende (hero_4x5.jpg), in der Mitte (hero_4x5_v2.jpg) oder am Anfang (4x5_hero.jpg) stehen.

Veraltete Wort-Suffixe: hero.jpg + hero_vertical.jpg + hero_horizontal.jpg funktionieren weiterhin und werden auf 9x16 und 16x9 abgebildet.

Das Standard-Trennzeichen ist _. Du kannst es ändern (oder mehrere zulassen) unter Konto > Standardwerte > Platzierungen > Dateinamen-Trennzeichen.

Gängige Muster

Hochladen und mit einem Preset erstellen

ads upload ./creatives/hero.jpg ./creatives/banner.jpg
ads create:preview spec.json
ads create spec.json

Wobei spec.json Folgendes enthält:

{ "adPresetId": "PRESET_ID", "uploadId": "BATCH_ID" }

Einstellungen von einer bestehenden Anzeige kopieren

Durchsuche dein Konto, um die Anzeige zu finden:

ads campaigns
ads campaign 120233848666410472
ads adset 120233848666620472
ads ad 120233848667930472

Erstelle dann eine Spec, die darauf verweist:

{
  "copyFromAd": "120233848667930472",
  "uploadId": "BATCH_ID"
}

Die Quell-Anzeige muss Inline-Creative-Einstellungen haben. Wenn sie aus einem bestehenden Seitenbeitrag erstellt wurde, lehnt das CLI sie ab, bevor eine Erstellungsanfrage gesendet wird.

Ein API-Preset aus einer bestehenden Anzeige speichern

ads presets:save --from-ad 120233848667930472 --name "Spring Purchase Template"
ads create --preset PRESET_ID --upload BATCH_ID

Das speichert dieselbe API-Preset-Form, die die Web-App verwendet. Die Quell-Anzeige muss Inline-Creative-Einstellungen haben; auf Seitenbeiträgen basierende Anzeigen können nicht als API-Presets gespeichert werden.

Text pro Anzeige mit einzigartigem Text pro Datei

{
  "adPresetId": "PRESET_ID",
  "uploadId": "BATCH_ID",
  "texts": {
    "perAd": {
      "hero.jpg": {
        "headlines": ["Summer Sale Now On"],
        "bodies": ["Save up to 50% on all items"],
        "cta": "SHOP_NOW",
        "link": "https://example.com/summer"
      },
      "banner.jpg": {
        "headlines": ["New Collection Available"],
        "bodies": ["Browse our latest styles"],
        "cta": "LEARN_MORE",
        "link": "https://example.com/new"
      }
    }
  }
}

Automatisches Gruppieren in mehrere Ad Sets

{
  "adPresetId": "PRESET_ID",
  "uploadId": "BATCH_ID",
  "adSet": { "mode": "autoGroup", "adsPerAdSet": 3 }
}

Wichtige Hinweise

  1. Zeige immer zuerst die Vorschau an. create:preview erkennt Konfigurationsfehler, bevor Facebook angefasst wird.
  2. Anzeigen sind standardmäßig aktiv. Verwende --status PAUSED oder "status": "PAUSED" in der Spec, um sie pausiert zu erstellen.
  3. uploadId kommt aus der Upload-Ausgabe. Es ist die Batch-ID, die von ads upload zurückgegeben wird.
  4. Uploads sind an ein Werbekonto gebunden. Dateien werden direkt in die Facebook-Mediathek des ausgewählten Kontos hochgeladen. Die Batch-ID kann nur mit demselben Konto verwendet werden.
  5. copyFromAd braucht auflösbare Medien. Gib uploadId an, oder starte einen gespeicherten Build, dessen erfasste Bilder mediaHash und Videos mediaId haben. Optional kannst du campaign.id und adSet.id angeben, um die Platzierung zu steuern.
  6. Textschlüssel pro Anzeige sind Dateinamen. Verwende "hero.jpg", nicht "/path/to/hero.jpg".
  7. textPresetId und texts schließen sich gegenseitig aus. Verwende das eine oder das andere, nicht beide.
  8. Zielspezifische CTAs werden vom Template geerbt. Lege MESSAGE_PAGE, WHATSAPP_MESSAGE usw. nicht manuell fest.