Första EU-tidsfristen för DPP (Batterier): 129 dagar Uppfyll kraven nu
Språk
EN DE FR IT ES NL PL BG CS DA EL ET FI HR HU LT LV MT PT RO SK SL SV
Produkt
Funktioner Eftermarknad Så fungerar det Demo Enterprise Priser
Sektorer
Alla sektorer Textilier Elektronik Batterier
Resurser
Blogg Jämför DPP-programvara Krav per land Bedömning av beredskap Kontroll av miljöpåståenden Gratis nedladdningar Ordlista
Företag
Partner Kontakt
Logga in Kom igång gratis
Utvecklare / REST API

API-referens

Allt i MyProductPassport är tillgängligt via ett nyckelautentiserat REST API: skapa produkter, generera och publicera digitala produktpass, skicka aktuella batteridata och kontrollera efterlevnad direkt från ditt ERP, PIM eller byggflöde.

v1 https://myproductpassport.eu/api/v1 Kom igång gratis OpenAPI-specifikation ↓

01 / Kom igångAutentisering

Varje förfrågan autentiseras med en API-nyckel som skickas som Bearer-token. Nycklar skapas i appen under API-nycklar, visas en gång och lagras hashade; varje nyckel har sin egen uppsättning behörigheter, en valfri lista med tillåtna IP-adresser och ett valfritt utgångsdatum. Nycklar kan roteras utan driftstopp.

Förfrågans header
Authorization: Bearer pk_your_api_key
På alla planer. API-nycklar kan skapas och användas på alla planer, även den kostnadsfria. Planen avgör hur många anrop en nyckel får göra per minut (nedan) och hur många produkter och pass arbetsytan får ha.
Testläge. En testnyckel (pk_test_...) kör varje anrop precis som en live-nyckel skulle göra, med samma validering, id:n och svar, och ångrar det sedan: inget sparas, inga e-postmeddelanden eller webhooks skickas och inga filer behålls. Svaren innehåller "test_mode": true och en X-MPP-Mode: test-header. Bygg och testa en integration mot dina riktiga data och byt sedan till en live-nyckel.

Behörigheter ges per nyckel, så att en integration bara får det den behöver:

BehörighetBehörigheter
products:readLäsa produkter
products:writeSkapa, uppdatera och radera produkter
passports:readLäsa pass
passports:writeGenerera pass
passports:publishPublicera och arkivera pass
webhooks:manageSkapa, testa och ta bort webhook-slutpunkter
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 / Kom igångAnropsgränser

Gränserna gäller per nyckel, per minut, och bestäms av planen:

PlanFörfrågningar / minut
Gratis30
Micro60
E-etikett60
Starter120
Professional300
Business600
Battery600

Varje svar innehåller headerna X-RateLimit-Limit och X-RateLimit-Remaining. Överskrids gränsen returneras 429:

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

03 / Kom igångFel

Fel är JSON med en vanlig statuskod. De vanligaste:

StatusBetydelseExempel på innehåll
401Saknad, ogiltig, återkallad eller utgången nyckel{"error": "Invalid or revoked API key."}
403Nyckeln saknar en behörighet, IP-adressen finns inte på listan över tillåtna eller så har planens gräns nåtts{"message": "API key does not have 'products:write' permission."}
404Resursen finns inte i din arbetsyta{"message": "Not found."}
422Valideringen misslyckades{"message": "…", "errors": {"gtin": ["…"]}}
429Gränsen för anrop har överskridits{"error": "Rate limit exceeded."}

04 / Kom igångSidindelning

Listslutpunkter returnerar 25 objekt per sida med standardobjekten links och meta. Ange ?page=2 för att bläddra i samlingen.

05 / Kom igångKoppling för AI-assistenter (MCP)

Koppla Claude, Cursor eller vilken assistent som helst som talar Model Context Protocol och be den med vanliga ord att skapa produkter, fylla i pass med det du berättar och kontrollera vad som fortfarande saknas. Den använder en API-nyckel med nyckelns behörigheter och anropsgräns. Den kan skapa utkast och fylla i fält; den publicerar, arkiverar eller raderar aldrig något: det stannar hos dig i appen.

