← veridyn.eu
HU EN DE

Fejlesztői API v1

veridyn

Programozott hozzáférés a termékútlevelekhez — webshop/ERP-szinkronhoz, tömeges automatizáláshoz.

Pro csomagtól

A nyílt béta alatt az API minden béta-fióknak elérhető — a Pro-korlát a béta után lép életbe.

Hitelesítés

Minden kérés API-kulccsal hitelesít, Authorization fejlécben:

Authorization: Bearer vk_<a kulcsod>

Kulcsot a Beállítások → Fejlesztői API alatt hozol létre. A nyílt kulcsot csak egyszer, létrehozáskor mutatjuk meg — tárold biztonságos helyen. A kulcs a teljes fiókod termékeihez ad írási/olvasási hozzáférést, ezért kezeld titkosan.

Gyors teszt böngészőben

A kulcs kizárólag az Authorization fejlécben megy — biztonsági okból nem URL-paraméterként (az bekerülne a böngésző-előzménybe és a szerver-logokba). Próbáld ki például curl-lel:

curl -H "Authorization: Bearer vk_<a kulcsod>" https://veridyn.eu/api/v1/categories

Kulcs-hatókör (scope)

Kulcs létrehozásakor hatókört választasz: Teljes (olvasás + írás) vagy Csak olvasás (read-only). A read-only kulcs kizárólag GET-et hívhat — POST/PATCH/DELETE esetén a válasz 403 read_only. ERP- vagy megjelenítő-integrációhoz használj read-only kulcsot.

Kérés-korlát (rate limit)

Kulcsonként, csomagtól függően 120–600 kérés / perc (Pro 120 · Business 300 · Enterprise 600; a nyílt béta alatt 300). Minden válasz tartalmazza az X-RateLimit-Limit, X-RateLimit-Remaining és X-RateLimit-Reset (unix idő) fejléceket. A limit átlépésekor a válasz 429 rate_limited, Retry-After fejléccel — várd meg a jelzett időt, majd próbáld újra.

Idempotencia

A POST kérésekhez adhatsz egy egyedi Idempotency-Key fejlécet. Ha ugyanazzal a kulccsal újraküldöd (pl. hálózati hiba után), a korábbi választ kapod vissza — nem jön létre duplikátum. A visszajátszott választ az Idempotency-Replayed: true fejléc jelzi.

OpenAPI

Gépi olvasható API-leírás (OpenAPI 3.1) — Postman-importhoz, SDK-/kód-generáláshoz:

https://veridyn.eu/api/v1/openapi.json

⚡ Interaktív API-referencia

Böngészhető, kereshető végpont-referencia — közvetlenül a fenti specből renderelve.

DPP-szótár (JSON-LD névtér)

A publikus útlevél gépi változata JSON-LD: a szabványos mezők schema.org-ról jönnek, a DPP-specifikus mezők pedig a dpp: névtérből. Ez a névtér feloldható — megnyitva megnézheted, mit jelent minden mező, Accept: application/ld+json fejléccel pedig a gépi @context dokumentumot adja.

https://veridyn.eu/ns/dpp/v1/

Egy útlevél gépi változata: a publikus URL ?format=jsonld paraméterrel (vagy Accept: application/ld+json fejléccel).

Postman-kollekció

Kész, importálható gyűjtemény (előre beállított változókkal + példa-kérésekkel). Import után csak töltsd ki a base_url és api_key gyűjtemény-változókat.

⬇ Postman-kollekció letöltése

Generálj saját SDK-t

Az OpenAPI-specből bármely nyelvre generálhatsz hivatalos klienst az openapi-generator-ral — nincs kézzel karbantartott SDK, mindig naprakész. Pl. PHP:

npx @openapitools/openapi-generator-cli generate \
  -i https://veridyn.eu/api/v1/openapi.json \
  -g php -o ./veridyn-sdk

A -g értéke lehet typescript-fetch, python, java és sok más.

Gyorsindító (kód)

PHP

$ch = curl_init('https://veridyn.eu/api/v1/products?limit=5');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER     => ['Authorization: Bearer vk_...'],
]);
$products = json_decode(curl_exec($ch), true)['data'];

JavaScript (fetch)

const res = await fetch('https://veridyn.eu/api/v1/products?limit=5', {
  headers: { 'Authorization': 'Bearer vk_...' }
});
const { data } = await res.json();

Alap-URL

https://veridyn.eu/api/v1

A válaszok application/json formátumúak, UTF-8 kódolással.

Sandbox (teszt-fiók)

Integrációt nem az éles fiókon szokás fejleszteni. A Beállítások → Sandbox alatt kérhetsz egy külön teszt-fiókot saját API-kulccsal: ugyanaz az API, ugyanazok a sémák, de az éles adatoktól teljesen elszigetelve.

Végpontok

MetódusÚtvonalLeírás
GET/categoriesElérhető termékkategóriák.
GET/schema/{category}A kategória teljes mezőlistája — kötelező + opcionális, típus, enum, nyelvi mezők.
GET/productsTermékek listája (összefoglaló). Paraméterek: q, status, page, limit — illetve updated_since és cursor a csak-a-változások szinkronhoz.
POST/productsÚj termékútlevél. Törzs: { category, data }.
POST/products:batchTömeges létrehozás — legfeljebb 500 termék egy kérésben. Törzs: { category, products: [ … ], on_duplicate? }. Soronkénti riportot ad.
GET/products/{id}Egy termék teljes adata + passport-URL.
PATCH/products/{id}Frissítés (részleges) — új verziót hoz létre. Törzs: { data, change_type? }. A change_type opcionális: correction (a modellen volt rossz adat → a már kiadott tétel-/darab-útlevelek elavulnak, frissíthetők) vagy change (a termék változott adott dátumtól → a korábbi darabok adata helyes marad, nem írjuk felül).
GET/products/{id}/qrQR-kód (SVG) a publikus passporthoz.
GET/eventsA kimenő webhook-események története (?after_id= & limit=) — duplikátum-szűréshez és kimaradt események pótlásához.
GET/products/{id}/childrenA tétel/egység gyerek-útlevelek listája.
POST/products/{id}/childrenTétel/egység útlevél. Egy: { level, lot|serial, data } · tömeges: { level, items:[…] } (max 500). Örökli a szülő adatait.
PATCH/products/{id}/childrenGyerek-útlevelek tömeges frissítése (max 500): { items:[{ serial|lot|id, data }] }. Élő BMS-adathoz — soronkénti riporttal.
POST/products/{id}/archive
/products/{id}/restore
Archiválás és visszaállítás. Szándékosan nem PATCH: a láthatóság-váltás nem adat-változás, ezért nem gyárt üres verziót a változás-történetbe. Törzs nem kell.
GET/products/{id}/versions
/products/{id}/versions/{no}
A változás-történet: a verziók listája, illetve egy adott verzió mező-szintű különbsége (mi változott, miről mire).
GET
POST
DELETE
/products/{id}/grants
/products/{id}/grants/{gid}
Lejáró hozzáférési linkek hatóságnak / jogos érdekű félnek — a bizalmas mezőkhöz bejelentkezés nélkül. DELETE visszavon.
GET
POST
DELETE
/products/{id}/documents
/products/{id}/documents/{docId}
Tanúsítványok és dokumentumok. Feltöltés base64-ben (PDF, PNG, JPEG, WebP), letöltés a fájllal, törlés. A darab-azonosítós GET a fájlt adja, nem JSON-t.
GET
POST
/supplier-requestsBeszállítói adatbekérések: lista és indítás. A válasz tartalmazza a beszállítói linket.
GET
POST
DELETE
/supplier-requests/{rid}
/supplier-requests/{rid}/merge
Egy adatbekérés a beküldött értékekkel, a beküldés beolvasztása (új termék-verzió), illetve visszavonás.
POST/eo/tokenRövid életű JWT a szabvány szerinti gazdasági-szereplő felülethez. Törzs: { ttl? }.
GET/products/{id}/scansTermék-szintű beolvasás-összegző: total, unique, byCountry, byDevice. Paraméter: days=7|30|90|365.
GET/products/{id}/batterypassAz akkumulátor-útlevél CEN-CENELEC JTC24 (BatteryPass) alakban. Paraméter: profile=feb27|full — a feb27 a 2027-02-18-tól kötelező szűkebb halmaz, a full a teljes adatmodell. Csak battery kategóriára.
GET/scansBérlő-szintű beolvasás-összegző: a fentiek + byCategory, byLevel.

Mit kell megadni? (kötelező vs. opcionális)

Minden kategóriának van egy kötelező magja — enélkül a séma-validáció elutasít (422). Minden más mező opcionális, de bármikor beküldheted ugyanabban a data objektumban (több adat = jobb passport + jövőbiztosabb megfelelés). A pontos, gépi mezőlistát a /schema/{category} adja — required: true/false, típus, enum és localized jelöléssel.

curl https://veridyn.eu/api/v1/schema/textile \
  -H "Authorization: Bearer vk_<kulcs>"

Összes mező kategóriánként

✓ = kötelező · — = opcionális · ↳ beágyazott al-mező · 🌐 nyelvenkénti (localized) · 🔒 csak hatósági szinten látszik. Ez a lista a sémából generálódik — mindig naprakész.

textile Textil és ruházat20 mező

