API справочник
Всичко в MyProductPassport е достъпно чрез REST API с удостоверяване с ключ: създавайте продукти, генерирайте и публикувайте цифрови продуктови паспорти, изпращайте актуални данни за батерии и проверявайте съответствието директно от вашата ERP, PIM или система за изграждане.
01 / Първи стъпкиУдостоверяване
Всяка заявка се удостоверява с API ключ, подаден като Bearer токен. Ключовете се създават в приложението в раздел API ключове, показват се веднъж и се съхраняват хеширани; всеки ключ има собствен набор от разрешения, незадължителен списък с разрешени IP адреси и незадължителна дата на изтичане. Ключовете могат да се сменят без прекъсване.
Authorization: Bearer pk_your_api_keyРазрешенията се дават за всеки ключ, така че интеграцията получава само това, от което се нуждае:
| Разрешение | Разрешения |
|---|---|
| products:read | Четене на продукти |
| products:write | Създаване, обновяване и изтриване на продукти |
| passports:read | Четене на паспорти |
| passports:write | Генериране на паспорти |
| passports:publish | Публикуване и архивиране на паспорти |
| webhooks:manage | Създаване, тестване и премахване на крайни точки за уебкуки |
| items:read | Read individual items and their history |
| items:write | Add, update and flag individual items |
| aftersales:read | Read owner registrations and service requests |
| aftersales:write | Update service requests and reply to customers |
02 / Първи стъпкиЛимити на заявки
Лимитите са за ключ, на минута и се определят от плана:
| План | Заявки / минута |
|---|---|
| Безплатно | 30 |
| Micro | 60 |
| Електронен етикет | 60 |
| Starter | 120 |
| Professional | 300 |
| Business | 600 |
| Battery | 600 |
Всеки отговор съдържа заглавията X-RateLimit-Limit и X-RateLimit-Remaining. При превишаване на лимита се връща 429:
{ "error": "Rate limit exceeded.", "limit": 300, "retry_after": 60 }03 / Първи стъпкиГрешки
Грешките са JSON с обичаен код на състоянието. Най-често срещаните:
| Статус | Значение | Примерно тяло |
|---|---|---|
| 401 | Липсващ, невалиден, отменен или изтекъл ключ | {"error": "Invalid or revoked API key."} |
| 403 | На ключа липсва разрешение, IP адресът не е в списъка с разрешени или лимитът на плана е достигнат | {"message": "API key does not have 'products:write' permission."} |
| 404 | Ресурсът не съществува във вашето работно пространство | {"message": "Not found."} |
| 422 | Проверката е неуспешна | {"message": "…", "errors": {"gtin": ["…"]}} |
| 429 | Превишен лимит на заявки | {"error": "Rate limit exceeded."} |
04 / Първи стъпкиСтраниране
Крайните точки за списъци връщат по 25 елемента на страница със стандартните обекти links и meta. Подайте ?page=2, за да преминете през колекцията.
05 / Първи стъпкиКонектор за ИИ асистент (MCP)
Свържете Claude, Cursor или друг асистент, който поддържа Model Context Protocol, и го помолете с прости думи да създава продукти, да попълва паспорти с това, което му кажете, и да проверява какво още липсва. Използва API ключ с неговите разрешения и лимит на заявки. Може да създава чернови и да попълва полета; никога не публикува, архивира или изтрива нищо: това остава при вас в приложението.
https://myproductpassport.eu/api/mcpclaude mcp add --transport http myproductpassport https://myproductpassport.eu/api/mcp \
--header "Authorization: Bearer pk_live_your_key"{
"mcpServers": {
"myproductpassport": {
"url": "https://myproductpassport.eu/api/mcp",
"headers": { "Authorization": "Bearer pk_live_your_key" }
}
}
}{
"mcpServers": {
"myproductpassport": {
"command": "npx",
"args": ["mcp-remote", "https://myproductpassport.eu/api/mcp", "--header", "Authorization: Bearer pk_live_your_key"]
}
}
}Предлаганите инструменти:
| Инструмент | Какво прави |
|---|---|
| list_products | Продуктите на работното пространство, най-новите първо, по 25 на страница, със сектора и последния паспорт. |
| get_product | Един продукт с данните, сектора, регулаторните раздели и последния паспорт. |
| list_sectors | Шаблоните за сектори, които продуктът може да използва (текстил, електроника, батерии, вино и други), с техните ID. Секторът на продукта определя кои полета на паспорта са задължителни. |
| create_product | Добавя продукт в работното пространство. Използвайте sector_id от list_sectors. compliance_sections добавя регулаторни раздели към паспорта: gpsr, epr, france, chemicals, eudr. |
| list_passports | Паспортите на работното пространство, най-новите първо, по 25 на страница, със статус (draft, published, archived), процент на пълнота и публичен адрес. |
| get_passport | Един паспорт: статус, версия, процент на пълнота, публичен адрес и връзки към QR кода. |
| create_passport | Създава чернова на паспорт за продукт. Не се публикува: публикува го човек в приложението. |
| get_passport_fields | Какво изисква паспортът: ключовете на задължителните и незадължителните полета, значението на всяко (етикет, описание, пример), наличните стойности и липсващите задължителни полета. |
| update_passport_fields | Записва стойности на полета в чернова или публикуван паспорт (публикуваният се обновява на място: същият адрес, същият QR код). Ключове от get_passport_fields; празен текст премахва стойност. Записвайте само факти, посочени от потребителя или неговите документи. |
| get_compliance | Пълнотата на паспорта: процент, статус и задължителните полета, които още липсват. |
06 / Крайни точкиАкаунт
/me
Връща удостоверения акаунт, нивото на абонамента му и каква част от лимита за продукти е използвана. Полезно като проверка на връзката.
curl https://myproductpassport.eu/api/v1/me \
-H "Authorization: Bearer pk_your_key"{
"data": {
"id": 42,
"name": "Jane Doe",
"email": "[email protected]",
"company_name": "Acme Ltd",
"subscription_tier": "professional",
"product_count": 128,
"product_limit": 500,
"passport_count": 96,
"organization": {"id": 7, "name": "Acme Ltd"},
"api_key": {"name": "ERP sync", "permissions": ["*"], "rate_limit_per_minute": 1000, "expires_at": null},
"webhooks_available": true
}
}07 / Крайни точкиПродукти
/products
изисква products:read Показва продуктите в работното ви пространство, най-новите първо, по 25 на страница. Всеки продукт включва сектора си и обобщение на последния паспорт.
| Параметър | Тип | Описание | |
|---|---|---|---|
| page | integer | Номер на страница. |
curl "https://myproductpassport.eu/api/v1/products?page=1" \
-H "Authorization: Bearer pk_your_key"{
"data": [
{
"id": 512,
"name": "Alpine Merino Crew Sweater",
"sku": "AM-CREW-01",
"gtin": "05012345678900",
"brand": "Northloom",
"category": "textiles",
"status": "active",
"country_of_origin": "PT",
"weight": 0.4,
"weight_unit": "kg",
"materials": [
{ "name": "Merino wool (RWS)", "percentage": 78 },
{ "name": "Recycled nylon (GRS)", "percentage": 20 },
{ "name": "Elastane", "percentage": 2 }
],
"sector": { "id": 3, "name": "Textiles" },
"latest_passport": {
"id": 96, "version": 1,
"status": "published", "compliance_percentage": 100
},
"created_at": "2026-08-14T09:21:00+00:00",
"updated_at": "2026-09-01T16:02:11+00:00"
}
],
"links": { "next": null },
"meta": { "current_page": 1, "per_page": 25, "total": 1 }
}/products
изисква products:write Създава един продукт. Връща 403, ако лимитът за продукти на плана е изчерпан.
| Параметър | Тип | Описание | |
|---|---|---|---|
| name | string | задължително | Име на продукта, до 255 знака. |
| sku | string | Вашият вътрешен SKU, до 100 знака. | |
| gtin | string | GTIN-8, 12, 13 или 14 (само цифри). | |
| brand | string | Марка, показвана в публичния паспорт. | |
| description | string | До 2000 знака. | |
| category | string | Категория в свободен текст. По подразбиране "general". | |
| sector_id | integer | Идентификатор на сектор, който избира шаблона с полета на паспорта. | |
| country_of_origin | string | Код на държава, напр. "PT". | |
| weight | number | Нетно тегло. | |
| weight_unit | string | Едно от kg, g, lb, oz. По подразбиране kg. | |
| materials | array | Обекти от {name, percentage 0-100}. | |
| has_packaging | boolean | Добавя към паспорта полетата на шаблона за опаковки (ключове, започващи с pkg_), под същия QR код. |
curl -X POST https://myproductpassport.eu/api/v1/products \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Alpine Merino Crew Sweater",
"sku": "AM-CREW-01",
"gtin": "05012345678900",
"sector_id": 3,
"materials": [
{"name": "Merino wool (RWS)", "percentage": 78},
{"name": "Recycled nylon (GRS)", "percentage": 22}
]
}'{
"data": {
"id": 513,
"name": "Alpine Merino Crew Sweater",
"sku": "AM-CREW-01",
"status": "active",
"sector": { "id": 3, "name": "Textiles" },
"created_at": "2026-09-07T18:40:00+00:00"
}
}/products/bulk
изисква products:write Създава до 100 продукта с едно извикване. Цялата партида се отхвърля с 403, ако би надхвърлила оставащия ви лимит за продукти. За каталози с хиляди продукти извиквайте тази крайна точка в цикъл или използвайте CSV импорта в приложението.
| Параметър | Тип | Описание | |
|---|---|---|---|
| products | array | задължително | От 1 до 100 обекта продукти със същите полета като „Създаване на продукт“ (без материали). |
curl -X POST https://myproductpassport.eu/api/v1/products/bulk \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"products": [
{"name": "PSL-BT-122000", "sku": "PSL-BT-122000", "sector_id": 5},
{"name": "PSL-BT-123000", "sku": "PSL-BT-123000", "sector_id": 5}
]
}'{
"message": "2 product(s) created.",
"products": [
{ "id": 514, "name": "PSL-BT-122000", "status": "active" },
{ "id": 515, "name": "PSL-BT-123000", "status": "active" }
]
}/products/{id}
изисква products:read Връща един продукт с неговия сектор и обобщение на последния паспорт. 404, ако ID не е във вашето работно пространство.
curl https://myproductpassport.eu/api/v1/products/512 \
-H "Authorization: Bearer pk_your_key"/products/{id}
изисква products:write Частично актуализира продукт. Изпратете само полетата, които искате да промените; списъкът с полета съвпада с „Създаване на продукт“.
curl -X PUT https://myproductpassport.eu/api/v1/products/512 \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"brand": "Northloom"}'/products/{id}
изисква products:write Изтрива продукт с възможност за възстановяване. Публикуваните паспорти на продукта продължават да работят, така че отпечатаните QR кодове никога не остават без страница.
curl -X DELETE https://myproductpassport.eu/api/v1/products/512 \
-H "Authorization: Bearer pk_your_key"{ "message": "Product deleted." }08 / Крайни точкиПаспорти
/passports
изисква passports:read Показва паспортите, най-новите първо, по 25 на страница, с обобщение на продукта и всички полета на паспорта.
| Параметър | Тип | Описание | |
|---|---|---|---|
| page | integer | Номер на страница. |
curl https://myproductpassport.eu/api/v1/passports \
-H "Authorization: Bearer pk_your_key"{
"data": [
{
"id": 96,
"uuid": "36ff3776-d517-4228-8cde-9208136ea84a",
"version": 1,
"status": "published",
"compliance_status": "compliant",
"compliance_percentage": 100,
"public_url": "https://myproductpassport.co.uk/p/36ff3776-…",
"gs1_url": "https://myproductpassport.co.uk/01/05012345678900",
"product": { "id": 512, "name": "Alpine Merino Crew Sweater", "sku": "AM-CREW-01" },
"fields": [
{ "key": "material_composition", "value": "…", "verification_status": "verified" }
],
"published_at": "2026-08-16T10:00:00+00:00"
}
],
"meta": { "current_page": 1, "per_page": 25, "total": 1 }
}/products/{productId}/passports
изисква passports:write Генерира чернова на паспорт за продукт, като попълва предварително полетата от данните за продукта и шаблона на сектора. Връща черновата с оценката ѝ за съответствие. Продукт, който вече има активен паспорт, връща 409 с този паспорт: коригирайте го с PUT /passports/{id}/fields, което запазва адреса и QR кода му.
curl -X POST https://myproductpassport.eu/api/v1/products/512/passports \
-H "Authorization: Bearer pk_your_key"/passports/{id}
изисква passports:read Връща един паспорт с продукт, полета, публичен URL адрес и GS1 Digital Link.
curl https://myproductpassport.eu/api/v1/passports/96 \
-H "Authorization: Bearer pk_your_key"/passports/{id}/publish
изисква passports:publish Публикува чернова на паспорт, като активира публичната му страница и QR код. Могат да се публикуват само чернови; всичко друго връща 404.
curl -X POST https://myproductpassport.eu/api/v1/passports/96/publish \
-H "Authorization: Bearer pk_your_key"/passports/{id}/archive
изисква passports:publish Архивира паспорт и изважда публичната му страница от обращение.
curl -X POST https://myproductpassport.eu/api/v1/passports/96/archive \
-H "Authorization: Bearer pk_your_key"/passports/bulk-publish
изисква passports:publish Публикува до 50 чернови на паспорти с едно извикване и отчита резултата за всеки паспорт, така че една грешка никога не прекъсва партидата.
| Параметър | Тип | Описание | |
|---|---|---|---|
| passport_ids | array | задължително | От 1 до 50 идентификатора на паспорти. |
curl -X POST https://myproductpassport.eu/api/v1/passports/bulk-publish \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"passport_ids": [96, 97, 98]}'{
"published": 2,
"failed": 1,
"published_ids": [96, 97],
"errors": [
{ "id": 98, "error": "Compliance below the publishing threshold." }
]
}/passports/{id}/successor
изисква passports:write За продукт, подготвен за повторна употреба, пренасочен или преработен, Регламентът за батериите (член 77, параграф 7) изисква нов паспорт, свързан с оригиналния. Това създава нов запис на продукт и чернова на паспорт, предварително попълнена от публикувания, с връзка към него. Оригиналът остава активен и двата паспорта показват връзката. Публикувайте новия с POST /passports/{id}/publish.
| Параметър | Тип | Описание | |
|---|---|---|---|
| stage | string | задължително | prepared_for_reuse, repurposed или remanufactured. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/successor \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "stage": "repurposed" }'{
"data": {
"id": 131, "status": "draft", "version": 1,
"lineage": {
"stage": "repurposed",
"original": { "id": 96, "url": "https://myproductpassport.co.uk/p/..." },
"originals": [{ "passport_id": 96, "product_id": 40, "stage": "repurposed", "status": "published", "url": "https://myproductpassport.co.uk/p/..." }],
"successors": []
}
}
}/passports/{id}/fields
изисква passports:read Връща ключовете на полетата, които шаблонът на сектора на паспорта изисква (задължителни и незадължителни), текущите стойности и кои задължителни ключове все още липсват. Използвайте го, за да изградите тялото за PUT /passports/{id}/fields.
curl https://myproductpassport.eu/api/v1/passports/96/fields \
-H "Authorization: Bearer pk_your_key"{
"passport_id": 96,
"sector": "batteries",
"compliance_percentage": 84,
"required": ["battery_category", "carbon_footprint", "..."],
"optional": ["energy_round_trip_efficiency", "..."],
"missing_required": ["carbon_footprint_class", "recycled_content"],
"values": { "battery_category": "Industrial", "...": "..." }
}/passports/{id}/fields
изисква passports:write Записва произволен набор от стойности на полета в чернова или активен паспорт: пълния набор по приложение XIII за батерия, полетата на секторен шаблон или ваши собствени ключове. Изпращайте само ключовете, които искате да промените; стойност null или празна премахва полето. Активният паспорт се актуализира на място, адресът и QR кодът му не се променят, а машинните му преводи се генерират отново. Съответствието се оценява наново. Черновата не се публикува с това извикване; използвайте POST /passports/{id}/publish.
| Параметър | Тип | Описание | |
|---|---|---|---|
| fields | object | задължително | Съответствие между ключ на поле и стойност. Ключовете са малки букви, цифри и долни черти; стойностите са до 5000 знака. До 200 ключа на извикване. |
curl -X PUT https://myproductpassport.eu/api/v1/passports/96/fields \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"fields": {
"carbon_footprint": "61.2 kg CO2e/kWh",
"carbon_footprint_class": "C",
"recycled_content": "Cobalt 16%, lithium 6%, nickel 6%, lead 0%"
}
}'{
"message": "3 field(s) changed, 0 removed.",
"changed": ["carbon_footprint", "carbon_footprint_class", "recycled_content"],
"removed": [],
"passport": { "id": 96, "status": "published", "compliance_percentage": 92 }
}/passports/{id}/state-of-health
изисква passports:write Изпраща собствените данни на тази батерия (приложение XIII, точка 4 от Регламент (ЕС) 2023/1542) към публикуван паспорт, за системи BMS и за автопаркове. Изпратете произволно подмножество от полетата по-долу; съответствието се проверява отново след актуализацията. Тези стойности се показват само на зрители, одобрени от собственика на паспорта (член 77, параграф 2), никога на публичната страница. capacity_fade, power_capability и internal_resistance се съхраняват като текущи показания на тази батерия (current_*), отделно от първоначалните стойности на модела.
| Параметър | Тип | Описание | |
|---|---|---|---|
| state_of_health | string | напр. "97% при 412 цикъла". | |
| state_of_certified_energy | string | Оставаща сертифицирана енергия (батерии за ЕПС). | |
| battery_status | string | original, repurposed, re-used, remanufactured или waste. | |
| capacity_fade | string | Загуба на капацитет досега. Съхранява се като current_capacity_fade. | |
| power_capability | string | Текуща мощност. Съхранява се като current_power_capability. | |
| internal_resistance | string | Измерено вътрешно съпротивление. Съхранява се като current_internal_resistance. | |
| use_data | string | Цикли, неблагоприятни събития, температура и степен на зареждане, до 5000 знака. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/state-of-health \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"state_of_health": "97% at 412 cycles",
"capacity_fade": "3% from initial rated capacity"
}'{
"message": "2 field(s) updated.",
"updated_fields": ["state_of_health", "current_capacity_fade"],
"passport": { "id": 96, "status": "published", "compliance_percentage": 100 }
}/passports/{id}/units
изисква passports:write Всяка батерия се нуждае от собствен паспорт (Регламент (ЕС) 2023/1542, член 77, параграф 1). Регистрирайте до 10 000 батерии от един модел с едно извикване, всяка със собствен сериен номер (до 20 букви, цифри, точки, тирета или долни черти) и по избор manufacturing_date, battery_status и нейните данни по приложение XIII, точка 4. Съществуващите серийни номера се актуализират; стойностите, които пропуснете, се запазват. Ако продуктът има GTIN, адресът на всяка батерия е нейният GS1 Digital Link, /01/{gtin}/21/{serial}. Данните по точка 4 се показват само на зрители, одобрени от собственика.
| Параметър | Тип | Описание | |
|---|---|---|---|
| units[].serial | string | задължително | Серийният номер на батерията. |
| units[].manufacturing_date | string | Месец и година, напр. "2026-09". | |
| units[].battery_status | string | original или waste. Промяната на статуса изисква стойностите, измерени при нея (приложение XIII, точка 4, буква а)); за waste се изискват и responsible_party_type (producer, pro или waste_operator), responsible_party_name и responsible_party_contact (член 77, параграф 7). recycled, с recycled_at и recycler_name, прекратява паспорта (член 77, параграф 8). Батерия с променено предназначение, повторно използвана или преработена получава нов паспорт: POST /passports/{id}/units/{serial}/successor. | |
| units[].state_of_health | string | Също така state_of_certified_energy, current_capacity_fade, current_power_capability, current_internal_resistance, remaining_capacity_ah, power_fade, internal_resistance_increase, round_trip_efficiency, round_trip_efficiency_fade, expected_lifetime_cycles_remaining, self_discharge_rate, ohmic_resistance и use_data. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/units \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"units": [{"serial": "KES-00001", "manufacturing_date": "2026-09", "state_of_health": "100%"}]}'{ "created": 1, "updated": 0, "skipped": 0, "errors": [] }/passports/{id}/units/{serial}
изисква passports:write За система за управление на батерията, която изпраща данните на една батерия: всяко от battery_status, state_of_health, state_of_certified_energy, current_capacity_fade, current_power_capability, current_internal_resistance и use_data. Извикайте GET на същия път, за да ги прочетете, или GET /passports/{id}/units за списъка (per_page до 500).
curl -X PATCH https://myproductpassport.eu/api/v1/passports/96/units/KES-00001 \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"state_of_health": "96% at 412 cycles"}'{
"data": { "serial": "KES-00001", "public_url": "https://myproductpassport.co.uk/01/05012345678900/21/KES-00001", "battery_status": "original", "data": { "state_of_health": "96% at 412 cycles" } }
}/passports/{id}/units/{serial}/snapshots
изисква passports:read Приложение XIII, точка 4, буква а) изисква стойностите за работните характеристики и дълготрайността при пускането на батерията на пазара и при промяна на статуса ѝ. Тези показания се запазват такива, каквито са, независимо какво се подава по-късно; изпратете record_snapshot: true с PATCH, за да запазите и периодично показание.
curl https://myproductpassport.eu/api/v1/passports/96/units/KES-00001/snapshots \
-H "Authorization: Bearer pk_your_key"{
"data": [
{ "event": "placed_on_market", "status": "original", "values": { "state_of_health": "100%" }, "measured_at": "2026-09-26T09:00:00+00:00", "source": "api" },
{ "event": "status_change", "status": "waste", "values": { "remaining_capacity_ah": "71 Ah", "power_fade": "14%", "internal_resistance_increase": "22%", "expected_lifetime_cycles_remaining": "0" }, "measured_at": "2029-03-02T10:00:00+00:00", "source": "bms" }
]
}/passports/{id}/units/{serial}/successor
изисква passports:write Член 77, параграф 7: батерия, която е подготвена за повторна употреба, с променено предназначение или преработена, получава нов паспорт, свързан с оригиналния. Това регистрира батерията отново, с нов сериен номер и идентификатор, под модел батерия за втори живот във вашето работно пространство (създаден от този модел, ако все още няма такъв), свързва двата паспорта и запазва стойностите, измерени при промяната. Оригиналната батерия запазва паспорта си. Попълнете и публикувайте модела за втори живот с POST /passports/{id}/publish.
| Параметър | Тип | Описание | |
|---|---|---|---|
| stage | string | задължително | prepared_for_reuse, repurposed или remanufactured. |
| values | object | задължително | Стойностите, измерени при промяната: поне едно от remaining_capacity_ah или current_capacity_fade, от current_power_capability или power_fade, от current_internal_resistance или internal_resistance_increase, както и expected_lifetime_cycles_remaining (приложение IV, част А). |
| serial | string | Новият сериен номер. По подразбиране: оригиналният сериен номер плюс -RU, -RP или -RM. | |
| measured_at | string | Кога са измерени стойностите. | |
| member_state | string | Двубуквен код на държавата членка, в която е изпитано здравословното състояние (член 73, параграф 1, буква а)). | |
| target_passport_id | integer | Съществуващ модел за втори живот на този модел батерия, под който да бъде регистрирана. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/units/KES-00001/successor \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"stage": "repurposed", "values": {"remaining_capacity_ah": "82 Ah", "power_fade": "9%", "internal_resistance_increase": "15%", "expected_lifetime_cycles_remaining": "2000"}}'{
"data": {
"serial": "KES-00001-RP", "battery_status": "repurposed", "passport_id": 131,
"lineage": { "originals": [{ "serial": "KES-00001", "passport_id": 96, "stage": "repurposed" }], "successors": [] }
}
}/passports/{id}/registry
изисква passports:write Съхранява подаването към регистъра на ЕС за DPP и резултата от него в паспорта: статус, идентификатор за корелация, регистрационния идентификатор, който връща регистърът, и незадължителна връзка към резервно копие, хоствано от доставчик на услуги за DPP. Самата регистрация се извършва в регистъра на Комисията (уеб формуляр или качване на файл); това запазва резултата заедно с паспорта. GET /passports/{id} връща същия блок под registry.
| Параметър | Тип | Описание | |
|---|---|---|---|
| status | string | not_submitted, submitted, registered или failed. | |
| product_group | string | Продуктова група в регистъра, например batteries. | |
| granularity | string | модел, партида или артикул. | |
| upi | string | Уникален идентификатор на продукта като https URL. По подразбиране е URL адресът на публичния паспорт. | |
| correlation_id | string | ID за корелация, присвоен от регистъра при подаване. | |
| uri | string | Регистрационен идентификатор, върнат от регистъра. | |
| backup_url | string | https връзка към резервното копие, хоствано от доставчик на DPP услуги. | |
| submitted_at | date | Дата на подаване. | |
| registered_at | date | Дата на регистрация. | |
| error | string | Описание на грешката при неуспешно подаване. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/registry \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"status": "registered",
"correlation_id": "7f3a2c1e-0b4d-4f8e-9a6b-2d1c3e4f5a6b",
"uri": "urn:eu:dpp:reg:00000001",
"registered_at": "2027-02-18"
}'{
"message": "Registry details updated.",
"passport": {
"id": 96,
"registry": {
"status": "registered",
"upi": "https://myproductpassport.co.uk/p/552fbb4e-5d9a-41da-9050-cc9005d8b66b",
"correlation_id": "7f3a2c1e-0b4d-4f8e-9a6b-2d1c3e4f5a6b",
"uri": "urn:eu:dpp:reg:00000001",
"registered_at": "2027-02-18T00:00:00+00:00"
}
}
}/passports/{id}/qr
изисква passports:read QR кодът на паспорта като файл: svg (по подразбиране), png (с марката, готов за печат) или pdf (лист с етикети).
| Параметър | Тип | Описание | |
|---|---|---|---|
| format | string | svg | png | pdf |
curl "https://myproductpassport.eu/api/v1/passports/96/qr?format=png" \
-H "Authorization: Bearer pk_your_key" -o passport-96.png09 / Крайни точкиСъответствие
/passports/{passportId}/compliance
изисква passports:read Извършва проверка за съответствие на паспорт в реално време спрямо задължителните полета на сектора му и отчита точно какво липсва.
curl https://myproductpassport.eu/api/v1/passports/96/compliance \
-H "Authorization: Bearer pk_your_key"{
"data": {
"passport_id": 96,
"product_name": "Alpine Merino Crew Sweater",
"status": "compliant",
"percentage": 100,
"completed_fields": 12,
"total_fields": 12,
"missing_fields": []
}
}10 / Крайни точкиСектори
/sectors
Секторите, в които може да бъде причислен продукт: системните сектори на платформата плюс всички, дефинирани от вашето работно пространство. Използвайте id при създаване на продукти, а ключовете на полетата при записване на полета на паспорта.
curl https://myproductpassport.eu/api/v1/sectors \
-H "Authorization: Bearer pk_your_key"{
"data": [
{
"id": 4,
"slug": "batteries",
"name": "Batteries",
"system": true,
"regulations_finalised": true,
"deadline": "2027-02-18",
"deadline_label": "18 Feb 2027",
"required_fields": ["battery_category", "battery_weight", "..."],
"optional_fields": ["energy_round_trip_efficiency", "..."]
}
]
}11 / Крайни точкиДокументи
/products/{productId}/documents
изисква products:read Декларации за съответствие, протоколи от изпитвания и сертификати, прикачени към продукта. Публичният документ е свързан от всеки публикуван паспорт на продукта.
curl https://myproductpassport.eu/api/v1/products/512/documents \
-H "Authorization: Bearer pk_your_key"{
"data": [
{
"id": 31,
"product_id": 512,
"filename": "declaration-of-conformity.pdf",
"mime_type": "application/pdf",
"file_size": 184322,
"is_public": true,
"processing_status": "completed",
"public_url": "https://myproductpassport.co.uk/p/3f0c.../document/31",
"created_at": "2026-09-22T10:12:00+00:00"
}
]
}/products/{productId}/documents
изисква products:write Многочастично качване. PDF, Word, Excel, CSV, текст, PNG и JPEG до 10 MB, най-много 20 на продукт. Текстът се извлича във фонов режим.
| Параметър | Тип | Описание | |
|---|---|---|---|
| file | file | задължително | Документът. |
| is_public | boolean | Показване в публичния паспорт (по подразбиране false). |
curl -X POST https://myproductpassport.eu/api/v1/products/512/documents \
-H "Authorization: Bearer pk_your_key" \
-F "[email protected]" \
-F "is_public=1"/products/{productId}/documents/{id}
изисква products:write Превключва дали документът е свързан от публичния паспорт.
| Параметър | Тип | Описание | |
|---|---|---|---|
| is_public | boolean | задължително |
curl -X PATCH https://myproductpassport.eu/api/v1/products/512/documents/31 \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"is_public": false}'/products/{productId}/documents/{id}
изисква products:write Премахва файла и връзката му с паспорта.
curl -X DELETE https://myproductpassport.eu/api/v1/products/512/documents/31 \
-H "Authorization: Bearer pk_your_key"{ "message": "Document deleted." }12 / Крайни точкиВерига на доставки
/products/{productId}/supply-chain
изисква products:read Стъпките, показани в паспорта на продукта, по ред.
curl https://myproductpassport.eu/api/v1/products/512/supply-chain \
-H "Authorization: Bearer pk_your_key"/products/{productId}/supply-chain
изисква products:write Заменя всички стъпки със списъка, който изпратите, в изпратения ред. Изпратете празен списък, за да я изчистите. Видове стъпки: raw_material, processing, manufacturing, assembly, packaging, distribution.
| Параметър | Тип | Описание | |
|---|---|---|---|
| steps | array | задължително | До 50 стъпки. |
| steps[].step_type | string | задължително | |
| steps[].supplier_name | string | задължително | |
| steps[].supplier_location | string | ||
| steps[].supplier_country | string | ISO 3166-1 alpha-2. | |
| steps[].lat / lng | number | ||
| steps[].description | string | ||
| steps[].certifications | array | ||
| steps[].date | date |
curl -X PUT https://myproductpassport.eu/api/v1/products/512/supply-chain \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"steps": [{"step_type": "raw_material", "supplier_name": "Merino Growers Co-op", "supplier_country": "NZ", "certifications": ["RWS"]}, {"step_type": "manufacturing", "supplier_name": "Northloom Mill", "supplier_location": "Biella", "supplier_country": "IT"}]}'13 / Крайни точкиПреводи
/passports/{id}/translations
изисква passports:read Всяка преведена стойност на поле по езици, с източника ѝ: auto (машинен, създаден при публикуване) или manual.
curl https://myproductpassport.eu/api/v1/passports/96/translations \
-H "Authorization: Bearer pk_your_key"{
"data": {
"passport_id": 96,
"available_locales": ["bg", "cs", "da", "de", "..."],
"translations": {
"de": {"care_instructions": {"value": "Kalt waschen", "source": "manual"}}
}
}
}/passports/{id}/translations/{locale}
изисква passports:write Задава преводите за един език по ключ на полето. Ръчният превод никога не се презаписва машинно. Изпратете празен низ, за да премахнете превод.
| Параметър | Тип | Описание | |
|---|---|---|---|
| fields | object | задължително | field_key: преведена стойност |
curl -X PUT https://myproductpassport.eu/api/v1/passports/96/translations/de \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"fields": {"care_instructions": "Kalt waschen, nicht bleichen"}}'{ "message": "1 translation(s) written, 0 removed.", "locale": "de", "written": 1, "removed": 0 }14 / Крайни точкиЦялост и експорти
/passports/{id}/integrity
изисква passports:read Всяко публикувано състояние на паспорта като запис, свързан във верига чрез хешове и подписан с Ed25519: отпечатък (SHA-256), стойност на веригата и подпис. Публичните ключове са на адрес /.well-known/mpp-integrity-keys.json, така че всеки може да провери веригата.
curl https://myproductpassport.eu/api/v1/passports/96/integrity \
-H "Authorization: Bearer pk_your_key"{ "data": { "state": "intact", "hash_algorithm": "SHA-256", "signature_algorithm": "Ed25519", "records": [ { "sequence": 1, "event": "published", "content_hash": "8f3a...", "chain_hash": "c21e...", "signature": "MEUC...", "key_id": "3fa9c21e0b7d4a11" } ], "problems": [] } }/passports/{id}/integrity/{sequence}
изисква passports:read Пълният запис във вида, в който е подписан, включително моментната снимка: какво е съдържал паспортът в този момент, до хеша на всеки прикачен файл.
curl https://myproductpassport.eu/api/v1/passports/96/integrity/1 \
-H "Authorization: Bearer pk_your_key"/passports/{id}/epcis
изисква passports:read Паспортът като документ GS1 EPCIS 2.0 JSON-LD: въвеждането на артикула в експлоатация, всяка стъпка от веригата на доставки като наблюдение, отделните батерии и паспортът за втори живот като трансформация. Идентификаторите са URI адреси на GS1 Digital Link, когато продуктът има GTIN.
curl https://myproductpassport.eu/api/v1/passports/96/epcis \
-H "Authorization: Bearer pk_your_key"15 / Крайни точкиЗаявки към доставчици
/passports/{id}/supplier-requests
изисква passports:write Изпраща на доставчика имейл с лична връзка за попълване на избраните от вас полета на неговия език. Нищо не попада в паспорта, докато член на вашето работно пространство не го одобри.
| Параметър | Тип | Описание | |
|---|---|---|---|
| supplier_name | string | задължително | |
| supplier_email | string | задължително | |
| field_keys | array | задължително | Ключове за полета от шаблона на паспорта. |
| locale | string | Език на имейла и формуляра, напр. de. | |
| due_at | date | Срок за отговор; 14 дни, ако не е посочен. | |
| message | string |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/supplier-requests \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"supplier_name": "Mei Chen", "supplier_email": "[email protected]", "field_keys": ["recycled_content_cobalt", "carbon_footprint"], "locale": "de"}'/passports/{id}/supplier-requests
изисква passports:read Всички заявки за паспорта с техния статус.
curl https://myproductpassport.eu/api/v1/passports/96/supplier-requests \
-H "Authorization: Bearer pk_your_key"/supplier-requests/{id}
изисква passports:read Една заявка с отговорите, бележката и имената на прикачените файлове от доставчика.
curl https://myproductpassport.eu/api/v1/supplier-requests/12 \
-H "Authorization: Bearer pk_your_key"16 / Крайни точкиСледпродажбено обслужване
/passports/{id}/items
изисква items:write Дайте на артикулите на продукт (от всеки сектор освен батериите, които използват /units) собствен сериен номер: всеки получава собствен адрес и QR код, скрит код за автентичност за етикета, а собственикът може да го регистрира. Изпратете до 10 000 артикула или диапазон. С GTIN адресът е GS1 Digital Link /01/{gtin}/21/{serial}.
| Параметър | Тип | Описание | |
|---|---|---|---|
| items[].serial | string | задължително | До 20 букви, цифри, точки, тирета или долни черти. |
| items[].batch | string | Партида, до 20 знака. | |
| items[].manufactured_on | string | Дата на производство, ГГГГ-ММ-ДД. | |
| range | object | Вместо items: prefix, start, count, digits и batch, например от SN-00001 до SN-00500. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/items \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"range": {"prefix": "SN-", "start": 1, "count": 500, "digits": 5, "batch": "B2026-10"}}'{ "created": 500, "updated": 0, "skipped": 0, "over_limit": 0, "errors": [] }/passports/{id}/items/{serial}
изисква items:read Артикулът с адреса, статуса, дали е регистриран и до кога е гаранцията, проверките за автентичност и историята. Ключ с items:write получава и скрития код за печат. GET /passports/{id}/items ги изброява (филтри status и batch, per_page до 500).
curl https://myproductpassport.eu/api/v1/passports/96/items/SN-00001 \
-H "Authorization: Bearer pk_your_key"{
"data": { "serial": "SN-00001", "status": "active", "url": "https://myproductpassport.co.uk/01/05012345678900/21/SN-00001", "registered": true, "warranty_ends_on": "2028-10-02", "events": [ { "type": "registered", "country": "IE", "at": "2026-10-03T09:12:00+00:00" } ] }
}/passports/{id}/items/{serial}
изисква items:write Задайте статус stolen или recalled и страницата му предупреждава всеки, който го сканира, с вашия status_note; откраднат артикул не може да бъде регистриран. retired изключва страницата. batch и manufactured_on също могат да се променят.
| Параметър | Тип | Описание | |
|---|---|---|---|
| status | string | active, stolen, recalled или retired. | |
| status_note | string | Показва се на страницата на артикула, до 500 знака. |
curl -X PATCH https://myproductpassport.eu/api/v1/passports/96/items/SN-00001 \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"status": "stolen", "status_note": "Reported stolen on 2 October 2026."}'/owner-registrations
изисква aftersales:read Хората, регистрирали вашите продукти: име, имейл, държава, дата на покупка, търговец, дати на гаранцията и дали са се съгласили с новини и оферти (marketing_consent=1 изброява само тях). По подразбиране активните регистрации; status=pending, transferred или ended за останалите; since= за промени след дата.
curl "https://myproductpassport.eu/api/v1/owner-registrations?marketing_consent=1&since=2026-10-01" \
-H "Authorization: Bearer pk_your_key"/service-requests
изисква aftersales:read Ремонти, гаранционни претенции, връщания, резервни части и въпроси от вашите паспорти, най-новите първи, с филтри status и type. GET /service-requests/{reference} добавя разговора.
curl "https://myproductpassport.eu/api/v1/service-requests?status=new" \
-H "Authorization: Bearer pk_your_key"/service-requests/{reference}/replies
изисква aftersales:write Отговорът ви се изпраща на клиента по имейл с връзка към страницата на заявката му, на неговия език. internal: true добавя бележка, видима само за вашия екип. PATCH /service-requests/{reference} със статус я придвижва (клиентът се уведомява, когато е в обработка, решена или затворена).
| Параметър | Тип | Описание | |
|---|---|---|---|
| body | string | задължително | Отговорът, до 5000 знака. |
| internal | boolean | Бележка за вашия екип вместо отговор. | |
| status | string | new, in_progress, waiting, resolved или closed. |
curl -X POST https://myproductpassport.eu/api/v1/service-requests/SR-7K3F9Q/replies \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"body": "A new lid is on its way today.", "status": "waiting"}'17 / Крайни точкиГрупови редакции и изображения
/products/bulk-fields
изисква products:write Задава данни за продукта или поле на паспорта за до 5 000 продукта. mode е set, fill (само където е празно) или clear. До 100 продукта се актуализират в рамките на заявката; по-големите набори се поставят в опашка (202).
| Параметър | Тип | Описание | |
|---|---|---|---|
| product_ids | array | задължително | |
| target | string | задължително | product | field |
| key | string | задължително | |
| value | string | ||
| mode | string | set | fill | clear |
curl -X PATCH https://myproductpassport.eu/api/v1/products/bulk-fields \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"product_ids": [12, 13, 14], "target": "field", "key": "warranty_period", "value": "10 years", "mode": "fill"}'{ "data": { "changed": 2, "skipped": 1, "errors": [] } }/products/{id}/images
изисква products:write Качване чрез multipart на файл JPG, PNG или WebP (до 15MB, до 8 на продукт). Първото изображение е корицата в публичния паспорт.
| Параметър | Тип | Описание | |
|---|---|---|---|
| image | file | задължително | |
| alt | string | Описание на изображението. |
curl -X POST https://myproductpassport.eu/api/v1/products/12/images \
-H "Authorization: Bearer pk_your_key" \
-F [email protected] -F alt="Front of the battery"/products/{id}/images/order
изисква products:write Подайте image_ids в желания ред; първото изображение става корица.
| Параметър | Тип | Описание | |
|---|---|---|---|
| image_ids | array | задължително |
curl -X PUT https://myproductpassport.eu/api/v1/products/12/images/order \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"image_ids": [31, 30]}'/products/{id}/images/{imageId}
изисква products:write Премахва изображението и неговия файл.
curl -X DELETE https://myproductpassport.eu/api/v1/products/12/images/31 \
-H "Authorization: Bearer pk_your_key"18 / Крайни точкиУебкуки
/webhooks
изисква webhooks:manage Крайните точки, регистрирани за вашето работно пространство. Тайните не са включени тук; извлечете една крайна точка, за да видите тайната ѝ.
curl https://myproductpassport.eu/api/v1/webhooks \
-H "Authorization: Bearer pk_your_key"/webhooks
изисква webhooks:manage Регистрира публичен HTTPS URL адрес за едно или повече събития. Отговорът включва тайния ключ за подписване. Частни или вътрешни хостове се отказват.
| Параметър | Тип | Описание | |
|---|---|---|---|
| url | string | задължително | |
| events | array | задължително | Някое от събитията по-долу. |
curl -X POST https://myproductpassport.eu/api/v1/webhooks \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"url": "https://erp.acme.example/mpp", "events": ["passport.published", "product.updated"]}'{
"data": {
"id": 3,
"url": "https://erp.acme.example/mpp",
"events": ["passport.published", "product.updated"],
"is_active": true,
"failure_count": 0,
"secret": "9f1c...64 hex characters...",
"created_at": "2026-09-22T10:12:00+00:00"
}
}/webhooks/{id}
изисква webhooks:manage curl https://myproductpassport.eu/api/v1/webhooks/3 \
-H "Authorization: Bearer pk_your_key"/webhooks/{id}
изисква webhooks:manage Променете URL адреса или събитията или спрете и възобновете крайната точка. Възобновяването нулира броя на неуспехите; крайната точка се спира автоматично след 10 последователни неуспешни доставки.
| Параметър | Тип | Описание | |
|---|---|---|---|
| url | string | ||
| events | array | ||
| is_active | boolean |
curl -X PUT https://myproductpassport.eu/api/v1/webhooks/3 \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"is_active": true}'/webhooks/{id}/test
изисква webhooks:manage Поставя в опашка доставка webhook.test, за да проверите приемника и кода за подпис.
curl -X POST https://myproductpassport.eu/api/v1/webhooks/3/test \
-H "Authorization: Bearer pk_your_key"{ "message": "Test delivery queued." }/webhooks/{id}/deliveries
изисква webhooks:manage Последни доставки, най-новите първо, с HTTP статуса, върнат от крайната ви точка, и първите 500 знака от тялото на отговора.
| Параметър | Тип | Описание | |
|---|---|---|---|
| per_page | integer | До 100. |
curl https://myproductpassport.eu/api/v1/webhooks/3/deliveries \
-H "Authorization: Bearer pk_your_key"/webhooks/{id}
изисква webhooks:manage curl -X DELETE https://myproductpassport.eu/api/v1/webhooks/3 \
-H "Authorization: Bearer pk_your_key"{ "message": "Webhook endpoint deleted." }19 / СъбитияУебкуки
Вместо периодични заявки регистрирайте крайна точка за webhook в приложението (страница Webhooks, налична от план Starter нагоре) и MyProductPassport ще изпраща JSON чрез POST до вашия URL при всяко събитие:
| Събитие | Задейства се, когато |
|---|---|
| product.created | Продукт е създаден (приложение, API или импорт от CSV) |
| product.updated | Продукт е актуализиран |
| product.deleted | Продукт е изтрит |
| passport.created | Паспорт е генериран |
| passport.published | Паспорт става активен |
| passport.archived | Паспорт е архивиран |
| supplier_request.submitted | Доставчик изпраща информацията, която сте поискали |
| owner.registered | Собственик потвърждава регистрацията си |
| owner.transferred | Артикул преминава към нов регистриран собственик |
| service_request.created | Клиент изпраща сервизна заявка от паспорт |
| service_request.updated | Сервизна заявка получава отговор или нов статус |
| item.status_changed | Артикул е маркиран като откраднат, изтеглен или изваден от употреба, или маркировката е премахната |
| item.verification_failed | Прочитане на защитен етикет е неуспешно, грешните кодове се натрупват или сериен номер се появява на твърде много места |
| webhook.test | Изпращате тестова доставка от приложението |
Всяка доставка е JSON плик: ID на доставката (същият ID се изпраща отново при повторни опити, за да можете да премахнете дубликатите), събитието, номерът на опита, времеви печат и данните за събитието. Събитията за паспорти съдържат uuid на паспорта и публичния URL адрес, така че рядко ви трябва втора заявка:
{
"id": 8123,
"event": "passport.published",
"attempt": 1,
"created_at": "2026-09-22T10:12:00+00:00",
"data": {
"passport_id": 96,
"uuid": "3f0c8f1e-...",
"version": 2,
"status": "published",
"public_url": "https://myproductpassport.co.uk/p/3f0c8f1e-...",
"product_id": 512,
"product": {"id": 512, "name": "Alpine Merino Crew Sweater", "sku": "NL-AMC-001", "gtin": "5012345678900"}
}
}Заглавките съдържат името на събитието, идентификатора на доставката, Unix времева отметка и HMAC подпис на суровото тяло, за да проверите, че идва от нас, и да отхвърляте повторения:
Content-Type: application/json
User-Agent: MyProductPassport-Webhooks/1.0
X-MPP-Event: passport.published
X-MPP-Delivery: 8123
X-MPP-Timestamp: 1790084320
X-MPP-Signature: sha256=<hex hmac of the raw body, keyed with your endpoint secret>Отговорете с който и да е код 2xx в рамките на 10 секунди. Всичко друго се опитва повторно пет пъти за около 90 минути (30 s, 1 min, 5 min, 15 min, 1 h); след 10 последователни неуспеха крайната точка се спира, докато не я активирате отново.
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $endpointSecret);
abort_unless(hash_equals($expected, $request->header('X-MPP-Signature')), 401);