# MeteoCiel Forecast Scraper (`valentin-b117/meteociel-forecast-scraper`) Actor

Get weather forecasts for any city and date range from Meteociel: temperature, feels-like, rain, wind, gusts, humidity, pressure and conditions, as 3-/6-hourly steps or a daily summary. Up to 10 days ahead.

- **URL**: https://apify.com/valentin-b117/meteociel-forecast-scraper.md
- **Developed by:** [Valentin B117](https://apify.com/valentin-b117) (community)
- **Categories:** Travel, Other
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.05 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### What does MeteoCiel Forecast Scraper do?

MeteoCiel Forecast Scraper gets **weather forecasts for any city and any date range** from [meteociel.fr](https://www.meteociel.fr), one of the most detailed free forecast sites in Europe. Give it a list of cities and a single day or a range of days, and it returns **structured JSON**: temperature, feels-like, rain, wind speed, gusts and direction, humidity, pressure and the weather condition — either for **every 3- or 6-hour forecast step** or as a **daily summary** (min/max temperature, total rain, strongest gust).

Running it on Apify gives you API access, scheduling (e.g. a fresh forecast every morning), integrations with Google Sheets, Slack, Zapier or Make, and run monitoring — no servers or parsing code to maintain.

### Why scrape weather forecasts from MeteoCiel?

- **Plan around the weather** — events, construction work, deliveries, field operations or trips
- **Feed dashboards and models** — load forecasts for many locations into BI tools, spreadsheets or ML pipelines on a schedule
- **Compare locations** — get the same metrics for dozens of cities in one dataset
- **No API key or weather subscription** — data comes from public MeteoCiel pages
- **Just type city names** — the Actor finds the right MeteoCiel station; add a country to pick between same-name cities (`London, UK` vs `London, Canada`)

### How to scrape weather forecasts for any city

1. Open the **Input** tab
2. Add one or more **cities**, e.g. `Paris`, `Berlin, Germany`, `London, UK`
3. Optionally pick a **start date** and **end date** — only a start date gives you that single day; no dates gives you the full forecast (~10 days)
4. Choose the **output**: every forecast step, or one **daily summary** row per city per day
5. Click **Start** and download the results as JSON, CSV, Excel or HTML from the **Output** tab

### Input

| Field        | Type    | Required | Description                                                                                      |
| ------------ | ------- | -------- | ------------------------------------------------------------------------------------------------ |
| `cities`     | array   | **yes**  | City names, optionally with a country after a comma (English or French name, or ISO code)        |
| `startDate`  | string  | no       | First day: `YYYY-MM-DD`, `today`, `tomorrow` or relative (`"3 days"`). Alone, it selects one day |
| `endDate`    | string  | no       | Last day (inclusive). Alone, the range starts today. Both empty = full forecast                  |
| `outputMode` | string  | no       | `timesteps` (default): one row per forecast step. `daily`: one row per city per day              |
| `delayMs`    | integer | no       | Delay between forecast page requests in ms (default `2000`)                                      |
| `maxRetries` | integer | no       | Retries for a failed city lookup or page request (default `3`)                                   |

Example input — a daily summary for three cities over four days:

```json
{
  "cities": ["Paris", "London, UK", "Berlin, Germany"],
  "startDate": "2026-10-28",
  "endDate": "2026-10-31",
  "outputMode": "daily"
}
```

**Forecast coverage.** MeteoCiel publishes forecasts from **today to about 10 days ahead**: 3-hourly steps for the first ~4 days, then 6-hourly steps. Past dates are not available. Requested days outside this window are listed in the run log and in the `RUN_SUMMARY` record.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Forecast steps (`outputMode: "timesteps"`)

```json
{
  "city": "London, UK",
  "country": "Grande-Bretagne",
  "stationCode": "52947",
  "date": "2026-10-27",
  "hour": "12:00",
  "temperature_c": 13,
  "feels_like_c": 11,
  "wind_direction": "OSO",
  "wind_direction_deg": 248,
  "wind_speed_kmh": 15,
  "wind_gust_kmh": 40,
  "rainfall_mm": 2.5,
  "period_hours": 3,
  "humidity_pct": 80,
  "pressure_hpa": 1009,
  "weather_condition": "Pluie modérée",
  "sunrise": null,
  "sunset": null
}
```

#### Daily summary (`outputMode: "daily"`)

```json
{
  "city": "London, UK",
  "country": "Grande-Bretagne",
  "stationCode": "52947",
  "date": "2026-10-27",
  "temperature_min_c": 10,
  "temperature_max_c": 16,
  "feels_like_min_c": 8,
  "feels_like_max_c": 16,
  "rainfall_total_mm": 4.5,
  "wind_speed_max_kmh": 30,
  "wind_gust_max_kmh": 65,
  "humidity_avg_pct": 80.1,
  "pressure_avg_hpa": 1009.8,
  "main_condition": "Couvert",
  "conditions": ["Couvert", "Pluie modérée", "Mitigé", "Ciel clair"],
  "sunrise": null,
  "sunset": null,
  "steps": 8,
  "coverage_hours": 24,
  "is_full_day": true
}
```

### Data fields

#### Forecast steps

| Field                | Format       | Description                                                                          |
| -------------------- | ------------ | ------------------------------------------------------------------------------------ |
| `city`               | string       | City as given in the input                                                           |
| `country`            | string       | Country as shown by MeteoCiel (French name or ISO code)                              |
| `stationCode`        | string       | MeteoCiel station identifier                                                         |
| `date`               | `YYYY-MM-DD` | Forecast date (city's local time)                                                    |
| `hour`               | `HH:MM`      | Forecast time (city's local time)                                                    |
| `temperature_c`      | number       | Temperature in °C                                                                    |
| `feels_like_c`       | number       | Feels-like (wind chill) temperature in °C                                            |
| `wind_direction`     | string       | Wind direction as a French compass code (`N`, `NE`, `E`, `SE`, `S`, `SO`, `O`, `NO`) |
| `wind_direction_deg` | number       | Wind direction in degrees (0–359)                                                    |
| `wind_speed_kmh`     | number       | Average wind speed in km/h                                                           |
| `wind_gust_kmh`      | number       | Gust speed in km/h                                                                   |
| `rainfall_mm`        | number       | Rain over the step's period in mm (`0` when none)                                    |
| `period_hours`       | number       | Step length: `3` (first ~4 days) or `6` (extended forecast)                          |
| `humidity_pct`       | number       | Relative humidity in %                                                               |
| `pressure_hpa`       | number       | Pressure in hPa                                                                      |
| `weather_condition`  | string       | Weather condition in French (see FAQ for translations)                               |
| `sunrise` / `sunset` | `HH:MM`      | Only on rows for the date MeteoCiel shows them for, otherwise `null`                 |

#### Daily summary

| Field                                      | Description                                                                                       |
| ------------------------------------------ | ------------------------------------------------------------------------------------------------- |
| `temperature_min_c` / `temperature_max_c`  | Lowest / highest forecast temperature of the day                                                  |
| `feels_like_min_c` / `feels_like_max_c`    | Lowest / highest feels-like temperature                                                           |
| `rainfall_total_mm`                        | Total forecast rain over the day                                                                  |
| `wind_speed_max_kmh` / `wind_gust_max_kmh` | Strongest average wind / gust                                                                     |
| `humidity_avg_pct` / `pressure_avg_hpa`    | Average humidity / pressure over the day's steps                                                  |
| `main_condition`                           | Most frequent daytime (06:00–18:00) condition                                                     |
| `conditions`                               | All distinct conditions during the day                                                            |
| `steps` / `coverage_hours`                 | Number of forecast steps aggregated and the hours they cover                                      |
| `is_full_day`                              | `false` for partial days (usually the first and last), whose min/max/totals cover only part of it |

### How much does it cost to scrape MeteoCiel weather forecasts?

The Actor uses **pay-per-event** pricing, plus the Apify platform usage of the run:

| Event                    | Price                   |
| ------------------------ | ----------------------- |
| Result (one dataset row) | $0.05 per 1,000 results |
| Actor start (per GB RAM) | $0.00005                |

It runs with 512 MB of memory and finishes in seconds, so platform usage is a fraction of a cent per run. Examples:

- **Full forecast, 10 cities, every step** — ~550 results ≈ **$0.03**
- **Full forecast, 10 cities, daily summary** — ~110 results ≈ **$0.006**
- **One day for one city** — 1–8 results, well under a cent

The monthly credit on the Apify Free plan covers well over a thousand city forecasts.

### Tips and advanced options

- **Use the daily summary** when you only need "what will the weather be on that day" — it returns about 5× fewer results than every step.
- **Ask only for the dates you need.** The extended (6-hourly) page is only fetched when your range goes beyond ~day 4, so short ranges are faster.
- **Schedule it.** Create a task with your cities and `"startDate": "tomorrow"`, then add a daily schedule to get a fresh forecast every morning.
- **Disambiguate cities** with a country: `London, UK`, `Paris, France`, `Sydney, AU`, `Portland, USA`. When a name is ambiguous, the run log lists the alternatives. French towns can also be narrowed by postal code: `Saint-Denis, 93`.
- **Check `RUN_SUMMARY`** in the key-value store for per-city counts, cities that failed, and requested dates without forecast data.
- **Keep `delayMs` at 2000 or more** for large city lists to stay polite to MeteoCiel.

### FAQ, disclaimers, and support

**Can I get historical (past) weather?**
No. MeteoCiel only publishes forecasts on these pages, so the Actor covers today up to ~10 days ahead. A date range entirely in the past fails with a clear error.

**Why are weather conditions in French?**
They are taken verbatim from MeteoCiel. Terms you will see include `Ciel clair` (clear sky), `Peu nuageux` (partly cloudy), `Mitigé` (mixed sun and clouds), `Voilé` (hazy, high clouds), `Couvert` (overcast), `Pluie faible` / `modérée` / `forte` (light / moderate / heavy rain), `Averses` (showers), `Neige` (snow), `Brouillard` (fog) and `Orage` (thunderstorm).

**Why does `London` return London, Canada?**
MeteoCiel lists it first. Add a country — `London, UK` — to get the one you mean.

**What time zone are dates and hours in?**
The city's local time, as shown on MeteoCiel.

**Why do the first and last day have fewer rows?**
The forecast starts at the current hour and the extended forecast ends mid-day. In daily mode, these days have `is_full_day: false`.

**Is it legal to scrape MeteoCiel?**
This Actor only reads publicly available forecast pages at a polite rate and does not collect personal data. You are responsible for using the data in line with MeteoCiel's terms and applicable law. This Actor is not affiliated with or endorsed by MeteoCiel.

**Something doesn't work, or you need a feature?**
Open an issue in the **Issues** tab — feedback is very welcome. Need a custom weather data solution (other sources, historical data, alerts)? Reach out through the Issues tab.

# Actor input Schema

## `cities` (type: `array`):

City names to get the forecast for. Each city is resolved automatically via Meteociel search. If several cities share a name, add the country after a comma — English or French name, or ISO code (e.g. "London, UK", "Paris, France", "Sydney, AU"). The run log lists alternatives when a name is ambiguous.

## `startDate` (type: `string`):

First day to return, as YYYY-MM-DD or relative to today (e.g. "1 day" = tomorrow). If only the start date is set, only that day is returned. Leave both dates empty to get the full forecast. Meteociel only has forecasts: today up to about 10 days ahead (3-hourly for the first ~4 days, then 6-hourly).

## `endDate` (type: `string`):

Last day to return (inclusive), as YYYY-MM-DD or relative to today (e.g. "7 days"). If only the end date is set, the range starts today.

## `outputMode` (type: `string`):

"Every forecast step" returns one row per 3-hour (first ~4 days) or 6-hour step. "Daily summary" returns one row per city per day with min/max temperature, total rain, max wind and the main weather condition.

## `delayMs` (type: `integer`):

Delay in milliseconds between forecast page requests, to avoid overloading Meteociel.

## `maxRetries` (type: `integer`):

Maximum number of retries for a failed request (station lookup or forecast page).

## Actor input object example

```json
{
  "cities": [
    "Prague",
    "London, UK"
  ],
  "outputMode": "timesteps",
  "delayMs": 2000,
  "maxRetries": 3
}
```

# Actor output Schema

## `forecast` (type: `string`):

No description

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

No description

# 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 = {
    "cities": [
        "Prague",
        "London, UK"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("valentin-b117/meteociel-forecast-scraper").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 = { "cities": [
        "Prague",
        "London, UK",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("valentin-b117/meteociel-forecast-scraper").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 '{
  "cities": [
    "Prague",
    "London, UK"
  ]
}' |
apify call valentin-b117/meteociel-forecast-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,valentin-b117/meteociel-forecast-scraper"
        }
    }
}
```

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/hYtc0jvA69WY7Opmc/builds/lLnWAl9Nrk0DDW7XM/openapi.json
