Перейти до змісту

Довідник · v1

Itemoo Public Product Data API

Дані про продукт із зазначенням походження, schema.org JSON-LD, паспорт для одержувачів і резолвер GS1 Digital Link. Без ключа.

Описи ендпоінтів і полів — англійською, так само як коди й назви полів в API.

Вступ

https://itemoo.eu

Read-only product data published by producers on Itemoo — no key needed. The same QR code serves a person (HTML page) and a machine (JSON). Every fact points to the document that proves it; machine data is never richer or poorer than the page a person sees.

Languages. ?lang=xx or Accept-Language; texts fall back to the brand default language.

Errors. { statusCode, error, code, params?, message } — rely on code. A code of a product that is no longer maintained returns 410.

Limits. Calls are rate-limited per IP address (429 when exceeded); responses are cacheable — respect Cache-Control.

Product data

Product data with provenance

get/q/{code}/data

без ключа

Everything the human page shows, for machines: identity (GTIN, LOT, serial), product, facts with the document behind each, documents, FAQ, recall status and a trust section. Only the published version of the page is exposed. CORS is open (Access-Control-Allow-Origin: *); responses are cached for 5 minutes.

Параметри

ПолеТипОпис
code
path · обов’язкове
stringItemoo code from the QR label (unit, batch, variant or product)
Приклад: A1B2C3D4
lang
query
stringTwo-letter language; without it the Accept-Language header decides
Приклад: en
Accept-Language
header
stringPreferred language of the texts (fact names, description) when lang is missing.

Відповідь 200 · application/json

