Skip to main content

PPWR Compliance Use Case

Learn how to use Coolset APIs to meet Packaging and Packaging Waste Regulation (PPWR) requirements.

Overview​

The EU Packaging and Packaging Waste Regulation (PPWR) requires companies to track, assess, and report on packaging across their supply chain. Coolset's APIs let you flag packaging products via tags, track the packaging risk assessments Coolset runs on them, and upload supporting evidence — using the same infrastructure as EUDR, without any regulation-specific endpoints.

Compliance Workflow​

Step 1: Flag Products as Packaging​

Products are flagged for PPWR via tags. Two tags are used:

TagMeaning
PPWRThis product is in scope for PPWR compliance
PPWR_PACKAGINGThis product is a packaging component used within a PPWR product

Use PATCH /products/{id}/ to apply tags to existing products:

# Flag a product as in scope for PPWR
curl -X PATCH https://developers-scranton.coolset.com/api/products/456/ \
-H "Authorization: ApiKey YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tags": ["PPWR"]}'

# Flag a packaging component
curl -X PATCH https://developers-scranton.coolset.com/api/products/789/ \
-H "Authorization: ApiKey YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tags": ["PPWR_PACKAGING"]}'

Response:

{
"id": 456,
"name": "Cardboard Box 30x20x15cm",
"tags": ["PPWR"],
"pulse_params": {
"identifier": "scranton$Product$456",
"model_identifier": "scranton$Product"
}
}

Updating a product makes Coolset (re)run its packaging assessment. Note the pulse_params.identifier — assessments for the product are filed under it.

Step 2: Check the Packaging Assessment​

Packaging assessments are run by Coolset, not created through the API. Look up the product's latest one by its pulse_params.identifier. There is no per-ID retrieve endpoint — filter the list instead:

curl -G https://developers-pulse.coolset.com/api/compliance/risk-assessments/ \
-H "Authorization: ApiKey YOUR_API_TOKEN" \
--data-urlencode 'identifier=scranton$Product$456' \
--data-urlencode 'assessment_type=ppwr_packaging_assessment' \
--data-urlencode 'latest_per_identifier=true'

Response (one entry of results, abridged):

{
"id": 101,
"identifier": "scranton$Product$456",
"assessment_type": "ppwr_packaging_assessment",
"assessment_run_id": "b2c3d4e5-f6a7-4890-b123-456789abcdef",
"assessment_summary": {
"status": "in_progress"
},
"results": {
"ppwr_conformity": {
"metadata": {
"role": "not_manufacturer",
"category": null,
"weights": { "by_material": {} }
},
"socs": {
"risk_score": null,
"risk_score_text": null,
"status": "analyzing",
"kpi_data": {
"socs_actions": {
"kpi_score": null,
"kpi_score_text": null,
"data_point_data": {}
}
},
"sources": {
"questionnaire": { "type": "questionnaire", "url": "" }
}
},
"heavy_metals_restrictions": { "...": "same shape as socs" },
"pfas_restrictions": { "...": "same shape as socs" },
"en_13430_compliance": { "...": "same shape as socs" },
"document_completeness": {
"...": "same shape, with additional kpi_data sub-keys (technical_documents, design_documents, component_breakdown, harmonisation, specifications)"
}
}
},
"assessment_date": "2025-05-12T10:00:00Z"
}
Assessments are asynchronous and their results are free-form

A fresh assessment is pending, and each control under results.ppwr_conformity reports "analyzing" with null scores until the relevant supplier data or questionnaire responses are available. Read the overall outcome from assessment_summary.status — pending, in_progress, failing, mitigated or passing — and poll the list filter above until it is no longer pending/in_progress.

results and metadata are untyped JSON: the shape above is what a ppwr_packaging_assessment returns today, but it varies by assessment_type and may change between assessment versions. Treat it as informational rather than a fixed contract.

Aggregate assessments run automatically — no need to trigger them manually.

Step 3: Upload Supporting Documents​

Attach evidence (supplier declarations, material certificates) to your assessment:

# 1. Create the document record. `identifiers` links it to the product.
curl -X POST https://developers-pulse.coolset.com/api/documents/ \
-H "Authorization: ApiKey YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Recycled Content Certificate.pdf",
"content_type": "application/pdf",
"identifiers": ["scranton$Product$456"]
}'
# Response: {"document_id": 5521, "upload_url": "https://storage.googleapis.com/...", ...}

# 2. Upload the file to `upload_url` within 15 minutes (max 100 MB).
curl -X PUT "UPLOAD_URL" \
-H "Content-Type: application/pdf" \
-H "x-goog-content-length-range: 0,104857600" \
--upload-file "Recycled Content Certificate.pdf"

# 3. Confirm the upload. 200 = done, 202 = not visible yet, retry shortly.
curl -X POST https://developers-pulse.coolset.com/api/documents/5521/confirm_upload/ \
-H "Authorization: ApiKey YOUR_API_TOKEN"

Step 4: Download Evidence Package​

Package all evidence for regulatory submission or audit. To see what the bundle contains first — or to download only some files — list it with GET /compliance/risk-assessments/101/evidence-bundle/ and pass the item keys you want as selected_items (see the EUDR guide):

curl -X POST https://developers-pulse.coolset.com/api/compliance/risk-assessments/101/evidence-downloads/ \
-H "Authorization: ApiKey YOUR_API_TOKEN" \
--output ppwr-evidence-package.zip

Optional: Invite Suppliers onto the Platform​

If you want suppliers to contribute their own data, create a Value Chain with type: "supplier" and set send_information_request: true to trigger an invitation email:

curl -X POST https://developers-scranton.coolset.com/api/value-chains/ \
-H "Authorization: ApiKey YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"company_name": "Acme Packaging GmbH",
"type": "supplier",
"country_code": "DE",
"contact_name": "Jana Schmidt",
"contact_email": "jana.schmidt@acme-packaging.de",
"send_information_request": true
}'

Once the supplier accepts and connects, their data becomes available in your assessments.


Key Concepts​

Product Tags​

TagUse
PPWRMarks the product as in scope for PPWR — used to filter which products get assessed
PPWR_PACKAGINGMarks the product as a packaging component within a PPWR product

Assessment Types​

TypeDescription
ppwr_packaging_assessmentAssessment of a single packaging product for PPWR compliance
ppwr_aggregate_packaging_assessmentAggregate of individual packaging assessments, run automatically

Aggregate assessments run automatically after individual assessments complete.

Assessment Status​

StatusAction Required
pending / in_progressWait — controls are still being evaluated
passing / mitigatedAcceptable — download evidence package
failingGather evidence and remediate

Compliance Checklist​

  • PPWR-scoped products tagged with PPWR
  • Packaging components tagged with PPWR_PACKAGING
  • Packaging assessments resolved for all in-scope products
  • Supporting documents (material certs, declarations) uploaded
  • Evidence package downloaded and archived
  • Non-compliant products flagged for remediation

API Endpoints Used​

  • PATCH /products/{id}/ — Supply Chain API — tag products as PPWR / PPWR_PACKAGING
  • GET /compliance/risk-assessments/ — Compliance API — check packaging assessments
  • POST /documents/ — Data API — upload evidence
  • POST /documents/{id}/confirm_upload/ — Data API — confirm upload
  • GET /compliance/risk-assessments/{id}/evidence-bundle/ — Compliance API — list evidence files
  • POST /compliance/risk-assessments/{id}/evidence-downloads/ — Compliance API — download evidence package
  • POST /value-chains/ — Supply Chain API — invite suppliers

Next Steps​

Call +31 20 2101245 on FaceTime