MezőTípusKöt.Leírás
productNamestring✓Terméknév — A termék neve, ahogy a vásárló a passporton látni fogja.
skustring✓SKU — Belső cikkszám / azonosító — a te rendszeredből.
brandNamestring✓Márkanév
gtinstring—GTIN (opcionális) — A vonalkód száma (GTIN-8/12/13/14). Az ellenőrzőszámot a rendszer validálja. Ha nincs, hagyd üresen.
commodityCodestring—Árukód (CN/HS, opcionális) — Vám-/tarifális besorolás: Kombinált Nómenklatúra (CN, 8 számjegy) vagy HS-kód. Az EU DPP-regiszter kötelező metaadata a regisztrációkor — a szállítói/vámpapírokon szerepel.
economicOperatorobject✓Gazdasági szereplő
  ↳ rolestring (enum)✓Szerep — Ki teszi a terméket az EU-piacra és felel érte. A legtöbb gyártónál: Gyártó. (manufacturer · importer · authorized_representative · distributor · dealer · fulfilment_service_provider)
  ↳ legalNamestring✓Jogi név
  ↳ addressstring✓Cím
  ↳ countrystring✓Ország (ISO 3166-1 alpha-2) — Kétbetűs ISO országkód, nagybetűvel — pl. HU, DE, IT
  ↳ contactEmailstring✓Kapcsolati e-mail — Ide fordulhat a vásárló vagy a hatóság.
  ↳ operatorId 🔒string—Egyedi szereplő-azonosító (GS1 GLN) — 13 jegyű GS1 GLN — EU DPP egyedi gazdasági szereplő-azonosító. Csak hatósági hozzáférési szinten látszik. Ha nincs, hagyd üresen.
  ↳ eori 🔒string—EORI-szám — A gazdasági szereplő EORI-száma (vám / EU DPP-nyilvántartási azonosító) — a registry ez alapján azonosít. Csak hatósági hozzáférési szinten látszik. Ha nincs, hagyd üresen.
languagesarray[string]✓Nyelvek (BCP-47) — Mely nyelveken jelenjen meg a passport. A lokalizált mezőket (ápolás, életciklus) minden itt felsorolt nyelven ki kell tölteni. pl. hu, en
fiberCompositionarray[object]✓Rost-összetétel — Miből készült a termék. A százalékok összege pontosan 100 legyen. pl. pamut 95 + elasztán 5
  ↳ fiberstring✓Rost
  ↳ percentagenumber✓Százalék
recycledContentPercentagenumber—Újrahasznosított tartalom — Az újrahasznosított anyag aránya a termékben. Ha nem releváns, hagyd üresen.
countryOfManufacturestring✓Gyártás országa (ISO) — Ahol a végtermék készült. Kétbetűs ISO kód, pl. PT, TR, HU
supplyChainStagesarray[object]—Ellátási lánc állomásai — Hol készült melyik munkafázis (fonás, szövés, festés, összeszerelés…). Opcionális, de növeli a bizalmat. A fázis és az ország nyilvános; az üzem neve és azonosítója védett — csak jogos érdekű fél (és hatóság) látja, token-linkkel.
  ↳ stagestring (enum)✓Fázis (spinning · weaving · knitting · dyeing · finishing · assembly)
  ↳ countrystring✓Ország (ISO)
  ↳ facilityName 🔒string—Üzem neve
  ↳ facilityId 🔒string—Egyedi telephely-azonosító (GS1 GLN)
careInstructions 🌐object✓Ápolási útmutató — Mosás, szárítás, vasalás — nyelvenként egy-egy szöveg.
repairobject✓Javíthatóság — Javítható-e, és hogyan. A „javítható” és „alkatrész elérhető” mezők kötelezőek.
  ↳ repairableboolean✓Javítható
  ↳ instructions 🌐object—Javítási útmutató — Hogyan javítható — nyelvenként (opcionális).
  ↳ sparePartsAvailableboolean✓Alkatrész elérhető (pl. gomb, cipzár)
substancesOfConcernarray[object]—Aggályos anyagok — Aggályos anyagok (pl. REACH SVHC), ha a termékben jelen vannak. A legtöbb terméknél üresen hagyható.
  ↳ namestring✓Megnevezés
  ↳ casNumberstring—CAS-szám
  ↳ concentrationRangestring—Koncentráció-tartomány
durabilityobject—Tartósság — Tartóssági adatok, ha van mérésed (opcionális).
  ↳ testResultsstring—Teszteredmények
  ↳ pefScorenumber—PEF pontszám — Product Environmental Footprint pontszám, ha van. (opcionális)
carbonFootprintnumber—Szénlábnyom (kg CO₂e) — A termék teljes szénlábnyoma kg CO₂-egyenértékben. Az „Impact” témában „≈ km autóval” összevetéssel jelenik meg.
waterFootprintnumber—Vízlábnyom (liter) — A gyártáshoz felhasznált víz mennyisége literben. Opcionális.
weightGramsnumber—Tömeg (gramm) — A termék tömege grammban. Opcionális.
endOfLifeobject✓Életciklus vége — Mi legyen a termékkel a használat után — nyelvenként kitöltve.
  ↳ recyclingInstructions 🌐object✓Újrahasznosítási útmutató — Hogyan hasznosítható újra — nyelvenként.
  ↳ disposalInstructions 🌐object✓Ártalmatlanítási útmutató — Ha nem újrahasznosítható — nyelvenként.
complianceDocumentsarray[object]—Megfelelőségi dokumentumok — Tanúsítványok, megfelelőségi dokumentumok linkjei (opcionális). pl. OEKO-TEX, GOTS.
  ↳ typestring✓Típus
  ↳ urlstring✓URL

battery Akkumulátor105 mező

MezőTípusKöt.Leírás
productNamestring✓Terméknév — Az akkumulátor neve, ahogy a vásárló a passporton látni fogja.
skustring✓SKU — Belső cikkszám / azonosító — a te rendszeredből.
brandNamestring✓Márkanév
gtinstring—GTIN (opcionális) — A vonalkód száma (GTIN-8/12/13/14). Az ellenőrzőszámot a rendszer validálja. Ha nincs, hagyd üresen.
commodityCodestring—Árukód (CN/HS, opcionális) — Vám-/tarifális besorolás: Kombinált Nómenklatúra (CN, 8 számjegy) vagy HS-kód. Az EU DPP-regiszter kötelező metaadata a regisztrációkor — a szállítói/vámpapírokon szerepel.
economicOperatorobject✓Gazdasági szereplő
  ↳ rolestring (enum)✓Szerep — Ki teszi a terméket az EU-piacra és felel érte. A legtöbb gyártónál: Gyártó. (manufacturer · importer · authorized_representative · distributor · dealer · fulfilment_service_provider)
  ↳ legalNamestring✓Jogi név
  ↳ addressstring✓Cím
  ↳ countrystring✓Ország (ISO 3166-1 alpha-2) — Kétbetűs ISO országkód, nagybetűvel — pl. HU, DE, IT
  ↳ contactEmailstring✓Kapcsolati e-mail — Ide fordulhat a vásárló vagy a hatóság.
  ↳ operatorId 🔒string—Egyedi szereplő-azonosító (GS1 GLN) — 13 jegyű GS1 GLN — EU DPP egyedi gazdasági szereplő-azonosító. Ha nincs, hagyd üresen.
  ↳ eori 🔒string—EORI-szám — A gazdasági szereplő EORI-száma (vám / EU DPP-nyilvántartási azonosító) — a registry ez alapján azonosít. Csak hatósági hozzáférési szinten látszik. Ha nincs, hagyd üresen.
