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.
Overview
Every request is authenticated with your API key and returns JSON. The base URL is:
https://api.daas.serenodata.comThe 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.
x-api-key: $YOUR_API_KEYRate 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.
{
"error": "coordinate out of bounds: lat 60, lon 5",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}| Status | Meaning |
|---|---|
| 400 | malformed or invalid request |
| 401 | missing or unknown API key |
| 403 | quota exceeded, or the subscription is not serving |
| 404 | unknown provider or dataset |
| 413 | more than 100,000 datapoints requested |
| 429 | rate limit exceeded |
| 500 | internal error |
Parameters
Request parameters by their short code. Wind and gust are given as speed and direction.
| Code | Parameter | Unit |
|---|---|---|
| t2m | temperature at 2 m | °C |
| rh2m | relative humidity at 2 m | % |
| sp | surface pressure (at ground level) | hPa |
| ws10m | wind speed at 10 m | m/s |
| wd10m | wind direction at 10 m | degree |
| gs10m | gust speed at 10 m | m/s |
| gd10m | gust direction at 10 m | degree |
| rr | rainfall | mm |
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):
{ "datetime": "2026-07-06T12:00:00Z" }{ "datetime": ["2026-07-06T00:00:00Z", "2026-07-06T06:00:00Z"] }{ "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
{
"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"{
"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"{
"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"{
"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.
| Provider | Dataset | Name | Status |
|---|---|---|---|
| mf | arome-001 | AROME 0.01° | available |
| mf | arome-ens-0025 | AROME ensemble 0.025° | planned |
| dwd | icon-eu-00625 | ICON-EU 0.0625° | planned |
| dwd | icon-01 | ICON 0.1° | planned |
| ecmwf | ifs-025 | IFS 0.25° | planned |
| ecmwf | ifs-01 | IFS 0.1° | planned · premium yearly / enterprise |