Първи краен срок за DPP в ЕС (Батерии): 129 дни Осигурете съответствие сега
Език
EN DE FR IT ES NL PL BG CS DA EL ET FI HR HU LT LV MT PT RO SK SL SV
Продукт
Функции Следпродажбено обслужване Как работи Демо Enterprise Цени
Сектори
Всички сектори Текстил Електроника Батерии
Ресурси
Блог Сравнете софтуер за DPP Изисквания по държави Оценка на готовността Проверка на екологични твърдения Безплатни изтегляния Речник
Компания
Партньори Контакт
Вход Започнете безплатно
Разработчици / REST API

API справочник

Всичко в MyProductPassport е достъпно чрез REST API с удостоверяване с ключ: създавайте продукти, генерирайте и публикувайте цифрови продуктови паспорти, изпращайте актуални данни за батерии и проверявайте съответствието директно от вашата ERP, PIM или система за изграждане.

01 / Първи стъпкиУдостоверяване

Всяка заявка се удостоверява с API ключ, подаден като Bearer токен. Ключовете се създават в приложението в раздел API ключове, показват се веднъж и се съхраняват хеширани; всеки ключ има собствен набор от разрешения, незадължителен списък с разрешени IP адреси и незадължителна дата на изтичане. Ключовете могат да се сменят без прекъсване.

Заглавие на заявката
Authorization: Bearer pk_your_api_key
Във всеки план. API ключове могат да се създават и използват във всеки план, включително безплатния. Планът определя колко заявки в минута може да прави един ключ (по-долу) и колко продукта и паспорта може да има работното пространство.
Тестов режим. Тестовият ключ (pk_test_...) изпълнява всяко извикване точно както действащ ключ, със същата валидация, идентификатори и отговори, след което го отменя: нищо не се записва, не се изпращат имейли или уебкуки и не се съхраняват файлове. Отговорите съдържат "test_mode": true и заглавие X-MPP-Mode: test. Изградете и тествайте интеграция с реалните си данни, след което преминете към действащ ключ.

Разрешенията се дават за всеки ключ, така че интеграцията получава само това, от което се нуждае:

РазрешениеРазрешения
products:readЧетене на продукти
products:writeСъздаване, обновяване и изтриване на продукти
passports:readЧетене на паспорти
passports:writeГенериране на паспорти
passports:publishПубликуване и архивиране на паспорти
webhooks:manageСъздаване, тестване и премахване на крайни точки за уебкуки
items:readRead individual items and their history
items:writeAdd, update and flag individual items
aftersales:readRead owner registrations and service requests
aftersales:writeUpdate service requests and reply to customers

02 / Първи стъпкиЛимити на заявки

Лимитите са за ключ, на минута и се определят от плана:

ПланЗаявки / минута
Безплатно30
Micro60
Електронен етикет60
Starter120
Professional300
Business600
Battery600

Всеки отговор съдържа заглавията X-RateLimit-Limit и X-RateLimit-Remaining. При превишаване на лимита се връща 429:

429 Too Many Requests
{ "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 ключ с неговите разрешения и лимит на заявки. Може да създава чернови и да попълва полета; никога не публикува, архивира или изтрива нищо: това остава при вас в приложението.

Адрес на сървъра (Streamable HTTP)
https://myproductpassport.eu/api/mcp
Claude Code
claude mcp add --transport http myproductpassport https://myproductpassport.eu/api/mcp \
  --header "Authorization: Bearer pk_live_your_key"
Cursor (mcp.json)
{
  "mcpServers": {
    "myproductpassport": {
      "url": "https://myproductpassport.eu/api/mcp",
      "headers": { "Authorization": "Bearer pk_live_your_key" }
    }
  }
}
Claude Desktop и други клиенти, които стартират локален сървър
{
  "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Пълнотата на паспорта: процент, статус и задължителните полета, които още липсват.
Опитайте с тестов ключ. С тестов ключ (pk_test_...) промените на асистента се проверяват и после се отменят, за да видите какво би направил, преди да му дадете истински ключ.

06 / Крайни точкиАкаунт

GET /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 / Крайни точкиПродукти

GET /products изисква products:read

Показва продуктите в работното ви пространство, най-новите първо, по 25 на страница. Всеки продукт включва сектора си и обобщение на последния паспорт.

ПараметърТипОписание
pageintegerНомер на страница.
Заявка
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 }
}
POST /products изисква products:write

