Files — DoP, SDS, technical files
Files are documents attached either at the tenant level (applies to all DPPs in scope) or per-DPP level (this product only). A resolver read inherits tenant-level files into every matching DPP's response automatically.
Common use cases per industry:
- Construction: DoP (Declaration of Performance) per EU 305/2011
- Chemicals / detergents: SDS (Safety Data Sheet) per REACH
- Electronics / battery: technical file per ESPR Article 11
- Cosmetics: PIF (Product Information File) per EU 1223/2009
- Toys / PPE: CE-marking technical file
- Textile: care guides, supply-chain attestations
- Furniture / mattresses: flammability test reports
Object shape
{
"id": "file_3f2a9b1c-…",
"tenant_id": "tnt_…",
"scope": "tenant",
"dpp_id": null,
"slot": "doc.dop",
"filename": "DoP-cement-2026.pdf",
"mime_type": "application/pdf",
"size_bytes": 482133,
"signed_url": "https://…",
"category_scope": ["construction"],
"fills_field": "espr.comp.dop_url",
"uploaded_at": "2026-06-26T13:42:05.000Z"
}
slot is a stable identifier (doc.dop, doc.sds, doc.technical_file,
doc.pif, doc.flammability_test) so multiple revisions of the
same file type can coexist.
fills_field is the structured DPP key this file populates (e.g.
espr.comp.dop_url → reads as the DoP URL on the public passport
for construction products).
List files
GET /api/v1/tenants/{id}/files
Optional filters: ?scope=tenant, ?scope=dpp&dpp_id=…,
?category=construction, ?slot=doc.dop.
Upload a tenant file
POST /api/v1/tenants/{id}/files
Content-Type: multipart/form-data
Form fields:
file— the binaryslot—doc.dop,doc.sds, etc.category_scope— JSON array, e.g.["construction"]fills_field— optional structured DPP key
Upload a per-DPP file
Same endpoint with extra fields:
scope—"dpp"dpp_id— the DPP UUID
Delete a file
DELETE /api/v1/tenants/{id}/files/{file_id}
Resolver inheritance
The resolver walks: per-DPP files first → tenant-scoped files matching
the DPP's category second. Per-DPP overrides tenant. The most recent
upload per slot wins when there are multiple revisions.
A file's fills_field keeps the data flat — operators don't need to
copy the signed URL into dpp_data by hand. Upload the DoP, and
espr.comp.dop_url is populated on every matching construction DPP
automatically.