Eerste EU DPP-deadline (Batterijen): 130 dagen Word nu conform
Taal
EN DE FR IT ES NL PL BG CS DA EL ET FI HR HU LT LV MT PT RO SK SL SV
Product
Functies Aftersales Hoe het werkt Demo Enterprise Prijzen
Sectoren
Alle sectoren Textiel Elektronica Batterijen
Bronnen
Blog DPP-software vergelijken Landvereisten Gereedheidsbeoordeling Groene-claimscheck Gratis downloads Woordenlijst
Bedrijf
Partners Contact
Inloggen Gratis aan de slag
Ontwikkelaars / REST API

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.

v1 https://myproductpassport.eu/api/v1 Gratis beginnen OpenAPI-specificatie ↓

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.

Verzoekheader
Authorization: Bearer pk_your_api_key
Op elk abonnement. API-sleutels kunnen op elk abonnement worden gemaakt en gebruikt, ook het gratis abonnement. Het abonnement bepaalt hoeveel verzoeken een sleutel per minuut mag doen (hieronder) en hoeveel producten en paspoorten de werkruimte mag bevatten.
Testmodus. Een testsleutel (pk_test_...) voert elke aanroep precies zo uit als een live sleutel, met dezelfde validatie, id's en responses, en draait deze daarna terug: er wordt niets opgeslagen, er worden geen e-mails of webhooks verzonden en er wordt geen bestand bewaard. Responses bevatten "test_mode": true en een X-MPP-Mode: test-header. Bouw en test een integratie met uw echte gegevens en schakel daarna over op een live sleutel.

Rechten worden per sleutel toegekend, zodat een integratie alleen krijgt wat ze nodig heeft:

RechtToegangsrechten
products:readProducten lezen
products:writeProducten aanmaken, bijwerken en verwijderen
passports:readPaspoorten lezen
passports:writePaspoorten genereren
passports:publishPaspoorten publiceren en archiveren
webhooks:manageWebhook-endpoints aanmaken, testen en verwijderen
items:readRead individual items and their history
items:writeAdd, update and flag individual items
aftersales:readRead owner registrations and service requests
aftersales:writeUpdate service requests and reply to customers

02 / Aan de slagLimieten voor verzoeken

Limieten gelden per sleutel, per minuut, en hangen af van het abonnement:

AbonnementVerzoeken / minuut
Gratis30
Micro60
E-Label60
Starter120
Professional300
Business600
Battery600

Elk antwoord bevat de headers X-RateLimit-Limit en X-RateLimit-Remaining. Bij overschrijding van de limiet volgt 429:

