První termín pro DPP v EU (Baterie): 130 dní Zajistěte soulad hned
Jazyk
EN DE FR IT ES NL PL BG CS DA EL ET FI HR HU LT LV MT PT RO SK SL SV
Produkt
Funkce Poprodejní servis Jak to funguje Demo Enterprise Ceny
Sektory
Všechna odvětví Textil Elektronika Baterie
Zdroje
Blog Porovnat software pro DPP Požadavky podle zemí Posouzení připravenosti Kontrola ekologických tvrzení Ke stažení zdarma Slovníček
Společnost
Partneři Kontakt
Přihlásit se Začít zdarma
Vývojáři / REST API

Reference API

Vše v MyProductPassport je dostupné přes REST API s ověřením klíčem: vytvářejte produkty, generujte a zveřejňujte digitální produktové pasy, posílejte aktuální data baterií a kontrolujte soulad přímo z vašeho ERP, PIM nebo build pipeline.

v1 https://myproductpassport.eu/api/v1 Začít zdarma Specifikace OpenAPI ↓

01 / ZačínámeOvěřování

Každý požadavek se ověřuje API klíčem předaným jako Bearer token. Klíče se vytvářejí v aplikaci v sekci API klíče, zobrazí se jednou a ukládají se hashované; každý klíč má vlastní sadu oprávnění, volitelný seznam povolených IP a volitelné datum vypršení. Klíče lze rotovat bez výpadku.

Hlavička požadavku
Authorization: Bearer pk_your_api_key
Ve všech plánech. Klíče API lze vytvářet a používat ve všech plánech včetně bezplatného. Plán určuje, kolik požadavků za minutu smí klíč odeslat (viz níže) a kolik výrobků a pasů smí pracovní prostor mít.
Testovací režim. Testovací klíč (pk_test_...) provede každé volání přesně jako živý klíč, se stejnou validací, ID a odpověďmi, a poté vše vrátí zpět: nic se neuloží, neodešle se žádný e-mail ani webhook a nezůstane žádný soubor. Odpovědi obsahují "test_mode": true a hlavičku X-MPP-Mode: test. Integraci vytvořte a otestujte na svých skutečných datech a poté ji přepněte na živý klíč.

Oprávnění se udělují pro každý klíč zvlášť, takže integrace dostane jen to, co potřebuje:

OprávněníOprávnění
products:readČtení produktů
products:writeVytváření, úprava a mazání produktů
passports:readČtení pasů
passports:writeVygenerovat pasy
passports:publishZveřejňování a archivace pasů
webhooks:manageVytváření, testování a odebírání koncových bodů webhooků
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 / ZačínámeLimity požadavků

Limity platí na klíč a minutu a určuje je tarif:

TarifPožadavků / minutu
Zdarma30
Micro60
E-etiketa60
Starter120
Professional300
Business600
Battery600

Každá odpověď obsahuje hlavičky X-RateLimit-Limit a X-RateLimit-Remaining. Při překročení limitu se vrací 429:

429 Too Many Requests
{ "error": "Rate limit exceeded.", "limit": 300, "retry_after": 60 }

03 / ZačínámeChyby

Chyby jsou ve formátu JSON s běžným stavovým kódem. Nejčastější:

StavVýznamUkázkové tělo
401Chybějící, neplatný, zrušený nebo vypršelý klíč{"error": "Invalid or revoked API key."}
403Klíči chybí oprávnění, IP adresa není na seznamu povolených nebo byl vyčerpán limit plánu{"message": "API key does not have 'products:write' permission."}
404Zdroj ve vašem pracovním prostoru neexistuje{"message": "Not found."}
422Ověření selhalo{"message": "…", "errors": {"gtin": ["…"]}}
429Překročen limit požadavků{"error": "Rate limit exceeded."}

04 / ZačínámeStránkování

Koncové body seznamů vracejí 25 položek na stránku se standardními objekty links a meta. Předejte ?page=2 pro procházení kolekce.

05 / ZačínámeKonektor AI asistenta (MCP)

Připojte Claude, Cursor nebo jakéhokoli asistenta, který podporuje Model Context Protocol, a jednoduše ho požádejte, aby zakládal výrobky, vyplňoval pasy podle toho, co mu řeknete, a kontroloval, co ještě chybí. Používá klíč API s jeho oprávněními a limitem požadavků. Může vytvářet koncepty a vyplňovat pole; nikdy nic nezveřejňuje, nearchivuje ani nemaže: to zůstává na vás v aplikaci.

