Pular para o conteúdo

WebSocket

Canal ao vivo das estações Kitelife Radar, sobre WebSocket.

Use este canal para acompanhar poucas estações em uma interface: um painel, um mapa, a tela de um spot. Uma conexão fica aberta, o cliente declara quais estações quer, e cada leitura nova chega em milissegundos.

Se o seu caso é ingerir o fluxo contínuo de muitas estações em um sistema de servidor, o canal certo é o relay AMQP, não este. A diferença prática: o WebSocket não retém nada. Cliente desconectado perde o que passou, e é assim de propósito: uma interface quer o vento de agora, não a fila do que perdeu enquanto o navegador estava fechado.

Toda mensagem de dados carrega o mesmo objeto Reading da API REST, com as mesmas unidades. Vento em nós.

Ambiente Endereço Observação
sandbox wss://stream.radar-sandbox.kitelife.com.br/v1/stream Sandbox. Estações simuladas publicando na mesma cadência das reais.

Você envia.

Declara quais estações o cliente quer acompanhar.

A lista enviada substitui a assinatura anterior, não a acumula. Para acrescentar uma estação, envie a lista inteira já com ela dentro.

O servidor responde com subscription.updated contendo o que de fato ficou assinado. Estações inexistentes ou fora do escopo da sua chave são omitidas dessa lista, silenciosamente: assinar uma estação que não existe não é erro, é uma assinatura vazia.

Você envia.

Remove estações da assinatura corrente.

Remove da assinatura as estações listadas, preservando as demais. É a operação complementar ao subscribe, que substitui a lista inteira.

Cancelar a última estação deixa a conexão aberta e silenciosa: ela continua válida e pode assinar de novo a qualquer momento.

Você recebe.

Leituras e mudanças de estado das estações assinadas.

As leituras chegam na cadência de cada estação, tipicamente uma a cada poucos segundos por estação assinada. Dimensione o processamento no cliente para isso: assinar trinta estações de 8 segundos são cerca de quatro mensagens por segundo.

Cliente declara as estações que quer acompanhar.

Campo Tipo Descrição
action * "subscribe"
stations * lista de string Ids públicos das estações. O limite de 50 por conexão é por conexão, não por chave: para acompanhar mais, abra outra conexão ou use o relay AMQP.

Campos marcados com * são obrigatórios.

{
"action": "subscribe",
"stations": [
"stn_barra-da-tijuca-01",
"stn_cabo-frio-01"
]
}
Campo Tipo Descrição
action * "unsubscribe"
stations * lista de string

Campos marcados com * são obrigatórios.

{
"action": "unsubscribe",
"stations": [
"stn_cabo-frio-01"
]
}

Estado da assinatura após um comando do cliente.

Campo Tipo Descrição
type * "subscription.updated"
stations * lista de string Estações efetivamente assinadas agora. Compare com o que você pediu para detectar ids inválidos.

Campos marcados com * são obrigatórios.

{
"type": "subscription.updated",
"stations": [
"stn_barra-da-tijuca-01"
]
}

Uma leitura nova de uma estação assinada.

O campo data é exatamente o objeto Reading da API REST: mesmo formato, mesmas unidades, mesmos campos omitidos quando ausentes.

Campo Tipo Descrição
type * "reading"
data * Reading

Campos marcados com * são obrigatórios.

Campos de data:

