← veridyn.eu
HU EN DE

Entwickler-API v1

veridyn

Programmatischer Zugriff auf die Produktpässe — für Webshop-/ERP-Sync und Massenautomatisierung.

ab dem Pro-Tarif

Während der offenen Beta steht die API allen Beta-Konten zur Verfügung — die Pro-Voraussetzung gilt erst nach der Beta.

Authentifizierung

Jede Anfrage authentifiziert sich mit einem API-Schlüssel im Authorization-Header:

Authorization: Bearer vk_<Ihr Schlüssel>

Einen Schlüssel erstellen Sie unter Einstellungen → Entwickler-API. Den Klartext-Schlüssel zeigen wir nur einmal, bei der Erstellung — bewahren Sie ihn sicher auf. Der Schlüssel gewährt Lese- und Schreibzugriff auf alle Produkte Ihres Kontos, behandeln Sie ihn daher vertraulich.

Schnelltest im Browser

Der Schlüssel gehört ausschließlich in den Authorization-Header — aus Sicherheitsgründen nicht als URL-Parameter (er würde im Browserverlauf und in den Server-Logs landen). Probieren Sie es zum Beispiel mit curl:

curl -H "Authorization: Bearer vk_<Ihr Schlüssel>" https://veridyn.eu/api/v1/categories

Schlüssel-Geltungsbereich (Scope)

Beim Erstellen eines Schlüssels wählen Sie einen Geltungsbereich: Voll (Lesen + Schreiben) oder Nur Lesen (read-only). Ein read-only-Schlüssel darf ausschließlich GET aufrufen — bei POST/PATCH/DELETE lautet die Antwort 403 read_only. Für ERP- oder Anzeige-Integrationen verwenden Sie einen read-only-Schlüssel.

Anfragelimit (Rate Limit)

Pro Schlüssel je nach Tarif 120–600 Anfragen / Minute (Pro 120 · Business 300 · Enterprise 600; während der offenen Beta 300). Jede Antwort enthält die Header X-RateLimit-Limit, X-RateLimit-Remaining und X-RateLimit-Reset (Unix-Zeit). Wird das Limit überschritten, lautet die Antwort 429 rate_limited mit dem Header Retry-After — warten Sie die angegebene Zeit ab und versuchen Sie es dann erneut.

Idempotenz

Sie können POST-Anfragen einen eindeutigen Idempotency-Key-Header mitgeben. Senden Sie die Anfrage mit demselben Schlüssel erneut (z. B. nach einem Netzwerkfehler), erhalten Sie die ursprüngliche Antwort zurück — es entsteht kein Duplikat. Eine wiederholte Antwort erkennen Sie am Header Idempotency-Replayed: true.

OpenAPI

Maschinenlesbare API-Beschreibung (OpenAPI 3.1) — für den Postman-Import und die SDK-/Codegenerierung:

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

⚡ Interaktive API-Referenz

Durchsuchbare Endpunkt-Referenz zum Blättern — direkt aus der obigen Spezifikation gerendert.

DPP-Vokabular (JSON-LD-Namensraum)

Die maschinenlesbare Fassung des öffentlichen Passes ist JSON-LD: Die Standardfelder stammen von schema.org, die DPP-spezifischen Felder aus dem Namensraum dpp:. Dieser Namensraum ist auflösbar — öffnen Sie ihn, um die Bedeutung jedes Feldes zu sehen; mit dem Header Accept: application/ld+json liefert er das maschinenlesbare @context-Dokument.

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

Ein einzelner Pass als Daten: die öffentliche URL mit ?format=jsonld (oder dem Header Accept: application/ld+json).

Postman-Collection

Fertige, importierbare Collection (mit voreingestellten Variablen und Beispielanfragen). Nach dem Import füllen Sie nur die Collection-Variablen base_url und api_key aus.

⬇ Postman-Collection herunterladen

Eigenes SDK generieren

Aus der OpenAPI-Spezifikation erzeugen Sie mit openapi-generator einen offiziellen Client für jede Sprache — kein handgepflegtes SDK, immer aktuell. Z. B. PHP:

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

Der Wert von -g kann typescript-fetch, python, java und vieles mehr sein.

Schnellstart (Code)

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();

Basis-URL

https://veridyn.eu/api/v1

Die Antworten haben das Format application/json und sind UTF-8-kodiert.

Endpunkte

