API-referentie
Alles in MyProductPassport is beschikbaar via een met sleutels beveiligde REST-API: producten aanmaken, digitale productpaspoorten genereren en publiceren, live batterijgegevens doorsturen en conformiteit controleren, rechtstreeks vanuit uw ERP, PIM of build-pipeline.
01 / Aan de slagAuthenticatie
Elk verzoek wordt geauthenticeerd met een API-sleutel die als Bearer-token wordt meegegeven. Sleutels worden in de app aangemaakt onder API-sleutels, eenmaal getoond en gehasht opgeslagen; elke sleutel heeft eigen rechten, een optionele lijst met toegestane IP-adressen en een optionele vervaldatum. Sleutels kunnen zonder onderbreking worden vervangen.
Authorization: Bearer pk_your_api_keyRechten worden per sleutel toegekend, zodat een integratie alleen krijgt wat ze nodig heeft:
| Recht | Toegangsrechten |
|---|---|
| products:read | Producten lezen |
| products:write | Producten aanmaken, bijwerken en verwijderen |
| passports:read | Paspoorten lezen |
| passports:write | Paspoorten genereren |
| passports:publish | Paspoorten publiceren en archiveren |
| webhooks:manage | Webhook-endpoints aanmaken, testen en verwijderen |
| 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 / Aan de slagLimieten voor verzoeken
Limieten gelden per sleutel, per minuut, en hangen af van het abonnement:
| Abonnement | Verzoeken / minuut |
|---|---|
| Gratis | 30 |
| Micro | 60 |
| E-Label | 60 |
| Starter | 120 |
| Professional | 300 |
| Business | 600 |
| Battery | 600 |
Elk antwoord bevat de headers X-RateLimit-Limit en X-RateLimit-Remaining. Bij overschrijding van de limiet volgt 429:
{ "error": "Rate limit exceeded.", "limit": 300, "retry_after": 60 }03 / Aan de slagFouten
Fouten worden als JSON met een gangbare statuscode teruggegeven. De meest voorkomende:
| Status | Betekenis | Voorbeeldinhoud |
|---|---|---|
| 401 | Ontbrekende, ongeldige, ingetrokken of verlopen sleutel | {"error": "Invalid or revoked API key."} |
| 403 | De sleutel mist een recht, het IP-adres staat niet op de toegestane lijst, of de limiet van het abonnement is bereikt | {"message": "API key does not have 'products:write' permission."} |
| 404 | De resource bestaat niet in uw werkruimte | {"message": "Not found."} |
| 422 | Validatie mislukt | {"message": "…", "errors": {"gtin": ["…"]}} |
| 429 | Limiet voor verzoeken overschreden | {"error": "Rate limit exceeded."} |
04 / Aan de slagPaginering
Lijst-endpoints geven 25 items per pagina terug met standaard links- en meta-objecten. Geef ?page=2 mee om door de collectie te bladeren.
05 / Aan de slagAI-assistentconnector (MCP)
Koppel Claude, Cursor of elke assistent die het Model Context Protocol spreekt, en vraag in gewone woorden om producten aan te maken, paspoorten in te vullen met wat u vertelt en te controleren wat nog ontbreekt. Hij gebruikt een API-sleutel met de rechten en het verzoeklimiet van die sleutel. Hij kan concepten maken en velden invullen; hij publiceert, archiveert of verwijdert nooit iets: dat blijft bij u in de app.
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"]
}
}
}De tools die hij biedt:
| Tool | Wat het doet |
|---|---|
| list_products | De producten van de werkruimte, nieuwste eerst, 25 per pagina, met sector en nieuwste paspoort. |
| get_product | Eén product met gegevens, sector, regelgevingssecties en nieuwste paspoort. |
| list_sectors | De sectorsjablonen die een product kan gebruiken (textiel, elektronica, batterijen, wijn en meer), met hun id's. De sector van een product bepaalt welke paspoortvelden verplicht zijn. |
| create_product | Voegt een product toe aan de werkruimte. Gebruik een sector_id uit list_sectors. compliance_sections voegt regelgevingssecties toe aan het paspoort: gpsr, epr, france, chemicals, eudr. |
| list_passports | De paspoorten van de werkruimte, nieuwste eerst, 25 per pagina, met status (draft, published, archived), volledigheidspercentage en openbaar adres. |
| get_passport | Eén paspoort: status, versie, volledigheidspercentage, openbaar adres en links naar de QR-code. |
| create_passport | Maakt een conceptpaspoort voor een product. Het wordt niet gepubliceerd: dat doet een persoon in de app. |
| get_passport_fields | Wat een paspoort vraagt: verplichte en optionele veldsleutels, wat elk betekent (label, omschrijving, voorbeeld), de huidige waarden en welke verplichte velden ontbreken. |
| update_passport_fields | Schrijft veldwaarden naar een concept- of gepubliceerd paspoort (een gepubliceerd paspoort wordt ter plekke bijgewerkt: zelfde adres, zelfde QR-code). Sleutels uit get_passport_fields; een lege tekst verwijdert een waarde. Schrijf alleen feiten die de gebruiker of diens documenten noemen. |
| get_compliance | De volledigheid van een paspoort: percentage, status en de verplichte velden die nog ontbreken. |
06 / EndpointsAccount
/me
Geeft het geauthenticeerde account terug, het abonnement en hoeveel van de productlimiet is gebruikt. Handig als verbindingstest.
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 / EndpointsProducten
/products
vereist products:read Geeft de producten in uw werkruimte weer, nieuwste eerst, 25 per pagina. Elk product bevat de sector en een overzicht van het nieuwste paspoort.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| page | integer | Paginanummer. |
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
vereist products:write Maakt één product aan. Mislukt met 403 als de producttoewijzing van het abonnement op is.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| name | string | verplicht | Productnaam, tot 255 tekens. |
| sku | string | Uw interne SKU, tot 100 tekens. | |
| gtin | string | GTIN-8, 12, 13 of 14 (alleen cijfers). | |
| brand | string | Merk dat in het openbare paspoort wordt getoond. | |
| description | string | Maximaal 2.000 tekens. | |
| category | string | Categorie in vrije tekst. Standaard ‘general’. | |
| sector_id | integer | Een sector-ID, die de veldsjabloon van het paspoort bepaalt. | |
| country_of_origin | string | Landcode, bijv. ‘PT’. | |
| weight | number | Nettogewicht. | |
| weight_unit | string | Een van kg, g, lb, oz. Standaard kg. | |
| materials | array | Objecten van {name, percentage 0-100}. | |
| has_packaging | boolean | Voegt de velden van de verpakkingssjabloon (sleutels die beginnen met pkg_) toe aan het paspoort, onder dezelfde QR-code. |
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
vereist products:write Maakt tot 100 producten aan in één aanroep. De hele batch wordt met 403 geweigerd als hij uw resterende producttoewijzing zou overschrijden. Voor catalogi met duizenden artikelen roept u dit endpoint herhaaldelijk aan of gebruikt u de CSV-import in de app.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| products | array | verplicht | 1 tot 100 productobjecten met dezelfde velden als ‘Product aanmaken’ (zonder materialen). |
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}
vereist products:read Geeft één product terug met de sector en een overzicht van het nieuwste paspoort. 404 als de id niet in uw werkruimte staat.
curl https://myproductpassport.eu/api/v1/products/512 \
-H "Authorization: Bearer pk_your_key"/products/{id}
vereist products:write Werkt een product gedeeltelijk bij. Stuur alleen de velden die u wilt wijzigen; de veldlijst is gelijk aan Een product aanmaken.
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}
vereist products:write Verwijdert een product zacht (soft delete). Gepubliceerde paspoorten van het product blijven werken, zodat gedrukte QR-codes nooit nergens heen leiden.
curl -X DELETE https://myproductpassport.eu/api/v1/products/512 \
-H "Authorization: Bearer pk_your_key"{ "message": "Product deleted." }08 / EndpointsPaspoorten
/passports
vereist passports:read Geeft paspoorten weer, nieuwste eerst, 25 per pagina, met productoverzicht en alle paspoortvelden.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| page | integer | Paginanummer. |
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
vereist passports:write Maakt een conceptpaspoort voor een product aan en vult de velden vooraf in met de productgegevens en de sectorsjabloon. Geeft het concept met de nalevingsscore terug. Heeft het product al een live paspoort, dan volgt 409 met dat paspoort: corrigeer het met PUT /passports/{id}/fields, waarbij adres en QR-code behouden blijven.
curl -X POST https://myproductpassport.eu/api/v1/products/512/passports \
-H "Authorization: Bearer pk_your_key"/passports/{id}
vereist passports:read Geeft één paspoort terug met product, velden, openbare URL en GS1 Digital Link.
curl https://myproductpassport.eu/api/v1/passports/96 \
-H "Authorization: Bearer pk_your_key"/passports/{id}/publish
vereist passports:publish Publiceert een conceptpaspoort en zet de openbare pagina en QR-code live. Alleen concepten kunnen worden gepubliceerd; al het andere geeft 404.
curl -X POST https://myproductpassport.eu/api/v1/passports/96/publish \
-H "Authorization: Bearer pk_your_key"/passports/{id}/archive
vereist passports:publish Archiveert een paspoort en haalt de openbare pagina uit de roulatie.
curl -X POST https://myproductpassport.eu/api/v1/passports/96/archive \
-H "Authorization: Bearer pk_your_key"/passports/bulk-publish
vereist passports:publish Publiceert tot 50 conceptpaspoorten in één aanroep en rapporteert het resultaat per paspoort, zodat één fout nooit de hele batch afbreekt.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| passport_ids | array | verplicht | 1 tot 50 paspoort-ID's. |
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
vereist passports:write Voor een product dat is voorbereid voor hergebruik, herbestemd of opnieuw vervaardigd, vereist de Batterijverordening (artikel 77, lid 7) een nieuw paspoort dat aan het origineel is gekoppeld. Dit maakt een nieuw productrecord en een conceptpaspoort aan, vooraf ingevuld vanuit het gepubliceerde en ermee gekoppeld. Het origineel blijft live en beide paspoorten tonen de koppeling. Publiceer het nieuwe met POST /passports/{id}/publish.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| stage | string | verplicht | prepared_for_reuse, repurposed of 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
vereist passports:read Geeft de veldsleutels terug die het sectorsjabloon van het paspoort vraagt (verplicht en optioneel), de huidige waarden en welke verplichte sleutels nog ontbreken. Gebruik dit om de payload voor PUT /passports/{id}/fields op te bouwen.
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
vereist passports:write Schrijft elke set veldwaarden naar een concept- of live paspoort: de volledige set van bijlage XIII voor een batterij, de velden van een sectorsjabloon of uw eigen sleutels. Stuur alleen de sleutels die u wilt wijzigen; een null- of lege waarde verwijdert dat veld. Een live paspoort wordt ter plekke bijgewerkt, het adres en de QR-code veranderen niet en de machinevertalingen worden opnieuw gemaakt. De compliance wordt opnieuw gescoord. Een concept wordt met deze aanroep niet gepubliceerd; gebruik POST /passports/{id}/publish.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| fields | object | verplicht | Koppeling van veldsleutel naar waarde. Sleutels bestaan uit kleine letters, cijfers en underscores; waarden tot 5.000 tekens. Tot 200 sleutels per aanroep. |
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
vereist passports:write Stuurt de gegevens van deze specifieke batterij (bijlage XIII, punt 4, van Verordening (EU) 2023/1542) naar een gepubliceerd paspoort, voor BMS- en vlootsystemen. Stuur een willekeurige subset van de onderstaande velden; de compliance wordt na de update opnieuw gecontroleerd. Deze waarden worden alleen getoond aan bezoekers die de paspoorthouder heeft goedgekeurd (artikel 77, lid 2), nooit op de openbare pagina. capacity_fade, power_capability en internal_resistance worden opgeslagen als actuele meetwaarden van deze batterij (current_*), los van de oorspronkelijke waarden van het model.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| state_of_health | string | bijv. ‘97% na 412 cycli’. | |
| state_of_certified_energy | string | Resterende gecertificeerde energie (batterijen voor elektrische voertuigen). | |
| battery_status | string | original, repurposed, re-used, remanufactured of waste. | |
| capacity_fade | string | Capaciteitsverlies tot nu toe. Opgeslagen als current_capacity_fade. | |
| power_capability | string | Huidig vermogen. Opgeslagen als current_power_capability. | |
| internal_resistance | string | Gemeten interne weerstand. Opgeslagen als current_internal_resistance. | |
| use_data | string | Cycli, negatieve gebeurtenissen, temperatuur en laadtoestand, tot 5.000 tekens. |
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
vereist passports:write Elke batterij heeft een eigen paspoort nodig (Verordening (EU) 2023/1542, artikel 77, lid 1). Registreer tot 10.000 batterijen van een batterijmodel in één aanroep, elk met een eigen serienummer (tot 20 letters, cijfers, punten, koppeltekens of underscores) en optioneel manufacturing_date, battery_status en de gegevens uit bijlage XIII, punt 4. Bestaande serienummers worden bijgewerkt; weggelaten waarden blijven behouden. Heeft het product een GTIN, dan is het adres van elke batterij de GS1 Digital Link, /01/{gtin}/21/{serial}. Gegevens uit punt 4 zijn alleen zichtbaar voor personen die de eigenaar goedkeurt.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| units[].serial | string | verplicht | Het serienummer van de batterij. |
| units[].manufacturing_date | string | Maand en jaar, bijv. "2026-09". | |
| units[].battery_status | string | original of waste. Volgens bijlage XIII, punt 4, onder a), vereist een statuswijziging de daarbij gemeten waarden; waste vereist daarnaast responsible_party_type (producer, pro of waste_operator), responsible_party_name en responsible_party_contact (artikel 77, lid 7). recycled, met recycled_at en recycler_name, beëindigt het paspoort (artikel 77, lid 8). Een herbestemde, hergebruikte of gereviseerde batterij krijgt een nieuw paspoort: POST /passports/{id}/units/{serial}/successor. | |
| units[].state_of_health | string | Ook 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 en 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}
vereist passports:write Voor een batterijbeheersysteem dat de gegevens van één batterij doorstuurt: een of meer van battery_status, state_of_health, state_of_certified_energy, current_capacity_fade, current_power_capability, current_internal_resistance en use_data. Met GET op hetzelfde pad leest u ze, met GET /passports/{id}/units krijgt u de lijst (per_page tot 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
vereist passports:read Bijlage XIII, punt 4, onder a), vraagt om de prestatie- en duurzaamheidswaarden bij het in de handel brengen en bij een statuswijziging. Die metingen worden bewaard zoals ze waren, wat er later ook wordt verstuurd; stuur record_snapshot: true mee met een PATCH om ook een periodieke meting te bewaren.
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
vereist passports:write Artikel 77, lid 7: een batterij die is voorbereid voor hergebruik, herbestemd of gereviseerd, heeft een nieuw paspoort dat aan het origineel is gekoppeld. Hiermee wordt de batterij opnieuw geregistreerd, met een nieuw serienummer en een nieuwe identificatiecode, onder een batterijmodel voor een tweede leven in uw werkruimte (gemaakt op basis van dit model als er nog geen is), worden de twee gekoppeld en worden de waarden bewaard die bij de wijziging zijn gemeten. De oorspronkelijke batterij behoudt haar paspoort. Vul het tweede-levenmodel aan en publiceer het met POST /passports/{id}/publish.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| stage | string | verplicht | prepared_for_reuse, repurposed of remanufactured. |
| values | object | verplicht | De waarden gemeten bij de wijziging: ten minste één van remaining_capacity_ah of current_capacity_fade, van current_power_capability of power_fade, van current_internal_resistance of internal_resistance_increase, en expected_lifetime_cycles_remaining (bijlage IV, deel A). |
| serial | string | Het nieuwe serienummer. Standaard: het oorspronkelijke serienummer plus -RU, -RP of -RM. | |
| measured_at | string | Wanneer de waarden zijn gemeten. | |
| member_state | string | Tweeletterige code van de lidstaat waar de gezondheidstoestand is getest, zie artikel 73, lid 1, onder a). | |
| target_passport_id | integer | Een bestaand tweede-levenmodel van dit batterijmodel waaronder de batterij wordt geregistreerd. |
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
vereist passports:write Slaat de indiening bij het EU-DPP-register en de uitkomst op bij een paspoort: status, correlatie-ID, de registratie-ID die het register teruggeeft en een optionele link naar een reservekopie bij een DPP-dienstverlener. De registratie zelf gebeurt in het register van de Commissie (webformulier of bestandsupload); dit bewaart de uitkomst bij het paspoort. GET /passports/{id} geeft hetzelfde blok terug onder registry.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| status | string | not_submitted, submitted, registered of failed. | |
| product_group | string | Productgroep in het register, bijvoorbeeld batteries. | |
| granularity | string | model, partij of artikel. | |
| upi | string | Unieke productidentificatiecode als https-URL. Standaard de URL van het openbare paspoort. | |
| correlation_id | string | Correlatie-ID die het register bij indiening toekent. | |
| uri | string | Registratie-ID die door het register is teruggegeven. | |
| backup_url | string | https-link naar de reservekopie die door een DPP-dienstverlener wordt gehost. | |
| submitted_at | date | Indieningsdatum. | |
| registered_at | date | Registratiedatum. | |
| error | string | Foutomschrijving voor een mislukte indiening. |
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
vereist passports:read De QR-code van het paspoort als bestand: svg (standaard), png (in uw huisstijl, drukklaar) of pdf (etiketvel).
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| 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 / EndpointsNaleving
/passports/{passportId}/compliance
vereist passports:read Voert een live compliancecontrole uit van een paspoort tegen de verplichte velden van de sector en meldt precies wat ontbreekt.
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 / EndpointsSectoren
/sectors
De sectoren waaronder een product kan vallen: de systeemsectoren van het platform plus de sectoren die uw werkruimte heeft gedefinieerd. Gebruik de id bij het aanmaken van producten en de veldsleutels bij het schrijven van paspoortvelden.
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 / EndpointsDocumenten
/products/{productId}/documents
vereist products:read Conformiteitsverklaringen, testrapporten en certificaten die bij het product horen. Een openbaar document wordt gelinkt vanuit elk gepubliceerd paspoort van het product.
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
vereist products:write Multipart-upload. PDF, Word, Excel, CSV, tekst, PNG en JPEG tot 10 MB, maximaal 20 per product. Tekst wordt op de achtergrond geëxtraheerd.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| file | file | verplicht | Het document. |
| is_public | boolean | Tonen op het openbare paspoort (standaard 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}
vereist products:write Bepaalt of het document vanuit het openbare paspoort wordt gelinkt.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| is_public | boolean | verplicht |
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}
vereist products:write Verwijdert het bestand en de koppeling met het paspoort.
curl -X DELETE https://myproductpassport.eu/api/v1/products/512/documents/31 \
-H "Authorization: Bearer pk_your_key"{ "message": "Document deleted." }12 / EndpointsToeleveringsketen
/products/{productId}/supply-chain
vereist products:read De stappen die op het productpaspoort worden getoond, in volgorde.
curl https://myproductpassport.eu/api/v1/products/512/supply-chain \
-H "Authorization: Bearer pk_your_key"/products/{productId}/supply-chain
vereist products:write Vervangt alle stappen door de lijst die u stuurt, in de verzonden volgorde. Stuur een lege lijst om hem te wissen. Staptypen: raw_material, processing, manufacturing, assembly, packaging, distribution.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| steps | array | verplicht | Maximaal 50 stappen. |
| steps[].step_type | string | verplicht | |
| steps[].supplier_name | string | verplicht | |
| 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 / EndpointsVertalingen
/passports/{id}/translations
vereist passports:read Elke vertaalde veldwaarde per taal, met de bron: auto (machinaal, aangemaakt bij publicatie) of handmatig.
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}
vereist passports:write Stelt vertalingen in voor één taal, per veldsleutel. Een handmatige vertaling wordt nooit machinaal overschreven. Stuur een lege tekenreeks om er een te verwijderen.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| fields | object | verplicht | field_key: vertaalde waarde |
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 / EndpointsIntegriteit en exports
/passports/{id}/integrity
vereist passports:read Elke gepubliceerde staat van het paspoort als een met hashes geketend, met Ed25519 ondertekend record: vingerafdruk (SHA-256), ketenwaarde en handtekening. De openbare sleutels staan op /.well-known/mpp-integrity-keys.json, zodat iedereen de keten kan verifiëren.
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}
vereist passports:read Het volledige record zoals het is ondertekend, inclusief snapshot: wat het paspoort op dat moment vermeldde, tot en met een hash van elk bijgevoegd bestand.
curl https://myproductpassport.eu/api/v1/passports/96/integrity/1 \
-H "Authorization: Bearer pk_your_key"/passports/{id}/epcis
vereist passports:read Het paspoort als GS1 EPCIS 2.0 JSON-LD-document: het in gebruik genomen artikel, elke stap in de toeleveringsketen als observatie, afzonderlijke batterijen en een second-life-paspoort als transformatie. Identificatoren zijn GS1 Digital Link-URI's wanneer het product een GTIN heeft.
curl https://myproductpassport.eu/api/v1/passports/96/epcis \
-H "Authorization: Bearer pk_your_key"15 / EndpointsLeveranciersverzoeken
/passports/{id}/supplier-requests
vereist passports:write Stuurt een leverancier per e-mail een privélink om de door u gekozen velden in te vullen, in de eigen taal. Er komt niets in het paspoort totdat iemand in uw werkruimte het goedkeurt.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| supplier_name | string | verplicht | |
| supplier_email | string | verplicht | |
| field_keys | array | verplicht | Veldsleutels uit het sjabloon van het paspoort. |
| locale | string | Taal van de e-mail en het formulier, bijv. de. | |
| due_at | date | Uiterste antwoorddatum; 14 dagen indien weggelaten. | |
| 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
vereist passports:read Elk verzoek voor het paspoort, met de status.
curl https://myproductpassport.eu/api/v1/passports/96/supplier-requests \
-H "Authorization: Bearer pk_your_key"/supplier-requests/{id}
vereist passports:read Eén verzoek met de antwoorden van de leverancier, de notitie en de namen van bijgevoegde bestanden.
curl https://myproductpassport.eu/api/v1/supplier-requests/12 \
-H "Authorization: Bearer pk_your_key"16 / EndpointsAftersales
/passports/{id}/items
vereist items:write Geef artikelen van een product (elke sector behalve batterijen, die /units gebruiken) een eigen serienummer: elk krijgt een eigen adres en QR-code, een verborgen echtheidscode voor het etiket, en kan door de eigenaar worden geregistreerd. Stuur maximaal 10.000 artikelen of een reeks. Met een GTIN is het adres de GS1 Digital Link /01/{gtin}/21/{serial}.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| items[].serial | string | verplicht | Maximaal 20 letters, cijfers, punten, koppeltekens of liggende streepjes. |
| items[].batch | string | Batch of partij, maximaal 20 tekens. | |
| items[].manufactured_on | string | Productiedatum, JJJJ-MM-DD. | |
| range | object | In plaats van items: prefix, start, count, digits en batch, bijvoorbeeld SN-00001 tot 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}
vereist items:read Een artikel met adres, status, of het geregistreerd is en tot wanneer de garantie loopt, de echtheidscontroles en de geschiedenis. Een sleutel met items:write krijgt ook de verborgen code, om af te drukken. GET /passports/{id}/items toont ze in een lijst (filters status en batch, per_page tot 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}
vereist items:write Zet status op stolen of recalled en de pagina waarschuwt iedereen die het scant, met uw status_note; een gestolen artikel kan niet worden geregistreerd. retired haalt de pagina offline. Ook batch en manufactured_on kunnen worden gewijzigd.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| status | string | active, stolen, recalled of retired. | |
| status_note | string | Getoond op de pagina van het artikel, maximaal 500 tekens. |
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
vereist aftersales:read Mensen die uw producten hebben geregistreerd: naam, e-mail, land, aankoopdatum, verkoper, garantiedatums en of ze hebben ingestemd met nieuws en aanbiedingen (marketing_consent=1 toont alleen die). Standaard actieve registraties; status=pending, transferred of ended voor andere; since= voor wijzigingen na een datum.
curl "https://myproductpassport.eu/api/v1/owner-registrations?marketing_consent=1&since=2026-10-01" \
-H "Authorization: Bearer pk_your_key"/service-requests
vereist aftersales:read Reparaties, garantieclaims, terugnames, onderdelen en vragen via uw paspoorten, nieuwste eerst, met filters status en type. GET /service-requests/{reference} voegt het gesprek toe.
curl "https://myproductpassport.eu/api/v1/service-requests?status=new" \
-H "Authorization: Bearer pk_your_key"/service-requests/{reference}/replies
vereist aftersales:write Uw antwoord wordt per e-mail naar de klant gestuurd met een link naar de aanvraagpagina, in diens taal. internal: true voegt een notitie toe die alleen uw team ziet. PATCH /service-requests/{reference} met een status brengt de aanvraag verder (de klant krijgt bericht wanneer de aanvraag in behandeling, opgelost of gesloten is).
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| body | string | verplicht | Het antwoord, maximaal 5.000 tekens. |
| internal | boolean | Een notitie voor uw team in plaats van een antwoord. | |
| status | string | new, in_progress, waiting, resolved of 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 / EndpointsBulkbewerkingen en afbeeldingen
/products/bulk-fields
vereist products:write Stelt een productgegeven of een paspoortveld in op maximaal 5.000 producten. mode is set, fill (alleen waar leeg) of clear. Maximaal 100 producten worden binnen het verzoek bijgewerkt; grotere sets worden in de wachtrij geplaatst (202).
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| product_ids | array | verplicht | |
| target | string | verplicht | product | field |
| key | string | verplicht | |
| 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
vereist products:write Multipart-upload van een JPG, PNG of WebP (max. 15MB, 8 per product). De eerste afbeelding is de omslagafbeelding op het openbare paspoort.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| image | file | verplicht | |
| alt | string | Beschrijving van de afbeelding. |
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
vereist products:write Geef image_ids door in de gewenste volgorde; de eerste wordt de omslagafbeelding.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| image_ids | array | verplicht |
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}
vereist products:write Verwijdert de afbeelding en het bijbehorende bestand.
curl -X DELETE https://myproductpassport.eu/api/v1/products/12/images/31 \
-H "Authorization: Bearer pk_your_key"18 / EndpointsWebhooks
/webhooks
vereist webhooks:manage De endpoints die voor uw werkruimte zijn geregistreerd. Geheimen staan hier niet in; haal één endpoint op om het geheim te zien.
curl https://myproductpassport.eu/api/v1/webhooks \
-H "Authorization: Bearer pk_your_key"/webhooks
vereist webhooks:manage Registreert een openbare HTTPS-URL voor een of meer gebeurtenissen. Het antwoord bevat het ondertekeningsgeheim. Private of interne hosts worden geweigerd.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| url | string | verplicht | |
| events | array | verplicht | Een van de hieronder vermelde gebeurtenissen. |
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}
vereist webhooks:manage curl https://myproductpassport.eu/api/v1/webhooks/3 \
-H "Authorization: Bearer pk_your_key"/webhooks/{id}
vereist webhooks:manage Wijzig de URL of gebeurtenissen, of pauzeer en hervat het endpoint. Hervatten zet de foutenteller op nul; een endpoint wordt automatisch gepauzeerd na 10 opeenvolgende mislukte leveringen.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| 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
vereist webhooks:manage Zet een webhook.test-aflevering in de wachtrij, zodat u uw ontvanger en handtekeningcode kunt controleren.
curl -X POST https://myproductpassport.eu/api/v1/webhooks/3/test \
-H "Authorization: Bearer pk_your_key"{ "message": "Test delivery queued." }/webhooks/{id}/deliveries
vereist webhooks:manage Recente afleveringen, nieuwste eerst, met de HTTP-status die uw endpoint teruggaf en de eerste 500 tekens van de body.
| Parameter | Soort | Beschrijving | |
|---|---|---|---|
| per_page | integer | Maximaal 100. |
curl https://myproductpassport.eu/api/v1/webhooks/3/deliveries \
-H "Authorization: Bearer pk_your_key"/webhooks/{id}
vereist webhooks:manage curl -X DELETE https://myproductpassport.eu/api/v1/webhooks/3 \
-H "Authorization: Bearer pk_your_key"{ "message": "Webhook endpoint deleted." }19 / GebeurtenissenWebhooks
Registreer in plaats van polling een webhook-endpoint in de app (pagina Webhooks, beschikbaar vanaf het Starter-abonnement) en MyProductPassport stuurt JSON via POST naar uw URL zodra er iets gebeurt:
| Gebeurtenis | Wordt geactiveerd wanneer |
|---|---|
| product.created | Een product wordt aangemaakt (app, API of CSV-import) |
| product.updated | Een product wordt bijgewerkt |
| product.deleted | Een product wordt verwijderd |
| passport.created | Een paspoort wordt aangemaakt |
| passport.published | Een paspoort gaat live |
| passport.archived | Een paspoort wordt gearchiveerd |
| supplier_request.submitted | Een leverancier stuurt de gevraagde gegevens |
| owner.registered | Een eigenaar bevestigt de registratie |
| owner.transferred | Een artikel gaat over naar een nieuwe geregistreerde eigenaar |
| service_request.created | Een klant stuurt via een paspoort een serviceaanvraag |
| service_request.updated | Een serviceaanvraag krijgt een antwoord of een nieuwe status |
| item.status_changed | Een artikel wordt gemarkeerd als gestolen, teruggeroepen of buiten gebruik, of weer vrijgegeven |
| item.verification_failed | Een beveiligde scan mislukt, verkeerde codes stapelen zich op, of één serienummer duikt op te veel plaatsen op |
| webhook.test | U verstuurt een testaflevering vanuit de app |
Elke levering is een JSON-envelop: een leverings-ID (bij nieuwe pogingen wordt dezelfde ID opnieuw verzonden, zodat u dubbele leveringen kunt herkennen), de gebeurtenis, het pogingsnummer, een tijdstempel en de gebeurtenisgegevens. Paspoortgebeurtenissen bevatten de uuid en openbare URL van het paspoort, zodat u zelden een tweede verzoek nodig hebt:
{
"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"}
}
}De headers bevatten de naam van de gebeurtenis, de aflevering-id, een Unix-tijdstempel en een HMAC-handtekening van de ruwe body, zodat u kunt controleren dat het van ons komt en herhalingen kunt weigeren:
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>Antwoord binnen 10 seconden met een willekeurige 2xx-status. Al het andere wordt vijf keer opnieuw geprobeerd over ongeveer 90 minuten (30 s, 1 min, 5 min, 15 min, 1 u); na 10 opeenvolgende mislukkingen wordt het endpoint gepauzeerd totdat u het weer inschakelt.
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $endpointSecret);
abort_unless(hash_equals($expected, $request->header('X-MPP-Signature')), 401);