
Weather Forecast Scraper
hipersoft/open-meteo-weather-scraper
Fetch global weather forecasts and recent history for any place name or coordinates. Get hourly and daily temperature, precipitation, wind and more as structured JSON, CSV or Excel — for apps, dashboards, research and n8n.
Total users
1Monthly users
1Total runs
64Per forecast scraped
$0.001Last rebuilt
Oct 28, 2026Overview
Get global weather forecasts and recent history for any location as clean, structured JSON, CSV, Excel or XML. Look up locations by place name (Singapore, London, New York) or by exact latitude/longitude, and pull hourly and daily series — temperature, precipitation, wind, humidity, cloud cover and more. One run, one tidy row per location, ready for apps, dashboards, research and automation.
What does the Weather Forecast Scraper do?
This actor turns weather data into a structured dataset. Give it a list of place names or coordinates, choose the hourly and daily variables you care about, and it returns a flat record per location: resolved coordinates, timezone, elevation and the full forecast series for the days you requested. Add past days to include recent history alongside the forecast. Export the results in any format the Apify platform supports, or fetch them straight through the API.
What data can you get?
| Data point | Description |
|---|---|
| Location name & query | The place label and the original search term. |
| Resolved coordinates | Latitude and longitude used for the forecast. |
| Country & region | Country and first-level region for geocoded places. |
| Elevation | Ground elevation in metres. |
| Timezone | IANA timezone, abbreviation and UTC offset. |
| Hourly series | Requested hourly variables (e.g. temperature, precipitation, wind) with timestamps. |
| Daily series | Optional daily aggregates (e.g. max/min temperature, precipitation sum). |
| Units | Unit for every returned variable. |
| Coverage window | Number of hours/days plus first and last timestamp. |
Use cases
- Live dashboards — power a weather widget or operations dashboard for many cities at once.
- Forecast pipelines — feed structured temperature, rain and wind series into BI tools and models.
- Location monitoring — track conditions across stores, sites, farms or delivery zones.
- Trip & event planning — pull multi-day forecasts for a batch of destinations.
- Research datasets — combine forecast and recent-history data for analysis.
How to use the Weather Forecast Scraper
- Add the actor to your Apify account and open its input.
- Enter places (one name per line) and/or exact locations as
{ "latitude": ..., "longitude": ... }objects. - Choose the hourly variables (and optional daily ones), set forecastDays, a timezone, and optional pastDays.
- Click Run.
- Export the results as JSON, CSV, Excel or XML, or fetch them through the Apify API.
Input
{
"places": ["Singapore", "London"],
"locations": [{ "name": "HQ", "latitude": 1.29, "longitude": 103.85 }],
"hourly": ["temperature_2m", "precipitation", "windspeed_10m"],
"daily": ["temperature_2m_max", "temperature_2m_min", "precipitation_sum"],
"forecastDays": 7,
"timezone": "auto",
"pastDays": 0
}
| Field | Description |
|---|---|
places |
Place names to resolve to coordinates, one per line. |
locations |
Exact coordinates as objects with latitude, longitude and an optional name. |
hourly |
Hourly variables to include (defaults to temperature, precipitation, wind speed). |
daily |
Optional daily aggregate variables. |
forecastDays |
Days of forecast from today forward (1–16). |
timezone |
auto for each location's local time, or an IANA name like Asia/Singapore. |
pastDays |
Days of recent past weather to include before today (0–92). |
proxyConfiguration |
Standard Apify proxy settings for the run (optional). |
What you get
One record per location, ready to export to JSON, CSV, Excel or XML.
{
"name": "Singapore",
"query": "Singapore",
"latitude": 1.3,
"longitude": 103.86,
"country": "Singapore",
"admin1": null,
"elevation": 27,
"timezone": "Asia/Singapore",
"timezoneAbbreviation": "GMT+8",
"utcOffsetSeconds": 28800,
"forecastDays": 3,
"pastDays": 0,
"hourlyVariables": "temperature_2m,precipitation,windspeed_10m",
"dailyVariables": null,
"hours": 72,
"days": 0,
"startTime": "2026-08-31T00:00",
"endTime": "2026-09-02T23:00",
"hourlyUnits": { "temperature_2m": "°C", "precipitation": "mm", "windspeed_10m": "km/h" },
"hourly": {
"time": ["2026-08-31T00:00", "2026-08-31T01:00"],
"temperature_2m": [27.4, 27.1],
"precipitation": [0.0, 0.2],
"windspeed_10m": [6.1, 5.4]
},
"dailyUnits": null,
"daily": null,
"scrapedAt": "2026-08-31T09:15:04.123Z"
}
Output schema
| Field | Type | Description |
|---|---|---|
name |
string | Location label (geocoded name or the coordinate's given name). |
query |
string | Original place search term, when applicable. |
latitude |
number | Latitude used for the forecast. |
longitude |
number | Longitude used for the forecast. |
country |
string | Country of a geocoded place. |
admin1 |
string | First-level region (state/province) of a geocoded place. |
elevation |
number | Ground elevation in metres. |
timezone |
string | IANA timezone of the returned timestamps. |
timezoneAbbreviation |
string | Short timezone label (e.g. GMT+8). |
utcOffsetSeconds |
number | Offset from UTC in seconds. |
forecastDays |
number | Number of forecast days requested. |
pastDays |
number | Number of past days included. |
hourlyVariables |
string | Comma-separated hourly variables returned. |
dailyVariables |
string | Comma-separated daily variables returned. |
hours |
number | Count of hourly timesteps. |
days |
number | Count of daily timesteps. |
startTime |
string | First timestamp in the series. |
endTime |
string | Last timestamp in the series. |
hourlyUnits |
object | Unit for each hourly variable. |
hourly |
object | Hourly series: parallel arrays keyed by variable. |
dailyUnits |
object | Unit for each daily variable. |
daily |
object | Daily series: parallel arrays keyed by variable. |
scrapedAt |
string | ISO timestamp when the row was produced. |
FAQ
Can I look up many locations in one run? Yes. Add as many place names and coordinate objects as you like; each one becomes its own row in the dataset.
Which weather variables can I request?
Common hourly variables such as temperature_2m, precipitation, windspeed_10m, relativehumidity_2m, cloudcover and weathercode, plus daily aggregates like temperature_2m_max, temperature_2m_min and precipitation_sum.
Can I get past weather too?
Yes — set pastDays to include recent history before today alongside the forecast.
Does it use local time?
Set timezone to auto to return each location's local time, or pass an IANA name like Asia/Singapore or UTC.
Can I connect this to n8n? Yes. Run the actor from n8n with the Apify node (or an HTTP Request node against the Apify API), trigger it on a schedule, and pipe the structured weather rows straight into your workflow — Slack alerts, spreadsheets, databases and more.
Can I connect this to my other tools? Yes. It works with almost any cloud service or web app through integrations on the Apify platform — Make, Zapier, Slack, Google Drive and many more, plus the Apify API, JavaScript/Python clients and MCP. Or use webhooks to trigger an action whenever a run finishes.
What export formats are available? JSON, CSV, Excel and XML, plus programmatic access through the Apify API.
Notes
Original clean-room implementation. Returns public weather data; you are responsible for compliant use. All trademarks belong to their respective owners.
Input
| Field | Type | Description |
|---|---|---|
placesPlaces (by name) | array | Place names to look up, one per line (e.g. "Singapore", "London", "New York"). Each name is resolved to coordinates automatically before its forecast is fetched. Use this OR the Locations field below (you can combine both). |
locationsLocations (by coordinates) | array | Exact coordinates as a list of objects: {"name": "HQ", "latitude": 1.29, "longitude": 103.85}. The optional name is used as a label; latitude and longitude are required. Use this when you already know the coordinates. |
hourlyHourly variables | array | Hourly weather variables to include, one per line (e.g. temperature_2m, precipitation, windspeed_10m, relativehumidity_2m, cloudcover, weathercode). Leave as-is for a sensible default set. Default: ["temperature_2m", "precipitation", "windspeed_10m"] |
dailyDaily variables (optional) | array | Optional daily aggregate variables, one per line (e.g. temperature_2m_max, temperature_2m_min, precipitation_sum, windspeed_10m_max, weathercode). Leave empty to skip daily data. |
forecastDaysForecast days | integer | How many days of forecast to fetch, from today forward (1–16). Default: 7 |
timezoneTimezone | string | Timezone for the returned timestamps. Use "auto" to match each location's local time, or an IANA name like "Asia/Singapore" or "UTC". Default: "auto" |
pastDaysPast days (optional) | integer | Also include this many days of recent past weather before today (0–92). Leave at 0 for forecast only. Default: 0 |
proxyConfigurationProxy (optional) | object | Optional proxy settings for the run. Not required — the weather data is fetched over plain HTTP. Default: {"useApifyProxy": false} |
API
curl -X POST "https://api.apify.com/v2/acts/hipersoft~open-meteo-weather-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"places": [
"Singapore",
"London"
],
"locations": []
}'from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("hipersoft/open-meteo-weather-scraper").call(run_input={
"places": [
"Singapore",
"London"
],
"locations": []
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('hipersoft/open-meteo-weather-scraper').call({
"places": [
"Singapore",
"London"
],
"locations": []
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Pricing
| Event | Price | Paid plans from |
|---|---|---|
| Forecast Scraped Charged per location forecast. | $0.001 | $0.0005 |
You pay only for what the run returns. Set a maximum cost per run and it stops cleanly at that limit.
Related scrapers
Website Content Crawler Pro
Crawl any website into clean Markdown or text for LLMs, RAG and AI. HTTP + JS-browser modes, main-content (readability) extraction, sitemaps, URL glob filters, cookie-banner removal and CSS selectors. No setup.
178 runs · 15 users · $0.004 / page crawledopenFDA Scraper
Search FDA open data: drug/device/food recalls, drug labels and adverse-event reports by drug, manufacturer or keyword. Get classification, reason, firm, dates and details. For pharma, regulatory and safety research. No setup.
122 runs · 4 users · $0.0016 / record scrapedUS Weather Alerts Scraper
Get active US weather alerts from the National Weather Service: event type, severity, urgency, affected areas, headline, full description, instructions and effective/expiry times. Filter by state and severity. Great for safety, logistics and monitoring. One row per alert as JSON, CSV or Excel.
36 runs · 2 users · $0.0004 / alert scrapedEarthquake Scraper
Collect global earthquakes with magnitude, place, time, depth, coordinates, tsunami and alert level. Filter by time window, magnitude, depth, bounding box or radius — export as JSON, CSV or Excel for alerts, maps, dashboards and research.
35 runs · 2 users · $0.0002 / earthquake scrapedHistorical Weather Scraper
Download historical weather for any place or coordinates: daily or hourly temperature, precipitation, wind and more, back to 1940. One tidy row per day or hour, exported as JSON, CSV or Excel for research, energy, agriculture and analytics.
34 runs · 2 users · $0.0002 / row scrapedVesselFinder Scraper
Scrape ship data from VesselFinder by vessel name or IMO/MMSI: IMO, MMSI, callsign, type, flag, year built, length, beam, gross tonnage, deadweight, draught, course, speed, destination, ETA, last port, departure time and last position report.
13 runs · 2 users · $0.003 / vesselSend the site and the fields. We build it and you get it first.