MethodePfadBeschreibung
GET/categoriesVerfügbare Produktkategorien.
GET/schema/{category}Die vollständige Feldliste der Kategorie — Pflicht + optional, Typ, Enum, sprachabhängige Felder.
GET/productsListe der Produkte (Zusammenfassung). Parameter: q, status, page, limit.
POST/productsNeuer Produktpass. Body: { category, data }.
GET/products/{id}Die vollständigen Daten eines Produkts + Pass-URL.
PATCH/products/{id}Aktualisierung (partiell) — erzeugt eine neue Version. Body: { data, change_type? }. change_type ist optional: correction (im Modell standen falsche Daten → bereits ausgegebene Chargen-/Stückpässe veralten und können aufgefrischt werden) oder change (das Produkt hat sich ab einem bestimmten Datum geändert → die Daten früherer Stücke bleiben korrekt und werden nicht überschrieben).
GET/products/{id}/qrQR-Code (SVG) für den öffentlichen Produktpass.
GET/products/{id}/childrenListe der untergeordneten Chargen-/Stückpässe.
POST/products/{id}/childrenChargen-/Stückpass. Einzeln: { level, lot|serial, data } · als Masse: { level, items:[…] } (max. 500). Erbt die Daten des Elternpasses.
GET/products/{id}/scansScan-Zusammenfassung je Produkt: total, unique, byCountry, byDevice. Parameter: days=7|30|90|365.
GET/scansKontoweite Scan-Zusammenfassung: das Obige + byCategory, byLevel.

Was müssen Sie angeben? (Pflicht vs. optional)

Jede Kategorie hat einen Pflichtkern — ohne ihn weist die Schemavalidierung die Anfrage ab (422). Alle übrigen Felder sind optional, Sie können sie aber jederzeit im selben data-Objekt mitschicken (mehr Daten = besserer Produktpass und zukunftssicherere Compliance). Die genaue, maschinenlesbare Feldliste liefert /schema/{category} — mit required: true/false, Typ, Enum und localized-Kennzeichnung.

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

Alle Felder nach Kategorie

= Pflicht · = optional · verschachteltes Unterfeld · 🌐 je Sprache (localized) · 🔒 nur auf Behördenebene sichtbar. Diese Liste wird aus dem Schema generiert — immer aktuell.

textile Textilien & Bekleidung20 Felder

FeldTypPfl.Beschreibung
productNamestringProduktname — Der Produktname, wie ihn der Käufer im Produktpass sehen wird.
skustringSKU — Interne Artikelnummer / Kennung — aus Ihrem System.
brandNamestringMarke
gtinstringGTIN (optional) — Die Barcode-Nummer (GTIN-8/12/13/14). Die Prüfziffer wird vom System validiert. Wenn nicht vorhanden, leer lassen.
commodityCodestringWarennummer (KN/HS, optional) — Zoll-/Tarifeinreihung: Kombinierte Nomenklatur (CN, 8 Stellen) oder HS-Code. Pflicht-Metadatum des EU-DPP-Registers bei der Registrierung — steht auf den Liefer-/Zollpapieren.
economicOperatorobjectWirtschaftsakteur
  ↳ rolestring (enum)Rolle — Wer das Produkt auf dem EU-Markt in Verkehr bringt und dafür haftet. Bei den meisten Herstellern: Hersteller. (manufacturer · importer · authorized_representative · distributor · dealer · fulfilment_service_provider)
  ↳ legalNamestringRechtlicher Name
  ↳ addressstringAdresse
  ↳ countrystringLand (ISO 3166-1 alpha-2) — Zweistelliger ISO-Ländercode, in Großbuchstaben — z. B. HU, DE, IT
  ↳ contactEmailstringKontakt-E-Mail — Hierher können sich Käufer oder Behörden wenden.
  ↳ operatorIdstringEindeutige Akteurs-ID (GS1 GLN) — 13-stellige GS1 GLN — eindeutige Akteurs-ID für den EU-DPP. Wenn nicht vorhanden, leer lassen.
  ↳ eori 🔒stringEORI-Nummer — EORI-Nummer des Wirtschaftsakteurs (Zoll- / EU-DPP-Registrierungskennung) — das Register identifiziert Sie darüber. Nur auf Behörden-Zugriffsebene sichtbar. Wenn nicht vorhanden, leer lassen.