429 Too Many Requests
{ "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:

StatusBetekenisVoorbeeldinhoud
401Ontbrekende, ongeldige, ingetrokken of verlopen sleutel{"error": "Invalid or revoked API key."}
403De 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."}
404De resource bestaat niet in uw werkruimte{"message": "Not found."}
422Validatie mislukt{"message": "…", "errors": {"gtin": ["…"]}}
429Limiet 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.

Serveradres (Streamable HTTP)
https://myproductpassport.eu/api/mcp
Claude Code
claude mcp add --transport http myproductpassport https://myproductpassport.eu/api/mcp \
  --header "Authorization: Bearer pk_live_your_key"
Cursor (mcp.json)
{
  "mcpServers": {
    "myproductpassport": {
      "url": "https://myproductpassport.eu/api/mcp",
      "headers": { "Authorization": "Bearer pk_live_your_key" }
    }
  }
}
Claude Desktop en andere clients die een lokale server starten
{
  "mcpServers": {
    "myproductpassport": {
      "command": "npx",
      "args": ["mcp-remote", "https://myproductpassport.eu/api/mcp", "--header", "Authorization: Bearer pk_live_your_key"]
    }
  }
}

De tools die hij biedt:

ToolWat het doet
list_productsDe producten van de werkruimte, nieuwste eerst, 25 per pagina, met sector en nieuwste paspoort.
get_productEén product met gegevens, sector, regelgevingssecties en nieuwste paspoort.
list_sectorsDe 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_productVoegt 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_passportsDe paspoorten van de werkruimte, nieuwste eerst, 25 per pagina, met status (draft, published, archived), volledigheidspercentage en openbaar adres.
get_passportEén paspoort: status, versie, volledigheidspercentage, openbaar adres en links naar de QR-code.
create_passportMaakt een conceptpaspoort voor een product. Het wordt niet gepubliceerd: dat doet een persoon in de app.
get_passport_fieldsWat een paspoort vraagt: verplichte en optionele veldsleutels, wat elk betekent (label, omschrijving, voorbeeld), de huidige waarden en welke verplichte velden ontbreken.
update_passport_fieldsSchrijft 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_complianceDe volledigheid van een paspoort: percentage, status en de verplichte velden die nog ontbreken.
Probeer het met een testsleutel. Met een testsleutel (pk_test_...) worden de wijzigingen van de assistent gecontroleerd en daarna teruggedraaid, zodat u ziet wat hij zou doen voordat u hem een live sleutel geeft.

06 / EndpointsAccount

GET /me

Geeft het geauthenticeerde account terug, het abonnement en hoeveel van de productlimiet is gebruikt. Handig als verbindingstest.

Verzoek
curl https://myproductpassport.eu/api/v1/me \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{
  "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

GET /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.

ParameterSoortBeschrijving
pageintegerPaginanummer.
Verzoek
curl "https://myproductpassport.eu/api/v1/products?page=1" \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{
  "data": [
    {
      "id": 512,
      "name": "Alpine Merino Crew Sweater",
      "sku": "AM-CREW-01",
      "gtin": "05012345678900",
      "brand": "Northloom",
      "category": "textiles",
      "status": "active",
      "country_of_origin": "PT",
      "weight": 0.4,
      "weight_unit": "kg",
      "materials": [
        { "name": "Merino wool (RWS)", "percentage": 78 },
        { "name": "Recycled nylon (GRS)", "percentage": 20 },
        { "name": "Elastane", "percentage": 2 }
      ],
      "sector": { "id": 3, "name": "Textiles" },
      "latest_passport": {
        "id": 96, "version": 1,
        "status": "published", "compliance_percentage": 100
      },
      "created_at": "2026-08-14T09:21:00+00:00",
      "updated_at": "2026-09-01T16:02:11+00:00"
    }
  ],
  "links": { "next": null },
  "meta": { "current_page": 1, "per_page": 25, "total": 1 }
}
POST /products vereist products:write

Maakt één product aan. Mislukt met 403 als de producttoewijzing van het abonnement op is.

ParameterSoortBeschrijving
namestringverplichtProductnaam, tot 255 tekens.
skustringUw interne SKU, tot 100 tekens.
gtinstringGTIN-8, 12, 13 of 14 (alleen cijfers).
brandstringMerk dat in het openbare paspoort wordt getoond.
descriptionstringMaximaal 2.000 tekens.
categorystringCategorie in vrije tekst. Standaard ‘general’.
sector_idintegerEen sector-ID, die de veldsjabloon van het paspoort bepaalt.
country_of_originstringLandcode, bijv. ‘PT’.
weightnumberNettogewicht.
weight_unitstringEen van kg, g, lb, oz. Standaard kg.
materialsarrayObjecten van {name, percentage 0-100}.
has_packagingbooleanVoegt de velden van de verpakkingssjabloon (sleutels die beginnen met pkg_) toe aan het paspoort, onder dezelfde QR-code.
Verzoek
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}
    ]
  }'
Antwoord
{
  "data": {
    "id": 513,
    "name": "Alpine Merino Crew Sweater",
    "sku": "AM-CREW-01",
    "status": "active",
    "sector": { "id": 3, "name": "Textiles" },
    "created_at": "2026-09-07T18:40:00+00:00"
  }
}
POST /products/bulk 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.

ParameterSoortBeschrijving
productsarrayverplicht1 tot 100 productobjecten met dezelfde velden als ‘Product aanmaken’ (zonder materialen).
Verzoek
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}
    ]
  }'
Antwoord
{
  "message": "2 product(s) created.",
  "products": [
    { "id": 514, "name": "PSL-BT-122000", "status": "active" },
    { "id": 515, "name": "PSL-BT-123000", "status": "active" }
  ]
}
GET /products/{id} 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.

