EDOPS API Guide v0.3 · June 2026

EDOPS — the Environmental Dimensions of Place Service — generates structured environmental signatures for geographic coordinates worldwide. Signatures are derived from global datasets aggregated at the hydrological sub-basin level in BasinATLAS, with optional historical climate enrichment from LMR v2.1 (paleoclimate) and eVolv2k v4 (volcanic events).

Base URL: https://edops.computingplace.org/api
Interactive schema: edops.computingplace.org/docs

Research prototype — June 2026. The API is publicly accessible but not under a stability guarantee. Parameters and response fields may change between versions. Fields marked planned are in design but not yet in the response.

Endpoints

GET /api/health

GET https://edops.computingplace.org/api/health

Returns {"status": "ok"}. Use to confirm the service is running.

GET /api/signature

GET https://edops.computingplace.org/api/signature?lat={lat}&lon={lon}[&bands={bands}&level={level}&from_year={from_year}&to_year={to_year}&flat={flat}]

Returns the environmental signature for the HydroATLAS sub-basin containing the given coordinate.

ParameterTypeDefaultDescription
latfloatrequiredLatitude in decimal degrees (−90 to 90)
lonfloatrequiredLongitude in decimal degrees (−180 to 180)
bandsstringABCDEProfile groups to include — any combination of A B C D E T with no separator, e.g. ABT. Band T requires from_year and to_year.
levelinteger8Basin hierarchy level. 8 = sub-basin (median ~200 km²). Level 6 is regional (~tens of thousands km²).
from_yearintegerStart year CE for Band T temporal enrichment. Range: 0–1998.
to_yearintegerEnd year CE for Band T temporal enrichment. Range: 0–1998.
flatbooleanfalseWhen true, returns all band field values as flat top-level keys instead of the nested profile_groups structure. Band T temporal data appears at key temporal rather than inside profile_groups. See Response modes below.

Response Structure

The response is a structured JSON object. By default, environmental variables (Bands A–T) are grouped under profile_groups. Pass &flat=true to receive all variable values as flat top-level keys instead — useful for ingestion pipelines and vector operations.

Fields present in both modes

KeyDescription
metaRequest context: signature_version, generated (ISO timestamp), query (lat, lon, bands, level, from_year, to_year), neighborhood (type, basin_level), data_sources
idBasin identifier (BasinATLAS hybas_id)
eco_idOneEarth ecoregion identifier
up_areaTotal upstream contributing area (km²)
geom_geojsonBasin polygon as GeoJSON MultiPolygon string
elev_point, elev_source, elev_dataset, elev_resolution_mPoint elevation at query coordinate (OpenTopoData / Open-Meteo fallback)
relief_range_m, relief_positionDerived terrain metrics: elev_max − elev_min; (elev_point − elev_min) / relief_range
profile_summaryOrdered array of highlight fields: [{key, label, value}, …]

Default mode (no &flat)

KeyDescription
profile_groupsDict keyed A–T (filtered to requested bands). Each entry: {label, items: [{key, label, value}, …]}. All environmental variables live here — see band tables below.

Flat mode (&flat=true)

KeyDescription
band field keysAll band field values returned as top-level keys, e.g. elev_min, aridity, pop_density. profile_groups is omitted.
temporalBand T temporal data (when requested). Same structure as profile_groups["T"] in default mode.

Accessing field values

Default mode — walk the items list for the relevant band:

sig = requests.get("https://edops.computingplace.org/api/signature?lat=16.77&lon=-3.01&bands=C").json()
items = sig["profile_groups"]["C"]["items"]
aridity = next(it["value"] for it in items if it["key"] == "aridity")

Flat mode — field values are directly at the top level:

sig = requests.get("https://edops.computingplace.org/api/signature?lat=16.77&lon=-3.01&bands=C&flat=true").json()
aridity = sig["aridity"]

Profile Bands

Local vs. upstream: Most Band A–C fields appear as pairs — a local value (conditions within the sub-basin only) and an upstream value (area-weighted accumulation across all upstream contributing basins). Upstream keys carry an _upstream suffix, e.g. aridity / aridity_upstream. The divergence between the two is itself environmentally meaningful: a site where local aridity diverges sharply from upstream aridity (e.g. a desert city fed by a distant mountain river) occupies a qualitatively different position than one where they converge.