Създава един продукт. Връща 403, ако лимитът за продукти на плана е изчерпан.

ПараметърТипОписание
namestringзадължителноИме на продукта, до 255 знака.
skustringВашият вътрешен SKU, до 100 знака.
gtinstringGTIN-8, 12, 13 или 14 (само цифри).
brandstringМарка, показвана в публичния паспорт.
descriptionstringДо 2000 знака.
categorystringКатегория в свободен текст. По подразбиране "general".
sector_idintegerИдентификатор на сектор, който избира шаблона с полета на паспорта.
country_of_originstringКод на държава, напр. "PT".
weightnumberНетно тегло.
weight_unitstringЕдно от kg, g, lb, oz. По подразбиране kg.
materialsarrayОбекти от {name, percentage 0-100}.
has_packagingbooleanДобавя към паспорта полетата на шаблона за опаковки (ключове, започващи с 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"
  }
}
POST /products/bulk изисква products:write

Създава до 100 продукта с едно извикване. Цялата партида се отхвърля с 403, ако би надхвърлила оставащия ви лимит за продукти. За каталози с хиляди продукти извиквайте тази крайна точка в цикъл или използвайте CSV импорта в приложението.

ПараметърТипОписание
productsarrayзадължителноОт 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" }
  ]
}
GET /products/{id} изисква products:read

Връща един продукт с неговия сектор и обобщение на последния паспорт. 404, ако ID не е във вашето работно пространство.

Заявка
curl https://myproductpassport.eu/api/v1/products/512 \
  -H "Authorization: Bearer pk_your_key"
PUT /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"}'
DELETE /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 / Крайни точкиПаспорти

GET /passports изисква passports:read

Показва паспортите, най-новите първо, по 25 на страница, с обобщение на продукта и всички полета на паспорта.

ПараметърТипОписание
pageintegerНомер на страница.
Заявка
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 }
}
POST /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"
GET /passports/{id} изисква passports:read

Връща един паспорт с продукт, полета, публичен URL адрес и GS1 Digital Link.

Заявка
curl https://myproductpassport.eu/api/v1/passports/96 \
  -H "Authorization: Bearer pk_your_key"
POST /passports/{id}/publish изисква passports:publish

Публикува чернова на паспорт, като активира публичната му страница и QR код. Могат да се публикуват само чернови; всичко друго връща 404.

Заявка
curl -X POST https://myproductpassport.eu/api/v1/passports/96/publish \
  -H "Authorization: Bearer pk_your_key"
POST /passports/{id}/archive изисква passports:publish

Архивира паспорт и изважда публичната му страница от обращение.

Заявка
curl -X POST https://myproductpassport.eu/api/v1/passports/96/archive \
  -H "Authorization: Bearer pk_your_key"
POST /passports/bulk-publish изисква passports:publish

Публикува до 50 чернови на паспорти с едно извикване и отчита резултата за всеки паспорт, така че една грешка никога не прекъсва партидата.

ПараметърТипОписание
passport_idsarrayзадължителноОт 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." }
  ]
}
POST /passports/{id}/successor изисква passports:write

За продукт, подготвен за повторна употреба, пренасочен или преработен, Регламентът за батериите (член 77, параграф 7) изисква нов паспорт, свързан с оригиналния. Това създава нов запис на продукт и чернова на паспорт, предварително попълнена от публикувания, с връзка към него. Оригиналът остава активен и двата паспорта показват връзката. Публикувайте новия с POST /passports/{id}/publish.

ПараметърТипОписание
stagestringзадължително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": []
    }
  }
}
GET /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", "...": "..." }
}
PUT /passports/{id}/fields изисква passports:write

Записва произволен набор от стойности на полета в чернова или активен паспорт: пълния набор по приложение XIII за батерия, полетата на секторен шаблон или ваши собствени ключове. Изпращайте само ключовете, които искате да промените; стойност null или празна премахва полето. Активният паспорт се актуализира на място, адресът и QR кодът му не се променят, а машинните му преводи се генерират отново. Съответствието се оценява наново. Черновата не се публикува с това извикване; използвайте POST /passports/{id}/publish.