Serveradress (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 och andra klienter som startar en lokal server
{
  "mcpServers": {
    "myproductpassport": {
      "command": "npx",
      "args": ["mcp-remote", "https://myproductpassport.eu/api/mcp", "--header", "Authorization: Bearer pk_live_your_key"]
    }
  }
}

Verktygen den erbjuder:

VerktygVad det gör
list_productsArbetsytans produkter, nyaste först, 25 per sida, med bransch och senaste pass.
get_productEn produkt med uppgifter, bransch, regelavsnitt och senaste pass.
list_sectorsDe branschmallar en produkt kan använda (textil, elektronik, batterier, vin med mera), med sina id. En produkts bransch avgör vilka passfält som är obligatoriska.
create_productLägger till en produkt i arbetsytan. Använd ett sector_id från list_sectors. compliance_sections lägger till regelavsnitt i passet: gpsr, epr, france, chemicals, eudr.
list_passportsArbetsytans pass, nyaste först, 25 per sida, med status (draft, published, archived), fullständighet i procent och offentlig adress.
get_passportEtt pass: status, version, fullständighet i procent, offentlig adress och länkar till QR-koden.
create_passportSkapar ett passutkast för en produkt. Det publiceras inte: det gör en person i appen.
get_passport_fieldsVad ett pass frågar efter: nycklarna för obligatoriska och valfria fält, vad varje fält betyder (etikett, beskrivning, exempel), befintliga värden och vilka obligatoriska fält som saknas.
update_passport_fieldsSkriver fältvärden i ett utkast eller publicerat pass (ett publicerat uppdateras på plats: samma adress, samma QR-kod). Nycklar från get_passport_fields; en tom text tar bort ett värde. Skriv bara fakta som användaren eller dennes dokument anger.
get_compliancePassets fullständighet: procent, status och de obligatoriska fält som fortfarande saknas.
Prova med en testnyckel. Med en testnyckel (pk_test_...) kontrolleras assistentens ändringar och ångras sedan, så att du ser vad den skulle göra innan du ger den en skarp nyckel.

06 / SlutpunkterKonto

GET /me

Returnerar det autentiserade kontot, dess prenumerationsnivå och hur mycket av produktkvoten som används. Användbart som anslutningstest.

Förfrågan
curl https://myproductpassport.eu/api/v1/me \
  -H "Authorization: Bearer pk_your_key"
Svar
{
  "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 / SlutpunkterProdukter

GET /products kräver products:read

Visar produkterna i din arbetsyta, nyaste först, 25 per sida. Varje produkt innehåller sin sektor och en sammanfattning av det senaste passet.

ParameterTypBeskrivning
pageintegerSidnummer.
Förfrågan
curl "https://myproductpassport.eu/api/v1/products?page=1" \
  -H "Authorization: Bearer pk_your_key"
Svar
{
  "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 kräver products:write

Skapar en produkt. Returnerar 403 om planens produktkvot är förbrukad.

ParameterTypBeskrivning
namestringobligatorisktProduktnamn, upp till 255 tecken.
skustringDitt interna SKU, upp till 100 tecken.
gtinstringGTIN-8, 12, 13 eller 14 (endast siffror).
brandstringVarumärke som visas på det offentliga passet.
descriptionstringUpp till 2 000 tecken.
categorystringKategori i fritext. Standard är "general".
sector_idintegerEtt sektors-ID, som väljer passets fältmall.
country_of_originstringLandskod, t.ex. "PT".
weightnumberNettovikt.
weight_unitstringEn av kg, g, lb, oz. Standard är kg.
materialsarrayObjekt med {name, percentage 0-100}.
has_packagingbooleanLägger till förpackningsmallens fält (nycklar som börjar med pkg_) i passet, under samma QR-kod.
Förfrågan
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}
    ]
  }'
Svar
{
  "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 kräver products:write

Skapar upp till 100 produkter i ett anrop. Hela batchen nekas med 403 om den skulle överskrida din återstående produktkvot. För kataloger med tusentals produkter anropar du slutpunkten i en loop eller använder CSV-import i appen.

ParameterTypBeskrivning
productsarrayobligatoriskt1–100 produktobjekt med samma fält som Skapa en produkt (utan material).
Förfrågan
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}
    ]
  }'
Svar
{
  "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} kräver products:read

Returnerar en produkt med dess sektor och en sammanfattning av det senaste passet. 404 om id:t inte finns i din arbetsyta.

Förfrågan
curl https://myproductpassport.eu/api/v1/products/512 \
  -H "Authorization: Bearer pk_your_key"
PUT /products/{id} kräver products:write

Uppdaterar en produkt delvis. Skicka bara de fält du vill ändra; fältlistan motsvarar Skapa en produkt.

Förfrågan
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} kräver products:write