languagesarray[string]Sprachen (BCP-47) — In welchen Sprachen der Produktpass erscheinen soll. Die lokalisierten Felder (Pflege, Lebenszyklus) müssen in jeder hier aufgeführten Sprache ausgefüllt werden. z. B. hu, en
fiberCompositionarray[object]Faserzusammensetzung — Woraus das Produkt besteht. Die Prozentwerte müssen genau 100 ergeben. z. B. Baumwolle 95 + Elasthan 5
  ↳ fiberstringFaser
  ↳ percentagenumberProzentsatz
recycledContentPercentagenumberRezyklatanteil — Rezyklatanteil im Produkt. Wenn nicht relevant, leer lassen.
countryOfManufacturestringHerstellungsland (ISO) — Wo das Endprodukt hergestellt wurde. Zweistelliger ISO-Code, z. B. PT, TR, HU
supplyChainStagesarray[object]Stufen der Lieferkette — Wo welche Fertigungsstufe stattfand (Spinnen, Weben, Färben, Konfektion…). Optional, schafft aber Vertrauen. Stufe und Land sind öffentlich; Name und ID der Anlage sind geschützt — nur für Parteien mit berechtigtem Interesse (und Behörden) über Token-Link sichtbar.
  ↳ stagestring (enum)Stufe (spinning · weaving · knitting · dyeing · finishing · assembly)
  ↳ countrystringLand (ISO)
  ↳ facilityName 🔒stringName der Anlage
  ↳ facilityId 🔒stringEindeutige Anlagen-ID (GS1 GLN)
careInstructions 🌐objectPflegehinweise — Waschen, Trocknen, Bügeln — je Sprache ein Text.
repairobjectReparierbarkeit — Ob und wie reparierbar. Die Felder „Reparierbar“ und „Ersatzteile verfügbar“ sind Pflichtfelder.
  ↳ repairablebooleanReparierbar
  ↳ instructions 🌐objectReparaturhinweise — Wie es repariert werden kann — je Sprache (optional).
  ↳ sparePartsAvailablebooleanErsatzteile verfügbar (z. B. Knopf, Reißverschluss)
substancesOfConcernarray[object]Besorgniserregende Stoffe — Besorgniserregende Stoffe (z. B. REACH SVHC), falls im Produkt enthalten. Bei den meisten Produkten kann das Feld leer bleiben.
  ↳ namestringName
  ↳ casNumberstringCAS-Nummer
  ↳ concentrationRangestringKonzentrationsbereich
durabilityobjectHaltbarkeit — Haltbarkeitsdaten, falls Ihnen Messwerte vorliegen (optional).
  ↳ testResultsstringTestergebnisse
  ↳ pefScorenumberPEF-Wert — Product Environmental Footprint-Wert, falls vorhanden. (optional)
carbonFootprintnumberCO₂-Fußabdruck (kg CO₂e) — Gesamter CO₂-Fußabdruck des Produkts in kg CO₂-Äquivalent. Im Thema „Impact“ erscheint er als Vergleich „≈ km mit dem Auto“.
waterFootprintnumberWasser-Fußabdruck (Liter) — Für die Herstellung verbrauchte Wassermenge in Litern. Optional.
weightGramsnumberGewicht (Gramm) — Gewicht des Produkts in Gramm. Optional.
endOfLifeobjectLebensende — Was mit dem Produkt nach der Nutzung geschehen soll — je Sprache auszufüllen.
  ↳ recyclingInstructions 🌐objectRecyclinghinweise — Wie es recycelt werden kann — je Sprache.
  ↳ disposalInstructions 🌐objectEntsorgungshinweise — Falls nicht recycelbar — je Sprache.
complianceDocumentsarray[object]Konformitätsdokumente — Links zu Zertifikaten und Konformitätsdokumenten (optional). z. B. OEKO-TEX, GOTS.
  ↳ typestringTyp
  ↳ urlstringURL

battery Batterie27 Felder

