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.
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.
Authorization: Bearer pk_your_api_keyBehörigheter ges per nyckel, så att en integration bara får det den behöver:
| Behörighet | Behörigheter |
|---|---|
| products:read | Läsa produkter |
| products:write | Skapa, uppdatera och radera produkter |
| passports:read | Läsa pass |
| passports:write | Generera pass |
| passports:publish | Publicera och arkivera pass |
| webhooks:manage | Skapa, testa och ta bort webhook-slutpunkter |
| items:read | Read individual items and their history |
| items:write | Add, update and flag individual items |
| aftersales:read | Read owner registrations and service requests |
| aftersales:write | Update service requests and reply to customers |
02 / Kom igångAnropsgränser
Gränserna gäller per nyckel, per minut, och bestäms av planen:
| Plan | Förfrågningar / minut |
|---|---|
| Gratis | 30 |
| Micro | 60 |
| E-etikett | 60 |
| Starter | 120 |
| Professional | 300 |
| Business | 600 |
| Battery | 600 |
Varje svar innehåller headerna X-RateLimit-Limit och X-RateLimit-Remaining. Överskrids gränsen returneras 429:
{ "error": "Rate limit exceeded.", "limit": 300, "retry_after": 60 }03 / Kom igångFel
Fel är JSON med en vanlig statuskod. De vanligaste:
| Status | Betydelse | Exempel på innehåll |
|---|---|---|
| 401 | Saknad, ogiltig, återkallad eller utgången nyckel | {"error": "Invalid or revoked API key."} |
| 403 | Nyckeln 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."} |
| 404 | Resursen finns inte i din arbetsyta | {"message": "Not found."} |
| 422 | Valideringen misslyckades | {"message": "…", "errors": {"gtin": ["…"]}} |
| 429 | Grä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.
https://myproductpassport.eu/api/mcpclaude mcp add --transport http myproductpassport https://myproductpassport.eu/api/mcp \
--header "Authorization: Bearer pk_live_your_key"{
"mcpServers": {
"myproductpassport": {
"url": "https://myproductpassport.eu/api/mcp",
"headers": { "Authorization": "Bearer pk_live_your_key" }
}
}
}{
"mcpServers": {
"myproductpassport": {
"command": "npx",
"args": ["mcp-remote", "https://myproductpassport.eu/api/mcp", "--header", "Authorization: Bearer pk_live_your_key"]
}
}
}Verktygen den erbjuder:
| Verktyg | Vad det gör |
|---|---|
| list_products | Arbetsytans produkter, nyaste först, 25 per sida, med bransch och senaste pass. |
| get_product | En produkt med uppgifter, bransch, regelavsnitt och senaste pass. |
| list_sectors | De 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_product | Lä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_passports | Arbetsytans pass, nyaste först, 25 per sida, med status (draft, published, archived), fullständighet i procent och offentlig adress. |
| get_passport | Ett pass: status, version, fullständighet i procent, offentlig adress och länkar till QR-koden. |
| create_passport | Skapar ett passutkast för en produkt. Det publiceras inte: det gör en person i appen. |
| get_passport_fields | Vad 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_fields | Skriver 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_compliance | Passets fullständighet: procent, status och de obligatoriska fält som fortfarande saknas. |
06 / SlutpunkterKonto
/me
Returnerar det autentiserade kontot, dess prenumerationsnivå och hur mycket av produktkvoten som används. Användbart som anslutningstest.
curl https://myproductpassport.eu/api/v1/me \
-H "Authorization: Bearer pk_your_key"{
"data": {
"id": 42,
"name": "Jane Doe",
"email": "[email protected]",
"company_name": "Acme Ltd",
"subscription_tier": "professional",
"product_count": 128,
"product_limit": 500,
"passport_count": 96,
"organization": {"id": 7, "name": "Acme Ltd"},
"api_key": {"name": "ERP sync", "permissions": ["*"], "rate_limit_per_minute": 1000, "expires_at": null},
"webhooks_available": true
}
}07 / SlutpunkterProdukter
/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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| page | integer | Sidnummer. |
curl "https://myproductpassport.eu/api/v1/products?page=1" \
-H "Authorization: Bearer pk_your_key"{
"data": [
{
"id": 512,
"name": "Alpine Merino Crew Sweater",
"sku": "AM-CREW-01",
"gtin": "05012345678900",
"brand": "Northloom",
"category": "textiles",
"status": "active",
"country_of_origin": "PT",
"weight": 0.4,
"weight_unit": "kg",
"materials": [
{ "name": "Merino wool (RWS)", "percentage": 78 },
{ "name": "Recycled nylon (GRS)", "percentage": 20 },
{ "name": "Elastane", "percentage": 2 }
],
"sector": { "id": 3, "name": "Textiles" },
"latest_passport": {
"id": 96, "version": 1,
"status": "published", "compliance_percentage": 100
},
"created_at": "2026-08-14T09:21:00+00:00",
"updated_at": "2026-09-01T16:02:11+00:00"
}
],
"links": { "next": null },
"meta": { "current_page": 1, "per_page": 25, "total": 1 }
}/products
kräver products:write Skapar en produkt. Returnerar 403 om planens produktkvot är förbrukad.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| name | string | obligatoriskt | Produktnamn, upp till 255 tecken. |
| sku | string | Ditt interna SKU, upp till 100 tecken. | |
| gtin | string | GTIN-8, 12, 13 eller 14 (endast siffror). | |
| brand | string | Varumärke som visas på det offentliga passet. | |
| description | string | Upp till 2 000 tecken. | |
| category | string | Kategori i fritext. Standard är "general". | |
| sector_id | integer | Ett sektors-ID, som väljer passets fältmall. | |
| country_of_origin | string | Landskod, t.ex. "PT". | |
| weight | number | Nettovikt. | |
| weight_unit | string | En av kg, g, lb, oz. Standard är kg. | |
| materials | array | Objekt med {name, percentage 0-100}. | |
| has_packaging | boolean | Lägger till förpackningsmallens fält (nycklar som börjar med pkg_) i passet, under samma QR-kod. |
curl -X POST https://myproductpassport.eu/api/v1/products \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Alpine Merino Crew Sweater",
"sku": "AM-CREW-01",
"gtin": "05012345678900",
"sector_id": 3,
"materials": [
{"name": "Merino wool (RWS)", "percentage": 78},
{"name": "Recycled nylon (GRS)", "percentage": 22}
]
}'{
"data": {
"id": 513,
"name": "Alpine Merino Crew Sweater",
"sku": "AM-CREW-01",
"status": "active",
"sector": { "id": 3, "name": "Textiles" },
"created_at": "2026-09-07T18:40:00+00:00"
}
}/products/bulk
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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| products | array | obligatoriskt | 1–100 produktobjekt med samma fält som Skapa en produkt (utan material). |
curl -X POST https://myproductpassport.eu/api/v1/products/bulk \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"products": [
{"name": "PSL-BT-122000", "sku": "PSL-BT-122000", "sector_id": 5},
{"name": "PSL-BT-123000", "sku": "PSL-BT-123000", "sector_id": 5}
]
}'{
"message": "2 product(s) created.",
"products": [
{ "id": 514, "name": "PSL-BT-122000", "status": "active" },
{ "id": 515, "name": "PSL-BT-123000", "status": "active" }
]
}/products/{id}
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.
curl https://myproductpassport.eu/api/v1/products/512 \
-H "Authorization: Bearer pk_your_key"/products/{id}
kräver products:write Uppdaterar en produkt delvis. Skicka bara de fält du vill ändra; fältlistan motsvarar Skapa en produkt.
curl -X PUT https://myproductpassport.eu/api/v1/products/512 \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"brand": "Northloom"}'/products/{id}
kräver products:write Mjukraderar en produkt. Publicerade pass för produkten fortsätter att fungera, så tryckta QR-koder blir aldrig utan sida.
curl -X DELETE https://myproductpassport.eu/api/v1/products/512 \
-H "Authorization: Bearer pk_your_key"{ "message": "Product deleted." }08 / SlutpunkterPass
/passports
kräver passports:read Visar pass, nyaste först, 25 per sida, med produktsammanfattning och alla passfält.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| page | integer | Sidnummer. |
curl https://myproductpassport.eu/api/v1/passports \
-H "Authorization: Bearer pk_your_key"{
"data": [
{
"id": 96,
"uuid": "36ff3776-d517-4228-8cde-9208136ea84a",
"version": 1,
"status": "published",
"compliance_status": "compliant",
"compliance_percentage": 100,
"public_url": "https://myproductpassport.co.uk/p/36ff3776-…",
"gs1_url": "https://myproductpassport.co.uk/01/05012345678900",
"product": { "id": 512, "name": "Alpine Merino Crew Sweater", "sku": "AM-CREW-01" },
"fields": [
{ "key": "material_composition", "value": "…", "verification_status": "verified" }
],
"published_at": "2026-08-16T10:00:00+00:00"
}
],
"meta": { "current_page": 1, "per_page": 25, "total": 1 }
}/products/{productId}/passports
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.
curl -X POST https://myproductpassport.eu/api/v1/products/512/passports \
-H "Authorization: Bearer pk_your_key"/passports/{id}
kräver passports:read Returnerar ett pass med produkt, fält, offentlig URL och GS1 Digital Link.
curl https://myproductpassport.eu/api/v1/passports/96 \
-H "Authorization: Bearer pk_your_key"/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.
curl -X POST https://myproductpassport.eu/api/v1/passports/96/publish \
-H "Authorization: Bearer pk_your_key"/passports/{id}/archive
kräver passports:publish Arkiverar ett pass och tar dess offentliga sida ur bruk.
curl -X POST https://myproductpassport.eu/api/v1/passports/96/archive \
-H "Authorization: Bearer pk_your_key"/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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| passport_ids | array | obligatoriskt | 1–50 pass-id:n. |
curl -X POST https://myproductpassport.eu/api/v1/passports/bulk-publish \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"passport_ids": [96, 97, 98]}'{
"published": 2,
"failed": 1,
"published_ids": [96, 97],
"errors": [
{ "id": 98, "error": "Compliance below the publishing threshold." }
]
}/passports/{id}/successor
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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| stage | string | obligatoriskt | prepared_for_reuse, repurposed eller remanufactured. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/successor \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "stage": "repurposed" }'{
"data": {
"id": 131, "status": "draft", "version": 1,
"lineage": {
"stage": "repurposed",
"original": { "id": 96, "url": "https://myproductpassport.co.uk/p/..." },
"originals": [{ "passport_id": 96, "product_id": 40, "stage": "repurposed", "status": "published", "url": "https://myproductpassport.co.uk/p/..." }],
"successors": []
}
}
}/passports/{id}/fields
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.
curl https://myproductpassport.eu/api/v1/passports/96/fields \
-H "Authorization: Bearer pk_your_key"{
"passport_id": 96,
"sector": "batteries",
"compliance_percentage": 84,
"required": ["battery_category", "carbon_footprint", "..."],
"optional": ["energy_round_trip_efficiency", "..."],
"missing_required": ["carbon_footprint_class", "recycled_content"],
"values": { "battery_category": "Industrial", "...": "..." }
}/passports/{id}/fields
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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| fields | object | obligatoriskt | Koppling 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. |
curl -X PUT https://myproductpassport.eu/api/v1/passports/96/fields \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"fields": {
"carbon_footprint": "61.2 kg CO2e/kWh",
"carbon_footprint_class": "C",
"recycled_content": "Cobalt 16%, lithium 6%, nickel 6%, lead 0%"
}
}'{
"message": "3 field(s) changed, 0 removed.",
"changed": ["carbon_footprint", "carbon_footprint_class", "recycled_content"],
"removed": [],
"passport": { "id": 96, "status": "published", "compliance_percentage": 92 }
}/passports/{id}/state-of-health
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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| state_of_health | string | t.ex. "97% vid 412 cykler". | |
| state_of_certified_energy | string | Återstående certifierad energi (elbilsbatterier). | |
| battery_status | string | original, repurposed, re-used, remanufactured eller waste. | |
| capacity_fade | string | Kapacitetsförlust hittills. Sparas som current_capacity_fade. | |
| power_capability | string | Aktuell effektförmåga. Sparas som current_power_capability. | |
| internal_resistance | string | Uppmätt inre resistans. Sparas som current_internal_resistance. | |
| use_data | string | Cykler, negativa händelser, temperatur och laddningsnivå, upp till 5 000 tecken. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/state-of-health \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"state_of_health": "97% at 412 cycles",
"capacity_fade": "3% from initial rated capacity"
}'{
"message": "2 field(s) updated.",
"updated_fields": ["state_of_health", "current_capacity_fade"],
"passport": { "id": 96, "status": "published", "compliance_percentage": 100 }
}/passports/{id}/units
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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| units[].serial | string | obligatoriskt | Batteriets serienummer. |
| units[].manufacturing_date | string | Månad och år, t.ex. "2026-09". | |
| units[].battery_status | string | original 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_health | string | Ä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. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/units \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"units": [{"serial": "KES-00001", "manufacturing_date": "2026-09", "state_of_health": "100%"}]}'{ "created": 1, "updated": 0, "skipped": 0, "errors": [] }/passports/{id}/units/{serial}
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).
curl -X PATCH https://myproductpassport.eu/api/v1/passports/96/units/KES-00001 \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"state_of_health": "96% at 412 cycles"}'{
"data": { "serial": "KES-00001", "public_url": "https://myproductpassport.co.uk/01/05012345678900/21/KES-00001", "battery_status": "original", "data": { "state_of_health": "96% at 412 cycles" } }
}/passports/{id}/units/{serial}/snapshots
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.
curl https://myproductpassport.eu/api/v1/passports/96/units/KES-00001/snapshots \
-H "Authorization: Bearer pk_your_key"{
"data": [
{ "event": "placed_on_market", "status": "original", "values": { "state_of_health": "100%" }, "measured_at": "2026-09-26T09:00:00+00:00", "source": "api" },
{ "event": "status_change", "status": "waste", "values": { "remaining_capacity_ah": "71 Ah", "power_fade": "14%", "internal_resistance_increase": "22%", "expected_lifetime_cycles_remaining": "0" }, "measured_at": "2029-03-02T10:00:00+00:00", "source": "bms" }
]
}/passports/{id}/units/{serial}/successor
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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| stage | string | obligatoriskt | prepared_for_reuse, repurposed eller remanufactured. |
| values | object | obligatoriskt | De 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). |
| serial | string | Det nya serienumret. Standard: det ursprungliga serienumret plus -RU, -RP eller -RM. | |
| measured_at | string | När värdena mättes. | |
| member_state | string | Tvåbokstavskod för den medlemsstat där hälsotillståndet testades (artikel 73.1 a). | |
| target_passport_id | integer | En befintlig modell för andra livet av den här batterimodellen att registrera batteriet under. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/units/KES-00001/successor \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"stage": "repurposed", "values": {"remaining_capacity_ah": "82 Ah", "power_fade": "9%", "internal_resistance_increase": "15%", "expected_lifetime_cycles_remaining": "2000"}}'{
"data": {
"serial": "KES-00001-RP", "battery_status": "repurposed", "passport_id": 131,
"lineage": { "originals": [{ "serial": "KES-00001", "passport_id": 96, "stage": "repurposed" }], "successors": [] }
}
}/passports/{id}/registry
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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| status | string | not_submitted, submitted, registered eller failed. | |
| product_group | string | Registrets produktgrupp, till exempel batteries. | |
| granularity | string | modell, batch eller artikel. | |
| upi | string | Unik produktidentifierare som https-URL. Standard är URL:en till det offentliga passet. | |
| correlation_id | string | Korrelations-ID som registret tilldelar vid inlämning. | |
| uri | string | Registreringsidentifierare som returnerats av registret. | |
| backup_url | string | https-länk till säkerhetskopian som hostas av en DPP-tjänsteleverantör. | |
| submitted_at | date | Inlämningsdatum. | |
| registered_at | date | Registreringsdatum. | |
| error | string | Felbeskrivning för en misslyckad inlämning. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/registry \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"status": "registered",
"correlation_id": "7f3a2c1e-0b4d-4f8e-9a6b-2d1c3e4f5a6b",
"uri": "urn:eu:dpp:reg:00000001",
"registered_at": "2027-02-18"
}'{
"message": "Registry details updated.",
"passport": {
"id": 96,
"registry": {
"status": "registered",
"upi": "https://myproductpassport.co.uk/p/552fbb4e-5d9a-41da-9050-cc9005d8b66b",
"correlation_id": "7f3a2c1e-0b4d-4f8e-9a6b-2d1c3e4f5a6b",
"uri": "urn:eu:dpp:reg:00000001",
"registered_at": "2027-02-18T00:00:00+00:00"
}
}
}/passports/{id}/qr
kräver passports:read Passets QR-kod som fil: svg (standard), png (varumärkt, tryckfärdig) eller pdf (etikettark).
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| format | string | svg | png | pdf |
curl "https://myproductpassport.eu/api/v1/passports/96/qr?format=png" \
-H "Authorization: Bearer pk_your_key" -o passport-96.png09 / SlutpunkterEfterlevnad
/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.
curl https://myproductpassport.eu/api/v1/passports/96/compliance \
-H "Authorization: Bearer pk_your_key"{
"data": {
"passport_id": 96,
"product_name": "Alpine Merino Crew Sweater",
"status": "compliant",
"percentage": 100,
"completed_fields": 12,
"total_fields": 12,
"missing_fields": []
}
}10 / SlutpunkterSektorer
/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.
curl https://myproductpassport.eu/api/v1/sectors \
-H "Authorization: Bearer pk_your_key"{
"data": [
{
"id": 4,
"slug": "batteries",
"name": "Batteries",
"system": true,
"regulations_finalised": true,
"deadline": "2027-02-18",
"deadline_label": "18 Feb 2027",
"required_fields": ["battery_category", "battery_weight", "..."],
"optional_fields": ["energy_round_trip_efficiency", "..."]
}
]
}11 / SlutpunkterDokument
/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.
curl https://myproductpassport.eu/api/v1/products/512/documents \
-H "Authorization: Bearer pk_your_key"{
"data": [
{
"id": 31,
"product_id": 512,
"filename": "declaration-of-conformity.pdf",
"mime_type": "application/pdf",
"file_size": 184322,
"is_public": true,
"processing_status": "completed",
"public_url": "https://myproductpassport.co.uk/p/3f0c.../document/31",
"created_at": "2026-09-22T10:12:00+00:00"
}
]
}/products/{productId}/documents
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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| file | file | obligatoriskt | Dokumentet. |
| is_public | boolean | Visa det i det offentliga passet (standard false). |
curl -X POST https://myproductpassport.eu/api/v1/products/512/documents \
-H "Authorization: Bearer pk_your_key" \
-F "[email protected]" \
-F "is_public=1"/products/{productId}/documents/{id}
kräver products:write Styr om dokumentet länkas från det offentliga passet.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| is_public | boolean | obligatoriskt |
curl -X PATCH https://myproductpassport.eu/api/v1/products/512/documents/31 \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"is_public": false}'/products/{productId}/documents/{id}
kräver products:write Tar bort filen och dess länk till passet.
curl -X DELETE https://myproductpassport.eu/api/v1/products/512/documents/31 \
-H "Authorization: Bearer pk_your_key"{ "message": "Document deleted." }12 / SlutpunkterLeveranskedja
/products/{productId}/supply-chain
kräver products:read Stegen som visas i produktens pass, i ordning.
curl https://myproductpassport.eu/api/v1/products/512/supply-chain \
-H "Authorization: Bearer pk_your_key"/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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| steps | array | obligatoriskt | Upp till 50 steg. |
| steps[].step_type | string | obligatoriskt | |
| steps[].supplier_name | string | obligatoriskt | |
| steps[].supplier_location | string | ||
| steps[].supplier_country | string | ISO 3166-1 alpha-2. | |
| steps[].lat / lng | number | ||
| steps[].description | string | ||
| steps[].certifications | array | ||
| steps[].date | date |
curl -X PUT https://myproductpassport.eu/api/v1/products/512/supply-chain \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"steps": [{"step_type": "raw_material", "supplier_name": "Merino Growers Co-op", "supplier_country": "NZ", "certifications": ["RWS"]}, {"step_type": "manufacturing", "supplier_name": "Northloom Mill", "supplier_location": "Biella", "supplier_country": "IT"}]}'13 / SlutpunkterÖversättningar
/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.
curl https://myproductpassport.eu/api/v1/passports/96/translations \
-H "Authorization: Bearer pk_your_key"{
"data": {
"passport_id": 96,
"available_locales": ["bg", "cs", "da", "de", "..."],
"translations": {
"de": {"care_instructions": {"value": "Kalt waschen", "source": "manual"}}
}
}
}/passports/{id}/translations/{locale}
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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| fields | object | obligatoriskt | field_key: översatt värde |
curl -X PUT https://myproductpassport.eu/api/v1/passports/96/translations/de \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"fields": {"care_instructions": "Kalt waschen, nicht bleichen"}}'{ "message": "1 translation(s) written, 0 removed.", "locale": "de", "written": 1, "removed": 0 }14 / SlutpunkterIntegritet och export
/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.
curl https://myproductpassport.eu/api/v1/passports/96/integrity \
-H "Authorization: Bearer pk_your_key"{ "data": { "state": "intact", "hash_algorithm": "SHA-256", "signature_algorithm": "Ed25519", "records": [ { "sequence": 1, "event": "published", "content_hash": "8f3a...", "chain_hash": "c21e...", "signature": "MEUC...", "key_id": "3fa9c21e0b7d4a11" } ], "problems": [] } }/passports/{id}/integrity/{sequence}
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.
curl https://myproductpassport.eu/api/v1/passports/96/integrity/1 \
-H "Authorization: Bearer pk_your_key"/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.
curl https://myproductpassport.eu/api/v1/passports/96/epcis \
-H "Authorization: Bearer pk_your_key"15 / SlutpunkterLeverantörsförfrågningar
/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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| supplier_name | string | obligatoriskt | |
| supplier_email | string | obligatoriskt | |
| field_keys | array | obligatoriskt | Fältnycklar från passets mall. |
| locale | string | Språk för e-postmeddelandet och formuläret, t.ex. de. | |
| due_at | date | Svarsdatum; 14 dagar om det utelämnas. | |
| message | string |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/supplier-requests \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"supplier_name": "Mei Chen", "supplier_email": "[email protected]", "field_keys": ["recycled_content_cobalt", "carbon_footprint"], "locale": "de"}'/passports/{id}/supplier-requests
kräver passports:read Alla förfrågningar för passet med deras status.
curl https://myproductpassport.eu/api/v1/passports/96/supplier-requests \
-H "Authorization: Bearer pk_your_key"/supplier-requests/{id}
kräver passports:read En förfrågan med leverantörens svar, anteckning och namnen på bifogade filer.
curl https://myproductpassport.eu/api/v1/supplier-requests/12 \
-H "Authorization: Bearer pk_your_key"16 / SlutpunkterEftermarknad
/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}.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| items[].serial | string | obligatoriskt | Högst 20 bokstäver, siffror, punkter, bindestreck eller understreck. |
| items[].batch | string | Batch eller parti, högst 20 tecken. | |
| items[].manufactured_on | string | Tillverkningsdatum, ÅÅÅÅ-MM-DD. | |
| range | object | I stället för items: prefix, start, count, digits och batch, till exempel SN-00001 till SN-00500. |
curl -X POST https://myproductpassport.eu/api/v1/passports/96/items \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"range": {"prefix": "SN-", "start": 1, "count": 500, "digits": 5, "batch": "B2026-10"}}'{ "created": 500, "updated": 0, "skipped": 0, "over_limit": 0, "errors": [] }/passports/{id}/items/{serial}
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).
curl https://myproductpassport.eu/api/v1/passports/96/items/SN-00001 \
-H "Authorization: Bearer pk_your_key"{
"data": { "serial": "SN-00001", "status": "active", "url": "https://myproductpassport.co.uk/01/05012345678900/21/SN-00001", "registered": true, "warranty_ends_on": "2028-10-02", "events": [ { "type": "registered", "country": "IE", "at": "2026-10-03T09:12:00+00:00" } ] }
}/passports/{id}/items/{serial}
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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| status | string | active, stolen, recalled eller retired. | |
| status_note | string | Visas på artikelns sida, högst 500 tecken. |
curl -X PATCH https://myproductpassport.eu/api/v1/passports/96/items/SN-00001 \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"status": "stolen", "status_note": "Reported stolen on 2 October 2026."}'/owner-registrations
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.
curl "https://myproductpassport.eu/api/v1/owner-registrations?marketing_consent=1&since=2026-10-01" \
-H "Authorization: Bearer pk_your_key"/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.
curl "https://myproductpassport.eu/api/v1/service-requests?status=new" \
-H "Authorization: Bearer pk_your_key"/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).
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| body | string | obligatoriskt | Svaret, högst 5 000 tecken. |
| internal | boolean | En anteckning för ditt team i stället för ett svar. | |
| status | string | new, in_progress, waiting, resolved eller closed. |
curl -X POST https://myproductpassport.eu/api/v1/service-requests/SR-7K3F9Q/replies \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"body": "A new lid is on its way today.", "status": "waiting"}'17 / SlutpunkterMassredigering och bilder
/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).
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| product_ids | array | obligatoriskt | |
| target | string | obligatoriskt | product | field |
| key | string | obligatoriskt | |
| value | string | ||
| mode | string | set | fill | clear |
curl -X PATCH https://myproductpassport.eu/api/v1/products/bulk-fields \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"product_ids": [12, 13, 14], "target": "field", "key": "warranty_period", "value": "10 years", "mode": "fill"}'{ "data": { "changed": 2, "skipped": 1, "errors": [] } }/products/{id}/images
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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| image | file | obligatoriskt | |
| alt | string | Beskrivning av bilden. |
curl -X POST https://myproductpassport.eu/api/v1/products/12/images \
-H "Authorization: Bearer pk_your_key" \
-F [email protected] -F alt="Front of the battery"/products/{id}/images/order
kräver products:write Skicka image_ids i den ordning du vill ha; den första blir omslagsbild.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| image_ids | array | obligatoriskt |
curl -X PUT https://myproductpassport.eu/api/v1/products/12/images/order \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"image_ids": [31, 30]}'/products/{id}/images/{imageId}
kräver products:write Tar bort bilden och dess fil.
curl -X DELETE https://myproductpassport.eu/api/v1/products/12/images/31 \
-H "Authorization: Bearer pk_your_key"18 / SlutpunkterWebhooks
/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.
curl https://myproductpassport.eu/api/v1/webhooks \
-H "Authorization: Bearer pk_your_key"/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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| url | string | obligatoriskt | |
| events | array | obligatoriskt | Någon av händelserna nedan. |
curl -X POST https://myproductpassport.eu/api/v1/webhooks \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"url": "https://erp.acme.example/mpp", "events": ["passport.published", "product.updated"]}'{
"data": {
"id": 3,
"url": "https://erp.acme.example/mpp",
"events": ["passport.published", "product.updated"],
"is_active": true,
"failure_count": 0,
"secret": "9f1c...64 hex characters...",
"created_at": "2026-09-22T10:12:00+00:00"
}
}/webhooks/{id}
kräver webhooks:manage curl https://myproductpassport.eu/api/v1/webhooks/3 \
-H "Authorization: Bearer pk_your_key"/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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| url | string | ||
| events | array | ||
| is_active | boolean |
curl -X PUT https://myproductpassport.eu/api/v1/webhooks/3 \
-H "Authorization: Bearer pk_your_key" \
-H "Content-Type: application/json" \
-d '{"is_active": true}'/webhooks/{id}/test
kräver webhooks:manage Köar en webhook.test-leverans så att du kan kontrollera din mottagare och signaturkod.
curl -X POST https://myproductpassport.eu/api/v1/webhooks/3/test \
-H "Authorization: Bearer pk_your_key"{ "message": "Test delivery queued." }/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.
| Parameter | Typ | Beskrivning | |
|---|---|---|---|
| per_page | integer | Upp till 100. |
curl https://myproductpassport.eu/api/v1/webhooks/3/deliveries \
-H "Authorization: Bearer pk_your_key"/webhooks/{id}
kräver webhooks:manage curl -X DELETE https://myproductpassport.eu/api/v1/webhooks/3 \
-H "Authorization: Bearer pk_your_key"{ "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ändelse | Utlöses när |
|---|---|
| product.created | En produkt skapas (app, API eller CSV-import) |
| product.updated | En produkt uppdateras |
| product.deleted | En produkt raderas |
| passport.created | Ett pass skapas |
| passport.published | Ett pass blir aktivt |
| passport.archived | Ett pass arkiveras |
| supplier_request.submitted | En leverantör skickar den information du har begärt |
| owner.registered | En ägare bekräftar sin registrering |
| owner.transferred | En artikel går över till en ny registrerad ägare |
| service_request.created | En kund skickar ett serviceärende från ett pass |
| service_request.updated | Ett serviceärende får ett svar eller en ny status |
| item.status_changed | En artikel flaggas som stulen, återkallad eller avvecklad, eller återställs |
| item.verification_failed | En avläsning av en säker tagg misslyckas, felaktiga koder hopar sig, eller ett serienummer ses på för många platser |
| webhook.test | Du 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:
{
"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:
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.
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $endpointSecret);
abort_unless(hash_equals($expected, $request->header('X-MPP-Signature')), 401);