Mjukraderar en produkt. Publicerade pass för produkten fortsätter att fungera, så tryckta QR-koder blir aldrig utan sida.

Förfrågan
curl -X DELETE https://myproductpassport.eu/api/v1/products/512 \
  -H "Authorization: Bearer pk_your_key"
Svar
{ "message": "Product deleted." }

08 / SlutpunkterPass

GET /passports kräver passports:read

Visar pass, nyaste först, 25 per sida, med produktsammanfattning och alla passfält.

ParameterTypBeskrivning
pageintegerSidnummer.
Förfrågan
curl https://myproductpassport.eu/api/v1/passports \
  -H "Authorization: Bearer pk_your_key"
Svar
{
  "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 kräver passports:write

Genererar ett passutkast för en produkt och förifyller fält från produktdata och sektorsmallen. Returnerar utkastet med dess efterlevnadspoäng. En produkt som redan har ett live-pass returnerar 409 med det passet: korrigera det med PUT /passports/{id}/fields, som behåller dess adress och QR-kod.

Förfrågan
curl -X POST https://myproductpassport.eu/api/v1/products/512/passports \
  -H "Authorization: Bearer pk_your_key"
GET /passports/{id} kräver passports:read

Returnerar ett pass med produkt, fält, offentlig URL och GS1 Digital Link.

Förfrågan
curl https://myproductpassport.eu/api/v1/passports/96 \
  -H "Authorization: Bearer pk_your_key"
POST /passports/{id}/publish kräver passports:publish

Publicerar ett passutkast och gör dess offentliga sida och QR-kod live. Endast utkast kan publiceras; allt annat returnerar 404.

Förfrågan
curl -X POST https://myproductpassport.eu/api/v1/passports/96/publish \
  -H "Authorization: Bearer pk_your_key"
POST /passports/{id}/archive kräver passports:publish

Arkiverar ett pass och tar dess offentliga sida ur bruk.

Förfrågan
curl -X POST https://myproductpassport.eu/api/v1/passports/96/archive \
  -H "Authorization: Bearer pk_your_key"
POST /passports/bulk-publish kräver passports:publish

Publicerar upp till 50 passutkast i ett anrop och rapporterar resultatet per pass, så att ett fel aldrig avbryter batchen.

ParameterTypBeskrivning
passport_idsarrayobligatoriskt1–50 pass-id:n.
Förfrågan
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]}'
Svar
{
  "published": 2,
  "failed": 1,
  "published_ids": [96, 97],
  "errors": [
    { "id": 98, "error": "Compliance below the publishing threshold." }
  ]
}
POST /passports/{id}/successor kräver passports:write

För en produkt som har förberetts för återanvändning, fått nytt användningsområde eller återtillverkats kräver batteriförordningen (artikel 77.7) ett nytt pass kopplat till originalet. Detta skapar en ny produktpost och ett passutkast som är förifyllt från det publicerade och länkat till det. Originalet förblir live och båda passen visar länken. Publicera det nya med POST /passports/{id}/publish.

ParameterTypBeskrivning
stagestringobligatorisktprepared_for_reuse, repurposed eller remanufactured.
Förfrågan
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" }'
Svar
{
  "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 kräver passports:read

Returnerar de fältnycklar som passets sektorsmall efterfrågar (obligatoriska och valfria), de nuvarande värdena och vilka obligatoriska nycklar som fortfarande saknas. Använd det för att bygga innehållet till PUT /passports/{id}/fields.

Förfrågan
curl https://myproductpassport.eu/api/v1/passports/96/fields \
  -H "Authorization: Bearer pk_your_key"
Svar
{
  "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 kräver passports:write

Skriver valfri uppsättning fältvärden till ett utkast eller ett publicerat pass: hela uppsättningen enligt bilaga XIII för ett batteri, fälten i en sektormall eller dina egna nycklar. Skicka bara de nycklar du vill ändra; ett null- eller tomt värde tar bort fältet. Ett publicerat pass uppdateras på plats, dess adress och QR-kod ändras inte och dess maskinöversättningar genereras på nytt. Efterlevnaden poängsätts på nytt. Ett utkast publiceras inte av detta anrop; använd POST /passports/{id}/publish.

ParameterTypBeskrivning
fieldsobjectobligatorisktKoppling från fältnyckel till värde. Nycklar är gemener, siffror och understreck; värden upp till 5 000 tecken. Upp till 200 nycklar per anrop.
Förfrågan
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%"
    }
  }'
