DPP Agent docs

Certifications — register once, auto-apply everywhere

A certification (e.g. GOTS, OEKO-TEX Standard 100, Made in Green, ISO 14001, ENERGY STAR, Cradle to Cradle) lives at the tenant level and applies automatically to every matching DPP via a scope filter.

These endpoints are used by the dashboard and need a signed-in session of a tenant admin or editor; an API key is not accepted.

The filter lets you say: "this OEKO-TEX certificate covers all textile DPPs where category = textile and the fabric supplier is Mills A or Mills B" — and any matching DPP, present or future, inherits the cert chip on its public passport.

This is industry-agnostic. The same model handles:

  • GOTS / OEKO-TEX (textile)
  • ENERGY STAR / EU Ecolabel (electronics, white goods)
  • UN38.3 / CE / WEEE (batteries, electronics)
  • Cosmos Organic / Ecocert (cosmetics)
  • FSC / PEFC (furniture, construction)
  • DoP (Declaration of Performance) per EU 305/2011 (construction)

Object shape

{
  "id": "3f2a9b1c-e0d8-4f8e-b308-d2541886e331",
  "tenant_id": "8d3a4f91-427f-4d5d-b527-c0b28363676c",
  "cert_id": "EXAMPLE-0001",
  "name": "OEKO-TEX Standard 100",
  "issuer": "OEKO-TEX",
  "certifier": null,
  "scope_description": "Knitwear, all colours",
  "scope_filter": { "category": "textile", "material_contains": "wool" },
  "valid_from": "2026-01-15",
  "valid_until": "2027-01-14",
  "verification_status": "verified",
  "verification_url": "https://…",
  "verified_at": "2026-06-26T13:42:05.000Z",
  "logo_use_licensed": false,
  "cert_level": "product",
  "show_on_passport": true
}

scope_filter decides which DPPs show the certificate. Every key in it must match (AND); an empty filter means every DPP of the tenant.

Key Matches when
category the DPP's category is this value
category_in the DPP's category is one of the list
material_contains the DPP's composition contains this text (case-insensitive)
material_contains_any the composition contains any of the list
gtin_prefix the GTIN starts with this prefix
brand the product's brand is this value

Expired certificates (valid_until in the past) are not shown. The issuer's logo is shown only when logo_use_licensed is true, since some schemes license their logo separately from the certificate.

List certifications

GET /api/v1/tenants/{id}/certifications

Returns all certs for the tenant.

Register a certification

POST /api/v1/tenants/{id}/certifications
{
  "cert_id": "EXAMPLE-0002",
  "name": "ENERGY STAR",
  "issuer": "U.S. EPA",
  "valid_from": "2026-03-01",
  "valid_until": "2028-03-01",
  "scope_filter": { "category_in": ["electronics", "ict"] }
}

Update or delete a certification

PATCH /api/v1/tenants/{id}/certifications?id={cert_id}
DELETE /api/v1/tenants/{id}/certifications?id={cert_id}
{ "valid_until": "2029-03-01" }

Verification

When a certificate from OEKO-TEX or Textile Exchange is saved, it is checked against the issuer's database and verification_status, valid_until and verification_url are written back. Certificates from other issuers stay pending until verified by document.

Preview the scope

POST /api/v1/tenants/{id}/scope-preview
{ "scope_filter": { "category": "textile" } }

Returns how many of the tenant's DPPs a scope_filter matches, with a small sample, before you save it. The same endpoint serves suppliers.

Auto-apply on read

On every DPP resolver read, the resolver evaluates the tenant's certifications against the DPP's data and overlays the cert chips onto the response. There's no per-DPP write — the cert chip "lives" on the certification row.

Read a certificate with AI

POST /api/v1/tenants/{id}/certifications-extract
{ "file_base64": "…", "mime_type": "application/pdf" }

Send a certificate PDF or image (PNG, JPEG) and the AI returns issuer, number, dates and a suggested scope filter. Nothing is saved: the operator reviews the proposal and saves it with POST /certifications.