Adresa serveru (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 a další klienty, které spouštějí místní server
{
  "mcpServers": {
    "myproductpassport": {
      "command": "npx",
      "args": ["mcp-remote", "https://myproductpassport.eu/api/mcp", "--header", "Authorization: Bearer pk_live_your_key"]
    }
  }
}

Nabízené nástroje:

NástrojCo dělá
list_productsVýrobky pracovního prostoru od nejnovějších, 25 na stránku, se sektorem a nejnovějším pasem.
get_productJeden výrobek s údaji, sektorem, regulačními oddíly a nejnovějším pasem.
list_sectorsŠablony sektorů, které může výrobek použít (textil, elektronika, baterie, víno a další), s jejich ID. Sektor výrobku určuje, která pole pasu jsou povinná.
create_productPřidá výrobek do pracovního prostoru. Použijte sector_id z list_sectors. compliance_sections přidá do pasu regulační oddíly: gpsr, epr, france, chemicals, eudr.
list_passportsPasy pracovního prostoru od nejnovějších, 25 na stránku, se stavem (draft, published, archived), procentem úplnosti a veřejnou adresou.
get_passportJeden pas: stav, verze, procento úplnosti, veřejná adresa a odkazy na QR kód.
create_passportVytvoří koncept pasu pro výrobek. Nezveřejní se: zveřejní ho člověk v aplikaci.
get_passport_fieldsCo pas vyžaduje: klíče povinných a volitelných polí, význam každého (popisek, popis, příklad), stávající hodnoty a chybějící povinná pole.
update_passport_fieldsZapíše hodnoty polí do konceptu nebo zveřejněného pasu (zveřejněný se aktualizuje na místě: stejná adresa, stejný QR kód). Klíče z get_passport_fields; prázdný text hodnotu odstraní. Zapisujte jen fakta, která uvádí uživatel nebo jeho dokumenty.
get_complianceÚplnost pasu: procento, stav a povinná pole, která ještě chybějí.
Vyzkoušejte to s testovacím klíčem. S testovacím klíčem (pk_test_...) se změny asistenta zkontrolují a pak vrátí zpět, takže uvidíte, co by udělal, než mu dáte ostrý klíč.

06 / Koncové bodyÚčet

GET /me

Vrátí ověřený účet, jeho úroveň předplatného a kolik z limitu produktů je využito. Užitečné jako test připojení.

Požadavek
curl https://myproductpassport.eu/api/v1/me \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{
  "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 / Koncové bodyProdukty

GET /products vyžaduje products:read

Vypíše produkty ve vašem pracovním prostoru od nejnovějších, 25 na stránku. Každý produkt obsahuje svůj sektor a shrnutí nejnovějšího pasu.

ParametrTypPopis
pageintegerČíslo stránky.
Požadavek
curl "https://myproductpassport.eu/api/v1/products?page=1" \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{
  "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 vyžaduje products:write

Vytvoří jeden produkt. Pokud je vyčerpán limit produktů tarifu, vrátí 403.

ParametrTypPopis
namestringpovinnéNázev produktu, až 255 znaků.
skustringVaše interní SKU, až 100 znaků.
gtinstringGTIN-8, 12, 13 nebo 14 (pouze číslice).
brandstringZnačka zobrazená ve veřejném pasu.
descriptionstringAž 2 000 znaků.
categorystringKategorie jako volný text. Výchozí hodnota "general".
sector_idintegerID odvětví, které vybírá šablonu polí pasu.
country_of_originstringKód země, např. "PT".
weightnumberČistá hmotnost.
weight_unitstringJedno z kg, g, lb, oz. Výchozí je kg.
materialsarrayObjekty {name, percentage 0-100}.
has_packagingbooleanPřidá do pasu pole šablony pro obaly (klíče začínající pkg_), pod stejným QR kódem.
Požadavek
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}
    ]
  }'
Odpověď
{
  "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 vyžaduje products:write

Vytvoří až 100 produktů jedním voláním. Pokud by dávka překročila zbývající limit produktů, je celá odmítnuta s kódem 403. U katalogů s tisíci položkami volejte tento koncový bod ve smyčce nebo použijte import CSV v aplikaci.

ParametrTypPopis
productsarraypovinné1 až 100 objektů výrobků se stejnými poli jako „Vytvořit výrobek“ (bez materiálů).
Požadavek
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}
    ]
  }'
Odpověď
{
  "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} vyžaduje products:read

Vrátí jeden produkt s jeho sektorem a shrnutím nejnovějšího pasu. 404, pokud ID není ve vašem pracovním prostoru.

Požadavek
curl https://myproductpassport.eu/api/v1/products/512 \
  -H "Authorization: Bearer pk_your_key"
PUT /products/{id} vyžaduje products:write

Částečně aktualizuje produkt. Pošlete jen pole, která chcete změnit; seznam polí odpovídá Vytvořit produkt.

Požadavek
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} vyžaduje products:write

