German Air Quality Index and Pollutant Readings by Station (Umweltbundesamt)
ubaairdata/air-quality-readings
Hourly air quality data from the German Environment Agency (Umweltbundesamt, UBA) for one monitoring station: for every hour in the requested date and hour range, the total air quality index, a flag for incomplete data and, for each pollutant component, its component id, measured value, index and y-value. Times are local German time (CET or CEST). The data comes back in the service's own positional layout, with the key to it in `indices`. Station ids and names are listed by the stations tool, and component ids are named by the components tool. Ask for short ranges: each hour adds about 110 bytes, so a year is about 850 KB. An unknown station id is refused as invalid input. A range with no readings returns an empty data object and a count of 0. Data from the Umweltbundesamt, passed through unmodified and served by Eden Engine; not an official Umweltbundesamt product.
Price
$0.0026 per call
You pay the price shown. If a call turns out to cost more than its quote, you pay the actual price, capped at twice the quote. No monthly minimum. Top-ups start at $5.
Data source
Source: Umweltbundesamt (German Federal Environment Agency), https://www.umweltbundesamt.de/daten/luft/luftdaten. Passed through unmodified. Served by Eden Engine; not an official Umweltbundesamt product.
Use it
Five steps: search, inspect, learn, run, settle. No per-tool setup; your agent reaches this tool through the meta-tools it already has.
Connect once and your AI can find and run this tool, and any other it needs.
// 1. search: find the tool
omnial_search({ query: "what you need" })
// 2. inspect: price and input schema
omnial_inspect({ tool: "ubaairdata/air-quality-readings" })
// 3. learn: read the usage guide at runtime
omnial_learn({ tool: "ubaairdata/air-quality-readings" })
// 4. run: price the exact call first, then run it
omnial_execute({ tool: "ubaairdata/air-quality-readings", input: { /* see input_schema */ }, dry_run: true })
omnial_execute({ tool: "ubaairdata/air-quality-readings", input: { /* ... */ } })
// 5. settle: the call is charged when it finishes, nothing to doNot connected yet? Point your MCP client at https://mcp.eden-engine.com/mcp, then copy a config for your client.
Pricing
Every charge this tool can incur.
| Charge | Price |
|---|---|
Per call | $0.0026 |
- Updated
- Oct 20, 2026
Input and output schemas
Input schema
{
"type": "object",
"required": [
"station",
"date_from",
"time_from",
"date_to",
"time_to"
],
"properties": {
"date_to": {
"type": "string",
"pattern": "^(19|20)[0-9]{2}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$",
"description": "Last day of the range, as YYYY-MM-DD. Not before date_from."
},
"station": {
"type": "string",
"pattern": "^[0-9]{1,6}$",
"description": "The numeric id of one UBA monitoring station, for example 282. Ids come from the stations tool (ubaairdata/stations) or the keys of the station availability tool. One station per call."
},
"time_to": {
"type": "integer",
"maximum": 24,
"minimum": 1,
"description": "Hour of date_to to end at, 1 to 24, counting the hour that ENDS then: 1 is the hour from 00:00 to 01:00 local time."
},
"date_from": {
"type": "string",
"pattern": "^(19|20)[0-9]{2}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$",
"description": "First day of the range, as YYYY-MM-DD, for example 2026-10-17."
},
"time_from": {
"type": "integer",
"maximum": 24,
"minimum": 1,
"description": "Hour of date_from to start at, 1 to 24, counting the hour that ENDS then: 1 is the hour from 00:00 to 01:00 local time."
}
},
"additionalProperties": false
}Output schema
{
"type": "object",
"required": [
"request",
"data",
"count"
],
"properties": {
"data": {
"type": "object",
"description": "Keyed by station id, then by the hour's start timestamp (local time). Each hour is a positional array: [end timestamp, total index, data-incomplete flag, then one [component id, value, index, y-value] array per pollutant component]. Empty when the range holds no readings.",
"additionalProperties": true
},
"meta": {
"type": "object",
"description": "The service's own credit line (`source`, which names the Umweltbundesamt and says the times are CET or CEST), `cachedAt`, `uri` and `lang`.",
"additionalProperties": true
},
"count": {
"type": "integer",
"description": "The number of hours returned."
},
"indices": {
"type": "object",
"description": "The service's own legend for the layout of `data`.",
"additionalProperties": true
},
"request": {
"type": "object",
"description": "The query as the service understood it, including the resolved `datetime_from` and `datetime_to`, `index` and `lang`.",
"additionalProperties": true
}
},
"description": "The air data service's response: `request` echoes the query as the service understood it, `data` holds the readings by station id and hour, `indices` is the service's own legend for the positional arrays, and `count` is the number of hours returned.",
"additionalProperties": true
}