Verzoek
curl https://myproductpassport.eu/api/v1/products/512 \
  -H "Authorization: Bearer pk_your_key"
PUT /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.

Verzoek
curl -X PUT https://myproductpassport.eu/api/v1/products/512 \
  -H "Authorization: Bearer pk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"brand": "Northloom"}'
DELETE /products/{id} vereist products:write

Verwijdert een product zacht (soft delete). Gepubliceerde paspoorten van het product blijven werken, zodat gedrukte QR-codes nooit nergens heen leiden.

Verzoek
curl -X DELETE https://myproductpassport.eu/api/v1/products/512 \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{ "message": "Product deleted." }

08 / EndpointsPaspoorten

GET /passports vereist passports:read

Geeft paspoorten weer, nieuwste eerst, 25 per pagina, met productoverzicht en alle paspoortvelden.

ParameterSoortBeschrijving
pageintegerPaginanummer.
Verzoek
curl https://myproductpassport.eu/api/v1/passports \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{
  "data": [
    {
      "id": 96,
      "uuid": "36ff3776-d517-4228-8cde-9208136ea84a",
      "version": 1,
      "status": "published",
      "compliance_status": "compliant",
      "compliance_percentage": 100,
      "public_url": "https://myproductpassport.co.uk/p/36ff3776-…",
      "gs1_url": "https://myproductpassport.co.uk/01/05012345678900",
      "product": { "id": 512, "name": "Alpine Merino Crew Sweater", "sku": "AM-CREW-01" },
      "fields": [
        { "key": "material_composition", "value": "…", "verification_status": "verified" }
      ],
      "published_at": "2026-08-16T10:00:00+00:00"
    }
  ],
  "meta": { "current_page": 1, "per_page": 25, "total": 1 }
}
POST /products/{productId}/passports 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.

Verzoek
curl -X POST https://myproductpassport.eu/api/v1/products/512/passports \
  -H "Authorization: Bearer pk_your_key"
GET /passports/{id} vereist passports:read

Geeft één paspoort terug met product, velden, openbare URL en GS1 Digital Link.

Verzoek
curl https://myproductpassport.eu/api/v1/passports/96 \
  -H "Authorization: Bearer pk_your_key"
POST /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.

Verzoek
curl -X POST https://myproductpassport.eu/api/v1/passports/96/publish \
  -H "Authorization: Bearer pk_your_key"
POST /passports/{id}/archive vereist passports:publish

Archiveert een paspoort en haalt de openbare pagina uit de roulatie.

Verzoek
curl -X POST https://myproductpassport.eu/api/v1/passports/96/archive \
  -H "Authorization: Bearer pk_your_key"
POST /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.

ParameterSoortBeschrijving
passport_idsarrayverplicht1 tot 50 paspoort-ID's.
Verzoek
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]}'
Antwoord
{
  "published": 2,
  "failed": 1,
  "published_ids": [96, 97],
  "errors": [
    { "id": 98, "error": "Compliance below the publishing threshold." }
  ]
}
POST /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.

ParameterSoortBeschrijving
stagestringverplichtprepared_for_reuse, repurposed of remanufactured.
Verzoek
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" }'
Antwoord
{
  "data": {
    "id": 131, "status": "draft", "version": 1,
    "lineage": {
      "stage": "repurposed",
      "original": { "id": 96, "url": "https://myproductpassport.co.uk/p/..." },
      "originals": [{ "passport_id": 96, "product_id": 40, "stage": "repurposed", "status": "published", "url": "https://myproductpassport.co.uk/p/..." }],
      "successors": []
    }
  }
}
GET /passports/{id}/fields 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.

Verzoek
curl https://myproductpassport.eu/api/v1/passports/96/fields \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{
  "passport_id": 96,
  "sector": "batteries",
  "compliance_percentage": 84,
  "required": ["battery_category", "carbon_footprint", "..."],
  "optional": ["energy_round_trip_efficiency", "..."],
  "missing_required": ["carbon_footprint_class", "recycled_content"],
  "values": { "battery_category": "Industrial", "...": "..." }
}
PUT /passports/{id}/fields 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.