languagesarray[string]✓Nyelvek (BCP-47) — Mely nyelveken jelenjen meg a passport. A lokalizált mezőket (biztonság, életciklus) minden itt felsorolt nyelven ki kell tölteni. pl. hu, en
batteryCategorystring (enum)✓Akkumulátor-kategória — Az (EU) 2023/1542 szerinti kategória. A kötelező útlevél elsőként az EV, az ipari (>2 kWh) és az LMT akkukra vonatkozik (2027. február 18.). (portable · lmt · ev · industrial · sli)
cellChemistrystring (enum)✓Cellakémia — Az akkumulátor cellakémiai típusa. A lista a CEN-CENELEC JTC24 kódlistáját követi; az „LTO" és az „Egyéb" nincs benne a hivatalos listában, ezekkel a BatteryPass-regisztráció elakadhat. (nmc · nca · lfp · lmo · lto · nimh · lead_acid · sodium_ion …)
weightKgnumber✓Tömeg (kg) — Az akkumulátor tömege kilogrammban.
countryOfManufacturestring✓Gyártás országa (ISO) — Ahol az akku készült. Kétbetűs ISO kód, pl. DE, HU, CN
manufacturingDatestring✓Gyártás dátuma — A gyártás pontos dátuma ISO formátumban (ÉÉÉÉ-HH-NN). A JTC24 adatmodell teljes dátumot vár — év vagy év-hónap megadásával a BatteryPass-regisztráció elakad.
ratedCapacitynumber✓Névleges kapacitás (Ah) — Névleges kapacitás amperóra (Ah).
energyWhnumber—Energia (Wh) — Teljes energiatartalom wattórában (Wh). Opcionális.
nominalVoltagenumber—Névleges feszültség (V) — Névleges feszültség voltban. Opcionális.
expectedLifetimeCyclesnumber—Várható élettartam (töltési ciklus) — A garantált / várható teljes töltési ciklusok száma. A BatteryPass egész számot vár, ezért a JTC24-exportban a tört érték kerekítve jelenik meg. Opcionális.
stateOfHealth 🔒number—Állapot — State of Health — Az akku egészségi állapota az eredeti kapacitás %-ában (új akkunál 100). DARAB-SPECIFIKUS és dinamikus — ideális helye az egység-szint (nem a modell-template). Opcionális.
remainingCapacity 🔒number—Maradék kapacitás (Ah) — A darab jelenlegi kapacitása — a névlegessel szemben ez fogy az idővel. Az LMT-profil KÖTELEZŐVÉ teszi, az EV nem.
remainingPowerAt80Soc 🔒number—Maradék teljesítmény 80% töltöttségnél (W) — Az eredeti teljesítmény párja: a MOSTANI érték 80%-os töltöttségnél.
remainingPowerAt20Soc 🔒number—Maradék teljesítmény 20% töltöttségnél (W) — Ugyanaz 20%-os töltöttségnél. A JTC24 mindkettőt együtt kéri.
minimumVoltagenumber—Minimális feszültség (V) — A legkisebb feszültség, amelyen az akkumulátor még üzemel.
maximumVoltagenumber—Maximális feszültség (V) — A legnagyobb megengedett üzemi feszültség.
originalPowerAt80Socnumber—Eredeti teljesítmény 80% töltöttségnél (W) — A JTC24 az eredeti teljesítményt KÉT töltöttségi szinten kéri; ez a 80%-os érték.
originalPowerAt20Socnumber—Eredeti teljesítmény 20% töltöttségnél (W) — Az eredeti teljesítmény 20%-os töltöttségnél. A 80%-os párjával együtt kötelező a JTC24-ben.
maximumPermittedBatteryPowernumber—Maximálisan megengedett teljesítmény (W) — A gyártó által engedélyezett csúcsteljesítmény.
initialRoundTripEfficiencynumber—Kezdeti körfolyamat-hatásfok (%) — A visszanyert és a betöltött energia aránya új állapotban.
roundTripEfficiencyAt50PctCycleLifenumber—Körfolyamat-hatásfok a ciklusélettartam 50%-ánál (%) — Ugyanaz a hatásfok a névleges ciklusszám felénél — ebből látszik a romlás üteme.
initialInternalResistanceCellnumber—Kezdeti belső ellenállás — cella (Ω) — A JTC24 a belső ellenállást CELLA- és PACK-szinten külön kéri; ez a cella-érték.
initialInternalResistancePacknumber—Kezdeti belső ellenállás — pack (Ω) — A teljes akkumulátorcsomag kezdeti belső ellenállása.
cycleLifeReferenceTeststring—Ciklusélettartam referencia-teszt — Melyik szabvány szerinti teszt adta a ciklusszámot.
cRateOfCycleLifeTestnumber—A ciklusteszt C-rátája (A/Ah) — A teszt töltési/kisütési árama a kapacitáshoz mérve. SZÁMOT várunk: az 1C nálunk 1.
capacityThresholdForExhaustionnumber—Kimerülési küszöb (%) — Az eredeti kapacitás hány %-a alatt tekintendő az akkumulátor kimerültnek.
temperatureRangeIdleLowernumber—Üzemszüneti hőmérséklet — alsó határ (°C) — A legalacsonyabb hőmérséklet, amelyet az akkumulátor használaton kívül elvisel. Lehet negatív.
temperatureRangeIdleUppernumber—Üzemszüneti hőmérséklet — felső határ (°C) — A legmagasabb hőmérséklet, amelyet az akkumulátor használaton kívül elvisel.
stateOfChargeSoC 🔒number—Töltöttségi szint — SoC (%) — A pillanatnyi töltöttség. DARAB-SPECIFIKUS és folyamatosan változik.
stateOfCertifiedEnergy 🔒number—Tanúsított energia állapota — SOCE (%) — A még hozzáférhető energia a tanúsított energiához mérve.
capacityFade 🔒number—Kapacitás-csökkenés (%) — Mennyit vesztett az akkumulátor az eredeti kapacitásából.
powerFade 🔒number—Teljesítmény-csökkenés (%) — Mennyit vesztett az akkumulátor az eredeti teljesítményéből.
roundTripEfficiencyFade 🔒number—Hatásfok-csökkenés (%) — A körfolyamat-hatásfok romlása a kezdeti értékhez mérve.
roundTripEfficiencyNow 🔒number—Körfolyamat-hatásfok — jelenlegi (%) — A darab JELENLEGI körfolyamat-hatásfoka. A Bizottság útmutatója (v2.0) a pillanatnyi értéket kéri, nem csak a csökkenést; a csökkenés ebből és a kezdeti értékből számolható. A JTC24 ezt a mezőt nem ismeri, ezért nincs rá szabvány-útvonal.
internalResistanceIncreasePack 🔒number—Belső ellenállás növekedése — pack (%) — Mennyivel nőtt a pack belső ellenállása a kezdetihez képest. A JTC24 itt csak a PACK-értéket követeli meg.
internalResistanceCell 🔒number—Belső ellenállás — cella, jelenlegi (Ω) — A cella JELENLEGI belső ellenállása. A Bizottság útmutatója (v2.0) a pillanatnyi ohm-értéket kéri; a növekedés ebből és a kezdeti értékből számolható. A JTC24 csak a kezdeti értéket és a növekedést ismeri, ezért ehhez nincs szabvány-útvonal.
internalResistanceModule 🔒number—Belső ellenállás — modul, jelenlegi (Ω) — A modul JELENLEGI belső ellenállása. A Bizottság útmutatója (v2.0) a pillanatnyi ohm-értéket kéri; a növekedés ebből és a kezdeti értékből számolható. A JTC24 csak a kezdeti értéket és a növekedést ismeri, ezért ehhez nincs szabvány-útvonal.
internalResistancePack 🔒number—Belső ellenállás — pack, jelenlegi (Ω) — A pack JELENLEGI belső ellenállása. A Bizottság útmutatója (v2.0) a pillanatnyi ohm-értéket kéri; a növekedés ebből és a kezdeti értékből számolható. A JTC24 csak a kezdeti értéket és a növekedést ismeri, ezért ehhez nincs szabvány-útvonal.
selfDischargeRate 🔒number—Önkisülés mértéke (%/hónap) — Mennyi töltést veszít a darab használaton kívül, havi arányban. A Bizottság útmutatója (v2.0) az önkisülés ALAKULÁSÁT kéri az LMT-akkumulátoroknál; az alakulást a periodikusan frissített érték és az útlevél verzió-története együtt adja ki. A JTC24 EV-profilja ezt a mezőt nem ismeri.
fullCycleCount 🔒integer—Megtett teljes töltési/kisütési ciklusok — Hány teljes ciklust futott az akkumulátor eddig. DARAB-SPECIFIKUS.
expectedLifetimeYears 🔒number—Várható élettartam (naptári év) — A várható élettartam években — a ciklusszám mellett a másik élettartam-mérőszám.
temperatureInformation 🔒number—Hőmérsékleti információ (°C) — A JTC24 egyetlen °C-értéket vár itt (jellemzően az üzemi átlag- vagy referencia-hőmérséklet).
accidentInfoUrl 🔒string—Balesetekre vonatkozó információ (link) — Hivatkozás az akkumulátort ért balesetek / rendkívüli események dokumentációjára.
carbonFootprintnumber—Szénlábnyom (kg CO₂e / kWh) — Az akku teljes életciklusra vetített szénlábnyoma, kg CO₂-egyenérték per kWh teljes energia.
carbonFootprintClassstring—Szénlábnyom-teljesítményosztály (A–G) — A rendelet szerinti CF-teljesítményosztály, ha rendelkezésre áll. Opcionális.
carbonFootprintStudyUrlstring—Szénlábnyom-tanulmány (URL) — A szénlábnyom-számítás alapjául szolgáló tanulmány / dokumentáció linkje (a CF-delegált aktus szerint). Opcionális.
carbonFootprintBreakdownarray[object]—Szénlábnyom életciklus-szakaszonként — A szénlábnyom megbontása életciklus-szakaszokra (kg CO₂e / kWh) — a CF-delegált aktus ezt várja. Opcionális.
  ↳ stagestring (enum)✓Életciklus-szakasz (raw_material · main_production · distribution · recycling)
  ↳ valuenumber✓Érték (kg CO₂e / kWh)
recycledContentarray[object]—Újrahasznosított nyersanyag-tartalom — Az újrahasznosított kritikus nyersanyagok aránya anyagonként (kobalt, lítium, nikkel, ólom). Opcionális, de a rendelet egyre szigorúbban várja.
  ↳ materialstring (enum)✓Anyag (cobalt · lithium · nickel · lead)
  ↳ percentagenumber✓Újrahasznosított arány
