Ventusky Weather Forecast Scraper
Pricing
from $0.40 / 1,000 results
Ventusky Weather Forecast Scraper
Lightweight weather & air quality scraper for Ventusky. Get hourly, 8-day, and 14-day forecasts globally without expensive API keys or heavy browser automation.
Pricing
from $0.40 / 1,000 results
Rating
0.0
(0)
Developer
Xtractoo
Actor stats
0
Bookmarked
3
Total users
2
Monthly active users
8 days ago
Last modified
Categories
Share
Ventusky Weather Scraper
Extract real-time weather forecasts directly from ventusky.com using reverse-engineered HTTP endpoints - no browser, no Playwright, no API key required.
Input a list of coordinates or city names, get back structured JSON with current conditions, hourly & 8-day forecasts, 14-day meteogram summaries, and air quality data. Each location costs 1–2 HTTP calls and completes in under 1 second (without AQI) or 2–6 seconds (with AQI).
Why use this Actor?
| This Actor | Official API | Browser scraping | |
|---|---|---|---|
| Cost | Free (Ventusky has no public API) | N/A | High memory |
| Speed | ~0.4s per location | - | ~5–15s per page |
| Data depth | Current + 25h hourly + 8-day daily + 14-day meteogram | - | Same, slower |
| AQI | ✅ Real-time WAQI data | - | ✅ |
| Infrastructure | Lightweight HTTP | - | Chromium required |
| Scales to 1,000+ locs | ✅ Concurrent, configurable | - | Memory-constrained |
Use Cases
- Weather dashboards - Embedded forecasts for apps, websites, IoT dashboards
- Agriculture & logistics - Daily precipitation, gust, snow outlook for route planning
- Research & datasets - Bulk weather data collection across hundreds of cities
- Alert systems - Poll every 30 min, trigger webhooks on
rain_probability > 70% - Travel apps - Pre-trip 8-day forecast + air quality for any destination worldwide
- etc...
Input
{"locations": [{ "lat": -6.2088, "lon": 106.8456, "label": "Jakarta" },{ "lat": 40.7128, "lon": -74.006, "label": "New York" },{ "city": "Tokyo", "label": "Tokyo" },{ "city": "London", "label": "London" }],"skipAqi": false,"maxConcurrency": 3}
Input fields
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
locations | array | ✅ | - | List of locations to scrape |
locations[].lat | number | - | - | Latitude in decimal degrees (e.g. -6.2088) |
locations[].lon | number | - | - | Longitude in decimal degrees (e.g. 106.8456) |
locations[].city | string | - | - | City/place name instead of coordinates. Auto-geocoded via Nominatim OSM. |
locations[].label | string | - | - | Optional human-readable tag, included in _meta.label |
skipAqi | boolean | - | false | Skip the WAQI AQI API call. Saves 1–5s per location when air quality data is not needed. |
maxConcurrency | integer | - | 3 | Max locations scraped simultaneously (1–10). |
Each location must have either
lat+lonorcity. If both are given,lat/lontakes priority.
Sample Output
One dataset item per location. Below is real output for New York (April 14, 2026):
{"_meta": {"label": "New York","lat": 40.7128,"lon": -74.006,"elapsed_s": 5.21},"location": {"name": "New York","latitude": "40°42'N","longitude": "74°0'W","elevation_m": null,"timezone": "America/New_York (UTC-4)","coordinates_raw": "40.71;-74.01;New York;new-york"},"current_weather": {"condition": "clear sky","temperature": "16.7 °C","wind_speed": "11 km/h","pressure": "1016 hPa","visibility": "16 km","clouds": "0 %","station_info": "Weather report from station Manhattan/dwntwn, Distance: 2 km (06:56 2026/04/14)"},"hourly_forecast": [{"time": "08:00","time_epoch": 1776171600,"condition": "clear sky","temperature": "19 °C","precipitation": "0 mm","rain_probability": "0 %","wind_direction": "SW","wind_speed": "4 km/h"},{"time": "09:00","time_epoch": 1776175200,"condition": "clear sky","temperature": "22 °C","precipitation": "0 mm","rain_probability": "0 %","wind_direction": "S","wind_speed": "3 km/h"},// ... 14 more today slots ...{"time": "00:00 tomorrow","time_epoch": 1776229200,"condition": "overcast","temperature": "21 °C","precipitation": "0 mm","rain_probability": "10 %","wind_direction": "SW","wind_speed": "18 km/h"}// ... 8 more tomorrow slots (total 25 hourly slots)],"daily_forecast": [{"date": "2026/04/15","slots": [{"time": "01:00","time_epoch": 1776232800,"temperature": "20 °C","condition": "overcast","precipitation": "0 mm","wind_speed": "16 km/h","gust_speed": "32 km/h","wind_direction": "SW","wind_direction_deg": 225,"rain_probability": "10 %"},{"time": "04:00","time_epoch": 1776243600,"temperature": "18 °C","condition": "clear sky","precipitation": "0 mm","wind_speed": "7 km/h","gust_speed": "18 km/h","wind_direction": "SW","wind_direction_deg": 225,"rain_probability": "0 %"}// ... 6 more slots per day (07:00, 10:00, 13:00, 16:00, 19:00, 22:00)]}// ... 7 more days (2026/04/16 through 2026/04/22, total 8 days × 8 slots)],"meteogram": {"timezone": "America/New_York","days": [{"date": "14/04/2026","date_epoch": 1776142800,"day": "Tue","min_temp": 17,"max_temp": 31,"rain_total_mm": 0.3,"gust_kmh": 40,"snow_cm": 0.0,"weather_symbol": 1},{"date": "15/04/2026","date_epoch": 1776229200,"day": "Wed","min_temp": 18,"max_temp": 30,"rain_total_mm": 1.0,"gust_kmh": 36,"snow_cm": 0.0,"weather_symbol": 2}// ... 12 more days (total 14 days, through 2026/04/27)]},"air_quality": {"quality": "Good","quality_index": 0,"description": "Air quality index (marked as AQI) is developed by Environmental Protection Agency...","value": 55,"station_within_range": true,"station_name": "New York","station_dist_km": 0.0,"dominant_pollutant": "pm25","pollutants": {"pm25": 55,"t": 19.4,"h": 79.6,"p": 1017.5,"w": 3.5}}}
Output field reference
_meta
| Field | Description |
|---|---|
label | The label value from the input (if provided) |
lat / lon | Resolved coordinates used for the request |
elapsed_s | Total scrape time for this location in seconds |
location
| Field | Description |
|---|---|
name | Location display name from Ventusky |
latitude / longitude | DMS-formatted coordinates (e.g. "40°42'N") |
elevation_m | Elevation in meters, or null if not shown |
timezone | IANA timezone name + UTC offset (e.g. "America/New_York (UTC-4)") |
coordinates_raw | Internal Ventusky coordinate string |
current_weather
Current conditions from the nearest weather station.
| Field | Description |
|---|---|
condition | Text description of current sky/precipitation (e.g. "clear sky") |
temperature | Temperature with unit (e.g. "16.7 °C") |
wind_speed | Wind speed (e.g. "11 km/h") |
pressure | Atmospheric pressure (e.g. "1016 hPa") |
visibility | Visibility distance (e.g. "16 km") |
clouds | Cloud cover percentage |
cloud_base | Cloud base altitude (when clouds are present) |
station_info | Source station name, distance, and observation time |
hourly_forecast - 25 hourly slots
Today's remaining hours + next morning. Fields per slot:
| Field | Description |
|---|---|
time | Local time label (e.g. "17:00", "02:00 tomorrow") |
time_epoch | UTC Unix timestamp of the slot |
condition | Sky/precipitation condition text |
temperature | Temperature string |
precipitation | Precipitation in mm |
rain_probability | Probability of rain (%) |
wind_direction | Compass label (e.g. "SW", "NW") |
wind_speed | Wind speed string |
daily_forecast - 8 days × 8 slots (every 3 hours)
Each day object has date (YYYY/MM/DD) and a slots array. Each slot:
| Field | Description |
|---|---|
time / time_epoch | 3-hour slot time (01:00, 04:00 … 22:00) and UTC epoch |
temperature | Temperature at this slot |
condition | Weather condition text |
precipitation | Precipitation mm |
wind_speed / gust_speed | Wind and gust speed |
wind_direction / wind_direction_deg | Direction label and degrees |
rain_probability | Rain probability % (may be null for distant future slots) |
meteogram - 14-day daily summary
days array, one entry per calendar day.
| Field | Description |
|---|---|
date / date_epoch | Date (DD/MM/YYYY) and UTC epoch of local midnight |
day | Day abbreviation (e.g. "Tue", "Wed") |
min_temp / max_temp | Daily min/max temperature (°C) |
rain_total_mm | Total daily accumulated rain (mm) |
gust_kmh | Max daily wind gust (km/h) |
snow_cm | Total daily snow accumulation (cm) |
weather_symbol | Ventusky weather symbol code |
air_quality
| Field | Description |
|---|---|
quality | Human-readable band (e.g. "Good", "Moderate") |
quality_index | 0=Good, 1=Moderate, 2=USG, 3=Unhealthy, 4=Very Unhealthy, 5=Hazardous |
description | EPA AQI scale description |
value | Numeric AQI (0–500), always returned (never suppressed) |
station_within_range | true if nearest station ≤ 10 km |
station_name | Name of the WAQI reporting station |
station_dist_km | Distance to reporting station in km |
dominant_pollutant | Primary pollutant key (e.g. "pm25") |
pollutants | Map of individual readings (pm25, pm10, o3, t, h, p, w) |
Data Source & Freshness
- Weather data: Ventusky.com - aggregates GFS, ECMWF, NAM, and other numerical weather models. Updated every 3–6 hours.
- AQI data: WAQI (World Air Quality Index) - real-time sensor data, updates hourly.
- Geocoding: OpenStreetMap Nominatim - used only when
cityinput is provided instead of coordinates.
Sample Integrations
Retrieve results:
GET https://api.apify.com/v2/datasets/{datasetId}/items?format=json
Zapier / Make
Use the Apify connector → "Watch Actor Run" trigger → parse defaultDatasetId → fetch dataset items.
Scheduled runs
Set a Cron schedule under Actor → Settings → Scheduling. Example for every 6 hours:
0 */6 * * *
API call example
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"locations": [{ "city": "Jakarta" },{ "lat": 40.7128, "lon": -74.006, "label": "New York" }],"skipAqi": false,"maxConcurrency": 3}'
Support
- Found a bug or the site structure changed? Open an issue on the Actor's page.
- For integration help, write in the Actor discussion forum on Apify Console.