Band A — Physiographic (profile_groups["A"]) implemented

Stable over geological timescales; defensible as a historical baseline for any period.

FieldDescriptionUnits
elev_min, elev_maxElevation range of sub-basinm asl
slope_avg, slope_upstreamMean slope local / upstream°
stream_gradientChannel gradientm/km
lithology, lith_classDominant lithology code and name
karst, karst_upstreamKarst extent local / upstream%
relief_range_m, relief_positionDerived terrain relief metricsm; 0–1
elev_mean (s/u), erosion_rate, glacier_pct, permafrost_pctPlanned additions

Band B — Hydroclimatic (profile_groups["B"]) implemented

Hydrological fluxes and soil characteristics integrating the full upstream catchment under the current climatic regime. Discharge and runoff reflect contemporary conditions, including the effects of upstream dams and diversions where present.

FieldDescriptionUnits
discharge_yr, discharge_min, discharge_maxRiver discharge annual mean, min, maxm³/s
runoffAnnual runoffmm/yr
river_area, river_area_upstreamRiver/lake surface area local / upstreamkm²
gw_table_depthGroundwater table depthm
pct_clay, pct_silt, pct_sandSoil texture local (+ _upstream variants)%
wet_pct_grp1, wet_pct_grp2Wetland extent by type local (+ _upstream variants)%
wetland_classDominant wetland class name
reservoir_volReservoir storage volume10⁶ m³
pnv_majority, pnv_sharesPotential natural vegetation — dominant class and share breakdown—; %

Band C — Bioclimatic (profile_groups["C"]) implemented

Contemporary climate baseline from BasinATLAS (WorldClim ~1970–2000 CE). These are long-run averages — for historical temperature and precipitation, Band T provides LMR anomalies relative to a 20th-century reference. When from_year is a BCE year, a disclosure note is appended to Band C indicating that these values reflect present-day conditions, not conditions at the requested epoch.

FieldDescriptionUnits
temp_yr, temp_min, temp_maxAnnual mean, min month, max month temperature (local)°C
temp_yr_upstreamAnnual mean temperature upstream°C
precip_yr, precip_yr_upstreamAnnual precipitation local / upstreammm/yr
aridity, aridity_upstreamAridity index (P/PET) local / upstream — higher = wetterdimensionless
permafrost_extentPermafrost extent%
biome_id, biomeOneEarth biome code and name
eco_id, ecoregionOneEarth ecoregion code and name
freshwater_type, freshwater_ecoregion_class, freshwater_ecoregion_nameFreshwater ecoregion classification

Band D — Anthropocene (profile_groups["D"]) implemented

Present-day only. Exclude or qualify for pre-modern analyses; useful as a contrast baseline. When from_year is a BCE year, a disclosure note is appended indicating these values are contemporary and do not represent conditions at the requested epoch.

FieldDescriptionUnits
pop_densityContemporary population densitypersons/km²
human_footprint_09, human_footprint_09_upstreamHuman footprint index local / upstream (2009)0–100
cropland_extent, cropland_extent_upstreamCropland extent local / upstream (EarthStat ~2000 CE)%
pasture_extent, pasture_extent_upstreamPasture extent local / upstream (EarthStat ~2000 CE)%
reservoir_volReservoir storage volume10⁶ m³
gdp_avgGDP per km² (PPP, ~2015)USD/km²
human_dev_idxHuman Development Index0–1

Band E — Coastality (profile_groups["E"]) implemented

Hydrological connectivity to the marine outlet. Always returned; the endorheic flag changes the interpretation of dist_sink.

FieldDescriptionUnits
dist_sinkFlow distance to marine outlet via basin network. Note: BasinATLAS records 0 for endorheic (landlocked) basins — this means no outlet, not zero distance. Check endorheic flag before interpreting.km
endorheic0 = exorheic (ocean-connected); non-zero = landlocked with no marine outletflag
coast_flag1 = basin directly touches the coastbinary
outlet_type, topo_depth_from_coastPlanned additions