FeldTypPfl.Beschreibung
productNamestringProduktname — Der Name der Batterie, wie ihn der Käufer im Produktpass sehen wird.
skustringSKU — Interne Artikelnummer / Kennung — aus Ihrem System.
brandNamestringMarke
gtinstringGTIN (optional) — Die Barcode-Nummer (GTIN-8/12/13/14). Die Prüfziffer wird vom System validiert. Wenn nicht vorhanden, leer lassen.
commodityCodestringWarennummer (KN/HS, optional) — Zoll-/Tarifeinreihung: Kombinierte Nomenklatur (CN, 8 Stellen) oder HS-Code. Pflicht-Metadatum des EU-DPP-Registers bei der Registrierung — steht auf den Liefer-/Zollpapieren.
economicOperatorobjectWirtschaftsakteur
  ↳ rolestring (enum)Rolle — Wer das Produkt auf dem EU-Markt in Verkehr bringt und dafür haftet. Bei den meisten Herstellern: Hersteller. (manufacturer · importer · authorized_representative · distributor · dealer · fulfilment_service_provider)
  ↳ legalNamestringRechtlicher Name
  ↳ addressstringAdresse
  ↳ countrystringLand (ISO 3166-1 alpha-2) — Zweistelliger ISO-Ländercode, in Großbuchstaben — z. B. HU, DE, IT
  ↳ contactEmailstringKontakt-E-Mail — Hierher können sich Käufer oder Behörden wenden.
  ↳ operatorIdstringEindeutige Akteurs-ID (GS1 GLN) — 13-stellige GS1 GLN — eindeutige Akteurs-ID für den EU-DPP. Wenn nicht vorhanden, leer lassen.
  ↳ eori 🔒stringEORI-Nummer — EORI-Nummer des Wirtschaftsakteurs (Zoll- / EU-DPP-Registrierungskennung) — das Register identifiziert Sie darüber. Nur auf Behörden-Zugriffsebene sichtbar. Wenn nicht vorhanden, leer lassen.
languagesarray[string]Sprachen (BCP-47) — In welchen Sprachen der Produktpass erscheinen soll. Die lokalisierten Felder (Sicherheit, Lebenszyklus) müssen in jeder hier aufgeführten Sprache ausgefüllt werden. z. B. hu, en
batteryCategorystring (enum)Batteriekategorie — Kategorie gemäß (EU) 2023/1542. Der Produktpass ist zuerst für EV-, Industrie- (> 2 kWh) und LMT-Batterien verpflichtend (18. Februar 2027). (portable · lmt · ev · industrial · sli)
cellChemistrystring (enum)Zellchemie — Der Zellchemie-Typ der Batterie. (nmc · nca · lfp · lmo · lto · nimh · lead_acid · sodium_ion …)
weightKgnumberGewicht (kg) — Gewicht der Batterie in Kilogramm.
countryOfManufacturestringHerstellungsland (ISO) — Wo die Batterie hergestellt wurde. Zweistelliger ISO-Code, z. B. DE, HU, CN
manufacturingDatestringHerstellungsdatum / -jahr — Jahr oder Jahr-Monat der Herstellung, im ISO-Format: JJJJ, JJJJ-MM oder JJJJ-MM-TT.
ratedCapacitynumberNennkapazität (Ah) — Nennkapazität in Amperestunden (Ah).
energyWhnumberEnergie (Wh) — Gesamtenergieinhalt in Wattstunden (Wh). Optional.
nominalVoltagenumberNennspannung (V) — Nennspannung in Volt. Optional.
expectedLifetimeCyclesnumberErwartete Lebensdauer (Ladezyklen) — Anzahl der garantierten / erwarteten Ladezyklen insgesamt. Optional.
stateOfHealth 🔒numberGesundheitszustand — Gesundheitszustand der Batterie in % der ursprünglichen Kapazität (bei neuer Batterie 100). STÜCK-SPEZIFISCH und dynamisch — gehört idealerweise auf die Einheits-Ebene (nicht in das Modell-Template). Optional.
carbonFootprintnumberCO₂-Fußabdruck (kg CO₂e / kWh) — CO₂-Fußabdruck der Batterie über den gesamten Lebenszyklus, in kg CO₂-Äquivalent pro kWh Gesamtenergie.
carbonFootprintClassstringCO₂-Fußabdruck-Klasse (A–G) — CF-Leistungsklasse gemäß Verordnung, sofern verfügbar. Optional.
carbonFootprintStudyUrlstringCO₂-Fußabdruck-Studie (URL) — Link zur Studie / Dokumentation, auf der die CO₂-Fußabdruck-Berechnung beruht (gemäß delegiertem CF-Rechtsakt). Optional.
carbonFootprintBreakdownarray[object]CO₂-Fußabdruck nach Lebenszyklusphase — Aufschlüsselung des CO₂-Fußabdrucks nach Lebenszyklusphasen (kg CO₂e / kWh) — so vom delegierten CF-Rechtsakt erwartet. Optional.
  ↳ stagestring (enum)Lebenszyklusphase (raw_material · main_production · distribution · recycling)
  ↳ valuenumberWert (kg CO₂e / kWh)
