# German Pollen & UV Index Forecast (DWD) (`opendata-souce2026/german-pollen-uv-forecast-dwd`) Actor

Official pollen forecast (birch, grasses, ragweed and 5 more) for 27 German regions and UV index forecast for 38 locations from the Deutscher Wetterdienst (DWD). Today, tomorrow and the day after; filter by state, region, pollen type or coordinates. CC BY 4.0.

- **URL**: https://apify.com/opendata-souce2026/german-pollen-uv-forecast-dwd.md
- **Developed by:** [Taylor Ford](https://apify.com/opendata-souce2026) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## German Pollen & UV Index Forecast (DWD)

Get the **official pollen forecast and UV index forecast for Germany** from the **Deutscher Wetterdienst (DWD)**, the national weather service – as clean JSON, CSV or Excel.

- 🌳 **Pollen** (Pollenflug-Gefahrenindex): **hazel, alder, ash, birch, grasses, rye, mugwort and ragweed** for **27 regions** covering all of Germany, on the DWD scale 0 (none) to 3 (high).
- ☀️ **UV index** (UV-Gefahrenindex): daily maximum UV index for **38 locations**, from the North Sea islands to the Alps, with the WHO category (low … extreme).

Both for **today, tomorrow and the day after**. Filter by **federal state**, **region**, **pollen type**, **minimum level** or **coordinates**. No API key, no scraping, no login.

### What can I use it for?

- 💊 **Pharmacies, pharma & health marketing** – time allergy campaigns and stock by region when birch or grass pollen is high.
- 📱 **Apps, websites & smart home** – show today's pollen load and UV index for your users' region; send alerts at level 2 or UV 6+.
- 🏖️ **Tourism, outdoor & sports** – sun protection tips with the UV forecast, pollen info for hikers and events.
- 📰 **Newsrooms & weather pages** – regional allergy and UV overviews every morning.
- 🤖 **AI agents** – call it as a tool via the Apify MCP server: *"How bad is the grass pollen in Berlin tomorrow?"*

The DWD issues the pollen forecast daily at about 11:00 and the UV forecast at about 07:30 (German time). Schedule a run after that to get a fresh daily feed.

### Data you get

**Pollen rows** (`type: "pollen"`), wide format – one row per region and day:

| Field | Meaning |
|---|---|
| `date`, `day` | Forecast day (`today`, `tomorrow`, `dayAfterTomorrow`) |
| `region`, `stateRegion`, `partRegion`, `regionId`, `partRegionId` | DWD pollen region |
| `states` | Federal states covered by the region |
| `hazel`, `alder`, `ash`, `birch`, `grasses`, `rye`, `mugwort`, `ragweed` | Level 0 / 0.5 / 1 / 1.5 / 2 / 2.5 / 3 (DWD index 0, 0-1, 1, 1-2, 2, 2-3, 3) |
| `maxLevel`, `maxLevelLabel`, `highestPollen` | Highest load of the day and which pollen causes it |

In long format there is one row per region, day and pollen type with `pollen`, `pollenName`, `index`, `level` and `levelLabel`.

**UV rows** (`type: "uv"`) – one row per location and day: `date`, `day`, `city`, `state`, `latitude`, `longitude`, `uvIndex`, `uvCategory`, `mountainStation`, and `distanceKm` when you give coordinates.

A **summary** (issue time, next update, highest pollen level and UV index) is saved in the key-value store under `OUTPUT`.

### Example input

```json
{
  "data": "both",
  "states": ["BE", "BB"],
  "days": ["today", "tomorrow"],
  "minPollenLevel": "1"
}
```

#### Example output

```json
[
  {
    "type": "pollen",
    "date": "2027-04-14",
    "day": "today",
    "region": "Brandenburg und Berlin",
    "states": ["BB", "BE"],
    "birch": 3,
    "ash": 1.5,
    "maxLevel": 3,
    "maxLevelLabel": "high",
    "highestPollen": ["Birch"]
  },
  {
    "type": "uv",
    "date": "2027-04-14",
    "day": "today",
    "city": "Berlin",
    "state": "BE",
    "uvIndex": 4,
    "uvCategory": "moderate"
  }
]
```

(Values above are illustrative.)

### Notes

- Outside the pollen season (roughly October to December) most pollen values are 0. Use **Minimum pollen level** to get only rows that matter.
- `day` is relative to the current date in Germany. Before the new pollen forecast is out (about 11:00), the previous day's forecast is used and days that are already over are left out.
- The DWD does not issue a pollen forecast for the day after tomorrow on Fridays; such days are left out rather than returned empty.
- UV locations on mountain summits (Zugspitze, Großer Arber, Kahler Asten, Weinbiet) are left out unless you name them or enable them.
- Coordinates select the nearest UV location; pollen is forecast by region, so use the state or region filter for pollen.

### Pricing

You pay only per row returned – no monthly fee.

### Source and license

Data: **Deutscher Wetterdienst** (Medizin-Meteorologie), [open data server](https://opendata.dwd.de/climate_environment/health/alerts/), licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) (see the DWD's [legal notice](https://www.dwd.de/EN/service/legal_notice/legal_notice_node.html)). Please keep this attribution when you publish the data. This tool is independent and not affiliated with or endorsed by the DWD. It is not medical advice.

# Actor input Schema

## `data` (type: `string`):

Which forecast to return.

## `language` (type: `string`):

Language of pollen names and level labels.

## `days` (type: `array`):

Leave empty for all forecast days. The pollen forecast for the day after tomorrow is not issued on Fridays.

## `states` (type: `array`):

Only pollen regions and UV locations in these states. Leave empty for all of Germany.

## `pollenRegion` (type: `string`):

Part of a DWD pollen region name, e.g. "Rhein-Main", "Oberrhein", "Allgäu" or "Harz".

## `pollenTypes` (type: `array`):

Only these pollen types (long format) or columns of interest. Leave empty for all eight.

## `minPollenLevel` (type: `string`):

Only pollen values at or above this level (0 none … 3 high). Useful for alerts.

## `pollenFormat` (type: `string`):

Wide: one row per region and day with a column per pollen type. Long: one row per region, day and pollen type.

## `uvCities` (type: `array`):

Names of DWD UV forecast locations, e.g. "Berlin", "München", "Frankfurt/Main", "Zugspitze".

## `latitude` (type: `string`):

Returns the UV forecast of the nearest DWD UV location to this point, e.g. 50.94. Give longitude too.

## `longitude` (type: `string`):

Longitude of the point, e.g. 6.96.

## `minUvIndex` (type: `integer`):

Only UV values at or above this index (e.g. 6 = high).

## `includeMountainStations` (type: `boolean`):

Zugspitze, Großer Arber, Kahler Asten and Weinbiet have much higher UV than towns and are left out unless named or enabled here.

## `maxRows` (type: `integer`):

Safety limit for the number of rows returned.

## Actor input object example

```json
{
  "data": "both",
  "language": "en",
  "minPollenLevel": "0",
  "pollenFormat": "wide",
  "minUvIndex": 0,
  "includeMountainStations": false,
  "maxRows": 10000
}
```

# Actor output Schema

## `results` (type: `string`):

Pollen rows (per region and day, or per region, day and pollen type) and UV rows (per location and day). The type field says which.

## `summary` (type: `string`):

When each forecast was issued, when the next one is due, row counts and the highest pollen level and UV index.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("opendata-souce2026/german-pollen-uv-forecast-dwd").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("opendata-souce2026/german-pollen-uv-forecast-dwd").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call opendata-souce2026/german-pollen-uv-forecast-dwd --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,opendata-souce2026/german-pollen-uv-forecast-dwd"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/F9YWIXnZO2Ly5nZu4/builds/fDEPgIYJjtMX9ArnX/openapi.json