hazardousSubstancesarray[object]—Veszélyes anyagok — Az akkuban jelen lévő veszélyes anyagok (a higany, kadmium, ólom felett). A legtöbb adatlapnál releváns.
  ↳ namestring✓Megnevezés
  ↳ casNumberstring—CAS-szám
  ↳ concentrationRangestring—Koncentráció-tartomány
  ↳ concentrationnumber—Koncentráció (%) — A koncentráció SZÁMMAL. A fenti tartomány („< 20%") emberi olvasásra való, a JTC24 viszont számot vár — ezért kell mindkettő.
  ↳ hazardPhrasesarray[string]—Veszélyességi mondatok (H) — A CLP-rendelet szerinti H-mondatok kódjai, egyenként.
  ↳ precautionaryPhrasesarray[string]—Óvintézkedési mondatok (P) — A CLP-rendelet szerinti P-mondatok kódjai, egyenként.
  ↳ substanceLocationstring—Hol található az anyag — Az akku melyik részében van jelen az anyag.
criticalRawMaterialsarray[string]—Kritikus nyersanyagok — Az akkumulátorban jelen lévő kritikus nyersanyagok NEVE, egyenként. Ez más, mint az újrahasznosított tartalom: ott arány van, itt csak a jelenlét.
cathodeAnodeElectrolyteMaterials 🔒array[string]—Katód, anód és elektrolit anyagai — A cella fő alkotóelemeiben használt anyagok, egyenként felsorolva.
safetyInformation 🌐object—Biztonsági információ — Kezelési, tárolási és vészhelyzeti tudnivalók — nyelvenként egy-egy szöveg.
dueDiligenceUrlstring—Ellátási lánc átvilágítási jelentés (URL) — A rendelet szerinti due diligence (átvilágítási) szabályzat/jelentés linkje. SZÁNDÉKOSAN NYILVÁNOS: az akkumulátor-rendelet közzétételi kötelezettséget ír elő a jelentésre, és a JTC24 is `public` hozzáférési szintre sorolja. (A 77. cikk (4) a többi, korlátozott mezőre vonatkozik — erre nem.) Opcionális.
endOfLifeobject✓Életciklus vége — Gyűjtés, újrahasznosítás, szétszerelés — nyelvenként kitöltve.
  ↳ recyclingInstructions 🌐object✓Gyűjtés / újrahasznosítás — Hová vihető vissza, hogyan hasznosítható újra — nyelvenként.
  ↳ disposalInstructions 🌐object✓Ártalmatlanítás / figyelmeztetés — Tilalmak, veszélyek — nyelvenként.
complianceDocumentsarray[object]—Megfelelőségi dokumentumok — Tanúsítványok, megfelelőségi és teszt-dokumentumok linkjei (opcionális). pl. CE, UN 38.3.
  ↳ typestring✓Típus
  ↳ urlstring✓URL
batterySerialNumberstring—Akkumulátor sorozatszáma — A KONKRÉT darab sorozatszáma. Az akkumulátor-útlevél darab-szintű, ezért ez modellenként nem, csak egységenként tölthető ki értelmesen.
uniqueManufacturerIdentifier 🔒string—Gyártó egyedi azonosítója — A gyártó egyedi azonosítója (pl. GLN vagy EORI). A JTC24 HATÓSÁGI szintre teszi.
thirdPartyServiceProvider 🔒string—Harmadik fél szolgáltató — Az útlevelet a gazdasági szereplő nevében kezelő szolgáltató. HATÓSÁGI szint.
batteryStatus 🔒string (enum)—Akkumulátor státusza — A darab életciklus-státusza. A JTC24 kódlistáját követi; DARAB-SPECIFIKUS. (original · re-used · remanufactured · repurposed · waste)
manufacturerInformationobject—Gyártó adatai — A GYÁRTÓ adatai — ez nem feltétlenül azonos a forgalomba hozó gazdasági szereplővel, ezért a JTC24 külön kéri.
  ↳ namestring✓Cégnév
  ↳ tradeNamestring✓Bejegyzett kereskedelmi név / védjegy
  ↳ postalAddressstring✓Postai cím
  ↳ webAddressstring—Weboldal
  ↳ eMailAddressstring—E-mail
dismantlingInformation 🔒string—Szétszerelési útmutató (link) — Hogyan kell az akkumulátort biztonságosan szétszerelni. A javítóknak és a hulladékkezelőknek szól.
partNumbersForComponents 🔒string—Alkatrész-azonosítók (link) — A cserélhető alkatrészek cikkszám-listája.
informationOnSourcesOfSpareParts 🔒string—Alkatrész-beszerzési források (link) — Hol szerezhetők be a pótalkatrészek.
safetyMeasuresUrl 🔒string—Biztonsági óvintézkedések (link) — A szétszereléskor és kezeléskor betartandó óvintézkedések dokumentuma.
renewableContentSharenumber—Megújuló tartalom aránya (%) — Az akkumulátorban lévő megújuló forrásból származó anyagok aránya.
wastePreventionInfoUrlstring—Hulladékmegelőzés — végfelhasználói tájékoztató (link) — Mit tehet a felhasználó a hulladék megelőzéséért. NYILVÁNOS tájékoztató.
separateCollectionInfoUrlstring—Szelektív gyűjtés — végfelhasználói tájékoztató (link) — Hogyan adja le a felhasználó a használt akkumulátort szelektíven.
secondLifeTreatmentInfoUrlstring—Második élet és kezelés (link) — Gyűjtés, második életre előkészítés és életciklus-végi kezelés leírása.
separateCollectionSymbolUrlstring—Szelektív gyűjtés jelzés (link) — Az áthúzott kerekes kuka jelzés képe vagy leírása.
carbonFootprintLabelUrlstring—Szénlábnyom-címke (link) — A szénlábnyom-teljesítményosztály címkéje.
euDeclarationOfConformityUrlstring—EU megfelelőségi nyilatkozat (link) — Az EU-megfelelőségi nyilatkozat elérhetősége. A rendelet kötelezően kéri.
testReportsUrl 🔒string—Megfelelőséget igazoló teszt-jelentések (link) — A megfelelőséget igazoló vizsgálati jelentések. A JTC24 szerint HATÓSÁGI szint.
meaningOfLabelsAndSymbols 🌐object—A címkék és szimbólumok jelentése — Az akkumulátoron szereplő jelzések magyarázata a felhasználónak.
extinguishingAgentstring—Oltóanyag — Milyen oltóanyaggal oltható az akkumulátor tüze. Tűzoltóknak kritikus adat.
extinguishingAgentFireClassstring—Tűzosztály — Az oltóanyag tűzosztálya (A/B/C/D/F).
industrialSubtypestring (enum)—Ipari akkumulátor altípusa — A rendelet egyetlen „ipari" kategóriát ismer, a JTC24 adatmodell viszont három külön kódot ad. Ez a mező dönti el, melyikkel megy az akkumulátor-útlevél exportja. Csak ipari kategóriánál van jelentősége. (without_bms · stationary_above_2kwh · non_stationary_above_2kwh)
economicOperatorWebstring—Gazdasági szereplő weboldala — A forgalomba hozó honlapja. A JTC24 a szereplő adatai között kéri.
facilityId 🔒string—Gyártó létesítmény azonosítója — Annak a telephelynek az azonosítója, ahol az akku készült — GLN vagy saját azonosító.
warrantyPeriodstring—Jótállás időtartama — ISO 8601 időtartam: P8Y = 8 év, P8Y6M = 8 év 6 hónap. A JTC24 ezt a formátumot várja.
dateOfPuttingIntoServicestring—Üzembe helyezés dátuma — Mikor helyezték üzembe ezt a darabot. Darabszintű adat: a modellre nem értelmezhető.
cellChemistryOtherstring—Cellakémia — egyéb, megnevezve — Ha a cellakémia „Egyéb", itt add meg a pontos megnevezést. A JTC24-nek külön mezője van rá.
certifiedUsableEnergyKwhnumber—Tanúsított hasznos energia (kWh) — A tanúsítási eljárásban mért hasznosítható energia. Ehhez viszonyít a SOCE-mutató.
initialInternalResistanceModulenumber—Kezdeti belső ellenállás — modul (Ω) — A cella- és a csomagszintű érték mellé a JTC24 a modulszintűt is ismeri.
measurementTempLowerinteger—Mérési hőmérséklet — alsó határ (°C) — Milyen hőmérséklet-tartományban érvényesek a fenti feszültség- és teljesítményadatok. A JTC24 mind a hat csoporthoz külön kéri; itt egyszer adod meg.
measurementTempUpperinteger—Mérési hőmérséklet — felső határ (°C) — A fenti adatok érvényességi tartományának felső határa.
remainingUsableEnergyKwh 🔒number—Maradék hasznos energia (kWh) — A darab jelenleg kinyerhető energiája. A tanúsított értékhez képest ez fogy.
overchargeEventCount 🔒integer—Túltöltési események száma — Hányszor került az akku túltöltött állapotba. Az élettartam-becslés egyik bemenete.
deepDischargeEventCount 🔒integer—Mélykisütési események száma — Hányszor merült le az akku mélykisütésig.
internalResistanceIncreaseCell 🔒number—Belső ellenállás növekedése — cella (%) — Mennyivel nőtt a cellaszintű belső ellenállás az eredetihez képest. A csomagszintű mellé a JTC24 ezt is ismeri.
internalResistanceIncreaseModule 🔒number—Belső ellenállás növekedése — modul (%) — Mennyivel nőtt a modulszintű belső ellenállás az eredetihez képest. A csomagszintű mellé a JTC24 ezt is ismeri.
carbonFootprintAbsoluteinteger—Szénlábnyom — teljes (kg CO₂e) — A teljes életciklus szénlábnyoma abszolút értékben. A kWh-ra vetített érték mellett ezt is kéri a JTC24.
supplyChainIndicesstring—Ellátási lánc mutatói — Az ellátási lánc kockázati mutatói, ahogy az átvilágítási szabályzat megadja.
thirdPartyAssurancesstring—Harmadik fél tanúsítása (elismert rendszerek) — Mely elismert rendszer (pl. IRMA, RMI) tanúsította az átvilágítást.
symbolsForCadmiumAndLeadUrlstring—Kadmium/ólom jelölés (kép vagy dokumentum) — A Cd/Pb tartalomra figyelmeztető jelölés. A készültség csak nikkel-kadmium és ólom-sav cellakémiánál kéri; ha más kémia mellett is van 0,002% feletti kadmium vagy 0,004% feletti ólom, akkor is töltsd ki.
modulesIndividuallyReplaceable 🔒string (enum)—A cellamodulok egyenként cserélhetők — Kicserélhető-e EGY hibás modul anélkül, hogy a teljes csomagot le kellene cserélni? (yes · partly · no)
cellsIndividuallyReplaceable 🔒string (enum)—A cellák egyenként cserélhetők — Bontható-e a modul cella-szintig, vagy zárt egység? (yes · partly · no)
bmsSeparatelyRemovable 🔒string (enum)—A BMS külön kivehető — Hozzáférhető-e az elektronika a cellák bontása nélkül? (yes · partly · no)
professionalServiceRequired 🔒string (enum)—Szakszerviz és gyári szerszám szükséges — Nyitható-e a termék általános szerszámmal, vagy szakképzett szerelő kell hozzá? (yes · partly · no)
sparePartsAvailabilityYears 🔒integer—Pótalkatrész elérhetősége (év) — Hány évig vállalja a gyártó a pótalkatrész-ellátást a forgalomba hozataltól?

furniture Bútor20 mező

MezőTípusKöt.Leírás
productNamestring✓Terméknév — A termék neve, ahogy a vásárló a passporton látni fogja.
skustring✓SKU — Belső cikkszám / azonosító — a te rendszeredből.
brandNamestring✓Márkanév
gtinstring—GTIN (opcionális) — A vonalkód száma (GTIN-8/12/13/14). Az ellenőrzőszámot a rendszer validálja. Ha nincs, hagyd üresen.
commodityCodestring—Árukód (CN/HS, opcionális) — Vám-/tarifális besorolás: Kombinált Nómenklatúra (CN, 8 számjegy) vagy HS-kód. Az EU DPP-regiszter kötelező metaadata a regisztrációkor — a szállítói/vámpapírokon szerepel.
economicOperatorobject✓Gazdasági szereplő
  ↳ rolestring (enum)✓Szerep — Ki teszi a terméket az EU-piacra és felel érte. A legtöbb gyártónál: Gyártó. (manufacturer · importer · authorized_representative · distributor · dealer · fulfilment_service_provider)
  ↳ legalNamestring✓Jogi név
  ↳ addressstring✓Cím
  ↳ countrystring✓Ország (ISO 3166-1 alpha-2) — Kétbetűs ISO országkód, nagybetűvel — pl. HU, DE, IT
  ↳ contactEmailstring✓Kapcsolati e-mail — Ide fordulhat a vásárló vagy a hatóság.
  ↳ operatorId 🔒string—Egyedi szereplő-azonosító (GS1 GLN) — 13 jegyű GS1 GLN — EU DPP egyedi gazdasági szereplő-azonosító. Csak hatósági hozzáférési szinten látszik. Ha nincs, hagyd üresen.
  ↳ eori 🔒string—EORI-szám — A gazdasági szereplő EORI-száma (vám / EU DPP-nyilvántartási azonosító) — a registry ez alapján azonosít. Csak hatósági hozzáférési szinten látszik. Ha nincs, hagyd üresen.
languagesarray[string]✓Nyelvek (BCP-47) — Mely nyelveken jelenjen meg a passport. A lokalizált mezőket (ápolás, összeszerelés, életciklus) minden itt felsorolt nyelven ki kell tölteni. pl. hu, en
materialCompositionarray[object]✓Anyag-összetétel — Miből készült a bútor. A százalékok összege pontosan 100 legyen. pl. tömör tölgy 80 + fém 20
  ↳ materialstring (enum)✓Anyag (wood · engineeredWood · metal · plastic · glass · textile · foam · leather …)
  ↳ percentagenumber✓Százalék
woodCertificationobject—Fa származása és tanúsítás — A felhasznált fa fenntartható származása és tanúsítása, ha releváns (opcionális).
  ↳ schemestring (enum)—Tanúsítási rendszer — A fa fenntartható erdőgazdálkodási tanúsítása. (fsc · pefc · none)
  ↳ countrystring—Származási ország (ISO) — A fa származási országa. Kétbetűs ISO kód, pl. AT, SE, RO. Opcionális.
dimensionsobject—Méretek és tömeg — A bútor befoglaló méretei és tömege (opcionális).
  ↳ widthnumber—Szélesség (cm)
  ↳ depthnumber—Mélység (cm)
  ↳ heightnumber—Magasság (cm)
  ↳ weightKgnumber—Tömeg (kg)
countryOfManufacturestring✓Gyártás országa (ISO) — Ahol a végtermék készült. Kétbetűs ISO kód, pl. PL, RO, HU
careInstructions 🌐object✓Ápolási útmutató — Tisztítás, ápolás, felület-karbantartás — nyelvenként egy-egy szöveg.
assemblyInstructions 🌐object—Összeszerelési útmutató — Hogyan szerelhető össze a bútor — nyelvenként (opcionális). Link is megadható.
repairobject✓Javíthatóság — Javítható-e, és hogyan. A „javítható” és „alkatrész elérhető” mezők kötelezőek.
  ↳ repairableboolean✓Javítható
  ↳ instructions 🌐object—Javítási útmutató — Hogyan javítható — nyelvenként (opcionális).
  ↳ sparePartsAvailableboolean✓Alkatrész elérhető (pl. vasalat, láb)
  ↳ sparePartsUrlstring—Alkatrész-rendelés (URL) — Hol rendelhetők pótalkatrészek (opcionális).
warrantyMonthsnumber—Garancia (hónap) — A gyártói garancia időtartama hónapban. Opcionális.
substancesOfConcernarray[object]—Aggályos anyagok — Aggályos anyagok (pl. REACH SVHC / SCIP), ha a termékben jelen vannak. A legtöbb terméknél üresen hagyható.
  ↳ namestring✓Megnevezés
  ↳ casNumberstring—CAS-szám
  ↳ notestring—Megjegyzés
flameRetardantsstring (enum)—Égésgátló anyagok — Tartalmaz-e a termék (különösen a kárpit / hab) égésgátló vegyi anyagokat. Opcionális. (present · absent · unknown)
complianceDocumentsarray[object]—Megfelelőségi dokumentumok — Tanúsítványok, megfelelőségi dokumentumok linkjei (opcionális). pl. EN 12520, EN 1728, tűzvédelmi tanúsítvány.
  ↳ typestring✓Típus
  ↳ urlstring✓URL
packagingstring (enum)—Csomagolás újrahasznosíthatósága — A termék csomagolásának újrahasznosíthatósága. Opcionális. (recyclable · partiallyRecyclable · notRecyclable)
endOfLifeobject✓Életciklus vége — Mi legyen a bútorral a használat után — nyelvenként kitöltve.
  ↳ recyclingInstructions 🌐object✓Újrahasznosítási útmutató — Hogyan bontható szét és hasznosítható újra — nyelvenként.
  ↳ disposalInstructions 🌐object✓Ártalmatlanítási útmutató — Ha nem újrahasznosítható — nyelvenként.

Nyelvek

A languages (pl. ["hu","en"]) deklarálja, mely nyelveken van szabad-szöveges tartalom. A lokalizált mezőket (ápolás, életciklus… — a /schema-ban "localized": true) csak az első (elsődleges) nyelven kötelező kitölteni; a többi opcionális, hiánynál egy elérhető nyelvre esik vissza. A passport UI-címkéi ettől függetlenül automatikusan 24 nyelvre fordulnak.

Példák

Tömeges betöltés az ERP-ből

curl -X POST https://veridyn.eu/api/v1/products:batch   -H "Authorization: Bearer vk_<kulcs>"   -H "Content-Type: application/json"   -H "Idempotency-Key: erp-2026-09-24-001"   -d '{
    "category": "battery",
    "on_duplicate": "skip",
    "products": [
      { "sku": "VE60-001", "productName": "PowerCell 60", "...": "..." },
      { "sku": "VE60-002", "productName": "PowerCell 60 XL", "...": "..." }
    ]
  }'

