{
  "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 the world’s cities — every national or territorial capital plus every city of 200,000 people or more, about 3,200 in all: 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.",
    "descriptions": {
      "ro": "O imagine zilnică a prognozei meteo Open-Meteo pentru un grup fix de orașe din întreaga lume — toate capitalele naționale și teritoriale, precum și toate orașele cu cel puțin 200.000 de locuitori, aproximativ 3.200 în total. Datele includ temperatura, precipitațiile, vântul, indicele UV și orele răsăritului și apusului pentru fiecare zi din intervalul prognozat. Valorile sunt păstrate așa cum au fost publicate în ziua fiecărei rulări. Fiecare rulare păstrează prognoza publicată în acea zi, astfel încât seria arată cum se schimbă prognozele pe măsură ce se apropie ziua vizată.",
      "en": "A daily snapshot of the Open-Meteo weather forecast for a fixed panel of the world’s cities — every national or territorial capital plus every city of 200,000 people or more, about 3,200 in all: 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."
    },
    "names": {
      "ro": "Prognoze meteo zilnice pentru orașe",
      "en": "Daily city weather forecasts"
    },
    "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 600 calls per minute, 5,000 per hour, 10,000 per day and 300,000 per month, where a call is weighted by the data requested — 14 variables means 1.4 calls per city, so one daily run of this panel costs about 4,450 of the 10,000, and the panel is deliberately sized to fit that. 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. The city panel itself (names, countries and coordinates) is derived from the GeoNames gazetteer (https://www.geonames.org/, CC-BY-4.0), which requires its own attribution. What we publish is a derived work: the daily aggregations listed in api.ts, for a fixed panel of city 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"
    ],
    "sources": []
  },
  "ingest": {
    "id": "01M62KXD7RF4GPRWBYRNAQHMM1",
    "startedAt": "2026-10-29T01:20:41.720Z",
    "snapshotDate": "2026-10-29",
    "catalogSnapshotId": 26,
    "params": {
      "forecastDays": 7
    }
  },
  "baseUrl": "https://date-deschise-s3.bunnytech.app/public/open-meteo-daily",
  "catalog": {
    "url": "https://date-deschise-s3.bunnytech.app/catalog/open-meteo-daily/v/01M62KXD7RF4GPRWBYRNAQHMM1/catalog.ducklake",
    "latestUrl": "https://date-deschise-s3.bunnytech.app/catalog/open-meteo-daily/catalog.ducklake",
    "sha256": "80586e6a275c3148939e33ef1d3ca841d63b6353c250546478cea92ab701b72d",
    "duckdbVersion": "v1.5.5",
    "attachExample": "ATTACH 'ducklake:https://date-deschise-s3.bunnytech.app/catalog/open-meteo-daily/catalog.ducklake' AS lake (READ_ONLY); SELECT * FROM lake.main.daily_weather LIMIT 5;"
  },
  "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;"
      }
    ]
  },
  "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.",
      "descriptions": {
        "ro": "Câte un rând pentru fiecare oraș și fiecare zi prognozată, cu prognoza disponibilă la data rulării. Tabelul păstrează o imagine zilnică completă a întregului interval prognozat. Repetarea rulării pentru o anumită zi înlocuiește numai datele acelei zile și numai pentru orașele respective. Astfel, se păstrează un istoric care arată ce s-a prognozat și în ce zi, iar prognozele pot fi comparate.",
        "en": "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": 267176,
      "lastRunRows": 22232,
      "totalBytes": 3955748,
      "sortBy": [
        "snapshot_date",
        "city_id",
        "forecast_date"
      ],
      "searchColumns": [],
      "primaryKey": [
        "snapshot_date",
        "city_id",
        "forecast_date"
      ],
      "writeMode": "snapshot_history",
      "storage": "lake",
      "columns": [
        {
          "name": "snapshot_date",
          "type": "DATE",
          "nullable": false,
          "description": "The run day (UTC) this forecast was captured on.",
          "descriptions": {
            "ro": "Data rulării, în UTC, la care a fost preluată această prognoză.",
            "en": "The run day (UTC) this forecast was captured on."
          },
          "min": "2026-08-22",
          "max": "2026-10-29",
          "distinctApprox": 20
        },
        {
          "name": "city_id",
          "type": "INTEGER",
          "nullable": false,
          "description": "Our stable id for the city; joins to cities.city_id.",
          "descriptions": {
            "ro": "Identificatorul stabil pe care îl folosim pentru oraș; face legătura cu cities.city_id.",
            "en": "Our stable id for the city; joins to cities.city_id."
          },
          "min": 1,
          "max": 3176,
          "distinctApprox": 3219
        },
        {
          "name": "forecast_date",
          "type": "DATE",
          "nullable": false,
          "description": "The day (UTC) this row describes.",
          "descriptions": {
            "ro": "Ziua, în UTC, la care se referă acest rând.",
            "en": "The day (UTC) this row describes."
          },
          "min": "2026-08-22",
          "max": "2026-11-04",
          "distinctApprox": 39
        },
        {
          "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.",
          "descriptions": {
            "ro": "Diferența dintre forecast_date și snapshot_date, exprimată în zile întregi. Valoarea 0 înseamnă astăzi, iar 1 înseamnă mâine. Această coloană permite compararea prognozei cu datele observate ulterior pentru aceeași zi.",
            "en": "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).",
          "descriptions": {
            "ro": "Codul meteo WMO 4677 pentru ziua respectivă (0 = senin … 95+ = furtună cu descărcări electrice).",
            "en": "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.",
          "descriptions": {
            "ro": "Cea mai ridicată temperatură a aerului la înălțimea de 2 m în ziua respectivă.",
            "en": "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.",
          "descriptions": {
            "ro": "Cea mai scăzută temperatură a aerului la înălțimea de 2 m în ziua respectivă.",
            "en": "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.",
          "descriptions": {
            "ro": "Temperatura medie a aerului la înălțimea de 2 m în ziua respectivă.",
            "en": "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).",
          "descriptions": {
            "ro": "Cantitatea totală de precipitații (ploaie + averse + echivalentul în apă al zăpezii).",
            "en": "Total precipitation (rain + showers + snow water equivalent)."
          },
          "unit": "mm"
        },
        {
          "name": "rain_sum",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Rain only, excluding snow.",
          "descriptions": {
            "ro": "Cantitatea provenită numai din ploaie, fără averse sau zăpadă.",
            "en": "Rain only, excluding snow."
          },
          "unit": "mm"
        },
        {
          "name": "snowfall_sum",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Snowfall, as fresh snow depth rather than water equivalent.",
          "descriptions": {
            "ro": "Cantitatea de zăpadă căzută, exprimată prin grosimea stratului de zăpadă proaspătă, nu prin echivalentul în apă.",
            "en": "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.",
          "descriptions": {
            "ro": "Câte ore din zi au avut precipitații măsurabile.",
            "en": "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.",
          "descriptions": {
            "ro": "Cea mai mare viteză a vântului la înălțimea de 10 m în ziua respectivă.",
            "en": "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.",
          "descriptions": {
            "ro": "Cea mai puternică rafală de vânt la înălțimea de 10 m în ziua respectivă.",
            "en": "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.",
          "descriptions": {
            "ro": "Direcția dominantă a vântului la înălțimea de 10 m, conform convenției folosite în meteorologie (0 = vânt dinspre nord, 90 = vânt dinspre est). Valoarea este rotunjită la grade întregi.",
            "en": "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.",
          "descriptions": {
            "ro": "Cea mai mare valoare a indicelui UV din ziua respectivă.",
            "en": "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.",
          "descriptions": {
            "ro": "Momentul răsăritului. Cererea folosește timezone=UTC, iar ora locală returnată de API nu conține informații despre fusul orar. Prin urmare, ora este în UTC și este stocată ca atare.",
            "en": "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.",
          "descriptions": {
            "ro": "Momentul apusului, exprimat în UTC la fel ca răsăritul.",
            "en": "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).",
          "descriptions": {
            "ro": "Momentul, în UTC, în care rularea de preluare a datelor a produs acest rând.",
            "en": "When this row was produced by the ingest run (UTC)."
          }
        }
      ],
      "files": [
        {
          "url": "https://date-deschise-s3.bunnytech.app/public/open-meteo-daily/v/01M62KXD7RF4GPRWBYRNAQHMM1/daily_weather.parquet",
          "sizeBytes": 3955748,
          "rowCount": 267176,
          "etag": "\"5f2ae23b3b4ec60f0246ee4c7542f39b\"",
          "stats": {
            "snapshot_date": {
              "min": "2026-08-22",
              "max": "2026-10-29"
            },
            "city_id": {
              "min": 1,
              "max": 3176
            },
            "forecast_date": {
              "min": "2026-08-22",
              "max": "2026-11-04"
            }
          }
        }
      ],
      "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 — every national or territorial capital plus every city of 200,000 people or more: 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.",
      "descriptions": {
        "ro": "Lista fixă de orașe pentru care sunt colectate prognozele — toate capitalele naționale și teritoriale, precum și toate orașele cu cel puțin 200.000 de locuitori. Pentru fiecare oraș sunt incluse identificatorul stabil folosit de noi, coordonatele solicitate pentru centrul orașului și punctul din grila modelului folosit efectiv de Open-Meteo pentru răspuns. Sunt date de referință fără istoric: fiecare rulare le înlocuiește în întregime.",
        "en": "The fixed panel of cities the forecast is collected for — every national or territorial capital plus every city of 200,000 people or more: 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": 3176,
      "lastRunRows": 3176,
      "totalBytes": 120128,
      "sortBy": [
        "city_id"
      ],
      "searchColumns": [
        "name"
      ],
      "primaryKey": [
        "city_id"
      ],
      "writeMode": "replace",
      "storage": "lake",
      "columns": [
        {
          "name": "city_id",
          "type": "INTEGER",
          "nullable": false,
          "description": "Stable id of the city. Ours, not Open-Meteo’s; never reused.",
          "descriptions": {
            "ro": "Identificatorul stabil al orașului. Este al nostru, nu al Open-Meteo, și nu este refolosit niciodată.",
            "en": "Stable id of the city. Ours, not Open-Meteo’s; never reused."
          },
          "min": 1,
          "max": 3176,
          "distinctApprox": 3219
        },
        {
          "name": "name",
          "type": "VARCHAR",
          "nullable": false,
          "description": "City name as displayed.",
          "descriptions": {
            "ro": "Numele afișat al orașului.",
            "en": "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”.",
          "descriptions": {
            "ro": "Conținutul coloanei name, scris cu litere mici și fără accente sau diacritice. Este coloana folosită pentru căutarea după începutul numelui: „sao paulo” trebuie să găsească „São Paulo”.",
            "en": "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.",
          "descriptions": {
            "ro": "Numele afișat al țării.",
            "en": "Country name as displayed."
          }
        },
        {
          "name": "country_code",
          "type": "VARCHAR",
          "nullable": false,
          "description": "ISO 3166-1 alpha-2 country code.",
          "descriptions": {
            "ro": "Codul ISO 3166-1 alpha-2 al țării.",
            "en": "ISO 3166-1 alpha-2 country code."
          }
        },
        {
          "name": "latitude",
          "type": "DOUBLE",
          "nullable": false,
          "description": "Requested city-centre latitude (WGS84).",
          "descriptions": {
            "ro": "Latitudinea solicitată pentru centrul orașului (WGS84).",
            "en": "Requested city-centre latitude (WGS84)."
          },
          "unit": "°"
        },
        {
          "name": "longitude",
          "type": "DOUBLE",
          "nullable": false,
          "description": "Requested city-centre longitude (WGS84).",
          "descriptions": {
            "ro": "Longitudinea solicitată pentru centrul orașului (WGS84).",
            "en": "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.",
          "descriptions": {
            "ro": "Latitudinea celulei din grila modelului pe care Open-Meteo a folosit-o efectiv pentru răspuns. Valoarea este NULL dacă nu a putut fi citită la ultima rulare.",
            "en": "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.",
          "descriptions": {
            "ro": "Longitudinea celulei din grila modelului care a furnizat răspunsul.",
            "en": "Longitude of the model grid cell that answered."
          },
          "unit": "°"
        },
        {
          "name": "elevation",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Elevation of the grid cell above sea level.",
          "descriptions": {
            "ro": "Altitudinea celulei din grilă, raportată la nivelul mării.",
            "en": "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.",
          "descriptions": {
            "ro": "Fusul orar comunicat de API pentru răspuns. În acest set de date, valoarea este întotdeauna UTC/GMT.",
            "en": "Timezone the API reported for the answer. Always UTC/GMT here."
          }
        }
      ],
      "files": [
        {
          "url": "https://date-deschise-s3.bunnytech.app/public/open-meteo-daily/v/01M62KXD7RF4GPRWBYRNAQHMM1/cities.parquet",
          "sizeBytes": 120128,
          "rowCount": 3176,
          "etag": "\"f7046836b62ca86a53b0a1dfc61f1ff9\"",
          "stats": {
            "city_id": {
              "min": 1,
              "max": 3176
            }
          }
        }
      ],
      "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"
        }
      ]
    }
  ],
  "generatedAt": "2026-10-29T01:31:26.488Z"
}
