Server-to-Server (S2S) měření
Pokročilé měření, kdy data odesíláte přímo z vašeho serveru na Sklik endpoint.
S2S je vhodné pro weby, kde potřebujete maximální přesnost bez závislosti na cookies třetích stran. Lze jej využít také pro měření konverzí z mobilních aplikací nebo pro zasílání offline konverzí.
Frontendový skript (sul.js) je povinný i pro S2S
I při S2S měření musí být na webu nasazen frontendový skript sul.js s vaším SEM ID. Ten vytvoří cookies sid a udid, které musíte přečíst a předat v každém S2S requestu. Samotný S2S payload pak obsahuje SEM ID (parametr sem_id) – to je jiný identifikátor. Bez cookies ze sul.js nelze správně spárovat uživatelskou identitu.
Předpoklady
- Nasazený frontendový skript na všech stránkách webu (generuje cookies
sidaudid) - Možnost číst cookies
sidaudidze serveru - Schopnost hashovat osobní data SHA-256 na serveru
- SEM ID pro S2S – speciální identifikátor určený výhradně pro S2S měření. Liší se od běžného SEM ID (pro skript a GTM). Viz Kde najdu SEM ID? Pokud máte provozovny Zboží.cz, každá provozovna má vlastní SEM ID pro S2S.
Endpoint
Všechny S2S requesty odesílejte jako POST na:
POST https://sem.seznam.cz/rtgconv
Content-Type: application/json
HTTP hlavičky
| Hlavička | Povinnost | Popis |
|---|---|---|
Content-Type | Povinná | Vždy application/json |
X-Client-Id | Doporučená | Název vaší aplikace nebo knihovny, která data odesílá (např. muj-eshop-plugin, shoptet-sem) |
X-Client-Version | Doporučená | Verze aplikace (např. 1.4.2) |
Proč uvádět X-Client-Id a X-Client-Version?
Tyto hlavičky nám pomáhají při debugování problémů na vaší straně – rychle dohledáme, z jaké aplikace a verze data přišla. Nemají vliv na zpracování eventů, ale výrazně zrychlují diagnostiku.
Identifikace uživatele
S2S payload musí obsahovat cookies sid a udid vygenerované frontendovým skriptem. Přečtěte je na frontendu a předejte na server, odkud je zařadíte do objektu user_ids.user_data.
sid a udid vyžadují souhlas uživatele
Cookie sid a udid jsou frontendovým skriptem zapsány až po přijetí souhlasu s ad_storage: 'granted'. Ujistěte se, že na webu předáváte souhlas metodou updateConsent (nebo využíváte IAB TCF) před prvním PageView – jinak cookies nebudou k dispozici a párování uživatelské relace nebude možné. Více viz Nastavení souhlasu.
function getCookie(name) {
const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));
return match ? decodeURIComponent(match[1]) : null;
}
const sid = getCookie('sid'); // předat na server jako user_ids.user_data.sid
const udid = getCookie('udid'); // předat na server jako user_ids.user_data.udid
Dalším klíčovým identifikátorem je sznaiid – proklikové ID ze Skliku. Tato hodnota se nachází v URL parametru po prokliku z inzerátu a slouží pro anonymní modelování konverzí. Lze ji bezpečně uložit na serveru i bez souhlasu uživatele.
Hashujte osobní data před odesláním
Na rozdíl od frontendového skriptu, který hashuje automaticky, při S2S musíte vy sami zahashovat algoritmem SHA-256 všechna osobní data: em, ph, fn, ln, ge, db, ct, zp, sr, country. Výjimka: review_email se nesmí hashovat ani při S2S.
Struktura payloadu
| Parametr | Typ | Povinnost | Popis |
|---|---|---|---|
schema_version | string | Povinný | Vždy "v2" |
event_name | string | Povinný | Název události, např. "Purchase" |
event_type | string | Povinný | Vždy "rtgconv" |
event_time | integer | Povinný | Unix timestamp v milisekundách (UTC) |
event_url | string | Povinný | URL stránky, kde událost nastala |
event_source | string | Povinný | "web" nebo "app" |
event_id | string | Doporučený | Unikátní ID eventu (ideálně UUID-7) pro deduplikaci |
user_ids | object | Povinný | Objekt s identifikátory uživatele (viz níže) |
event_data | object | Povinný | Data události – stejná struktura jako u frontendového měření (viz Reference událostí) + parametry sem_id a sznaiid |
consent_string | string | Doporučený | IAB TCF consent string (pokud k dispozici) |
consent_mode | object | Doporučený | Google Consent Mode (alternativa k TCF) |
s2s_headers | object | Doporučený | IP adresa a User Agent pro přesnější identifikaci |
Objekt user_ids.user_data
| Parametr | Popis | Hashovat? |
|---|---|---|
sid | Session cookie ze seznamu.cz – číst z prohlížeče | Ne |
udid | Session cookie generovaná sul.js | Ne |
em | E-mail uživatele (klíčový identifikátor) | Ano (SHA-256) |
ph | Telefonní číslo | Ano (SHA-256) |
fn | Jméno | Ano (SHA-256) |
ln | Příjmení | Ano (SHA-256) |
ge | Pohlaví (m, f nebo o) | Ano (SHA-256) |
db | Datum narození (formát YYYYMMDD) | Ano (SHA-256) |
ct | Město | Ano (SHA-256) |
zp | PSČ | Ano (SHA-256) |
sr | Ulice a číslo popisné | Ano (SHA-256) |
country | Kód země (ISO 3166-1 alpha-2, např. cz) | Ano (SHA-256) |
Speciální parametry v event_data pro S2S
| Parametr | Povinnost | Popis |
|---|---|---|
sem_id | Povinný pro S2S | SEM ID pro S2S – samostatný identifikátor viditelný po zapnutí pokročilého nastavení. Odlišný od SEM ID pro skript/GTM. |
sznaiid | Doporučený | Proklikové ID ze Skliku – URL parametr po kliknutí na inzerát. Slouží pro anonymní modelování konverzí. |
Kompletní příklad payloadu
{
"schema_version": "v2",
"event_source": "web",
"event_name": "Purchase",
"event_type": "rtgconv",
"event_time": 1770134113676,
"event_id": "018e4f2a-1234-7abc-9def-0123456789ab",
"event_url": "https://vas-eshop.cz/dekujeme",
"user_ids": {
"user_data": {
// Cookies ze sul.js – číst z prohlížeče (nehashovat)
"sid": "id=1922397029101872874|t=1737450723.526|te=1756971615.061|c=0F247CCA",
"udid": "01958f34-71d5-7ec2-ae01-cb3c80a1d0a0",
// Osobní data – hashovat SHA-256 na serveru
"em": "6db68d052788e70eb459463eb34370fe983ef838db65641902f02326fabc37a7",
"ph": "ca6faa7abf120a739e8ce3bcf581553af9ad983b3290ed8cdf8cc40b9d4fefcf",
"fn": "6a0ac0fd972c325d6ca5512b67a5e0ad996c4a3e9b59971d125164e6d4db1a1c",
"ln": "64118260ecb916c23621d8f2768d8dc75d1f5710b1b7e4f2c41ad41e6bc4d688",
"ct": "f377db9f1f0af132866afd5c4381512a5c9a3b3a32e9ca2f88f0aced18264568"
}
},
"consent_mode": {
"ad_storage": "granted",
"ad_user_data": "granted",
"ad_personalization": "granted",
"functionality_storage": "denied",
"analytics_storage": "denied"
},
"s2s_headers": {
"client_ip_address": "77.75.74.172",
"user_agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36...",
"sec_ch_ua_mobile": "?0",
"sec_ch_ua_platform": "\"Windows\""
},
"event_data": {
"sem_id": "VASE_SEM_ID_PRO_S2S",
"sznaiid": "2627214859780792651",
"order_id": "OBJ-987654",
"content_type": "product",
"currency": "CZK", // podporováno pouze CZK
"value": 27364, // celková hodnota bez DPH (v CZK)
"value_tax": 5746,
"delivery_type": "CESKA_POSTA",
"delivery_price": 121, // s DPH
"other_costs": -500, // sleva s DPH
"payment_type": "karta",
"contents": [
{
"id": "ABC12345",
"quantity": 1,
"unit_price": 33490, // s DPH
"content_name": "iPhone 15 Pro Max",
"content_category": "Elektronika | Mobilní telefony | Apple"
}
]
}
}
Odeslání requestu
Payload odešlete HTTP POST requestem na endpoint https://sem.seznam.cz/rtgconv s hlavičkou Content-Type: application/json.
curl -X POST https://sem.seznam.cz/rtgconv \
-H "Content-Type: application/json" \
-H "X-Client-Id: vas-eshop-plugin" \
-H "X-Client-Version: 1.0.0" \
-d '{ ... váš payload ... }'
await fetch('https://sem.seznam.cz/rtgconv', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Client-Id': 'vas-eshop-plugin',
'X-Client-Version': '1.0.0',
},
body: JSON.stringify(payload)
});
import requests
response = requests.post(
'https://sem.seznam.cz/rtgconv',
json=payload,
headers={
'X-Client-Id': 'vas-eshop-plugin',
'X-Client-Version': '1.0.0',
}
)
response.raise_for_status()
Ošetření chyb a doporučení
| HTTP status | Význam | Doporučená reakce |
|---|---|---|
200 OK | Event přijat a zpracován | – |
400 Bad Request | Neplatný payload – chybí povinné pole nebo špatný formát | Opravit payload, neopakovat automaticky |
401 / 403 | Neplatné SEM ID nebo nepřístupný endpoint | Zkontrolovat SEM ID pro S2S |
5xx | Chyba na straně serveru | Opakovat s exponenciálním backoffem (viz níže) |
Retry strategie
Při chybách 5xx nebo síťovém timeoutu doporučujeme opakovat request s exponenciálním backoffem: 1 s → 2 s → 4 s, maximálně 3 pokusy. Chyby 4xx neopakujte – signalizují problém v payloadu, ne přechodný výpadek.
Timeout
Nastavte timeout requestu na 3–5 sekund. S2S volání nesmí blokovat zpracování objednávky na vašem serveru – odesílejte eventy asynchronně (např. ve frontě na pozadí).