{
  "manifestVersion": 1,
  "dataset": {
    "id": "open-meteo-daily",
    "name": "Daily city weather forecasts",
    "description": "A daily snapshot of the Open-Meteo weather forecast for a fixed panel of eight major world cities: temperature, precipitation, wind, UV and sunrise/sunset for every day of the forecast horizon, recorded as of the day it was published. Because each run keeps what was forecast on that day, the series can be used to study how forecasts change as the target day approaches.",
    "sourceUrl": "https://open-meteo.com/en/docs",
    "license": {
      "id": "CC-BY-4.0",
      "name": "Creative Commons Attribution 4.0 International",
      "url": "https://open-meteo.com/en/licence",
      "attribution": "Weather data by Open-Meteo.com",
      "notes": "Open-Meteo publishes its API data under CC-BY-4.0 and asks that a link to https://open-meteo.com/ appear next to any display of the data; its source code is AGPL-3.0, which does not apply here. The free tier is non-commercial and rate limited to under 10,000 calls per day, 5,000 per hour and 600 per minute — this connector uses one call per run. Open-Meteo aggregates national weather services (DWD, ECMWF, NOAA, Met Norway, MeteoSwiss, KNMI, DMI, BOM, CMA, JMA and others); most are CC-BY or CC-BY-SA and some, notably NOAA and the JMA, publish under their own terms, so a reuser must honour those upstream attributions as well. What we publish is a derived work: the daily aggregations listed in api.ts, for eight fixed coordinates, reshaped into rows. These are model forecasts, not observations, and must not be presented as measurements."
    },
    "cadence": "daily",
    "tags": [
      "weather",
      "forecast",
      "climate",
      "cities",
      "open-meteo",
      "daily"
    ]
  },
  "ingest": {
    "id": "01M0NH25E3QSH5TCFXMRTAR9X0",
    "startedAt": "2026-08-22T20:02:15.107Z",
    "snapshotDate": "2026-08-22",
    "catalogSnapshotId": 4,
    "params": {
      "forecastDays": 7
    }
  },
  "baseUrl": "https://data-directory.fsn1.your-objectstorage.com/public/open-meteo-daily",
  "catalog": {
    "url": "https://data-directory.fsn1.your-objectstorage.com/catalog/open-meteo-daily/v/01M0NH25E3QSH5TCFXMRTAR9X0/catalog.ducklake",
    "latestUrl": "https://data-directory.fsn1.your-objectstorage.com/catalog/open-meteo-daily/catalog.ducklake",
    "sha256": "dd3036e2469184bf4018be74283b76cd9e2b46e022c3d55ad906aaa8316b8a35",
    "duckdbVersion": "v1.5.5",
    "attachExample": "ATTACH 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/open-meteo-daily/catalog.ducklake' AS lake (READ_ONLY); SELECT * FROM lake.main.daily_weather LIMIT 5;"
  },
  "tables": [
    {
      "name": "daily_weather",
      "description": "One row per city per forecast day, as of the run day. A full daily snapshot of the forecast horizon: re-running a day rewrites exactly that day for exactly those cities, so the history of what was forecast when is preserved and comparable.",
      "rowCount": 56,
      "totalBytes": 5527,
      "sortBy": [
        "snapshot_date",
        "city_id",
        "forecast_date"
      ],
      "searchColumns": [],
      "primaryKey": [
        "snapshot_date",
        "city_id",
        "forecast_date"
      ],
      "writeMode": "snapshot_history",
      "columns": [
        {
          "name": "snapshot_date",
          "type": "DATE",
          "nullable": false,
          "description": "The run day (UTC) this forecast was captured on.",
          "min": "2026-08-22",
          "max": "2026-08-22",
          "distinctApprox": 1
        },
        {
          "name": "city_id",
          "type": "INTEGER",
          "nullable": false,
          "description": "Our stable id for the city; joins to cities.city_id.",
          "min": 1,
          "max": 8,
          "distinctApprox": 9
        },
        {
          "name": "forecast_date",
          "type": "DATE",
          "nullable": false,
          "description": "The day (UTC) this row describes.",
          "min": "2026-08-22",
          "max": "2026-08-28",
          "distinctApprox": 7
        },
        {
          "name": "lead_days",
          "type": "INTEGER",
          "nullable": false,
          "description": "forecast_date minus snapshot_date, in whole days. 0 is today, 1 is tomorrow. Lets you compare a forecast against the same day observed later.",
          "unit": "days"
        },
        {
          "name": "weather_code",
          "type": "INTEGER",
          "nullable": true,
          "description": "WMO 4677 weather code for the day (0 clear … 95+ thunderstorm)."
        },
        {
          "name": "temperature_max",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Highest 2 m air temperature of the day.",
          "unit": "°C"
        },
        {
          "name": "temperature_min",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Lowest 2 m air temperature of the day.",
          "unit": "°C"
        },
        {
          "name": "temperature_mean",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Mean 2 m air temperature of the day.",
          "unit": "°C"
        },
        {
          "name": "precipitation_sum",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Total precipitation (rain + showers + snow water equivalent).",
          "unit": "mm"
        },
        {
          "name": "rain_sum",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Rain only, excluding snow.",
          "unit": "mm"
        },
        {
          "name": "snowfall_sum",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Snowfall, as fresh snow depth rather than water equivalent.",
          "unit": "cm"
        },
        {
          "name": "precipitation_hours",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Hours of the day with measurable precipitation.",
          "unit": "h"
        },
        {
          "name": "wind_speed_max",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Highest 10 m wind speed of the day.",
          "unit": "km/h"
        },
        {
          "name": "wind_gusts_max",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Highest 10 m wind gust of the day.",
          "unit": "km/h"
        },
        {
          "name": "wind_direction_dominant",
          "type": "INTEGER",
          "nullable": true,
          "description": "Dominant 10 m wind direction, meteorological convention (0 = from the north, 90 = from the east). Rounded to whole degrees.",
          "unit": "°"
        },
        {
          "name": "uv_index_max",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Highest UV index of the day."
        },
        {
          "name": "sunrise",
          "type": "TIMESTAMPTZ",
          "nullable": true,
          "description": "Sunrise instant. The request pins timezone=UTC, so the naive local time the API returns is UTC and is stored as such."
        },
        {
          "name": "sunset",
          "type": "TIMESTAMPTZ",
          "nullable": true,
          "description": "Sunset instant, on the same UTC basis as sunrise."
        },
        {
          "name": "ingested_at",
          "type": "TIMESTAMP",
          "nullable": false,
          "description": "When this row was produced by the ingest run (UTC)."
        }
      ],
      "files": [
        {
          "url": "https://data-directory.fsn1.your-objectstorage.com/public/open-meteo-daily/v/01M0NH25E3QSH5TCFXMRTAR9X0/daily_weather.parquet",
          "sizeBytes": 5527,
          "rowCount": 56,
          "etag": "\"02692b9d12bf482c304e002bce171198\"",
          "stats": {
            "snapshot_date": {
              "min": "2026-08-22",
              "max": "2026-08-22"
            },
            "city_id": {
              "min": 1,
              "max": 8
            },
            "forecast_date": {
              "min": "2026-08-22",
              "max": "2026-08-28"
            }
          }
        }
      ],
      "example": [
        {
          "snapshot_date": "2026-08-22T00:00:00.000Z",
          "city_id": 1,
          "forecast_date": "2026-08-22T00:00:00.000Z",
          "lead_days": 0,
          "weather_code": 3,
          "temperature_max": 21.9,
          "temperature_min": 12.6,
          "temperature_mean": 17.8,
          "precipitation_sum": 0,
          "rain_sum": 0,
          "snowfall_sum": 0,
          "precipitation_hours": 0,
          "wind_speed_max": 12.2,
          "wind_gusts_max": 25.9,
          "wind_direction_dominant": 21,
          "uv_index_max": 4.75,
          "sunrise": "2026-08-22T04:57:00.000Z",
          "sunset": "2026-08-22T19:09:00.000Z",
          "ingested_at": "2026-08-22T20:02:15.107Z"
        },
        {
          "snapshot_date": "2026-08-22T00:00:00.000Z",
          "city_id": 1,
          "forecast_date": "2026-08-23T00:00:00.000Z",
          "lead_days": 1,
          "weather_code": 2,
          "temperature_max": 23.8,
          "temperature_min": 15.9,
          "temperature_mean": 19.6,
          "precipitation_sum": 0,
          "rain_sum": 0,
          "snowfall_sum": 0,
          "precipitation_hours": 0,
          "wind_speed_max": 15.8,
          "wind_gusts_max": 35.6,
          "wind_direction_dominant": 128,
          "uv_index_max": 3.4,
          "sunrise": "2026-08-23T04:59:00.000Z",
          "sunset": "2026-08-23T19:07:00.000Z",
          "ingested_at": "2026-08-22T20:02:15.107Z"
        }
      ]
    },
    {
      "name": "cities",
      "description": "The fixed panel of cities the forecast is collected for: our own stable id, the requested city-centre coordinates, and the model grid point Open-Meteo actually answered from. Reference data with no history — every run replaces it wholesale.",
      "rowCount": 8,
      "totalBytes": 2169,
      "sortBy": [
        "city_id"
      ],
      "searchColumns": [
        "name"
      ],
      "primaryKey": [
        "city_id"
      ],
      "writeMode": "replace",
      "columns": [
        {
          "name": "city_id",
          "type": "INTEGER",
          "nullable": false,
          "description": "Stable id of the city. Ours, not Open-Meteo’s; never reused.",
          "min": 1,
          "max": 8,
          "distinctApprox": 9
        },
        {
          "name": "name",
          "type": "VARCHAR",
          "nullable": false,
          "description": "City name as displayed."
        },
        {
          "name": "name_lc",
          "type": "VARCHAR",
          "nullable": false,
          "description": "name, lowercased and accent-folded. The prefix-search column — “sao paulo” must find “São Paulo”."
        },
        {
          "name": "country",
          "type": "VARCHAR",
          "nullable": false,
          "description": "Country name as displayed."
        },
        {
          "name": "country_code",
          "type": "VARCHAR",
          "nullable": false,
          "description": "ISO 3166-1 alpha-2 country code."
        },
        {
          "name": "latitude",
          "type": "DOUBLE",
          "nullable": false,
          "description": "Requested city-centre latitude (WGS84).",
          "unit": "°"
        },
        {
          "name": "longitude",
          "type": "DOUBLE",
          "nullable": false,
          "description": "Requested city-centre longitude (WGS84).",
          "unit": "°"
        },
        {
          "name": "grid_latitude",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Latitude of the model grid cell Open-Meteo actually answered from. NULL when the last run could not read it.",
          "unit": "°"
        },
        {
          "name": "grid_longitude",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Longitude of the model grid cell that answered.",
          "unit": "°"
        },
        {
          "name": "elevation",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Elevation of the grid cell above sea level.",
          "unit": "m"
        },
        {
          "name": "timezone",
          "type": "VARCHAR",
          "nullable": true,
          "description": "Timezone the API reported for the answer. Always UTC/GMT here."
        }
      ],
      "files": [
        {
          "url": "https://data-directory.fsn1.your-objectstorage.com/public/open-meteo-daily/v/01M0NH25E3QSH5TCFXMRTAR9X0/cities.parquet",
          "sizeBytes": 2169,
          "rowCount": 8,
          "etag": "\"f68808fbbec6961c5b5247cd7436e95d\"",
          "stats": {
            "city_id": {
              "min": 1,
              "max": 8
            }
          }
        }
      ],
      "example": [
        {
          "city_id": 1,
          "name": "London",
          "name_lc": "london",
          "country": "United Kingdom",
          "country_code": "GB",
          "latitude": 51.5072,
          "longitude": -0.1276,
          "grid_latitude": 51.51147,
          "grid_longitude": -0.13078308,
          "elevation": 16,
          "timezone": "GMT"
        },
        {
          "city_id": 2,
          "name": "New York",
          "name_lc": "new york",
          "country": "United States",
          "country_code": "US",
          "latitude": 40.7128,
          "longitude": -74.006,
          "grid_latitude": 40.710335,
          "grid_longitude": -73.99308,
          "elevation": 32,
          "timezone": "GMT"
        }
      ]
    }
  ],
  "queryHints": {
    "examples": [
      {
        "title": "Today’s forecast for every city",
        "sql": "SELECT c.name, w.forecast_date, w.temperature_min, w.temperature_max, w.precipitation_sum\nFROM daily_weather w\nJOIN cities c USING (city_id)\nWHERE w.snapshot_date = (SELECT max(snapshot_date) FROM daily_weather)\n  AND w.lead_days = 0\nORDER BY w.temperature_max DESC;",
        "description": "Joins the fact table to the dimension. The snapshot_date range is what prunes: it is the leading sort column."
      },
      {
        "title": "How the forecast for one day drifted as it got closer",
        "sql": "SELECT w.snapshot_date, w.lead_days, w.temperature_max\nFROM daily_weather w\nJOIN cities c USING (city_id)\nWHERE c.name_lc = 'tokyo'\n  AND w.forecast_date = DATE '2026-08-28'\nORDER BY w.lead_days DESC;",
        "description": "Every run keeps its own view of the future, so a single forecast_date has one row per lead time."
      },
      {
        "title": "Wettest city of each run day",
        "sql": "SELECT w.snapshot_date, c.name, sum(w.precipitation_sum) AS mm\nFROM daily_weather w JOIN cities c USING (city_id)\nGROUP BY 1, 2 QUALIFY row_number() OVER (PARTITION BY w.snapshot_date ORDER BY mm DESC) = 1\nORDER BY 1 DESC;"
      }
    ]
  },
  "generatedAt": "2026-08-22T20:02:21.327Z"
}