ПараметърТипОписание
fieldsobjectзадължителноСъответствие между ключ на поле и стойност. Ключовете са малки букви, цифри и долни черти; стойностите са до 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 }
}
POST /passports/{id}/state-of-health изисква passports:write

Изпраща собствените данни на тази батерия (приложение XIII, точка 4 от Регламент (ЕС) 2023/1542) към публикуван паспорт, за системи BMS и за автопаркове. Изпратете произволно подмножество от полетата по-долу; съответствието се проверява отново след актуализацията. Тези стойности се показват само на зрители, одобрени от собственика на паспорта (член 77, параграф 2), никога на публичната страница. capacity_fade, power_capability и internal_resistance се съхраняват като текущи показания на тази батерия (current_*), отделно от първоначалните стойности на модела.

ПараметърТипОписание
state_of_healthstringнапр. "97% при 412 цикъла".
state_of_certified_energystringОставаща сертифицирана енергия (батерии за ЕПС).
battery_statusstringoriginal, repurposed, re-used, remanufactured или waste.
capacity_fadestringЗагуба на капацитет досега. Съхранява се като current_capacity_fade.
power_capabilitystringТекуща мощност. Съхранява се като current_power_capability.
internal_resistancestringИзмерено вътрешно съпротивление. Съхранява се като current_internal_resistance.
use_datastringЦикли, неблагоприятни събития, температура и степен на зареждане, до 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 }
}
POST /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[].serialstringзадължителноСерийният номер на батерията.
units[].manufacturing_datestringМесец и година, напр. "2026-09".
units[].battery_statusstringoriginal или 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_healthstringСъщо така 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": [] }
PATCH /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" } }
}
GET /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" }
  ]
}
POST /passports/{id}/units/{serial}/successor изисква passports:write

Член 77, параграф 7: батерия, която е подготвена за повторна употреба, с променено предназначение или преработена, получава нов паспорт, свързан с оригиналния. Това регистрира батерията отново, с нов сериен номер и идентификатор, под модел батерия за втори живот във вашето работно пространство (създаден от този модел, ако все още няма такъв), свързва двата паспорта и запазва стойностите, измерени при промяната. Оригиналната батерия запазва паспорта си. Попълнете и публикувайте модела за втори живот с POST /passports/{id}/publish.

ПараметърТипОписание
stagestringзадължителноprepared_for_reuse, repurposed или remanufactured.
valuesobjectзадължителноСтойностите, измерени при промяната: поне едно от remaining_capacity_ah или current_capacity_fade, от current_power_capability или power_fade, от current_internal_resistance или internal_resistance_increase, както и expected_lifetime_cycles_remaining (приложение IV, част А).
serialstringНовият сериен номер. По подразбиране: оригиналният сериен номер плюс -RU, -RP или -RM.
measured_atstringКога са измерени стойностите.
member_statestringДвубуквен код на държавата членка, в която е изпитано здравословното състояние (член 73, параграф 1, буква а)).
target_passport_idintegerСъществуващ модел за втори живот на този модел батерия, под който да бъде регистрирана.
Заявка
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": [] }
  }
}
POST /passports/{id}/registry изисква passports:write

Съхранява подаването към регистъра на ЕС за DPP и резултата от него в паспорта: статус, идентификатор за корелация, регистрационния идентификатор, който връща регистърът, и незадължителна връзка към резервно копие, хоствано от доставчик на услуги за DPP. Самата регистрация се извършва в регистъра на Комисията (уеб формуляр или качване на файл); това запазва резултата заедно с паспорта. GET /passports/{id} връща същия блок под registry.

ПараметърТипОписание
statusstringnot_submitted, submitted, registered или failed.
product_groupstringПродуктова група в регистъра, например batteries.
granularitystringмодел, партида или артикул.
upistringУникален идентификатор на продукта като https URL. По подразбиране е URL адресът на публичния паспорт.
correlation_idstringID за корелация, присвоен от регистъра при подаване.
uristringРегистрационен идентификатор, върнат от регистъра.
backup_urlstringhttps връзка към резервното копие, хоствано от доставчик на DPP услуги.
submitted_atdateДата на подаване.
registered_atdateДата на регистрация.
errorstringОписание на грешката при неуспешно подаване.
Заявка
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"
    }
  }
}
GET /passports/{id}/qr изисква passports:read