ParameterSoortBeschrijving
fieldsobjectverplichtKoppeling van veldsleutel naar waarde. Sleutels bestaan uit kleine letters, cijfers en underscores; waarden tot 5.000 tekens. Tot 200 sleutels per aanroep.
Verzoek
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%"
    }
  }'
Antwoord
{
  "message": "3 field(s) changed, 0 removed.",
  "changed": ["carbon_footprint", "carbon_footprint_class", "recycled_content"],
  "removed": [],
  "passport": { "id": 96, "status": "published", "compliance_percentage": 92 }
}
POST /passports/{id}/state-of-health 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.

ParameterSoortBeschrijving
state_of_healthstringbijv. ‘97% na 412 cycli’.
state_of_certified_energystringResterende gecertificeerde energie (batterijen voor elektrische voertuigen).
battery_statusstringoriginal, repurposed, re-used, remanufactured of waste.
capacity_fadestringCapaciteitsverlies tot nu toe. Opgeslagen als current_capacity_fade.
power_capabilitystringHuidig vermogen. Opgeslagen als current_power_capability.
internal_resistancestringGemeten interne weerstand. Opgeslagen als current_internal_resistance.
use_datastringCycli, negatieve gebeurtenissen, temperatuur en laadtoestand, tot 5.000 tekens.
Verzoek
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"
  }'
Antwoord
{
  "message": "2 field(s) updated.",
  "updated_fields": ["state_of_health", "current_capacity_fade"],
  "passport": { "id": 96, "status": "published", "compliance_percentage": 100 }
}
POST /passports/{id}/units 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.

ParameterSoortBeschrijving
units[].serialstringverplichtHet serienummer van de batterij.
units[].manufacturing_datestringMaand en jaar, bijv. "2026-09".
units[].battery_statusstringoriginal 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_healthstringOok 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.
Verzoek
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%"}]}'
Antwoord
{ "created": 1, "updated": 0, "skipped": 0, "errors": [] }
PATCH /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).

Verzoek
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"}'
Antwoord
{
  "data": { "serial": "KES-00001", "public_url": "https://myproductpassport.co.uk/01/05012345678900/21/KES-00001", "battery_status": "original", "data": { "state_of_health": "96% at 412 cycles" } }
}
GET /passports/{id}/units/{serial}/snapshots 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.

Verzoek
curl https://myproductpassport.eu/api/v1/passports/96/units/KES-00001/snapshots \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{
  "data": [
    { "event": "placed_on_market", "status": "original", "values": { "state_of_health": "100%" }, "measured_at": "2026-09-26T09:00:00+00:00", "source": "api" },
    { "event": "status_change", "status": "waste", "values": { "remaining_capacity_ah": "71 Ah", "power_fade": "14%", "internal_resistance_increase": "22%", "expected_lifetime_cycles_remaining": "0" }, "measured_at": "2029-03-02T10:00:00+00:00", "source": "bms" }
  ]
}
POST /passports/{id}/units/{serial}/successor 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.

ParameterSoortBeschrijving
stagestringverplichtprepared_for_reuse, repurposed of remanufactured.
valuesobjectverplichtDe 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).
serialstringHet nieuwe serienummer. Standaard: het oorspronkelijke serienummer plus -RU, -RP of -RM.
measured_atstringWanneer de waarden zijn gemeten.
member_statestringTweeletterige code van de lidstaat waar de gezondheidstoestand is getest, zie artikel 73, lid 1, onder a).
target_passport_idintegerEen bestaand tweede-levenmodel van dit batterijmodel waaronder de batterij wordt geregistreerd.
Verzoek
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"}}'
Antwoord
{
  "data": {
    "serial": "KES-00001-RP", "battery_status": "repurposed", "passport_id": 131,
    "lineage": { "originals": [{ "serial": "KES-00001", "passport_id": 96, "stage": "repurposed" }], "successors": [] }
  }
}
POST /passports/{id}/registry 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.

