LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Przegląd bloga /Digital Marketing / Meta Marketing API v26.0: zmiany z 27.10.2026...
Ten artykuł w innych językach:

Meta Marketing API v26.0: zmiany z 27.10.2026 i skrypt audytu istniejących integracji

Meta Marketing API v26.0: zmiany z 27.10.2026 i skrypt audytu istniejących integracji
Spis treści
  1. 1. Zakres wersji i termin wymagają osobnej kontroli
  2. 2. Sześć zmian i rzeczywisty zakres zastosowania
  3. 3. Lokalny skrypt wskazujący miejsca do sprawdzenia
  4. 4. Uzupełnienie inwentaryzacji i weryfikacja
  5. 5. Osobna kontrola wymiaru geograficznego
  6. Pytania i odpowiedzi
  7. Źródła

Meta udostępniła Graph API i Marketing API v26.0 29 lipca 2026 r. Kilka zmian obejmie również starsze wspierane wersje Marketing API od 27 października 2026 r. Oprócz przypiętej wersji znaczenie ma więc termin wejścia w życie każdej zmiany. Artykuł omawia sześć zmian istotnych dla automatyzacji reklam; pełny opis wydania zawiera także inne pozycje.

1. Zakres wersji i termin wymagają osobnej kontroli

Meta dokumentuje zarówno zmiany związane z konkretną wersją, jak i zmiany obejmujące wiele wersji. Drugi przypadek należy do opisanego procesu publikacji, dlatego twierdzenie o pierwszym złamaniu gwarancji wersjonowania byłoby mylące. Marketing API i Graph API mają również różne harmonogramy wycofywania. Data końca Graph API v25.0 nie wyznacza końca Marketing API v25.0.

Według stanu z 24 października 2026 r. Marketing API v24.0 przekroczyła już podaną datę końca wsparcia: 6 października 2026 r. Pozostanie przy niewspieranej wersji nie stanowi rozwiązania migracyjnego. Inwentaryzacja powinna obejmować aktualną tabelę wersji oraz komunikaty dotyczące poszczególnych zmian.

2. Sześć zmian i rzeczywisty zakres zastosowania

  • Szacunki emisji: daily_outcomes_curve, budget_guardrail i estimate_dau znikają z odpowiedzi endpointów delivery estimate w v26.0, a od 27 października także w pozostałych wspieranych wersjach. Meta nie wskazuje zamiennika. Kontroli wymagają odczyty na poziomie konta i zestawu reklam oraz obliczenia korzystające z tych danych.
  • Kampanie Web + App: kreacji z applink_treatment=web_only nie można już przypisać do reklamy w kampanii korzystającej z miejsc konwersji Website i App. Nie oznacza to ogólnego zakazu kierowania na witryny. Dokumentacja wskazuje automatyczne kierowanie lub zgodną konfigurację ręczną. Zakres: v26.0, następnie wszystkie wspierane wersje Marketing API od 27 października.
  • Reklamy z ankietami: zmiana obejmuje poll_spec oraz komponenty ankiet pod interactive_components_spec przy tworzeniu lub zmienianiu reklam i kreacji. Aktualizacje pozostawiające kreację bez zmian mogą nadal działać. Zakres: v26.0, następnie pozostałe wspierane wersje od 27 października.
  • Messenger Stories: wartość story zostaje usunięta z messenger_positions bez błędu. Historyczne dane targetowania mogą nadal zawierać tę wartość. Ręczne umiejscowienia wymagają korekty; Advantage+ Placements nie wymagają działania z powodu tego usunięcia. Zakres: v26.0, od 27 października wszystkie wspierane wersje Marketing API, także wywołania bez numeru wersji.
  • Instagram Explore Feed: jawne żądanie tego umiejscowienia powoduje błąd od v26.0. Komunikat nie przypisuje tej zmianie wspólnego terminu 27 października dla wszystkich wersji. Faktycznie wysyłane wartości wymagają sprawdzenia w dokumentacji umiejscowień; sama etykieta widoczna w interfejsie nie określa bezpiecznie wartości API.
  • Advantage+ audience: tworzenie określonych zestawów reklam Housing, Employment lub Financial Products and Services z targetowaniem innym niż szerokie i dopuszczającym rozszerzenie wymaga jawnej wartości 1 albo 0 w targeting_automation.advantage_audience. Konfiguracje szerokie i domyślne nie są objęte ogólnym obowiązkiem. Reguła zaczyna obowiązywać w v26.0; rozszerzenie na wszystkie wersje nastąpi po wycofaniu Marketing API v25.0, bez ustalonej daty na dzień kontroli.

Poprawna odpowiedź HTTP nie dowodzi zachowania żądanego zestawu umiejscowień. Oprócz błędów kontrola powinna obejmować konfigurację i faktycznie używane umiejscowienia. Wielkość ewentualnego wpływu na wyniki zależy od konta i nie wynika z samego changeloga.

Sześć zmian Meta API z zakresem wersji, terminami i kontrolami
Cztery z sześciu zmian mają wspólny termin dla wielu wersji: 27 października 2026 r. Explore Feed i szczególny obowiązek audience podlegają innym regułom. H/E oznacza Housing i Employment, a kategoria finansowa to Financial Products and Services.

3. Lokalny skrypt wskazujący miejsca do sprawdzenia