Obnovitelně smaže produkt. Zveřejněné pasy produktu dál fungují, takže vytištěné QR kódy nikdy nezůstanou bez stránky.

Požadavek
curl -X DELETE https://myproductpassport.eu/api/v1/products/512 \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{ "message": "Product deleted." }

08 / Koncové bodyPasy

GET /passports vyžaduje passports:read

Vypíše pasy od nejnovějších, 25 na stránku, se shrnutím produktu a všemi poli pasu.

ParametrTypPopis
pageintegerČíslo stránky.
Požadavek
curl https://myproductpassport.eu/api/v1/passports \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{
  "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 vyžaduje passports:write

Vygeneruje koncept pasu pro produkt a předvyplní pole z dat produktu a šablony sektoru. Vrátí koncept se skóre souladu. U produktu, který už má aktivní pas, vrátí 409 s tímto pasem: opravte jej pomocí PUT /passports/{id}/fields, čímž zůstane zachována jeho adresa i QR kód.

Požadavek
curl -X POST https://myproductpassport.eu/api/v1/products/512/passports \
  -H "Authorization: Bearer pk_your_key"
GET /passports/{id} vyžaduje passports:read

Vrátí jeden pas s produktem, poli, veřejnou URL a GS1 Digital Link.

Požadavek
curl https://myproductpassport.eu/api/v1/passports/96 \
  -H "Authorization: Bearer pk_your_key"
POST /passports/{id}/publish vyžaduje passports:publish

Zveřejní koncept pasu a zprovozní jeho veřejnou stránku a QR kód. Zveřejnit lze pouze koncepty; cokoli jiného vrátí 404.

Požadavek
curl -X POST https://myproductpassport.eu/api/v1/passports/96/publish \
  -H "Authorization: Bearer pk_your_key"
POST /passports/{id}/archive vyžaduje passports:publish

Archivuje pas a stáhne jeho veřejnou stránku z oběhu.

Požadavek
curl -X POST https://myproductpassport.eu/api/v1/passports/96/archive \
  -H "Authorization: Bearer pk_your_key"
POST /passports/bulk-publish vyžaduje passports:publish

Zveřejní až 50 konceptů pasů jedním voláním a hlásí výsledky pro každý pas, takže jedno selhání nikdy nepřeruší celou dávku.

ParametrTypPopis
passport_idsarraypovinné1 až 50 ID pasů.
Požadavek
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]}'
Odpověď
{
  "published": 2,
  "failed": 1,
  "published_ids": [96, 97],
  "errors": [
    { "id": 98, "error": "Compliance below the publishing threshold." }
  ]
}
POST /passports/{id}/successor vyžaduje passports:write

U výrobku připraveného k opětovnému použití, přeměněného nebo repasovaného vyžaduje nařízení o bateriích (čl. 77 odst. 7) nový pas propojený s původním. Tím se vytvoří nový záznam produktu a koncept pasu předvyplněný z publikovaného, s odkazem na něj. Původní pas zůstává aktivní a oba pasy zobrazují odkaz. Nový pas zveřejněte pomocí POST /passports/{id}/publish.

ParametrTypPopis
stagestringpovinnéprepared_for_reuse, repurposed nebo remanufactured.
Požadavek
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" }'
Odpověď
{
  "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 vyžaduje passports:read

Vrátí klíče polí, které šablona sektoru pasu vyžaduje (povinné i volitelné), aktuálně uložené hodnoty a které povinné klíče stále chybí. Použijte to k sestavení těla pro PUT /passports/{id}/fields.

Požadavek
curl https://myproductpassport.eu/api/v1/passports/96/fields \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{
  "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 vyžaduje passports:write

Zapíše libovolnou sadu hodnot polí do konceptu nebo živého pasu: kompletní sadu podle přílohy XIII pro baterii, pole šablony sektoru nebo vlastní klíče. Posílejte jen klíče, které chcete změnit; hodnota null nebo prázdná pole odstraní. Živý pas se aktualizuje na místě, jeho adresa ani QR kód se nemění a jeho strojové překlady se vygenerují znovu. Soulad se přehodnotí. Koncept se tímto voláním nepublikuje; použijte POST /passports/{id}/publish.

ParametrTypPopis
fieldsobjectpovinnéMapa klíčů polí na hodnoty. Klíče jsou malá písmena, číslice a podtržítka; hodnoty až 5 000 znaků. Až 200 klíčů na volání.
Požadavek
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%"
    }
  }'
