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.
Servidores
Seção intitulada “Servidores”| 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. |
Assinar estações
Seção intitulada “Assinar estações”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.
Cancelar assinatura
Seção intitulada “Cancelar assinatura”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.
Receber eventos
Seção intitulada “Receber eventos”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.
Mensagens
Seção intitulada “Mensagens”subscribe
Seção intitulada “subscribe”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" ]}unsubscribe
Seção intitulada “unsubscribe”| Campo | Tipo | Descrição |
|---|---|---|
action * |
"unsubscribe" |
|
stations * |
lista de string |
Campos marcados com * são obrigatórios.
{ "action": "unsubscribe", "stations": [ "stn_cabo-frio-01" ]}subscription.updated
Seção intitulada “subscription.updated”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" ]}reading
Seção intitulada “reading”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 }}station.status
Seção intitulada “station.status”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}