Campo Tipo Descrição
stationId * string Identificador público e estável da estação. É desvinculado do hardware: trocar o equipamento de uma estação não altera este valor.
observedAt * string (date-time) Instante da medição, sempre UTC com sufixo Z. É a chave temporal de toda série histórica e, junto de stationId, a chave de deduplicação.
timeSource station · reconstructed · unanchored Confiabilidade do horário em observedAt.
receivedAt string (date-time) Instante em que a plataforma recebeu a leitura. Difere de observedAt quando a estação ficou sem link e retransmitiu depois. Serve para medir atraso, nunca para ordenar a série.
windSpeedKnots * number Velocidade média do vento, em nós. Medida pelo sensor no intervalo de amostragem, não é a média móvel de 10 minutos. Para essa, consulte a rota de histórico com resolution=10m.
windGustKnots number Maior rajada observada no intervalo de amostragem, em nós. Reportada pelo próprio sensor. Ausente quando a estação não reporta esta grandeza; ver Station.measurements.
windDirectionDegrees * integer Direção de onde o vento sopra, em graus verdadeiros. 0 = norte, 90 = leste. Não há correção de alinhamento de mastro aplicada.
temperatureCelsius number Temperatura do ar, em graus Celsius. Ausente quando a estação não reporta esta grandeza; ver Station.measurements.
humidityPercent integer Umidade relativa do ar, em porcentagem. Ausente quando a estação não reporta esta grandeza; ver Station.measurements.
pressureAbsoluteHpa number Pressão atmosférica medida na altitude da estação, em hectopascais. NÃO é reduzida ao nível do mar. Duas estações em altitudes diferentes mostram valores diferentes sob o mesmo tempo, e a diferença é altitude, não descalibração. Para comparar estações entre si, use pressureSeaLevelHpa.
pressureSeaLevelHpa number Pressão reduzida ao nível do mar (QNH), em hectopascais. É o valor comparável entre estações e o que sustenta leitura de tendência barométrica ao longo da costa. Derivado pela plataforma a partir da pressão absoluta, da altitude e da temperatura da estação: ausente quando a altitude da estação não é conhecida.
rainRateMmPerHour number Taxa de precipitação instantânea, em milímetros por hora. É uma taxa, não um acumulado: integrá-la ao longo do tempo é responsabilidade de quem consome. Ausente quando a estação não reporta esta grandeza; ver Station.measurements.
uvIndex number Índice UV, adimensional. Ausente quando a estação não reporta esta grandeza; ver Station.measurements.

Campos marcados com * são obrigatórios.

{
"type": "reading",
"data": {
"stationId": "stn_barra-da-tijuca-01",
"observedAt": "2026-08-26T17:42:08Z",
"timeSource": "station",
"receivedAt": "2026-08-26T17:42:09Z",
"windSpeedKnots": 18.2,
"windGustKnots": 24.6,
"windDirectionDegrees": 118,
"temperatureCelsius": 27.4,
"humidityPercent": 71,
"pressureAbsoluteHpa": 1012.4,
"pressureSeaLevelHpa": 1012.9,
"rainRateMmPerHour": 0,
"uvIndex": 3.1
}
}

Emitido quando uma estação assinada muda de estado operacional.

A transição para offline costuma ser o evento mais importante para uma interface: as estações não têm bateria, então uma queda de energia no local derruba a estação por inteiro e o último valor exibido na tela envelhece sem aviso. Ao receber offline, marque o dado como antigo em vez de continuar exibindo o número como se fosse atual.

Campo Tipo Descrição
type * "station.status"
stationId * string
status * online · offline · degraded · maintenance · decommissioned
changedAt * string (date-time)

Campos marcados com * são obrigatórios.

{
"type": "station.status",
"stationId": "stn_cabo-frio-01",
"status": "offline",
"changedAt": "2026-08-26T18:03:11Z"
}

Erro de protocolo ou de assinatura. Um erro não encerra a conexão, salvo quando fatal é verdadeiro. Nesse caso o servidor fecha logo em seguida e reconectar imediatamente não vai adiantar.

Campo Tipo Descrição
type * "error"
code * string Código no formato Recurso.Motivo, o mesmo vocabulário da extensão code dos erros REST.
message * string
fatal boolean

Campos marcados com * são obrigatórios.

{
"type": "error",
"code": "Subscription.TooManyStations",
"message": "Uma conexão aceita no máximo 50 estações; foram pedidas 62.",
"fatal": false
}