ParameterSoortBeschrijving
statusstringnot_submitted, submitted, registered of failed.
product_groupstringProductgroep in het register, bijvoorbeeld batteries.
granularitystringmodel, partij of artikel.
upistringUnieke productidentificatiecode als https-URL. Standaard de URL van het openbare paspoort.
correlation_idstringCorrelatie-ID die het register bij indiening toekent.
uristringRegistratie-ID die door het register is teruggegeven.
backup_urlstringhttps-link naar de reservekopie die door een DPP-dienstverlener wordt gehost.
submitted_atdateIndieningsdatum.
registered_atdateRegistratiedatum.
errorstringFoutomschrijving voor een mislukte indiening.
Verzoek
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"
  }'
Antwoord
{
  "message": "Registry details updated.",
  "passport": {
    "id": 96,
    "registry": {
      "status": "registered",
      "upi": "https://myproductpassport.co.uk/p/552fbb4e-5d9a-41da-9050-cc9005d8b66b",
      "correlation_id": "7f3a2c1e-0b4d-4f8e-9a6b-2d1c3e4f5a6b",
      "uri": "urn:eu:dpp:reg:00000001",
      "registered_at": "2027-02-18T00:00:00+00:00"
    }
  }
}
GET /passports/{id}/qr vereist passports:read

De QR-code van het paspoort als bestand: svg (standaard), png (in uw huisstijl, drukklaar) of pdf (etiketvel).

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

09 / EndpointsNaleving

GET /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.

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

10 / EndpointsSectoren

GET /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.

Verzoek
curl https://myproductpassport.eu/api/v1/sectors \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{
  "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

GET /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.

Verzoek
curl https://myproductpassport.eu/api/v1/products/512/documents \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{
  "data": [
    {
      "id": 31,
      "product_id": 512,
      "filename": "declaration-of-conformity.pdf",
      "mime_type": "application/pdf",
      "file_size": 184322,
      "is_public": true,
      "processing_status": "completed",
      "public_url": "https://myproductpassport.co.uk/p/3f0c.../document/31",
      "created_at": "2026-09-22T10:12:00+00:00"
    }
  ]
}
POST /products/{productId}/documents 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.

ParameterSoortBeschrijving
filefileverplichtHet document.
is_publicbooleanTonen op het openbare paspoort (standaard false).
Verzoek
curl -X POST https://myproductpassport.eu/api/v1/products/512/documents \
  -H "Authorization: Bearer pk_your_key" \
  -F "[email protected]" \
  -F "is_public=1"
PATCH /products/{productId}/documents/{id} vereist products:write

Bepaalt of het document vanuit het openbare paspoort wordt gelinkt.

ParameterSoortBeschrijving
is_publicbooleanverplicht
Verzoek
curl -X PATCH https://myproductpassport.eu/api/v1/products/512/documents/31 \
  -H "Authorization: Bearer pk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"is_public": false}'
DELETE /products/{productId}/documents/{id} vereist products:write

Verwijdert het bestand en de koppeling met het paspoort.

Verzoek
curl -X DELETE https://myproductpassport.eu/api/v1/products/512/documents/31 \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{ "message": "Document deleted." }

12 / EndpointsToeleveringsketen

GET /products/{productId}/supply-chain vereist products:read

De stappen die op het productpaspoort worden getoond, in volgorde.

Verzoek
curl https://myproductpassport.eu/api/v1/products/512/supply-chain \
  -H "Authorization: Bearer pk_your_key"
PUT /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.

ParameterSoortBeschrijving
stepsarrayverplichtMaximaal 50 stappen.
steps[].step_typestringverplicht
steps[].supplier_namestringverplicht
steps[].supplier_locationstring
steps[].supplier_countrystringISO 3166-1 alpha-2.
steps[].lat / lngnumber
steps[].descriptionstring
steps[].certificationsarray
steps[].datedate
Verzoek
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

GET /passports/{id}/translations vereist passports:read

Elke vertaalde veldwaarde per taal, met de bron: auto (machinaal, aangemaakt bij publicatie) of handmatig.

Verzoek
curl https://myproductpassport.eu/api/v1/passports/96/translations \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{
  "data": {
    "passport_id": 96,
    "available_locales": ["bg", "cs", "da", "de", "..."],
    "translations": {
      "de": {"care_instructions": {"value": "Kalt waschen", "source": "manual"}}
    }
  }
}
PUT /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.

ParameterSoortBeschrijving
fieldsobjectverplichtfield_key: vertaalde waarde
Verzoek
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"}}'
Antwoord
{ "message": "1 translation(s) written, 0 removed.", "locale": "de", "written": 1, "removed": 0 }

