Suppliers — registry with journey-block overlay
The supplier registry mirrors certifications. A supplier (mill, component-maker, assembler, recycler, packaging vendor, logistics partner) is registered once at the tenant level and applies automatically to matching DPPs via a scope filter — same model as certifications.
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 supplier rows then surface on the public DPP's Journey block: who made what, where, when.
Industry-agnostic on purpose: this same model handles textile mills, battery cathode suppliers, semiconductor fabs, raw cotton growers, plastic resin suppliers, leather tanneries, packaging companies, recyclers, freight forwarders, and end-of-life processors.
Object shape
{
"id": "5b7c2d10-91aa-4c3e-8f6d-2e7a9c4b1d05",
"tenant_id": "8d3a4f91-427f-4d5d-b527-c0b28363676c",
"factory_name": "Example Spinning Mill",
"parent_company": null,
"country_iso": "PT",
"address_city": "Porto",
"tier": "T2",
"process": "Ring spinning of organic cotton",
"facility_type": "spinning",
"production_share_pct": 60,
"latest_audit_year": 2025,
"certifications": ["GOTS"],
"scope_filter": { "category": "textile", "material_contains": "cotton" }
}
tier is T1 (final assembly) to T4 (raw material). facility_type
comes from a list per category (for textiles for example spinning,
dyeing, cut_sew; for batteries cell_assembly, refiner, mine);
process is free text.
scope_filter works as for certifications.
List suppliers
GET /api/v1/tenants/{id}/suppliers
Register a supplier
POST /api/v1/tenants/{id}/suppliers
{
"factory_name": "Example Cell Coating GmbH",
"country_iso": "DE",
"tier": "T2",
"facility_type": "cell_assembly",
"scope_filter": { "category": "battery" }
}
Bulk import
POST /api/v1/tenants/{id}/suppliers
Send an array of supplier objects (or { "suppliers": [...] }), up to
1 000 rows per request.
To turn a supplier list in PDF, image, XLSX or CSV into rows first:
POST /api/v1/tenants/{id}/suppliers-extract
{ "file_base64": "…", "mime_type": "text/csv", "file_name": "suppliers.csv" }
It returns proposed rows for review and saves nothing.
Update or delete a supplier
PATCH /api/v1/tenants/{id}/suppliers?id={supplier_id}
DELETE /api/v1/tenants/{id}/suppliers?id={supplier_id}
Preview the scope
POST /api/v1/tenants/{id}/scope-preview with { "scope_filter": … },
as for certifications, shows which DPPs a filter
matches before you save it.
Auto-apply on read
Resolver evaluates each DPP read against the tenant's supplier registry and overlays matching rows onto the Journey block. No per-DPP write.