Band T — Temporal (profile_groups["T"]) implemented

Period-specific climate enrichment from LMR v2.1 (Tardif et al. 2019), volcanic event annotation from eVolv2k v4 (Sigl & Toohey 2024), and land-use history from HYDE 3.4 (Klein Goldewijk et al. 2017). Requires from_year and to_year. LMR coverage: 0–1998 CE; HYDE coverage: 10000 BCE–2023 CE.

If the period is outside the LMR range, profile_groups["T"] (or temporal in flat mode) will contain a _status: "out_of_range" message; Bands A–E are unaffected. In flat mode (&flat=true), Band T data appears at the top-level key temporal rather than inside profile_groups.

FieldDescriptionUnits
grid_cellLMR grid cell used for extraction {lat, lon} — 2°×2° grid snapped to nearest centre
year_start, year_endRequested period echoed backCE
pdsi_seriesAnnual PDSI values: [{year, pdsi}, …]. Negative = dry, positive = wet.dimensionless
pdsi_mean, pdsi_min, pdsi_maxPeriod summary statistics for PDSIdimensionless
air_seriesAnnual temperature anomaly values: [{year, air_anom_k}, …]. Anomaly relative to 1951–1980 reference period.K (anomaly)
air_mean_anom_kPeriod mean temperature anomalyK (anomaly)
prate_seriesAnnual precipitation rate anomaly: [{year, prate_anom_mm_day}, …]. Anomaly relative to 1951–1980 reference period.mm/day (anomaly)
prate_mean_anom_mm_dayPeriod mean precipitation anomalymm/day (anomaly)
volcanic_eventsEruptions within the period from eVolv2k v4: [{year_ad, month, vssi_tg, vssi_1sig, asymmetry, location, tephra}, …]
volcanic_event_count, volcanic_vssi_sum_tg, years_since_last_majorPeriod summary statistics for volcanic forcing—; Tg; years
hyde_land_useHYDE 3.4 land-use series: [{year_ce, cropland_km2, cropland_pct, grazing_km2, grazing_pct, pasture_km2, pasture_pct, rangeland_km2, rangeland_pct, basin_area_km2, n_cells}, …]. One object per epoch within the requested period.km²; %
_status"ok" when data returned; "out_of_range" or "not_requested" otherwise
Temporal values note. LMR temperature and precipitation values are anomalies relative to a 20th-century reference period (1951–1980), not absolute values. PDSI is a drought severity index in its own right — positive values indicate wetter-than-average conditions for that location, negative values drier. Band C baselines reflect contemporary long-run averages from a different source and reference period; they are not directly comparable to LMR anomalies.

Example Requests

Bands A and B only — Athens

curl "https://edops.computingplace.org/api/signature?lat=37.97&lon=23.73&bands=AB"

Full baseline signature — Samarkand

curl "https://edops.computingplace.org/api/signature?lat=39.65&lon=66.98&bands=ABCDE"

With historical climate — Rome, early imperial period

curl "https://edops.computingplace.org/api/signature?lat=41.9&lon=12.5&bands=ABCT&from_year=1&to_year=400"

With historical climate — Kaifeng (Song dynasty capital)

curl "https://edops.computingplace.org/api/signature?lat=34.8&lon=114.3&bands=ABCT&from_year=960&to_year=1127"

Bands A, B, T — Timbuktu, medieval period

curl "https://edops.computingplace.org/api/signature?lat=16.77&lon=-3.01&bands=ABT&from_year=1200&to_year=1600"

Regional scale — Level 6

curl "https://edops.computingplace.org/api/signature?lat=34.8&lon=114.3&bands=ABC&level=6"

Flat mode — all fields as top-level keys

curl "https://edops.computingplace.org/api/signature?lat=16.77&lon=-3.01&bands=ABCDE&flat=true"

Notes for Application Developers


EDOPS is part of the Computing Place research initiative. Contact: email. Full interactive schema: edops.computingplace.org/docs. Machine-readable schema: edops_schema.json.