14 / EndpointsIntegriteit en exports

GET /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.

Verzoek
curl https://myproductpassport.eu/api/v1/passports/96/integrity \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{ "data": { "state": "intact", "hash_algorithm": "SHA-256", "signature_algorithm": "Ed25519", "records": [ { "sequence": 1, "event": "published", "content_hash": "8f3a...", "chain_hash": "c21e...", "signature": "MEUC...", "key_id": "3fa9c21e0b7d4a11" } ], "problems": [] } }
GET /passports/{id}/integrity/{sequence} 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.

Verzoek
curl https://myproductpassport.eu/api/v1/passports/96/integrity/1 \
  -H "Authorization: Bearer pk_your_key"
GET /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.

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

15 / EndpointsLeveranciersverzoeken

POST /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.

ParameterSoortBeschrijving
supplier_namestringverplicht
supplier_emailstringverplicht
field_keysarrayverplichtVeldsleutels uit het sjabloon van het paspoort.
localestringTaal van de e-mail en het formulier, bijv. de.
due_atdateUiterste antwoorddatum; 14 dagen indien weggelaten.
messagestring
Verzoek
curl -X POST https://myproductpassport.eu/api/v1/passports/96/supplier-requests \
  -H "Authorization: Bearer pk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"supplier_name": "Mei Chen", "supplier_email": "[email protected]", "field_keys": ["recycled_content_cobalt", "carbon_footprint"], "locale": "de"}'
GET /passports/{id}/supplier-requests vereist passports:read

Elk verzoek voor het paspoort, met de status.

Verzoek
curl https://myproductpassport.eu/api/v1/passports/96/supplier-requests \
  -H "Authorization: Bearer pk_your_key"
GET /supplier-requests/{id} vereist passports:read

Eén verzoek met de antwoorden van de leverancier, de notitie en de namen van bijgevoegde bestanden.

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

16 / EndpointsAftersales

POST /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}.

ParameterSoortBeschrijving
items[].serialstringverplichtMaximaal 20 letters, cijfers, punten, koppeltekens of liggende streepjes.
items[].batchstringBatch of partij, maximaal 20 tekens.
items[].manufactured_onstringProductiedatum, JJJJ-MM-DD.
rangeobjectIn plaats van items: prefix, start, count, digits en batch, bijvoorbeeld SN-00001 tot SN-00500.
Verzoek
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"}}'
Antwoord
{ "created": 500, "updated": 0, "skipped": 0, "over_limit": 0, "errors": [] }
GET /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).

Verzoek
curl https://myproductpassport.eu/api/v1/passports/96/items/SN-00001 \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{
  "data": { "serial": "SN-00001", "status": "active", "url": "https://myproductpassport.co.uk/01/05012345678900/21/SN-00001", "registered": true, "warranty_ends_on": "2028-10-02", "events": [ { "type": "registered", "country": "IE", "at": "2026-10-03T09:12:00+00:00" } ] }
}
PATCH /passports/{id}/items/{serial} 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.

ParameterSoortBeschrijving
statusstringactive, stolen, recalled of retired.
status_notestringGetoond op de pagina van het artikel, maximaal 500 tekens.
Verzoek
curl -X PATCH https://myproductpassport.eu/api/v1/passports/96/items/SN-00001 \
  -H "Authorization: Bearer pk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"status": "stolen", "status_note": "Reported stolen on 2 October 2026."}'
GET /owner-registrations 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.

Verzoek
curl "https://myproductpassport.eu/api/v1/owner-registrations?marketing_consent=1&since=2026-10-01" \
  -H "Authorization: Bearer pk_your_key"
GET /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.

Verzoek
curl "https://myproductpassport.eu/api/v1/service-requests?status=new" \
  -H "Authorization: Bearer pk_your_key"
POST /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).

ParameterSoortBeschrijving
bodystringverplichtHet antwoord, maximaal 5.000 tekens.
internalbooleanEen notitie voor uw team in plaats van een antwoord.
statusstringnew, in_progress, waiting, resolved of closed.
Verzoek
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

PATCH /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).

