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.