QR кодът на паспорта като файл: svg (по подразбиране), png (с марката, готов за печат) или pdf (лист с етикети).

ПараметърТипОписание
formatstringsvg | png | pdf
Заявка
curl "https://myproductpassport.eu/api/v1/passports/96/qr?format=png" \
  -H "Authorization: Bearer pk_your_key" -o passport-96.png

09 / Крайни точкиСъответствие

GET /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 / Крайни точкиСектори

GET /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 / Крайни точкиДокументи

GET /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"
    }
  ]
}
POST /products/{productId}/documents изисква products:write

Многочастично качване. PDF, Word, Excel, CSV, текст, PNG и JPEG до 10 MB, най-много 20 на продукт. Текстът се извлича във фонов режим.

ПараметърТипОписание
filefileзадължителноДокументът.
is_publicbooleanПоказване в публичния паспорт (по подразбиране 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"
PATCH /products/{productId}/documents/{id} изисква products:write

Превключва дали документът е свързан от публичния паспорт.

ПараметърТипОписание
is_publicbooleanзадължително
Заявка
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}'
DELETE /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 / Крайни точкиВерига на доставки

GET /products/{productId}/supply-chain изисква products:read

Стъпките, показани в паспорта на продукта, по ред.

Заявка
curl https://myproductpassport.eu/api/v1/products/512/supply-chain \
  -H "Authorization: Bearer pk_your_key"
PUT /products/{productId}/supply-chain изисква products:write

Заменя всички стъпки със списъка, който изпратите, в изпратения ред. Изпратете празен списък, за да я изчистите. Видове стъпки: raw_material, processing, manufacturing, assembly, packaging, distribution.

ПараметърТипОписание
stepsarrayзадължителноДо 50 стъпки.
steps[].step_typestringзадължително
steps[].supplier_namestringзадължително
steps[].supplier_locationstring
steps[].supplier_countrystringISO 3166-1 alpha-2.
steps[].lat / lngnumber
steps[].descriptionstring
steps[].certificationsarray
steps[].datedate
Заявка
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 / Крайни точкиПреводи

GET /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"}}
    }
  }
}
PUT /passports/{id}/translations/{locale} изисква passports:write

Задава преводите за един език по ключ на полето. Ръчният превод никога не се презаписва машинно. Изпратете празен низ, за да премахнете превод.

ПараметърТипОписание
fieldsobjectзадължително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 / Крайни точкиЦялост и експорти

GET /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": [] } }
GET /passports/{id}/integrity/{sequence} изисква passports:read

Пълният запис във вида, в който е подписан, включително моментната снимка: какво е съдържал паспортът в този момент, до хеша на всеки прикачен файл.

Заявка
curl https://myproductpassport.eu/api/v1/passports/96/integrity/1 \
  -H "Authorization: Bearer pk_your_key"
GET /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 / Крайни точкиЗаявки към доставчици

POST /passports/{id}/supplier-requests изисква passports:write

Изпраща на доставчика имейл с лична връзка за попълване на избраните от вас полета на неговия език. Нищо не попада в паспорта, докато член на вашето работно пространство не го одобри.

ПараметърТипОписание
supplier_namestringзадължително
supplier_emailstringзадължително
field_keysarrayзадължителноКлючове за полета от шаблона на паспорта.
localestringЕзик на имейла и формуляра, напр. de.
due_atdateСрок за отговор; 14 дни, ако не е посочен.
messagestring
Заявка
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"}'
GET /passports/{id}/supplier-requests изисква passports:read

Всички заявки за паспорта с техния статус.

Заявка
curl https://myproductpassport.eu/api/v1/passports/96/supplier-requests \
  -H "Authorization: Bearer pk_your_key"
GET /supplier-requests/{id} изисква passports:read

Една заявка с отговорите, бележката и имената на прикачените файлове от доставчика.

Заявка
curl https://myproductpassport.eu/api/v1/supplier-requests/12 \
  -H "Authorization: Bearer pk_your_key"

16 / Крайни точкиСледпродажбено обслужване

POST /passports/{id}/items изисква items:write

Дайте на артикулите на продукт (от всеки сектор освен батериите, които използват /units) собствен сериен номер: всеки получава собствен адрес и QR код, скрит код за автентичност за етикета, а собственикът може да го регистрира. Изпратете до 10 000 артикула или диапазон. С GTIN адресът е GS1 Digital Link /01/{gtin}/21/{serial}.