Odpověď
{
  "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 vyžaduje passports:write

Odešle vlastní data této baterie (příloha XIII bod 4 nařízení (EU) 2023/1542) do zveřejněného pasu, pro systémy BMS a správu vozových parků. Pošlete libovolnou podmnožinu níže uvedených polí; soulad se po aktualizaci znovu zkontroluje. Tyto hodnoty se zobrazují pouze divákům schváleným vlastníkem pasu (čl. 77 odst. 2), nikdy na veřejné stránce. capacity_fade, power_capability a internal_resistance se ukládají jako aktuální hodnoty této baterie (current_*), odděleně od původních hodnot modelu.

ParametrTypPopis
state_of_healthstringnapř. "97% při 412 cyklech".
state_of_certified_energystringZbývající certifikovaná energie (baterie pro elektromobily).
battery_statusstringoriginal, repurposed, re-used, remanufactured nebo waste.
capacity_fadestringDosavadní pokles kapacity. Ukládá se jako current_capacity_fade.
power_capabilitystringAktuální výkonová schopnost. Ukládá se jako current_power_capability.
internal_resistancestringNaměřený vnitřní odpor. Ukládá se jako current_internal_resistance.
use_datastringCykly, nepříznivé události, teplota a stav nabití, až 5 000 znaků.
Požadavek
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"
  }'
Odpověď
{
  "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 vyžaduje passports:write

Každá baterie potřebuje vlastní pas (nařízení (EU) 2023/1542, čl. 77 odst. 1). Zaregistrujte až 10 000 baterií jednoho modelu jedním voláním, každou s vlastním sériovým číslem (až 20 písmen, číslic, teček, pomlček nebo podtržítek) a volitelně manufacturing_date, battery_status a jejími údaji podle přílohy XIII bodu 4. Stávající sériová čísla se aktualizují; hodnoty, které vynecháte, zůstanou zachovány. Má-li produkt GTIN, adresou každé baterie je její GS1 Digital Link, /01/{gtin}/21/{serial}. Údaje bodu 4 se zobrazují pouze divákům schváleným vlastníkem.

ParametrTypPopis
units[].serialstringpovinnéSériové číslo baterie.
units[].manufacturing_datestringMěsíc a rok, např. "2026-09".
units[].battery_statusstringoriginal nebo waste. Změna stavu vyžaduje hodnoty naměřené při ní (příloha XIII bod 4 písm. a)); waste navíc vyžaduje responsible_party_type (producer, pro nebo waste_operator), responsible_party_name a responsible_party_contact (čl. 77 odst. 7). recycled spolu s recycled_at a recycler_name pas ukončuje (čl. 77 odst. 8). Baterie se změněným účelem, opětovně použitá nebo repasovaná dostane nový pas: POST /passports/{id}/units/{serial}/successor.
units[].state_of_healthstringTaké 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 a use_data.
Požadavek
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%"}]}'
Odpověď
{ "created": 1, "updated": 0, "skipped": 0, "errors": [] }
PATCH /passports/{id}/units/{serial} vyžaduje passports:write

Pro systém řízení baterie, který posílá data jedné baterie: libovolné z battery_status, state_of_health, state_of_certified_energy, current_capacity_fade, current_power_capability, current_internal_resistance a use_data. Pro čtení použijte GET na stejnou cestu, pro seznam GET /passports/{id}/units (per_page až 500).

Požadavek
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"}'
Odpověď
{
  "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 vyžaduje passports:read

Příloha XIII bod 4 písm. a) požaduje hodnoty výkonnosti a životnosti při uvedení baterie na trh a při změně jejího stavu. Tyto odečty se uchovávají v původní podobě bez ohledu na to, co se odešle později; chcete-li uchovat i pravidelný odečet, pošlete record_snapshot: true s požadavkem PATCH.

Požadavek
curl https://myproductpassport.eu/api/v1/passports/96/units/KES-00001/snapshots \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{
  "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 vyžaduje passports:write

Čl. 77 odst. 7: baterie, která byla připravena k opětovnému použití, u níž byl změněn účel nebo která byla repasována, má nový pas propojený s původním. Tímto se baterie zaregistruje znovu, s novým sériovým číslem a identifikátorem, v rámci modelu baterie pro druhý život ve vašem pracovním prostoru (pokud zatím žádný není, vytvoří se z tohoto modelu), obě se propojí a uchovají se hodnoty naměřené při změně. Původní baterie si ponechává svůj pas. Model pro druhý život doplňte a zveřejněte pomocí POST /passports/{id}/publish.

