API reference

Weather data, one request away

A hosted REST API over high-resolution weather models. Read datapoints for a set of parameters, coordinates and datetimes, and discover what is available — all with a single API key.

version 3f0209cd or open llm.txt →

Overview

Every request is authenticated with your API key and returns JSON. The base URL is:

base url
https://api.daas.serenodata.com

The billable unit is the datapoint: one parameter, at one coordinate, for one datetime. A request for 2 parameters × 1 coordinate × 1 datetime reads 2 datapoints. Values are decoded to one decimal, and a missing value is returned as null.

Authentication

Pass your key in the x-api-key header on every request. Create and rotate keys from your space. A missing or unknown key is rejected with 401.

header
x-api-key: $YOUR_API_KEY

Rate limits and quotas

  • Per request: up to 100,000 datapoints (parameters × coordinates × datetimes). A larger request is rejected with 413.
  • Rate: roughly 1 request per second per key (short bursts absorbed), on top of a per-IP guard. Exceeding it returns 429; retry after a moment.
  • Monthly quota: your plan's datapoint allowance, resetting at the start of each UTC month, with a 5% grace band before requests are refused. The welcome-gift and any extra-usage pool are drawn after the monthly allowance.

Each response's stats block reports your standing (quota used and remaining, extra-usage used by the request and remaining in the pool) so you can track consumption inline.

Errors

Errors return the matching HTTP status and a JSON body with a short error message. On the datapoints endpoint the body also carries a request_id; it is returned on every response as the X-Request-Id header too. Quote it if you contact support. An unexpected internal error is reported generically as internal error — the detail is in our logs, keyed by the request id.

json
{
  "error": "coordinate out of bounds: lat 60, lon 5",
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}
StatusMeaning
400malformed or invalid request
401missing or unknown API key
403quota exceeded, or the subscription is not serving
404unknown provider or dataset
413more than 100,000 datapoints requested
429rate limit exceeded
500internal error

Parameters

Request parameters by their short code. Wind and gust are given as speed and direction.

CodeParameterUnit
t2mtemperature at 2 m°C
rh2mrelative humidity at 2 m%
spsurface pressure (at ground level)hPa
ws10mwind speed at 10 mm/s
wd10mwind direction at 10 mdegree
gs10mgust speed at 10 mm/s
gd10mgust direction at 10 mdegree
rrrainfallmm

Read datapoints

POST /v1/providers/mf/datasets/arome-001/datapoints

Send a set of parameters, coordinates and datetimes. The response is columnar: the axes plus a flat values array, in parameter-major order (then coordinate, then datetime). Coordinates are snapped to the nearest 0.01° grid cell; a coordinate off the grid is rejected with 400.

Selecting datetimes

Datetimes are RFC3339, in UTC, on the hour. Give them in one of three forms (a range is inclusive, expanded hourly):

single
{ "datetime": "2026-07-06T12:00:00Z" }
set
{ "datetime": ["2026-07-06T00:00:00Z", "2026-07-06T06:00:00Z"] }
range
{ "from": "2026-07-06T00:00:00Z", "to": "2026-07-06T23:00:00Z" }

Request

curl -X POST "https://api.daas.serenodata.com/v1/providers/mf/datasets/arome-001/datapoints" \
  -H "x-api-key: $YOUR_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "parameters": ["t2m", "rr"],
    "coordinates": [{ "lat": 48.8566, "lon": 2.3522 }],
    "datetimes": { "datetime": ["2026-07-06T12:00:00Z"] }
  }'

Response

json
{
  "data": {
    "parameters": ["t2m", "rr"],
    "coordinates": [{ "lat": 48.8566, "lon": 2.3522 }],
    "datetimes": ["2026-07-06T12:00:00Z"],
    "values": [24.3, 0.0]
  },
  "stats": {
    "request_id": "550e8400-e29b-41d4-a716-446655440000",
    "requested": 2,
    "effective": 2,
    "missing": 0,
    "chunks_read": 2,
    "bytes_read": 960000,
    "quota_used_this_period": 42,
    "quota_remaining": 3999958,
    "extra_usage_used": 0,
    "extra_usage_remaining": 24000,
    "req_timestamp": "2026-07-06T12:00:00Z",
    "resp_timestamp": "2026-07-06T12:00:00.612Z",
    "execution_duration_ms": 612.0
  }
}

The stats block reports the request id, the requested/effective/missing counts, the read cost (chunks and bytes), your quota standing, and timing.

Discover what is available

The discovery endpoints describe the catalogue. Each response carries metadata and _links to related resources, so you can navigate from providers to datasets to a dataset's datapoints. They are keyed with the same API key.

Providers

GET /v1/providers

curl "https://api.daas.serenodata.com/v1/providers" \
  -H "x-api-key: $YOUR_API_KEY"
