DDS report — JSON, GeoJSON & PDF

Three representations of the same logical (record, version) report:

URL suffixContent-TypeBody
/reportapplication/jsonSix-section JSON envelope (Conclusion & Scope, Methodology, Deforestation Assessment, Article 10 Risk Assessment, Plot Register, Risk-Mitigation Log)
/report.geojsonapplication/geo+jsonFeatureCollection of the version's included plots, with per-Feature properties matching the export_eudr_dds GeoJSON byte-for-byte
/audit-trail/pdfapplication/jsonA 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

SeqMethodPathPurpose
1GET/dds/:recordId/reportCurrent version → JSON
2GET/dds/:recordId/report.geojsonCurrent version → GeoJSON
3GET/dds/:recordId/versions/:versionId/reportPinned version → JSON
4GET/dds/:recordId/versions/:versionId/report.geojsonPinned version → GeoJSON

The PDF and the full ZIP export package (async render → download, current + pinned) live in the Export folder.

Setting report_model

  • At record create: data.attributes.report_model on POST /regulations/eudr/audit-trail. Optional — defaults to eudr_default_v1.
  • At version cut: data.attributes.report_model on POST /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