ПараметърТипОписание
items[].serialstringзадължителноДо 20 букви, цифри, точки, тирета или долни черти.
items[].batchstringПартида, до 20 знака.
items[].manufactured_onstringДата на производство, ГГГГ-ММ-ДД.
rangeobjectВместо 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": [] }
GET /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" } ] }
}
PATCH /passports/{id}/items/{serial} изисква items:write

Задайте статус stolen или recalled и страницата му предупреждава всеки, който го сканира, с вашия status_note; откраднат артикул не може да бъде регистриран. retired изключва страницата. batch и manufactured_on също могат да се променят.

ПараметърТипОписание
statusstringactive, stolen, recalled или retired.
status_notestringПоказва се на страницата на артикула, до 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."}'
GET /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"
GET /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"
POST /service-requests/{reference}/replies изисква aftersales:write

Отговорът ви се изпраща на клиента по имейл с връзка към страницата на заявката му, на неговия език. internal: true добавя бележка, видима само за вашия екип. PATCH /service-requests/{reference} със статус я придвижва (клиентът се уведомява, когато е в обработка, решена или затворена).

ПараметърТипОписание
bodystringзадължителноОтговорът, до 5000 знака.
internalbooleanБележка за вашия екип вместо отговор.
statusstringnew, 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 / Крайни точкиГрупови редакции и изображения

PATCH /products/bulk-fields изисква products:write

Задава данни за продукта или поле на паспорта за до 5 000 продукта. mode е set, fill (само където е празно) или clear. До 100 продукта се актуализират в рамките на заявката; по-големите набори се поставят в опашка (202).

ПараметърТипОписание
product_idsarrayзадължително
targetstringзадължителноproduct | field
keystringзадължително
valuestring
modestringset | 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": [] } }
POST /products/{id}/images изисква products:write

Качване чрез multipart на файл JPG, PNG или WebP (до 15MB, до 8 на продукт). Първото изображение е корицата в публичния паспорт.

ПараметърТипОписание
imagefileзадължително
altstringОписание на изображението.
Заявка
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"
PUT /products/{id}/images/order изисква products:write

Подайте image_ids в желания ред; първото изображение става корица.

ПараметърТипОписание
image_idsarrayзадължително
Заявка
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]}'
DELETE /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 / Крайни точкиУебкуки

GET /webhooks изисква webhooks:manage

Крайните точки, регистрирани за вашето работно пространство. Тайните не са включени тук; извлечете една крайна точка, за да видите тайната ѝ.

Заявка
curl https://myproductpassport.eu/api/v1/webhooks \
  -H "Authorization: Bearer pk_your_key"
POST /webhooks изисква webhooks:manage

Регистрира публичен HTTPS URL адрес за едно или повече събития. Отговорът включва тайния ключ за подписване. Частни или вътрешни хостове се отказват.

ПараметърТипОписание
urlstringзадължително
eventsarrayзадължителноНякое от събитията по-долу.
Заявка
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"
  }
}
GET /webhooks/{id} изисква webhooks:manage

Заявка
curl https://myproductpassport.eu/api/v1/webhooks/3 \
  -H "Authorization: Bearer pk_your_key"
PUT /webhooks/{id} изисква webhooks:manage

Променете URL адреса или събитията или спрете и възобновете крайната точка. Възобновяването нулира броя на неуспехите; крайната точка се спира автоматично след 10 последователни неуспешни доставки.

ПараметърТипОписание
urlstring
eventsarray
is_activeboolean
Заявка
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}'
POST /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." }
GET /webhooks/{id}/deliveries изисква webhooks:manage

Последни доставки, най-новите първо, с HTTP статуса, върнат от крайната ви точка, и първите 500 знака от тялото на отговора.

ПараметърТипОписание
per_pageintegerДо 100.
Заявка
curl https://myproductpassport.eu/api/v1/webhooks/3/deliveries \
  -H "Authorization: Bearer pk_your_key"
DELETE /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 последователни неуспеха крайната точка се спира, докато не я активирате отново.

Проверка (PHP)
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $endpointSecret);
abort_unless(hash_equals($expected, $request->header('X-MPP-Signature')), 401);