ProductData

  • identityProductIdentityобов’язкове
    Поля · ProductIdentity
    • codestringобов’язкове
      Itemoo code from the QR label
    • level"unit" | "batch" | "variant" | "model"обов’язкове
    • gtinstring | nullобов’язкове
    • skustring | nullобов’язкове
    • variantobject
      Поля
      • labelstringобов’язкове
      • catalogNostring | nullобов’язкове
    • lotstring | nullобов’язкове
    • serialstring | nullобов’язкове
    • expiresAtstring (date-time) | nullобов’язкове
    • statusstringобов’язкове
      Batch status: ACTIVE | RECALLED | …
    • uniqueProductIdentifierstringобов’язкове
      Unique product identifier of this code (EN 18219:2026): GS1 Digital Link with the batch and serial number of the code level, or the code address /q/{code} without a GTIN
  • productProductSummaryобов’язкове
    Поля · ProductSummary
    • namestringобов’язкове
    • brandstringобов’язкове
    • category"chemicals" | "cosmetics" | "medical" | "food" | "supplements" | "electronics" | "appliances" | "batteries" | "textiles" | "furniture" | "toys" | "construction" | "other" | nullобов’язкове
      Regulatory product type — decides the mandatory information: chemicals | cosmetics | medical | food | supplements | electronics | appliances | batteries | textiles | furniture | toys | construction | other
    • descriptionstringобов’язкове
    • imagestring
    • translationsobject
      Name and description in every language the brand provides (ISO 639-1 code → text); name and description above are in the language of the response
      Поля
      • namemap<string, string>обов’язкове
      • descriptionmap<string, string>обов’язкове
  • manufacturerEconomicOperator | nullобов’язкове
    Manufacturer with postal address and contact; null when the brand has not filled it in
    Поля · EconomicOperator
    • namestringобов’язкове
    • addressobjectобов’язкове
      Поля
      • streetstring | nullобов’язкове
      • postalCodestring | nullобов’язкове
      • citystring | nullобов’язкове
      • countrystring | nullобов’язкове
        ISO 3166-1 alpha-2
    • emailstring | nullобов’язкове
    • phonestring | nullобов’язкове
      Shown only at the access level the brand chose for it (default: persons with a legitimate interest)
    • source"company" | "registry"обов’язкове
      company = the brand company data; registry = an operator from the company operator register designated in the passport
    • tradeNamestring | null
      Registered trade name or trade mark (Regulation (EU) 2024/1781 Art. 27(6), 29(3))
    • identifiersobject[]
      Unique operator or facility identifiers (Regulation (EU) 2024/1781 Annex III points (g)–(k), Art. 12; EN 18219:2026 Clause 6 — ISO/IEC 6523 or ISO/IEC 15459)
      Поля
      • scheme"gln" | "duns" | "lei" | "vat" | "iso15459"обов’язкове
        gln = GS1 GLN, duns = D-U-N-S, lei = Legal Entity Identifier (ISO 17442), vat = EU VAT number with country prefix, iso15459 = identifier of another ISO/IEC 15459 issuing agency
      • iacstring
        Issuing agency code (ISO/IEC 15459-2 register): 0–9 for GS1, UN for D&B, otherwise the registered agency code; absent for lei and vat
      • valuestringобов’язкове
    • eoristring | null
      EORI number (importer, Annex III point (j)) — shown only at the access level the brand chose for it (default: legitimate interest)
  • responsiblePersonEconomicOperator | nullобов’язкове
    Responsible person in the EU; null when none is given
    Поля · EconomicOperator
    • namestringобов’язкове
    • addressobjectобов’язкове
      Поля
      • streetstring | nullобов’язкове
      • postalCodestring | nullобов’язкове
      • citystring | nullобов’язкове
      • countrystring | nullобов’язкове
        ISO 3166-1 alpha-2
    • emailstring | nullобов’язкове
    • phonestring | nullобов’язкове
      Shown only at the access level the brand chose for it (default: persons with a legitimate interest)
    • source"company" | "registry"обов’язкове
      company = the brand company data; registry = an operator from the company operator register designated in the passport
    • tradeNamestring | null
      Registered trade name or trade mark (Regulation (EU) 2024/1781 Art. 27(6), 29(3))
    • identifiersobject[]
      Unique operator or facility identifiers (Regulation (EU) 2024/1781 Annex III points (g)–(k), Art. 12; EN 18219:2026 Clause 6 — ISO/IEC 6523 or ISO/IEC 15459)
      Поля
      • scheme"gln" | "duns" | "lei" | "vat" | "iso15459"обов’язкове
        gln = GS1 GLN, duns = D-U-N-S, lei = Legal Entity Identifier (ISO 17442), vat = EU VAT number with country prefix, iso15459 = identifier of another ISO/IEC 15459 issuing agency
      • iacstring
        Issuing agency code (ISO/IEC 15459-2 register): 0–9 for GS1, UN for D&B, otherwise the registered agency code; absent for lei and vat
      • valuestringобов’язкове
    • eoristring | null
      EORI number (importer, Annex III point (j)) — shown only at the access level the brand chose for it (default: legitimate interest)
  • importerEconomicOperator | nullобов’язкове
    Importer (Regulation (EU) 2024/1781 Annex III point (j)); for a batch or unit code the batch importer
    Поля · EconomicOperator
    • namestringобов’язкове
    • addressobjectобов’язкове
      Поля
      • streetstring | nullобов’язкове
      • postalCodestring | nullобов’язкове
      • citystring | nullобов’язкове
      • countrystring | nullобов’язкове
        ISO 3166-1 alpha-2
    • emailstring | nullобов’язкове
    • phonestring | nullобов’язкове
      Shown only at the access level the brand chose for it (default: persons with a legitimate interest)
    • source"company" | "registry"обов’язкове
      company = the brand company data; registry = an operator from the company operator register designated in the passport
    • tradeNamestring | null
      Registered trade name or trade mark (Regulation (EU) 2024/1781 Art. 27(6), 29(3))
    • identifiersobject[]
      Unique operator or facility identifiers (Regulation (EU) 2024/1781 Annex III points (g)–(k), Art. 12; EN 18219:2026 Clause 6 — ISO/IEC 6523 or ISO/IEC 15459)
      Поля
      • scheme"gln" | "duns" | "lei" | "vat" | "iso15459"обов’язкове
        gln = GS1 GLN, duns = D-U-N-S, lei = Legal Entity Identifier (ISO 17442), vat = EU VAT number with country prefix, iso15459 = identifier of another ISO/IEC 15459 issuing agency
      • iacstring
        Issuing agency code (ISO/IEC 15459-2 register): 0–9 for GS1, UN for D&B, otherwise the registered agency code; absent for lei and vat
      • valuestringобов’язкове
    • eoristring | null
      EORI number (importer, Annex III point (j)) — shown only at the access level the brand chose for it (default: legitimate interest)
  • authorisedRepresentativeEconomicOperator | nullобов’язкове
    Authorised representative of the manufacturer
    Поля · EconomicOperator
    • namestringобов’язкове
    • addressobjectобов’язкове
      Поля
      • streetstring | nullобов’язкове
      • postalCodestring | nullобов’язкове
      • citystring | nullобов’язкове
      • countrystring | nullобов’язкове
        ISO 3166-1 alpha-2
    • emailstring | nullобов’язкове
    • phonestring | nullобов’язкове
      Shown only at the access level the brand chose for it (default: persons with a legitimate interest)
    • source"company" | "registry"обов’язкове
      company = the brand company data; registry = an operator from the company operator register designated in the passport
    • tradeNamestring | null
      Registered trade name or trade mark (Regulation (EU) 2024/1781 Art. 27(6), 29(3))
    • identifiersobject[]
      Unique operator or facility identifiers (Regulation (EU) 2024/1781 Annex III points (g)–(k), Art. 12; EN 18219:2026 Clause 6 — ISO/IEC 6523 or ISO/IEC 15459)
      Поля
      • scheme"gln" | "duns" | "lei" | "vat" | "iso15459"обов’язкове
        gln = GS1 GLN, duns = D-U-N-S, lei = Legal Entity Identifier (ISO 17442), vat = EU VAT number with country prefix, iso15459 = identifier of another ISO/IEC 15459 issuing agency
      • iacstring
        Issuing agency code (ISO/IEC 15459-2 register): 0–9 for GS1, UN for D&B, otherwise the registered agency code; absent for lei and vat
      • valuestringобов’язкове
    • eoristring | null
      EORI number (importer, Annex III point (j)) — shown only at the access level the brand chose for it (default: legitimate interest)
  • facilityEconomicOperator | nullобов’язкове
    Manufacturing facility (Annex III point (i)); publicly only the town and country unless the brand made the full address public
    Поля · EconomicOperator
    • namestringобов’язкове
    • addressobjectобов’язкове
      Поля
      • streetstring | nullобов’язкове
      • postalCodestring | nullобов’язкове
      • citystring | nullобов’язкове
      • countrystring | nullобов’язкове
        ISO 3166-1 alpha-2
    • emailstring | nullобов’язкове
    • phonestring | nullобов’язкове
      Shown only at the access level the brand chose for it (default: persons with a legitimate interest)
    • source"company" | "registry"обов’язкове
      company = the brand company data; registry = an operator from the company operator register designated in the passport
    • tradeNamestring | null
      Registered trade name or trade mark (Regulation (EU) 2024/1781 Art. 27(6), 29(3))
    • identifiersobject[]
      Unique operator or facility identifiers (Regulation (EU) 2024/1781 Annex III points (g)–(k), Art. 12; EN 18219:2026 Clause 6 — ISO/IEC 6523 or ISO/IEC 15459)
      Поля
      • scheme"gln" | "duns" | "lei" | "vat" | "iso15459"обов’язкове
        gln = GS1 GLN, duns = D-U-N-S, lei = Legal Entity Identifier (ISO 17442), vat = EU VAT number with country prefix, iso15459 = identifier of another ISO/IEC 15459 issuing agency
      • iacstring
        Issuing agency code (ISO/IEC 15459-2 register): 0–9 for GS1, UN for D&B, otherwise the registered agency code; absent for lei and vat
      • valuestringобов’язкове
    • eoristring | null
      EORI number (importer, Annex III point (j)) — shown only at the access level the brand chose for it (default: legitimate interest)
  • passportFieldsobjectобов’язкове
    Model passport fields with the public access level (empty until the page is published)
  • languagestringобов’язкове
    Language of the texts (requested one when the brand has it)
  • publishedbooleanобов’язкове
    false = the product page is not published yet; facts are empty
  • machineTranslatedbooleanобов’язкове
  • passportbooleanобов’язкове
    The product has a Digital Product Passport: the brand added the “Digital product passport” block or the product is under a passport obligation. Public passport data fields (passportFields) are published for every product
  • passportStatus"NONE" | "ACTIVE" | "CLOSED"обов’язкове
    Passport state: NONE — no passport; ACTIVE; CLOSED — closed by the brand after the product was placed on the market (the passport shows the state as of the closing date)
  • recallRecall | nullобов’язкове
    Поля · Recall
    • activetrueобов’язкове
    • certainbooleanобов’язкове
      true = this exact code is recalled; false = the batch is unknown and may be affected
    • scope"product" | "batch" | "lotRange"обов’язкове
      product = the whole product; batch = one batch; lotRange = a range of batch numbers (lotFrom–lotTo)
    • reasonstringобов’язкове
    • instructionsstring | nullобов’язкове
    • lotFromstring | nullобов’язкове
    • lotTostring | nullобов’язкове
    • kind"recall" | "notice"
      recall = the product is recalled; notice = safety notice, the product is not withdrawn
  • factsProvenanceFact[]обов’язкове
    Поля · ProvenanceFact
    • keystring
      Stable English key of a standard fact (origin, materials, battery.capacityAh, chemical.ufi, …); absent for parameters defined by the brand — match on it, not on the translated name
    • namestringобов’язкове
      Fact name in the response language
    • valuestringобов’язкове
    • provenanceobject
      Поля
      • sourcestringобов’язкове
        Document or block the fact comes from
      • versionstring
      • documentUrlstring
      • assertedBystringобов’язкове
        Brand that published the fact
      • assertedAtstring
  • offersobject[]обов’язкове
    Поля
    • namestringобов’язкове
    • pricenumberобов’язкове
    • currencystringобов’язкове
  • documentsDocument[]обов’язкове
    Поля · Document
    • titlestringобов’язкове
    • urlstringобов’язкове
    • kindstringобов’язкове
      certificate | declaration | repair | dpp | manual | sds | …
    • versionstring
    • accessstring
      public | legit | authority — present on documents beyond the public level
    • docIdstring
      Library document identifier — the same as in { docId } values of document fields
    • languagestring
      Language of the file (ISO 639-1 code, e.g. de), set by the brand at the document version; absent — multilingual file or not specified
  • faqobject[]обов’язкове
    Поля
    • questionstringобов’язкове
    • answerstringобов’язкове
  • trustobjectобов’язкове
    Поля
    • assertedBystringобов’язкове
    • publishedVia"Itemoo"обов’язкове
    • evidencePolicystringобов’язкове
    • factsWithProvenanceintegerобов’язкове
    • factsTotalintegerобов’язкове
    • lastUpdatedstring (date-time)обов’язкове
Помилки
404
  • unknownCode — Unknown code
410
  • codeRetired — The {brand} product page is no longer maintained — please contact the manufacturer directly. params: brand
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/q/A1B2C3D4/data'