ParametrTypPopis
stagestringpovinnéprepared_for_reuse, repurposed nebo remanufactured.
valuesobjectpovinnéHodnoty naměřené při změně: alespoň jedna z remaining_capacity_ah nebo current_capacity_fade, z current_power_capability nebo power_fade, z current_internal_resistance nebo internal_resistance_increase, a dále expected_lifetime_cycles_remaining (příloha IV část A).
serialstringNové sériové číslo. Výchozí: původní sériové číslo s příponou -RU, -RP nebo -RM.
measured_atstringKdy byly hodnoty naměřeny.
member_statestringDvoupísmenný kód členského státu, ve kterém byl zdravotní stav testován (čl. 73 odst. 1 písm. a)).
target_passport_idintegerExistující model pro druhý život vycházející z tohoto modelu baterie, pod kterým ji zaregistrujete.
Požadavek
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"}}'
Odpověď
{
  "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 vyžaduje passports:write

Ukládá do pasu podání do registru EU pro DPP a jeho výsledek: stav, korelační ID, registrační identifikátor vrácený registrem a volitelný odkaz na záložní kopii hostovanou poskytovatelem služeb DPP. Samotná registrace probíhá v registru Komise (webový formulář nebo nahrání souboru); tímto se výsledek uchová u pasu. GET /passports/{id} vrací stejný blok pod registry.

ParametrTypPopis
statusstringnot_submitted, submitted, registered nebo failed.
product_groupstringSkupina výrobků v registru, například batteries.
granularitystringmodel, šarže nebo kus.
upistringJedinečný identifikátor výrobku jako https URL. Výchozí je URL veřejného pasu.
correlation_idstringID korelace přidělené registrem při podání.
uristringRegistrační identifikátor vrácený registrem.
backup_urlstringhttps odkaz na záložní kopii hostovanou poskytovatelem služeb DPP.
submitted_atdateDatum podání.
registered_atdateDatum registrace.
errorstringPopis chyby u neúspěšného podání.
Požadavek
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"
  }'
Odpověď
{
  "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 vyžaduje passports:read

QR kód pasu jako soubor: svg (výchozí), png (se značkou, připravený k tisku) nebo pdf (arch štítků).

ParametrTypPopis
formatstringsvg | png | pdf
Požadavek
curl "https://myproductpassport.eu/api/v1/passports/96/qr?format=png" \
  -H "Authorization: Bearer pk_your_key" -o passport-96.png

09 / Koncové bodySoulad

GET /passports/{passportId}/compliance vyžaduje passports:read

Provede živou kontrolu souladu pasu s povinnými poli jeho sektoru a přesně uvede, co chybí.

Požadavek
curl https://myproductpassport.eu/api/v1/passports/96/compliance \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{
  "data": {
    "passport_id": 96,
    "product_name": "Alpine Merino Crew Sweater",
    "status": "compliant",
    "percentage": 100,
    "completed_fields": 12,
    "total_fields": 12,
    "missing_fields": []
  }
}

10 / Koncové bodySektory

GET /sectors

Sektory, do nichž lze produkt zařadit: systémové sektory platformy plus všechny definované ve vašem pracovním prostoru. Při vytváření produktů použijte id a při zápisu polí pasu klíče polí.

Požadavek
curl https://myproductpassport.eu/api/v1/sectors \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{
  "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 / Koncové bodyDokumenty

GET /products/{productId}/documents vyžaduje products:read

Prohlášení o shodě, protokoly o zkouškách a certifikáty připojené k produktu. Veřejný dokument je propojen ze všech zveřejněných pasů produktu.

Požadavek
curl https://myproductpassport.eu/api/v1/products/512/documents \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{
  "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 vyžaduje products:write

Nahrávání multipart. PDF, Word, Excel, CSV, text, PNG a JPEG do 10 MB, nejvýše 20 na produkt. Text se extrahuje na pozadí.

ParametrTypPopis
filefilepovinnéDokument.
is_publicbooleanZobrazit ve veřejném pasu (výchozí false).
Požadavek
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} vyžaduje products:write

Přepíná, zda je dokument odkazován z veřejného pasu.

ParametrTypPopis
is_publicbooleanpovinné
Požadavek
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} vyžaduje products:write

Odstraní soubor a jeho propojení s pasem.

Požadavek
curl -X DELETE https://myproductpassport.eu/api/v1/products/512/documents/31 \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{ "message": "Document deleted." }

12 / Koncové bodyDodavatelský řetězec

GET /products/{productId}/supply-chain vyžaduje products:read

Kroky zobrazené v pasu produktu, v pořadí.