A válasz soronkénti riport: created / updated / exists (ilyen SKU már van) / invalid (a hibákkal) / plan_limit. A részleges siker normális — a hibás sor nem állítja meg a többit.

Az Idempotency-Key fejléc mentesít az újrapróbálás kockázatától: időtúllépés után ugyanazzal a kulccsal megismételt kérés a korábbi választ adja vissza, nem hoz létre másodszor semmit.

Termék létrehozása

curl -X POST https://veridyn.eu/api/v1/products \
  -H "Authorization: Bearer vk_<kulcs>" \
  -H "Content-Type: application/json" \
  -d '{
    "category": "textile",
    "data": {
      "productName": "Bio pamut póló",
      "sku": "TEE-001",
      "brandName": "Lumora",
      "languages": ["hu","en"],
      "fiberComposition": [{"fiber":"pamut","percentage":100}],
      "countryOfManufacture": "PT",
      "careInstructions": {"hu":"Mosás 30 °C","en":"Wash at 30 °C"},
      "repair": {"repairable": true, "sparePartsAvailable": false},
      "endOfLife": {
        "recyclingInstructions": {"hu":"Textilgyűjtő","en":"Textile bin"},
        "disposalInstructions": {"hu":"Ne a kukába","en":"Not household waste"}
      },
      "economicOperator": {
        "role":"manufacturer","legalName":"Lumora Kft.","address":"Budapest",
        "country":"HU","contactEmail":"[email protected]"
      }
    }
  }'

Válasz (201):

{
  "data": {
    "id": "a1993ef7-7562-43bb-92ff-eb63f02dcde9",
    "category": "textile",
    "status": "active",
    "version_no": 1,
    "passport_url": "https://veridyn.eu/<fiók>/p/a1993ef7-…",
    "qr_url": "https://veridyn.eu/api/v1/products/a1993ef7-…/qr",
    "data": { "productName": "Bio pamut póló", … }
  }
}

Listázás

curl https://veridyn.eu/api/v1/products?limit=25 \
  -H "Authorization: Bearer vk_<kulcs>"

Egy termék lekérése

curl https://veridyn.eu/api/v1/products/{id} \
  -H "Authorization: Bearer vk_<kulcs>"

Frissítés (új verzió)

curl -X PATCH https://veridyn.eu/api/v1/products/{id} \
  -H "Authorization: Bearer vk_<kulcs>" \
  -H "Content-Type: application/json" \
  -d '{"data": {"recycledContentPercentage": 30}}'

A megadott mezők ráolvasnak a meglévő adatra (részleges frissítés), majd validálunk, és új, megőrzött verzió jön létre — a teljes változás-történet megmarad.

Tétel és egység útlevél (szerializálás)

Egy modell alá tétel- vagy egyed-útlevelet készítesz; a gyerek örökli a szülő adatait — csak a példány-specifikus mezőket (lot/serial) adod meg. Egyszerre több is (items[], max 500), a válasz soronként jelzi a sikert/hibát.

curl -X POST https://veridyn.eu/api/v1/products/{id}/children \
  -H "Authorization: Bearer vk_<kulcs>" \
  -H "Content-Type: application/json" \
  -d '{"level":"item","items":[{"serial":"SN-0001"},{"serial":"SN-0002"}]}'

