← veridyn.eu
HU EN

Developer API v1

veridyn

Programmatic access to product passports — for webshop/ERP sync and bulk automation.

From the Pro plan

Authentication

Every request authenticates with an API key, in the Authorization header:

Authorization: Bearer vk_<your key>

You create a key under Settings → Developer API. The plaintext key is shown only once, at creation — store it safely. The key grants read/write access to all products in your account, so keep it confidential.

Quick test in the browser

For GET requests you can try it directly in the browser, without a header — pass the key as the ?api_key= parameter:

https://veridyn.eu/api/v1/categories?api_key=vk_<your key>

⚠️ For testing only. A key placed in the URL ends up in browser history and server logs, so in production always use the Authorization: Bearer header. POST/PATCH can only be called with a header (curl/Postman).

Base URL

https://veridyn.eu/api/v1

Responses are application/json, UTF-8 encoded.

Endpoints

MethodPathDescription
GET/categoriesAvailable product categories.
GET/schema/{category}The category's full field list — required + optional, type, enum, localized fields.
GET/productsList of products (summary). Parameters: q, status, page, limit.
POST/productsNew product passport. Body: { category, data }.
GET/products/{id}A product's full data + passport URL.
PATCH/products/{id}Update (partial) — creates a new version. Body: { data }.
GET/products/{id}/qrQR code (SVG) for the public passport.

What to send? (required vs. optional)

Every category has a required core — without it, schema validation rejects the request (422). All other fields are optional, but you can send them in the same data object anytime (more data = a better passport and more future-proof compliance). The exact, machine-readable field list is returned by /schema/{category} — with required: true/false, type, enum and localized markers.

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

All fields by category

= required · = optional · nested sub-field · 🌐 per-language (localized) · 🔒 visible only at authority level. This list is generated from the schema — always up to date.

textile Textile & apparel19 fields

FieldTypeReq.Description
productNamestringProduct name — A termék neve, ahogy a vásárló a passporton látni fogja.
skustringSKU — Belső cikkszám / azonosító — a te rendszeredből.
brandNamestringBrand
gtinstringGTIN (optional) — A vonalkód száma (GTIN-8/12/13/14). Az ellenőrzőszámot a rendszer validálja. Ha nincs, hagyd üresen.
economicOperatorobjectEconomic operator
  ↳ rolestring (enum)Role — 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)
  ↳ legalNamestringLegal name
  ↳ addressstringAddress
  ↳ countrystringCountry (ISO 3166-1 alpha-2) — Kétbetűs ISO országkód, nagybetűvel — pl. HU, DE, IT
  ↳ contactEmailstringContact email — Ide fordulhat a vásárló vagy a hatóság.
  ↳ operatorIdstringUnique operator ID (GS1 GLN) — 13 jegyű GS1 GLN — EU DPP egyedi gazdasági szereplő-azonosító. Ha nincs, hagyd üresen.
  ↳ eori 🔒stringEORI number — 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]Languages (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]Fibre composition — Miből készült a termék. A százalékok összege pontosan 100 legyen. pl. pamut 95 + elasztán 5
  ↳ fiberstringFibre
  ↳ percentagenumberPercentage
recycledContentPercentagenumberRecycled content (%) — Az újrahasznosított anyag aránya a termékben. Ha nem releváns, hagyd üresen.
countryOfManufacturestringCountry of manufacture (ISO) — Ahol a végtermék készült. Kétbetűs ISO kód, pl. PT, TR, HU
supplyChainStagesarray[object]Supply chain stages — Hol készült melyik munkafázis (fonás, szövés, festés, összeszerelés…). Opcionális, de növeli a bizalmat.
  ↳ stagestring (enum)Stage (spinning · weaving · knitting · dyeing · finishing · assembly)
  ↳ countrystringCountry (ISO)
  ↳ facilityNamestringFacility name
  ↳ facilityIdstringUnique facility ID (GS1 GLN)
careInstructions 🌐objectCare instructions — Mosás, szárítás, vasalás — nyelvenként egy-egy szöveg.
repairobjectRepairability — Javítható-e, és hogyan. A „javítható” és „alkatrész elérhető” mezők kötelezőek.
  ↳ repairablebooleanRepairable
  ↳ instructions 🌐objectRepair instructions — Hogyan javítható — nyelvenként (opcionális).
  ↳ sparePartsAvailablebooleanSpare parts available (e.g. button, zip)
