Meta Marketing API v26.0: Die Änderungen vom 27.10.2026 und ein Prüfskript für bestehende Integrationen

Inhalt
Meta veröffentlichte Graph API und Marketing API v26.0 am 29. Juli 2026. Mehrere Änderungen erreichen am 27. Oktober 2026 auch ältere unterstützte Marketing-API-Versionen. Neben der festgelegten API-Version zählt deshalb das Wirksamkeitsdatum jeder einzelnen Änderung. Dieser Artikel behandelt sechs für die Werbeautomatisierung relevante Änderungen; der vollständige Versionshinweis enthält weitere Punkte.
1. Versionsgrenze und Stichtag getrennt prüfen
Meta dokumentiert sowohl versionsgebundene als auch versionsübergreifende Änderungen. Letztere gehören zum beschriebenen Veröffentlichungsverfahren. Die Behauptung eines erstmals gebrochenen Versionsvertrags wäre deshalb irreführend. Außerdem besitzen Marketing API und Graph API unterschiedliche Ablösepläne. Das Enddatum der Graph API v25.0 ist kein Beleg für das Enddatum der Marketing API v25.0.
Stand 24. Oktober 2026 hatte die Marketing API v24.0 das angegebene Enddatum 6. Oktober 2026 bereits erreicht. Eine nicht mehr unterstützte Version eignet sich nicht als Ausweichlösung. Zur Bestandsaufnahme gehören die aktuelle Versionstabelle und die Hinweise zu jeder betroffenen Änderung.
2. Sechs Änderungen mit konkretem Geltungsbereich
- Auslieferungsschätzungen:
daily_outcomes_curve,budget_guardrailundestimate_dauentfallen in den Antworten der Delivery-Estimate-Endpunkte ab v26.0 und ab 27. Oktober in den übrigen unterstützten Versionen. Meta nennt keinen Ersatz. Betroffen sind Abfragen auf Konto- und Ad-Set-Ebene sowie darauf aufbauende Berechnungen. - Web-+-App-Kampagnen: Ein Creative mit
applink_treatment=web_onlylässt sich nicht mehr an eine Anzeige in einer Kampagne mit den Conversion-Orten Website und App hängen. Website-Ziele sind damit nicht allgemein verboten. Als Alternative nennt Meta automatische Weiterleitung oder eine kompatible manuelle Konfiguration. Geltung: v26.0, anschließend alle unterstützten Marketing-API-Versionen ab 27. Oktober. - Umfrageanzeigen:
poll_specund Umfragekomponenten unterinteractive_components_specsind beim Erstellen oder Ändern von Anzeigen und Creatives betroffen. Änderungen ohne Anpassung des Creatives können weiterhin möglich sein. Geltung: v26.0, anschließend die übrigen unterstützten Versionen ab 27. Oktober. - Messenger Stories:
storywird ohne Fehlermeldung ausmessenger_positionsentfernt. Historische Targeting-Daten können den Wert weiterhin enthalten. Manuelle Platzierungen benötigen eine Anpassung; für Advantage+ Placements ist wegen dieser Entfernung keine Aktion erforderlich. Geltung: v26.0, ab 27. Oktober alle unterstützten Marketing-API-Versionen einschließlich Aufrufen ohne Versionsangabe. - Instagram Explore Feed: Die ausdrückliche Anforderung dieser Platzierung führt ab v26.0 zu einem Fehler. Dafür nennt der Hinweis keinen gleichzeitigen versionsübergreifenden Stichtag am 27. Oktober. Die tatsächlich gesendeten Platzierungswerte gehören gegen die passende Dokumentation geprüft; ein Anzeigename allein liefert keinen sicheren API-Wert.
- Advantage+ Audience: Beim Erstellen bestimmter nicht breit ausgerichteter Ad Sets der Kategorien Housing, Employment oder Financial Products and Services mit aufweichbarem Targeting muss
targeting_automation.advantage_audienceausdrücklich 1 oder 0 enthalten. Breite beziehungsweise Standardkonfigurationen sind nicht pauschal betroffen. Die Regel beginnt mit v26.0. Die Ausweitung auf alle Versionen folgt dem Ende der Marketing API v25.0; dieses Datum war zum Prüfzeitpunkt noch offen.
Eine erfolgreiche HTTP-Antwort belegt nicht, dass die angeforderte Verteilung der Platzierungen erhalten geblieben ist. Neben Fehlerquoten gehören deshalb Konfiguration und wirksame Platzierungen in die Prüfung. Das Ausmaß möglicher Leistungseffekte hängt vom Konto ab und lässt sich nicht aus dem Changelog ableiten.