A {id} lehet modell vagy tétel is. Ha egy tétel id-jére POST-olsz level:"item"-mel, a darab a tétel alá kerül, és a tétel lot-ját örökli — a GS1-linkje ilyenkor …/10/lot/21/serial, nem …/21/serial. Így épül a teljes modell → tétel → egység lánc.

Élő adat visszaírása tömegesen

A darab-szintű mezők egy része élő adat: az akkumulátor SoH-ja, ciklusszáma és maradék kapacitása a BMS-ből frissül. Ezt nem darabonként kell visszaírni — egy hívásból legfeljebb 500 gyerek-útlevél frissül. Az azonosítás serial, lot vagy id alapján megy, tehát elég az, amit a gyártásirányítás ismer; a mi belső azonosítónkat nem kell eltárolnod.

curl -X PATCH https://veridyn.eu/api/v1/products/{id}/children \
  -H "Authorization: Bearer vk_<kulcs>" \
  -H "Content-Type: application/json" \
  -d '{"change_type":"change","items":[
        {"serial":"SN-0001","data":{"stateOfHealth":97,"fullCycleCount":412}},
        {"serial":"SN-0002","data":{"stateOfHealth":95,"fullCycleCount":508}}
      ]}'

A válasz soronkénti riport: updated · unchanged · not_found · ambiguous (a sorozatszám nem egyedi a szülő alatt) · validation. A változatlan sorból nem lesz új verzió — egy naponta futó flotta-szinkron így nem hizlalja üres verziókkal a változás-történetet. A change_type az egész kötegre vonatkozik: a BMS-adat frissülése change (a korábbi érték a maga idejében igaz volt), nem correction.

💡 Tömeges hívásnál egyetlen összesítő children.updated webhook keletkezik, és a kézbesítés sorba kerül — nem a kérés ideje alatt történik. Enélkül 500 sor 500 kimenő HTTP-hívást jelentene a válaszod előtt.

Beolvasás-analitika (scan)

A QR-beolvasások összesített statisztikája — termékenként vagy az egész fiókra —, országra és eszközre bontva. Adatvédelem: nyers IP nincs, az egyedi látogató anonim hash-becslés.

curl "https://veridyn.eu/api/v1/products/{id}/scans?days=30" \
  -H "Authorization: Bearer vk_<kulcs>"
{
  "data": {
    "product_id": "a1993ef7-…",
    "range_days": 30,
    "total": 189, "unique": 142,
    "byCountry": { "HU": 142, "DE": 38, "AT": 9 },
    "byDevice":  { "mobile": 168, "tablet": 9, "desktop": 12 }
  }
}

Inkrementális szinkron (csak a változások)

Egy ERP nem tudja minden éjszaka végigolvasni a teljes útlevél-állományt: ahogy nő a katalógus, úgy nő a futásidő is. Az updated_since paraméterrel csak azt kapod vissza, ami az adott időpont óta változott — és a lista ilyenkor minden szintet ad (modell, tétel, egyed), mert egy gyártásirányítás a darab-útleveleket is szinkronizálja.

curl "https://veridyn.eu/api/v1/products?updated_since=2026-09-24T00:00:00Z&limit=100" \
  -H "Authorization: Bearer vk_<kulcs>"
{
  "data": [
    { "id": "a1993ef7-…", "name": "VE60 EV modul", "status": "active",
      "updated_at": "2026-09-24T08:11:32+00:00", "passport_url": "…" },
    { "id": "c7d10b42-…", "name": "VE60-000418", "status": "archived",
      "updated_at": "2026-09-24T14:02:07+00:00", "passport_url": "…" }
  ],
  "per_page": 100,
  "has_more": true,
  "next_cursor": "MjAyNi0wOS0yNCAxNDowMjowN3xjN2QxMGI0Mi0…"
}

A szinkron-válaszban nincs page és total — helyettük has_more és next_cursor van. A következő lapot a kapott next_cursor változtatás nélküli visszaadásával kéred: ?cursor=…. A kurzor opak: ne fejtsd meg és ne állítsd össze magad — a saját gyártmányú értéket 422 bad_cursor hibával elutasítjuk.

curl "https://veridyn.eu/api/v1/products?cursor=MjAyNi0wOS0yNCAxNDowMjowN3xjN2QxMGI0Mi0…" \
  -H "Authorization: Bearer vk_<kulcs>"

Miért kurzor, és nem oldalszám

Mert az oldalszámos lapozás némán kihagy sorokat. A lista a módosítás ideje szerint áll: amíg te a 2. lapot kérdezed, egy már látott termék frissül, a lista élére ugrik, és minden mögötte lévő eggyel hátracsúszik — az a sor, ami épp a lapok határán volt, soha nem kerül a szemed elé. A kliens közben azt hiszi, mindent megkapott. A kurzor a konkrét utolsó feldolgozott sorra mutat, nem egy pozícióra, ezért ez nem fordulhat elő. (Azonos másodpercre eső időbélyegeknél a belső azonosító dönt — importnál ez tucatnyi soron előfordul.)

Az archivált útlevél is megjelenik — ez a lényeg

Az archiválás nem tünteti el a terméket a szinkron-ablakból: status: "archived" értékkel jön vissza. Ez a „sírkő" — ebből tudja a rendszered, hogy le kell vennie a saját listájáról. Ha az archiváltak kiesnének, a kliens örökre aktívként tartaná őket.

Ajánlott menet: tárold el a legutolsó next_cursor-t; a következő futásnál azzal indulsz, és addig lapozol, amíg a has_more hamis nem lesz. Első (teljes) feltöltésnél updated_since=1970-01-01T00:00:00Z — onnantól már csak a változás megy át a vonalon.

Két dolog, amire a kliensnek számítania kell

1. A legfrissebb másodperc még nem jön. A módosítási időbélyeg másodperc-felbontású, ezért a lista mindig csak a már zárt másodpercekig szolgál ki: egy épp most mentett útlevél jellemzően 1–2 másodperc múlva jelenik meg a szinkron-listán. Ez szándékos. Enélkül előfordulhatna, hogy a kurzor belelép egy még nyitott másodpercbe, és az abban a másodpercben később mentett útlevél soha nem kerülne ki — nem késne, hanem elveszne, és nem is derülne ki.

2. Üres lapot is kurzorral kapsz. Ha nem változott semmi, a data üres, a has_more hamis — de a next_cursor akkor sem üres, és előrébb áll, mint az előző. Mindig azt tárold el: a kurzor akkor is halad, amikor nincs változás.

Tanúsítványok és dokumentumok

A megfelelőségi tanúsítvány, a vizsgálati jegyzőkönyv és a biztonsági adatlap PDF-ben él — és jellemzően egy dokumentumkezelőben vagy a laborral folytatott levelezésben keletkezik, nem egy böngésző-fülben. A fájl tartalma ezért base64-ben megy a kérés törzsében:

curl -X POST https://veridyn.eu/api/v1/products/{id}/documents \
  -H "Authorization: Bearer vk_<kulcs>" \
  -H "Content-Type: application/json" \
  -d '{"filename":"ce-tanusitvany.pdf","tier":"public","label":"CE","content_base64":"JVBERi0xLjQK…"}'

A típust a tartalom dönti el, nem a fájlnév. A kiterjesztés hazudhat — és aki szándékosan hazudik vele, annak épp ez a célja —, ezért a bájtokból ismerjük fel a fájltípust. Ha nem PDF, PNG, JPEG vagy WebP, a válasz 415 bad_type, és semmi nem tárolódik. A tárolt fájl neve a mi azonosítónk; a beküldött filename csak megjelenítendő címke.

A tier mondja meg, ki láthatja: public (a publikus útlevélen is), legitimate_interest vagy authorities — ugyanaz a rangsor, mint a séma-mezőké. Ismeretlen érték esetén a legszűkebbre, a public-ra esik; a bizalmas dokumentumnál tehát mindig add meg.

A méret-korlát 8 MB a dekódolt fájlra. A base64 a kérés törzsét ennél nagyobbá teszi (kb. 4/3-szorosára), és ha az a szerver törzs-korlátját túllépi, a törzs meg sem érkezik — erre 413 payload_too_large a válasz, és megmondjuk benne a szerver tényleges korlátját is, hogy ne a saját kódodban keresd a hibát.

A tényleges maximumot meg is tudod kérdezni, mielőtt bármit feltöltenél: a GET /health (kulcs nélkül is működik) limits.document_upload_max_bytes mezője azt a számot adja, ami a kettőből a szűkebb. Érdemes indulásnál egyszer elkérni.

curl https://veridyn.eu/api/v1/health
{
  "status": "ok",
  "limits": {
    "document_max_bytes": 8388608,
    "request_body_max_bytes": 8388608,
    "document_upload_max_bytes": 6165626,
    "bulk_max_items": 500
  }
}

A letöltés a fájlt adja vissza, nem JSON-t — a saját tartalom-típusával; a ?dl=1 csatolmányként. A DELETE a lemezről is törli.

curl https://veridyn.eu/api/v1/products/{id}/documents/42?dl=1 \
  -H "Authorization: Bearer vk_<kulcs>" -o tanusitvany.pdf

Beszállítói adatbekérés

Az útlevél adatainak egy részét nem te tudod: a szövet rost-összetételét a szövöde, a cellák eredetét a cellagyártó. Adatbekérést indítasz a konkrét mezőkre, a beszállító pedig egy belépés nélküli linken kitölti a saját részét — fiókot nem kell neki adnod. Ez a felületen régóta megvan; API-ból eddig nem: egy beszerzési rendszer így 500 útlevelet fel tudott tölteni, de az 500 adatbekérést kézzel kellett elindítani.