Svar
{
  "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 kräver passports:write

Skickar detta batteris egna data (bilaga XIII punkt 4 i förordning (EU) 2023/1542) till ett publicerat pass, för BMS- och flottsystem. Skicka valfri delmängd av fälten nedan; efterlevnaden kontrolleras igen efter uppdateringen. Dessa värden visas bara för besökare som passägaren har godkänt (artikel 77.2), aldrig på den offentliga sidan. capacity_fade, power_capability och internal_resistance sparas som detta batteris aktuella mätvärden (current_*), separat från modellens ursprungliga värden.

ParameterTypBeskrivning
state_of_healthstringt.ex. "97% vid 412 cykler".
state_of_certified_energystringÅterstående certifierad energi (elbilsbatterier).
battery_statusstringoriginal, repurposed, re-used, remanufactured eller waste.
capacity_fadestringKapacitetsförlust hittills. Sparas som current_capacity_fade.
power_capabilitystringAktuell effektförmåga. Sparas som current_power_capability.
internal_resistancestringUppmätt inre resistans. Sparas som current_internal_resistance.
use_datastringCykler, negativa händelser, temperatur och laddningsnivå, upp till 5 000 tecken.
Förfrågan
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"
  }'
Svar
{
  "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 kräver passports:write

Varje batteri behöver ett eget pass (förordning (EU) 2023/1542, artikel 77.1). Registrera upp till 10 000 batterier av en batterimodell i ett anrop, vart och ett med eget serienummer (upp till 20 bokstäver, siffror, punkter, bindestreck eller understreck) och valfritt manufacturing_date, battery_status och dess data enligt bilaga XIII punkt 4. Befintliga serienummer uppdateras; värden du utelämnar behålls. Med ett GTIN på produkten är varje batteris adress dess GS1 Digital Link, /01/{gtin}/21/{serial}. Data enligt punkt 4 visas bara för besökare som ägaren godkänner.

ParameterTypBeskrivning
units[].serialstringobligatorisktBatteriets serienummer.
units[].manufacturing_datestringMånad och år, t.ex. "2026-09".
units[].battery_statusstringoriginal eller waste. En statusändring kräver de värden som uppmätts vid ändringen (bilaga XIII punkt 4 a); waste kräver även responsible_party_type (producer, pro eller waste_operator), responsible_party_name och responsible_party_contact (artikel 77.7). recycled, med recycled_at och recycler_name, avslutar passet (artikel 77.8). Ett batteri som omvandlats för nytt syfte, återanvänts eller omtillverkats får ett nytt pass: POST /passports/{id}/units/{serial}/successor.
units[].state_of_healthstringÄven 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 och use_data.
Förfrågan
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%"}]}'
Svar
{ "created": 1, "updated": 0, "skipped": 0, "errors": [] }
PATCH /passports/{id}/units/{serial} kräver passports:write

För ett batterihanteringssystem som skickar ett batteris data: valfritt av battery_status, state_of_health, state_of_certified_energy, current_capacity_fade, current_power_capability, current_internal_resistance och use_data. Använd GET på samma sökväg för att läsa det, eller GET /passports/{id}/units för listan (per_page upp till 500).

Förfrågan
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"}'
Svar
{
  "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 kräver passports:read

Bilaga XIII punkt 4 a kräver prestanda- och hållbarhetsvärdena när batteriet släpps ut på marknaden och när dess status ändras. Dessa mätvärden sparas som de var, oavsett vad som skickas senare; skicka record_snapshot: true med en PATCH för att även spara periodiska mätvärden.

Förfrågan
curl https://myproductpassport.eu/api/v1/passports/96/units/KES-00001/snapshots \
  -H "Authorization: Bearer pk_your_key"
Svar
{
  "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 kräver passports:write

Artikel 77.7: ett batteri som har förberetts för återanvändning, fått nytt användningsområde eller återtillverkats får ett nytt pass som länkas till originalet. Detta registrerar batteriet på nytt, med nytt serienummer och ny identifierare, under en batterimodell för andra livet i din arbetsyta (skapad från den här modellen om det inte finns någon ännu), länkar ihop de två och sparar värdena som mättes vid ändringen. Originalbatteriet behåller sitt pass. Slutför och publicera modellen för andra livet med POST /passports/{id}/publish.

ParameterTypBeskrivning
stagestringobligatorisktprepared_for_reuse, repurposed eller remanufactured.
valuesobjectobligatorisktDe värden som uppmätts vid ändringen: minst ett av remaining_capacity_ah eller current_capacity_fade, av current_power_capability eller power_fade, av current_internal_resistance eller internal_resistance_increase, samt expected_lifetime_cycles_remaining (bilaga IV del A).
serialstringDet nya serienumret. Standard: det ursprungliga serienumret plus -RU, -RP eller -RM.
measured_atstringNär värdena mättes.
member_statestringTvåbokstavskod för den medlemsstat där hälsotillståndet testades (artikel 73.1 a).
target_passport_idintegerEn befintlig modell för andra livet av den här batterimodellen att registrera batteriet under.
Förfrågan
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"}}'
Svar
{
  "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 kräver passports:write

Sparar inlämningen till EU:s DPP-register och resultatet på ett pass: status, korrelations-ID, den registreringsidentifierare som registret returnerar och en valfri länk till en säkerhetskopia som en DPP-tjänsteleverantör är värd för. Själva registreringen görs i kommissionens register (webbformulär eller filuppladdning); detta håller resultatet tillsammans med passet. GET /passports/{id} returnerar samma block under registry.

ParameterTypBeskrivning
statusstringnot_submitted, submitted, registered eller failed.
product_groupstringRegistrets produktgrupp, till exempel batteries.
granularitystringmodell, batch eller artikel.
upistringUnik produktidentifierare som https-URL. Standard är URL:en till det offentliga passet.
correlation_idstringKorrelations-ID som registret tilldelar vid inlämning.
uristringRegistreringsidentifierare som returnerats av registret.
backup_urlstringhttps-länk till säkerhetskopian som hostas av en DPP-tjänsteleverantör.
submitted_atdateInlämningsdatum.
registered_atdateRegistreringsdatum.
errorstringFelbeskrivning för en misslyckad inlämning.
Förfrågan
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"
  }'
Svar
{
  "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 kräver passports:read

Passets QR-kod som fil: svg (standard), png (varumärkt, tryckfärdig) eller pdf (etikettark).

ParameterTypBeskrivning
formatstringsvg | png | pdf
Förfrågan
curl "https://myproductpassport.eu/api/v1/passports/96/qr?format=png" \
  -H "Authorization: Bearer pk_your_key" -o passport-96.png

09 / SlutpunkterEfterlevnad

GET /passports/{passportId}/compliance kräver passports:read

Kör en live-kontroll av ett pass mot sektorns obligatoriska fält och rapporterar exakt vad som saknas.

Förfrågan
curl https://myproductpassport.eu/api/v1/passports/96/compliance \
  -H "Authorization: Bearer pk_your_key"
Svar
{
  "data": {
    "passport_id": 96,
    "product_name": "Alpine Merino Crew Sweater",
    "status": "compliant",
    "percentage": 100,
    "completed_fields": 12,
    "total_fields": 12,
    "missing_fields": []
  }
}

10 / SlutpunkterSektorer

GET /sectors

De sektorer en produkt kan registreras under: plattformens systemsektorer plus de som din arbetsyta har definierat. Använd id när du skapar produkter och fältnycklarna när du skriver passfält.

Förfrågan
curl https://myproductpassport.eu/api/v1/sectors \
  -H "Authorization: Bearer pk_your_key"
Svar
{
  "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 / SlutpunkterDokument

GET /products/{productId}/documents kräver products:read

Försäkringar om överensstämmelse, testrapporter och certifikat kopplade till produkten. Ett offentligt dokument länkas från varje publicerat pass för produkten.

Förfrågan
curl https://myproductpassport.eu/api/v1/products/512/documents \
  -H "Authorization: Bearer pk_your_key"
Svar
{
  "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 kräver products:write

Multipart-uppladdning. PDF, Word, Excel, CSV, text, PNG och JPEG upp till 10 MB, högst 20 per produkt. Texten extraheras i bakgrunden.

ParameterTypBeskrivning
filefileobligatorisktDokumentet.
is_publicbooleanVisa det i det offentliga passet (standard false).
Förfrågan
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} kräver products:write

Styr om dokumentet länkas från det offentliga passet.

ParameterTypBeskrivning
is_publicbooleanobligatoriskt
Förfrågan
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} kräver products:write

Tar bort filen och dess länk till passet.

Förfrågan
curl -X DELETE https://myproductpassport.eu/api/v1/products/512/documents/31 \
  -H "Authorization: Bearer pk_your_key"
Svar
{ "message": "Document deleted." }

12 / SlutpunkterLeveranskedja

GET /products/{productId}/supply-chain kräver products:read

Stegen som visas i produktens pass, i ordning.

Förfrågan
curl https://myproductpassport.eu/api/v1/products/512/supply-chain \
  -H "Authorization: Bearer pk_your_key"
PUT /products/{productId}/supply-chain kräver products:write

Ersätter alla steg med listan du skickar, i den ordning den skickas. Skicka en tom lista för att rensa den. Stegtyper: raw_material, processing, manufacturing, assembly, packaging, distribution.

ParameterTypBeskrivning
stepsarrayobligatorisktUpp till 50 steg.
steps[].step_typestringobligatoriskt
steps[].supplier_namestringobligatoriskt
steps[].supplier_locationstring
steps[].supplier_countrystringISO 3166-1 alpha-2.
steps[].lat / lngnumber
steps[].descriptionstring
steps[].certificationsarray
steps[].datedate
Förfrågan
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 / SlutpunkterÖversättningar

GET /passports/{id}/translations kräver passports:read

Varje översatt fältvärde per språk, med sin källa: auto (maskinöversatt vid publicering) eller manual.

Förfrågan
curl https://myproductpassport.eu/api/v1/passports/96/translations \
  -H "Authorization: Bearer pk_your_key"
Svar
{
  "data": {
    "passport_id": 96,
    "available_locales": ["bg", "cs", "da", "de", "..."],
    "translations": {
      "de": {"care_instructions": {"value": "Kalt waschen", "source": "manual"}}
    }
  }
}
PUT /passports/{id}/translations/{locale} kräver passports:write

Anger översättningar för ett språk per fältnyckel. En manuell översättning skrivs aldrig över maskinellt. Skicka en tom sträng för att ta bort en.

ParameterTypBeskrivning
fieldsobjectobligatorisktfield_key: översatt värde
Förfrågan
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"}}'
Svar
{ "message": "1 translation(s) written, 0 removed.", "locale": "de", "written": 1, "removed": 0 }

14 / SlutpunkterIntegritet och export

GET /passports/{id}/integrity kräver passports:read

Varje publicerat tillstånd av passet som en hashkedjad, Ed25519-signerad post: fingeravtryck (SHA-256), kedjevärde och signatur. De publika nycklarna finns på /.well-known/mpp-integrity-keys.json, så vem som helst kan verifiera kedjan.

Förfrågan
curl https://myproductpassport.eu/api/v1/passports/96/integrity \
  -H "Authorization: Bearer pk_your_key"
Svar
{ "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} kräver passports:read

Den fullständiga posten så som den signerades, inklusive ögonblicksbild: vad passet angav vid den tidpunkten, ned till en hash av varje bifogad fil.

Förfrågan
curl https://myproductpassport.eu/api/v1/passports/96/integrity/1 \
  -H "Authorization: Bearer pk_your_key"
GET /passports/{id}/epcis kräver passports:read

Passet som ett GS1 EPCIS 2.0 JSON-LD-dokument: artikeln som tagits i bruk, varje steg i leveranskedjan som en observation, enskilda batterier och ett pass för andra livet som en transformation. Identifierarna är GS1 Digital Link-URI:er när produkten har ett GTIN.

Förfrågan
curl https://myproductpassport.eu/api/v1/passports/96/epcis \
  -H "Authorization: Bearer pk_your_key"

15 / SlutpunkterLeverantörsförfrågningar

POST /passports/{id}/supplier-requests kräver passports:write

Skickar ett e-postmeddelande till en leverantör med en privat länk där de fyller i de fält du väljer, på sitt eget språk. Inget når passet förrän någon i din arbetsyta har godkänt det.

ParameterTypBeskrivning
supplier_namestringobligatoriskt
supplier_emailstringobligatoriskt
field_keysarrayobligatorisktFältnycklar från passets mall.
localestringSpråk för e-postmeddelandet och formuläret, t.ex. de.
due_atdateSvarsdatum; 14 dagar om det utelämnas.
messagestring
Förfrågan
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 kräver passports:read

Alla förfrågningar för passet med deras status.

Förfrågan
curl https://myproductpassport.eu/api/v1/passports/96/supplier-requests \
  -H "Authorization: Bearer pk_your_key"
GET /supplier-requests/{id} kräver passports:read

En förfrågan med leverantörens svar, anteckning och namnen på bifogade filer.

Förfrågan
curl https://myproductpassport.eu/api/v1/supplier-requests/12 \
  -H "Authorization: Bearer pk_your_key"

16 / SlutpunkterEftermarknad

POST /passports/{id}/items kräver items:write

Ge artiklar av en produkt (alla sektorer utom batterier, som använder /units) ett eget serienummer: var och en får en egen adress och QR-kod, en dold äkthetskod för etiketten och kan registreras av sin ägare. Skicka upp till 10 000 artiklar eller ett intervall. Med ett GTIN är adressen GS1 Digital Link /01/{gtin}/21/{serial}.

ParameterTypBeskrivning
items[].serialstringobligatorisktHögst 20 bokstäver, siffror, punkter, bindestreck eller understreck.
items[].batchstringBatch eller parti, högst 20 tecken.
items[].manufactured_onstringTillverkningsdatum, ÅÅÅÅ-MM-DD.
rangeobjectI stället för items: prefix, start, count, digits och batch, till exempel SN-00001 till SN-00500.
Förfrågan
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"}}'
Svar
{ "created": 500, "updated": 0, "skipped": 0, "over_limit": 0, "errors": [] }
GET /passports/{id}/items/{serial} kräver items:read

En artikel med adress, status, om den är registrerad och hur länge garantin gäller, dess äkthetskontroller och historik. En nyckel med items:write får också den dolda koden, för utskrift. GET /passports/{id}/items listar dem (filter status och batch, per_page upp till 500).

Förfrågan
curl https://myproductpassport.eu/api/v1/passports/96/items/SN-00001 \
  -H "Authorization: Bearer pk_your_key"
Svar
{
  "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} kräver items:write

Sätt status till stolen eller recalled så varnar dess sida alla som skannar den, med din status_note; en stulen artikel kan inte registreras. retired tar sidan offline. Även batch och manufactured_on kan ändras.

ParameterTypBeskrivning
statusstringactive, stolen, recalled eller retired.
status_notestringVisas på artikelns sida, högst 500 tecken.
Förfrågan
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 kräver aftersales:read

Personer som har registrerat dina produkter: namn, e-post, land, inköpsdatum, återförsäljare, garantidatum och om de har samtyckt till nyheter och erbjudanden (marketing_consent=1 listar bara dem). Aktiva registreringar som standard; status=pending, transferred eller ended för andra; since= för ändringar efter ett datum.

Förfrågan
curl "https://myproductpassport.eu/api/v1/owner-registrations?marketing_consent=1&since=2026-10-01" \
  -H "Authorization: Bearer pk_your_key"
GET /service-requests kräver aftersales:read

Reparationer, garantianspråk, återtagningar, reservdelar och frågor från dina pass, nyaste först, med filter status och type. GET /service-requests/{reference} lägger till konversationen.

Förfrågan
curl "https://myproductpassport.eu/api/v1/service-requests?status=new" \
  -H "Authorization: Bearer pk_your_key"
POST /service-requests/{reference}/replies kräver aftersales:write

Ditt svar mejlas till kunden med en länk till ärendesidan, på kundens språk. internal: true lägger till en anteckning som bara ditt team ser. PATCH /service-requests/{reference} med en status för ärendet framåt (kunden meddelas när det pågår, är löst eller stängt).

ParameterTypBeskrivning
bodystringobligatorisktSvaret, högst 5 000 tecken.
internalbooleanEn anteckning för ditt team i stället för ett svar.
statusstringnew, in_progress, waiting, resolved eller closed.
Förfrågan
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 / SlutpunkterMassredigering och bilder

PATCH /products/bulk-fields kräver products:write

Anger en produktuppgift eller ett passfält för upp till 5 000 produkter. mode är set, fill (endast där fältet är tomt) eller clear. Upp till 100 produkter uppdateras direkt i förfrågan; större mängder köas (202).

ParameterTypBeskrivning
product_idsarrayobligatoriskt
targetstringobligatorisktproduct | field
keystringobligatoriskt
valuestring
modestringset | fill | clear
Förfrågan
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"}'
Svar
{ "data": { "changed": 2, "skipped": 1, "errors": [] } }
POST /products/{id}/images kräver products:write

Multipart-uppladdning av en JPG, PNG eller WebP (upp till 15MB, 8 per produkt). Den första bilden är omslagsbilden i det offentliga passet.

ParameterTypBeskrivning
imagefileobligatoriskt
altstringBeskrivning av bilden.
Förfrågan
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 kräver products:write

Skicka image_ids i den ordning du vill ha; den första blir omslagsbild.

ParameterTypBeskrivning
image_idsarrayobligatoriskt
Förfrågan
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} kräver products:write

Tar bort bilden och dess fil.

Förfrågan
curl -X DELETE https://myproductpassport.eu/api/v1/products/12/images/31 \
  -H "Authorization: Bearer pk_your_key"

18 / SlutpunkterWebhooks

GET /webhooks kräver webhooks:manage

De endpoints som registrerats för din arbetsyta. Hemligheter ingår inte här; hämta en endpoint för att se dess hemlighet.

Förfrågan
curl https://myproductpassport.eu/api/v1/webhooks \
  -H "Authorization: Bearer pk_your_key"
POST /webhooks kräver webhooks:manage

Registrerar en offentlig HTTPS-URL för en eller flera händelser. Svaret innehåller signeringshemligheten. Privata eller interna värdar nekas.

ParameterTypBeskrivning
urlstringobligatoriskt
eventsarrayobligatorisktNågon av händelserna nedan.
Förfrågan
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"]}'
Svar
{
  "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} kräver webhooks:manage

Förfrågan
curl https://myproductpassport.eu/api/v1/webhooks/3 \
  -H "Authorization: Bearer pk_your_key"
PUT /webhooks/{id} kräver webhooks:manage

Ändra URL eller händelser, eller pausa och återuppta slutpunkten. Att återuppta nollställer antalet fel; en slutpunkt pausas automatiskt efter 10 misslyckade leveranser i följd.

ParameterTypBeskrivning
urlstring
eventsarray
is_activeboolean
Förfrågan
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 kräver webhooks:manage

Köar en webhook.test-leverans så att du kan kontrollera din mottagare och signaturkod.

Förfrågan
curl -X POST https://myproductpassport.eu/api/v1/webhooks/3/test \
  -H "Authorization: Bearer pk_your_key"
Svar
{ "message": "Test delivery queued." }
GET /webhooks/{id}/deliveries kräver webhooks:manage

Senaste leveranserna, nyaste först, med den HTTP-status som din slutpunkt returnerade och de första 500 tecknen i svaret.

ParameterTypBeskrivning
per_pageintegerUpp till 100.
Förfrågan
curl https://myproductpassport.eu/api/v1/webhooks/3/deliveries \
  -H "Authorization: Bearer pk_your_key"
DELETE /webhooks/{id} kräver webhooks:manage

Förfrågan
curl -X DELETE https://myproductpassport.eu/api/v1/webhooks/3 \
  -H "Authorization: Bearer pk_your_key"
Svar
{ "message": "Webhook endpoint deleted." }

19 / HändelserWebhooks

I stället för att polla kan du registrera en webhook-slutpunkt i appen (sidan Webhooks, tillgänglig från Starter-planen och uppåt) så skickar MyProductPassport JSON via POST till din URL när något händer:

HändelseUtlöses när
product.createdEn produkt skapas (app, API eller CSV-import)
product.updatedEn produkt uppdateras
product.deletedEn produkt raderas
passport.createdEtt pass skapas
passport.publishedEtt pass blir aktivt
passport.archivedEtt pass arkiveras
supplier_request.submittedEn leverantör skickar den information du har begärt
owner.registeredEn ägare bekräftar sin registrering
owner.transferredEn artikel går över till en ny registrerad ägare
service_request.createdEn kund skickar ett serviceärende från ett pass
service_request.updatedEtt serviceärende får ett svar eller en ny status
item.status_changedEn artikel flaggas som stulen, återkallad eller avvecklad, eller återställs
item.verification_failedEn avläsning av en säker tagg misslyckas, felaktiga koder hopar sig, eller ett serienummer ses på för många platser
webhook.testDu skickar en testleverans från appen

Varje leverans är ett JSON-kuvert: ett leverans-id (samma id skickas igen vid omförsök, så att du kan ta bort dubbletter), händelsen, försöksnumret, en tidsstämpel och händelsedata. Passhändelser innehåller passets uuid och offentliga URL, så du behöver sällan en andra förfrågan:

Leveransens innehåll
{
  "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"}
  }
}

Headers innehåller händelsenamnet, leverans-id, en Unix-tidsstämpel och en HMAC-signatur av den råa bodyn, så att du kan verifiera att den kom från oss och avvisa upprepningar:

Leveransens headers
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>

Svara med valfri 2xx inom 10 sekunder. Allt annat försöks igen fem gånger under ungefär 90 minuter (30 s, 1 min, 5 min, 15 min, 1 h); efter 10 misslyckanden i följd pausas slutpunkten tills du aktiverar den igen.

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