DDS report — JSON, GeoJSON & PDF
Three representations of the same logical (record, version) report:
| URL suffix | Content-Type | Body |
|---|---|---|
/report | application/json | Six-section JSON envelope (Conclusion & Scope, Methodology, Deforestation Assessment, Article 10 Risk Assessment, Plot Register, Risk-Mitigation Log) |
/report.geojson | application/geo+json | FeatureCollection of the version's included plots, with per-Feature properties matching the export_eudr_dds GeoJSON byte-for-byte |
/audit-trail/pdf | application/json | A JSON info envelope carrying a short-lived signed download URL for the print-ready, formatted audit-trail PDF (rendered from the same data). The PDF is produced asynchronously and the bytes are fetched out-of-band via the signed URL — see the Export folder |
Each dds_record_version carries a report_model identifier
(defaulting to eudr_default_v1) that drives the wire shape. To
evolve the shape later: register a new model in fm-api's
dds-report registry and create a record (or cut a new version)
with the new report_model set in the body. Older versions stay
reproducible against their original model — the JSON / GeoJSON
output is deterministic for a given (record, version) pair, and
every response carries an dds_hash (sha256:<hex>) that
consumers can pin against.
The same hash appears under attributes.dds_hash (JSON) and the
FeatureCollection's top-level properties.dds_hash (GeoJSON), so
the two representations are verifiably the same artefact.
▶Endpoints
| Seq | Method | Path | Purpose |
|---|---|---|---|
| 1 | GET | /dds/:recordId/report | Current version → JSON |
| 2 | GET | /dds/:recordId/report.geojson | Current version → GeoJSON |
| 3 | GET | /dds/:recordId/versions/:versionId/report | Pinned version → JSON |
| 4 | GET | /dds/:recordId/versions/:versionId/report.geojson | Pinned version → GeoJSON |
The PDF and the full ZIP export package (async render → download, current + pinned) live in the Export folder.
▶Setting report_model
report_model- At record create:
data.attributes.report_modelonPOST /regulations/eudr/audit-trail. Optional — defaults toeudr_default_v1. - At version cut:
data.attributes.report_modelonPOST /regulations/eudr/audit-trail/:recordId/tasks. Optional — when omitted, v_{n+1} carries v_n's value forward. Use this to migrate a record onto a newer model without losing the older versions' reports.
Unknown identifier → 400 BAD_REQUEST from the create / task body.
Required scope:
ingestions:read