recycledContentarray[object]Anteil recycelter Rohstoffe — Anteil recycelter kritischer Rohstoffe je Material (Kobalt, Lithium, Nickel, Blei). Optional, wird von der Verordnung aber zunehmend strenger erwartet.
  ↳ materialstring (enum)Material (cobalt · lithium · nickel · lead)
  ↳ percentagenumberRecyclinganteil
hazardousSubstancesarray[object]Gefahrstoffe — In der Batterie enthaltene Gefahrstoffe (über Quecksilber, Cadmium, Blei hinaus). Bei den meisten Datenblättern relevant.
  ↳ namestringName
  ↳ casNumberstringCAS-Nummer
  ↳ concentrationRangestringKonzentrationsbereich
safetyInformation 🌐objectSicherheitshinweise — Hinweise zu Handhabung, Lagerung und Notfällen — je Sprache ein Text.
dueDiligenceUrl 🔒stringSorgfaltspflichtenbericht der Lieferkette (URL) — Link zur Sorgfaltspflichten-Strategie / zum Sorgfaltspflichtenbericht gemäß Verordnung. Zugriffsebene für Parteien mit berechtigtem Interesse (Art. 77(4)) — nicht öffentlich. Optional.
endOfLifeobjectLebensende — Sammlung, Recycling, Demontage — je Sprache auszufüllen.
  ↳ recyclingInstructions 🌐objectSammlung / Recycling — Wo es zurückgegeben und wie es recycelt werden kann — je Sprache.
  ↳ disposalInstructions 🌐objectEntsorgung / Warnhinweise — Verbote und Gefahren — je Sprache.
complianceDocumentsarray[object]Konformitätsdokumente — Links zu Zertifikaten, Konformitäts- und Prüfdokumenten (optional). z. B. CE, UN 38.3.
  ↳ typestringTyp
  ↳ urlstringURL

furniture Möbel20 Felder

FeldTypPfl.Beschreibung
productNamestringProduktname — Der Produktname, wie ihn der Käufer im Produktpass sehen wird.
skustringSKU — Interne Artikelnummer / Kennung — aus Ihrem System.
brandNamestringMarke
gtinstringGTIN (optional) — Die Barcode-Nummer (GTIN-8/12/13/14). Die Prüfziffer wird vom System validiert. Wenn nicht vorhanden, leer lassen.
commodityCodestringWarennummer (KN/HS, optional) — Zoll-/Tarifeinreihung: Kombinierte Nomenklatur (CN, 8 Stellen) oder HS-Code. Pflicht-Metadatum des EU-DPP-Registers bei der Registrierung — steht auf den Liefer-/Zollpapieren.
economicOperatorobjectWirtschaftsakteur
  ↳ rolestring (enum)Rolle — Wer das Produkt auf dem EU-Markt in Verkehr bringt und dafür haftet. Bei den meisten Herstellern: Hersteller. (manufacturer · importer · authorized_representative · distributor · dealer · fulfilment_service_provider)
  ↳ legalNamestringRechtlicher Name
  ↳ addressstringAdresse
  ↳ countrystringLand (ISO 3166-1 alpha-2) — Zweistelliger ISO-Ländercode, in Großbuchstaben — z. B. HU, DE, IT
  ↳ contactEmailstringKontakt-E-Mail — Hierher können sich Käufer oder Behörden wenden.
  ↳ operatorIdstringEindeutige Akteurs-ID (GS1 GLN) — 13-stellige GS1 GLN — eindeutige Akteurs-ID für den EU-DPP. Wenn nicht vorhanden, leer lassen.
  ↳ eori 🔒stringEORI-Nummer — EORI-Nummer des Wirtschaftsakteurs (Zoll- / EU-DPP-Registrierungskennung) — das Register identifiziert Sie darüber. Nur auf Behörden-Zugriffsebene sichtbar. Wenn nicht vorhanden, leer lassen.
