- Itemoo
- Разработчикам
- API паспорта (EN 18222:2026)
Справочник · v1
Itemoo DPP Life Cycle API (EN 18222:2026)
Жизненный цикл и поиск паспорта по EN 18222:2026: чтение (в том числе на дату и по идентификатору продукта), создание и изменение в модели EN 18223:2026. Чтение без ключа, запись — с ключом бренда.
Описания эндпоинтов и полей — на английском, так же как коды и названия полей в API.
Введение
https://itemoo.eu/dpp-api/v1
Digital Product Passport life cycle and search API per EN 18222:2026 (HTTPS/REST binding of clause 8), with the payload per EN 18223:2026 and errors as Result objects (7.2). The dppApiEndpoint of Itemoo passports in the EU registry is https://itemoo.eu/dpp-api.
Access. Reading needs no key: you get the public level. Authorization: Bearer ipa_… (recipient token issued by the brand) gives the level of that grant; a brand API key itm_… with the passport scope gives all levels of the brand’s own passports and is required for writing. Access levels follow Regulation (EU) 2024/1781 Art. 10(1)(g) and Annex XIII of Regulation (EU) 2023/1542. A back-up grant (ipa_…, issued by the brand to its back-up DPP service provider) reads every passport of the brand at all levels and may also list them (GET /backupDpps) with their versions (GET /dpps/{dppId}/versions) — Itemoo extensions for EN 18221:2026 4.5 replication.
Representation. ?representation=compressed (default) or full; Accept: application/ld+json returns the Itemoo JSON-LD document instead.
Errors. { message: [{ messageType, code, text, correlationId, timestamp, itemooCode?, params? }] } — code is the generic status (Table 15), itemooCode the stable Itemoo code. A retired code answers 404 with itemooCode: codeRetired. Every response carries X-Request-Id (sent by you or generated) — it is the correlationId.
Timestamps. Every timestamp in responses is ISO 8601 in UTC with whole seconds (2026-10-26T12:00:00Z, EN 18222:2026 7.1). A date sent in the address (date) needs a time zone (Z or ±hh:mm) or is a plain date (YYYY-MM-DD, start of the day in UTC).
Limits. 120 calls per minute per IP address, or per key with a brand key. Over the limit the API answers HTTP 429 with a Retry-After header (seconds). This is a deliberate deviation from EN 18222:2026 Table 15, which has no status for rate limiting: the Result body carries the generic ClientErrorBadRequest with itemooCode rateLimited (rateBlocked — a longer block after repeated excess), while the HTTP status stays 429 so that standard HTTP clients back off. DELETE /dpps/{dppId} answers 405 — a passport is never deleted.
Registration. The EU DPP registry serves POST v1/registerDPP (EN 18222:2026 5.2); Itemoo does not register on behalf of the brand — the panel exports the registry entry (unique identifiers, dppApiEndpoint, backup operator).
Life cycle
ReadDPPById — the passport
get/dpp-api/v1/dpps/{dppId}
без ключа
EN 18222:2026 4.2. The current passport at the access level of the caller. CORS is open; public answers are cached for 5 minutes.
Параметры
| Поле | Тип | Описание |
|---|---|---|
dppIdpath · обязательное | string | Passport identifier: the Itemoo code or the passport URI https://itemoo.eu/q/{code} (percent-encoded)Пример: A1B2C3D4 |
representationquery | "compressed" | "full" | compressed (default) — header and data elements keyed by elementId (EN 18223:2026 5.2); full — elements[] with objectType (EN 18223:2026 Annex A) |
langquery | string | Two-letter language of the texts; without it the Accept-Language header decides |
Authorizationheader | string | Optional. Bearer ipa_… — recipient token issued by the brand (legitimate interest or authority level); Bearer itm_… (or X-Api-Key) — brand API key with the passport scope: all levels of the brand’s own passports. Without it: the public level. |
Acceptheader | string | application/ld+json (without representation) returns the Itemoo JSON-LD document of the passport instead. |
Accept-Languageheader | string | Preferred language of the texts and of error messages. |
Ответ 200 · application/json
DigitalProductPassport
digitalProductPassportIdstringобязательноеGlobally unique passport URIuniqueProductIdentifierstringобязательноеGS1 Digital Link of the code level (with batch and serial number) or the code URI (EN 18219:2026)granularity"model" | "batch" | "item"обязательноеdppSchemaVersionstringобязательноеdppStatus"active" | "inactive" | "archived"обязательноеactive (also during a recall — seerecall), inactive (end of life of the unit, passport closed by the brand), archived (read-only archive after the brand left Itemoo). The detailed Itemoo status is inlifecyclelastUpdatedstring (date-time)обязательноеUTC, whole secondseconomicOperatorIdstring | nullобязательноеManufacturer identifier per EN 18219:2026 (ISO/IEC 6523ICD:value, e.g.0088:+ GLN); null when the brand has not entered onefacilityIdstringcontentSpecificationIdsstring[]обязательноеLegal acts the passport content follows, e.g.EU 2024/1781,EU 2023/1542
Ошибки
| 400 |
|
| 401 |
|
| 403 |
|
| 404 |
|
| 429 |
|
Пример
cURL
curl -X GET 'https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4'JavaScript
const res = await fetch('https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4', {
method: 'GET',
});
const data = await res.json();PHP
$ch = curl_init('https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);Попробовать
Не удалось отправить запрос.
DeleteDPPById — not allowed
delete/dpp-api/v1/dpps/{dppId}
без ключа
EN 18222:2026 4.8. A passport must stay available for the whole product lifetime (Regulation (EU) 2024/1781 Art. 9–10), so it is never deleted: always 405 ClientMethodNotAllowed with Allow: GET, PATCH. End of life is a passport status (dppStatus, lifecycle).
Параметры
| Поле | Тип | Описание |
|---|---|---|
dppIdpath · обязательное | string | Passport identifier: the Itemoo code or the passport URI https://itemoo.eu/q/{code} (percent-encoded)Пример: A1B2C3D4 |
Ответ 200 · application/json
null
Ошибки
| 405 |
|
| 429 |
|
Пример
cURL
curl -X DELETE 'https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4'JavaScript
const res = await fetch('https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4', {
method: 'DELETE',
});
const data = await res.json();PHP
$ch = curl_init('https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);ReadDPPByProductId — the passport of a product
get/dpp-api/v1/dppsByProductId/{productId}
без ключа
EN 18222:2026 4.3. The current passport of the product identified by its unique product identifier (EN 18219:2026): a GS1 Digital Link (https://…/01/{gtin}, optionally /10/{lot} and /21/{serial}), a GTIN, a passport URI or a code — percent-encoded. A GS1 address on a brand domain searches that brand only. One GTIN used by several brands answers 409 DPP_PRODUCT_AMBIGUOUS — use POST /dppsByProductIds.
Параметры
| Поле | Тип | Описание |
|---|---|---|
productIdpath · обязательное | string | Unique product identifier, percent-encoded Пример: https%3A%2F%2Fitemoo.eu%2F01%2F05901234123457%2F10%2FL1 |
representationquery | "compressed" | "full" | compressed (default) — header and data elements keyed by elementId (EN 18223:2026 5.2); full — elements[] with objectType (EN 18223:2026 Annex A) |
langquery | string | Two-letter language of the texts; without it the Accept-Language header decides |
Authorizationheader | string | Optional. Bearer ipa_… — recipient token issued by the brand (legitimate interest or authority level); Bearer itm_… (or X-Api-Key) — brand API key with the passport scope: all levels of the brand’s own passports. Without it: the public level. |
Acceptheader | string | application/ld+json (without representation) returns the Itemoo JSON-LD document of the passport instead. |
Accept-Languageheader | string | Preferred language of the texts and of error messages. |
Ответ 200 · application/json
DigitalProductPassport
digitalProductPassportIdstringобязательноеGlobally unique passport URIuniqueProductIdentifierstringобязательноеGS1 Digital Link of the code level (with batch and serial number) or the code URI (EN 18219:2026)granularity"model" | "batch" | "item"обязательноеdppSchemaVersionstringобязательноеdppStatus"active" | "inactive" | "archived"обязательноеactive (also during a recall — seerecall), inactive (end of life of the unit, passport closed by the brand), archived (read-only archive after the brand left Itemoo). The detailed Itemoo status is inlifecyclelastUpdatedstring (date-time)обязательноеUTC, whole secondseconomicOperatorIdstring | nullобязательноеManufacturer identifier per EN 18219:2026 (ISO/IEC 6523ICD:value, e.g.0088:+ GLN); null when the brand has not entered onefacilityIdstringcontentSpecificationIdsstring[]обязательноеLegal acts the passport content follows, e.g.EU 2024/1781,EU 2023/1542
Ошибки
| 400 |
|
| 401 |
|
| 403 |
|
| 404 |
|
| 409 |
|
| 429 |
|
Пример
cURL
curl -X GET 'https://itemoo.eu/dpp-api/v1/dppsByProductId/05901234123457'JavaScript
const res = await fetch('https://itemoo.eu/dpp-api/v1/dppsByProductId/05901234123457', {
method: 'GET',
});
const data = await res.json();PHP
$ch = curl_init('https://itemoo.eu/dpp-api/v1/dppsByProductId/05901234123457');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);Попробовать
Не удалось отправить запрос.
ReadDPPVersionByIdAndDate — the passport at a point in time
get/dpp-api/v1/dppsByIdAndDate/{dppId}
без ключа
EN 18222:2026 4.4. The passport as it was at date, rebuilt from the append-only version history. date is an ISO 8601 timestamp with a time zone (Z or an offset such as +02:00) or a plain date (YYYY-MM-DD = start of that day in UTC); a timestamp without a time zone answers 400 DATE_INVALID. A timestamp without fractional seconds covers that whole second, so the passportVersion.at of a response finds that version again. A date in the future answers 400 DATE_IN_FUTURE (up to 60 seconds ahead counts as now and returns the current passport).
Параметры
| Поле | Тип | Описание |
|---|---|---|
dppIdpath · обязательное | string | Passport identifier: the Itemoo code or the passport URI https://itemoo.eu/q/{code} (percent-encoded)Пример: A1B2C3D4 |
representationquery | "compressed" | "full" | compressed (default) — header and data elements keyed by elementId (EN 18223:2026 5.2); full — elements[] with objectType (EN 18223:2026 Annex A) |
langquery | string | Two-letter language of the texts; without it the Accept-Language header decides |
datequery · обязательное | string | Point in time: ISO 8601 with a time zone (Z or ±hh:mm) or a plain date (start of the day, UTC)Пример: 2026-10-01T00:00:00Z |
Authorizationheader | string | Optional. Bearer ipa_… — recipient token issued by the brand (legitimate interest or authority level); Bearer itm_… (or X-Api-Key) — brand API key with the passport scope: all levels of the brand’s own passports. Without it: the public level. |
Acceptheader | string | application/ld+json (without representation) returns the Itemoo JSON-LD document of the passport instead. |
Accept-Languageheader | string | Preferred language of the texts and of error messages. |
Ответ 200 · application/json
DigitalProductPassport
digitalProductPassportIdstringобязательноеGlobally unique passport URIuniqueProductIdentifierstringобязательноеGS1 Digital Link of the code level (with batch and serial number) or the code URI (EN 18219:2026)granularity"model" | "batch" | "item"обязательноеdppSchemaVersionstringобязательноеdppStatus"active" | "inactive" | "archived"обязательноеactive (also during a recall — seerecall), inactive (end of life of the unit, passport closed by the brand), archived (read-only archive after the brand left Itemoo). The detailed Itemoo status is inlifecyclelastUpdatedstring (date-time)обязательноеUTC, whole secondseconomicOperatorIdstring | nullобязательноеManufacturer identifier per EN 18219:2026 (ISO/IEC 6523ICD:value, e.g.0088:+ GLN); null when the brand has not entered onefacilityIdstringcontentSpecificationIdsstring[]обязательноеLegal acts the passport content follows, e.g.EU 2024/1781,EU 2023/1542
Ошибки
| 400 |
|
| 401 |
|
| 403 |
|
| 404 |
|
| 429 |
|
Пример
cURL
curl -X GET 'https://itemoo.eu/dpp-api/v1/dppsByIdAndDate/A1B2C3D4?date=2026-10-01T00%3A00%3A00Z'JavaScript
const res = await fetch('https://itemoo.eu/dpp-api/v1/dppsByIdAndDate/A1B2C3D4?date=2026-10-01T00%3A00%3A00Z', {
method: 'GET',
});
const data = await res.json();PHP
$ch = curl_init('https://itemoo.eu/dpp-api/v1/dppsByIdAndDate/A1B2C3D4?date=2026-10-01T00%3A00%3A00Z');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);Попробовать
Не удалось отправить запрос.
ReadDPPIdsByProductIds — passport identifiers for product identifiers
post/dpp-api/v1/dppsByProductIds
без ключа
EN 18222:2026 4.5. Passport URIs of every passport matching the product identifiers (same forms as dppsByProductId), page by page: pass pagingMetadata.cursor as cursor with the same productIds until it is missing. Unknown identifiers simply match nothing.
Параметры
| Поле | Тип | Описание |
|---|---|---|
limitquery | string | Page size 1–1000 (default 100) Пример: 100 |
cursorquery | string | The cursor of the previous page (opaque, never empty) |
Тело запроса application/json
productIdsstring[]обязательноеUnique product identifiers (1–1000)
Ответ 200 · application/json
object
payloadstring[]обязательноеPassport URIs (digitalProductPassportId)pagingMetadataobjectобязательноеПоля
cursorstring
Ошибки
| 400 |
|
| 429 |
|
Пример
cURL
curl -X POST 'https://itemoo.eu/dpp-api/v1/dppsByProductIds?limit=100' \
-H 'Content-Type: application/json' \
-d '{"productIds":["https://itemoo.eu/01/05901234123457"]}'JavaScript
const res = await fetch('https://itemoo.eu/dpp-api/v1/dppsByProductIds?limit=100', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"productIds": [
"https://itemoo.eu/01/05901234123457"
]
}),
});
const data = await res.json();PHP
$ch = curl_init('https://itemoo.eu/dpp-api/v1/dppsByProductIds?limit=100');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"productIds":["https://itemoo.eu/01/05901234123457"]}',
]);
$data = json_decode(curl_exec($ch), true);CreateDPP — a passport of a batch or an item
post/dpp-api/v1/dpps
без ключа
EN 18222:2026 4.6. Creates the passport of a new batch (uniqueProductIdentifier with /10/{lot}) or a new item (/21/{serial}) of a product of the brand that has a passport; data elements in the body are saved with it in one transaction. A model passport exists from the moment the product exists — for a model the answer is 409 (exists) or 400 DPP_PASSPORT_BLOCK_REQUIRED. Answers 201 with Location.
Параметры
| Поле | Тип | Описание |
|---|---|---|
Authorizationheader | string | Required. Bearer itm_… (or X-Api-Key) — brand API key with the passport scope, not read-only. |
Accept-Languageheader | string | Preferred language of the texts and of error messages. |
Тело запроса application/json
digitalProductPassportIdstringGlobally unique passport URIuniqueProductIdentifierstringобязательноеgranularity"model" | "batch" | "item"dppSchemaVersionstringdppStatus"active" | "inactive" | "archived"active (also during a recall — seerecall), inactive (end of life of the unit, passport closed by the brand), archived (read-only archive after the brand left Itemoo). The detailed Itemoo status is inlifecyclelastUpdatedstring (date-time)UTC, whole secondseconomicOperatorIdstring | nullManufacturer identifier per EN 18219:2026 (ISO/IEC 6523ICD:value, e.g.0088:+ GLN); null when the brand has not entered onefacilityIdstringcontentSpecificationIdsstring[]Legal acts the passport content follows, e.g.EU 2024/1781,EU 2023/1542
Ответ 201 · application/json
Created
object
digitalProductPassportIdstringобязательное
Ошибки
| 400 |
|
| 401 |
|
| 403 |
|
| 404 |
|
| 409 |
|
| 429 |
|
Пример
cURL
curl -X POST 'https://itemoo.eu/dpp-api/v1/dpps' \
-H 'Content-Type: application/json' \
-d '{"uniqueProductIdentifier":"https://itemoo.eu/01/05901234123457/10/L2026-10/21/SN-0001","battery":{"manufacturingDate":"2026-10-01"}}'JavaScript
const res = await fetch('https://itemoo.eu/dpp-api/v1/dpps', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"uniqueProductIdentifier": "https://itemoo.eu/01/05901234123457/10/L2026-10/21/SN-0001",
"battery": {
"manufacturingDate": "2026-10-01"
}
}),
});
const data = await res.json();PHP
$ch = curl_init('https://itemoo.eu/dpp-api/v1/dpps');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"uniqueProductIdentifier":"https://itemoo.eu/01/05901234123457/10/L2026-10/21/SN-0001","battery":{"manufacturingDate":"2026-10-01"}}',
]);
$data = json_decode(curl_exec($ch), true);Back-up
Version history of a passport (Itemoo extension)
get/dpp-api/v1/dpps/{dppId}/versions
без ключа
Not part of EN 18222:2026 — it makes replication to the back-up DPP service provider possible through this API (EN 18221:2026 4.5). Every version of the passport layers (model, variant, batch, item) with its hash chain, at the access level of the caller: changed fields and values only where the caller sees them, leaf hashes at the authority level. Read a version with GET /dppsByIdAndDate/{dppId}.
Параметры
| Поле | Тип | Описание |
|---|---|---|
dppIdpath · обязательное | string | Passport identifier: the Itemoo code or the passport URI https://itemoo.eu/q/{code} (percent-encoded)Пример: A1B2C3D4 |
Authorizationheader | string | Optional. Bearer ipa_… — recipient token issued by the brand (legitimate interest or authority level); Bearer itm_… (or X-Api-Key) — brand API key with the passport scope: all levels of the brand’s own passports. Without it: the public level. |
Ответ 200 · application/json
object
codestringобязательноеlevelstringобязательноеversionobject | nullversionsobject[]обязательноеVersions, newest first (up to 500)
Ошибки
| 400 |
|
| 401 |
|
| 403 |
|
| 404 |
|
| 429 |
|
Пример
cURL
curl -X GET 'https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4/versions'JavaScript
const res = await fetch('https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4/versions', {
method: 'GET',
});
const data = await res.json();PHP
$ch = curl_init('https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4/versions');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);Попробовать
Не удалось отправить запрос.
All passports of the brand for its back-up provider (Itemoo extension)
get/dpp-api/v1/backupDpps
без ключа
Not part of EN 18222:2026. The back-up DPP service provider chosen by the brand (EN 18221:2026 4.3, 4.5) pulls the list of every passport of the brand page by page, then each passport (GET /dpps/{dppId}), its versions and its documents (the document URLs of the passport) with the same token. Requires Authorization: Bearer ipa_… of a back-up grant issued by the brand (all levels, read-only). Itemoo does not push data: the recovery point objective is how often the provider pulls.
Параметры
| Поле | Тип | Описание |
|---|---|---|
limitquery | string | Page size 1–1000 (default 100) Пример: 100 |
cursorquery | string | The cursor of the previous page (opaque, never empty) |
Authorizationheader | string | Required. Bearer ipa_… — token of the brand’s back-up grant. |
Ответ 200 · application/json
object
payloadstring[]обязательноеPassport URIs (digitalProductPassportId)pagingMetadataobjectобязательноеПоля
cursorstring
Ошибки
| 400 |
|
| 401 |
|
| 403 |
|
| 429 |
|
Пример
cURL
curl -X GET 'https://itemoo.eu/dpp-api/v1/backupDpps?limit=100'JavaScript
const res = await fetch('https://itemoo.eu/dpp-api/v1/backupDpps?limit=100', {
method: 'GET',
});
const data = await res.json();PHP
$ch = curl_init('https://itemoo.eu/dpp-api/v1/backupDpps?limit=100');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);Попробовать
Не удалось отправить запрос.
Data elements
ReadDataElement — one data element
get/dpp-api/v1/dpps/{dppId}/elements/{elementIdPath}
без ключа
EN 18222:2026 6.2. The element at the JSONPath in the compressed passport visible to the caller — a value, or with representation=full a typed data element (SingleValuedDataElement, DataElementCollection, …).
Параметры
| Поле | Тип | Описание |
|---|---|---|
dppIdpath · обязательное | string | Passport identifier: the Itemoo code or the passport URI https://itemoo.eu/q/{code} (percent-encoded)Пример: A1B2C3D4 |
elementIdPathpath · обязательное | string | JSONPath (RFC 9535) from $ with name selectors (.name, ['name']); an index ([0]) only when readingПример: $.battery.chemistry |
representationquery | "compressed" | "full" | compressed (default) — header and data elements keyed by elementId (EN 18223:2026 5.2); full — elements[] with objectType (EN 18223:2026 Annex A) |
langquery | string | Two-letter language of the texts; without it the Accept-Language header decides |
Authorizationheader | string | Optional. Bearer ipa_… — recipient token issued by the brand (legitimate interest or authority level); Bearer itm_… (or X-Api-Key) — brand API key with the passport scope: all levels of the brand’s own passports. Without it: the public level. |
Accept-Languageheader | string | Preferred language of the texts and of error messages. |
Ответ 200 · application/json
any
Ошибки
| 400 |
|
| 401 |
|
| 403 |
|
| 404 |
|
| 429 |
|
Пример
cURL
curl -X GET 'https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4/elements/%24.productInfo.name'JavaScript
const res = await fetch('https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4/elements/%24.productInfo.name', {
method: 'GET',
});
const data = await res.json();PHP
$ch = curl_init('https://itemoo.eu/dpp-api/v1/dpps/A1B2C3D4/elements/%24.productInfo.name');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);Попробовать
Не удалось отправить запрос.