Assessment Fields
โถAssessment Fields Reference
Every location uploaded through POST /ingestions/assets has its assessment response columns partitioned into one of ten disjoint assessment groups. Each group is stored separately and surfaced in API responses under relationships.assessments.attributes.{group}.
This page is the canonical reference for every key each group can carry.
| Group | Enabled by | Stored as | Surfaced in |
|---|---|---|---|
core | include_core | assessment of type core | assessments.core |
hazard | include_hazard | assessment of type hazard | assessments.hazard |
infrastructure | include_infrastructure | assessment of type infrastructure | assessments.infrastructure |
deforestation_screen | include_deforestation (ingestion); include_deforestation_screen (reprocess PUT only) | assessment of type deforestation_screen | assessments.deforestation_screen |
biodiversity | include_biodiversity | assessment of type biodiversity | assessments.biodiversity |
water | include_water | assessment of type water | assessments.water |
luc_emissions | include_luc_emissions | assessment of type luc_emissions | assessments.luc_emissions |
art9 | include_art9 / include_deforestation / include_legality (ingestion); include_art9 / include_eudr (DDS create path) | assessment of type art9 | assessments.art9 |
art10 | include_art10 / include_legality (ingestion); include_art10 / include_eudr (DDS create path) | assessment of type art10 | assessments.art10 |
eudr_profile | include_eudr_profile (ingestion); force-run on the DDS create path | assessment of type eudr_profile | assessments.eudr_profile |
core, hazard, infrastructure, deforestation_screen, biodiversity, water, and luc_emissions are ingestion-scope โ surfaced under ingestions:read / locations:read. art9 (legality), art10 (country-risk), and eudr_profile are EUDR-scope โ surfaced on the same responses but gated behind assessments:read; without that scope the slots come back null. See eudr-compliance.md for the EUDR readiness contract and Including assessments on ingestion responses for the gated surfacing + nested response shape.
The key sets are disjoint by construction (a regression test in fm-api guards this). If a new column is added upstream it must land in exactly one group; otherwise it is treated as user source data and not promoted into assessments.
The field tables below cover core, art9, art10, hazard, biodiversity, water, luc_emissions, and infrastructure. The two groups split out after this page was written โ eudr_profile and deforestation_screen โ are documented in Including assessments on ingestion responses.
The source of truth for the partitioning is call-validate-locations.ts (CORE_KEYS, ART9_KEYS, ART10_KEYS, EUDR_PROFILE_KEYS, HAZARD_KEYS, INFRASTRUCTURE_KEYS, DEFORESTATION_SCREEN_KEYS, BIODIVERSITY_KEYS, WATER_KEYS, LUC_KEYS).
โถRequest parameters (the assessments block)
assessments block)The assessments block can be supplied on POST /ingestions/assets and on PUT /ingestions/assets. All fields are optional.
Every flag is strict opt-in (default false) โ none of them, including include_core, runs unless you set it true.
On the ingestion endpoints (POST / PUT /ingestions/assets) the honoured toggles are:
| Field | Type | Default | Description |
|---|---|---|---|
include_core | boolean | false | Persist the core row โ confidence score + level + plot- and facility-validation flags. |
include_deforestation | boolean | false | Run the validation-time deforestation check (commodity-mask overlap). Writes the deforestation_screen row (the per-location deforestation summary object โ risk, deforestation_present, deforestation_area_ha โ plus deforestation_check_failed), reports deforestation_screen on the task summary's by_assessment, and writes deforestation_value (art9 group) plus the confidence_level (core group) that the metric_confidence_levels gate weighs. Not free โ see the cost note below the table. |
include_deforestation_screen | boolean | false | Reprocess (PUT) only, and requires the eudr:write scope. The upload POST rejects it: use include_deforestation there, which reaches the same sco2api primitive and produces the same row and the same by_assessment entry. On reprocess this flag runs the screen as a standalone full assessment, which is what makes it separable โ and it additionally re-runs the screen over every derived staged_location (see the cost note). |
include_legality | boolean | false | Run the Article 9 legality check (Gemini adverse-media web search). Writes the legality_* keys (art9 group) headlined by legality_risk_level, and โ via the same worker's deterministic backbone โ the article10_* keys (art10 group) headlined by article10_risk_level. Maps to the include_legality_check on the wire. |
include_eudr_profile | boolean | false | Run the EUDR-profile enrichment add-on (Gemini facility description/profile + deterministic Article-29 country-risk tier) โ eudr_profile row. Its own sco2api primitive โ no other ingestion flag turns it on. Maps to include_eudr_profile on the wire. The eudr_profile block surfaces on the assets / locations responses for callers holding assessments:read. |
include_hazard | boolean | false | Run natural-hazard risk scoring โ hazard row. |
include_biodiversity | boolean | false | Run the biodiversity (landscape-integrity) screen โ biodiversity row (landscape_integrity_score/_level, natural cover, fragmentation, Rao's Q, WDPA/IFL proximity). Maps to include_landscape_integrity on the wire (EPO-1810). |
include_water | boolean | false | Run the climatic water-budget screen โ water row (water_budget_score/_level, seasonal climatic water deficit). Maps to include_water_budget on the wire (EPO-1810). |
include_luc_emissions | boolean | false | Run the land-use-change emissions screen โ luc_emissions row (the land-cover change detected and its tCO2e/yr equivalent). Uses Earth Engine, and on a facility it also runs the isochrone, as include_deforestation does. Same name on the wire. |
include_infrastructure | boolean | false | Persist the infrastructure row with the *_distance_km keys driven by the access checks below. |
include_art9 | boolean | false | Run the Article 9 assessment on its own โ art9 row (isochrone deforestation + adverse-media legality columns), without reporting or persisting art10. Same worker (and cost) as include_legality. |
include_art10 | boolean | false | Run the Article 10 procedural / country risk assessment on its own โ art10 row (governance, corruption, conflict, indigenous-overlap โ article10_*, incl. the grounded article10_criteria), without reporting or persisting art9. The Article 10(2) criteria narrative (article10_summary) is surfaced on the legality (art9) read surface only โ request include_art9 / include_legality if you need it. The EUDR country-risk tier is a separate opt-in (include_eudr_profile), not this flag. |
include_art9 / include_art10 are independently honoured on upload
(EPO-1808; they were previously stripped). include_legality remains the
both-groups shorthand. Note the two groups share one sco2api legality
worker, so requesting either alone costs the same as include_legality โ
the independence is in what gets reported (by_assessment) and persisted,
not in what runs server-side.
On upload, include_deforestation is the flag for the deforestation_screen
group. include_deforestation_screen is rejected there by the strict schema.
The two reach the same sco2api primitive, and on the upload path the base flag
already produces everything the group needs: the row write is data-driven, and
the progress fold reports the group for either flag. So the separable spelling
adds nothing on POST and stays on the reprocess PUT, where it runs the type
as a standalone full assessment and the eudr:write gate means something.
The screen's summary is per-location and shaped the same for both location
types, but it is produced by a different upstream check on each: a facility's
comes from the isochrone-catchment deforestation reduce, a plot's or shed's
from the polygon's own plot_validation. That is why the group's progress in
by_assessment folds from a different sco2api sub-task per type.
โถWhat the deforestation check costs
Against a run that requests no deforestation at all:
- Facility runs additionally solve the supply-shed isochrone and run an Earth Engine reduce over it. The isochrone is skipped entirely when nothing consumes it, which is why a core-validation or geocode-only upload is much cheaper, and the solve is bounded by a 750 s timeout before it degrades to a 50 km buffer.
- Plot runs screen deforestation per polygon, and a plot with deforestation
present takes a 0.15 penalty on its confidence score. So
confidence_scoreandconfidence_levelare not invariant to these flags: the same upload scores differently with the check on. If you gate metric computation withmetric_confidence_levels, that gate reads the affected level โ so on a run that also requestsmetrics, this can change which locations are computed, not just what is displayed. - The reprocess-only
include_deforestation_screenadditionally costs a derived-location pass, whichinclude_deforestationnever does. That flag putsdeforestation_screeninto the run's requested assessment types, so the screen also runs over eachstaged_locationderived during the run โ the sheds and plots linked from your upload. Those are new locations with no cached validation row, so each is a real upstream call and emits its own usage event, and the pass is uncapped. This is the reason the upload path does not offer the flag: onPOSTit would buy that fan-out and no extra data. - An
art9row is opened per location either way, because the same check emits the isochrone/shed columns that belong to theart9partition. The legality family is filtered out when Article 9 was not itself requested, so/assessments/{location_type}/legalitycan return rows whose legality fields are all null. Readlegality_risk_levelrather than row presence to decide whether Article 9 actually ran.
โถDDS-create-path shorthand (stripped on ingestion)
include_eudr drives both EUDR-scope groups on the DDS create path. It is
silently stripped if sent to POST / PUT /ingestions/assets (see
assessments-overview.md) โ use the per-group
include_art9 / include_art10 flags (or include_legality for both)
instead.
| Field | Type | Default | Group enabled | Description |
|---|---|---|---|---|
include_eudr | boolean | false | art9 + art10 | Shorthand that fans out to include_art9 + include_art10 only โ not hazard / infrastructure. |
When both include_eudr and a per-group flag are present, the union wins โ include_eudr: true cannot be narrowed by setting an individual group to false.
โถAccess checks (check_*)
check_*)The check_* flags are cross-cutting toggles that drive the water / port / road access checks. They sit at the top level of the assessments block โ not nested under any group โ because the same assessment call produces matching keys on both core and infrastructure:
coreโ boolean access flags:water_access,port_proximity,road_access.infrastructureโ numeric distances in km:nearest_water_km,nearest_port_km,nearest_road_km.
| Field | Type | Default | Drives (in core) | Drives (in infrastructure) |
|---|---|---|---|---|
check_water_access | boolean | false | water_access | nearest_water_km |
check_port_proximity | boolean | false | port_proximity | nearest_port_km |
check_road_access | boolean | false | road_access | nearest_road_km |
Both rows record the check_* snapshot on their sub_options column. A subsequent request that asks for an access check not covered by the cached sub_options is treated as a cache miss and refreshes the affected rows.
โถcore group
core groupEnabled by include_core. See assessments-overview.md ยง core for what this assessment does. Plot validation methodology lives in location-validation.md.
โถCommon (always present on core)
core)| Field | Type | Description |
|---|---|---|
confidence_score | number | 0โ1 score combining all plausibility indicators below. |
confidence_level | string | low | medium | high. Bucketing of confidence_score. |
confidence_comment | string | Free-text explanation of which indicators contributed. |
comment | string | Generic per-feature comment. |
common_comment | string | Per-collection comment shared across features. |
total_plots | number | Total plot count in the parent collection. |
primary_warning | string | null | Headline warning string for UI surfacing (most severe issue). |
feature_idx | number | Position of this feature in the source upload (0-based). |
location_type | string | Detected location type โ facility | plot | shed. |
commodity_invalid | boolean | Present and true when the row's commodity cell names no supported commodity. The row was checked against the file's commodity (the declared commodity_type, or the column's most common value) instead. Absent when no commodity column was used. |
โถFacility plausibility (location_type='facility')
location_type='facility')| Field | Type | Description |
|---|---|---|
producer_confirmation_score | number | 0โ1 โ confidence that the named producer matches points of interest / business records at the location. |
producer_confirmed | boolean | True iff producer_confirmation_score exceeds the per-commodity threshold. |
producer_confirmation_comment | string | Free-text explanation of which evidence supported / contradicted the producer name. |
aggregation_comment | string | Comment about how multiple sources were combined into the score. |
poi_data | object | Raw point-of-interest matches that informed scoring. |
commodity_presence | boolean / number | Whether commodity probability maps show presence at the location. |
poi_presence | boolean | Whether matching points of interest (mill, silo, warehouse, etc.) were found nearby. |
high_density | boolean | Whether the surrounding area has high industrial / built-up density. |
building_presence | boolean | Whether building footprints exist within the detection radius. |
road_access | boolean | Whether a road network segment is reachable within plausible distance. |
water_access | boolean | Whether navigable waterways are within plausible distance. |
port_proximity | boolean | Whether a port facility is within plausible distance. |
โถPlot validation counts (location_type='plot')
location_type='plot')Each *_count is the number of plots in the upload that triggered the matching geometric check.
| Field | Type | Description |
|---|---|---|
max_distance_gt_min_distance_count | number | Plots whose max-vertex distance vastly exceeds their min-vertex distance (elongated shapes). |
max_angle_lt_min_angle_count | number | Plots with extreme interior-angle disparity (spiked geometries). |
intersects_another_polygon_count | number | Plots that overlap another plot in the same collection. |
distance_nearest_neighbor_count | number | Plots that are extremely close to a neighbour without overlapping (likely boundary error). |
area_too_small_count | number | Plots below the per-commodity minimum area. |
triangular_geometry_count | number | Plots whose vertex layout is suspiciously triangular (placeholder geometry). |
bad_precision_count | number | Plots whose coordinates have insufficient decimal precision (~10 m floor). |
short_boundary_segments_count | number | Plots with sub-resolution boundary segments. |
self_intersection_count | number | Plots whose polygon ring crosses itself. |
duplicate_vertices_count | number | Plots with consecutive identical vertices. |
nested_geometry_collection_count | number | Plots delivered as nested GeometryCollection. |
simplifiable_collections_count | number | Plots whose nested collection can be flattened without loss. |
commodity_absence_count | number | Plots where commodity probability maps show no presence. |
protected_area_overlap_count | number | Plots that intersect a WDPA protected area. |
protected_area_assessed | boolean | false when the protected-area read did not complete, so the overlap count was not verified. |
plot_validity | object | Aggregate shape-validity summary { score, level, investigate[] }. |
deforestation | object | Per-plot deforestation summary { value, area_ha, level } (separate from art9). |
overall | object | Top-level pillar-weighted summary { score, level, investigate[] }. |
protected_area_metadata | object | WDPA polygon ids and names overlapping the plot, when applicable. |
โถart9 group โ Article 9 isochrone deforestation
art9 group โ Article 9 isochrone deforestationEUDR-scope: driven on the DDS create path, not on ingestion. See assessments-overview.md ยง art9.
| Field | Type | Description |
|---|---|---|
deforestation_value | number | 0โ1 deforestation index for the isochrone shed. Higher = more cleared post-EUDR cutoff. |
deforestation_area_ha | number | Hectares of detected deforestation within the shed (not the plot). |
shed_geo | object | Deprecated. GeoJSON Polygon of the buffered isochrone catchment. Absent on live reads; still present on audit-trail plots and in artifact exports (metrics data). Read live screened areas from GET /ingestions/assets/{id}/screened-areas. |
โถart10 group โ Article 10 legality + country risk
art10 group โ Article 10 legality + country riskEUDR-scope: driven on the DDS create path, not on ingestion. See assessments-overview.md ยง art10.
| Field | Type | Description |
|---|---|---|
legality_risk_score | number | 0โ1 risk score for legality (land tenure disputes, sanctions, environmental violations, illegal-activity media). |
legality_risk_level | string | low | medium | high bucketing. |
legality_summary | string | Human-readable summary of the legality findings. |
legality_sources | array | Cited sources backing the score: { url, title, snippet, sentiment, lat, lon }. |
eudr_country_risk_tier | string | EUDR-published country tier โ low | standard | high. Drives the due-diligence depth required for the country. |
corruption_perception_index | number | Transparency International CPI for the country of operation. Lower = more perceived corruption. |
โถhazard group โ Natural hazard risk
hazard group โ Natural hazard riskEnabled by include_hazard. See assessments-overview.md ยง hazard.
| Field | Type | Description |
|---|---|---|
natural_hazard_risk_score | number | 0โ1 composite hazard score. |
natural_hazard_risk_level | string | low | medium | high bucketing. |
natural_hazard_summary | string | Human-readable summary of which hazards drove the score. |
natural_hazard_sources | array | Cited sources backing the score: { url, title, snippet, hazard_type, lat, lon }. |
flood_zone_pct | number | Percentage of the supply shed within a mapped flood zone. |
flood_event_count | number | Count of recorded historical flood events. |
extreme_heat_wbgt | number | Wet-bulb globe temperature (ยฐC) proxy for extreme-heat exposure. |
water_stress_score | number | 0โ1 baseline water-stress score. |
nearest_grid_km | number | Straight-line distance to the nearest power-grid infrastructure (hazard-gated). |
nearest_grid_point | GeoJSON Point | Location of the nearest power-grid feature. |
โถbiodiversity group โ Landscape-integrity screen
biodiversity group โ Landscape-integrity screenEnabled by include_biodiversity (EPO-1810). A lightweight non-EE screen computed from the commodity / natural-forest masks over each location.
| Field | Type | Description |
|---|---|---|
landscape_integrity_score | number | 0โ1 composite biodiversity score: strongest of forest-landscape intactness, WDPA-proximity and IFL-proximity; higher = more at stake. |
landscape_integrity_level | string | low | moderate | high | severe concern band. |
landscape_natural_cover_fraction | number | Natural-habitat cover fraction of the shed (0โ1). |
landscape_patch_count | number | Natural-habitat patch count (fragmentation). |
landscape_rao_q | number | Mean Rao's Q structural diversity of the canopy. |
landscape_wdpa_km | number | Distance (km) to the nearest WDPA protected area within the impact buffer; null if none. |
landscape_ifl_km | number | Distance (km) to the nearest Intact Forest Landscape within the impact buffer; null if none. |
โถwater group โ Climatic water-budget screen
water group โ Climatic water-budget screenEnabled by include_water (EPO-1810). The fast climatic arm of the water budget โ 1 โ P/PET aridity plus the seasonal climatic water deficit. Distinct from the hazard group's water_stress_score (a different worker's baseline signal).
| Field | Type | Description |
|---|---|---|
water_budget_score | number | 0โ1 climatic water-stress index; higher = more stressed. |
water_budget_level | string | low | moderate | high | severe stress band (aridity-class aligned). |
water_budget_cwd_mm | number | Seasonal climatic water deficit, mm/yr. |
โถluc_emissions group โ Land-use-change emissions screen
luc_emissions group โ Land-use-change emissions screenEnabled by include_luc_emissions. Pairs the land-cover change detected over the assessment window with the emissions it implies. sco2api stores one nested luc_emissions object plus luc_emissions_check_failed; every API surface flattens it to the fields below, both on GET /assessments/{location_type}/luc-emissions and in assessments.luc_emissions.flags.
Every field except luc_check_failed is null when the screen failed and left no summary.
| Field | Type | Description |
|---|---|---|
luc_risk_level | string | null | low | medium | high. Null when the screen ran unscoped or over a zero area, so a filter[luc_risk_level] never matches those rows. |
luc_tco2eyear | number | null | LUC emissions, tCO2e/yr: conversion plus peat oxidation plus fertiliser N2O. |
intensity_tco2e_ha_year | number | null | luc_tco2eyear per hectare of screened_area_ha. |
converted_area_ha | number | null | Area converted in the window, ha. |
forest_converted_area_ha | number | null | Converted area that was forest, ha. |
nonforest_converted_area_ha | number | null | Converted area that was not forest, ha. |
main_lc_transition | string | null | The transition with the largest area, e.g. forest_to_cropland. |
lc_transitions | object | null | Converted area by transition, ha. |
annual_lc | object | null | Emissions by year, tCO2e. Years with none are omitted. |
screened_area_ha | number | null | The area the screen ran over, ha. |
screened_area_basis | string | null | Which area that is, e.g. commodity or catchment. |
commodity_basis | string | null | Which conversions were counted. target: conversion to this commodity. cropland_fallback or commodity_union: conversion to farmland in general, not attributable to this commodity. plot_boundary: every conversion inside the submitted plot. unscoped counts every conversion and leaves the band null. |
factor_basis | string | null | Emission-factor source. global_default means the country had no entry and forest transitions are underestimated. |
assessment_period | number | null | Window length, years. 20, or a tree crop's longer cycle. |
monitoring_end_year | number | null | Last year of the window. |
luc_check_failed | boolean | True if the upstream screen errored. |
โถinfrastructure group โ Nearest-feature enrichments
infrastructure group โ Nearest-feature enrichmentsEnabled by include_infrastructure. See assessments-overview.md ยง infrastructure. Distance keys present depend on which check_* flags were set at request time (see Access checks); the port metadata + GeoJSON points are emitted whenever the port check runs.
| Field | Type | Driven by | Description |
|---|---|---|---|
nearest_water_km | number | check_water_access | Distance to the nearest navigable waterway. |
nearest_port_km | number | check_port_proximity | Straight-line distance to the nearest port facility. |
nearest_road_km | number | check_road_access | Distance to the nearest road network segment. |
port_road_km | number | check_port_proximity | Road-routed driving distance to the nearest port (Google Directions). |
nearest_port_name | string | check_port_proximity | Name of the nearest port facility. |
nearest_port_address | string | check_port_proximity | Address of the nearest port facility. |
nearest_port_point | GeoJSON Point | check_port_proximity | Location of the nearest port facility. |
nearest_water_point | GeoJSON Point | check_water_access | Location of the nearest navigable waterway. |
port_route_count | number | check_port_proximity | How many alternative driving routes to the port exist (max 3). 1 is a single point of failure; 0 with port_routes_unavailable: false means no road route exists. |
port_routes_unavailable | boolean | check_port_proximity | true only when the routing call itself failed. Distinguishes "we could not look" from "there is no route" โ do not read a port_route_count of 0 without it. |
โถPort freight routes (port_routes) โ opt-in
port_routes) โ opt-inThe route geometry behind port_route_count is not returned by default. Each
route is a decoded driving polyline of several hundred [lon, lat] vertices, so a
location can carry tens of KB โ enough to matter on a bulk upload, where a single
page of results would otherwise drag the whole set through Postgres.
Request it explicitly on the infrastructure read endpoint:
GET /assessments/{location_type}/infrastructure?include=port_routes
| Field | Type | Description |
|---|---|---|
port_routes | array | null | Top-level attribute (not inside distances). An array of routes; each route is a list of [lon, lat] vertices, ordered from the location to the port. Route 0 is the primary. null when the location has no routed port. |
The key is omitted entirely without the include, so a caller can tell "I did
not ask for this" from "this location has no routes". It is an include, not a
sparse field โ fields[assessment]=port_routes is a 400. The two compose:
?include=port_routes&fields[assessment]=distances returns both.
port_routes is never present on the aggregate assessment relationship
(GET /locations?include=assessment, DDS record reads) or in CSV artifact
exports, and it is not replicated onto catchment members when one representative
location is assessed for a group โ the routes belong to the location they were
measured from.
โถResponse-shape note
The assets / locations responses surface the ingestion-scope slots โ core, hazard, infrastructure, deforestation_screen, biodiversity, water, luc_emissions โ under ingestions:read / locations:read. The EUDR-scope rows (art9, art10, eudr_profile) are surfaced on the same responses, but gated behind assessments:read; without that scope the slots come back null. The full EUDR-scope payloads are also readable from the dedicated GET /assessments/{location_type}/{legality,country-risk,eudr-profile} slugs and from the audit-trail record once the DDS create path has produced them (GET /regulations/eudr/audit-trail/:recordId/plots). For the nested response shape and per-partition field references, see Including assessments on ingestion responses.