Poniższy skrypt Python rekurencyjnie przegląda wyeksportowane obiekty i tablice JSON. Wyszukuje jawne odwołania do usuniętych pól, Messenger Stories, umiejscowień Instagram, kierowania web-only oraz potencjalnie istotnych struktur kreacji. Trafienie jest wskazówką do kontroli, a nie dowodem przyszłego błędu API. Komponent interaktywny nie musi być ankietą, a kreacja web-only wymaga kontekstu kampanii.

Skrypt nie wyprowadza reguł szczególnych kategorii reklam z wymyślonego pola vertical. Kategoria kampanii, szerokie lub ograniczone targetowanie, możliwość rozszerzenia, wersja API i operacja wymagają oddzielnej oceny. JSON zapisany wewnątrz ciągu znaków wymaga wcześniejszego zdekodowania. Kontrola obejmuje wyłącznie pliki bezpośrednio w wybranym katalogu.

Python
#!/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]))

Uruchomienie: python3 audit_v26.py /srv/adops/adset_configs. Kod wyjścia 1 oznacza wskazówki do kontroli, 2 błąd wejścia, a 0 tylko brak trafień w zakresie tych reguł. Pusty katalog jest błędem. Zadanie wdrożeniowe musi zachować kod wyjścia; dopisanie poprawnie zakończonego || echo ukryłoby błąd. Ścieżki i fragmenty konfiguracji mogą ujawniać strukturę wewnętrzną, dlatego wyniki wymagają logów z ograniczonym dostępem.

4. Uzupełnienie inwentaryzacji i weryfikacja

  1. Ustalić wersję API, endpoint, operację i odpowiedzialny zespół dla każdej integracji. Uwzględnić szablony, odbiorców danych raportowych i reklamy utworzone bezpośrednio w interfejsie.
  2. Wykonać inwentaryzację konta wyłącznie do odczytu, łącząc reklamy, kreacje, zestawy reklam i kampanie. Lokalny eksport nie obejmuje automatycznie późniejszych zmian w interfejsie.
  3. Ocenić każde trafienie zgodnie z zakresem opisanym powyżej. Usunąć przestarzałe ręczne umiejscowienia, zastąpić objęte zmianą kierowanie Web + App i sprawdzić konkretny przypadek audience przed zmianą flagi.
  4. Prześledzić usunięte pola delivery estimate w transformacjach i pulpitach. Nadal istniejąca kolumna dopuszczająca null może ukryć utratę metryki; brak wartości nie oznacza zera.
  5. Sprawdzić zatwierdzone zmiany w kontrolowanym środowisku testowym oraz porównać odpowiedzi i faktyczną konfigurację wokół terminu. Tworzenie lub emisja reklam testowych może powodować koszty; lokalny skrypt nie wywołuje API.

Pełny changelog v26.0 obejmuje również starsze mechanizmy protokołu, Pages, Commerce i dodatkowe funkcje Marketing API. Sześć kontroli nie wystarcza do potwierdzenia gotowości całej integracji.

5. Osobna kontrola wymiaru geograficznego

Przejście z DMA na Comscore jest niezależne od październikowego terminu. Supermetrics dokumentuje zmianę własnego konektora Facebook Ads: dotychczasowy wymiar DMA przestaje zwracać wyniki od 22 czerwca 2026 r. i zostaje zastąpiony przez Comscore market. Jest to dowód dotyczący tego konektora, a nie dowód utraty wierszy w każdej hurtowni lub identycznej zmiany we wszystkich endpointach Meta.

Poniższa diagnostyka wyszukuje wiersze faktów bez użytecznego dopasowania w przykładowym starym wymiarze. NOT EXISTS zapobiega mnożeniu wyświetleń przez duplikaty w wymiarze. Brak nazwy geograficznej również pozostaje niedopasowany. Nazwy tabel i kolumn są przykładowe; zapytanie mierzy luki mapowania, a nie przyczynę migracji platformy.

SQL
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;

Oprócz 25 największych trafień znaczenie ma udział niedopasowanych wyświetleń w całości. Mapowanie produkcyjne wymaga udokumentowanych identyfikatorów obszarów, systemu geograficznego i okresów obowiązywania zamiast samych nazw. Ponowne przetworzenie historii zależy od zachowanych danych źródłowych i dostępnych mapowań. Tabele przejścia mogą wspierać zdefiniowane porównania, lecz różne granice obszarów wymagają jawnego zaznaczenia ograniczeń.

Pytania i odpowiedzi

Czy poprawny wynik skryptu potwierdza gotowość?

Nie. Brakujące eksporty, kontekst kampanii, niewspierane wersje, JSON wewnątrz ciągów znaków oraz zmiany poza zakresem kontroli pozostają otwarte. Nadal potrzebna jest inwentaryzacja konta wyłącznie do odczytu, udokumentowana ocena każdego trafienia zależnego od kontekstu i kontrolowana weryfikacja.

Czy przypięcie do v25.0 omija październikowy termin?

Nie dla czterech zmian z jawnym terminem obejmującym wiele wersji: pól delivery estimate, objętego zmianą kierowania Web + App, reklam z ankietami i Messenger Stories. Explore Feed oraz szczególny obowiązek Advantage+ audience mają inne reguły wersjonowania.

Lukas Wójcik

Lukas Wójcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Kontakt

Masz pytanie lub pomysł na projekt internetowy? Napisz krótko, o co chodzi. Formularz korzysta z reCAPTCHA do ochrony przed spamem.

Napisanie komentarza

Doświadczenia z praktyki i pytania o wdrożenie są tu mile widziane.

Adres e-mail nie jest publikowany. Pola obowiązkowe oznaczono gwiazdką.