Previsão de 5 dias

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.

1. Buscar previsão / Get forecast

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

2. Agrupar por dia / Group by day

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);

3. Resposta da API / API Response

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"
  }
}
Campo 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.

4. Exemplo completo / Complete example

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

Back to Weather API docs