ParameterSoortBeschrijving
product_idsarrayverplicht
targetstringverplichtproduct | field
keystringverplicht
valuestring
modestringset | fill | clear
Verzoek
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"}'
Antwoord
{ "data": { "changed": 2, "skipped": 1, "errors": [] } }
POST /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.

ParameterSoortBeschrijving
imagefileverplicht
altstringBeschrijving van de afbeelding.
Verzoek
curl -X POST https://myproductpassport.eu/api/v1/products/12/images \
  -H "Authorization: Bearer pk_your_key" \
  -F [email protected] -F alt="Front of the battery"
PUT /products/{id}/images/order vereist products:write

Geef image_ids door in de gewenste volgorde; de eerste wordt de omslagafbeelding.

ParameterSoortBeschrijving
image_idsarrayverplicht
Verzoek
curl -X PUT https://myproductpassport.eu/api/v1/products/12/images/order \
  -H "Authorization: Bearer pk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"image_ids": [31, 30]}'
DELETE /products/{id}/images/{imageId} vereist products:write

Verwijdert de afbeelding en het bijbehorende bestand.

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

18 / EndpointsWebhooks

GET /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.

Verzoek
curl https://myproductpassport.eu/api/v1/webhooks \
  -H "Authorization: Bearer pk_your_key"
POST /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.

ParameterSoortBeschrijving
urlstringverplicht
eventsarrayverplichtEen van de hieronder vermelde gebeurtenissen.
Verzoek
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"]}'
Antwoord
{
  "data": {
    "id": 3,
    "url": "https://erp.acme.example/mpp",
    "events": ["passport.published", "product.updated"],
    "is_active": true,
    "failure_count": 0,
    "secret": "9f1c...64 hex characters...",
    "created_at": "2026-09-22T10:12:00+00:00"
  }
}
GET /webhooks/{id} vereist webhooks:manage

Verzoek
curl https://myproductpassport.eu/api/v1/webhooks/3 \
  -H "Authorization: Bearer pk_your_key"
PUT /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.

ParameterSoortBeschrijving
urlstring
eventsarray
is_activeboolean
Verzoek
curl -X PUT https://myproductpassport.eu/api/v1/webhooks/3 \
  -H "Authorization: Bearer pk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"is_active": true}'
POST /webhooks/{id}/test vereist webhooks:manage

Zet een webhook.test-aflevering in de wachtrij, zodat u uw ontvanger en handtekeningcode kunt controleren.

Verzoek
curl -X POST https://myproductpassport.eu/api/v1/webhooks/3/test \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{ "message": "Test delivery queued." }
GET /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.

ParameterSoortBeschrijving
per_pageintegerMaximaal 100.
Verzoek
curl https://myproductpassport.eu/api/v1/webhooks/3/deliveries \
  -H "Authorization: Bearer pk_your_key"
DELETE /webhooks/{id} vereist webhooks:manage

Verzoek
curl -X DELETE https://myproductpassport.eu/api/v1/webhooks/3 \
  -H "Authorization: Bearer pk_your_key"
Antwoord
{ "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:

GebeurtenisWordt geactiveerd wanneer
product.createdEen product wordt aangemaakt (app, API of CSV-import)
product.updatedEen product wordt bijgewerkt
product.deletedEen product wordt verwijderd
passport.createdEen paspoort wordt aangemaakt
passport.publishedEen paspoort gaat live
passport.archivedEen paspoort wordt gearchiveerd
supplier_request.submittedEen leverancier stuurt de gevraagde gegevens
owner.registeredEen eigenaar bevestigt de registratie
owner.transferredEen artikel gaat over naar een nieuwe geregistreerde eigenaar
service_request.createdEen klant stuurt via een paspoort een serviceaanvraag
service_request.updatedEen serviceaanvraag krijgt een antwoord of een nieuwe status
item.status_changedEen artikel wordt gemarkeerd als gestolen, teruggeroepen of buiten gebruik, of weer vrijgegeven
item.verification_failedEen beveiligde scan mislukt, verkeerde codes stapelen zich op, of één serienummer duikt op te veel plaatsen op
webhook.testU 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:

Inhoud van de levering
{
  "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:

Headers van de levering
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.

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