languagesarray[string]Sprachen (BCP-47) — In welchen Sprachen der Produktpass erscheinen soll. Die lokalisierten Felder (Pflege, Montage, Lebenszyklus) müssen in jeder hier aufgeführten Sprache ausgefüllt werden. z. B. hu, en
materialCompositionarray[object]Materialzusammensetzung — Woraus das Möbelstück besteht. Die Prozentwerte müssen genau 100 ergeben. z. B. Eiche massiv 80 + Metall 20
  ↳ materialstring (enum)Material (wood · engineeredWood · metal · plastic · glass · textile · foam · leather …)
  ↳ percentagenumberProzentsatz
woodCertificationobjectHolzherkunft & Zertifizierung — Nachhaltige Herkunft und Zertifizierung des verwendeten Holzes, sofern relevant (optional).
  ↳ schemestring (enum)Zertifizierungssystem — Zertifizierung des Holzes für nachhaltige Waldbewirtschaftung. (fsc · pefc · none)
  ↳ countrystringUrsprungsland (ISO) — Ursprungsland des Holzes. Zweistelliger ISO-Code, z. B. AT, SE, RO. Optional.
dimensionsobjectAbmessungen & Gewicht — Außenmaße und Gewicht des Möbelstücks (optional).
  ↳ widthnumberBreite (cm)
  ↳ depthnumberTiefe (cm)
  ↳ heightnumberHöhe (cm)
  ↳ weightKgnumberGewicht (kg)
countryOfManufacturestringHerstellungsland (ISO) — Wo das Endprodukt hergestellt wurde. Zweistelliger ISO-Code, z. B. PL, RO, HU
careInstructions 🌐objectPflegehinweise — Reinigung, Pflege, Oberflächenpflege — je Sprache ein Text.
assemblyInstructions 🌐objectMontageanleitung — Wie das Möbelstück montiert wird — je Sprache (optional). Ein Link ist ebenfalls möglich.
repairobjectReparierbarkeit — Ob und wie reparierbar. Die Felder „Reparierbar“ und „Ersatzteile verfügbar“ sind Pflichtfelder.
  ↳ repairablebooleanReparierbar
  ↳ instructions 🌐objectReparaturhinweise — Wie es repariert werden kann — je Sprache (optional).
  ↳ sparePartsAvailablebooleanErsatzteile verfügbar (z. B. Beschläge, Bein)
  ↳ sparePartsUrlstringErsatzteile (URL) — Wo Ersatzteile bestellt werden können (optional).
warrantyMonthsnumberGarantie (Monate) — Dauer der Herstellergarantie in Monaten. Optional.
substancesOfConcernarray[object]Besorgniserregende Stoffe — Besorgniserregende Stoffe (z. B. REACH SVHC / SCIP), falls im Produkt enthalten. Bei den meisten Produkten kann das Feld leer bleiben.
  ↳ namestringName
  ↳ casNumberstringCAS-Nummer
  ↳ notestringHinweis
flameRetardantsstring (enum)Flammschutzmittel — Ob das Produkt (insbesondere Polster / Schaumstoff) Flammschutzmittel enthält. Optional. (present · absent · unknown)
complianceDocumentsarray[object]Konformitätsdokumente — Links zu Zertifikaten und Konformitätsdokumenten (optional). z. B. EN 12520, EN 1728, Brandschutzzertifikat.
  ↳ typestringTyp
  ↳ urlstringURL
packagingstring (enum)Recyclingfähigkeit der Verpackung — Recyclingfähigkeit der Produktverpackung. Optional. (recyclable · partiallyRecyclable · notRecyclable)
endOfLifeobjectLebensende — Was mit dem Möbelstück nach der Nutzung geschehen soll — je Sprache auszufüllen.
  ↳ recyclingInstructions 🌐objectRecyclinghinweise — Wie es zerlegt und recycelt werden kann — je Sprache.
  ↳ disposalInstructions 🌐objectEntsorgungshinweise — Falls nicht recycelbar — je Sprache.

Sprachen

Das Feld languages (z. B. ["hu","en"]) deklariert, in welchen Sprachen Freitextinhalte vorliegen. Die lokalisierten Felder (Pflege, Lebensende … — im /schema mit "localized": true) müssen nur in der ersten (primären) Sprache ausgefüllt werden; die übrigen sind optional und fallen bei Fehlen auf eine verfügbare Sprache zurück. Die UI-Beschriftungen des Produktpasses werden davon unabhängig automatisch in 24 Sprachen übersetzt.

