DPP Agent docs

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 binary
  • slotdoc.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.