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.