Požadavek
curl https://myproductpassport.eu/api/v1/products/512/supply-chain \
  -H "Authorization: Bearer pk_your_key"
PUT /products/{productId}/supply-chain vyžaduje products:write

Nahradí všechny kroky seznamem, který pošlete, v zaslaném pořadí. Pošlete prázdný seznam pro vymazání. Typy kroků: raw_material, processing, manufacturing, assembly, packaging, distribution.

ParametrTypPopis
stepsarraypovinnéAž 50 kroků.
steps[].step_typestringpovinné
steps[].supplier_namestringpovinné
steps[].supplier_locationstring
steps[].supplier_countrystringISO 3166-1 alpha-2.
steps[].lat / lngnumber
steps[].descriptionstring
steps[].certificationsarray
steps[].datedate
Požadavek
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 / Koncové bodyPřeklady

GET /passports/{id}/translations vyžaduje passports:read

Každá přeložená hodnota pole podle jazyka s uvedením zdroje: auto (strojový, vytvořený při zveřejnění) nebo manual.

Požadavek
curl https://myproductpassport.eu/api/v1/passports/96/translations \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{
  "data": {
    "passport_id": 96,
    "available_locales": ["bg", "cs", "da", "de", "..."],
    "translations": {
      "de": {"care_instructions": {"value": "Kalt waschen", "source": "manual"}}
    }
  }
}
PUT /passports/{id}/translations/{locale} vyžaduje passports:write

Nastaví překlady pro jeden jazyk podle klíče pole. Ruční překlad se nikdy strojově nepřepíše. Pro odstranění pošlete prázdný řetězec.

ParametrTypPopis
fieldsobjectpovinnéfield_key: přeložená hodnota
Požadavek
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"}}'
Odpověď
{ "message": "1 translation(s) written, 0 removed.", "locale": "de", "written": 1, "removed": 0 }

14 / Koncové bodyIntegrita a exporty

GET /passports/{id}/integrity vyžaduje passports:read

Každý zveřejněný stav pasu jako záznam propojený řetězcem hashů a podepsaný pomocí Ed25519: otisk (SHA-256), hodnota řetězce a podpis. Veřejné klíče jsou na /.well-known/mpp-integrity-keys.json, takže řetězec může ověřit kdokoli.

Požadavek
curl https://myproductpassport.eu/api/v1/passports/96/integrity \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{ "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} vyžaduje passports:read

Úplný záznam v podobě, v jaké byl podepsán, včetně snímku: co pas v daném okamžiku uváděl, až po hash každého přiloženého souboru.

Požadavek
curl https://myproductpassport.eu/api/v1/passports/96/integrity/1 \
  -H "Authorization: Bearer pk_your_key"
GET /passports/{id}/epcis vyžaduje passports:read

Pas jako dokument GS1 EPCIS 2.0 ve formátu JSON-LD: uvedení položky do oběhu, každý krok dodavatelského řetězce jako pozorování, jednotlivé baterie a pas pro druhý život jako transformace. Pokud má produkt GTIN, identifikátory jsou URI GS1 Digital Link.

Požadavek
curl https://myproductpassport.eu/api/v1/passports/96/epcis \
  -H "Authorization: Bearer pk_your_key"

15 / Koncové bodyŽádosti dodavatelům

POST /passports/{id}/supplier-requests vyžaduje passports:write

Pošle dodavateli e-mailem soukromý odkaz k vyplnění vybraných polí v jeho jazyce. Do pasu se nic nepromítne, dokud to neschválí někdo z vašeho pracovního prostoru.

ParametrTypPopis
supplier_namestringpovinné
supplier_emailstringpovinné
field_keysarraypovinnéKlíče polí ze šablony pasu.
localestringJazyk e-mailu a formuláře, např. de.
due_atdateTermín pro odpověď; pokud není uveden, 14 dní.
messagestring
Požadavek
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 vyžaduje passports:read

Všechny žádosti k pasu s jejich stavem.

Požadavek
curl https://myproductpassport.eu/api/v1/passports/96/supplier-requests \
  -H "Authorization: Bearer pk_your_key"
GET /supplier-requests/{id} vyžaduje passports:read

Jedna žádost s odpověďmi dodavatele, poznámkou a názvy přiložených souborů.

Požadavek
curl https://myproductpassport.eu/api/v1/supplier-requests/12 \
  -H "Authorization: Bearer pk_your_key"

16 / Koncové bodyPoprodejní servis

POST /passports/{id}/items vyžaduje items:write

