{"id":9357,"date":"2026-08-10T09:30:00","date_gmt":"2026-08-10T07:30:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=9357"},"modified":"2026-10-24T02:15:21","modified_gmt":"2026-10-24T00:15:21","slug":"microsoft-advertising-conversions-api-integracja-server-side-uet","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/","title":{"rendered":"Microsoft Advertising Conversions API: integracja server-side UET"},"content":{"rendered":"<p>Microsoft Advertising Conversions API (CAPI) zapewnia serwerow\u0105 drog\u0119 przesy\u0142ania zdarze\u0144 z procesu zakupowego, CRM i innych system\u00f3w. Pozwala to ograniczy\u0107 luki spowodowane brakiem \u017c\u0105dania z przegl\u0105darki. Przyj\u0119te zdarzenie nie jest jednak automatycznie przypisan\u0105 konwersj\u0105: nadal obowi\u0105zuj\u0105 zgody, identyfikatory, cele konwersji i regu\u0142y atrybucji.<\/p>\n<p>Wdro\u017cenie obejmuje mapowanie zdarze\u0144, dane dost\u0119powe, dozwolone identyfikatory, obs\u0142ug\u0119 duplikat\u00f3w i monitorowan\u0105 kolejk\u0119 wysy\u0142ki. Uniwersalna wycena na jeden lub dwa tygodnie pomija\u0142aby r\u00f3\u017cnice mi\u0119dzy istniej\u0105cymi systemami. Wydanie z maja 2026 doda\u0142o GetUetTagAuthKey i raport identyfikator\u00f3w klikni\u0119\u0107; sama zmiana daty dokumentacji nie dowodzi zmiany dzia\u0142ania backendu.<\/p>\n<h2>1. Format \u017c\u0105dania i dane dost\u0119powe<\/h2>\n<p>Zdarzenia trafiaj\u0105 jako JSON do <code>https:\/\/capi.uet.microsoft.com\/v1\/{tagId}\/events<\/code>, z kluczem CAPI tagu w <code>Authorization: Bearer \u2026<\/code>. Tablica <code>data<\/code> zawiera maksymalnie 1000 zdarze\u0144. <code>eventType<\/code> przyjmuje <code>custom<\/code> lub <code>pageLoad<\/code>; <code>eventTime<\/code> oznacza czas Unix UTC w sekundach z poprzednich siedmiu dni. <code>userData<\/code> wymaga co najmniej jednego obs\u0142ugiwanego identyfikatora. Ods\u0142ony wymagaj\u0105 tak\u017ce <code>eventSourceUrl<\/code>. Niestandardowe cele konwersji musz\u0105 odpowiada\u0107 skonfigurowanym w\u0142a\u015bciwo\u015bciom zdarzenia.<\/p>\n<p>Oddzielne wywo\u0142anie Campaign Management korzysta z OAuth oraz wymaganych nag\u0142\u00f3wk\u00f3w dewelopera i konta. Te dane dost\u0119powe nie s\u0105 zamienne z kluczem CAPI. <code>GetUetTagAuthKey<\/code> pobiera istniej\u0105cy klucz; utworzenie klucza przy braku wcze\u015bniejszego wymaga w\u0142asno\u015bci tagu. Ponowne pobranie nie wykonuje rotacji. Wygenerowanie zamiennika lub uniewa\u017cnienie musi odbywa\u0107 si\u0119 zgodnie z obs\u0142ugiwan\u0105 procedur\u0105 konta.<\/p>\n<h2>2. Rzeczywista rozbie\u017cno\u015b\u0107 dokumentacji i granice wnioskowania<\/h2>\n<p>W dniu kontroli, 24 pa\u017adziernika 2026, przewodnik pokazuje <code>TagId<\/code> i zagnie\u017cd\u017con\u0105 odpowied\u017a <code>TagAuthKey.AuthKey<\/code>. Dokumentacja operacji podaje <code>UetTagId<\/code> i p\u0142aski <code>UetTagAuthKey<\/code>. To niesp\u00f3jno\u015b\u0107 dokument\u00f3w, a nie dow\u00f3d r\u00f3\u017cnych kontrakt\u00f3w API dla poszczeg\u00f3lnych kont. \u017b\u0105danie powinno odpowiada\u0107 wybranemu SDK lub kontraktowi operacji i zosta\u0107 sprawdzone w uprawnionym \u015brodowisku integracyjnym.<\/p>\n<p>Adapter obs\u0142uguje s\u0142owniki i obiekty w obu opisanych postaciach, odrzuca zg\u0142oszone b\u0142\u0119dy cz\u0119\u015bciowe oraz sprzeczne klucze i nie zapisuje sekretu w logu. Dost\u0119p jak do s\u0142ownika nast\u0119puje dopiero po sprawdzeniu typu odpowiedzi.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> collections.abc <span class=\"cbb-keyword\">import<\/span> Mapping\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">field<\/span>(value, name):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> value.<span class=\"cbb-function\">get<\/span>(name) <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">isinstance<\/span>(value, Mapping) <span class=\"cbb-keyword\">else<\/span> <span class=\"cbb-function\">getattr<\/span>(value, name, <span class=\"cbb-constant\">None<\/span>)\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">extract_auth_key<\/span>(response):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">field<\/span>(response, <span class=\"cbb-string\">\"PartialErrors\"<\/span>):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"Auth response contains errors; inspect redacted diagnostics\"<\/span>)\n<\/span><span class=\"cbb-line\">    values = &#91;<span class=\"cbb-function\">field<\/span>(response, <span class=\"cbb-string\">\"UetTagAuthKey\"<\/span>),\n<\/span><span class=\"cbb-line\">              <span class=\"cbb-function\">field<\/span>(<span class=\"cbb-function\">field<\/span>(response, <span class=\"cbb-string\">\"TagAuthKey\"<\/span>), <span class=\"cbb-string\">\"AuthKey\"<\/span>)&#93;\n<\/span><span class=\"cbb-line\">    keys = {v <span class=\"cbb-keyword\">for<\/span> v <span class=\"cbb-keyword\">in<\/span> values <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">isinstance<\/span>(v, str) <span class=\"cbb-keyword\">and<\/span> v.<span class=\"cbb-function\">strip<\/span>()}\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">len<\/span>(keys) != <span class=\"cbb-number\">1<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"Missing or conflicting auth-key fields\"<\/span>)\n<\/span><span class=\"cbb-line\">    key = keys.<span class=\"cbb-function\">pop<\/span>()\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">any<\/span>(c.<span class=\"cbb-function\">isspace<\/span>() <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-function\">ord<\/span>(c) &lt; <span class=\"cbb-number\">32<\/span> <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-function\">ord<\/span>(c) == <span class=\"cbb-number\">127<\/span> <span class=\"cbb-keyword\">for<\/span> c <span class=\"cbb-keyword\">in<\/span> key):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"Invalid auth-key whitespace\/control character\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> key<\/span><\/code><\/pre><\/figure>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/quality-9357-auth-20261024.png\" width=\"1120\" height=\"720\" loading=\"lazy\" alt=\"Przewodnik i dokumentacja operacji r\u00f3\u017cni\u0105 si\u0119 nazwami p\u00f3l. Adapter sprawdza oba kszta\u0142ty; pobranie klucza nie oznacza rotacji.\"><figcaption>Przewodnik i dokumentacja operacji r\u00f3\u017cni\u0105 si\u0119 nazwami p\u00f3l. Adapter sprawdza oba kszta\u0142ty; pobranie klucza nie oznacza rotacji.<\/figcaption><\/figure>\n<p>Tolerancja schematu nie naprawia b\u0142\u0119dnych danych dost\u0119powych ani nieprawid\u0142owego \u017c\u0105dania. Logi diagnostyczne powinny zawiera\u0107 identyfikatory \u017c\u0105dania\/\u015bledzenia, status i oczyszczon\u0105 klasyfikacj\u0119 b\u0142\u0119du. Surowe odpowiedzi autoryzacji, nag\u0142\u00f3wki bearer i dane klient\u00f3w nie nale\u017c\u0105 do zwyk\u0142ych log\u00f3w. Odczyt nowego zatwierdzonego sekretu mi\u0119dzy paczkami u\u0142atwia zmian\u0119, lecz nie gwarantuje rotacji bez przerwy ani pomijalnego czasu dost\u0119pu do magazynu.<\/p>\n<h2>3. Deduplikacja wymaga wi\u0119cej ni\u017c numeru zam\u00f3wienia<\/h2>\n<p>Przegl\u0105darkowa i serwerowa kopia tego samego zdarzenia wymagaj\u0105 tego samego tagu UET, zgodnej nazwy zdarzenia i stabilnego identyfikatora. JavaScript UET u\u017cywa <code>event_id<\/code>, a CAPI <code>eventId<\/code>. Identyfikator powinien oznacza\u0107 zdarzenie biznesowe, na przyk\u0142ad zako\u0144czony zakup, i pozosta\u0107 niezmieniony przy ponowieniach. Zakup i zwrot s\u0105 r\u00f3\u017cnymi zdarzeniami, nawet przy jednym zam\u00f3wieniu.<\/p>\n<p>Stabilno\u015b\u0107 mo\u017ce zapewni\u0107 zapisany losowy identyfikator albo identyfikator zam\u00f3wienia po\u0142\u0105czony z typem zdarzenia i przestrzeni\u0105 nazw. Druga droga transportu nie mo\u017ce generowa\u0107 nowej losowej warto\u015bci. Zdarzenia CRM wysy\u0142ane wy\u0142\u0105cznie serwerowo nie maj\u0105 odpowiednika w przegl\u0105darce, lecz nadal wymagaj\u0105 poprawnej obs\u0142ugi ponowie\u0144. Sta\u0142e identyfikatory pomagaj\u0105 zapobiega\u0107 duplikatom; pojedyncze pole nie gwarantuje przetwarzania dok\u0142adnie raz mimo awarii.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/quality-9357-flow-20261024.png\" width=\"1120\" height=\"720\" loading=\"lazy\" alt=\"Zgodny tag UET, nazwa zdarzenia i stabilne ID wspieraj\u0105 deduplikacj\u0119. Przyj\u0119cie HTTP oraz atrybucja wymagaj\u0105 oddzielnych kontroli.\"><figcaption>Zgodny tag UET, nazwa zdarzenia i stabilne ID wspieraj\u0105 deduplikacj\u0119. Przyj\u0119cie HTTP oraz atrybucja wymagaj\u0105 oddzielnych kontroli.<\/figcaption><\/figure>\n<h2>4. Normalizacja poszczeg\u00f3lnych p\u00f3l i zgody<\/h2>\n<p>Obecne instrukcje Microsoftu dla e-maili obejmuj\u0105 usuni\u0119cie skrajnych bia\u0142ych znak\u00f3w, kropek i aliasu z plusem z cz\u0119\u015bci lokalnej, zamian\u0119 na ma\u0142e litery oraz SHA-256. To regu\u0142a dopasowania Microsoftu, a nie uniwersalna zasada edycji zapisanych kontakt\u00f3w lub danych innych platform. Telefon jest hashowany w kanonicznym formacie E.164 wraz z pocz\u0105tkowym plusem. Funkcja oczekuje ju\u017c znormalizowanego numeru mi\u0119dzynarodowego; interpretacja kraju i walidacja rzeczywistego numeru nale\u017c\u0105 do wcze\u015bniejszego etapu.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> hashlib\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> re\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">microsoft_email_hash<\/span>(value):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(value, str):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">    value = value.<span class=\"cbb-function\">strip<\/span>()\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> value.<span class=\"cbb-function\">count<\/span>(<span class=\"cbb-string\">\"@\"<\/span>) != <span class=\"cbb-number\">1<\/span> <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-function\">any<\/span>(c.<span class=\"cbb-function\">isspace<\/span>() <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-function\">ord<\/span>(c) &lt; <span class=\"cbb-number\">32<\/span> <span class=\"cbb-keyword\">for<\/span> c <span class=\"cbb-keyword\">in<\/span> value):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">    local, domain = value.<span class=\"cbb-function\">split<\/span>(<span class=\"cbb-string\">\"@\"<\/span>)\n<\/span><span class=\"cbb-line\">    local = local.<span class=\"cbb-function\">split<\/span>(<span class=\"cbb-string\">\"+\"<\/span>, <span class=\"cbb-number\">1<\/span>)&#91;<span class=\"cbb-number\">0<\/span>&#93;.<span class=\"cbb-function\">replace<\/span>(<span class=\"cbb-string\">\".\"<\/span>, <span class=\"cbb-string\">\"\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> local <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> domain <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-string\">\".\"<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-keyword\">in<\/span> domain:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> hashlib.<span class=\"cbb-function\">sha256<\/span>((local + <span class=\"cbb-string\">\"@\"<\/span> + domain).<span class=\"cbb-function\">lower<\/span>().<span class=\"cbb-function\">encode<\/span>(<span class=\"cbb-string\">\"utf-8\"<\/span>)).<span class=\"cbb-function\">hexdigest<\/span>()\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">microsoft_phone_hash<\/span>(e164):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(e164, str) <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> re.<span class=\"cbb-function\">fullmatch<\/span>(<span class=\"cbb-string\">r\"\\+&#91;1-9&#93;&#91;0-9&#93;{6,14}\"<\/span>, e164):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> hashlib.<span class=\"cbb-function\">sha256<\/span>(e164.<span class=\"cbb-function\">encode<\/span>(<span class=\"cbb-string\">\"utf-8\"<\/span>)).<span class=\"cbb-function\">hexdigest<\/span>()<\/span><\/code><\/pre><\/figure>\n<p>Funkcje stanowi\u0105 celowo ograniczone przyk\u0142ady, a nie pe\u0142ne walidatory adres\u00f3w i telefon\u00f3w. Nieprawid\u0142owe lub niedost\u0119pne identyfikatory powinny zosta\u0107 pomini\u0119te zamiast zast\u0105pione hashami warto\u015bci zast\u0119pczych. Adres IP, user agent i identyfikator klikni\u0119cia maj\u0105 osobne regu\u0142y; og\u00f3lna instrukcja hashowania ka\u017cdego identyfikatora jest b\u0142\u0119dna. Hashowanie nie czyni te\u017c danych identyfikuj\u0105cych anonimowymi.<\/p>\n<p><code>adStorageConsent<\/code> przyjmuje <code>G<\/code> albo <code>D<\/code>. Wed\u0142ug dokumentacji pomini\u0119cie pola oznacza domy\u015blnie zgod\u0119. Jawne przekazanie stanu ma wi\u0119c znaczenie: zdarzenia z odmow\u0105 nie s\u0105 wykorzystywane do cel\u00f3w reklamowych, w tym atrybucji i remarketingu. Pole nie uprawnia do wysy\u0142ki danych osobowych, kt\u00f3rych przekazanie jest z innych powod\u00f3w niedozwolone.<\/p>\n<p>Aplikacja musi zapewni\u0107 dopuszczaln\u0105 podstaw\u0119 zbierania i wysy\u0142ania danych, zachowa\u0107 odpowiednie dowody zgody oraz ponownie sprawdzi\u0107 obowi\u0105zuj\u0105ce wycofania i blokady przed wysy\u0142k\u0105 z kolejki. Wcze\u015bniejsza zgoda nie uzasadnia ignorowania p\u00f3\u017aniejszego wycofania. Sprzeda\u017c telefoniczna mo\u017ce mie\u0107 oddzielny zapis zgody; brak banera internetowego sam w sobie nie dowodzi ani zezwolenia, ani zakazu. Stan nieznany nie mo\u017ce automatycznie sta\u0107 si\u0119 zgod\u0105.<\/p>\n<h2>5. Siedem dni, daty przysz\u0142e i ostatnia godzina<\/h2>\n<p>Kontrola wieku musi odrzuca\u0107 przysz\u0142e daty bez usuwania wa\u017cnych rekord\u00f3w tylko z powodu zbli\u017caj\u0105cego si\u0119 terminu. Funkcja rozr\u00f3\u017cnia daty nieprawid\u0142owe, przysz\u0142e, wygas\u0142e i pilne. Pilne zdarzenie nadal kwalifikuje si\u0119 do natychmiastowej pr\u00f3by; pr\u00f3g ostrzegania nie skraca okna API. Kwalifikacja wymaga ponownej kontroli tu\u017c przed wysy\u0142k\u0105.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> datetime <span class=\"cbb-keyword\">import<\/span> datetime, timedelta, timezone\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">event_age_state<\/span>(event_time, now):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(event_time, datetime) <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(now, datetime):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"invalid\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> event_time.tzinfo <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-constant\">None<\/span> <span class=\"cbb-keyword\">or<\/span> event_time.<span class=\"cbb-function\">utcoffset<\/span>() <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-constant\">None<\/span> <span class=\"cbb-keyword\">or<\/span> now.tzinfo <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-constant\">None<\/span> <span class=\"cbb-keyword\">or<\/span> now.<span class=\"cbb-function\">utcoffset<\/span>() <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-constant\">None<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"invalid\"<\/span>\n<\/span><span class=\"cbb-line\">    age = now.<span class=\"cbb-function\">astimezone<\/span>(timezone.utc) - event_time.<span class=\"cbb-function\">astimezone<\/span>(timezone.utc)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> age &lt; <span class=\"cbb-function\">timedelta<\/span>(<span class=\"cbb-number\">0<\/span>):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"future\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> age &gt;= <span class=\"cbb-function\">timedelta<\/span>(days=<span class=\"cbb-number\">7<\/span>):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"expired\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> age &gt;= <span class=\"cbb-function\">timedelta<\/span>(days=<span class=\"cbb-number\">7<\/span>, hours=<span class=\"cbb-number\">-1<\/span>):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"urgent\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"ready\"<\/span><\/span><\/code><\/pre><\/figure>\n<p>Granica dok\u0142adnie siedmiu dni jest ostro\u017cnie traktowana jako wyga\u015bni\u0119cie. Funkcja zwraca wy\u0142\u0105cznie stany; nie wysy\u0142a ani nie usuwa rekord\u00f3w. Trwa\u0142a kolejka wymaga jednoznacznych wynik\u00f3w, ograniczonego harmonogramu ponowie\u0144 i ustalenia odpowiedzialno\u015bci za trwaj\u0105ce zadania. Po awarii workera dostarczenie mo\u017ce by\u0107 niepewne; sama kolumna stanu nie dowodzi nieszkodliwego wznowienia. Stare zdarzenia nie mog\u0105 otrzymywa\u0107 bie\u017c\u0105cej daty w celu obej\u015bcia okna.<\/p>\n<h2>6. Sukces HTTP r\u00f3\u017cni si\u0119 od sukcesu zdarzenia<\/h2>\n<p>Przewodnik dokumentuje obecnie HTTP 400 dla b\u0142\u0119d\u00f3w walidacji i 401 dla b\u0142\u0119d\u00f3w autoryzacji. Odpowied\u017a 401 wymaga poprawienia danych dost\u0119powych i powi\u0105zania tagu; niezmieniony b\u0142\u0119dny payload nie powinien by\u0107 ponawiany bez ko\u0144ca po 400. Przej\u015bciowe b\u0142\u0119dy transportu lub us\u0142ugi mog\u0105 uzasadnia\u0107 ograniczone ponowienia z wyk\u0142adniczym op\u00f3\u017anieniem i losowym rozproszeniem. Faktycznie otrzymana instrukcja Retry-After wymaga uwzgl\u0119dnienia; nie zak\u0142ada si\u0119 nieudokumentowanego liczbowego limitu \u017c\u0105da\u0144.<\/p>\n<p>Domy\u015blnie b\u0142\u0105d walidacji uniemo\u017cliwia przetworzenie ca\u0142ej paczki. Przy <code>continueOnValidationError: true<\/code> poprawne zdarzenia mog\u0105 zosta\u0107 przetworzone, a nieprawid\u0142owe pomini\u0119te. HTTP 200 mo\u017ce zatem zawiera\u0107 b\u0142\u0119dy lub ostrze\u017cenia; ostrze\u017cenie mo\u017ce oznacza\u0107 usuni\u0119cie pola opcjonalnego. Przed oznaczeniem rekord\u00f3w jako przyj\u0119te konieczne jest uzgodnienie <code>eventsReceived<\/code> i szczeg\u00f3\u0142\u00f3w diagnostycznych. Dokumentacja ogranicza list\u0119 szczeg\u00f3\u0142\u00f3w b\u0142\u0119d\u00f3w\/ostrze\u017ce\u0144 do pierwszych dziesi\u0119ciu pozycji. Brak rekordu na widocznej li\u015bcie nie zawsze dowodzi przyj\u0119cia.<\/p>\n<p>Prostsza strategia pocz\u0105tkowa pozostawia przetwarzanie cz\u0119\u015bciowe wy\u0142\u0105czone, waliduje lokalnie i oddziela nieprawid\u0142owe rekordy do korekty. Monitoring powinien rozr\u00f3\u017cnia\u0107 przyj\u0119cie przez API, odrzucenie zdarzenia, usuni\u0119cie pola i p\u00f3\u017aniejsz\u0105 przypisan\u0105 konwersj\u0119. Logi zapisuj\u0105 bezpieczne identyfikatory oraz klasy b\u0142\u0119d\u00f3w zamiast nieograniczonej tre\u015bci odpowiedzi.<\/p>\n<h2>7. Monitoring i uzgadnianie danych<\/h2>\n<p>Przydatne miary obejmuj\u0105 wiek najstarszego oczekuj\u0105cego zdarzenia, rekordy pilne i wygas\u0142e, percentyle op\u00f3\u017anienia, liczb\u0119 przyj\u0119tych zdarze\u0144, b\u0142\u0119dy walidacji, stan zgody i pokrycie wszystkimi obs\u0142ugiwanymi identyfikatorami. \u201eBrak hasha e-maila\u201d nie oznacza \u201ebrak identyfikatora\u201d; zdarzenie mo\u017ce zawiera\u0107 msclkid lub inne akceptowane pole. Wygas\u0142e rekordy mog\u0105 pochodzi\u0107 z importu starej historii lub b\u0142\u0119dnych dat i nie dowodz\u0105 sze\u015bciodniowej awarii.<\/p>\n<p>Skoki zg\u00f3d lub pokrycia identyfikatorami uzasadniaj\u0105 analiz\u0119, lecz nie dowodz\u0105 konkretnego b\u0142\u0119du formularza czy narz\u0119dzia zg\u00f3d. Struktura ruchu, kana\u0142y pozyskania i rzeczywiste zmiany biznesowe r\u00f3wnie\u017c mog\u0105 zmienia\u0107 te warto\u015bci. Konwersje raportowane przez Microsoft nie musz\u0105 odpowiada\u0107 wszystkim przyj\u0119tym zam\u00f3wieniom: dopasowanie, cele, okna, zasady zliczania, data raportowa i op\u00f3\u017anienie przetwarzania wp\u0142ywaj\u0105 na por\u00f3wnanie.<\/p>\n<div class=\"lw-faq\"><h2>Pytania i odpowiedzi<\/h2><h3>Czy sumy zbiorcze dowodz\u0105 deduplikacji?<\/h3><p>Nie. Sumy wyr\u00f3wnane czasowo mog\u0105 ujawni\u0107 podejrzane zmiany, ale do wyodr\u0119bnienia problem\u00f3w deduplikacji potrzebne s\u0105 testy konkretnych zdarze\u0144 i zapisy wysy\u0142ki. Ni\u017csza liczba na platformie sama w sobie nie dowodzi utraty zdarze\u0144 API.<\/p><h3>Czy raport identyfikator\u00f3w klikni\u0119\u0107 jest wymagany?<\/h3><p>Nie. MSClickIdPerformanceReport mo\u017ce wspiera\u0107 analiz\u0119 pojedynczych klikni\u0119\u0107, je\u015bli jest dost\u0119pny. Dokumentacja kolumn zawiera uwagi dotycz\u0105ce dost\u0119pno\u015bci konkretnych funkcji; dwie uwagi na stronie nie dowodz\u0105 pilota\u017cu ca\u0142ego raportu. ConversionsQualified ma udokumentowany typ double. Dost\u0119pno\u015b\u0107 na koncie i znaczenie raportu wymagaj\u0105 kontroli przed uzale\u017cnieniem dzia\u0142ania integracji od tego \u017ar\u00f3d\u0142a.<\/p><h3>Co zmienia remarketing?<\/h3><p>Obecny przewodnik wymaga klienckiego ID Sync dla remarketingu i odbiorc\u00f3w oraz zaleca ten mechanizm dla jako\u015bci pomiaru konwersji. Sam strumie\u0144 zdarze\u0144 z serwera nie zast\u0119puje automatycznie tego kroku w przegl\u0105darce. Synchronizacja r\u00f3wnie\u017c podlega odpowiednim regu\u0142om zgody, a identyfikator odwiedzaj\u0105cego musi odpowiada\u0107 anonymousId w zdarzeniu serwerowym.<\/p><\/div><div class=\"lw-quellen\"><h2>\u0179r\u00f3d\u0142a<\/h2><ul><li><a href=\"https:\/\/learn.microsoft.com\/en-us\/advertising\/guides\/uet-conversion-api-integration?view=bingads-13\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft: CAPI integration<\/a><\/li><li><a href=\"https:\/\/learn.microsoft.com\/en-us\/advertising\/campaign-management-service\/getuettagauthkey?view=bingads-13\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft: GetUetTagAuthKey<\/a><\/li><li><a href=\"https:\/\/learn.microsoft.com\/en-us\/advertising\/guides\/release-notes?view=bingads-13\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft: API release notes<\/a><\/li><li><a href=\"https:\/\/learn.microsoft.com\/en-us\/advertising\/reporting-service\/msclickidperformancereportcolumn?view=bingads-13\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft: click-ID report columns<\/a><\/li><li><a href=\"https:\/\/learn.microsoft.com\/en-us\/advertising\/guides\/universal-event-tracking?view=bingads-13\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft: Universal Event Tracking<\/a><\/li><li><a href=\"https:\/\/learn.microsoft.com\/en-us\/advertising\/guides\/reports?view=bingads-13\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft: reporting<\/a><\/li><\/ul><\/div>","protected":false},"excerpt":{"rendered":"<p>Opis kontraktu Conversions API w Microsoft Advertising: endpoint, uwierzytelnianie tokenem bearer, deduplikacja przez eventId, normalizacja i hashowanie identyfikator\u00f3w, siedmiodniowe okno eventTime oraz monitoring potoku. Uwzgl\u0119dnia r\u00f3\u017cnic\u0119 w opisie operacji GetUetTagAuthKey mi\u0119dzy przewodnikiem po integracji a dokumentacj\u0105 operacji.<\/p>\n","protected":false},"author":1,"featured_media":13790,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[92035,92038,92041,92044],"class_list":["post-9357","post","type-post","status-publish","format-standard","hentry","category-digital-marketing-pl","tag-conversion-tracking-pl","tag-marketing-cyfrowy-pl-pl","tag-first-party-data-pl","tag-tracking-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Microsoft Advertising Conversions API: integracja server-side UET | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Microsoft Advertising Conversions API: zdarzenia UET z serwera, autoryzacja, deduplikacja, hashowanie i kontrola odpowiedzi API.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Microsoft Advertising Conversions API: integracja server-side UET | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Microsoft Advertising Conversions API: zdarzenia UET z serwera, autoryzacja, deduplikacja, hashowanie i kontrola odpowiedzi API.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-10T07:30:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-24T00:15:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9357-microsoft-advertising-conversions-ap-g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Microsoft Advertising Conversions API: integracja server-side UET\",\"datePublished\":\"2026-08-10T07:30:00+00:00\",\"dateModified\":\"2026-10-24T00:15:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/\"},\"wordCount\":1493,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-9357-microsoft-advertising-conversions-ap-g.png\",\"keywords\":[\"Conversion Tracking\",\"Digital Marketing\",\"First-Party Data\",\"Tracking\"],\"articleSection\":[\"Digital Marketing\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/\",\"name\":\"Microsoft Advertising Conversions API: integracja server-side UET | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-9357-microsoft-advertising-conversions-ap-g.png\",\"datePublished\":\"2026-08-10T07:30:00+00:00\",\"dateModified\":\"2026-10-24T00:15:21+00:00\",\"description\":\"Microsoft Advertising Conversions API: zdarzenia UET z serwera, autoryzacja, deduplikacja, hashowanie i kontrola odpowiedzi API.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-9357-microsoft-advertising-conversions-ap-g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-9357-microsoft-advertising-conversions-ap-g.png\",\"width\":1200,\"height\":630,\"caption\":\"Microsoft Advertising Conversions API: integracja server-side UET\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/microsoft-advertising-conversions-api-integracja-server-side-uet\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Microsoft Advertising Conversions API: integracja server-side UET\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Microsoft Advertising Conversions API: integracja server-side UET | Lukas Wojcik","description":"Microsoft Advertising Conversions API: zdarzenia UET z serwera, autoryzacja, deduplikacja, hashowanie i kontrola odpowiedzi API.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/","og_locale":"en_US","og_type":"article","og_title":"Microsoft Advertising Conversions API: integracja server-side UET | Lukas Wojcik","og_description":"Microsoft Advertising Conversions API: zdarzenia UET z serwera, autoryzacja, deduplikacja, hashowanie i kontrola odpowiedzi API.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-08-10T07:30:00+00:00","article_modified_time":"2026-10-24T00:15:21+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9357-microsoft-advertising-conversions-ap-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Microsoft Advertising Conversions API: integracja server-side UET","datePublished":"2026-08-10T07:30:00+00:00","dateModified":"2026-10-24T00:15:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/"},"wordCount":1493,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9357-microsoft-advertising-conversions-ap-g.png","keywords":["Conversion Tracking","Digital Marketing","First-Party Data","Tracking"],"articleSection":["Digital Marketing"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/","name":"Microsoft Advertising Conversions API: integracja server-side UET | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9357-microsoft-advertising-conversions-ap-g.png","datePublished":"2026-08-10T07:30:00+00:00","dateModified":"2026-10-24T00:15:21+00:00","description":"Microsoft Advertising Conversions API: zdarzenia UET z serwera, autoryzacja, deduplikacja, hashowanie i kontrola odpowiedzi API.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9357-microsoft-advertising-conversions-ap-g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-9357-microsoft-advertising-conversions-ap-g.png","width":1200,"height":630,"caption":"Microsoft Advertising Conversions API: integracja server-side UET"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/microsoft-advertising-conversions-api-integracja-server-side-uet\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Microsoft Advertising Conversions API: integracja server-side UET"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/9357","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=9357"}],"version-history":[{"count":9,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/9357\/revisions"}],"predecessor-version":[{"id":23143,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/9357\/revisions\/23143"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13790"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=9357"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=9357"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=9357"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}