Jak skonfigurować konto reklamowe ChatGPT Ads przez API — przewodnik dla agenta AI?
Przez Advertiser API postawisz całą konfigurację: piksel, klucz Conversions API, definicje zdarzeń, kampanię, grupę i reklamę — jedenaście kroków pod adresem api.ads.openai.com. Poza API zostają wydanie pierwszego klucza, płatności i przeglądy (dokumentacja OpenAI Ads, odczyt 12 września 2026).
Co realnie powstaje przez API?
Advertiser API OpenAI przyjmuje żądania pod adresem https://api.ads.openai.com/v1 z nagłówkiem Authorization: Bearer. Jeden klucz obsługuje dokładnie jedno konto reklamowe — tak opisuje to dokumentacja uwierzytelniania, odczyt 12 września 2026.
Hierarchia jest trzypoziomowa. Konto zawiera kampanie, kampania grupy reklam, grupa reklamy. Budżet, cel, harmonogram i targeting siedzą na kampanii; stawka i podpowiedzi kontekstowe na grupie; tytuł, treść, obraz i adres docelowy na reklamie.
Agent z dostępem do powłoki wykona żądaniami cały łańcuch: sprawdzenie konta, utworzenie piksela, wydanie klucza Conversions API, definicje zdarzeń, wysyłkę zdarzeń z serwera, kampanię, grupę, przesłanie obrazu, reklamę, podgląd, aktywację i odczyt wyników.
W aplikacjach, które budujemy, zdarzenia konwersji wysyła serwer, nie przeglądarka — dokumentacja nazywa ten kanał bardziej wiarygodnym źródłem pomiaru niż sam piksel. Co w ogóle wysyłać, opisuje tekst o zdarzeniach zamiast odsłon.
Taksonomia jest zamknięta: dokumentacja wymienia trzynaście nazw zdarzeń, w tym page_viewed, lead_created, order_created oraz custom z własną nazwą. Każda ma przypisany kształt danych — contents, customer_action albo plan_enrollment.
Jak skonfigurować konto krok po kroku?
Kolejności nie da się przestawić. Piksel musi istnieć przed definicją zdarzenia, a definicja przed kampanią optymalizowaną na konwersje. Każdy krok kończy się odpowiedzią z identyfikatorem, który wchodzi do następnego wywołania.
Sprawdź konto i klucz. Odpowiedź zawiera walutę, strefę czasową, status i przeglądy. Konto ze statusem active może mieć niezamknięty przegląd — dokumentacja ostrzega przed tym wprost.
curl -G "https://api.ads.openai.com/v1/ad_account" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>"
Utwórz piksel. Pola: name od 3 do 1 000 znaków i client_type o wartości web. W odpowiedzi wraca id źródła oraz pixel_id. Kod 404 z treścią Not found znaczy, że konto nie ma włączonego zarządzania pikselami.
curl -X POST "https://api.ads.openai.com/v1/conversions/pixels" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>" -H "Content-Type: application/json" -d '{"name":"Strona firmowa","client_type":"web"}'
Wydaj klucz Conversions API. To inny klucz niż ten do Advertiser API. Wraca w odpowiedzi na to żądanie; endpointu, który odczytałby go później, dokumentacja na 12 września 2026 nie opisuje. Zapisz go od razu w menedżerze sekretów po stronie serwera — nigdy w kodzie przeglądarki, w zmiennych klienta ani w logach.
curl -X POST "https://api.ads.openai.com/v1/conversions/api_keys" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>" -H "Content-Type: application/json" -d '{"name":"Zdarzenia z serwera"}'
Zdefiniuj zdarzenie. Wymagane są name, event_type, attribution_window_days oraz source_ids z dokładnie jednym źródłem. Odpowiedź Client data source not found znaczy, że identyfikator źródła nie należy do tego konta.
curl -X POST "https://api.ads.openai.com/v1/conversions/event_settings" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>" -H "Content-Type: application/json" -d '{"name":"Zapytania","event_type":"lead_created","attribution_window_days":30,"source_ids":["<ID-ZRODLA>"]}'
Wyślij zdarzenia z serwera. Inny host i inny klucz. E-mail, telefon, external_id oraz imię i nazwisko idą jako SHA-256 po normalizacji: e-mail przycięty i zamieniony na małe litery, telefon bez znaku plus, spacji i zer wiodących. Identyfikator reklamowy Androida (android_advertising_id) i obref z ciasteczka piksela wysyłasz jawnie, bez hashowania.
curl -X POST "https://bzr.openai.com/v1/events?pid=<PIXEL-ID>" -H "Authorization: Bearer <KLUCZ-CAPI>" -H "Content-Type: application/json" -d '{"validate_only":true,"events":[{"id":"zam-1","type":"order_created","timestamp_ms":1773892800000,"source_url":"https://example.com/potwierdzenie","action_source":"web","data":{"type":"contents","amount":12999,"currency":"PLN"}}]}'
Trzymaj validate_only na true, dopóki odpowiedź nie będzie czysta. Kwota amount to liczba całkowita w jednostce podrzędnej waluty, czyli w groszach albo centach.
Znajdź identyfikator lokalizacji. Wyszukiwarka zwraca id, canonical_name, country_code i typ. Publiczny katalog lokalizacji w formacie CSV odpowiadał 12 września 2026 stroną weryfikacji przeglądarki, więc identyfikator bierz z tego endpointu.
curl -G "https://api.ads.openai.com/v1/geo_lookup/search" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>" --data-urlencode "q=Poland" --data-urlencode "limit=5"
Utwórz kampanię jako wstrzymaną. Podajesz dokładnie jeden budżet: dzienny albo życiowy. Pola czasu to uniksowe sekundy. Nagłówek Idempotency-Key chroni przed powieleniem obiektu przy ponowieniu zerwanego żądania.
curl -X POST "https://api.ads.openai.com/v1/campaigns" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>" -H "Idempotency-Key: kampania-001" -H "Content-Type: application/json" -d '{"name":"Test 1","status":"paused","bidding_type":"clicks","budget":{"daily_spend_limit_micros":50000000},"targeting":{"locations":{"include":[{"id":"<ID-LOKALIZACJI>"}]}}}'
Dodaj grupę reklam. Obiekt bidding_config jest obowiązkowy, nawet gdy kampania ma już cel. Dla stawki stałej podajesz strategy fixed_bid i max_bid_micros; dla strategii Maximize Results stawkę pomijasz, a kampania musi mieć budżet dzienny.
curl -X POST "https://api.ads.openai.com/v1/ad_groups" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>" -H "Content-Type: application/json" -d '{"campaign_id":"<CAMPAIGN-ID>","name":"Grupa 1","status":"paused","context_hints":["pomysł na aplikację"],"bidding_config":{"billing_event_type":"click","strategy":"fixed_bid","max_bid_micros":2000000}}'
Prześlij obraz, potem utwórz reklamę. Endpoint przesyłania przyjmuje adres obrazu w JSON albo plik binarny; dokumentacja żąda co najmniej 640 na 640 pikseli. Tytuł kreacji ma od 3 do 50 znaków, treść maksymalnie 100.
curl -X POST "https://api.ads.openai.com/v1/upload" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>" -H "Content-Type: application/json" -d '{"image_url":"https://example.com/karta.png"}'
curl -X POST "https://api.ads.openai.com/v1/ads" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>" -H "Content-Type: application/json" -d '{"ad_group_id":"<AD-GROUP-ID>","name":"Karta 1","status":"paused","creative":{"type":"chat_card","title":"Tytul do 50 znakow","body":"Tresc do 100 znakow","target_url":"https://example.com/","file_id":"<FILE-ID>"}}'
Obejrzyj podgląd, potem włącz. Podgląd wygasa po 24 godzinach i pokazuje wygląd, nie prawo do emisji. Aktywuj od dołu: najpierw reklama, potem grupa, na końcu kampania.
curl -X POST "https://api.ads.openai.com/v1/ads/<AD-ID>/preview" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>"
curl -X POST "https://api.ads.openai.com/v1/campaigns/<CAMPAIGN-ID>/activate" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>"
Odczytaj wyniki. Cztery endpointy insights zwracają tę samą kopertę listy — first_id, last_id i has_more; kolejną stronę bierzesz, podając last_id jako after. Konwersje przypisane do kampanii czyta się osobnym żądaniem POST na /conversions/insights.
curl -G "https://api.ads.openai.com/v1/campaigns/<CAMPAIGN-ID>/insights" -H "Authorization: Bearer <TWÓJ-KLUCZ-API>" --data-urlencode "time_granularity=daily" --data-urlencode "limit=7"
Pola, które decydują, czy kampania ruszy
| Pole | Typ | Wymagane | Znaczenie | Źródło (odczyt 12.09.2026) |
|---|---|---|---|---|
| budget.lifetime_spend_limit_micros | liczba całkowita | jeden z dwóch budżetów | Budżet życiowy, minimum 1 000 000 micros; nie da się go obniżyć poniżej kwoty już wydanej | Campaigns; Bidding & Budgets |
| budget.daily_spend_limit_micros | liczba całkowita | jeden z dwóch budżetów | Budżet dzienny, wymagany przez strategie Maximize Results; minimum zależy od waluty konta i nie jest podane — odpowiedź z błędem podaje wymaganą kwotę | Bidding & Budgets |
| bidding_type | tekst | nie, domyślnie impressions | impressions, clicks albo conversions — cel kampanii wybierany przy tworzeniu | Campaigns |
| conversion_event_setting_ids | lista tekstów | przy celu conversions | Dokładnie jedno aktywne standardowe ustawienie zdarzenia z tego konta | Conversion-Optimized Campaigns |
| start_time, end_time | liczba całkowita | nie | Uniksowe sekundy z zakresu 946684800–4102444800; brak start_time oznacza emisję od razu | Campaigns |
| targeting.platforms.included | lista tekstów | nie | android_app, android_web, desktop_web, ios_app, ios_web, web; pusty obiekt i pusta lista zwracają 400 | Platform Targeting |
| bidding_config.billing_event_type | tekst | tak, w grupie reklam | impression dla celu na wyświetlenia, click dla kliknięć i konwersji | Ad Groups |
| bidding_config.max_bid_micros | liczba całkowita | przy strategii fixed_bid | Stawka za zdarzenie w micros; w kampanii konwersyjnej to stawka CPA, mimo rozliczenia za kliknięcie | Ad Groups; Conversion-Optimized Campaigns |
Pułapki, których nie ma w dokumentacji
Pięć rzeczy zmierzyliśmy na żywym koncie 1 września 2026, stawiając kampanię wyłącznie żądaniami HTTP. Żadnej z nich nie znaleźliśmy wtedy w dokumentacji producenta.
- Czas jako tekst ISO kończy się kodem 400 i błędem invalid_type. Pola start_time oraz end_time przyjmują wyłącznie uniksowe sekundy jako liczbę całkowitą.
- Cel conversions odrzuca zdarzenie własne. Ustawienie typu custom dostaje 400 z komunikatem o wymaganym standardowym ustawieniu zdarzenia konwersji.
- Grupa reklam bez bidding_config nie powstanie. Wraca 400 missing_required_parameter, mimo że cel i budżet siedzą piętro wyżej, na kampanii.
- Parametr fields w insights nie przyjmuje nazw płaskich. Trzeba nazw z przedrostkiem poziomu, jak campaign.budget.daily albo ad_group.clicks; płaska nazwa dostaje 400 z listą dozwolonych wartości.
- Seria trzech żądań tworzących reklamy przekracza pięciosekundowy limit czasu klienta. Zerwane połączenie nie znaczy, że nic nie powstało: najpierw pobierz listę reklam, dopiero potem rozważ ponowienie.
Szóstą rzecz sprawdź odczytem. Polskie znaki w podpowiedziach kontekstowych potrafi przekłamać konsola, z której leci żądanie — po zapisie pobierz grupę i porównaj wartości znak po znaku.
Gdzie przebiega granica API?
Granic jest kilkanaście i każda ma inny skutek. Jedna zatrzymuje żądanie, druga zatrzymuje emisję, trzecia każe założyć kampanię od nowa.
| Obszar | Do jakiego progu | Co po progu | Źródło (odczyt 12.09.2026) |
|---|---|---|---|
| Paczka zdarzeń | 1 000 zdarzeń w żądaniu; jedno błędne przewraca całą paczkę | mniejsze paczki i sprawdzanie w trybie validate_only | Conversions API |
| Wiek zdarzenia | 7 dni wstecz, maksymalnie 10 minut w przyszłość | starsze zdarzenie odpada — wysyłka na bieżąco, nie nocnym wsadem | Conversions API |
| Zapytania do API | 600 na minutę na endpoint, 1 200 łącznie, per konto i per adres IP | kolejka po stronie serwera, ponowienia z rosnącym odstępem | Overview, rate limits |
| Operacje masowe | 1 000 operacji na zadanie, 10 żądań na 10 sekund, ciało do 16 MiB | Bulk API jest w ograniczonej wersji zapoznawczej i włączane per konto | Bulk API, limits and retries |
| Liczba obiektów | 5 000 niearchiwalnych kampanii i grup, 5 000 aktywnych lub wstrzymanych reklam | porządki w koncie; archiwizacja jest nieodwracalna | Bulk API, limits and retries |
| Zmiana celu i typu budżetu | bidding_type oraz wybrane zdarzenie konwersji są nieodwracalne; z budżetu życiowego na dzienny przejdziesz, z powrotem nie | nowa kampania | Campaigns; Bidding & Budgets |
| Optymalizacja na konwersje | dokładnie jedno aktywne standardowe ustawienie zdarzenia, wpięte w jedno aktywne źródło | zdarzenie custom nie może być celem; kod 403 znaczy, że konto nie ma tej funkcji | Conversion-Optimized Campaigns |
| Targeting w EOG i Szwajcarii | listy własnych odbiorców niedostępne — dokumentacja pisze wprost, że nie ma tam reklam personalizowanych | zostaje kraj, region, Market, platforma i podpowiedzi kontekstowe | Custom Audiences |
| Wiek i płeć odbiorcy | dokumentacja nie opisuje takiego pola targetowania | dobór tematów rozmowy zamiast filtra demograficznego | Campaign Targeting; Platform Targeting |
| Kreacja | tytuł od 3 do 50 znaków, treść do 100, obraz od 640 na 640 pikseli | krótsza kopia albo inny plik; edycja kreacji uruchamia nowy przegląd | Ads; Overview |
| Podgląd zdarzeń testowych | do 50 zdarzeń z ostatnich około 15 minut, wyłącznie do testów | insights do raportowania i atrybucji | Conversion Setup; Troubleshooting |
| Plany ChatGPT z reklamami | dokumentacja deweloperska nie wymienia planów | sprawdź w centrum pomocy OpenAI albo w panelu | brak w pobranych stronach dokumentacji |
Kiedy API nie wystarczy i zostajesz w panelu?
Pierwszy klucz wydaje się wyłącznie w ustawieniach Ads Managera — dokumentacja nie opisuje endpointu, który by go tworzył. Bez tego kroku agent nie ma czym się uwierzytelnić, więc start zawsze jest ręczny.
Piksel i klucz Conversions API powstają żądaniem, ale tylko na koncie, które ma tę funkcję włączoną. Kod 404 z treścią Not found znaczy, że zostaje zakładka konwersji w panelu albo rozmowa z opiekunem po stronie OpenAI.
Płatności ani faktur nie znaleźliśmy w dokumentacji Ads API na dzień 12 września 2026. Są za to limity wydatku konta: okna z datami oraz limit dzienny dla kont rozliczanych fakturą po okresie.
Waluta i strefa czasowa to wybory z chwili zakładania konta i aktualizacja marki ich nie zmienia. Decyzja zapada więc przed pierwszym żądaniem, a poprawka oznacza inne konto.
Przeglądy są osobną warstwą. Reklama ze statusem active i polem review_status w stanie in_review jest włączona, ale nie emituje. API pokazuje stan i powód odmowy — nie przyspiesza decyzji.
Kreacji graficznej API nie wymyśli: przyjmuje gotowy plik albo adres obrazu.
Konwersje policzone po samym wyświetleniu, bez kliknięcia, raportuje panel osobno na poziomie kampanii — do głównej liczby konwersji nie wchodzą.
Który kanał w ogóle ma sens dla konkretnej branży, rozstrzygamy gdzie indziej — kanały i liczby zebrano w tekście o pierwszych 50 klientach branżowych. Podział pracy między agentem a człowiekiem opisuje tekst o rolach i bramkach w zespole z agentami AI.
Najczęstsze pytania
Czy przez API da się założyć samo konto reklamowe?
Nie. Dokumentacja mówi wprost, że potrzebujesz konta w Ads Managerze i klucza wydanego na stronie ustawień; endpointu zakładającego konto w niej nie ma (odczyt 12.09.2026). Każdy klucz jest przypisany do jednego konta, więc agent pracuje wewnątrz konta, które ktoś wcześniej założył ręcznie i podpiął do niego płatność.
Czym różni się klucz Advertiser API od klucza Conversions API?
Zakresem i adresem. Klucz Advertiser API obsługuje kampanie, grupy, reklamy i konfigurację pomiaru pod adresem api.ads.openai.com. Klucz Conversions API służy wyłącznie do wysyłki zdarzeń na osobny host bzr.openai.com i wraca w odpowiedzi na żądanie, które go tworzy; sposobu odczytania go później dokumentacja na 12 września 2026 nie opisuje. Trzymaj go po stronie serwera — nigdy w przeglądarce ani w logach.
Czy w Polsce zadziała targetowanie po liście klientów albo po wieku?
Nie. Dokumentacja podaje, że listy własnych odbiorców nie są obsługiwane dla kampanii kierowanych do Europejskiego Obszaru Gospodarczego i Szwajcarii, bo nie ma tam reklam personalizowanych. Pola targetowania po wieku ani płci nie opisuje żadna ze stron pobranych 12.09.2026. Zostają kraj, region, Market, platforma i podpowiedzi kontekstowe na grupie reklam.
Jak wysyłać zdarzenia, żeby nie policzyć ich dwa razy?
Odsiewanie duplikatów działa na trójce: identyfikator piksela, nazwa zdarzenia i pole id. Jeśli to samo zdarzenie leci z przeglądarki i z serwera, użyj po obu stronach tego samego identyfikatora i tego samego piksela; przy zdarzeniu własnym także tej samej nazwy. Liczona jest pierwsza wiadomość, kolejne są pomijane.
Reklama ma status active, a nic się nie wyświetla — co sprawdzić?
Dopisz do zapytania o reklamę, grupę albo kampanię parametr include[]=serving_issues, a potem przejdź hierarchię od góry: konto i jego przeglądy, limit wydatku, harmonogram i budżet kampanii, zgodność stawki z celem, na końcu status i wynik przeglądu kreacji. Pusta lista problemów nie jest obietnicą wyświetleń.
Źródła
- OpenAI Ads — indeks dokumentacji (llms.txt, mapa stron Ads) — https://developers.openai.com/ads/llms.txt (odczyt 12.09.2026)
- OpenAI Ads — Overview (struktura konta, konwencje żądań, Idempotency-Key, rate limits 600/1 200 na minutę, changelog) — https://developers.openai.com/ads/api-overview (odczyt 12.09.2026)
- OpenAI Ads — Quickstart (pełna ścieżka: konto, przesłanie obrazu, kampania, grupa, reklama, insights) — https://developers.openai.com/ads/api-quickstart (odczyt 12.09.2026)
- OpenAI Ads — Authentication (base URL https://api.ads.openai.com/v1, nagłówek Bearer, klucz na jedno konto) — https://developers.openai.com/ads/api-reference/authentication (odczyt 12.09.2026)
- OpenAI Ads — Conversion Setup (piksel, klucz Conversions API, event settings, podgląd zdarzeń, kody 404 i Client data source not found) — https://developers.openai.com/ads/api-reference/conversion-setup (odczyt 12.09.2026)
- OpenAI Ads — Conversions API (host bzr.openai.com, paczka 1 000 zdarzeń, timestamp_ms do 7 dni, normalizacja i SHA-256, odsiewanie duplikatów) — https://developers.openai.com/ads/conversions-api (odczyt 12.09.2026)
- OpenAI Ads — Supported Events (trzynaście nazw zdarzeń i kształty danych contents, customer_action, plan_enrollment, custom) — https://developers.openai.com/ads/supported-events (odczyt 12.09.2026)
- OpenAI Ads — Measurement Pixel (snippet przeglądarkowy, zgoda na pomiar, wymagania Content Security Policy) — https://developers.openai.com/ads/measurement-pixel (odczyt 12.09.2026)
- OpenAI Ads — Campaigns (pola tworzenia, minimum 1 000 000 micros, zakres uniksowych sekund, brak zmiany bidding_type, akcje activate/pause/archive) — https://developers.openai.com/ads/api-reference/campaigns (odczyt 12.09.2026)
- OpenAI Ads — Ad Groups (obowiązkowe bidding_config, micros, stawka CPA przy rozliczeniu za kliknięcie, mnożniki stawek) — https://developers.openai.com/ads/api-reference/ad-groups (odczyt 12.09.2026)
- OpenAI Ads — Ads (creative.title 3–50 znaków, creative.body do 100, review_status, podgląd wygasa po 24 godzinach) — https://developers.openai.com/ads/api-reference/ads (odczyt 12.09.2026)
- OpenAI Ads — Bidding & Budgets (budżet dzienny i życiowy, micros, strategie fixed_bid i Maximize Results, brak powrotu z dziennego na życiowy) — https://developers.openai.com/ads/bidding-and-budgets (odczyt 12.09.2026)
- OpenAI Ads — Conversion-Optimized Campaigns (oCPC, jedno standardowe zdarzenie, 403 gdy konto nie ma funkcji, brak zmiany celu) — https://developers.openai.com/ads/conversion-optimized-campaigns (odczyt 12.09.2026)
- OpenAI Ads — Campaign Targeting (włączenia i wyłączenia, kody krajów, do 2 500 identyfikatorów, podpowiedzi kontekstowe) — https://developers.openai.com/ads/campaign-targeting (odczyt 12.09.2026)
- OpenAI Ads — Location Targeting (geo_lookup/search, typy lokalizacji, katalog CSV) — https://developers.openai.com/ads/location-targeting (odczyt 12.09.2026)
- OpenAI Ads — Platform Targeting (android_app, android_web, desktop_web, ios_app, ios_web, web; puste listy zwracają 400) — https://developers.openai.com/ads/platform-targeting (odczyt 12.09.2026)
- OpenAI Ads — Custom Audiences (brak list własnych odbiorców dla kampanii w EOG i Szwajcarii, wymogi wobec danych) — https://developers.openai.com/ads/custom-audiences (odczyt 12.09.2026)
- OpenAI Ads — Bulk API (1 000 operacji na zadanie, 10 żądań na 10 sekund, 16 MiB, sufity 5 000 obiektów) — https://developers.openai.com/ads/bulk-api (odczyt 12.09.2026)
- OpenAI Ads — Troubleshooting (serving_issues, statusy kontra przeglądy, kanały pixel_sdk i server_to_server, klasy błędów API) — https://developers.openai.com/ads/troubleshooting (odczyt 12.09.2026)
- OpenAI Ads — Account Management (waluta i strefa czasowa bez edycji, przeglądy konta, okna limitu wydatku i limit dzienny) — https://developers.openai.com/ads/account-management (odczyt 12.09.2026)
- OpenAI Ads — Insights (cztery endpointy, time_granularity, kanoniczne nazwy pól, kursory, POST /conversions/insights) — https://developers.openai.com/ads/api-reference/insights (odczyt 12.09.2026)
- Pułapki zmierzone na żywym koncie reklamowym przy tworzeniu kampanii wyłącznie przez API — praktyka zespołu — https://jakzrobicaplikacje.pl/o-serwisie/#skad (2026-09-01)
Tekst przygotował Agent AI Tomka Niedźwieckiego — treść wygenerowana przez sztuczną inteligencję na podstawie własnych wdrożeń zespołu, dokumentacji dostawców i źródeł podanych wyżej, sprawdzona w osobnym przebiegu weryfikacji faktów i zredagowana. Za fakty odpowiada Tomek Niedźwiecki. Ostatnia weryfikacja: 12 września 2026.