Dejte kusům výrobku (jakéhokoli odvětví kromě baterií, které používají /units) vlastní sériové číslo: každý dostane vlastní adresu a QR kód, skrytý kód pravosti pro svůj štítek a může jej zaregistrovat jeho vlastník. Pošlete až 10 000 kusů nebo rozsah. S kódem GTIN je adresou GS1 Digital Link /01/{gtin}/21/{serial}.

ParametrTypPopis
items[].serialstringpovinnéNejvýše 20 písmen, číslic, teček, spojovníků nebo podtržítek.
items[].batchstringŠarže, nejvýše 20 znaků.
items[].manufactured_onstringDatum výroby, RRRR-MM-DD.
rangeobjectMísto items: prefix, start, count, digits a batch, například SN-00001 až SN-00500.
Požadavek
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"}}'
Odpověď
{ "created": 500, "updated": 0, "skipped": 0, "over_limit": 0, "errors": [] }
GET /passports/{id}/items/{serial} vyžaduje items:read

Kus s adresou, stavem, informací, zda je zaregistrován a do kdy platí jeho záruka, s ověřeními pravosti a historií. Klíč s items:write dostane i skrytý kód k tisku. GET /passports/{id}/items je vypíše (filtry status a batch, per_page do 500).

Požadavek
curl https://myproductpassport.eu/api/v1/passports/96/items/SN-00001 \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{
  "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} vyžaduje items:write

Nastavte status na stolen nebo recalled a stránka kusu varuje každého, kdo jej naskenuje, a zobrazí vaši poznámku status_note; odcizený kus nelze zaregistrovat. retired stránku kusu vypne. Měnit lze i batch a manufactured_on.

ParametrTypPopis
statusstringactive, stolen, recalled nebo retired.
status_notestringZobrazuje se na stránce kusu, nejvýše 500 znaků.
Požadavek
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 vyžaduje aftersales:read

Lidé, kteří zaregistrovali vaše výrobky: jméno, e-mail, země, datum nákupu, prodejce, data záruky a zda souhlasili s novinkami a nabídkami (marketing_consent=1 vypíše jen je). Výchozí jsou aktivní registrace; status=pending, transferred nebo ended pro ostatní; since= pro změny po určitém datu.

Požadavek
curl "https://myproductpassport.eu/api/v1/owner-registrations?marketing_consent=1&since=2026-10-01" \
  -H "Authorization: Bearer pk_your_key"
GET /service-requests vyžaduje aftersales:read

Opravy, reklamace, zpětné odběry, náhradní díly a dotazy z vašich pasů, od nejnovějších, s filtry status a type. GET /service-requests/{reference} přidá konverzaci.

Požadavek
curl "https://myproductpassport.eu/api/v1/service-requests?status=new" \
  -H "Authorization: Bearer pk_your_key"
POST /service-requests/{reference}/replies vyžaduje aftersales:write

Vaše odpověď odejde zákazníkovi e-mailem s odkazem na stránku jeho požadavku, v jeho jazyce. internal: true přidá poznámku viditelnou jen pro váš tým. PATCH /service-requests/{reference} se statusem posune požadavek dál (zákazník je informován, když se vyřizuje, je vyřešen nebo uzavřen).

ParametrTypPopis
bodystringpovinnéOdpověď, nejvýše 5 000 znaků.
internalbooleanPoznámka pro váš tým místo odpovědi.
statusstringnew, in_progress, waiting, resolved nebo closed.
Požadavek
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 / Koncové bodyHromadné úpravy a obrázky

PATCH /products/bulk-fields vyžaduje products:write

Nastaví údaj o produktu nebo pole pasu až u 5 000 produktů. mode je set, fill (pouze u prázdných) nebo clear. V rámci požadavku se aktualizuje až 100 produktů; větší sady se zařadí do fronty (202).

ParametrTypPopis
product_idsarraypovinné
targetstringpovinnéproduct | field
keystringpovinné
valuestring
modestringset | fill | clear
Požadavek
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"}'
Odpověď
{ "data": { "changed": 2, "skipped": 1, "errors": [] } }
POST /products/{id}/images vyžaduje products:write

Nahrání JPG, PNG nebo WebP jako multipart (až 15MB, 8 na produkt). První obrázek je titulním obrázkem veřejného pasu.

ParametrTypPopis
imagefilepovinné
altstringPopis obrázku.
Požadavek
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 vyžaduje products:write

Předejte image_ids v požadovaném pořadí; první se stane titulním obrázkem.

ParametrTypPopis
image_idsarraypovinné
Požadavek
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} vyžaduje products:write

Odebere obrázek i jeho soubor.

