GET /climate/point

Returns historical climate variables for one GPS point and one date: 2 m temperature, total precipitation and 10 m wind, served from ERA5 reanalysis data decoded from GRIB into a local grid store. The runtime lookup is local, so a covered point resolves in milliseconds without an account or API key.

This is useful when an agent needs climate evidence it cannot regenerate from text alone: insurance parametric checks, agriculture analysis, energy planning or logistics decisions tied to a dated location. See the live /catalog for the authoritative endpoint listing and price.

x402 golden rule: the agent pays for the answer to its question. A well-formed and covered request is a successful answer -> 200, even when a requested variable is null because the grid cell has a data gap. Requests the service cannot answer - invalid coordinates, invalid date, an uncovered date or an unknown variable - leave the 200 range.

Parameters

ParameterTypeRequiredDescription
latnumberyesLatitude in decimal degrees, from -90 to 90
lonnumberyesLongitude in decimal degrees, from -180 to 180
datestringyesUTC date to query, format YYYY-MM-DD
variablesstringnoComma-separated subset of temperature, precipitation, wind; all by default
GET /climate/point?lat=48.8566&lon=2.3522&date=2024-07-14

Use variables to reduce the payload when the agent only needs one family:

GET /climate/point?lat=48.8566&lon=2.3522&date=2024-07-14&variables=temperature,wind

200 response - UnifiedResponse

{
  "data": { ... },
  "provenance": {
    "source": "era5-copernicus",
    "fetched_at": "2026-06-20T12:00:00Z",
    "freshness": { "kind": "snapshot", "as_of": "2026-06-19T00:00:00Z" }
  }
}
  • provenance.source: stable identifier of the served store source, typically era5-copernicus.
  • freshness.kind: snapshot for ERA5 reanalysis; as_of is the store production date that backed the answer.
  • ERA5 values are derived from Copernicus Climate Change Service information.

Fields of data

FieldTypeDescription
latnumberLatitude exactly echoed from the request
lonnumberLongitude exactly echoed from the request
datestringDate exactly echoed in YYYY-MM-DD form
temperatureobjectRequested 2 m temperature; omitted when not requested
precipitationobjectRequested total precipitation; omitted when not requested
windobjectRequested 10 m wind; omitted when not requested
gridobjectEffective grid cell used for the answer; omitted if no cell served
coverageobjectCompleteness marker for the requested variables

temperature

FieldTypeDescription
celsiusnumber | null2 m temperature in Celsius

precipitation

FieldTypeDescription
total_mmnumber | nullDaily total precipitation in millimetres

wind

FieldTypeDescription
speed_msnumber | null10 m wind speed in metres per second
direction_degnumber | nullMeteorological direction in degrees: 0 = north, 90 = east

grid

FieldTypeDescription
latnumberLatitude of the representative grid cell
lonnumberLongitude of the representative grid cell
distance_kmnumberDistance from the requested point to that cell

coverage

coverage tells the agent whether every requested variable was actually available at the served grid cell.

FieldTypeDescription
completebooltrue when all requested variables have values
reasonstringPresent when complete: false, naming the missing family data

Example - covered point

{
  "data": {
    "lat": 48.8566,
    "lon": 2.3522,
    "date": "2024-07-14",
    "temperature": { "celsius": 22.4 },
    "precipitation": { "total_mm": 1.2 },
    "wind": { "speed_ms": 4.8, "direction_deg": 216.9 },
    "grid": { "lat": 48.75, "lon": 2.25, "distance_km": 13.42 },
    "coverage": { "complete": true }
  },
  "provenance": {
    "source": "era5-copernicus",
    "fetched_at": "2026-06-20T12:00:00Z",
    "freshness": { "kind": "snapshot", "as_of": "2026-06-19T00:00:00Z" }
  }
}

Example - covered date, missing variable value

A requested date can be covered while a grid cell still has a missing value for one family. That remains a successful answer: the value is null and coverage.complete explains the gap.

{
  "data": {
    "lat": 48.8566,
    "lon": 2.3522,
    "date": "2024-07-14",
    "temperature": { "celsius": null },
    "precipitation": { "total_mm": 1.2 },
    "wind": { "speed_ms": 4.8, "direction_deg": 216.9 },
    "grid": { "lat": 48.75, "lon": 2.25, "distance_km": 13.42 },
    "coverage": {
      "complete": false,
      "reason": "no data at this grid cell for: temperature"
    }
  },
  "provenance": {
    "source": "era5-copernicus",
    "fetched_at": "2026-06-20T12:00:00Z",
    "freshness": { "kind": "snapshot", "as_of": "2026-06-19T00:00:00Z" }
  }
}

Coverage honesty

ERA5 is a gridded reanalysis, not a weather station reading. The response is the nearest or interpolated grid value for the served cell, with a typical global mesh of about 0.25 degrees. Daily values are aggregate values from the store, not sub-hourly observations.

The historical window is finite and moves with the ingested store. A date inside that window can return 200 with null values and coverage.complete: false when the grid has a local gap. A date outside the window returns 400 OUT_OF_RANGE, because the service cannot answer the request.

Errors

Only requests the service cannot answer leave the 200 range.

StatuscodeCase
400INVALID_COORDSlat/lon missing, non-numeric or outside valid bounds
400INVALID_DATEdate missing or not formatted as YYYY-MM-DD
400OUT_OF_RANGERequested date is outside the covered store window
400INVALID_VARIABLEvariables contains a family outside the supported set
500INTERNALInternal error (detail logged, not exposed)
{ "error": "invalid date '14-07-2024', expected YYYY-MM-DD", "code": "INVALID_DATE" }
{ "error": "requested date is outside the covered window 2021-01-01..2026-06-20", "code": "OUT_OF_RANGE" }

See also

  • GET /weather/forecast - point weather forecast from GFS, for future dates and lead times.
  • For agents - discovery surfaces, the live /catalog and how settlement works.