curl -X POST https://veridyn.eu/api/v1/supplier-requests \
  -H "Authorization: Bearer vk_<kulcs>" \
  -H "Content-Type: application/json" \
  -d '{"product_id":"a1993ef7-…","email":"[email protected]",
       "fields":["fiberComposition","countryOfManufacture"],
       "message":"Kérlek, a következő szállítmányhoz.","lang":"en"}'
{
  "data": {
    "id": 17, "status": "pending", "email": "[email protected]",
    "fields": ["fiberComposition", "countryOfManufacture"],
    "expires_at": "2026-10-25 09:14:02",
    "link": "https://veridyn.eu/supplier.php?token=9f3c…",
    "emailed": true
  }
}

A link mindig benne van a válaszban — akkor is, ha az e-mailt mi küldjük ki. Egy gépi integráció jellemzően a saját levelezőjéből ír a beszállítónak (saját sablon, saját feladó, saját nyomonkövetés); ilyenkor a send_email: false kikapcsolja a mi kiküldésünket, és a linket te küldöd el. A fields a kategória-séma mezőkulcsai (GET /schema/{category}); belső mező nem delegálható. A link 30 nap után lejár.

A beküldés átnézése és beolvasztása

Amíg a beszállító nem töltött ki semmit, az adatbekérés pending. Beküldés után submitted, és a részletek végpontján látod, mit írt — nyers mezőkulccsal és emberi mezőnévvel együtt, hogy a jóváhagyó felületnek ne kelljen ismernie a sémát. A beolvasztás külön lépés: a beérkezett adat nem kerül automatikusan a termékbe.

curl https://veridyn.eu/api/v1/supplier-requests/17 \
  -H "Authorization: Bearer vk_<kulcs>"

curl -X POST https://veridyn.eu/api/v1/supplier-requests/17/merge \
  -H "Authorization: Bearer vk_<kulcs>"

A beolvasztás csak a KÉRT mezőket írja át. A beszállító (vagy a token ismeretében bárki) beküldhet többet is, de amit nem kértél tőle, az nem nyúl a termékhez — a márkanevet nem írhatja át az, akitől csak a gyártás országát kérdezted.

Ha a beolvasztott adat érvénytelen (422 validation), a termék érintetlen marad, és az adatbekérés sem záródik le: tisztázod a beszállítóval, majd újra megpróbálod. Siker esetén új verzió keletkezik, és product.updated webhook megy ki source: "supplier_merge" jelzéssel — így a saját rendszeredben látszik, hogy nem te írtad át, hanem egy beküldés.

Archiválás és visszaállítás

Ha egy termék kifut, archiválod — de az útlevelet nem töröljük: a QR-kód és a link ezután is működik, az útlevél „archivált" jelöléssel jelenik meg. Ezt a jogszabályi megőrzés meg is kívánja: egy már piacon lévő darab útlevelének élnie kell akkor is, amikor a modellt már nem gyártod.

curl -X POST https://veridyn.eu/api/v1/products/{id}/archive \
  -H "Authorization: Bearer vk_<kulcs>"

curl -X POST https://veridyn.eu/api/v1/products/{id}/restore \
  -H "Authorization: Bearer vk_<kulcs>"

Törzs nem kell. A művelet nem hoz létre új verziót: a láthatóság-váltás nem adat-változás, egy üres különbségű verzió csak zajt vinne a változás-történetbe — ezért is külön végpont, és nem PATCH. Webhookot kiváltunk: product.archived, illetve product.restored.

A keretet nem szabadítja fel: a csomag modell-számlálója az archiváltakat is beleszámolja, tehát az archiválás nem nyit helyet újnak, és a visszaállítás nem is foglal.

Változás-történet (verziók)

Minden PATCH új, megőrzött verziót hoz létre, és a lánc hash-sel pecsételt — utólag nem írható át. A történet gépileg is olvasható: a lista a verziókat adja, a /versions/{no} pedig azt, hogy melyik mező változott, miről mire.

curl https://veridyn.eu/api/v1/products/{id}/versions \
  -H "Authorization: Bearer vk_<kulcs>"

curl https://veridyn.eu/api/v1/products/{id}/versions/3 \
  -H "Authorization: Bearer vk_<kulcs>"

Mindkettő olvasás, tehát csak-olvasó kulccsal is megy — egy auditáló rendszernek nem kell írási jogot adnod. A change_type is látszik: a correction hibás adat javítása (a már kiadott darab-útlevelek elavulnak), a change pedig valós termék-változás adott dátumtól (a korábbi darabok adata helyes marad).

Hozzáférési linkek (hatóság, jogos érdekű fél)

A publikus útlevél a nyilvános mezőket mutatja. A rendelet viszont szélesebb hozzáférést ír elő a piacfelügyeleti hatóságnak és a jogos érdekű feleknek (pl. újrahasznosító, javító). Erre valók a lejáró hozzáférési linkek: bejelentkezés nélkül nyitnak, egyetlen útlevélre, és lejáratkor maguktól elnémulnak — nem kell fiókot osztogatnod.

curl -X POST https://veridyn.eu/api/v1/products/{id}/grants \
  -H "Authorization: Bearer vk_<kulcs>" \
  -H "Content-Type: application/json" \
  -d '{"tier":"authority","label":"NKFH 2026/114","expires_in_days":30}'
{
  "data": {
    "id": 42, "tier": "authority", "label": "NKFH 2026/114",
    "status": "active", "expires_at": "2026-10-25 09:14:02",
    "use_count": 0, "last_used_at": null,
    "token": "9f3c…",
    "passport_url": "https://veridyn.eu/acme/p/a1993ef7-…?grant=9f3c…",
    "history_url":  "https://veridyn.eu/history.php?id=a1993ef7-…&grant=9f3c…"
  }
}
MezőJelentés
tierlegitimate_interest vagy authority. Más szinttel nem adható ki link (422 bad_tier): a tulajdonosi szint a saját fiókod, azt nem lehet linkkel kiosztani.
expires_in_daysOpcionális — és a hiánya örök linket jelent. Egy hatósági vizsgálat véges, ezért érdemes mindig megadni; lejárat után a link 410-et ad.
labelSzabad szöveg: kinek adtad ki. Csak neked látszik, a linket kapó fél nem látja.
history_urlCsak authority szinten van kitöltve: a hatóság a teljes változás-történetet is megnyithatja, a jogos érdekű fél nem.
use_countHányszor nyitották meg. Egy frissen kiadott link mindig 0 — a kiadás nem számít felhasználásnak.

A GET az adott útlevél élő linkjeit listázza, a DELETE /products/{id}/grants/{gid} pedig azonnal visszavon egyet — a token ezután 410-et ad.

Séma-verzió: mikor kell hozzányúlnod az integrációhoz

A termékkategóriák mezőlistája a jogszabállyal együtt mozog. Eddig semmi nem jelezte, ha egy séma megváltozott — az integrációk némán romlottak el. A GET /schema/{category} ezért verziót és ETag-et ad:

curl -i https://veridyn.eu/api/v1/schema/battery \
  -H "Authorization: Bearer vk_<kulcs>"

HTTP/1.1 200 OK
ETag: "battery.1.0.02894917d482"
X-DPP-Schema-Version: 1.0
Cache-Control: public, max-age=3600

Az ETag a gépi szerződésből áll: a mezők nevéből, típusából, kötelezőségéből, enum-értékeikből és hozzáférési szintjükből. Amit tehát nem változtat meg: a címke, a súgószöveg, a fordítás. Így nem kapsz vaklármát attól, hogy egy mező magyar megnevezése pontosabb lett.

curl -i https://veridyn.eu/api/v1/schema/battery \
  -H "Authorization: Bearer vk_<kulcs>" \
  -H 'If-None-Match: "battery.1.0.02894917d482"'

HTTP/1.1 304 Not Modified

Tedd be az ETag-et az indító-szkriptedbe vagy a napi futásba: amíg 304-et kapsz, a szerződés áll, és nincs dolgod. Ha 200 jön, a válasz version, revised és contract_hash mezőiből látszik, mi mozdult.

Ha egy kategórián visszafelé nem kompatibilis váltás van készülőben, a válasz Deprecation és Sunset fejlécet is kap (RFC 8594), a Sunset pedig a legkorábbi dátum, amikor a régi alak megszűnik. Alaphelyzetben egyik fejléc sem jelenik meg — ha látod, akkor van valódi határidőd.

Válasz & hibák

Siker: a hasznos adat a data kulcs alatt. Hiba esetén:

{ "error": "Érvénytelen adatok.", "code": "validation", "errors": [ … ] }
HTTPcodeJelentés
401unauthorizedHiányzó/érvénytelen API-kulcs.
403plan_requiredAz API a Pro csomagtól érhető el (a nyílt béta alatt minden béta-fiók használhatja).
404not_foundNincs ilyen termék / útvonal.
409gtin_takenA GTIN már foglalt.
422gtin_not_yoursA GTIN nem a fiókod GS1 cégprefixébe esik (Beállítások → GS1 cégprefix). Csak akkor fordulhat elő, ha beállítottál cégprefixet.
403plan_limitElérted a szint keretét (csomag + extra). Tömeges hívásnál a túllógó elemek errors-ba kerülnek.
422validationÉrvénytelen adat (részletek az errors-ban).
403read_onlyCsak olvasásra jogosult kulccsal próbáltál írni (POST/PATCH/DELETE).
429rate_limitedÁtlépted a percenkénti kérés-keretet. A Retry-After fejléc megmondja, mennyit kell várni.
400bad_jsonA kérés törzse nem érvényes JSON. Az API csak JSON törzset fogad (Content-Type: application/json).
413too_bigA feltöltött dokumentum nagyobb a megengedettnél. A tényleges korlátot a GET /health limits.document_upload_max_bytes mondja meg.
413payload_too_largeA kérés törzse meg sem érkezett — a kiszolgáló post_max_size korlátján fennakadt. Nem a JSON a hibás, hanem a méret.
422bad_cursorA cursor nem a tőlünk kapott next_cursor. Add vissza változtatás nélkül — a kurzor opak.
422bad_tierEzzel a hozzáférési szinttel nem adható ki link (csak legitimate_interest és authority).
501needs_migrationA szolgáltatás egy még nem aktivált adatbázis-frissítést igényel. Szándékosan hibázunk, nem adunk fél adatot — jelezd nekünk, és élesítjük.