substancesOfConcernarray[object]Substances of concern — Aggályos anyagok (pl. REACH SVHC), ha a termékben jelen vannak. A legtöbb terméknél üresen hagyható.
  ↳ namestringName
  ↳ casNumberstringCAS number
  ↳ concentrationRangestringConcentration range
durabilityobjectDurability — Tartóssági adatok, ha van mérésed (opcionális).
  ↳ testResultsstringTest results
  ↳ pefScorenumberPEF score — Product Environmental Footprint pontszám, ha van. (opcionális)
carbonFootprintnumberCarbon footprint (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.
waterFootprintnumberWater footprint (litres) — A gyártáshoz felhasznált víz mennyisége literben. Opcionális.
weightGramsnumberWeight (grams) — A termék tömege grammban. Opcionális.
endOfLifeobjectEnd of life — Mi legyen a termékkel a használat után — nyelvenként kitöltve.
  ↳ recyclingInstructions 🌐objectRecycling instructions — Hogyan hasznosítható újra — nyelvenként.
  ↳ disposalInstructions 🌐objectDisposal instructions — Ha nem újrahasznosítható — nyelvenként.
complianceDocumentsarray[object]Compliance documents — Tanúsítványok, megfelelőségi dokumentumok linkjei (opcionális). pl. OEKO-TEX, GOTS.
  ↳ typestringType
  ↳ urlstringURL

battery Battery26 fields

FieldTypeReq.Description
productNamestringProduct name — Az akkumulátor neve, ahogy a vásárló a passporton látni fogja.
skustringSKU — Belső cikkszám / azonosító — a te rendszeredből.
brandNamestringBrand
gtinstringGTIN (optional) — A vonalkód száma (GTIN-8/12/13/14). Az ellenőrzőszámot a rendszer validálja. Ha nincs, hagyd üresen.
economicOperatorobjectEconomic operator
  ↳ rolestring (enum)Role — 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)
  ↳ legalNamestringLegal name
  ↳ addressstringAddress
  ↳ countrystringCountry (ISO 3166-1 alpha-2) — Kétbetűs ISO országkód, nagybetűvel — pl. HU, DE, IT
  ↳ contactEmailstringContact email — Ide fordulhat a vásárló vagy a hatóság.
  ↳ operatorIdstringUnique operator ID (GS1 GLN) — 13 jegyű GS1 GLN — EU DPP egyedi gazdasági szereplő-azonosító. Ha nincs, hagyd üresen.
  ↳ eori 🔒stringEORI number — 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]Languages (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)Battery category — 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)Cell chemistry — Az akkumulátor cellakémiai típusa. (nmc · nca · lfp · lmo · lto · nimh · lead_acid · sodium_ion …)
weightKgnumberWeight (kg) — Az akkumulátor tömege kilogrammban.
countryOfManufacturestringCountry of manufacture (ISO) — Ahol az akku készült. Kétbetűs ISO kód, pl. DE, HU, CN
manufacturingDatestringManufacturing date / year — A gyártás éve vagy év-hónapja, ISO formátumban: ÉÉÉÉ, ÉÉÉÉ-HH vagy ÉÉÉÉ-HH-NN.
ratedCapacitynumberRated capacity (Ah) — Névleges kapacitás amperóra (Ah).
energyWhnumberEnergy (Wh) — Teljes energiatartalom wattórában (Wh). Opcionális.
nominalVoltagenumberNominal voltage (V) — Névleges feszültség voltban. Opcionális.
expectedLifetimeCyclesnumberExpected lifetime (charge cycles) — A garantált / várható teljes töltési ciklusok száma. Opcionális.
stateOfHealth 🔒numberState 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.
carbonFootprintnumberCarbon footprint (kg CO₂e / kWh) — Az akku teljes életciklusra vetített szénlábnyoma, kg CO₂-egyenérték per kWh teljes energia.
carbonFootprintClassstringCarbon footprint class (A–G) — A rendelet szerinti CF-teljesítményosztály, ha rendelkezésre áll. Opcionális.
carbonFootprintStudyUrlstringCarbon footprint study (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]Carbon footprint by lifecycle stage — A szénlábnyom megbontása életciklus-szakaszokra (kg CO₂e / kWh) — a CF-delegált aktus ezt várja. Opcionális.
  ↳ stagestring (enum)Lifecycle stage (raw_material · main_production · distribution · recycling)
  ↳ valuenumberValue (kg CO₂e / kWh)