Požadavek
curl -X DELETE https://myproductpassport.eu/api/v1/products/12/images/31 \
  -H "Authorization: Bearer pk_your_key"

18 / Koncové bodyWebhooky

GET /webhooks vyžaduje webhooks:manage

Koncové body registrované pro váš pracovní prostor. Tajné klíče zde nejsou; pro zobrazení tajného klíče načtěte jeden koncový bod.

Požadavek
curl https://myproductpassport.eu/api/v1/webhooks \
  -H "Authorization: Bearer pk_your_key"
POST /webhooks vyžaduje webhooks:manage

Zaregistruje veřejnou HTTPS URL pro jednu nebo více událostí. Odpověď obsahuje podpisový klíč. Soukromé nebo interní hostitele odmítáme.

ParametrTypPopis
urlstringpovinné
eventsarraypovinnéKterákoli z níže uvedených událostí.
Požadavek
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"]}'
Odpověď
{
  "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} vyžaduje webhooks:manage

Požadavek
curl https://myproductpassport.eu/api/v1/webhooks/3 \
  -H "Authorization: Bearer pk_your_key"
PUT /webhooks/{id} vyžaduje webhooks:manage

Změňte URL nebo události, případně koncový bod pozastavte a obnovte. Obnovení vynuluje počet selhání; koncový bod se automaticky pozastaví po 10 po sobě jdoucích neúspěšných doručeních.

ParametrTypPopis
urlstring
eventsarray
is_activeboolean
Požadavek
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 vyžaduje webhooks:manage

Zařadí do fronty doručení webhook.test, abyste mohli ověřit přijímač a kód podpisu.

Požadavek
curl -X POST https://myproductpassport.eu/api/v1/webhooks/3/test \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{ "message": "Test delivery queued." }
GET /webhooks/{id}/deliveries vyžaduje webhooks:manage

Nedávná doručení, od nejnovějších, s HTTP stavem, který vrátil váš koncový bod, a prvními 500 znaky těla odpovědi.

ParametrTypPopis
per_pageintegerAž 100.
Požadavek
curl https://myproductpassport.eu/api/v1/webhooks/3/deliveries \
  -H "Authorization: Bearer pk_your_key"
DELETE /webhooks/{id} vyžaduje webhooks:manage

Požadavek
curl -X DELETE https://myproductpassport.eu/api/v1/webhooks/3 \
  -H "Authorization: Bearer pk_your_key"
Odpověď
{ "message": "Webhook endpoint deleted." }

19 / UdálostiWebhooky

Místo dotazování zaregistrujte v aplikaci koncový bod webhooku (stránka Webhooky, dostupná od tarifu Starter) a MyProductPassport bude na vaši URL posílat JSON metodou POST, jakmile se něco stane:

UdálostSpustí se, když
product.createdJe vytvořen výrobek (aplikace, API nebo import CSV)
product.updatedVýrobek je aktualizován
product.deletedVýrobek je odstraněn
passport.createdPas je vygenerován
passport.publishedPas je zveřejněn
passport.archivedPas je archivován
supplier_request.submittedDodavatel zašle požadované informace
owner.registeredVlastník potvrdí registraci
owner.transferredKus přechází na nového registrovaného vlastníka
service_request.createdZákazník pošle servisní požadavek z pasu
service_request.updatedServisní požadavek dostane odpověď nebo nový stav
item.status_changedKus je označen jako odcizený, stažený z trhu nebo vyřazený, nebo je označení zrušeno
item.verification_failedNačtení zabezpečeného tagu selže, hromadí se nesprávné kódy nebo se sériové číslo objevuje na příliš mnoha místech
webhook.testZ aplikace odešlete testovací doručení

Každé doručení je obálka JSON: ID doručení (při opakování se posílá stejné ID, takže můžete odstranit duplicity), událost, číslo pokusu, časové razítko a data události. Události pasů obsahují uuid pasu a veřejnou URL, takže druhý požadavek potřebujete jen zřídka:

Tělo doručení
{
  "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"}
  }
}

Hlavičky obsahují název události, ID doručení, unixové časové razítko a podpis HMAC nezpracovaného těla, takže můžete ověřit, že pochází od nás, a odmítat opakované zprávy:

Hlavičky doručení
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>

Odpovězte libovolným kódem 2xx do 10 sekund. Cokoli jiného se opakuje pětkrát během asi 90 minut (30 s, 1 min, 5 min, 15 min, 1 h); po 10 neúspěších za sebou se koncový bod pozastaví, dokud ho znovu nepovolíte.

Ověření (PHP)
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $endpointSecret);
abort_unless(hash_equals($expected, $request->header('X-MPP-Signature')), 401);