Beispiele

Produkt anlegen

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-Baumwoll-T-Shirt",
      "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]"
      }
    }
  }'

Antwort (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-Baumwoll-T-Shirt", … }
  }
}

Auflisten

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

Ein Produkt abrufen

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

Aktualisierung (neue Version)

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

Die übergebenen Felder werden mit den vorhandenen Daten zusammengeführt (Teilaktualisierung), anschließend validiert, und es entsteht eine neue, aufbewahrte Version — die vollständige Änderungshistorie bleibt erhalten.

Chargen- und Stückpass (Serialisierung)

Sie erstellen unter einem Modell Chargen- oder Stückpässe; das Kind erbt die Daten des Elternpasses — Sie geben nur die exemplarspezifischen Felder (lot/serial) an. Auch mehrere auf einmal (items[], max. 500); die Antwort meldet Erfolg/Fehler je Zeile.

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"}]}'

Die {id} kann ein Modell oder eine Charge sein. Ein POST auf eine Chargen-ID mit level:"item" legt das Stück unter dieser Charge an und übernimmt deren Lot — der GS1-Link lautet dann …/10/lot/21/serial statt …/21/serial. So entsteht die vollständige Kette Modell → Charge → Stück.

Scan-Analytik

Aggregierte Statistik der QR-Scans — je Produkt oder für das gesamte Konto —, aufgeschlüsselt nach Land und Gerät. Datenschutz: keine rohen IP-Adressen; eindeutige Besucher sind eine anonyme Hash-Schätzung.

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 }
  }
}

Antwort & Fehler

Erfolg: die Nutzdaten stehen unter dem Schlüssel data. Im Fehlerfall:

{ "error": "Ungültige Daten.", "code": "validation", "errors": [ … ] }
HTTPcodeBedeutung
401unauthorizedFehlender/ungültiger API-Schlüssel.
403plan_requiredDie API ist ab dem Pro-Tarif verfügbar (während der offenen Beta kann sie jedes Beta-Konto nutzen).
404not_foundProdukt oder Pfad nicht gefunden.
409gtin_takenDie GTIN ist bereits vergeben.
403plan_limitSie haben das Kontingent dieser Ebene erreicht (Tarif + Extra). Bei Massenaufrufen landen die überzähligen Einträge in errors.
422validationUngültige Daten (Details in errors).

Webhooks

Unter Einstellungen → Webhooks registrieren Sie eine HTTPS-URL. Sobald ein Produktpass erstellt / aktualisiert / archiviert wird, sendet Veridyn ein signiertes JSON per POST an diese URL — so wird Ihr System in Echtzeit benachrichtigt, ohne Polling.

Ereignisse

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

scan.milestone wird ausgelöst, wenn die Scan-Zahl eines Produktpasses einen Meilenstein überschreitet (10, 50, 100, 250, 500, 1000, …) — z. B. „Ihr Produktpass wurde 1000-mal geöffnet“. Daten: { product_id, count, milestone }.

scan.clone_suspected weist auf eine mögliche Fälschung hin: Ein eindeutiger (serialisierter) Pass wurde ungewöhnlich oft und aus vielen verschiedenen Ländern bzw. von vielen Geräten gescannt — das kann auf einen kopierten QR-Code hindeuten. Daten: { product_id, count, countries, unique_devices }.

Zustellung

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"
}

Signaturprüfung

X-Veridyn-Signature ist die HMAC-SHA256-Signatur des Roh-Bodys mit dem Secret des Webhooks (in den Einstellungen sichtbar). So prüfen Sie sie — z. B. 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; // ungültige Signatur}

Antworten Sie mit einem 2xx-Status. Schlägt die Zustellung fehl (kein 2xx / Zeitüberschreitung), wiederholen wir sie automatisch mit exponentiellem Backoff (ca. 1 Minute → 5 Minuten → 30 Minuten → 2 Stunden → 6 Stunden, max. 6 Versuche); bei dauerhaftem Fehler geben wir auf. Den Status der letzten Zustellung sehen Sie in den Einstellungen.

💡 Die Kategorieschemata (welche Felder Pflicht und welche optional sind) sehen Sie im Produktformular und über den Endpunkt /schema/{category}. Derzeit verfügbar: textile, battery und furniture. Das Schema wird erweitert, sobald die EU weitere Kategorien festlegt.

← Einstellungen / API-Schlüssel