JavaScript

const res = await fetch('https://itemoo.eu/q/A1B2C3D4/data', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/q/A1B2C3D4/data');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

schema.org Product (JSON-LD)

get/q/{code}/schema.json

без ключа

The same product as schema.org Product in JSON-LD — for search engines and standard agents. Facts become additionalProperty with valueReference to the source document; the recall status is the first property (recallStatus).

Параметри

ПолеТипОпис
code
path · обов’язкове
stringItemoo code from the QR label (unit, batch, variant or product)
Приклад: A1B2C3D4
lang
query
stringTwo-letter language; without it the Accept-Language header decides
Приклад: en
Accept-Language
header
stringPreferred language of the texts (fact names, description) when lang is missing.

Відповідь 200 · application/ld+json

object

  • @context"https://schema.org"обов’язкове
  • @type"Product"обов’язкове
  • namestringобов’язкове
Помилки
404
  • unknownCode — Unknown code
410
  • codeRetired — The {brand} product page is no longer maintained — please contact the manufacturer directly. params: brand
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/q/A1B2C3D4/schema.json'

JavaScript

const res = await fetch('https://itemoo.eu/q/A1B2C3D4/schema.json', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/q/A1B2C3D4/schema.json');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Parameter profile file

get/q/{code}/profile

без ключа

One parameter profile of the product (e.g. print settings for a resin) as a file: format=json gives { product, profile, params: [{ name, value }] }, ini (default) and cfg give key = value text for slicers.

Параметри

ПолеТипОпис
code
path · обов’язкове
stringItemoo code from the QR label (unit, batch, variant or product)
Приклад: A1B2C3D4
i
query
stringProfile index, 0 by default
format
query
"json" | "ini" | "cfg"
lang
query
string

Відповідь 200 · application/json, text/plain

Profile file (attachment)

Помилки
404
  • unknownCode — Unknown code
  • profileNotFound — Profile not found
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/q/A1B2C3D4/profile?format=json'

JavaScript

const res = await fetch('https://itemoo.eu/q/A1B2C3D4/profile?format=json', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/q/A1B2C3D4/profile?format=json');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Capabilities for AI agents

get/.well-known/agent-interface.json

без ключа

Entry point for an agent that landed on the domain: the endpoints above and the evidence policy.

Відповідь 200 · application/json

object

  • namestringобов’язкове
  • descriptionstringобов’язкове
  • versionstringобов’язкове
  • endpointsobject[]обов’язкове
    Поля
    • pathstringобов’язкове
    • methodstringобов’язкове
    • returnsstringобов’язкове
    • descriptionstringобов’язкове
  • evidencePolicystringобов’язкове
Помилки
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/.well-known/agent-interface.json'

JavaScript

const res = await fetch('https://itemoo.eu/.well-known/agent-interface.json', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/.well-known/agent-interface.json');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Passport

Digital Product Passport (JSON-LD)

get/q/{code}/dpp.jsonld

без ключа

The passport in JSON-LD with the Itemoo context (https://itemoo.eu/ns/dpp/1.1/context.jsonld; version 1.0 stays published): fields map to the CIRPASS-2 ontology (https://w3id.org/eudpp#, battery modules) where the meaning matches, the rest to the Itemoo vocabulary. The product node is the unit, batch or model of the code; the passport node carries the version hash, backup copy, predecessor and successors, components and lifecycle status. The same document is returned by /q/{code} and the GS1 Digital Link addresses for Accept: application/ld+json (with Content-Location). With a recipient token or session it shows that level (then never cached). The CIRPASS-2 ontology is a project recommendation, not an EU data model; conformity with the EU semantic repository (Implementing Regulation (EU) 2026/1778) is not claimed. Only products with a passport have it — the brand added the “Digital product passport” block or the product is under a passport obligation (e.g. EV, LMT and industrial batteries above 2 kWh); other products answer 404 PASSPORT_NONE and publish their data in /q/{code}/data. A closed passport has lifecycle.status = closed and shows the state as of the closing date.

Параметри

ПолеТипОпис
code
path · обов’язкове
stringItemoo code from the QR label (unit, batch, variant or product)
Приклад: A1B2C3D4
lang
query
stringTwo-letter language; without it the Accept-Language header decides
Приклад: en
Authorization
header
stringBearer ipa_… — optional recipient token
Accept-Language
header
stringPreferred language of the texts (fact names, description) when lang is missing.

Відповідь 200 · application/ld+json

object

  • @contextstringобов’язкове
  • idstringобов’язкове
  • type"Product"обов’язкове
  • passportobjectобов’язкове
    Поля
    • type"DigitalProductPassport"обов’язкове
Помилки
401
  • PASSPORT_GRANT_INVALID — The passport access is invalid, expired or revoked.
404
  • unknownCode — Unknown code
  • PASSPORT_NONE — This product has no passport — the manufacturer did not add the “Digital product passport” block. The product data is in the machine data of the code (/data).
410
  • codeRetired — The {brand} product page is no longer maintained — please contact the manufacturer directly. params: brand
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/q/A1B2C3D4/dpp.jsonld'

JavaScript

const res = await fetch('https://itemoo.eu/q/A1B2C3D4/dpp.jsonld', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/q/A1B2C3D4/dpp.jsonld');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

JSON-LD context of Itemoo passports

get/ns/dpp/{version}/context.jsonld

без ключа

Immutable, versioned context (@protected). A change of content means a new version; documents name the version they use.

Параметри

ПолеТипОпис
version
path · обов’язкове
stringContext version
Приклад: 1.0

Відповідь 200 · application/ld+json

object

  • @contextobjectобов’язкове
Помилки
404
  • unknownCode — Unknown code
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/ns/dpp/1.0/context.jsonld'

JavaScript

const res = await fetch('https://itemoo.eu/ns/dpp/1.0/context.jsonld', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/ns/dpp/1.0/context.jsonld');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Itemoo passport vocabulary

get/ns/dpp/{version}/vocab

без ключа

RDFS terms (itm:) used by the context for fields without a CIRPASS-2 equivalent, with labels in Polish and English; mapped fields are listed as equivalent properties.

Параметри

ПолеТипОпис
version
path · обов’язкове
stringVocabulary version
Приклад: 1.0

Відповідь 200 · application/ld+json

object

  • @idstringобов’язкове
Помилки
404
  • unknownCode — Unknown code
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/ns/dpp/1.0/vocab'

JavaScript

const res = await fetch('https://itemoo.eu/ns/dpp/1.0/vocab', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/ns/dpp/1.0/vocab');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Data model catalogue (DCAT-AP)

get/.well-known/dpp

без ключа

DCAT-AP description of the Itemoo passport data models (context, vocabulary, ontologies they build on) and of the resolver service. No index of products or brands.

Відповідь 200 · application/ld+json

object

  • @idstringобов’язкове
  • @type"dcat:Catalog"обов’язкове
Помилки
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/.well-known/dpp'

JavaScript

const res = await fetch('https://itemoo.eu/.well-known/dpp', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/.well-known/dpp');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Digital Product Passport

get/q/{code}/passport

без ключа

Public passport data; with a recipient token issued by the producer (legitimate interest or authority) also the fields, documents and unit history of that level. Send the token as Authorization: Bearer ipa_…. Never cached. A browser (Accept: text/html without a token) gets a readable passport page at the same address; format=json returns JSON anyway. Only products with a passport have it — the brand added the “Digital product passport” block or the product is under a passport obligation (e.g. EV, LMT and industrial batteries above 2 kWh); other products answer 404 PASSPORT_NONE and publish their data in /q/{code}/data. A closed passport has lifecycle.status = closed and shows the state as of the closing date.

Параметри

ПолеТипОпис
code
path · обов’язкове
stringItemoo code from the QR label (unit, batch, variant or product)
Приклад: A1B2C3D4
lang
query
stringTwo-letter language; without it the Accept-Language header decides
Приклад: en
at
query
stringThe passport as it was at that moment, from the version history (a stable address of a version): ISO 8601 with a time zone (Z or ±hh:mm) or a plain date (start of the day, UTC). Without a time zone — 400 DATE_INVALID; in the future (over 60 s) — 400 DATE_IN_FUTURE
Приклад: 2027-03-01T10:00:00Z
format
query
"json" | "html"json — JSON even for a browser; html — the passport page. Without it the Accept header decides.
Authorization
header
stringBearer ipa_… — optional recipient token
Accept-Language
header
stringPreferred language of the texts (fact names, description) when lang is missing.

Відповідь 200 · application/json

Passport

  • level"public" | "legit" | "authority"обов’язкове
  • recipientstring
    Name of the access grant used
  • versionPassportVersion | nullобов’язкове
    Поля · PassportVersion
    • hashstringобов’язкове
      SHA-256 of the canonical (RFC 8785) composition of layer versions and the unit event chain head
    • layersobject[]обов’язкове
      Поля
      • subject"product" | "variant" | "batch" | "unit"обов’язкове
      • versionintegerобов’язкове
      • hashstringобов’язкове
    • eventsHeadstring | nullобов’язкове
    • atstring (date-time)
      Present for a passport read at a point in time (?at=)
  • backupobject | nullобов’язкове
    Backup copy of the passport kept by a DPP service provider (Regulation (EU) 2024/1781 Annex III point (l)), when the brand designated one
    Поля
    • providerstringобов’язкове
    • urlstringобов’язкове
  • identityProductIdentityобов’язкове
    Поля · ProductIdentity
    • codestringобов’язкове
      Itemoo code from the QR label
    • level"unit" | "batch" | "variant" | "model"обов’язкове
    • gtinstring | nullобов’язкове
    • skustring | nullобов’язкове
    • variantobject
      Поля
      • labelstringобов’язкове
      • catalogNostring | nullобов’язкове
    • lotstring | nullобов’язкове
    • serialstring | nullобов’язкове
    • expiresAtstring (date-time) | nullобов’язкове
    • statusstringобов’язкове
      Batch status: ACTIVE | RECALLED | …
    • uniqueProductIdentifierstringобов’язкове
      Unique product identifier of this code (EN 18219:2026): GS1 Digital Link with the batch and serial number of the code level, or the code address /q/{code} without a GTIN
  • productProductSummaryобов’язкове
    Поля · ProductSummary
    • namestringобов’язкове
    • brandstringобов’язкове
    • category"chemicals" | "cosmetics" | "medical" | "food" | "supplements" | "electronics" | "appliances" | "batteries" | "textiles" | "furniture" | "toys" | "construction" | "other" | nullобов’язкове
      Regulatory product type — decides the mandatory information: chemicals | cosmetics | medical | food | supplements | electronics | appliances | batteries | textiles | furniture | toys | construction | other
    • descriptionstringобов’язкове
    • imagestring
    • translationsobject
      Name and description in every language the brand provides (ISO 639-1 code → text); name and description above are in the language of the response
      Поля
      • namemap<string, string>обов’язкове
      • descriptionmap<string, string>обов’язкове
  • manufacturerEconomicOperator | nullобов’язкове
    Поля · EconomicOperator
    • namestringобов’язкове
    • addressobjectобов’язкове
      Поля
      • streetstring | nullобов’язкове
      • postalCodestring | nullобов’язкове
      • citystring | nullобов’язкове
      • countrystring | nullобов’язкове
        ISO 3166-1 alpha-2
    • emailstring | nullобов’язкове
    • phonestring | nullобов’язкове
      Shown only at the access level the brand chose for it (default: persons with a legitimate interest)
    • source"company" | "registry"обов’язкове
      company = the brand company data; registry = an operator from the company operator register designated in the passport
    • tradeNamestring | null
      Registered trade name or trade mark (Regulation (EU) 2024/1781 Art. 27(6), 29(3))
    • identifiersobject[]
      Unique operator or facility identifiers (Regulation (EU) 2024/1781 Annex III points (g)–(k), Art. 12; EN 18219:2026 Clause 6 — ISO/IEC 6523 or ISO/IEC 15459)
      Поля
      • scheme"gln" | "duns" | "lei" | "vat" | "iso15459"обов’язкове
        gln = GS1 GLN, duns = D-U-N-S, lei = Legal Entity Identifier (ISO 17442), vat = EU VAT number with country prefix, iso15459 = identifier of another ISO/IEC 15459 issuing agency
      • iacstring
        Issuing agency code (ISO/IEC 15459-2 register): 0–9 for GS1, UN for D&B, otherwise the registered agency code; absent for lei and vat
      • valuestringобов’язкове
    • eoristring | null
      EORI number (importer, Annex III point (j)) — shown only at the access level the brand chose for it (default: legitimate interest)
  • responsiblePersonEconomicOperator | nullобов’язкове
    Поля · EconomicOperator
    • namestringобов’язкове
    • addressobjectобов’язкове
      Поля
      • streetstring | nullобов’язкове
      • postalCodestring | nullобов’язкове
      • citystring | nullобов’язкове
      • countrystring | nullобов’язкове
        ISO 3166-1 alpha-2
    • emailstring | nullобов’язкове
    • phonestring | nullобов’язкове
      Shown only at the access level the brand chose for it (default: persons with a legitimate interest)
    • source"company" | "registry"обов’язкове
      company = the brand company data; registry = an operator from the company operator register designated in the passport
    • tradeNamestring | null
      Registered trade name or trade mark (Regulation (EU) 2024/1781 Art. 27(6), 29(3))
    • identifiersobject[]
      Unique operator or facility identifiers (Regulation (EU) 2024/1781 Annex III points (g)–(k), Art. 12; EN 18219:2026 Clause 6 — ISO/IEC 6523 or ISO/IEC 15459)
      Поля
      • scheme"gln" | "duns" | "lei" | "vat" | "iso15459"обов’язкове
        gln = GS1 GLN, duns = D-U-N-S, lei = Legal Entity Identifier (ISO 17442), vat = EU VAT number with country prefix, iso15459 = identifier of another ISO/IEC 15459 issuing agency
      • iacstring
        Issuing agency code (ISO/IEC 15459-2 register): 0–9 for GS1, UN for D&B, otherwise the registered agency code; absent for lei and vat
      • valuestringобов’язкове
    • eoristring | null
      EORI number (importer, Annex III point (j)) — shown only at the access level the brand chose for it (default: legitimate interest)
  • importerEconomicOperator | nullобов’язкове
    Поля · EconomicOperator
    • namestringобов’язкове
    • addressobjectобов’язкове
      Поля
      • streetstring | nullобов’язкове
      • postalCodestring | nullобов’язкове
      • citystring | nullобов’язкове
      • countrystring | nullобов’язкове
        ISO 3166-1 alpha-2
    • emailstring | nullобов’язкове
    • phonestring | nullобов’язкове
      Shown only at the access level the brand chose for it (default: persons with a legitimate interest)
    • source"company" | "registry"обов’язкове
      company = the brand company data; registry = an operator from the company operator register designated in the passport
    • tradeNamestring | null
      Registered trade name or trade mark (Regulation (EU) 2024/1781 Art. 27(6), 29(3))
    • identifiersobject[]
      Unique operator or facility identifiers (Regulation (EU) 2024/1781 Annex III points (g)–(k), Art. 12; EN 18219:2026 Clause 6 — ISO/IEC 6523 or ISO/IEC 15459)
      Поля
      • scheme"gln" | "duns" | "lei" | "vat" | "iso15459"обов’язкове
        gln = GS1 GLN, duns = D-U-N-S, lei = Legal Entity Identifier (ISO 17442), vat = EU VAT number with country prefix, iso15459 = identifier of another ISO/IEC 15459 issuing agency
      • iacstring
        Issuing agency code (ISO/IEC 15459-2 register): 0–9 for GS1, UN for D&B, otherwise the registered agency code; absent for lei and vat
      • valuestringобов’язкове
    • eoristring | null
      EORI number (importer, Annex III point (j)) — shown only at the access level the brand chose for it (default: legitimate interest)
  • authorisedRepresentativeEconomicOperator | nullобов’язкове
    Поля · EconomicOperator
    • namestringобов’язкове
    • addressobjectобов’язкове
      Поля
      • streetstring | nullобов’язкове
      • postalCodestring | nullобов’язкове
      • citystring | nullобов’язкове
      • countrystring | nullобов’язкове
        ISO 3166-1 alpha-2
    • emailstring | nullобов’язкове
    • phonestring | nullобов’язкове
      Shown only at the access level the brand chose for it (default: persons with a legitimate interest)
    • source"company" | "registry"обов’язкове
      company = the brand company data; registry = an operator from the company operator register designated in the passport
    • tradeNamestring | null
      Registered trade name or trade mark (Regulation (EU) 2024/1781 Art. 27(6), 29(3))
    • identifiersobject[]
      Unique operator or facility identifiers (Regulation (EU) 2024/1781 Annex III points (g)–(k), Art. 12; EN 18219:2026 Clause 6 — ISO/IEC 6523 or ISO/IEC 15459)
      Поля
      • scheme"gln" | "duns" | "lei" | "vat" | "iso15459"обов’язкове
        gln = GS1 GLN, duns = D-U-N-S, lei = Legal Entity Identifier (ISO 17442), vat = EU VAT number with country prefix, iso15459 = identifier of another ISO/IEC 15459 issuing agency
      • iacstring
        Issuing agency code (ISO/IEC 15459-2 register): 0–9 for GS1, UN for D&B, otherwise the registered agency code; absent for lei and vat
      • valuestringобов’язкове
    • eoristring | null
      EORI number (importer, Annex III point (j)) — shown only at the access level the brand chose for it (default: legitimate interest)
  • facilityEconomicOperator | nullобов’язкове
    Поля · EconomicOperator
    • namestringобов’язкове
    • addressobjectобов’язкове
      Поля
      • streetstring | nullобов’язкове
      • postalCodestring | nullобов’язкове
      • citystring | nullобов’язкове
      • countrystring | nullобов’язкове
        ISO 3166-1 alpha-2
    • emailstring | nullобов’язкове
    • phonestring | nullобов’язкове
      Shown only at the access level the brand chose for it (default: persons with a legitimate interest)
    • source"company" | "registry"обов’язкове
      company = the brand company data; registry = an operator from the company operator register designated in the passport
    • tradeNamestring | null
      Registered trade name or trade mark (Regulation (EU) 2024/1781 Art. 27(6), 29(3))
    • identifiersobject[]
      Unique operator or facility identifiers (Regulation (EU) 2024/1781 Annex III points (g)–(k), Art. 12; EN 18219:2026 Clause 6 — ISO/IEC 6523 or ISO/IEC 15459)
      Поля
      • scheme"gln" | "duns" | "lei" | "vat" | "iso15459"обов’язкове
        gln = GS1 GLN, duns = D-U-N-S, lei = Legal Entity Identifier (ISO 17442), vat = EU VAT number with country prefix, iso15459 = identifier of another ISO/IEC 15459 issuing agency
      • iacstring
        Issuing agency code (ISO/IEC 15459-2 register): 0–9 for GS1, UN for D&B, otherwise the registered agency code; absent for lei and vat
      • valuestringобов’язкове
    • eoristring | null
      EORI number (importer, Annex III point (j)) — shown only at the access level the brand chose for it (default: legitimate interest)
  • languagestringобов’язкове
  • publishedbooleanобов’язкове
  • recallRecall | nullобов’язкове
    Поля · Recall
    • activetrueобов’язкове
    • certainbooleanобов’язкове
      true = this exact code is recalled; false = the batch is unknown and may be affected
    • scope"product" | "batch" | "lotRange"обов’язкове
      product = the whole product; batch = one batch; lotRange = a range of batch numbers (lotFrom–lotTo)
    • reasonstringобов’язкове
    • instructionsstring | nullобов’язкове
    • lotFromstring | nullобов’язкове
    • lotTostring | nullобов’язкове
    • kind"recall" | "notice"
      recall = the product is recalled; notice = safety notice, the product is not withdrawn
  • factsProvenanceFact[]обов’язкове
    Поля · ProvenanceFact
    • keystring
      Stable English key of a standard fact (origin, materials, battery.capacityAh, chemical.ufi, …); absent for parameters defined by the brand — match on it, not on the translated name
    • namestringобов’язкове
      Fact name in the response language
    • valuestringобов’язкове
    • provenanceobject
      Поля
      • sourcestringобов’язкове
        Document or block the fact comes from
      • versionstring
      • documentUrlstring
      • assertedBystringобов’язкове
        Brand that published the fact
      • assertedAtstring
  • documentsDocument[]обов’язкове
    Поля · Document
    • titlestringобов’язкове
    • urlstringобов’язкове
    • kindstringобов’язкове
      certificate | declaration | repair | dpp | manual | sds | …
    • versionstring
    • accessstring
      public | legit | authority — present on documents beyond the public level
    • docIdstring
      Library document identifier — the same as in { docId } values of document fields
    • languagestring
      Language of the file (ISO 639-1 code, e.g. de), set by the brand at the document version; absent — multilingual file or not specified
  • componentsPassportComponent[]обов’язкове
    Components with their own passport visible at this level (Regulation (EU) 2024/1781 Art. 2(4); CIRPASS-2 D4.1 recommendation 5)
    Поля · PassportComponent
    • codestring | nullобов’язкове
      Itemoo code of the component passport (unit, batch, variant or model — also of another brand)
    • uristring | nullобов’язкове
      Address of a component passport outside Itemoo (DPP URL or GS1 Digital Link)
    • urlstringобов’язкове
      Where to read the component passport
    • rolestring | nullобов’язкове
    • nameanyобов’язкове
    • quantitynumber | nullобов’язкове
    • unitstring | nullобов’язкове
    • level"model" | "unit"обов’язкове
      model — bill of components of the model; unit — installed in this unit (assembly events)
    • sincestring | nullобов’язкове
      When the component was installed in this unit
  • lifecycleobjectобов’язкове
    Lifecycle status of the passport: recalled — an active recall covers the code (a safety notice does not); end_of_life — the unit was recycled or became waste; archived — the brand left Itemoo and the passport is kept read-only; closed — the brand closed the passport after the product was placed on the market (the passport shows the state as of the closing date, since). A passport is never deleted: removal is a status (CIRPASS-2 D4.1 recommendation 3); a retired code answers 410
    Поля
    • status"active" | "recalled" | "end_of_life" | "archived" | "closed"обов’язкове
    • sincestring (date-time) | nullобов’язкове
  • modelobjectобов’язкове
    Model passport fields visible at this level
  • unitobject | nullобов’язкове
    Поля
    • serialstring | nullобов’язкове
    • dataobjectобов’язкове
    • stateobjectобов’язкове
      Поля
      • statusstring | nullобов’язкове
        original | repurposed | re-used | remanufactured | waste | recycled (Regulation (EU) 2023/1542 Annex XIII point 4(c); recycled ends the passport). null — not visible at this access level (a battery status is for persons with a legitimate interest only)
      • sohnumber | nullобов’язкове
        State of health, 0–100 (SoH, or SOCE / remaining capacity when only that is recorded)
      • sohAtstring (date-time) | nullобов’язкове
      • cyclesnumber | nullобов’язкове
      • incidentsintegerобов’язкове
    • historyobject[]обов’язкове
      Поля
      • kindstringобов’язкове
      • dataanyобов’язкове
      • occurredAtstring (date-time)обов’язкове
      • sourcestring
    • linksobjectобов’язкове
      Поля
      • predecessorobject | nullобов’язкове
        Passport before remanufacturing or repurposing (Art. 77(7))
        Поля
        • codestringобов’язкове
        • urlstringобов’язкове
      • successorsobject[]обов’язкове
        New passports created from this battery
        Поля
        • codestringобов’язкове
        • urlstringобов’язкове
    • custodianobject | nullобов’язкове
      Operator responsible for the passport of a waste battery after a transfer (producer, PRO or waste management operator — Art. 77(7))
      Поля
      • namestringобов’язкове
      • rolestringобов’язкове
      • sincestring (date-time)обов’язкове
Помилки
400
  • DATE_INVALID — Invalid date.
  • DATE_IN_FUTURE — The date is in the future — the passport only has states up to now.
401
  • PASSPORT_GRANT_INVALID — The passport access is invalid, expired or revoked.
404
  • unknownCode — Unknown code
  • PASSPORT_NONE — This product has no passport — the manufacturer did not add the “Digital product passport” block. The product data is in the machine data of the code (/data).
410
  • codeRetired — The {brand} product page is no longer maintained — please contact the manufacturer directly. params: brand
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/q/A1B2C3D4/passport'

JavaScript

const res = await fetch('https://itemoo.eu/q/A1B2C3D4/passport', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/q/A1B2C3D4/passport');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Products this component is part of

get/q/{code}/passport/part-of

без ключа

Reverse component links: models whose bill of components lists this code and units where it is currently installed. A link is returned only when the reader has its access level AT THE BRAND OF THE PARENT product (a recipient token of that brand, or a market surveillance authority) — the component maker does not learn who uses its parts. Non-public reads are logged in the read log of the parent brand. Only products with a passport have it — the brand added the “Digital product passport” block or the product is under a passport obligation (e.g. EV, LMT and industrial batteries above 2 kWh); other products answer 404 PASSPORT_NONE and publish their data in /q/{code}/data. A closed passport has lifecycle.status = closed and shows the state as of the closing date.

Параметри

ПолеТипОпис
code
path · обов’язкове
stringItemoo code from the QR label (unit, batch, variant or product)
Приклад: A1B2C3D4
Authorization
header
stringBearer ipa_… — optional recipient token

Відповідь 200 · application/json

PartOf

  • codestringобов’язкове
  • partOfobject[]обов’язкове
    Поля
    • codestringобов’язкове
    • urlstringобов’язкове
    • rolestring | nullобов’язкове
    • level"model" | "unit"обов’язкове
    • sincestring | nullобов’язкове
Помилки
401
  • PASSPORT_GRANT_INVALID — The passport access is invalid, expired or revoked.
404
  • unknownCode — Unknown code
  • PASSPORT_NONE — This product has no passport — the manufacturer did not add the “Digital product passport” block. The product data is in the machine data of the code (/data).
410
  • codeRetired — The {brand} product page is no longer maintained — please contact the manufacturer directly. params: brand
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/q/A1B2C3D4/passport/part-of'

JavaScript

const res = await fetch('https://itemoo.eu/q/A1B2C3D4/passport/part-of', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/q/A1B2C3D4/passport/part-of');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Brand passport feed (JSON Feed)

get/b/{slug}/passport/feed.json

без ключа

Public feed of a brand for dealers, recyclers, marketplaces and authorities, without registering an address: recalls, safety notices and new versions of product and batch passports (names of the changed public fields; values are at the code address). No unit data. JSON Feed 1.1, ETag and 5-minute caching. The same entries as Atom: /b/{slug}/passport/feed.atom.

Параметри

ПолеТипОпис
slug
path · обов’язкове
stringBrand identifier from the brand app address
Приклад: acme

Відповідь 200 · application/feed+json

object

  • version"https://jsonfeed.org/version/1.1"обов’язкове
  • itemsobject[]обов’язкове
    Поля
    • idstringобов’язкове
    • urlstringобов’язкове
Помилки
404
  • BRAND_NOT_FOUND — Brand not found
410
  • codeRetired — The {brand} product page is no longer maintained — please contact the manufacturer directly. params: brand
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/b/acme/passport/feed.json'

JavaScript

const res = await fetch('https://itemoo.eu/b/acme/passport/feed.json', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/b/acme/passport/feed.json');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Brand passport feed (Atom)

get/b/{slug}/passport/feed.atom

без ключа

The brand passport feed as Atom 1.0 (see the JSON Feed variant).

Параметри

ПолеТипОпис
slug
path · обов’язкове
stringBrand identifier
Приклад: acme

Відповідь 200 · application/atom+xml

string

Помилки
404
  • BRAND_NOT_FOUND — Brand not found
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/b/acme/passport/feed.atom'

JavaScript

const res = await fetch('https://itemoo.eu/b/acme/passport/feed.atom', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/b/acme/passport/feed.atom');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Passport version history

get/q/{code}/passport/history

без ключа

Every change of passport fields (model, variant, batch, unit) is an append-only version chained by SHA-256 hashes. The response lists versions with the changes of fields visible at the reader's level (public without a token) and, for the authority level, the leaf hashes needed to recompute each version hash. Redacted values (personal data removed by the platform) keep their hash and show redacted: true. Only products with a passport have it — the brand added the “Digital product passport” block or the product is under a passport obligation (e.g. EV, LMT and industrial batteries above 2 kWh); other products answer 404 PASSPORT_NONE and publish their data in /q/{code}/data. A closed passport has lifecycle.status = closed and shows the state as of the closing date.

Параметри

ПолеТипОпис
code
path · обов’язкове
stringItemoo code from the QR label (unit, batch, variant or product)
Приклад: A1B2C3D4
Authorization
header
stringBearer ipa_… — optional recipient token

Відповідь 200 · application/json

PassportHistory

  • codestringобов’язкове
  • level"public" | "legit" | "authority"обов’язкове
  • versionPassportVersion | nullобов’язкове
    Поля · PassportVersion
    • hashstringобов’язкове
      SHA-256 of the canonical (RFC 8785) composition of layer versions and the unit event chain head
    • layersobject[]обов’язкове
      Поля
      • subject"product" | "variant" | "batch" | "unit"обов’язкове
      • versionintegerобов’язкове
      • hashstringобов’язкове
    • eventsHeadstring | nullобов’язкове
    • atstring (date-time)
      Present for a passport read at a point in time (?at=)
  • versionsobject[]обов’язкове
    Поля
    • subject"product" | "variant" | "batch" | "unit"обов’язкове
    • versionintegerобов’язкове
    • hashstringобов’язкове
    • prevHashstring | nullобов’язкове
    • atstring (date-time)обов’язкове
    • sourcestringобов’язкове
    • changesobject[]обов’язкове
      Поля
      • keystringобов’язкове
      • op"add" | "change" | "remove"обов’язкове
      • valueany
      • redactedboolean
    • leavesmap<string, object>
      Leaf hashes (authority level only) to recompute the version hash
      Поля
      • hstringобов’язкове
      • access"public" | "legit" | "authority"обов’язкове
Помилки
401
  • PASSPORT_GRANT_INVALID — The passport access is invalid, expired or revoked.
404
  • unknownCode — Unknown code
  • PASSPORT_NONE — This product has no passport — the manufacturer did not add the “Digital product passport” block. The product data is in the machine data of the code (/data).
410
  • codeRetired — The {brand} product page is no longer maintained — please contact the manufacturer directly. params: brand
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/q/A1B2C3D4/passport/history'

JavaScript

const res = await fetch('https://itemoo.eu/q/A1B2C3D4/passport/history', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/q/A1B2C3D4/passport/history');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Proof of existence of the current passport versions

get/q/{code}/passport/anchor

без ключа

Every day (UTC) Itemoo builds a Merkle tree (RFC 6962 hashing: leaf = SHA-256(0x00 ‖ hash), node = SHA-256(0x01 ‖ left ‖ right), sorted unique leaves) of all passport version hashes and unit event hashes recorded that day and, when enabled, obtains an RFC 3161 timestamp for SHA-256(root). For each current layer version (and the head of the unit event chain) the response gives the day, the root and the inclusion path; anchor: null until the day is anchored. Verify the token with openssl ts -verify -digest <timestamp.digest> -in <token>. Only products with a passport have it — the brand added the “Digital product passport” block or the product is under a passport obligation (e.g. EV, LMT and industrial batteries above 2 kWh); other products answer 404 PASSPORT_NONE and publish their data in /q/{code}/data. A closed passport has lifecycle.status = closed and shows the state as of the closing date.

Параметри

ПолеТипОпис
code
path · обов’язкове
stringItemoo code from the QR label (unit, batch, variant or product)
Приклад: A1B2C3D4

Відповідь 200 · application/json

PassportAnchorProofs

  • codestringобов’язкове
  • algorithmstring | nullобов’язкове
  • proofsobject[]обов’язкове
    Поля
    • subject"product" | "variant" | "batch" | "unit" | "events"обов’язкове
    • versioninteger
    • hashstringобов’язкове
    • anchorobject | nullобов’язкове
      Поля
      • daystringобов’язкове
      • rootstringобов’язкове
      • algorithmstringобов’язкове
      • leavesintegerобов’язкове
      • pathobject[]обов’язкове
        Поля
        • side"left" | "right"обов’язкове
        • hashstringобов’язкове
      • timestampobject | nullобов’язкове
        Поля
        • providerstringобов’язкове
        • atstringобов’язкове
        • digeststringобов’язкове
        • tokenstringобов’язкове
          Base64 RFC 3161 TimeStampResp
Помилки
404
  • unknownCode — Unknown code
  • PASSPORT_NONE — This product has no passport — the manufacturer did not add the “Digital product passport” block. The product data is in the machine data of the code (/data).
410
  • codeRetired — The {brand} product page is no longer maintained — please contact the manufacturer directly. params: brand
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/q/A1B2C3D4/passport/anchor'

JavaScript

const res = await fetch('https://itemoo.eu/q/A1B2C3D4/passport/anchor', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/q/A1B2C3D4/passport/anchor');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Request access to an archived passport

post/q/{code}/passport/access-request

без ключа

After the contract of the brand ends, regulated passports (batteries with the full passport) stay available in the Itemoo Passport Archive, but the brand no longer issues recipient tokens. Authorities and persons with a legitimate interest (Regulation (EU) 2023/1542 Annex XIII) request access here; a platform operator reviews the request and another one approves it (four eyes) and sends the token. Outside the archive the route answers 404 — ask the brand.

Параметри

ПолеТипОпис
code
path · обов’язкове
stringItemoo code from the QR label (unit, batch, variant or product)
Приклад: A1B2C3D4

Тіло запиту application/json

  • level"legit" | "authority"обов’язкове
  • organizationstringобов’язкове
    Authority, service, recycler…
  • emailstringобов’язкове
    Contact e-mail for the token (deleted 180 days after the decision)
  • justificationstringобов’язкове
    Why the access is needed and on what basis

Відповідь 200 · application/json

PassportAccessRequestCreated

  • idstringобов’язкове
  • status"new"обов’язкове
Помилки
400
  • PASSPORT_GRANT_LEVEL — Access: legit (legitimate interest) or authority.
  • PASSPORT_REQUEST_ORGANIZATION — Enter the organisation name (authority, service, recycler).
  • PASSPORT_REQUEST_JUSTIFICATION — Justification: 20–2000 characters (why the access and on what basis).
  • EMAIL_INVALID — E-mail: invalid address
404
  • unknownCode — Unknown code
409
  • PASSPORT_REQUEST_PENDING — A request with this e-mail address for this product is already awaiting a decision.
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X POST 'https://itemoo.eu/q/A1B2C3D4/passport/access-request' \
  -H 'Content-Type: application/json' \
  -d '{"level":"legit","organization":"Recycling Sp. z o.o.","email":"office@example.com","justification":"Dismantling and recycling of the battery received as waste."}'

JavaScript

const res = await fetch('https://itemoo.eu/q/A1B2C3D4/passport/access-request', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "level": "legit",
    "organization": "Recycling Sp. z o.o.",
    "email": "office@example.com",
    "justification": "Dismantling and recycling of the battery received as waste."
  }),
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/q/A1B2C3D4/passport/access-request');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
  CURLOPT_POSTFIELDS => '{"level":"legit","organization":"Recycling Sp. z o.o.","email":"office@example.com","justification":"Dismantling and recycling of the battery received as waste."}',
]);
$data = json_decode(curl_exec($ch), true);

Restricted passport document file

get/q/{code}/passport/documents/{versionId}

без ключа

The file of a document outside the public level (e.g. dismantling information, test reports — Annex XIII points 2–3 of Regulation (EU) 2023/1542). Its address comes from documents[].url of GET /q/{code}/passport read with a token; the public file address of such a document returns 404. Requires Authorization: Bearer ipa_… with a level that sees the document; every download is recorded in the producer's access log. Never cached.

Параметри

ПолеТипОпис
code
path · обов’язкове
stringItemoo code from the QR label (unit, batch, variant or product)
Приклад: A1B2C3D4
versionId
path · обов’язкове
stringDocument version id from the passport
Приклад: clx0doc0version0001
Authorization
header
stringBearer ipa_… — recipient token (required)

Відповідь 200 · application/pdf, application/octet-stream

Document file

Помилки
401
  • PASSPORT_GRANT_INVALID — The passport access is invalid, expired or revoked.
404
  • DOCUMENT_NOT_FOUND — Document not found
  • unknownCode — Unknown code
410
  • codeRetired — The {brand} product page is no longer maintained — please contact the manufacturer directly. params: brand
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/q/A1B2C3D4/passport/documents/clx0doc0version0001'

JavaScript

const res = await fetch('https://itemoo.eu/q/A1B2C3D4/passport/documents/clx0doc0version0001', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/q/A1B2C3D4/passport/documents/clx0doc0version0001');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Resolve a GTIN

get/01/{gtin}

без ключа

GS1 Digital Link resolver. With linkType=linkset or Accept: application/linkset+json it returns the linkset (RFC 9264) built from the published page: product page, instructions, certificates, passport and recall status. With linkType=gs1:<type> it redirects (307) to the first link of that type. Without either it shows the product page (HTML). One GTIN used by several brands returns a choice of their pages.

Параметри

ПолеТипОпис
gtin
path · обов’язкове
stringGTIN (8–14 digits)
Приклад: 05901234123457
linkType
query
string"linkset" = the whole linkset (also with Accept: application/linkset+json); "gs1:pip" etc. = 307 redirect to the first link of that type
lang
query
string
Accept-Language
header
stringPreferred language of the texts (fact names, description) when lang is missing.
Accept
header
stringapplication/linkset+json returns the linkset without linkType.

Відповідь 200 · application/linkset+json

Linkset

  • linksetmap<string, string | object[]>[]обов’язкове
    One entry: "anchor" (the GS1 URI) and one key per link type (https://gs1.org/voc/pip, …/instructions, …/certificationInfo, …/sustainabilityInfo, …/recallStatus)
    Поля
    • hrefstringобов’язкове
    • titlestring
    • typestring
    • hreflangstring[]
Помилки
404
  • unknownCode — Unknown code
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/01/05901234123457?linkType=linkset'

JavaScript

const res = await fetch('https://itemoo.eu/01/05901234123457?linkType=linkset', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/01/05901234123457?linkType=linkset');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Resolve a GTIN with a batch

get/01/{gtin}/10/{lot}

без ключа

GS1 Digital Link resolver. With linkType=linkset or Accept: application/linkset+json it returns the linkset (RFC 9264) built from the published page: product page, instructions, certificates, passport and recall status. With linkType=gs1:<type> it redirects (307) to the first link of that type. Without either it shows the product page (HTML). One GTIN used by several brands returns a choice of their pages.

Параметри

ПолеТипОпис
gtin
path · обов’язкове
stringGTIN (8–14 digits)
Приклад: 05901234123457
lot
path · обов’язкове
string
linkType
query
string"linkset" = the whole linkset (also with Accept: application/linkset+json); "gs1:pip" etc. = 307 redirect to the first link of that type
lang
query
string
Accept-Language
header
stringPreferred language of the texts (fact names, description) when lang is missing.
Accept
header
stringapplication/linkset+json returns the linkset without linkType.

Відповідь 200 · application/linkset+json

Linkset

  • linksetmap<string, string | object[]>[]обов’язкове
    One entry: "anchor" (the GS1 URI) and one key per link type (https://gs1.org/voc/pip, …/instructions, …/certificationInfo, …/sustainabilityInfo, …/recallStatus)
    Поля
    • hrefstringобов’язкове
    • titlestring
    • typestring
    • hreflangstring[]
Помилки
404
  • unknownCode — Unknown code
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/01/05901234123457/10/L2026-10?linkType=linkset'

JavaScript

const res = await fetch('https://itemoo.eu/01/05901234123457/10/L2026-10?linkType=linkset', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/01/05901234123457/10/L2026-10?linkType=linkset');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Resolve a GTIN with a serial number

get/01/{gtin}/21/{serial}

без ключа

GS1 Digital Link resolver. With linkType=linkset or Accept: application/linkset+json it returns the linkset (RFC 9264) built from the published page: product page, instructions, certificates, passport and recall status. With linkType=gs1:<type> it redirects (307) to the first link of that type. Without either it shows the product page (HTML). One GTIN used by several brands returns a choice of their pages.

Параметри

ПолеТипОпис
gtin
path · обов’язкове
stringGTIN (8–14 digits)
Приклад: 05901234123457
serial
path · обов’язкове
string
linkType
query
string"linkset" = the whole linkset (also with Accept: application/linkset+json); "gs1:pip" etc. = 307 redirect to the first link of that type
lang
query
string
Accept-Language
header
stringPreferred language of the texts (fact names, description) when lang is missing.
Accept
header
stringapplication/linkset+json returns the linkset without linkType.

Відповідь 200 · application/linkset+json

Linkset

  • linksetmap<string, string | object[]>[]обов’язкове
    One entry: "anchor" (the GS1 URI) and one key per link type (https://gs1.org/voc/pip, …/instructions, …/certificationInfo, …/sustainabilityInfo, …/recallStatus)
    Поля
    • hrefstringобов’язкове
    • titlestring
    • typestring
    • hreflangstring[]
Помилки
404
  • unknownCode — Unknown code
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/01/05901234123457/21/SN-0001?linkType=linkset'

JavaScript

const res = await fetch('https://itemoo.eu/01/05901234123457/21/SN-0001?linkType=linkset', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/01/05901234123457/21/SN-0001?linkType=linkset');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Resolve a GTIN with a batch and a serial number

get/01/{gtin}/10/{lot}/21/{serial}

без ключа

GS1 Digital Link resolver. With linkType=linkset or Accept: application/linkset+json it returns the linkset (RFC 9264) built from the published page: product page, instructions, certificates, passport and recall status. With linkType=gs1:<type> it redirects (307) to the first link of that type. Without either it shows the product page (HTML). One GTIN used by several brands returns a choice of their pages.

Параметри

ПолеТипОпис
gtin
path · обов’язкове
stringGTIN (8–14 digits)
Приклад: 05901234123457
lot
path · обов’язкове
string
serial
path · обов’язкове
string
linkType
query
string"linkset" = the whole linkset (also with Accept: application/linkset+json); "gs1:pip" etc. = 307 redirect to the first link of that type
lang
query
string
Accept-Language
header
stringPreferred language of the texts (fact names, description) when lang is missing.
Accept
header
stringapplication/linkset+json returns the linkset without linkType.

Відповідь 200 · application/linkset+json

Linkset

  • linksetmap<string, string | object[]>[]обов’язкове
    One entry: "anchor" (the GS1 URI) and one key per link type (https://gs1.org/voc/pip, …/instructions, …/certificationInfo, …/sustainabilityInfo, …/recallStatus)
    Поля
    • hrefstringобов’язкове
    • titlestring
    • typestring
    • hreflangstring[]
Помилки
404
  • unknownCode — Unknown code
429
  • rateLimited — Too many requests. Please try again in a moment.
  • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

Приклад

cURL

curl -X GET 'https://itemoo.eu/01/05901234123457/10/L2026-10/21/SN-0001?linkType=linkset'

JavaScript

const res = await fetch('https://itemoo.eu/01/05901234123457/10/L2026-10/21/SN-0001?linkType=linkset', {
  method: 'GET',
});
const data = await res.json();

PHP

$ch = curl_init('https://itemoo.eu/01/05901234123457/10/L2026-10/21/SN-0001?linkType=linkset');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

Resolver description

get/.well-known/gs1resolver

без ключа

GS1 resolver description: supported keys and link types, for scanners and passport registries.

Відповідь 200 · application/json

object

    Помилки
    429
    • rateLimited — Too many requests. Please try again in a moment.
    • rateBlocked — Too many attempts from this address. Please try again in about 15 minutes.

    Приклад

    cURL

    curl -X GET 'https://itemoo.eu/.well-known/gs1resolver'

    JavaScript

    const res = await fetch('https://itemoo.eu/.well-known/gs1resolver', {
      method: 'GET',
    });
    const data = await res.json();

    PHP

    $ch = curl_init('https://itemoo.eu/.well-known/gs1resolver');
    curl_setopt_array($ch, [
      CURLOPT_CUSTOMREQUEST => 'GET',
      CURLOPT_RETURNTRANSFER => true,
    ]);
    $data = json_decode(curl_exec($ch), true);