BatteryPass gazdasági-szereplő API

A fenti /api/v1 a mi felületünk. Emellett üzemeltetünk egy szabvány szerinti felületet is: a CEN-CENELEC JTC 24 életciklus-API (EN 18222) „Digital Product Passport – Life Cycle API v1.1" végpontjait, azon a nyelven, ahogy az akkumulátor-ökoszisztéma többi szereplője beszél. Ezt akkor érdemes használni, ha a partnered szabványos integrációt vár, nem a mi API-nkat.

Megfelelőség: a felület a BatteryPass-Ready megfelelőségi suite mind a 11 tesztjén átmegy (olvasás azonosítóval és termékazonosítóval, adatelem-olvasás, hozzáférés-szűrés, visszavont útlevél, módosítás, attribútum hozzáadása és törlése, jogosultság-ellenőrzés, piacra hozatal). A vizsgálat élő rendszert tesztel, nem beküldött fájlt.

Alap-URL és hitelesítés

https://veridyn.eu/eo — hitelesítés: Authorization: Bearer {JWT}. A tokenben szerepkör van (public, purchaser, authority, economic_operator…), és a válasz mezőnként szűrődik hozzá — ugyanazzal a gépezettel, ami a publikus útlevelet is szűri. Írni csak a gazdasági szereplő tud.

Honnan van a token

A tokent a saját fejlesztői kulcsoddal kéred — nincs külön regisztráció:

curl -X POST https://veridyn.eu/api/v1/eo/token \
  -H "Authorization: Bearer vk_<kulcs>" \
  -H "Content-Type: application/json" \
  -d '{"ttl":3600}'
{
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIs…",
    "token_type": "Bearer",
    "role": "economic_operator",
    "expires_in": 3600,
    "expires_at": "2026-09-25T11:14:02+00:00",
    "api_base": "https://veridyn.eu/eo"
  }
}

A token a kulcs fiókjára szól — a bérlőt szándékosan nem a kérésből vesszük, így nem lehet más fiók útlevelére szóló tokent kérni. Szerepkör csak economic_operator lehet: ez az „ez az én termékem" szerep. A authority vagy recycler más fél nevében szól, azt magának senki nem oszthatja ki — arra a lejáró hozzáférési linkek valók.

A ttl másodpercben, 5 perc és 24 óra között (alapértelmezés 1 óra). A plafon szándékos: a JWT önhordó, nincs feketelistánk, tehát egy elvesztett hosszú életű tokent nem tudnánk visszavonni. Rövid token + újrakérés a helyes minta. Csak-olvasó kulcsból nem születik token (403 read_only), mert a gazdasági szereplő szerepkör írásra is jogosít.

MetódusÚtvonalLeírás
POST/dppsÚj útlevél a beküldött JTC24-dokumentumból. Válasz: az azonosító (szöveg), 201.
GET/dpps/{dppId}Olvasás útlevél-azonosítóval.
PATCH/dpps/{dppId}Részleges módosítás (RFC 7396) — új verziót hoz létre. A null érték törli a mezőt.
DELETE/dpps/{dppId}Visszavonás. Az útlevél megmarad (a hatóság visszamenőleg is kérheti), de ezen a felületen 404.
GET/PATCH/dpps/{dppId}/elements/{path}Egy adatelem olvasása/módosítása, pontozott útvonallal.
GET/PATCH/dpps/{dppId}/collections/{group}Egy adatcsoport (pl. performanceAndDurability).
GET/dppsByProductId/{productId}Az aktív verzió termékazonosító alapján.
GET/dppsByProductIdAndDate/{productId}A megadott időpontban érvényes verzió. Paraméter: date.
POST/dppsByProductIdsTömeges azonosító-feloldás. Paraméterek: limit, cursor.

Biztonsági mentés és regiszter: az (EU) 2023/1542 szerint az útlevél adatait független szolgáltatónál is tárolni kell, a piacra hozatalt pedig be kell jelenteni. Ha a fiókhoz be van állítva mentés-szolgáltató, minden létrehozás és módosítás után automatikusan elmegy hozzá a másolat — a hívások nyoma visszakereshető.

Webhookok

A Beállítások → Webhookok alatt regisztrálsz egy HTTPS URL-t. Amikor egy termékútlevél létrejön / frissül / archiválódik, a Veridyn egy aláírt JSON-t POST-ol arra az URL-re — így a rendszered valós időben értesül, kérdezgetés nélkül.

Események

product.created · product.updated · product.archived · product.restored · children.updated · scan.milestone · scan.clone_suspected

A children.updated a gyerek-útlevelek tömeges frissítéséről szól, és szándékosan egyetlen, összesítő esemény — nem soronként egy. Adata: { parent_id, category, count, items }, ahol az items a ténylegesen megváltozott gyerek-útleveleket sorolja { id, serial, lot } alakban (a unchanged sorok nem kerülnek bele). A soronkénti indoklást a hívás válasza tartalmazza, nem a webhook — azt a hívó kapja meg, aki a frissítést indította.

A scan.milestone akkor jön, amikor egy termékútlevél beolvasás-száma átlép egy mérföldkövet (10, 50, 100, 250, 500, 1000, …) — pl. „az útleveledet 1000-szer nyitották meg". Adata: { product_id, count, milestone }.

A scan.clone_suspected lehetséges hamisítást jelez: egy egyedi (sorszámos) útlevelet szokatlanul sokszor és sok különböző országból/eszközről olvastak be — ez másolt QR-kódra utalhat. Adata: { product_id, count, countries, unique_devices }.

Kézbesítés

POST https://your-system.example/veridyn-webhook
Content-Type: application/json
X-Veridyn-Event: product.updated
X-Veridyn-Event-Id: evt_9f21c4a08b73d5e6f1a20c44
X-Veridyn-Timestamp: 2026-07-02T13:19:11+00:00
X-Veridyn-Signature: sha256=<hmac>

{
  "event_id": "evt_9f21c4a08b73d5e6f1a20c44",
  "event": "product.updated",
  "data": { "id": "a1993ef7-…", "category": "textile", "version_no": 2 },
  "sent_at": "2026-07-02T13:19:11+00:00"
}
💡 Az event_id és a sent_at a törzsben is benne van, nem csak fejlécben — így az aláírás fedi őket, tehát nem hamisíthatók. A fejlécben azért is ott vannak, hogy a törzs feldolgozása előtt tudj naplózni és duplikátumot szűrni; ha a kettő eltér, a törzsben lévő, aláírt érték az irányadó.

Aláírás-ellenőrzés

Az X-Veridyn-Signature a nyers törzs HMAC-SHA256 aláírása a webhook secret-jével (a Beállításokban látod). Így ellenőrzöd — pl. PHP-ban:

$body = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $body, $secret);
if (!hash_equals($expected, $_SERVER['HTTP_X_VERIDYN_SIGNATURE'] ?? '')) {
    http_response_code(401); exit; // érvénytelen aláírás
}

Válaszolj 2xx státusszal. Ha a kézbesítés sikertelen (nem 2xx / időtúllépés), automatikusan újrapróbáljuk exponenciális backoff-fal (kb. 1 perc → 5 perc → 30 perc → 2 óra → 6 óra, max 6 próbálkozás), tartós hiba esetén feladjuk (kb. 8,5 óra után). Az utolsó kézbesítés státusza a Beállításokban látszik, és onnan kézzel újraküldhető.

Duplikátum-szűrés és kimaradt események pótlása

Az újrapróbálkozás azt jelenti, hogy ugyanaz az esemény többször is megérkezhet — például ha a válaszod időtúllépésbe fut, de a feldolgozás nálad már lefutott. Ezért minden eseménynek van event_id-ja: tárold el a feldolgozottakat, és a már látott azonosítót dobd el. Egy tömeges children.updated eseménynél ez különösen számít, mert egyetlen duplikátum 500 sor kétszeri feldolgozását jelentené.

Ha a rendszered tartósan elérhetetlen volt (karbantartás, hétvégi leállás), a 6 próbálkozás elfogyhat, és az esemény elveszne. Erre való a GET /events: az összes kimenő eseményt visszaadja időrendben, kézbesítési állapottal együtt. Jegyezd meg a legutolsó feldolgozott id-t, és onnan folytasd — nem oldalszámmal, mert közben új esemény keletkezhet.

curl "https://veridyn.eu/api/v1/events?after_id=1487&limit=100" \
  -H "Authorization: Bearer vk_<kulcs>"
{
  "data": [
    {
      "id": 1488,
      "event_id": "evt_9f21c4a08b73d5e6f1a20c44",
      "event": "product.updated",
      "data": { "id": "a1993ef7-…", "category": "textile", "version_no": 2 },
      "sent_at": "2026-07-02T13:19:11+00:00",
      "delivery": { "status": "failed", "attempts": 6, "http_status": 502, "url": "https://…" }
    }
  ],
  "after_id": 1487,
  "next_id": 1488
}

A delivery.status lehet delivered (sikeresen kiment), pending (még próbálkozunk) vagy failed (feladtuk). Az esemény akkor is itt van, ha a kézbesítés soha nem sikerült — épp ezért lehet belőle pótolni.

💡 A kategória-sémák (mely mezők kötelezők/opcionálisak) a termékűrlapon és a /schema/{category} végponton látszanak. Jelenleg elérhető: textile, battery és furniture. A séma bővül, ahogy az EU véglegesíti a kategóriákat.

← Beállítások / API-kulcsok