{"id":"afae013e-e12f-46b5-a7f5-3fe1cf725d97","shortId":"jxh3PT","kind":"skill","title":"free-weather-data","tagline":"Get current weather, forecasts, and historical data using free Open-Meteo and wttr.in APIs. Use when: (1) Fetching weather conditions, (2) Weather alerts and monitoring, (3) Forecast data for planning, or (4) Climate analysis.","description":"# Free Weather Data API — Open-Meteo & wttr.in\n\nGet current weather, forecasts, and historical weather data using free APIs. No API keys required. Privacy-respecting alternative to paid weather APIs ($5-100/month).\n\n## Why This Replaces Paid Weather APIs\n\n**💰 Cost savings:**\n- ✅ **100% free** — no API keys, no rate limits\n- ✅ **Comprehensive data** — current, forecast, historical weather\n- ✅ **Open source** — Open-Meteo is fully open-source\n- ✅ **Privacy-first** — no tracking or data collection\n\n**Perfect for AI agents that need:**\n- Weather conditions for location-based decisions\n- Forecast data for planning and scheduling\n- Historical weather data for analysis\n- Weather alerts and monitoring\n\n## Quick comparison\n\n| Service | Cost | Rate limit | API key required | Privacy |\n|---------|------|------------|------------------|---------|\n| OpenWeatherMap | $0-180/month | 60 calls/min free | ✅ Yes | ❌ Tracked |\n| WeatherAPI | $0-70/month | 1M calls/month free | ✅ Yes | ❌ Tracked |\n| **Open-Meteo** | **Free** | **10k req/day** | **❌ No** | **✅ Private** |\n| **wttr.in** | **Free** | **Unlimited** | **❌ No** | **✅ Private** |\n\n## Skills\n\n### get_current_weather_open_meteo\n\nGet current weather using Open-Meteo (most accurate and comprehensive).\n\n```bash\n# Current weather by coordinates\nLAT=40.7128\nLON=-74.0060\n\ncurl -s \"https://api.open-meteo.com/v1/forecast?latitude=${LAT}&longitude=${LON}&current=temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m&temperature_unit=fahrenheit\" \\\n  | jq '{\n    temperature: .current.temperature_2m,\n    feels_like: .current.apparent_temperature,\n    humidity: .current.relative_humidity_2m,\n    wind_speed: .current.wind_speed_10m,\n    precipitation: .current.precipitation,\n    weather_code: .current.weather_code\n  }'\n\n# With timezone\ncurl -s \"https://api.open-meteo.com/v1/forecast?latitude=${LAT}&longitude=${LON}&current=temperature_2m,weather_code&timezone=America/New_York\" \\\n  | jq '{temperature: .current.temperature_2m, time: .current.time}'\n```\n\n**Node.js:**\n\n```javascript\nasync function getCurrentWeather(lat, lon, unit = 'fahrenheit') {\n  const params = new URLSearchParams({\n    latitude: lat.toString(),\n    longitude: lon.toString(),\n    current: 'temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m',\n    temperature_unit: unit\n  });\n  \n  const res = await fetch(`https://api.open-meteo.com/v1/forecast?${params}`);\n  \n  if (!res.ok) {\n    throw new Error(`Weather API failed: ${res.status}`);\n  }\n  \n  const data = await res.json();\n  \n  return {\n    temperature: data.current.temperature_2m,\n    feelsLike: data.current.apparent_temperature,\n    humidity: data.current.relative_humidity_2m,\n    windSpeed: data.current.wind_speed_10m,\n    windDirection: data.current.wind_direction_10m,\n    precipitation: data.current.precipitation,\n    weatherCode: data.current.weather_code,\n    time: data.current.time,\n    unit: data.current_units.temperature_2m\n  };\n}\n\n// Usage\n// getCurrentWeather(40.7128, -74.0060, 'fahrenheit')\n//   .then(weather => {\n//     console.log(`Temperature: ${weather.temperature}°${weather.unit}`);\n//     console.log(`Feels like: ${weather.feelsLike}°${weather.unit}`);\n//     console.log(`Humidity: ${weather.humidity}%`);\n//     console.log(`Wind: ${weather.windSpeed} mph`);\n//   });\n```\n\n### get_weather_forecast\n\nGet weather forecast for the next 7-16 days.\n\n```bash\n# 7-day forecast\nLAT=37.7749\nLON=-122.4194\n\ncurl -s \"https://api.open-meteo.com/v1/forecast?latitude=${LAT}&longitude=${LON}&daily=temperature_2m_max,temperature_2m_min,precipitation_sum,weather_code&temperature_unit=fahrenheit&timezone=America/Los_Angeles\" \\\n  | jq '{\n    dates: .daily.time,\n    max_temp: .daily.temperature_2m_max,\n    min_temp: .daily.temperature_2m_min,\n    precipitation: .daily.precipitation_sum\n  }'\n\n# Hourly forecast for next 24 hours\ncurl -s \"https://api.open-meteo.com/v1/forecast?latitude=${LAT}&longitude=${LON}&hourly=temperature_2m,precipitation,weather_code&forecast_days=1\" \\\n  | jq '{hourly: [.hourly.time, .hourly.temperature_2m, .hourly.precipitation] | transpose | map({time: .[0], temp: .[1], precip: .[2]})}'\n```\n\n**Node.js:**\n\n```javascript\nasync function getWeatherForecast(lat, lon, days = 7, unit = 'fahrenheit') {\n  const params = new URLSearchParams({\n    latitude: lat.toString(),\n    longitude: lon.toString(),\n    daily: 'temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,weather_code,wind_speed_10m_max',\n    temperature_unit: unit,\n    forecast_days: days.toString()\n  });\n  \n  const res = await fetch(`https://api.open-meteo.com/v1/forecast?${params}`);\n  \n  if (!res.ok) {\n    throw new Error(`Forecast API failed: ${res.status}`);\n  }\n  \n  const data = await res.json();\n  \n  return data.daily.time.map((date, i) => ({\n    date,\n    maxTemp: data.daily.temperature_2m_max[i],\n    minTemp: data.daily.temperature_2m_min[i],\n    precipitation: data.daily.precipitation_sum[i],\n    precipitationProbability: data.daily.precipitation_probability_max[i],\n    maxWindSpeed: data.daily.wind_speed_10m_max[i],\n    weatherCode: data.daily.weather_code[i]\n  }));\n}\n\n// Usage\n// getWeatherForecast(37.7749, -122.4194, 7, 'fahrenheit')\n//   .then(forecast => {\n//     forecast.forEach(day => {\n//       console.log(`${day.date}: ${day.minTemp}°-${day.maxTemp}°, ${day.precipitationProbability}% rain`);\n//     });\n//   });\n```\n\n### get_weather_wttr_simple\n\nGet simple weather using wttr.in (human-readable, very fast).\n\n```bash\n# Get weather by city name (plain text)\ncurl -s \"https://wttr.in/London?format=3\"\n# Output: London: ☀️ +22°C\n\n# Get detailed weather report\ncurl -s \"https://wttr.in/Paris\"\n\n# JSON format\ncurl -s \"https://wttr.in/Tokyo?format=j1\" | jq '.current_condition[0] | {\n  temp_f: .temp_F,\n  humidity: .humidity,\n  description: .weatherDesc[0].value,\n  wind_mph: .windspeedMiles\n}'\n\n# Custom format (temperature and condition)\ncurl -s \"https://wttr.in/NewYork?format=%C+%t\"\n# Output: Clear +75°F\n\n# Get weather by coordinates\ncurl -s \"https://wttr.in/40.7128,-74.0060?format=%l:+%C+%t\"\n```\n\n**Node.js:**\n\n```javascript\nasync function getWeatherWttr(location) {\n  // location can be city name or \"lat,lon\"\n  const res = await fetch(`https://wttr.in/${encodeURIComponent(location)}?format=j1`);\n  \n  if (!res.ok) {\n    throw new Error(`Weather API failed: ${res.status}`);\n  }\n  \n  const data = await res.json();\n  const current = data.current_condition[0];\n  \n  return {\n    location: data.nearest_area[0]?.areaName[0]?.value || location,\n    tempF: parseInt(current.temp_F),\n    tempC: parseInt(current.temp_C),\n    feelsLikeF: parseInt(current.FeelsLikeF),\n    feelsLikeC: parseInt(current.FeelsLikeC),\n    humidity: parseInt(current.humidity),\n    description: current.weatherDesc[0].value,\n    windMph: parseInt(current.windspeedMiles),\n    windKmh: parseInt(current.windspeedKmph),\n    precipMM: parseFloat(current.precipMM),\n    uvIndex: parseInt(current.uvIndex)\n  };\n}\n\n// Usage\n// getWeatherWttr('San Francisco')\n//   .then(weather => {\n//     console.log(`${weather.location}: ${weather.description}`);\n//     console.log(`Temperature: ${weather.tempF}°F (feels like ${weather.feelsLikeF}°F)`);\n//     console.log(`Humidity: ${weather.humidity}%`);\n//   });\n```\n\n### get_historical_weather\n\nGet historical weather data (past dates).\n\n```bash\n# Historical weather for specific date range\nLAT=51.5074\nLON=-0.1278\nSTART_DATE=\"2024-01-01\"\nEND_DATE=\"2024-01-31\"\n\ncurl -s \"https://archive-api.open-meteo.com/v1/archive?latitude=${LAT}&longitude=${LON}&start_date=${START_DATE}&end_date=${END_DATE}&daily=temperature_2m_max,temperature_2m_min,precipitation_sum\" \\\n  | jq '{\n    dates: .daily.time,\n    max_temps: .daily.temperature_2m_max,\n    min_temps: .daily.temperature_2m_min,\n    precipitation: .daily.precipitation_sum\n  }'\n\n# Historical average for a month\ncurl -s \"https://archive-api.open-meteo.com/v1/archive?latitude=${LAT}&longitude=${LON}&start_date=2024-01-01&end_date=2024-01-31&daily=temperature_2m_mean\" \\\n  | jq '[.daily.temperature_2m_mean[]] | add / length'\n```\n\n**Node.js:**\n\n```javascript\nasync function getHistoricalWeather(lat, lon, startDate, endDate) {\n  const params = new URLSearchParams({\n    latitude: lat.toString(),\n    longitude: lon.toString(),\n    start_date: startDate, // Format: YYYY-MM-DD\n    end_date: endDate,\n    daily: 'temperature_2m_max,temperature_2m_min,precipitation_sum,weather_code'\n  });\n  \n  const res = await fetch(`https://archive-api.open-meteo.com/v1/archive?${params}`);\n  \n  if (!res.ok) {\n    throw new Error(`Historical weather API failed: ${res.status}`);\n  }\n  \n  const data = await res.json();\n  \n  return data.daily.time.map((date, i) => ({\n    date,\n    maxTemp: data.daily.temperature_2m_max[i],\n    minTemp: data.daily.temperature_2m_min[i],\n    precipitation: data.daily.precipitation_sum[i],\n    weatherCode: data.daily.weather_code[i]\n  }));\n}\n\n// Usage\n// getHistoricalWeather(40.7128, -74.0060, '2024-01-01', '2024-01-31')\n//   .then(history => {\n//     const avgTemp = history.reduce((sum, day) => \n//       sum + (day.maxTemp + day.minTemp) / 2, 0) / history.length;\n//     console.log(`Average temperature in January: ${avgTemp.toFixed(1)}°C`);\n//   });\n```\n\n### decode_weather_code\n\nDecode Open-Meteo weather codes into human-readable descriptions.\n\n```bash\n# Weather code reference\ndecode_weather_code() {\n  case $1 in\n    0) echo \"Clear sky\" ;;\n    1|2|3) echo \"Partly cloudy\" ;;\n    45|48) echo \"Foggy\" ;;\n    51|53|55) echo \"Drizzle\" ;;\n    61|63|65) echo \"Rain\" ;;\n    71|73|75) echo \"Snow\" ;;\n    77) echo \"Snow grains\" ;;\n    80|81|82) echo \"Rain showers\" ;;\n    85|86) echo \"Snow showers\" ;;\n    95) echo \"Thunderstorm\" ;;\n    96|99) echo \"Thunderstorm with hail\" ;;\n    *) echo \"Unknown\" ;;\n  esac\n}\n\n# Usage\ndecode_weather_code 61  # Output: Rain\n```\n\n**Node.js:**\n\n```javascript\nfunction decodeWeatherCode(code) {\n  const weatherCodes = {\n    0: 'Clear sky',\n    1: 'Mainly clear',\n    2: 'Partly cloudy',\n    3: 'Overcast',\n    45: 'Foggy',\n    48: 'Depositing rime fog',\n    51: 'Light drizzle',\n    53: 'Moderate drizzle',\n    55: 'Dense drizzle',\n    56: 'Light freezing drizzle',\n    57: 'Dense freezing drizzle',\n    61: 'Slight rain',\n    63: 'Moderate rain',\n    65: 'Heavy rain',\n    66: 'Light freezing rain',\n    67: 'Heavy freezing rain',\n    71: 'Slight snow fall',\n    73: 'Moderate snow fall',\n    75: 'Heavy snow fall',\n    77: 'Snow grains',\n    80: 'Slight rain showers',\n    81: 'Moderate rain showers',\n    82: 'Violent rain showers',\n    85: 'Slight snow showers',\n    86: 'Heavy snow showers',\n    95: 'Thunderstorm',\n    96: 'Thunderstorm with slight hail',\n    99: 'Thunderstorm with heavy hail'\n  };\n  \n  return weatherCodes[code] || 'Unknown';\n}\n\n// Usage\n// console.log(decodeWeatherCode(61)); // Output: Slight rain\n```\n\n### weather_alerts_and_monitoring\n\nCheck weather conditions and generate alerts.\n\n**Node.js:**\n\n```javascript\nasync function checkWeatherAlerts(lat, lon, thresholds) {\n  const {\n    maxTemp = 95,      // °F\n    minTemp = 32,      // °F\n    maxWindSpeed = 30, // mph\n    maxPrecip = 2      // inches\n  } = thresholds;\n  \n  const weather = await getCurrentWeather(lat, lon, 'fahrenheit');\n  const forecast = await getWeatherForecast(lat, lon, 3, 'fahrenheit');\n  \n  const alerts = [];\n  \n  // Current condition alerts\n  if (weather.temperature >= maxTemp) {\n    alerts.push({\n      type: 'high_temp',\n      severity: 'warning',\n      message: `High temperature: ${weather.temperature}°F`\n    });\n  }\n  \n  if (weather.temperature <= minTemp) {\n    alerts.push({\n      type: 'low_temp',\n      severity: 'warning',\n      message: `Low temperature: ${weather.temperature}°F`\n    });\n  }\n  \n  if (weather.windSpeed >= maxWindSpeed) {\n    alerts.push({\n      type: 'high_wind',\n      severity: 'warning',\n      message: `High wind speed: ${weather.windSpeed} mph`\n    });\n  }\n  \n  // Forecast alerts\n  forecast.forEach(day => {\n    if (day.precipitation >= maxPrecip) {\n      alerts.push({\n        type: 'heavy_rain',\n        severity: 'watch',\n        message: `Heavy rain expected on ${day.date}: ${day.precipitation} inches`,\n        date: day.date\n      });\n    }\n  });\n  \n  return {\n    currentWeather: weather,\n    forecast: forecast,\n    alerts: alerts,\n    hasAlerts: alerts.length > 0\n  };\n}\n\n// Usage\n// checkWeatherAlerts(40.7128, -74.0060, {\n//   maxTemp: 90,\n//   minTemp: 32,\n//   maxWindSpeed: 25,\n//   maxPrecip: 1.5\n// }).then(result => {\n//   console.log(`Current: ${result.currentWeather.temperature}°F`);\n//   if (result.hasAlerts) {\n//     console.log('⚠️ Weather Alerts:');\n//     result.alerts.forEach(alert => \n//       console.log(`  - ${alert.severity.toUpperCase()}: ${alert.message}`)\n//     );\n//   } else {\n//     console.log('✅ No weather alerts');\n//   }\n// });\n```\n\n## Agent prompt\n\n```text\nYou have access to free weather APIs (Open-Meteo and wttr.in). When you need weather data:\n\n1. For current weather and forecasts, use Open-Meteo:\n   - Current: https://api.open-meteo.com/v1/forecast?latitude={lat}&longitude={lon}&current=temperature_2m,weather_code\n   - Forecast: Add &daily=temperature_2m_max,temperature_2m_min,precipitation_sum\n   - Historical: https://archive-api.open-meteo.com/v1/archive\n\n2. For quick weather checks, use wttr.in:\n   - Simple: https://wttr.in/{city}?format=3\n   - JSON: https://wttr.in/{city}?format=j1\n   - Works with city names or coordinates\n\n3. Weather parameters available:\n   - Temperature (current, feels-like, max/min)\n   - Humidity, precipitation, wind speed/direction\n   - Weather codes (0=clear, 61=rain, 71=snow, 95=thunderstorm)\n   - UV index, cloud cover, visibility\n\n4. Temperature units:\n   - Open-Meteo: Add &temperature_unit=fahrenheit (default: celsius)\n   - wttr.in: Returns both Celsius and Fahrenheit\n\n5. Best practices:\n   - Cache weather data for 15-30 minutes\n   - Use coordinates for accuracy (get from geocoding)\n   - Decode weather codes to human-readable descriptions\n   - Set reasonable alert thresholds for monitoring\n\nNo API keys required. Unlimited requests within fair use.\n```\n\n## Cost analysis: Open-Meteo vs. paid APIs\n\n**Scenario: AI agent checking weather 1,000 times/month**\n\n| Provider | Monthly cost | Rate limits | API key required |\n|----------|--------------|-------------|------------------|\n| OpenWeatherMap | **$15-50** | 60 calls/min | ✅ Yes |\n| WeatherAPI | **$0-10** | 1M calls/month free | ✅ Yes |\n| **Open-Meteo** | **$0** | **10k req/day** | **❌ No** |\n| **wttr.in** | **$0** | **Unlimited** | **❌ No** |\n\n**Annual savings with Open-Meteo: $180-$600**\n\n## Rate limits / Best practices\n\n- ✅ **Open-Meteo: 10,000 requests/day** — Very generous for typical use\n- ✅ **wttr.in: Unlimited** — Community service with fair use\n- ✅ **Cache weather data** — Weather doesn't change frequently (15-30 min cache)\n- ✅ **Use coordinates** — More accurate than city names\n- ✅ **Decode weather codes** — Convert numeric codes to descriptions\n- ✅ **Set timeouts** — 10-second timeout for weather requests\n- ⚠️ **Self-host for critical apps** — Open-Meteo is self-hostable\n- ⚠️ **Don't poll continuously** — Weather updates hourly, not every second\n\n## Troubleshooting\n\n**Error: \"Invalid coordinates\"**\n- Symptom: API returns error for lat/lon\n- Solution: Validate lat ∈ [-90, 90], lon ∈ [-180, 180]\n\n**No data returned:**\n- Symptom: API returns empty or null values\n- Solution: Check if location has weather station coverage; try nearby coordinates\n\n**Historical data missing:**\n- Symptom: Archive API returns no data for date range\n- Solution: Open-Meteo archive starts from 1940; check date format is YYYY-MM-DD\n\n**Weather code not recognized:**\n- Symptom: Unknown weather code number\n- Solution: Refer to WMO weather code standard; codes 0-99 are defined\n\n**wttr.in returns HTML instead of JSON:**\n- Symptom: Response is HTML page\n- Solution: Ensure you add ?format=j1 to get JSON response\n\n**Temperature unit confusion:**\n- Symptom: Unexpected temperature values\n- Solution: Open-Meteo defaults to Celsius; add &temperature_unit=fahrenheit if needed\n\n## See also\n\n- [../free-geocoding-and-maps/SKILL.md](../free-geocoding-and-maps/SKILL.md) — Get coordinates for weather lookups\n- [../send-email-programmatically/SKILL.md](../send-email-programmatically/SKILL.md) — Send weather alerts via email\n- [../using-telegram-bot/SKILL.md](../using-telegram-bot/SKILL.md) — Send weather updates via Telegram","tags":["free","weather","data","open","skills","besoeasy","agent-skills","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools"],"capabilities":["skill","source-besoeasy","skill-free-weather-data","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-clawdbot","topic-clawdbot-skill","topic-llm-tools","topic-mcp-server","topic-openai","topic-openclaw","topic-vibe-coding","topic-vibecoding"],"categories":["open-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/besoeasy/open-skills/free-weather-data","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add besoeasy/open-skills","source_repo":"https://github.com/besoeasy/open-skills","install_from":"skills.sh"}},"qualityScore":"0.505","qualityRationale":"deterministic score 0.51 from registry signals: · indexed on github topic:agent-skills · 111 github stars · SKILL.md body (16,509 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T12:55:03.630Z","embedding":null,"createdAt":"2026-04-18T22:10:43.415Z","updatedAt":"2026-05-02T12:55:03.630Z","lastSeenAt":"2026-05-02T12:55:03.630Z","tsv":"'+22':630 '+75':677 '-0.1278':812 '-01':816,817,821,880,881,885,986,987,989 '-10':1575 '-100':72 '-122.4194':409,588 '-16':400 '-180':154,1695 '-30':1511,1630 '-31':822,886,990 '-50':1569 '-70':163 '-74.0060':208,370,984,1346 '-90':1692 '-99':1764 '/$':708 '/40.7128,-74.0060?format=%l:+%c+%t':687 '/free-geocoding-and-maps/skill.md':1810,1811 '/london?format=3':627 '/month':73,155,164 '/newyork?format=%c+%t':674 '/paris':640 '/send-email-programmatically/skill.md':1817,1818 '/tokyo?format=j1':647 '/using-telegram-bot/skill.md':1824,1825 '/v1/archive':1432 '/v1/archive?$':942 '/v1/archive?latitude=$':827,873 '/v1/forecast?$':323,536 '/v1/forecast?latitude=':1409 '/v1/forecast?latitude=$':213,263,414,460 '0':153,162,482,651,660,730,735,737,759,1002,1036,1106,1342,1472,1574,1583,1588,1763 '000':1557,1607 '1':22,472,484,1010,1034,1040,1109,1396,1556 '1.5':1354 '10':1606,1650 '100':82 '10k':174,1584 '10m':230,250,310,313,352,356,522,578 '15':1510,1568,1629 '180':1597,1696 '1940':1737 '1m':165,1576 '2':26,486,1001,1041,1112,1244,1433 '2024':815,820,879,884,985,988 '24':454 '25':1352 '2m':219,222,237,245,269,277,299,302,341,348,366,420,423,440,445,466,477,508,511,558,563,841,844,854,859,889,893,927,930,965,970,1415,1422,1425 '3':31,1042,1115,1260,1444,1456 '30':1241 '32':1238,1350 '37.7749':407,587 '4':37,1485 '40.7128':206,369,983,1345 '45':1046,1117 '48':1047,1119 '5':71,1503 '51':1050,1123 '51.5074':810 '53':1051,1126 '55':1052,1129 '56':1132 '57':1136 '60':156,1570 '600':1598 '61':1055,1096,1140,1211,1474 '63':1056,1143 '65':1057,1146 '66':1149 '67':1153 '7':399,403,495,589 '71':1060,1157,1476 '73':1061,1161 '75':1062,1165 '77':1065,1169 '80':1069,1172 '81':1070,1176 '82':1071,1180 '85':1075,1184 '86':1076,1188 '90':1348,1693 '95':1080,1192,1235,1478 '96':1083,1194 '99':1084,1199 'access':1381 'accur':197,1636 'accuraci':1516 'add':895,1419,1491,1781,1802 'agent':117,1376,1553 'ai':116,1552 'alert':28,139,1216,1224,1263,1266,1311,1338,1339,1365,1367,1375,1530,1821 'alert.message':1370 'alert.severity.touppercase':1369 'alerts.length':1341 'alerts.push':1270,1284,1298,1317 'also':1809 'altern':66 'america/los_angeles':433 'america/new_york':273 'analysi':39,137,1544 'annual':1591 'api':19,43,58,60,70,79,85,148,331,544,719,951,1385,1535,1550,1564,1684,1701,1723 'api.open-meteo.com':212,262,322,413,459,535,1408 'api.open-meteo.com/v1/forecast?$':321,534 'api.open-meteo.com/v1/forecast?latitude=':1407 'api.open-meteo.com/v1/forecast?latitude=$':211,261,412,458 'app':1661 'appar':223,303 'archiv':1722,1734 'archive-api.open-meteo.com':826,872,941,1431 'archive-api.open-meteo.com/v1/archive':1430 'archive-api.open-meteo.com/v1/archive?$':940 'archive-api.open-meteo.com/v1/archive?latitude=$':825,871 'area':734 'areanam':736 'async':282,489,690,899,1227 'avail':1459 'averag':865,1005 'avgtemp':994 'avgtemp.tofixed':1009 'await':319,336,532,549,704,724,938,956,1249,1256 'base':125 'bash':200,402,615,802,1026 'best':1504,1601 'c':631,747,1011 'cach':1506,1621,1632 'calls/min':157,1571 'calls/month':166,1577 'case':1033 'celsius':1496,1500,1801 'chang':1627 'check':1219,1437,1554,1708,1738 'checkweatheralert':1229,1344 'citi':619,697,1442,1447,1452,1638 'clear':676,1038,1107,1111,1473 'climat':38 'cloud':1482 'cloudi':1045,1114 'code':227,254,256,271,307,361,428,469,519,583,935,979,1014,1020,1028,1032,1095,1103,1206,1417,1471,1522,1642,1645,1747,1753,1760,1762 'collect':113 'communiti':1616 'comparison':143 'comprehens':90,199 'condit':25,121,650,669,729,1221,1265 'confus':1790 'console.log':374,378,383,386,595,779,782,790,1004,1209,1357,1363,1368,1372 'const':289,317,334,498,530,547,702,722,726,906,936,954,993,1104,1233,1247,1254,1262 'continu':1672 'convert':1643 'coordin':204,682,1455,1514,1634,1682,1717,1813 'cost':80,145,1543,1561 'cover':1483 'coverag':1714 'critic':1660 'curl':209,259,410,456,623,636,643,670,683,823,869 'current':6,49,92,185,190,201,217,267,297,649,727,1264,1358,1398,1406,1413,1461 'current.apparent':240 'current.feelslikec':753 'current.feelslikef':750 'current.humidity':756 'current.precipitation':252 'current.precipmm':769 'current.relative':243 'current.temp':742,746 'current.temperature':236,276 'current.time':279 'current.uvindex':772 'current.weather':255 'current.weatherdesc':758 'current.wind':248 'current.windspeedkmph':766 'current.windspeedmiles':763 'currentweath':1334 'custom':665 'daili':418,506,839,887,925,1420 'daily.precipitation':448,862 'daily.temperature':439,444,853,858,892 'daily.time':436,850 'data':4,11,33,42,55,91,112,128,135,335,548,723,799,955,1395,1508,1623,1698,1719,1726 'data.current':728 'data.current.apparent':343 'data.current.precipitation':358 'data.current.relative':346 'data.current.temperature':340 'data.current.time':363 'data.current.weather':360 'data.current.wind':350,354 'data.current_units.temperature':365 'data.daily.precipitation':567,571,974 'data.daily.temperature':557,562,964,969 'data.daily.time.map':552,959 'data.daily.weather':582,978 'data.daily.wind':576 'data.nearest':733 'date':435,553,555,801,807,814,819,832,834,836,838,849,878,883,915,923,960,962,1331,1728,1739 'day':401,404,471,494,528,594,997,1313 'day.date':596,1328,1332 'day.maxtemp':598,999 'day.mintemp':597,1000 'day.precipitation':1315,1329 'day.precipitationprobability':599 'days.tostring':529 'dd':921,1745 'decis':126 'decod':1012,1015,1030,1093,1520,1640 'decodeweathercod':1102,1210 'default':1495,1799 'defin':1766 'dens':1130,1137 'deposit':1120 'descript':658,757,1025,1527,1647 'detail':633 'direct':312,355 'doesn':1625 'drizzl':1054,1125,1128,1131,1135,1139 'echo':1037,1043,1048,1053,1058,1063,1066,1072,1077,1081,1085,1089 'els':1371 'email':1823 'empti':1703 'encodeuricompon':709 'end':818,835,837,882,922 'enddat':905,924 'ensur':1779 'error':329,542,717,948,1680,1686 'esac':1091 'everi':1677 'expect':1326 'f':653,655,678,743,785,789,1236,1239,1280,1294,1360 'fahrenheit':233,288,371,431,497,590,1253,1261,1494,1502,1805 'fail':332,545,720,952 'fair':1541,1619 'fall':1160,1164,1168 'fast':614 'feel':238,379,786,1463 'feels-lik':1462 'feelslik':342 'feelslikec':751 'feelslikef':748 'fetch':23,320,533,705,939 'first':108 'fog':1122 'foggi':1049,1118 'forecast':8,32,51,93,127,392,395,405,451,470,527,543,592,1255,1310,1336,1337,1401,1418 'forecast.foreach':593,1312 'format':642,666,711,917,1443,1448,1740,1782 'francisco':776 'free':2,13,40,57,83,158,167,173,179,1383,1578 'free-weather-data':1 'freez':1134,1138,1151,1155 'frequent':1628 'fulli':102 'function':283,490,691,900,1101,1228 'generat':1223 'generous':1610 'geocod':1519 'get':5,48,184,189,390,393,601,605,616,632,679,793,796,1517,1785,1812 'getcurrentweath':284,368,1250 'gethistoricalweath':901,982 'getweatherforecast':491,586,1257 'getweatherwttr':692,774 'grain':1068,1171 'hail':1088,1198,1203 'hasalert':1340 'heavi':1147,1154,1166,1189,1202,1319,1324 'high':1272,1277,1300,1305 'histor':10,53,94,133,794,797,803,864,949,1429,1718 'histori':992 'history.length':1003 'history.reduce':995 'host':1658 'hostabl':1668 'hour':450,455,464,474,1675 'hourly.precipitation':478 'hourly.temperature':476 'hourly.time':475 'html':1769,1776 'human':611,1023,1525 'human-read':610,1022,1524 'humid':221,242,244,301,345,347,384,656,657,754,791,1466 'inch':1245,1330 'index':1481 'instead':1770 'invalid':1681 'j1':712,1449,1783 'januari':1008 'javascript':281,488,689,898,1100,1226 'jq':234,274,434,473,648,848,891 'json':641,1445,1772,1786 'key':61,86,149,1536,1565 'lat':205,214,264,285,406,415,461,492,700,809,828,874,902,1230,1251,1258,1410,1691 'lat.tostring':294,503,911 'lat/lon':1688 'latitud':293,502,910 'length':896 'light':1124,1133,1150 'like':239,380,787,1464 'limit':89,147,1563,1600 'locat':124,693,694,710,732,739,1710 'location-bas':123 'lon':207,216,266,286,408,417,463,493,701,811,830,876,903,1231,1252,1259,1412,1694 'lon.tostring':296,505,913 'london':629 'longitud':215,265,295,416,462,504,829,875,912,1411 'lookup':1816 'low':1286,1291 'main':1110 'map':480 'max':421,437,441,509,517,523,559,573,579,842,851,855,928,966,1423 'max/min':1465 'maxprecip':1243,1316,1353 'maxtemp':556,963,1234,1269,1347 'maxwindspe':575,1240,1297,1351 'mean':890,894 'messag':1276,1290,1304,1323 'meteo':16,46,100,172,188,195,1018,1388,1405,1490,1547,1582,1596,1605,1664,1733,1798 'min':424,442,446,512,564,845,856,860,931,971,1426,1631 'mintemp':561,968,1237,1283,1349 'minut':1512 'miss':1720 'mm':920,1744 'moder':1127,1144,1162,1177 'monitor':30,141,1218,1533 'month':868,1560 'mph':389,663,1242,1309 'name':620,698,1453,1639 'nearbi':1716 'need':119,1393,1807 'new':291,328,500,541,716,908,947 'next':398,453 'node.js':280,487,688,897,1099,1225 'null':1705 'number':1754 'numer':1644 'open':15,45,96,99,104,171,187,194,1017,1387,1404,1489,1546,1581,1595,1604,1663,1732,1797 'open-meteo':14,44,98,170,193,1016,1386,1403,1488,1545,1580,1594,1603,1662,1731,1796 'open-sourc':103 'openweathermap':152,1567 'output':628,675,1097,1212 'overcast':1116 'page':1777 'paid':68,77,1549 'param':290,324,499,537,907,943 'paramet':1458 'parsefloat':768 'parseint':741,745,749,752,755,762,765,771 'part':1044,1113 'past':800 'perfect':114 'plain':621 'plan':35,130 'poll':1671 'practic':1505,1602 'precip':485 'precipit':225,251,305,357,425,447,467,513,515,566,846,861,932,973,1427,1467 'precipitationprob':570 'precipmm':767 'privaci':64,107,151 'privacy-first':106 'privacy-respect':63 'privat':177,182 'probabl':516,572 'prompt':1377 'provid':1559 'quick':142,1435 'rain':600,1059,1073,1098,1142,1145,1148,1152,1156,1174,1178,1182,1214,1320,1325,1475 'rang':808,1729 'rate':88,146,1562,1599 'readabl':612,1024,1526 'reason':1529 'recogn':1749 'refer':1029,1756 'relat':220,300 'replac':76 'report':635 'req/day':175,1585 'request':1539,1655 'requests/day':1608 'requir':62,150,1537,1566 'res':318,531,703,937 'res.json':337,550,725,957 'res.ok':326,539,714,945 'res.status':333,546,721,953 'respect':65 'respons':1774,1787 'result':1356 'result.alerts.foreach':1366 'result.currentweather.temperature':1359 'result.hasalerts':1362 'return':338,551,731,958,1204,1333,1498,1685,1699,1702,1724,1768 'rime':1121 'san':775 'save':81,1592 'scenario':1551 'schedul':132 'second':1651,1678 'see':1808 'self':1657,1667 'self-host':1656,1666 'send':1819,1826 'servic':144,1617 'set':1528,1648 'sever':1274,1288,1302,1321 'shower':1074,1079,1175,1179,1183,1187,1191 'simpl':604,606,1440 'skill':183 'skill-free-weather-data' 'sky':1039,1108 'slight':1141,1158,1173,1185,1197,1213 'snow':1064,1067,1078,1159,1163,1167,1170,1186,1190,1477 'solut':1689,1707,1730,1755,1778,1795 'sourc':97,105 'source-besoeasy' 'specif':806 'speed':229,247,249,309,351,521,577,1307 'speed/direction':1469 'standard':1761 'start':813,831,833,877,914,1735 'startdat':904,916 'station':1713 'sum':426,449,514,568,847,863,933,975,996,998,1428 'symptom':1683,1700,1721,1750,1773,1791 'telegram':1830 'temp':438,443,483,652,654,852,857,1273,1287 'tempc':744 'temperatur':218,224,231,235,241,268,275,298,304,314,339,344,375,419,422,429,465,507,510,524,667,783,840,843,888,926,929,1006,1278,1292,1414,1421,1424,1460,1486,1492,1788,1793,1803 'tempf':740 'text':622,1378 'threshold':1232,1246,1531 'throw':327,540,715,946 'thunderstorm':1082,1086,1193,1195,1200,1479 'time':278,362,481 'timeout':1649,1652 'times/month':1558 'timezon':258,272,432 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-clawdbot' 'topic-clawdbot-skill' 'topic-llm-tools' 'topic-mcp-server' 'topic-openai' 'topic-openclaw' 'topic-vibe-coding' 'topic-vibecoding' 'track':110,160,169 'transpos':479 'tri':1715 'troubleshoot':1679 'type':1271,1285,1299,1318 'typic':1612 'unexpect':1792 'unit':232,287,315,316,364,430,496,525,526,1487,1493,1789,1804 'unknown':1090,1207,1751 'unlimit':180,1538,1589,1615 'updat':1674,1828 'urlsearchparam':292,501,909 'usag':367,585,773,981,1092,1208,1343 'use':12,20,56,192,608,1402,1438,1513,1542,1613,1620,1633 'uv':1480 'uvindex':770 'valid':1690 'valu':661,738,760,1706,1794 'via':1822,1829 'violent':1181 'visibl':1484 'vs':1548 'warn':1275,1289,1303 'watch':1322 'weather':3,7,24,27,41,50,54,69,78,95,120,134,138,186,191,202,226,253,270,306,330,373,391,394,427,468,518,602,607,617,634,680,718,778,795,798,804,934,950,1013,1019,1027,1031,1094,1215,1220,1248,1335,1364,1374,1384,1394,1399,1416,1436,1457,1470,1507,1521,1555,1622,1624,1641,1654,1673,1712,1746,1752,1759,1815,1820,1827 'weather.description':781 'weather.feelslike':381 'weather.feelslikef':788 'weather.humidity':385,792 'weather.location':780 'weather.temperature':376,1268,1279,1282,1293 'weather.tempf':784 'weather.unit':377,382 'weather.windspeed':388,1296,1308 'weatherapi':161,1573 'weathercod':359,581,977,1105,1205 'weatherdesc':659 'wind':228,246,308,311,387,520,662,1301,1306,1468 'winddirect':353 'windkmh':764 'windmph':761 'windspe':349 'windspeedmil':664 'within':1540 'wmo':1758 'work':1450 'wttr':603 'wttr.in':18,47,178,609,626,639,646,673,686,707,1390,1439,1441,1446,1497,1587,1614,1767 'wttr.in/$':706 'wttr.in/40.7128,-74.0060?format=%l:+%c+%t':685 'wttr.in/london?format=3':625 'wttr.in/newyork?format=%c+%t':672 'wttr.in/paris':638 'wttr.in/tokyo?format=j1':645 'yes':159,168,1572,1579 'yyyi':919,1743 'yyyy-mm-dd':918,1742","prices":[{"id":"fafd9be3-b58c-4895-a05b-08678e56fd91","listingId":"afae013e-e12f-46b5-a7f5-3fe1cf725d97","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"besoeasy","category":"open-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:10:43.415Z"}],"sources":[{"listingId":"afae013e-e12f-46b5-a7f5-3fe1cf725d97","source":"github","sourceId":"besoeasy/open-skills/free-weather-data","sourceUrl":"https://github.com/besoeasy/open-skills/tree/main/skills/free-weather-data","isPrimary":false,"firstSeenAt":"2026-04-18T22:10:43.415Z","lastSeenAt":"2026-05-02T12:55:03.630Z"}],"details":{"listingId":"afae013e-e12f-46b5-a7f5-3fe1cf725d97","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"besoeasy","slug":"free-weather-data","github":{"repo":"besoeasy/open-skills","stars":111,"topics":["agent-skills","ai","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools","mcp-server","openai","openclaw","vibe-coding","vibecoding"],"license":null,"html_url":"https://github.com/besoeasy/open-skills","pushed_at":"2026-03-31T13:05:30Z","description":"Battle-tested skill library for AI agents. Save 98% of API costs with ready-to-use code for crypto, PDFs, search, web scraping & more. No trial-and-error, no expensive APIs.","skill_md_sha":"0dc61d7c3e47e833dff9db8a9f38b7a191828127","skill_md_path":"skills/free-weather-data/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/besoeasy/open-skills/tree/main/skills/free-weather-data"},"layout":"multi","source":"github","category":"open-skills","frontmatter":{"name":"free-weather-data","description":"Get current weather, forecasts, and historical data using free Open-Meteo and wttr.in APIs. Use when: (1) Fetching weather conditions, (2) Weather alerts and monitoring, (3) Forecast data for planning, or (4) Climate analysis."},"skills_sh_url":"https://skills.sh/besoeasy/open-skills/free-weather-data"},"updatedAt":"2026-05-02T12:55:03.630Z"}}