recycledContentarray[object]Recycled raw-material content — 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)Material (cobalt · lithium · nickel · lead)
  ↳ percentagenumberRecycled share (%)
hazardousSubstancesarray[object]Hazardous substances — Az akkuban jelen lévő veszélyes anyagok (a higany, kadmium, ólom felett). A legtöbb adatlapnál releváns.
  ↳ namestringName
  ↳ casNumberstringCAS number
  ↳ concentrationRangestringConcentration range
safetyInformation 🌐objectSafety information — Kezelési, tárolási és vészhelyzeti tudnivalók — nyelvenként egy-egy szöveg.
dueDiligenceUrl 🔒stringSupply chain due diligence report (URL) — A rendelet szerinti due diligence (átvilágítási) szabályzat/jelentés linkje. Jogos érdekű felek hozzáférési szint (Art. 77(4)) — nem publikus. Opcionális.
endOfLifeobjectEnd of life — Gyűjtés, újrahasznosítás, szétszerelés — nyelvenként kitöltve.
  ↳ recyclingInstructions 🌐objectCollection / recycling — Hová vihető vissza, hogyan hasznosítható újra — nyelvenként.
  ↳ disposalInstructions 🌐objectDisposal / warnings — Tilalmak, veszélyek — nyelvenként.
complianceDocumentsarray[object]Compliance documents — Tanúsítványok, megfelelőségi és teszt-dokumentumok linkjei (opcionális). pl. CE, UN 38.3.
  ↳ typestringType
  ↳ urlstringURL

Languages

The languages field (e.g. ["hu","en"]) declares which languages have free-text content. The localized fields (care, end-of-life… — "localized": true in /schema) must be filled only in the first (primary) language; the rest are optional, falling back to an available language if missing. The passport's UI labels are translated to 24 languages automatically, independently of this.

Examples

Create a product

curl -X POST https://veridyn.eu/api/v1/products \
  -H "Authorization: Bearer vk_<key>" \
  -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":"hello@lumora.hu"
      }
    }
  }'

Response (201):

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

List

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

Get a product

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

Update (new version)

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

The provided fields are merged onto the existing data (partial update), then validated, and a new, retained version is created — the full change history is preserved.

Response & errors

Success: the payload is under the data key. On error:

{ "error": "Invalid data.", "code": "validation", "errors": [ … ] }
HTTPcodeMeaning
401unauthorizedMissing/invalid API key.
403plan_requiredThe API is available from the Pro plan.
404not_foundNo such product / route.
409gtin_takenThe GTIN is already taken.
422validationInvalid data (details in errors).

Webhooks

Under Settings → Webhooks you register an HTTPS URL. When a product passport is created / updated / archived, Veridyn POSTs a signed JSON to that URL — so your system is notified in real time, without polling.

Events

product.created · product.updated · product.archived · product.restored

Delivery

POST https://your-system.example/veridyn-webhook
Content-Type: application/json
X-Veridyn-Event: product.updated
X-Veridyn-Signature: sha256=<hmac>

{
  "event": "product.updated",
  "data": { "id": "a1993ef7-…", "category": "textile", "version_no": 2 },
  "sent_at": "2026-07-02T13:19:11+00:00"
}

Signature verification

The X-Veridyn-Signature is the HMAC-SHA256 of the raw body with the webhook secret (shown in Settings). Verify it — e.g. in PHP:

$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; // invalid signature}

Respond with a 2xx status. Delivery is best-effort (short timeout); the status of the last delivery is shown in Settings.

💡 The category schemas (which fields are required/optional) are visible on the product form and via the /schema/{category} endpoint. Currently available: textile and battery. The schema grows as the EU finalises categories.

← Settings / API keys