{
  "manifestVersion": 1,
  "dataset": {
    "id": "iasi-air-quality",
    "name": "Iași air quality",
    "description": "Hourly readings from the uRADMonitor air-quality sensor network deployed across Iași, republished by Portalul Open Data Iași (Primăria Municipiului Iași). The source sends each sensor as one wide object with a param/avg/last column triple per pollutant; this connector reshapes that into long format — one row per (sensor, reading_time, pollutant) — so pollutants can be filtered, aggregated and compared directly.",
    "descriptions": {
      "ro": "Măsurători orare de la rețeaua de senzori de calitate a aerului uRADMonitor amplasați în Iași, republicate de Portalul Open Data Iași (Primăria Municipiului Iași). Datele brute, organizate pe câte o coloană pentru fiecare poluant, au fost restructurate într-un format lung — câte un rând pentru fiecare combinație senzor-moment-poluant — astfel încât poluanții pot fi filtrați, agregați și comparați direct, fără a scrie o interogare separată pentru fiecare dintre ei.",
      "en": "Hourly readings from the uRADMonitor air-quality sensor network deployed across Iași, republished by Portalul Open Data Iași (Primăria Municipiului Iași). The source sends each sensor as one wide object with a param/avg/last column triple per pollutant; this connector reshapes that into long format — one row per (sensor, reading_time, pollutant) — so pollutants can be filtered, aggregated and compared directly."
    },
    "names": {
      "ro": "Calitatea aerului în Iași",
      "en": "Iași air quality"
    },
    "sourceUrl": "https://opendata.oras.digital/dataset/cf3f-2309-44d1-8e0c-1137/",
    "license": {
      "id": "ro-official-acts-public-domain",
      "name": "Romanian official acts and public-interest information — outside copyright",
      "url": "https://legislatie.just.ro/Public/DetaliiDocument/7816",
      "attribution": "Date despre calitatea aerului publicate de Primăria Municipiului Iași — Portal Open Data",
      "notes": "Legea 8/1996 privind dreptul de autor, art. 9, excludes from copyright both official texts of an administrative nature and simple facts and data. The pollutant readings republished here are bare factual measurements captured by municipal sensor hardware, and the sensor catalogue is the official record of that public monitoring network's own devices. They are also public-interest information under Legea 544/2001 and re-usable public-sector information under Legea 179/2022, which transposes the EU Open Data Directive. HOWEVER, and a reuser must weigh this: the portal brands itself \"Open Data\" but names NO licence anywhere it publishes. Verified directly: `https://opendata.oras.digital/terms/` (fetched 2026-09-01) is exclusively a liability disclaimer (\"Primăria Municipiului Iași nu își asumă niciun fel de răspundere...\") plus a cookie/Google Analytics policy — it contains no reproduction grant and no reproduction restriction, and the dataset landing page and API docs page carry no separate licence statement either. This dataset therefore rests on the legal position above rather than on any grant from Primăria Municipiului Iași — the \"Open Data\" branding is not itself a licence — and anyone republishing it should make their own assessment. This is a DERIVED work, not a republication: `sensors` carries the device's identity, location and hardware fields, and `readings` carries the per-pollutant average and last values — both reshaped from the source's wide per-pollutant JSON columns (param_X / avg_X / last_X, repeated once per pollutant) into one row per (sensor, reading_time, pollutant); nothing else the source exposes (e.g. the device photo URL) is republished. `robots.txt` on this domain is `User-agent: * / Allow: /` — unlike, say, curs.bnr.ro, nothing here signals that automated access is unwelcome. Finally, and most important for how this dataset should be used: the underlying uRADMonitor units are low-cost citizen-science-grade sensors, and their readings are indicative of local conditions, not calibrated regulatory reference measurements. Do not present a value from this dataset as an official air-quality compliance figure, and do not use it in place of a certified monitoring station's reading where the distinction matters (e.g. a legal exceedance finding)."
    },
    "cadence": "hourly",
    "tags": [
      "air-quality",
      "environment",
      "sensors",
      "pollution",
      "romania",
      "iasi",
      "uradmonitor",
      "weather"
    ],
    "sources": []
  },
  "ingest": {
    "id": "01M5FRGPGZJKQ6JPHA43R7BT2Y",
    "startedAt": "2026-10-21T17:35:33.919Z",
    "snapshotDate": "2026-10-21",
    "catalogSnapshotId": 132,
    "params": {}
  },
  "baseUrl": "https://data-directory.fsn1.your-objectstorage.com/public/iasi-air-quality",
  "catalog": {
    "url": "https://data-directory.fsn1.your-objectstorage.com/catalog/iasi-air-quality/v/01M5FRGPGZJKQ6JPHA43R7BT2Y/catalog.ducklake",
    "latestUrl": "https://data-directory.fsn1.your-objectstorage.com/catalog/iasi-air-quality/catalog.ducklake",
    "sha256": "789fc33adf7ab2d36a4fd7d183e13e7bb23ffec297f524148d67720808a65de2",
    "duckdbVersion": "v1.5.5",
    "attachExample": "ATTACH 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/iasi-air-quality/catalog.ducklake' AS lake (READ_ONLY); SELECT * FROM lake.main.readings LIMIT 5;"
  },
  "queryHints": {
    "examples": [
      {
        "title": "PM2.5 at one sensor over the last week",
        "sql": "SELECT reading_time, value_avg, value_last\nFROM readings\nWHERE pollutant = 'pm25'\n  AND sensor_id = 2181038179\n  AND reading_time >= current_date - INTERVAL 7 DAY\nORDER BY reading_time",
        "description": "pollutant leads the sort, so this filters to a single row-group family before the time range and sensor filters narrow further."
      },
      {
        "title": "City-wide average PM2.5 per day",
        "sql": "SELECT date_trunc('day', reading_time) AS day, avg(value_last) AS avg_pm25\nFROM readings\nWHERE pollutant = 'pm25'\n  AND reading_time >= current_date - INTERVAL 30 DAY\nGROUP BY 1\nORDER BY 1",
        "description": "Every sensor with a valid PM2.5 reading, averaged per calendar day."
      },
      {
        "title": "Every pollutant currently flagged as erroring, by sensor",
        "sql": "SELECT s.name, s.city, r.pollutant, r.reading_time, r.value_last\nFROM readings r\nJOIN sensors s USING (sensor_id)\nWHERE r.flagged_error\nORDER BY r.reading_time DESC",
        "description": "Joins in the sensor's own location so a faulty reading can be traced to a place."
      }
    ]
  },
  "tables": [
    {
      "name": "readings",
      "description": "One row per (sensor, reading_time, pollutant): the average and most recent value a uRADMonitor air-quality sensor reported for one pollutant, as of that sensor's own last report time. Reshaped from the source's wide per-pollutant columns into long format so pollutants can be filtered, grouped and compared directly. A reading is never revised once published — the next report from the same sensor arrives with a later reading_time, not a correction of this one.",
      "descriptions": {
        "ro": "Câte un rând pentru fiecare combinație (senzor, moment_citire, poluant): media și cea mai recentă valoare raportată de un senzor de calitate a aerului uRADMonitor pentru un anumit poluant, la momentul propriei sale ultime raportări. Restructurat din coloanele largi, câte una pe poluant, ale sursei, într-un format lung, astfel încât poluanții pot fi filtrați, grupați și comparați direct. O citire nu este niciodată modificată după ce a fost publicată — următorul raport al aceluiași senzor sosește cu un moment_citire mai recent, nu ca o corecție a celui anterior.",
        "en": "One row per (sensor, reading_time, pollutant): the average and most recent value a uRADMonitor air-quality sensor reported for one pollutant, as of that sensor's own last report time. Reshaped from the source's wide per-pollutant columns into long format so pollutants can be filtered, grouped and compared directly. A reading is never revised once published — the next report from the same sensor arrives with a later reading_time, not a correction of this one."
      },
      "rowCount": 22337,
      "lastRunRows": 219,
      "totalBytes": 113818,
      "sortBy": [
        "pollutant",
        "reading_time",
        "sensor_id"
      ],
      "searchColumns": [],
      "primaryKey": [
        "sensor_id",
        "reading_time",
        "pollutant"
      ],
      "writeMode": "append",
      "storage": "lake",
      "columns": [
        {
          "name": "sensor_id",
          "type": "BIGINT",
          "nullable": false,
          "description": "The uRADMonitor device id this reading came from, decoded from its hexadecimal source id (e.g. \"82000263\") into a BIGINT. Joins to sensors.sensor_id.",
          "descriptions": {
            "ro": "Identificatorul dispozitivului uRADMonitor de la care provine această citire, decodificat din identificatorul hexazecimal al sursei (de ex. \"82000263\") într-un BIGINT. Se leagă de sensors.sensor_id.",
            "en": "The uRADMonitor device id this reading came from, decoded from its hexadecimal source id (e.g. \"82000263\") into a BIGINT. Joins to sensors.sensor_id."
          },
          "min": "2181038691",
          "max": "2181038710",
          "distinctApprox": 23
        },
        {
          "name": "reading_time",
          "type": "TIMESTAMPTZ",
          "nullable": false,
          "description": "The instant this reading is for (UTC) — the source sensor's own `timelast` (Unix epoch seconds, an unambiguous instant), not the time this connector happened to poll the API. Two sensors polled in the same run can carry different reading_time values when one of them has not reported in a while.",
          "descriptions": {
            "ro": "Momentul (UTC) la care se referă această citire — propriul câmp `timelast` al senzorului sursă (secunde Unix epoch, un moment fără ambiguitate), nu momentul la care acest conector a interogat efectiv API-ul. Doi senzori interogați în aceeași rulare pot avea valori diferite ale reading_time atunci când unul dintre ei nu a mai raportat de ceva vreme.",
            "en": "The instant this reading is for (UTC) — the source sensor's own `timelast` (Unix epoch seconds, an unambiguous instant), not the time this connector happened to poll the API. Two sensors polled in the same run can carry different reading_time values when one of them has not reported in a while."
          },
          "min": "2020-10-26 07:17:06+00",
          "max": "2026-10-21 17:35:34+00",
          "distinctApprox": 1603
        },
        {
          "name": "pollutant",
          "type": "VARCHAR",
          "nullable": false,
          "description": "Canonical pollutant code, taken verbatim from the source's own `param_<code>` field name (e.g. \"pm25\", \"co2\", \"temperature\") — never a hand-maintained lookup table, so a pollutant the source adds shows up here automatically.",
          "descriptions": {
            "ro": "Codul canonic al poluantului, preluat exact din numele propriului câmp `param_<cod>` al sursei (de ex. \"pm25\", \"co2\", \"temperature\") — niciodată dintr-un tabel de corespondență întreținut manual, astfel încât un poluant adăugat de sursă apare aici automat.",
            "en": "Canonical pollutant code, taken verbatim from the source's own `param_<code>` field name (e.g. \"pm25\", \"co2\", \"temperature\") — never a hand-maintained lookup table, so a pollutant the source adds shows up here automatically."
          },
          "min": "ch2o",
          "max": "vocaqi",
          "distinctApprox": 11
        },
        {
          "name": "display_name",
          "type": "VARCHAR",
          "nullable": true,
          "description": "Human-readable pollutant name as published by the source's own param_<code> metadata (e.g. \"PM2.5\", \"CarbonDioxide\"). Null when that metadata was missing or malformed for this particular reading — value_avg/value_last are still trustworthy in that case, only the label is unavailable.",
          "descriptions": {
            "ro": "Numele poluantului, ușor de citit de om, așa cum este publicat în metadatele proprii param_<cod> ale sursei (de ex. \"PM2.5\", \"CarbonDioxide\"). Este null atunci când aceste metadate au lipsit sau au fost eronate pentru această citire — value_avg și value_last rămân în continuare de încredere în acest caz, doar eticheta nu este disponibilă.",
            "en": "Human-readable pollutant name as published by the source's own param_<code> metadata (e.g. \"PM2.5\", \"CarbonDioxide\"). Null when that metadata was missing or malformed for this particular reading — value_avg/value_last are still trustworthy in that case, only the label is unavailable."
          }
        },
        {
          "name": "unit",
          "type": "VARCHAR",
          "nullable": true,
          "description": "Unit of value_avg/value_last, parsed out of the source's own param_<code> metadata (e.g. \"µg/m³\", \"ppm\", \"°C\") rather than a hardcoded unit table, so a unit change upstream is reflected automatically. Null under the same conditions as display_name.",
          "descriptions": {
            "ro": "Unitatea de măsură pentru value_avg/value_last, extrasă din metadatele proprii param_<cod> ale sursei (de ex. \"µg/m³\", \"ppm\", \"°C\") și nu dintr-un tabel fix de unități, astfel încât o schimbare de unitate la sursă se reflectă automat. Este null în aceleași condiții ca display_name.",
            "en": "Unit of value_avg/value_last, parsed out of the source's own param_<code> metadata (e.g. \"µg/m³\", \"ppm\", \"°C\") rather than a hardcoded unit table, so a unit change upstream is reflected automatically. Null under the same conditions as display_name."
          }
        },
        {
          "name": "value_avg",
          "type": "DECIMAL(18,4)",
          "nullable": true,
          "description": "Average value the sensor reported for this pollutant as of reading_time. The averaging window is defined by uRADMonitor, not by this connector. Null when the source omitted or could not provide an average for this pollutant on this poll.",
          "descriptions": {
            "ro": "Valoarea medie raportată de senzor pentru acest poluant, la momentul reading_time. Fereastra de mediere este definită de uRADMonitor, nu de acest conector. Este null atunci când sursa nu a oferit o medie pentru acest poluant la această interogare.",
            "en": "Average value the sensor reported for this pollutant as of reading_time. The averaging window is defined by uRADMonitor, not by this connector. Null when the source omitted or could not provide an average for this pollutant on this poll."
          }
        },
        {
          "name": "value_last",
          "type": "DECIMAL(18,4)",
          "nullable": true,
          "description": "Most recent instantaneous value the sensor reported for this pollutant at reading_time. Null when the source omitted it.",
          "descriptions": {
            "ro": "Cea mai recentă valoare instantanee raportată de senzor pentru acest poluant, la momentul reading_time. Este null atunci când sursa nu a oferit-o.",
            "en": "Most recent instantaneous value the sensor reported for this pollutant at reading_time. Null when the source omitted it."
          }
        },
        {
          "name": "flagged_error",
          "type": "BOOLEAN",
          "nullable": false,
          "description": "True when the source's own `errors` field named this exact pollutant as faulty for this sensor at the time of this reading (uRADMonitor flags specific pollutant channels, not just whole devices, as erroring). value_avg/value_last are still published as reported — they are not dropped — but should be treated with suspicion when this is true.",
          "descriptions": {
            "ro": "True atunci când propriul câmp `errors` al sursei a semnalat exact acest poluant ca defect pentru acest senzor, la momentul acestei citiri (uRADMonitor semnalează canale individuale de poluanți ca fiind eronate, nu doar dispozitivul în ansamblu). value_avg/value_last sunt publicate în continuare ca atare — nu sunt eliminate — dar trebuie tratate cu suspiciune atunci când această coloană este true.",
            "en": "True when the source's own `errors` field named this exact pollutant as faulty for this sensor at the time of this reading (uRADMonitor flags specific pollutant channels, not just whole devices, as erroring). value_avg/value_last are still published as reported — they are not dropped — but should be treated with suspicion when this is true."
          }
        }
      ],
      "files": [
        {
          "url": "https://data-directory.fsn1.your-objectstorage.com/public/iasi-air-quality/v/01M5FRGPGZJKQ6JPHA43R7BT2Y/readings.parquet",
          "sizeBytes": 113818,
          "rowCount": 22337,
          "etag": "\"d21a2f7f375b604c56a50e46bc70cc1e\"",
          "stats": {
            "pollutant": {
              "min": "ch2o",
              "max": "vocaqi"
            },
            "reading_time": {
              "min": "2020-10-26 07:17:06+00",
              "max": "2026-10-21 17:35:34+00"
            },
            "sensor_id": {
              "min": "2181038691",
              "max": "2181038710"
            }
          }
        }
      ],
      "example": [
        {
          "sensor_id": 2181038700,
          "reading_time": "2020-10-26T07:17:06.000Z",
          "pollutant": "ch2o",
          "display_name": "Formaldehyde",
          "unit": "ppb",
          "value_avg": 0,
          "value_last": null,
          "flagged_error": false
        },
        {
          "sensor_id": 2181038708,
          "reading_time": "2024-01-30T12:31:58.000Z",
          "pollutant": "ch2o",
          "display_name": "Formaldehyde",
          "unit": "ppb",
          "value_avg": 0,
          "value_last": null,
          "flagged_error": false
        }
      ]
    },
    {
      "name": "sensors",
      "description": "One row per physical uRADMonitor unit in the Iași air-quality network, with its location and hardware details. Upserted: first_seen_date/last_seen_date widen over time, everything else reflects the most recent poll.",
      "descriptions": {
        "ro": "Câte un rând pentru fiecare dispozitiv fizic uRADMonitor din rețeaua de calitate a aerului din Iași, cu locația și detaliile sale hardware. Actualizat prin upsert: first_seen_date/last_seen_date se extind în timp, restul coloanelor reflectă cea mai recentă interogare.",
        "en": "One row per physical uRADMonitor unit in the Iași air-quality network, with its location and hardware details. Upserted: first_seen_date/last_seen_date widen over time, everything else reflects the most recent poll."
      },
      "rowCount": 20,
      "lastRunRows": 20,
      "totalBytes": 4426,
      "sortBy": [
        "sensor_id"
      ],
      "searchColumns": [],
      "primaryKey": [
        "sensor_id"
      ],
      "writeMode": "upsert",
      "storage": "lake",
      "columns": [
        {
          "name": "sensor_id",
          "type": "BIGINT",
          "nullable": false,
          "description": "The uRADMonitor device id, decoded from its hexadecimal source id (e.g. \"82000263\") into a BIGINT so it sorts and joins numerically. Stable for the life of the unit.",
          "descriptions": {
            "ro": "Identificatorul dispozitivului uRADMonitor, decodificat din identificatorul hexazecimal al sursei (de ex. \"82000263\") într-un BIGINT, astfel încât să poată fi sortat și legat numeric. Rămâne stabil pe toată durata de viață a dispozitivului.",
            "en": "The uRADMonitor device id, decoded from its hexadecimal source id (e.g. \"82000263\") into a BIGINT so it sorts and joins numerically. Stable for the life of the unit."
          },
          "min": "2181038691",
          "max": "2181038710",
          "distinctApprox": 23
        },
        {
          "name": "name",
          "type": "VARCHAR",
          "nullable": true,
          "description": "Free-text description of the sensor's physical location, as entered by the network operator (typically a street intersection or landmark), e.g. \"Bd.Independentei-Str.Sarariei\". Cleaned of a literal leading two-character \"\\0\" the source sometimes emits (see cleanNote in feed.ts) — that is an upstream artefact, not meaningful text. Null when the source sent nothing usable.",
          "descriptions": {
            "ro": "Descrierea în text liber a locației fizice a senzorului, așa cum a fost introdusă de operatorul rețelei (de regulă o intersecție de străzi sau un reper), de ex. \"Bd.Independentei-Str.Sarariei\". Curățată de un artefact \"\\0\" de două caractere pe care sursa îl atașează uneori la început (vezi cleanNote în feed.ts) — este un artefact al sursei, nu text cu sens. Este null atunci când sursa nu a trimis nimic utilizabil.",
            "en": "Free-text description of the sensor's physical location, as entered by the network operator (typically a street intersection or landmark), e.g. \"Bd.Independentei-Str.Sarariei\". Cleaned of a literal leading two-character \"\\0\" the source sometimes emits (see cleanNote in feed.ts) — that is an upstream artefact, not meaningful text. Null when the source sent nothing usable."
          }
        },
        {
          "name": "latitude",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Sensor location, WGS 84 latitude.",
          "descriptions": {
            "ro": "Locația senzorului, latitudine WGS 84.",
            "en": "Sensor location, WGS 84 latitude."
          },
          "unit": "degrees"
        },
        {
          "name": "longitude",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Sensor location, WGS 84 longitude.",
          "descriptions": {
            "ro": "Locația senzorului, longitudine WGS 84.",
            "en": "Sensor location, WGS 84 longitude."
          },
          "unit": "degrees"
        },
        {
          "name": "altitude",
          "type": "DOUBLE",
          "nullable": true,
          "description": "Sensor elevation above sea level, as reported by the device.",
          "descriptions": {
            "ro": "Altitudinea senzorului deasupra nivelului mării, așa cum este raportată de dispozitiv.",
            "en": "Sensor elevation above sea level, as reported by the device."
          },
          "unit": "m"
        },
        {
          "name": "city",
          "type": "VARCHAR",
          "nullable": true,
          "description": "City name as reported by the source.",
          "descriptions": {
            "ro": "Numele orașului, așa cum este raportat de sursă.",
            "en": "City name as reported by the source."
          }
        },
        {
          "name": "country",
          "type": "VARCHAR",
          "nullable": true,
          "description": "ISO country code as reported by the source.",
          "descriptions": {
            "ro": "Codul de țară ISO, așa cum este raportat de sursă.",
            "en": "ISO country code as reported by the source."
          }
        },
        {
          "name": "placement",
          "type": "INTEGER",
          "nullable": true,
          "description": "Installation placement code as reported by uRADMonitor. The portal publishes no legend for this code; kept verbatim (every unit observed so far reports 1) so a consumer can at least group identical installs, or map it once a legend surfaces.",
          "descriptions": {
            "ro": "Codul de amplasare a instalației, așa cum este raportat de uRADMonitor. Portalul nu publică o legendă pentru acest cod; este păstrat exact (fiecare dispozitiv observat până acum raportează 1), astfel încât cel puțin instalările identice pot fi grupate, sau codul poate fi mapat dacă apare vreodată o legendă.",
            "en": "Installation placement code as reported by uRADMonitor. The portal publishes no legend for this code; kept verbatim (every unit observed so far reports 1) so a consumer can at least group identical installs, or map it once a legend surfaces."
          }
        },
        {
          "name": "mobile",
          "type": "BOOLEAN",
          "nullable": true,
          "description": "True when uRADMonitor flags this unit as mobile (vehicle-mounted) rather than a fixed street installation. Null when the source does not report the flag, which is the case for every fixed unit observed so far.",
          "descriptions": {
            "ro": "True atunci când uRADMonitor semnalează acest dispozitiv ca fiind mobil (montat pe un vehicul) și nu o instalație fixă stradală. Este null atunci când sursa nu raportează acest indicator, ceea ce este cazul pentru fiecare dispozitiv fix observat până acum.",
            "en": "True when uRADMonitor flags this unit as mobile (vehicle-mounted) rather than a fixed street installation. Null when the source does not report the flag, which is the case for every fixed unit observed so far."
          }
        },
        {
          "name": "status",
          "type": "INTEGER",
          "nullable": true,
          "description": "Device status code as reported by uRADMonitor as of the most recent poll. The source publishes no legend for its values; cross-reference last_reading_at for staleness rather than relying on this code alone.",
          "descriptions": {
            "ro": "Codul de stare a dispozitivului, așa cum este raportat de uRADMonitor la cea mai recentă interogare. Sursa nu publică o legendă pentru valorile sale; pentru a detecta un dispozitiv inactiv, folosește last_reading_at, nu doar acest cod.",
            "en": "Device status code as reported by uRADMonitor as of the most recent poll. The source publishes no legend for its values; cross-reference last_reading_at for staleness rather than relying on this code alone."
          }
        },
        {
          "name": "versionsw",
          "type": "INTEGER",
          "nullable": true,
          "description": "Firmware version running on the device.",
          "descriptions": {
            "ro": "Versiunea firmware-ului rulat pe dispozitiv.",
            "en": "Firmware version running on the device."
          }
        },
        {
          "name": "versionhw",
          "type": "INTEGER",
          "nullable": true,
          "description": "Hardware revision of the device.",
          "descriptions": {
            "ro": "Revizia hardware a dispozitivului.",
            "en": "Hardware revision of the device."
          }
        },
        {
          "name": "owner",
          "type": "BIGINT",
          "nullable": true,
          "description": "Numeric id of the uRADMonitor account that operates this device, as assigned by the uRADMonitor network — not a Portalul Open Data Iași id.",
          "descriptions": {
            "ro": "Identificatorul numeric al contului uRADMonitor care operează acest dispozitiv, atribuit de rețeaua uRADMonitor — nu un identificator al Portalului Open Data Iași.",
            "en": "Numeric id of the uRADMonitor account that operates this device, as assigned by the uRADMonitor network — not a Portalul Open Data Iași id."
          }
        },
        {
          "name": "detector",
          "type": "VARCHAR",
          "nullable": true,
          "description": "Model of the unit's onboard Geiger-Müller radiation-detector tube (e.g. \"SI29BG\"). Unrelated to the air-quality pollutants published in readings — it identifies the physical hardware, which uRADMonitor units also use for background-radiation monitoring alongside air quality.",
          "descriptions": {
            "ro": "Modelul tubului Geiger-Müller de detecție a radiațiilor de la bordul dispozitivului (de ex. \"SI29BG\"). Nu are legătură cu poluanții din tabelul readings — identifică hardware-ul fizic, pe care dispozitivele uRADMonitor îl folosesc și pentru monitorizarea radiației de fond, pe lângă calitatea aerului.",
            "en": "Model of the unit's onboard Geiger-Müller radiation-detector tube (e.g. \"SI29BG\"). Unrelated to the air-quality pollutants published in readings — it identifies the physical hardware, which uRADMonitor units also use for background-radiation monitoring alongside air quality."
          }
        },
        {
          "name": "first_reported_at",
          "type": "TIMESTAMPTZ",
          "nullable": true,
          "description": "When this physical device first reported data to uRADMonitor (UTC), per the network's own records (source field `timefirst`, Unix epoch seconds). Not when this connector first observed it — see first_seen_date for that.",
          "descriptions": {
            "ro": "Momentul (UTC) la care acest dispozitiv fizic a raportat pentru prima dată date către uRADMonitor, conform propriilor înregistrări ale rețelei (câmpul sursă `timefirst`, secunde Unix epoch). Nu este momentul la care acest conector l-a observat prima dată — pentru acesta, vezi first_seen_date.",
            "en": "When this physical device first reported data to uRADMonitor (UTC), per the network's own records (source field `timefirst`, Unix epoch seconds). Not when this connector first observed it — see first_seen_date for that."
          }
        },
        {
          "name": "last_reading_at",
          "type": "TIMESTAMPTZ",
          "nullable": true,
          "description": "Timestamp (UTC) of the most recent measurement this device had reported to uRADMonitor as of the last poll (source field `timelast`, Unix epoch seconds). A value well in the past means the device has gone quiet; readings.reading_time for this sensor stops advancing past this point too.",
          "descriptions": {
            "ro": "Momentul (UTC) celei mai recente măsurători pe care acest dispozitiv o raportase către uRADMonitor la ultima interogare (câmpul sursă `timelast`, secunde Unix epoch). O valoare mult în urmă în timp înseamnă că dispozitivul a încetat să mai raporteze; reading_time din tabelul readings pentru acest senzor încetează și el să mai avanseze după acest punct.",
            "en": "Timestamp (UTC) of the most recent measurement this device had reported to uRADMonitor as of the last poll (source field `timelast`, Unix epoch seconds). A value well in the past means the device has gone quiet; readings.reading_time for this sensor stops advancing past this point too."
          }
        },
        {
          "name": "first_seen_date",
          "type": "DATE",
          "nullable": false,
          "description": "The first run day (UTC) on which this connector saw this device. Maintained automatically by the upsert loader — never overwritten, only widened.",
          "descriptions": {
            "ro": "Prima zi de rulare (UTC) în care acest conector a observat acest dispozitiv. Întreținută automat de mecanismul de upsert — nu este niciodată suprascrisă, doar extinsă.",
            "en": "The first run day (UTC) on which this connector saw this device. Maintained automatically by the upsert loader — never overwritten, only widened."
          }
        },
        {
          "name": "last_seen_date",
          "type": "DATE",
          "nullable": false,
          "description": "The most recent run day (UTC) on which the source still listed this device.",
          "descriptions": {
            "ro": "Cea mai recentă zi de rulare (UTC) în care sursa mai lista acest dispozitiv.",
            "en": "The most recent run day (UTC) on which the source still listed this device."
          }
        }
      ],
      "files": [
        {
          "url": "https://data-directory.fsn1.your-objectstorage.com/public/iasi-air-quality/v/01M5FRGPGZJKQ6JPHA43R7BT2Y/sensors.parquet",
          "sizeBytes": 4426,
          "rowCount": 20,
          "etag": "\"64429e68661087274c79a5d4dcfa8c81\"",
          "stats": {
            "sensor_id": {
              "min": "2181038691",
              "max": "2181038710"
            }
          }
        }
      ],
      "example": [
        {
          "sensor_id": 2181038691,
          "name": "Bd.Independentei-Str.Sarariei",
          "latitude": 47.165456,
          "longitude": 27.590467,
          "altitude": 40,
          "city": "Iasi",
          "country": "RO",
          "placement": 1,
          "mobile": null,
          "status": 1,
          "versionsw": 76,
          "versionhw": 108,
          "owner": 6745,
          "detector": "SI29BG",
          "first_reported_at": "2020-06-08T20:05:50.000Z",
          "last_reading_at": "2026-10-21T17:34:18.000Z",
          "first_seen_date": "2026-09-02T00:00:00.000Z",
          "last_seen_date": "2026-10-21T00:00:00.000Z"
        },
        {
          "sensor_id": 2181038692,
          "name": "Sos.Nicolina-Bd.Poitiers(Selgros)",
          "latitude": 47.134354,
          "longitude": 27.572893,
          "altitude": 40,
          "city": "Iasi",
          "country": "RO",
          "placement": 1,
          "mobile": null,
          "status": null,
          "versionsw": 76,
          "versionhw": 108,
          "owner": 6745,
          "detector": "SI29BG",
          "first_reported_at": "2020-06-08T20:24:41.000Z",
          "last_reading_at": "2026-07-13T02:19:05.000Z",
          "first_seen_date": "2026-09-02T00:00:00.000Z",
          "last_seen_date": "2026-10-21T00:00:00.000Z"
        }
      ]
    }
  ],
  "generatedAt": "2026-10-21T17:36:10.869Z"
}
