Lista as estações acessíveis à sua chave
const url = 'https://api.radar-sandbox.kitelife.com.br/v1/stations?page=1&pageSize=25';const options = {method: 'GET', headers: {'X-Api-Key': '<X-Api-Key>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.radar-sandbox.kitelife.com.br/v1/stations?page=1&pageSize=25' \ --header 'X-Api-Key: <X-Api-Key>'Retorna apenas as estações que sua credencial pode ver. O catálogo é
pequeno e muda pouco: cacheie o resultado e respeite o ETag.
Authorizations
Seção intitulada “Authorizations”Parameters
Seção intitulada “Parameters”Query Parameters
Seção intitulada “Query Parameters”Filtra por estado operacional. Repita o parâmetro para aceitar mais de um valor.
Página, base 1.
Itens por página. Valores acima do máximo são reduzidos ao máximo, sem erro.
Responses
Seção intitulada “Responses”Página de estações.
object
Itens desta página.
Página corrente, base 1.
Total de itens que satisfazem o filtro, somando todas as páginas.
Uma estação meteorológica e os metadados necessários para interpretar suas leituras.
object
Identificador público e estável. Use este valor em todas as rotas, filtros e bindings AMQP. Ele identifica o ponto de medição, não o equipamento: a troca do hardware instalado no local preserva o id.
Nome legível da estação, em português.
object
Altitude do terreno, em metros acima do nível do mar. Sem ela a plataforma não consegue reduzir a pressão ao nível do mar, e Reading.pressureSeaLevelHpa fica ausente.
Altura do anemômetro, em metros acima do solo. O vento é reportado como medido nesta altura, sem normalização: vento a 6 m não é comparável a vento a 12 m, nem à previsão de modelos meteorológicos, que usam a referência de 10 m da OMM. Para comparar estações entre si ou com previsão, corrija pela altura.
Fuso IANA do local. Toda data da API é UTC; este campo existe para apresentação no horário local.
Estado operacional. online: publicando normalmente. offline: sem conexão. A estação não tem bateria, então queda de energia no local a derruba por inteiro e o estado muda em segundos. degraded: conectada, mas com falhas de leitura do sensor produzindo lacunas na série. maintenance: intervenção programada. decommissioned: desativada em definitivo. Em qualquer estado o histórico permanece consultável.
Intervalo nominal entre leituras. Use este valor para dimensionar polling e para detectar lacunas, não presuma um valor fixo, ele varia por modelo de estação.
ObservedAt da leitura mais recente conhecida. A diferença entre este valor e o instante atual é a forma mais confiável de medir se a estação está de fato produzindo dados.
Grandezas que esta estação reporta. Um campo de Reading ausente desta lista virá sempre nulo para esta estação.
Examples
Duas estações
{ "data": [ { "id": "stn_barra-da-tijuca-01", "name": "Barra da Tijuca, Posto 4", "location": { "latitude": -23.0122, "longitude": -43.3654, "elevationMeters": 4, "anemometerHeightMeters": 6 }, "timezone": "America/Sao_Paulo", "status": "online", "reportingIntervalSeconds": 8, "lastReadingAt": "2026-08-26T17:42:08Z", "measurements": [ "windSpeedKnots", "windGustKnots", "windDirectionDegrees", "temperatureCelsius", "humidityPercent", "pressureAbsoluteHpa", "pressureSeaLevelHpa", "rainRateMmPerHour", "uvIndex" ] }, { "id": "stn_cabo-frio-01", "name": "Cabo Frio, Praia do Forte", "location": { "latitude": -22.8894, "longitude": -42.0286, "elevationMeters": 6, "anemometerHeightMeters": 10 }, "timezone": "America/Sao_Paulo", "status": "offline", "reportingIntervalSeconds": 8, "lastReadingAt": "2026-08-25T22:14:00Z", "measurements": [ "windSpeedKnots", "windGustKnots", "windDirectionDegrees", "temperatureCelsius" ] } ], "page": 1, "pageSize": 25, "totalCount": 2}Headers
Seção intitulada “Headers”Versão do recurso. Reenvie em If-None-Match para receber 304 quando nada mudou.
Requisições restantes na janela de cota corrente.
Chave ausente, inválida ou revogada.
Corpo de erro conforme RFC 9457 (Problem Details for HTTP APIs). Toda resposta 4xx e 5xx da API usa este formato, com Content-Type application/problem+json. O código de negócio viaja na extensão code, no formato Recurso.Motivo.
object
URI que identifica o tipo do erro. Estável: é nele que o integrador deve programar, nunca no texto de title.
Resumo legível do tipo do erro.
Explicação específica desta ocorrência.
Identificador da requisição. Cite-o ao abrir um chamado de suporte.
Presente apenas em 422: erros de validação agrupados por campo.
object
Código de negócio no formato Recurso.Motivo. É o valor a usar em lógica condicional quando o type não for específico o bastante. Presente em erros de regra de negócio; ausente em falhas genéricas de protocolo.
Example
{ "type": "https://docs.radar.kitelife.com.br/errors/unauthorized", "title": "Credencial inválida", "status": 401, "code": "ApiKey.NotRecognized", "detail": "A chave enviada em X-Api-Key não foi reconhecida."}Cota excedida. O cabeçalho Retry-After traz os segundos a esperar.
Repetir antes disso não adianta e conta contra você.
Corpo de erro conforme RFC 9457 (Problem Details for HTTP APIs). Toda resposta 4xx e 5xx da API usa este formato, com Content-Type application/problem+json. O código de negócio viaja na extensão code, no formato Recurso.Motivo.
object
URI que identifica o tipo do erro. Estável: é nele que o integrador deve programar, nunca no texto de title.
Resumo legível do tipo do erro.
Explicação específica desta ocorrência.
Identificador da requisição. Cite-o ao abrir um chamado de suporte.
Presente apenas em 422: erros de validação agrupados por campo.
object
Código de negócio no formato Recurso.Motivo. É o valor a usar em lógica condicional quando o type não for específico o bastante. Presente em erros de regra de negócio; ausente em falhas genéricas de protocolo.
Example
{ "type": "https://docs.radar.kitelife.com.br/errors/station-not-found", "traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01", "code": "Station.NotFound"}