3. Ein lokales Skript für Prüfhinweise
Das folgende Python-Skript durchsucht exportierte JSON-Objekte und Arrays rekursiv. Erfasst werden ausdrückliche Verweise auf entfernte Felder, Messenger Stories, Instagram-Platzierungen, Web-only-Weiterleitung und möglicherweise betroffene Creative-Strukturen. Ein Treffer ist ein Prüfhinweis, kein Nachweis eines fehlgeschlagenen API-Aufrufs. Eine interaktive Komponente muss beispielsweise keine Umfrage sein; bei einem Web-only-Creative fehlt ohne Kampagnendaten der notwendige Kontext.
Das Skript leitet Regeln für besondere Anzeigenkategorien nicht aus einem erfundenen Feld vertical ab. Kampagnenkategorie, breite oder eingeschränkte Ausrichtung, aufweichbares Targeting, API-Version und Operation gehören in die gesonderte fachliche Prüfung. In Zeichenketten eingebettetes JSON muss vorab decodiert werden. Erfasst werden ausschließlich Dateien direkt im ausgewählten Verzeichnis.
#!/usr/bin/env python3
"""Local review hints only; no API calls and no automatic fixes."""
import json
import pathlib
import re
import sys
REMOVED = {"daily_outcomes_curve", "budget_guardrail", "estimate_dau"}
def scan(node, path="$", found=None):
found = [] if found is None else found
if isinstance(node, dict):
for key, value in node.items():
here = f"{path}.{key}"
if key in REMOVED:
found.append((here, "REMOVED_FIELD_REFERENCE", key))
if key == "fields":
# Flat field lists only; nested Graph field syntax needs review.
fields = value.split(",") if isinstance(value, str) else value
if isinstance(fields, list):
for field in fields:
if isinstance(field, str):
for token in re.findall(r"[A-Za-z_][A-Za-z_0-9]*", field):
if token in REMOVED:
found.append((here, "REMOVED_FIELD_REQUEST", token))
else:
found.append((here, "INVALID_FIELDS_SHAPE", "review"))
if key == "messenger_positions":
if not isinstance(value, list):
found.append((here, "INVALID_PLACEMENT_SHAPE", "review"))
elif "story" in value:
found.append((here, "MESSENGER_STORY", "review manual placement"))
if key == "instagram_positions":
found.append((here, "INSTAGRAM_PLACEMENT_REVIEW", "check Explore Feed mapping"))
if key == "applink_treatment" and value == "web_only":
found.append((here, "WEB_APP_CONTEXT_REVIEW", "check campaign conversion locations"))
if key in {"poll_spec", "interactive_components_spec"}:
found.append((here, "CREATIVE_REVIEW", "check poll use and operation"))
scan(value, here, found)
elif isinstance(node, list):
for index, value in enumerate(node):
scan(value, f"{path}[{index}]", found)
return found
def main(directory):
files = sorted(pathlib.Path(directory).glob("*.json"))
if not files:
print("INPUT_ERROR: no JSON files", file=sys.stderr)
return 2
findings, errors = 0, 0
for file in files:
try:
node = json.loads(file.read_text(encoding="utf-8"))
if not isinstance(node, (dict, list)):
raise ValueError("expected JSON object or array")
except (OSError, ValueError) as exc:
print(json.dumps({"file": file.name, "error": type(exc).__name__}))
errors += 1
continue
for path, kind, detail in scan(node):
print(json.dumps({"file": file.name, "path": path, "kind": kind, "detail": detail}))
findings += 1
print(json.dumps({"files": len(files), "review_hints": findings, "input_errors": errors}))
return 2 if errors else (1 if findings else 0)
if __name__ == "__main__":
if len(sys.argv) != 2:
raise SystemExit("usage: audit_v26.py DIRECTORY")
raise SystemExit(main(sys.argv[1]))Aufruf: python3 audit_v26.py /srv/adops/adset_configs. Exit-Code 1 bedeutet Prüfhinweise, 2 einen Eingabefehler. Exit-Code 0 bedeutet lediglich, dass diese Prüfungen keine Treffer liefern. Ein leeres Verzeichnis gilt als Fehler. Der Deployment-Job muss den Exit-Code erhalten; ein erfolgreiches angehängtes || echo würde den Fehlerstatus verdecken. Dateipfade und Konfigurationsausschnitte können interne Strukturen offenlegen, deshalb gehören die Ausgaben in zugriffsbeschränkte Protokolle.
4. Bestand vervollständigen und Änderungen verifizieren
- API-Version, Endpunkt, Operation und Zuständigkeit je Integration erfassen. Gespeicherte Vorlagen, Reporting-Abnehmer und direkt in der Oberfläche angelegte Anzeigen berücksichtigen.
- Eine nur lesende Kontobestandsaufnahme verbindet Anzeigen, Creatives, Ad Sets und Kampagnen. Ein lokaler Export erfasst spätere Änderungen in der Oberfläche nicht automatisch.
- Jeden Fund anhand des oben genannten Geltungsbereichs bewerten. Veraltete manuelle Platzierungen entfernen, betroffene Web-+-App-Weiterleitung ersetzen und vor einer Flag-Änderung den genauen Audience-Fall prüfen.
- Entfernte Delivery-Felder durch Transformationen und Dashboards verfolgen. Eine weiterhin vorhandene nullable Spalte kann den Verlust einer Kennzahl verdecken; fehlende Werte sind keine Nullen.
- Freigegebene Änderungen in einer kontrollierten Testumgebung validieren und rund um den Stichtag Antworten sowie wirksame Konfiguration vergleichen. Das Anlegen oder Ausliefern von Testanzeigen kann Kosten verursachen; das lokale Skript selbst ruft keine API auf.
Der vollständige v26.0-Changelog enthält zusätzlich Änderungen am älteren Protokollverhalten, an Pages und Commerce sowie weitere Marketing-API-Funktionen. Sechs Prüfungen reichen deshalb nicht für eine Gesamtfreigabe.
5. Geografische Zuordnungen gesondert prüfen
Der Wechsel von DMA zu Comscore ist vom Oktober-Stichtag getrennt. Supermetrics dokumentiert für den eigenen Facebook-Ads-Konnektor: Die bisherige DMA-Dimension liefert ab 22. Juni 2026 keine Ergebnisse mehr und wird durch Comscore market ersetzt. Das belegt die Änderung dieses Konnektors, aber weder einen Datenverlust in jedem Warehouse noch identisches Verhalten sämtlicher Meta-Endpunkte.
Die folgende Diagnose sucht Faktenzeilen ohne nutzbare Zuordnung in einer beispielhaften alten Dimension. NOT EXISTS verhindert, dass doppelte Dimensionszeilen die Impressionen vervielfachen. Ein fehlender geografischer Name bleibt ebenfalls ohne Zuordnung. Tabellen- und Spaltennamen sind Beispiele; die Abfrage misst Zuordnungslücken und beweist keine bestimmte Migrationsursache.
SELECT f.report_date, f.geo_name, SUM(f.impressions) AS impressions
FROM meta_geo_daily AS f
WHERE f.report_date >= '2026-06-01'
AND NOT EXISTS (
SELECT 1 FROM dim_dma AS d
WHERE d.dma_name = f.geo_name
AND d.dma_code IS NOT NULL
)
GROUP BY f.report_date, f.geo_name
ORDER BY impressions DESC
LIMIT 25;Entscheidend ist auch der Anteil nicht zugeordneter Impressionen am Gesamtbestand, nicht nur die Liste der 25 größten Treffer. Produktive Zuordnungen benötigen dokumentierte Gebietskennungen, das geografische Bezugssystem und Gültigkeitszeiträume statt ausschließlich Anzeigenamen. Rückwirkende Aufbereitung hängt von gespeicherten Rohdaten und verfügbaren Zuordnungen ab. Überleitungstabellen können definierte Vergleiche unterstützen; abweichende Gebietsgrenzen benötigen dabei ausdrückliche Einschränkungen.
Fragen und Antworten
Belegt ein fehlerfreier Skriptlauf die Umstellungsreife?
Nein. Fehlende Exporte, Kampagnenkontext, nicht unterstützte Versionen, JSON innerhalb von Zeichenketten und Änderungen außerhalb dieser Prüfungen bleiben offen. Erforderlich sind zusätzlich eine nur lesende Kontobestandsaufnahme, eine dokumentierte fachliche Entscheidung je kontextabhängigem Fund und kontrollierte Verifikation.
Vermeidet eine feste v25.0 den Oktober-Stichtag?
Nicht bei den vier Änderungen mit ausdrücklicher versionsübergreifender Frist: Delivery-Felder, betroffene Web-+-App-Weiterleitung, Umfrageanzeigen und Messenger Stories. Für Explore Feed und die besondere Advantage+-Audience-Pflicht gelten andere Versionsregeln.