5-Day Forecast
O endpoint /forecast retorna 40 pontos de dados: 5 dias com 8 leituras por dia, uma a cada 3 horas.
Com esses dados você pode montar uma previsão completa, agrupando por dia para extrair temperaturas máximas e mínimas, probabilidade de chuva e ícone predominante.
The /forecast endpoint returns 40 data points: 5 days with 8 readings per day, one every 3 hours.
With this data you can build a complete forecast, grouping by day to extract max/min temperatures, rain probability, and the predominant weather icon.
Uma chamada ao /forecast com o nome da cidade retorna a lista completa de previsões.
Use units=metric para Celsius e lang=pt_br para descrições em português.
A call to /forecast with the city name returns the full list of forecasts.
Use units=metric for Celsius and lang=pt_br for Portuguese descriptions.
const API_KEY = 'YOUR_API_KEY';
const BASE = 'https://weather.api.insyde.one';
async function getForecast(city) {
const params = new URLSearchParams({
q: city,
units: 'metric',
lang: 'pt_br',
key: API_KEY
});
const res = await fetch(`${BASE}/forecast?${params}`);
return res.json();
}
const data = await getForecast('São Paulo,BR');
console.log(`Total data points: ${data.list.length}`); // 40
O array list[] contém leituras a cada 3 horas. Para montar uma previsão diária, agrupamos por data e extraímos: temperatura máxima, temperatura mínima, probabilidade média de chuva (pop) e o ícone mais frequente.
The list[] array contains readings every 3 hours. To build a daily forecast, we group by date and extract: max temperature, min temperature, average rain probability (pop), and the most frequent icon.
function groupByDay(list) {
const days = {};
list.forEach(item => {
const date = item.dt_txt.split(' ')[0];
if (!days[date]) days[date] = [];
days[date].push(item);
});
return Object.entries(days).map(([date, items]) => {
const temps = items.map(i => i.main.temp);
const pops = items.map(i => i.pop);
// Most frequent icon
const iconCount = {};
items.forEach(i => {
const icon = i.weather[0].icon;
iconCount[icon] = (iconCount[icon] || 0) + 1;
});
const icon = Object.entries(iconCount)
.sort((a, b) => b[1] - a[1])[0][0];
return {
date,
tempMax: Math.round(Math.max(...temps)),
tempMin: Math.round(Math.min(...temps)),
pop: Math.round(pops.reduce((a, b) => a + b, 0) / pops.length * 100),
icon
};
});
}
const dailyForecast = groupByDay(data.list);
console.log(dailyForecast);
A resposta contém o array list[] com cada ponto de 3 horas. Abaixo um trecho com 2 itens:
The response contains the list[] array with each 3-hour data point. Below is a snippet with 2 items:
{
"cod": "200",
"message": 0,
"cnt": 40,
"list": [
{
"dt": 1708344000,
"main": {
"temp": 28.5,
"feels_like": 31.2,
"temp_min": 27.1,
"temp_max": 29.8,
"humidity": 72
},
"weather": [
{
"id": 802,
"main": "Clouds",
"description": "nuvens dispersas",
"icon": "03d"
}
],
"pop": 0.1,
"dt_txt": "2026-02-19 12:00:00"
},
{
"dt": 1708354800,
"main": {
"temp": 31.7,
"feels_like": 34.5,
"temp_min": 30.2,
"temp_max": 32.4,
"humidity": 62
},
"weather": [
{
"id": 500,
"main": "Rain",
"description": "chuva leve",
"icon": "10d"
}
],
"pop": 0.65,
"dt_txt": "2026-02-19 15:00:00"
},
...
],
"city": {
"name": "São Paulo",
"country": "BR"
}
}
pop: Probabilidade de precipitação, varia de 0 a 1. Um valor de 0.8 significa 80% de chance de chuva naquele período de 3 horas. Multiplique por 100 para exibir como porcentagem.
pop field: Probability of precipitation, ranges from 0 to 1. A value of 0.8 means 80% chance of rain in that 3-hour period. Multiply by 100 to display as a percentage.
const API_KEY = 'YOUR_API_KEY';
const BASE = 'https://weather.api.insyde.one';
async function getForecast(city) {
const params = new URLSearchParams({
q: city,
units: 'metric',
lang: 'pt_br',
key: API_KEY
});
const res = await fetch(`${BASE}/forecast?${params}`);
return res.json();
}
function groupByDay(list) {
const days = {};
list.forEach(item => {
const date = item.dt_txt.split(' ')[0];
if (!days[date]) days[date] = [];
days[date].push(item);
});
return Object.entries(days).map(([date, items]) => {
const temps = items.map(i => i.main.temp);
const pops = items.map(i => i.pop);
const iconCount = {};
items.forEach(i => {
const ic = i.weather[0].icon;
iconCount[ic] = (iconCount[ic] || 0) + 1;
});
const icon = Object.entries(iconCount)
.sort((a, b) => b[1] - a[1])[0][0];
return {
date,
tempMax: Math.round(Math.max(...temps)),
tempMin: Math.round(Math.min(...temps)),
pop: Math.round(pops.reduce((a, b) => a + b, 0) / pops.length * 100),
icon
};
});
}
async function main() {
const data = await getForecast('São Paulo,BR');
const daily = groupByDay(data.list);
console.log(`Previsão para ${data.city.name}, ${data.city.country}:\n`);
daily.forEach(day => {
console.log(
`${day.date} ${day.tempMax}°/${day.tempMin}° chuva: ${day.pop}% icon: ${day.icon}`
);
});
}
main();
Saída esperada / Expected output:
Previsão para São Paulo, BR:
2026-02-19 32°/24° chuva: 10% icon: 03d
2026-02-20 28°/22° chuva: 80% icon: 10d
2026-02-21 24°/20° chuva: 90% icon: 10d
2026-02-22 29°/22° chuva: 30% icon: 02d
2026-02-23 31°/23° chuva: 5% icon: 01d