Skip to content
Eden Engine

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.

activeper callv1

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

Umweltbundesamt

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.

agent
// 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 do

Not 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.

ChargePrice
Per call
$0.0026
Updated
Oct 20, 2026

Input and output schemas

Input schema
input_schema.json
{
  "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
output_schema.json
{
  "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
}