API ugovor V1
Preporučujemo server-to-server API. JavaScript je samo opciona rezervna analitička opcija i radi tek nakon davanja analitičke saglasnosti.
API ugovor V1 Veza ka odeljku API ugovor V1
Preporučujemo server-to-server API. JavaScript je samo opciona rezervna analitička opcija i radi tek nakon davanja analitičke saglasnosti.
Narudžbine, prihod i izvedene metrike prikazuju se samo kada je merenje konverzija aktivno. Služe samo analitici i ne menjaju CPC obračun.
schema_version
1.0
payload_contract
order_v1
Content-Type
application/json
request_limit
64 KiB
Kako povezati merenje Veza ka odeljku Kako povezati merenje
Preporučujemo server-to-server API. JavaScript je samo opciona rezervna analitička opcija i radi tek nakon davanja analitičke saglasnosti.
- 1 Sačuvajte parametar zclid iz odredišnog URL-a uz korpu ili porudžbinu 30 dana.
- 2 Na serveru napravite stabilan HMAC-SHA-256 otisak internog ID-ja porudžbine pomoću zasebnog ključa. Ne šaljite sirovi ID niti lične podatke.
- 3 Nakon kreiranja porudžbine pošaljite JSON API-ju i potpišite tačno telo zahteva integracionim tajnim ključem.
- 4 Za plaćanje, otkazivanje i kumulativne povraćaje koristite isti zclid i order_id_hash. Ne menjajte konačne iznose ni stavke.
Integracioni tajni ključ prikazuje se samo jednom. Sačuvajte ga u upravljaču tajnama na serveru prodavnice.
Preporučeno: server-to-server API Veza ka odeljku Preporučeno: server-to-server API
Server prodavnice šalje verifikovane porudžbine, promene statusa i refundacije direktno u Zoneo. Tajni ključ nikada ne unosite u pregledač.
https://zoneo.rs/api/v1/conversions
https://zoneo.rs/api/v1/conversions/sandbox
Na serveru napravite stabilan HMAC-SHA-256 otisak internog ID-ja porudžbine pomoću zasebnog ključa. Ne šaljite sirovi ID niti lične podatke.
order_id_hash · PHP
$orderIdHash = hash_hmac(
'sha256',
"zoneo-order-v1\n".$internalOrderId,
$_ENV['ZONEO_ORDER_HASH_KEY'],
);
Primer zahteva Veza ka odeljku Primer zahteva
Nakon kreiranja porudžbine pošaljite JSON API-ju i potpišite tačno telo zahteva integracionim tajnim ključem.
order_v1 · JSON
{
"schema_version": "1.0",
"zclid": "018fb72a-7d8e-7c3c-a4da-f37ce07ad739",
"order_id_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"currency": "RSD",
"occurred_at": "2026-08-31T12:34:56Z",
"status": "placed",
"refund_amount_minor": 0,
"totals": {
"items_gross_minor": 14000,
"discount_minor": 1500,
"shipping_gross_minor": 390,
"fees_gross_minor": 100,
"tax_minor": 2165,
"order_total_gross_minor": 12990
},
"items": [
{
"merchant_item_id": "ITEM_ID_FROM_FEED",
"item_group_id": "MODEL-10",
"variant_id": "size:42",
"name": "PRODUCT_NAME",
"gtin": "8581234567890",
"quantity": 2,
"unit_price_gross_minor": 7000,
"line_total_gross_minor": 14000
}
],
"order_locale": "sr-latn",
"expected_delivery_date": "2026-09-03"
}
| JSON | Obavezna polja | V1 |
|---|---|---|
schema_version |
✓ | = "1.0" |
zclid |
✓ | UUID |
order_id_hash |
✓ | HMAC-SHA-256 · [a-f0-9]{64} |
currency |
✓ | ISO 4217 · RSD |
occurred_at |
✓ | ISO 8601 · UTC |
status |
✓ | placed | paid | cancelled | partially_refunded | refunded |
refund_amount_minor |
✓ | integer ≥ 0 · Σ · monotonic |
totals |
✓ | object · integer · gross |
items |
✓ | array[1..100] |
order_locale |
— | BCP 47 |
expected_delivery_date |
— | YYYY-MM-DD |
| items[] | Obavezna polja | V1 |
|---|---|---|
merchant_item_id |
✓ | feed.ITEM_ID · stable |
quantity |
✓ | integer · 1..1000 |
unit_price_gross_minor |
✓ | integer ≥ 0 |
line_total_gross_minor |
✓ | unit_price_gross_minor × quantity |
item_group_id |
— | string |
variant_id |
— | string |
name |
— | string · PRODUCT_NAME · PII = 0 |
gtin |
— | [0-9]{8,14} |
totals · RSD · integer
totals.items_gross_minor = sum(items[].line_total_gross_minor)
totals.order_total_gross_minor = totals.items_gross_minor - totals.discount_minor + totals.shipping_gross_minor + totals.fees_gross_minor
line_total_gross_minor = unit_price_gross_minor × quantity
Kanonski potpis Veza ka odeljku Kanonski potpis
Ako niste sačuvali prvobitni tajni ključ, izaberite Obnovi tajni ključ i novi ključ odmah bezbedno sačuvajte.
| HTTP | V1 |
|---|---|
Content-Type |
application/json |
X-Zoneo-Integration-ID |
zci_... |
X-Zoneo-Timestamp |
Unix · UTC |
X-Zoneo-Nonce |
CSPRNG · unique · len ≥ 16 |
Idempotency-Key |
order:{hash}:{status} |
X-Zoneo-Signature |
v1=HMAC_SHA256_HEX |
HMAC-SHA-256 · canonical request
UPPERCASE_HTTP_METHOD
/exact/request/path
unix_timestamp
nonce
idempotency_key
sha256_hex_of_exact_raw_body
body_hash = SHA256(raw_body)
signature = HMAC_SHA256(api_secret, canonical_request)
X-Zoneo-Signature = "v1=" + lowercase_hex(signature)
S2S · PHP
<?php
$path = '/api/v1/conversions';
$body = json_encode($payload, JSON_THROW_ON_ERROR | JSON_UNESCAPED_SLASHES);
$timestamp = time();
$nonce = bin2hex(random_bytes(16));
$idempotencyKey = 'order:'.$orderIdHash.':'.$payload['status'];
$canonical = implode("\n", [
'POST',
$path,
(string) $timestamp,
$nonce,
$idempotencyKey,
hash('sha256', $body),
]);
$signature = hash_hmac('sha256', $canonical, $_ENV['ZONEO_API_SECRET']);
$headers = [
'Content-Type: application/json',
'X-Zoneo-Integration-ID: '.$_ENV['ZONEO_INTEGRATION_ID'],
'X-Zoneo-Timestamp: '.$timestamp,
'X-Zoneo-Nonce: '.$nonce,
'Idempotency-Key: '.$idempotencyKey,
'X-Zoneo-Signature: v1='.$signature,
];
$curl = curl_init('https://zoneo.rs/api/v1/conversions');
curl_setopt_array($curl, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $body,
CURLOPT_TIMEOUT => 10,
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
curl_close($curl);
Primljena → Vraćena Veza ka odeljku Primljena → Vraćena
Za plaćanje, otkazivanje i kumulativne povraćaje koristite isti zclid i order_id_hash. Ne menjajte konačne iznose ni stavke.
order_v1 · lifecycle
placed -> paid | cancelled | partially_refunded | refunded
paid -> partially_refunded | refunded
partially_refunded -> refunded
cancelled, refunded -> terminal
0 <= refund_amount_minor <= totals.order_total_gross_minor
new_refund_amount_minor >= previous_refund_amount_minor
Idempotency-Key · retry
nonce₁ != nonce₂
retry = nonce₂ + Idempotency-Key₁ + SHA256(JSON₁)
Idempotency-Key₁ + SHA256(JSON₁) -> HTTP 200
Idempotency-Key₁ + SHA256(JSON₂) -> HTTP 409 idempotency_conflict
Sandbox V1 Veza ka odeljku Sandbox V1
Nalepite V1 JSON da bezbedno proverite polja, iznose i povezivanje sa fidom bez kreiranja narudžbine ili uticaja na naplatu.
https://zoneo.rs/api/v1/conversions/sandbox
Opciono merenje putem JavaScript-a Veza ka odeljku Opciono merenje putem JavaScript-a
Biblioteka nakon pristanka čuva zclid i šalje samo početni događaj placed sa stranice zahvalnosti. Kasnije statuse šaljite bezbedno putem S2S-a.
Saglasnost je podrazumevano isključena. Funkcija consent mora da vrati true tek nakon važeće analitičke saglasnosti korisnika.
Učitavanje i inicijalizacija
<script src="https://zoneo.rs/integrations/zoneo-conversion-v1.js"></script>
<script>
const zoneo = window.ZoneoConversions.init({
integrationId: 'zci_...',
apiBase: 'https://zoneo.rs/api/v1/conversions',
consent: () => analyticsConsent === true
})
zoneo.track({
order_id_hash: 'SERVER_HMAC_SHA256',
currency: 'RSD',
occurred_at: new Date().toISOString(),
status: 'placed',
totals: {
items_gross_minor: 12990,
discount_minor: 0,
shipping_gross_minor: 0,
fees_gross_minor: 0,
tax_minor: 2165,
order_total_gross_minor: 12990
},
items: [{
merchant_item_id: 'ITEM_ID_FROM_FEED',
quantity: 1,
unit_price_gross_minor: 12990,
line_total_gross_minor: 12990
}]
})
</script>
Stanje integracije Veza ka odeljku Stanje integracije
Prihvaćeni i odbijeni događaji u poslednjih 7 dana.
HTTP 201 · JSON
{
"data": {
"conversion_reference": "6bfca33e-3ac7-48dc-a733-c1f313853269",
"status": "placed",
"source": "s2s",
"verification": "hmac_current",
"schema_version": "1.0",
"payload_contract": "order_v1",
"totals": {
"items_gross_minor": 14000,
"discount_minor": 1500,
"shipping_gross_minor": 390,
"fees_gross_minor": 100,
"tax_minor": 2165,
"order_total_gross_minor": 12990
},
"refund_amount_minor": 0,
"net_revenue_minor": 12990,
"items": {
"count": 1,
"quantity_total": 2,
"matched_count": 1,
"match_status": "complete"
},
"totals_reconciled": true,
"warnings": [],
"currency": "RSD",
"created": true,
"idempotent": false,
"deduplicated": false,
"provisional": false,
"billing_impact": false
}
}
HTTP 4xx · JSON
{
"error": {
"code": "order_total_mismatch",
"field": "totals.order_total_gross_minor",
"details": {
"expected_minor": 12990,
"received_minor": 13000
}
}
}
invalid_signature
stale_timestamp
replayed_nonce
pii_not_allowed
items_total_mismatch
order_total_mismatch
currency_mismatch
click_not_eligible
store_or_market_mismatch
not_last_zoneo_click
attribution_window_expired
invalid_state_transition
order_definition_conflict
refund_amount_decreased
order_attribution_conflict
Zaštita ličnih podataka Veza ka odeljku Zaštita ličnih podataka
Najnovije narudžbine koje je Zoneo primio samo za analitiku. Izvorni brojevi i lični podaci se ne prikazuju.
Na serveru napravite stabilan HMAC-SHA-256 otisak internog ID-ja porudžbine pomoću zasebnog ključa. Ne šaljite sirovi ID niti lične podatke.
Narudžbine, prihod i izvedene metrike prikazuju se samo kada je merenje konverzija aktivno. Služe samo analitici i ne menjaju CPC obračun.
Kako povezati merenje
Preporučujemo server-to-server API. JavaScript je samo opciona rezervna analitička opcija i radi tek nakon davanja analitičke saglasnosti.