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.

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": "cert_3f2a9b1c-…",
  "tenant_id": "tnt_…",
  "name": "OEKO-TEX Standard 100",
  "issuer": "OEKO-TEX Association",
  "certificate_number": "21.HCN.95000",
  "issued_date": "2026-01-15",
  "valid_until": "2027-01-14",
  "category_scope": ["textile", "footwear"],
  "scope_filter": {
    "category": ["textile"],
    "supplier_id": ["sup_abc", "sup_def"]
  },
  "logo_url": "https://…/oeko-tex.svg",
  "logo_license": "text_only",
  "verified_at": "2026-06-26T13:42:05.000Z",
  "source_category": "textile_voluntary"
}

scope_filter is a JSON object — any DPP whose fields satisfy all the keys gets the cert. Common keys: category, supplier_id, gtin_prefix, country, material_family.

logo_license controls how the issuer logo renders on the public DPP: embed shows the logo, text_only shows a text badge instead (strict-licence schemes like OEKO-TEX require this).

List certifications

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

Returns all certs for the tenant.

Register a certification

POST /api/v1/tenants/{id}/certifications
{
  "name": "ENERGY STAR",
  "issuer": "U.S. EPA",
  "certificate_number": "2026-ES-04421",
  "issued_date": "2026-03-01",
  "valid_until": "2028-03-01",
  "category_scope": ["electronics", "ict"],
  "scope_filter": { "category": ["electronics"] }
}

Update a certification

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

Verify (external lookup)

POST /api/v1/tenants/{id}/certifications/{cert_id}/verify

For schemes with public databases (GOTS, OEKO-TEX, Svanen, ENERGY STAR) the verifier hits the issuer's API and stamps verified_at on success. Manually-uploaded certs from issuers without public databases stay verified-by-document only.

Preview matches

GET /api/v1/tenants/{id}/certifications/{cert_id}/preview-matches

Returns the list of DPPs the scope_filter currently covers. Use this before saving a new filter to confirm the scope is right.

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.

AI cert upload

POST /api/v1/tenants/{id}/certifications/extract
Content-Type: multipart/form-data

Upload a certificate PDF / image / XLSX and the AI extracts issuer, number, dates, and suggests a scope filter based on the certificate's listed scope. Operators review before saving.