json
{
  "providers": [
    {
      "id": "mf",
      "name": "Météo-France",
      "availability": "available",
      "_links": { "datasets": { "href": "/v1/providers/mf/datasets" } }
    },
    {
      "id": "dwd",
      "name": "Deutscher Wetterdienst",
      "availability": "planned",
      "_links": { "datasets": { "href": "/v1/providers/dwd/datasets" } }
    },
    {
      "id": "ecmwf",
      "name": "ECMWF",
      "availability": "planned",
      "_links": { "datasets": { "href": "/v1/providers/ecmwf/datasets" } }
    }
  ],
  "_links": { "self": { "href": "/v1/providers" } }
}

Datasets of a provider

GET /v1/providers/{provider}/datasets

curl "https://api.daas.serenodata.com/v1/providers/mf/datasets" \
  -H "x-api-key: $YOUR_API_KEY"
json
{
  "provider": "mf",
  "provider_name": "Météo-France",
  "datasets": [
    {
      "id": "arome-001",
      "name": "AROME 0.01°",
      "availability": "available",
      "_links": {
        "self": { "href": "/v1/providers/mf/datasets/arome-001" },
        "datapoints": { "href": "/v1/providers/mf/datasets/arome-001/datapoints" }
      }
    },
    {
      "id": "arome-ens-0025",
      "name": "AROME ensemble 0.025°",
      "availability": "planned",
      "_links": { "self": { "href": "/v1/providers/mf/datasets/arome-ens-0025" } }
    }
  ],
  "_links": {
    "self": { "href": "/v1/providers/mf/datasets" },
    "providers": { "href": "/v1/providers" }
  }
}

Dataset descriptor

GET /v1/providers/{provider}/datasets/{dataset}

The descriptor lists the dataset's parameters, coverage and timesteps, and links to its datapoints endpoint when the dataset is served. The exact coverage polygon is on its way; for now the bounding box gives the coarse extent.

curl "https://api.daas.serenodata.com/v1/providers/mf/datasets/arome-001" \
  -H "x-api-key: $YOUR_API_KEY"
json
{
  "provider": "mf",
  "provider_name": "Météo-France",
  "id": "arome-001",
  "name": "AROME 0.01°",
  "availability": "available",
  "description": "Météo-France AROME high-resolution model at 0.01° over Western Europe.",
  "parameters": [
    { "code": "t2m", "name": "temperature at 2 m", "unit": "°C" },
    { "code": "rh2m", "name": "relative humidity at 2 m", "unit": "%" },
    { "code": "sp", "name": "surface pressure (at ground level)", "unit": "hPa" },
    { "code": "ws10m", "name": "wind speed at 10 m", "unit": "m/s" },
    { "code": "wd10m", "name": "wind direction at 10 m", "unit": "degree" },
    { "code": "gs10m", "name": "gust speed at 10 m", "unit": "m/s" },
    { "code": "gd10m", "name": "gust direction at 10 m", "unit": "degree" },
    { "code": "rr", "name": "rainfall", "unit": "mm" }
  ],
  "coverage": {
    "bounding_box": {
      "min_latitude": 37.5,
      "max_latitude": 55.4,
      "min_longitude": -12.0,
      "max_longitude": 16.0
    },
    "geojson": "Exact geojson definition coming soon...",
    "note": "Bounding box of the model grid; the exact data domain is smaller and will be published as GeoJSON."
  },
  "timesteps": {
    "granularity": "hourly",
    "alignment": "on the hour, UTC",
    "format": "RFC3339 UTC, e.g. 2026-06-26T00:00:00Z",
    "selection": {
      "single": "one datetime",
      "set": "a list of datetimes",
      "range": "an inclusive hourly range"
    }
  },
  "licence": {
    "name": "Licence Ouverte / Open Licence 1.0",
    "url": "https://www.etalab.gouv.fr/wp-content/uploads/2014/05/Licence_Ouverte.pdf",
    "producer": "Météo-France",
    "attribution": "Attribute Météo-France and the data date (the datetime you queried) when you display or redistribute this data."
  },
  "_links": {
    "self": { "href": "/v1/providers/mf/datasets/arome-001" },
    "datasets": { "href": "/v1/providers/mf/datasets" },
    "datapoints": { "href": "/v1/providers/mf/datasets/arome-001/datapoints" }
  }
}

Dataset catalogue

AROME 0.01° is live today. The rest are on the roadmap and already appear in discovery, marked planned.

ProviderDatasetNameStatus
mfarome-001AROME 0.01°available
mfarome-ens-0025AROME ensemble 0.025°planned
dwdicon-eu-00625ICON-EU 0.0625°planned
dwdicon-01ICON 0.1°planned
ecmwfifs-025IFS 0.25°planned
ecmwfifs-01IFS 0.1°planned · premium yearly / enterprise
enfrdees