{"id":10128,"date":"2026-09-20T08:31:00","date_gmt":"2026-09-20T06:31:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=10128"},"modified":"2026-10-26T13:33:51","modified_gmt":"2026-10-26T12:33:51","slug":"tutorial-implementing-the-tiktok-events-api-for-online-shops","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/","title":{"rendered":"Tutorial: Implementing the TikTok Events API for Online Shops"},"content":{"rendered":"<p>A browser pixel can miss purchases when an ad blocker intervenes or a confirmation tab closes early. TikTok Events API adds a reporting path from the shop backend. This can improve coverage, but does not guarantee complete collection or attribution of every purchase to an ad.<\/p>\n<p>A pixel is measurement code running in the browser. The backend is the shop&#8217;s server-side software, and an API is an interface for exchanging data between programs. An access token is a credential permitting that exchange. Deduplication means recognizing repeated reports of the same event; attribution means assigning a purchase to an ad under defined rules.<\/p>\n<p>The following implementation connects both paths through a shared event identifier. Prerequisites are a TikTok pixel, a server-only access token, an integrated consent system and a reliable purchase-confirmation event in the backend. The examples cover data preparation; shop integration, a delivery queue and error handling require additional implementation.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/quality-10128-20261024.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"One confirmed purchase is reported through pixel and Events API with the same identifier, event name and pixel code. Deduplication applies within 48 hours.\"><figcaption>Two reporting paths need consistent purchase data and current consent; delivery does not establish ad attribution.<\/figcaption><\/figure>\n<h2>Step 1: A Stable Identifier for Each Confirmed Purchase<\/h2>\n<p>The backend creates <code>event_id<\/code> once. Browser reporting, server reporting and retries retain that value. For example, <code>purchase-10432<\/code> identifies one confirmed purchase. An order-based identifier must be unique within the data source and contain no personal information. Recurring payments need a separate identifier for each payment.<\/p>\n<p>TikTok deduplicates using the pixel code, event name and <code>event_id<\/code> within a 48-hour window. A confirmation-page reload after that window is not protected indefinitely. The shop also needs to limit repeated purchase reporting, for example through a delivery status per event. Retries retain the original purchase time as well.<\/p>\n<h2>Step 2: The Same Purchase Data for the Pixel<\/h2>\n<p>The backend supplies the confirmation page with purchase fields converted into a data format that can be embedded safely in the page: <code>event_id<\/code>, <code>contents<\/code>, <code>value<\/code> and <code>currency<\/code>. Prices and basket contents come from the confirmed order, not freely editable URL parameters. This function requires an initialized pixel controlled by the consent system:<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"javascript\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JavaScript<\/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-javascript\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">function<\/span> <span class=\"cbb-function\">sendTikTokPurchase<\/span>(purchase, advertisingConsent) {\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">if<\/span> (advertisingConsent !== <span class=\"cbb-constant\">true<\/span>) <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">false<\/span>;\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">if<\/span> (!purchase.event_id || !window.ttq) <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">false<\/span>;\n<\/span><span class=\"cbb-line\">  window.ttq.<span class=\"cbb-function\">track<\/span>(<span class=\"cbb-string\">'Purchase'<\/span>, {\n<\/span><span class=\"cbb-line\">    content_type: <span class=\"cbb-string\">'product'<\/span>,\n<\/span><span class=\"cbb-line\">    contents: purchase.contents,\n<\/span><span class=\"cbb-line\">    value: purchase.value,\n<\/span><span class=\"cbb-line\">    currency: purchase.currency\n<\/span><span class=\"cbb-line\">  }, { event_id: purchase.event_id });\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">true<\/span>;\n<\/span><span class=\"cbb-line\">}<\/span><\/code><\/pre><\/figure>\n<p>The call takes place only after purchase confirmation and with current advertising consent. A return value of <code>true<\/code> means that <code>ttq.track<\/code> was called, not that delivery succeeded. Pixel initialization and any automatic events require the same consent controls.<\/p>\n<p>New implementations use <code>Purchase<\/code> on both paths. Since May 2025, TikTok automatically maps the previous name <code>CompletePayment<\/code> to <code>Purchase<\/code>; the legacy name remains supported. Other naming differences without a documented mapping remain potential errors.<\/p>\n<h2>Step 3: Available Click and Browser Data After Consent<\/h2>\n<p><code>ttclid<\/code> may arrive in an ad landing-page URL. <code>_ttp<\/code> is a pixel cookie. These values are not browser-only: the shop server can also read incoming URL parameters and cookies. The cookie may not exist on the initial request. Missing identifiers stay omitted; fabricated replacements reduce data quality.<\/p>\n<p>A small client-side function can store an available click ID after approval. The consent system calls the function after the initial decision and after subsequent consent changes:<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"javascript\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JavaScript<\/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-javascript\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">function<\/span> <span class=\"cbb-function\">updateTikTokClickCookie<\/span>(advertisingConsent) {\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">const<\/span> attributes = <span class=\"cbb-string\">';path=\/;Secure;SameSite=Lax'<\/span>;\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">if<\/span> (advertisingConsent !== <span class=\"cbb-constant\">true<\/span>) {\n<\/span><span class=\"cbb-line\">    document.cookie = <span class=\"cbb-string\">'shop_ttclid=;max-age=0'<\/span> + attributes;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span>;\n<\/span><span class=\"cbb-line\">  }\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">const<\/span> clickId = <span class=\"cbb-keyword\">new<\/span> <span class=\"cbb-function\">URLSearchParams<\/span>(location.search).<span class=\"cbb-keyword\">get<\/span>(<span class=\"cbb-string\">'ttclid'<\/span>);\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-comment\">\/\/ Local size limit, not a TikTok identifier-format specification.<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">if<\/span> (!clickId || clickId.length &gt; <span class=\"cbb-number\">1024<\/span>) <span class=\"cbb-keyword\">return<\/span>;\n<\/span><span class=\"cbb-line\">  document.cookie = <span class=\"cbb-string\">'shop_ttclid='<\/span> + <span class=\"cbb-function\">encodeURIComponent<\/span>(clickId) +\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-string\">';max-age=2592000'<\/span> + attributes;\n<\/span><span class=\"cbb-line\">}<\/span><\/code><\/pre><\/figure>\n<p>The 30-day period is an example retention choice, not a TikTok requirement or a guarantee of browser persistence. A later page without <code>ttclid<\/code> does not extend the cookie. Denial or withdrawal deletes the cookie created here. Server-held identifiers and queued events need corresponding withdrawal handling; cookies on other paths or domains are outside this deletion.<\/p>\n<p>At checkout, available identifiers can be associated with the purchase. The <code>ttp<\/code> field receives the value of <code>_ttp<\/code>. The IP address and user agent (the browser&#8217;s description of its software) must describe the original visit, not the later API client. A proxy forwards requests between systems. IP addresses in forwarded request headers are trustworthy only when the receiving server accepts them from correctly configured, trusted proxies.<\/p>\n<h2>Step 4: Preparing the Data for Server Delivery<\/h2>\n<p>The destination is <code>POST https:\/\/business-api.tiktok.com\/open_api\/v1.3\/event\/track\/<\/code>, with <code>Access-Token<\/code> and <code>Content-Type: application\/json<\/code> headers. <code>event_source_id<\/code> contains the same pixel code used by the browser integration. This Python function builds a payload without making a network request:<\/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\">sha256<\/span>(value):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> hashlib.<span class=\"cbb-function\">sha256<\/span>(value.<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\">build_payload<\/span>(pixel_code, order, advertising_consent,\n<\/span><span class=\"cbb-line\">                  email, phone_e164=<span class=\"cbb-constant\">None<\/span>):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> advertising_consent <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-constant\">True<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">    email = email.<span class=\"cbb-function\">strip<\/span>().<span class=\"cbb-function\">lower<\/span>()\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> email:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">'Missing email for this example'<\/span>)\n<\/span><span class=\"cbb-line\">    user = {<span class=\"cbb-string\">'email'<\/span>: <span class=\"cbb-function\">sha256<\/span>(email)}\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> phone_e164 <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-constant\">None<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-comment\"># Input already parsed and validated for its country.<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/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;{1,14}'<\/span>, phone_e164):\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">'Expected international phone number with +'<\/span>)\n<\/span><span class=\"cbb-line\">        user&#91;<span class=\"cbb-string\">'phone'<\/span>&#93; = <span class=\"cbb-function\">sha256<\/span>(phone_e164)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> {\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-string\">'event_source'<\/span>: <span class=\"cbb-string\">'web'<\/span>,\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-string\">'event_source_id'<\/span>: pixel_code,\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-string\">'data'<\/span>: &#91;{\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-string\">'event'<\/span>: <span class=\"cbb-string\">'Purchase'<\/span>,\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-string\">'event_time'<\/span>: order&#91;<span class=\"cbb-string\">'confirmed_at_unix'<\/span>&#93;,\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-string\">'event_id'<\/span>: order&#91;<span class=\"cbb-string\">'event_id'<\/span>&#93;,\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-string\">'user'<\/span>: user,\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-string\">'properties'<\/span>: {\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-string\">'content_type'<\/span>: <span class=\"cbb-string\">'product'<\/span>,\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-string\">'contents'<\/span>: order&#91;<span class=\"cbb-string\">'contents'<\/span>&#93;,\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-string\">'currency'<\/span>: order&#91;<span class=\"cbb-string\">'currency'<\/span>&#93;,\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-string\">'value'<\/span>: order&#91;<span class=\"cbb-string\">'value'<\/span>&#93;\n<\/span><span class=\"cbb-line\">            },\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-string\">'page'<\/span>: {<span class=\"cbb-string\">'url'<\/span>: order&#91;<span class=\"cbb-string\">'confirmation_url'<\/span>&#93;}\n<\/span><span class=\"cbb-line\">        }&#93;\n<\/span><span class=\"cbb-line\">    }<\/span><\/code><\/pre><\/figure>\n<p><code>order<\/code> is an already validated backend record: a confirmed purchase, a stored stable identifier, the purchase time as whole seconds since 1 January 1970 UTC (Unix time), the appropriate currency code such as EUR, a numeric value and a product list. The confirmation URL must belong to the shop and exclude email addresses, access tokens and other confidential parameters. Authorization comes from trusted consent records, including known withdrawals; an unverified browser field is insufficient.<\/p>\n<p>The example removes whitespace at the start and end of the email address and changes letters to lowercase. SHA-256 then calculates a fixed-length hash from that text. An optional phone number must already be normalized correctly, for example <code>+12133734253<\/code>; the plus sign remains part of the hashed value. The regular expression checks only the basic format, not whether a phone number is valid. The number is interpreted and checked using the rules for its country before this function runs. Missing phone numbers are omitted. Email is required by this simplified example, not the only matching option supported by TikTok.<\/p>\n<p>Hashing does not anonymize the data. Additional supported fields follow separate rules: <code>external_id<\/code> is hashed, while <code>ttclid<\/code>, <code>ttp<\/code>, IP address and user agent are transmitted unhashed. Raw identifiers and hashes do not belong in general debug logs. Contact information needed for order fulfillment remains subject to the shop&#8217;s separate retention policy.<\/p>\n<p>Delivery should follow purchase confirmation promptly. A queue preserves the original ID and time, checks consent again before delivery and limits retries. Both the HTTP status (the response status of the web request) and the JSON response (structured result data) need evaluation: <code>code: 0<\/code> indicates API success, not person matching or ad attribution. A timeout means that no reply arrived within the waiting period. It can occur after successful receipt, so the delivery state must allow \u201coutcome unknown\u201d without inventing a new event identifier.<\/p>\n<h2>Step 5: Separate Checks of Delivery, Duplicate Reports and Ad Attribution<\/h2>\n<p>Test Events and the supplied <code>test_event_code<\/code> help validate the chosen integration. Test data is separate from production; the test configuration must be removed before genuine reporting. Visible hashed fields do not establish a successful person match. A controlled test purchase checks both channels, the same pixel code, matching event identifiers and consistent purchase values.<\/p>\n<p>Ongoing monitoring uses deduplication details and diagnostics in Events Manager. Browser, server and combined metrics cannot be added without checking the definitions. Equal totals alone do not prove a fault: without channel overlap, no duplicates exist. Dashboard latency, timezones and filters can also change comparisons.<\/p>\n<p>Reconciliation with the shop uses the same purchase definition, reporting period and population authorized for transmission. \u201cTotal Events\u201d includes attributed and unattributed events; Ads Manager conversions additionally depend on matching and attribution windows, the allowed intervals between an ad interaction and a purchase. An accepted event is therefore not a guaranteed ad conversion.<\/p>\n<div class=\"lw-faq\"><h2>Questions and answers<\/h2>\n<h3>Why can Events API totals still differ from shop orders?<\/h3>\n<p>Consent, missing attribution, reporting delay and different counting rules can explain differences, alongside technical failures. A delivery log distinguishes at least: not authorized, authorized and pending, rejected, accepted, and outcome unknown. Internal event ID, attempt count, error code and request ID generally provide useful diagnostics without storing complete customer-data payloads.<\/p>\n<h3>Does shop_ttclid last 30 days in every browser?<\/h3>\n<p>No. Safari can remove script-writable storage after seven days of Safari use without interaction with the website; some cases involving tracking identifiers added to links have shorter limits. Server-set cookies provide no general bypass: WebKit also limits cookies when it detects a third-party service disguised through a DNS alias (CNAME) or an IP address that appears to belong to the site. Longer storage does not replace consent or extend an attribution window.<\/p>\n<h3>Must value and basket contents agree between both reports?<\/h3>\n<p>Yes. Both reports describe the same purchase. Consistent rules for tax, shipping, currency and products prevent contradictory revenue values. TikTok can supplement missing fields in an earlier report; conflicting values must not rely on an assumed priority for server data.<\/p><\/div>\n<div class=\"lw-quellen\"><h2>Sources<\/h2><ul><li><a href=\"https:\/\/business-api.tiktok.com\/gateway\/docs\/index?doc_id=1771100865818625&amp;identify_key=c0138ffadd90a955c1f0670a56fe348d1d40680b3c89461e09f78ed26785164b&amp;language=ENGLISH\" target=\"_blank\" rel=\"noopener noreferrer\">TikTok Events API 2.0: Web events<\/a><\/li><li><a href=\"https:\/\/business-api.tiktok.com\/gateway\/docs\/index?doc_id=1771100779668482&amp;identify_key=c0138ffadd90a955c1f0670a56fe348d1d40680b3c89461e09f78ed26785164b&amp;language=ENGLISH\" target=\"_blank\" rel=\"noopener noreferrer\">TikTok Events API 2.0<\/a><\/li><li><a href=\"https:\/\/ads.tiktok.com\/resources\/help\/article\/how-to-adopt-tiktoks-updated-standard-events?lang=en\" target=\"_blank\" rel=\"noopener noreferrer\">TikTok: Updated standard events<\/a><\/li><li><a href=\"https:\/\/ads.tiktok.com\/resources\/help\/article\/event-deduplication?lang=en\" target=\"_blank\" rel=\"noopener noreferrer\">TikTok: Event deduplication<\/a><\/li><li><a href=\"https:\/\/ads.tiktok.com\/resources\/help\/article\/tiktok-adobe-eapi-implementation-guide?lang=en\" target=\"_blank\" rel=\"noopener noreferrer\">TikTok: Adobe implementation guide<\/a><\/li><li><a href=\"https:\/\/ads.tiktok.com\/resources\/help\/article\/tiktok-tealium-eapi-implementation-guide?lang=en\" target=\"_blank\" rel=\"noopener noreferrer\">TikTok: Tealium test events<\/a><\/li><li><a href=\"https:\/\/ads.tiktok.com\/resources\/help\/article\/tiktok-events-manager-monitor-and-diagnose?lang=en\" target=\"_blank\" rel=\"noopener noreferrer\">TikTok: Events Manager monitoring<\/a><\/li><li><a href=\"https:\/\/webkit.org\/tracking-prevention\/\" target=\"_blank\" rel=\"noopener noreferrer\">WebKit: Tracking prevention<\/a><\/li><\/ul><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Pixel and Events API can report the same purchase. Duplicate detection requires matching pixel code, event name and event ID within 48 hours; consent and ad attribution need separate checks.<\/p>\n","protected":false},"author":1,"featured_media":13833,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[127],"tags":[91261,91386,91285,91516,91219],"class_list":["post-10128","post","type-post","status-publish","format-standard","hentry","category-tutorials-en-digital-marketing","tag-conversion-tracking","tag-marketing-cyfrowy-pl","tag-first-party-data","tag-tracking","tag-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Implementing the TikTok Events API for Online Shops | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Dual-channel TikTok tracking: the browser pixel and the server-side Events API sending the same purchase, tied by event_id so it counts once.\" \/>\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\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Implementing the TikTok Events API for Online Shops | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Dual-channel TikTok tracking: the browser pixel and the server-side Events API sending the same purchase, tied by event_id so it counts once.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-20T06:31:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T12:33:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10128-tutorial-implementing-the-tiktok-eve-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=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Implementing the TikTok Events API for Online Shops\",\"datePublished\":\"2026-09-20T06:31:00+00:00\",\"dateModified\":\"2026-10-26T12:33:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/\"},\"wordCount\":1314,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10128-tutorial-implementing-the-tiktok-eve-g.png\",\"keywords\":[\"Conversion Tracking\",\"Digital Marketing\",\"First-Party Data\",\"Tracking\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/\",\"name\":\"Tutorial: Implementing the TikTok Events API for Online Shops | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10128-tutorial-implementing-the-tiktok-eve-g.png\",\"datePublished\":\"2026-09-20T06:31:00+00:00\",\"dateModified\":\"2026-10-26T12:33:51+00:00\",\"description\":\"Dual-channel TikTok tracking: the browser pixel and the server-side Events API sending the same purchase, tied by event_id so it counts once.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10128-tutorial-implementing-the-tiktok-eve-g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10128-tutorial-implementing-the-tiktok-eve-g.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Implementing the TikTok Events API for Online Shops\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-implementing-the-tiktok-events-api-for-online-shops\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Implementing the TikTok Events API for Online Shops\"}]},{\"@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":"Tutorial: Implementing the TikTok Events API for Online Shops | Lukas Wojcik","description":"Dual-channel TikTok tracking: the browser pixel and the server-side Events API sending the same purchase, tied by event_id so it counts once.","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\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Implementing the TikTok Events API for Online Shops | Lukas Wojcik","og_description":"Dual-channel TikTok tracking: the browser pixel and the server-side Events API sending the same purchase, tied by event_id so it counts once.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-20T06:31:00+00:00","article_modified_time":"2026-10-26T12:33:51+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10128-tutorial-implementing-the-tiktok-eve-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Implementing the TikTok Events API for Online Shops","datePublished":"2026-09-20T06:31:00+00:00","dateModified":"2026-10-26T12:33:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/"},"wordCount":1314,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10128-tutorial-implementing-the-tiktok-eve-g.png","keywords":["Conversion Tracking","Digital Marketing","First-Party Data","Tracking","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/","name":"Tutorial: Implementing the TikTok Events API for Online Shops | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10128-tutorial-implementing-the-tiktok-eve-g.png","datePublished":"2026-09-20T06:31:00+00:00","dateModified":"2026-10-26T12:33:51+00:00","description":"Dual-channel TikTok tracking: the browser pixel and the server-side Events API sending the same purchase, tied by event_id so it counts once.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10128-tutorial-implementing-the-tiktok-eve-g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10128-tutorial-implementing-the-tiktok-eve-g.png","width":1200,"height":630,"caption":"Tutorial: Implementing the TikTok Events API for Online Shops"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-implementing-the-tiktok-events-api-for-online-shops\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Implementing the TikTok Events API for Online Shops"}]},{"@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\/10128","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=10128"}],"version-history":[{"count":7,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10128\/revisions"}],"predecessor-version":[{"id":27427,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10128\/revisions\/27427"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13833"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10128"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=10128"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}