Webhooks
Receba eventos da frota em tempo real com webhooks da Cobli e valide as entregas com assinatura HMAC.
O que é webhook?
Webhook é uma tecnologia que permite que a Cobli envie uma requisição HTTP POST para a sua aplicação sempre que um evento relevante ocorrer na frota — sem que você precise ficar consultando nossa API. Use webhooks para:
- Disparar alertas em tempo real (câmera, velocidade, bateria baixa)
- Integrar rastreamento de frota com sistemas internos
- Automatizar fluxos a partir de eventos de ignição ou ponto de interesse
Eventos disponíveis
Consulte os eventos disponíveis e seus formatos em: https://docs.cobli.co/reference/webhookgeofencein
Primeiros passos
-
Crie um endpoint HTTP que aceite
POSTcomContent-Type: application/json.- Responda
2xxem até 5 segundos. Processe de forma assíncrona se necessário. - Valide o header
X-Cobli-Signatureantes de processar — ver Verificação de assinatura.
- Responda
-
Cadastre a assinatura no painel Cobli em Configurações → Webhooks.
- Informe a URL, a chave secreta e os tipos de evento desejados.
-
Valide a integração — gere um evento de teste (ex: ligue a ignição de um veículo)
e confirme que seu endpoint recebe o payload esperado.
Verificação de assinatura
Cada requisição inclui o header X-Cobli-Signature com a assinatura HMAC-SHA256 do corpo (eventData serializado), codificada em hexadecimal. Use a secretKey configurada na assinatura para verificar a autenticidade:
import hmac, hashlib
def verificar(secret: str, body: bytes, assinatura: str) -> bool:
esperado = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(esperado, assinatura)Rejeite requisições sem
X-Cobli-Signatureválido com status400. Nunca processe um payload cuja assinatura não pôde ser verificada.
Retentativas e idempotência
Comportamento por código de resposta
| Resposta do seu endpoint | Comportamento |
|---|---|
2xx | Entrega confirmada — sem retentativa |
4xx (exceto 429) | Falha permanente — não retentado |
429 Too Many Requests | Retentado após o intervalo indicado no header Retry-After; se ausente, aplica backoff exponencial |
5xx | Retentado com backoff exponencial |
| Timeout (sem resposta em 5 s) | Retentado com backoff exponencial |
Política de backoff exponencial
| Parâmetro | Valor |
|---|---|
| Tentativas máximas | 5 |
| Delay inicial | 2 s |
| Multiplicador | 2× |
| Delay máximo | 15 s |
| Variação aleatória | ±20% |
Progressão típica (sem jitter): 2 s → 4 s → 8 s → 15 s → 15 s.
Pausa automática por falha em sequência
Após 5 falhas consecutivas para a mesma URL de destino, as entregas para aquela URL são pausadas automaticamente por 60 segundos. Após o intervalo, as entregas são retomadas sem intervenção necessária.
Essa pausa afeta apenas a URL com falhas — outras assinaturas com URLs diferentes não são impactadas.
Use
eventIdcomo chave de idempotência. Em caso de retentativa, o mesmo evento pode ser entregue mais de uma vez. Armazene os IDs já processados para evitar efeitos duplicados.
Desativação automática por falha persistente
Se as entregas para uma assinatura falharem continuamente por 7 dias, a assinatura é desativada automaticamente. Nesse estado:
- O campo
activeda assinatura passa afalse failure_started_atregistra o início da janela de falhafailure_reasondescreve o motivo (ex:"HTTP 503","TIMEOUT")deactivated_atregistra o momento da desativação- Nenhum novo evento é entregue até que a assinatura seja reativada manualmente
Para reativar, corrija o endpoint e reabilite a assinatura no painel Cobli. Eventos gerados durante o período de inatividade não são retransmitidos.
Boas práticas
-
Responda rápido, processe depois. Seu endpoint deve responder
2xxem até 5 s.
Enfileire o evento e processe em background para evitar timeout. -
Use
eventIdcomo chave de idempotência. O mesmo evento pode ser entregue mais
de uma vez em caso de retentativa. Armazene os IDs já processados para evitar duplicidade. -
Valide sempre a assinatura antes de processar o payload — rejeite requests
semX-Cobli-Signatureválido com400. -
Não retente erros
4xxno seu lado. A Cobli interpreta4xxcomo falha
permanente e não fará novas tentativas. Corrija sua integração e aguarde novos eventos. -
Filtre por
eventTypeno início do handler para ignorar tipos não esperados
sem retornar erro — isso evita4xxdesnecessários. -
Monitore
failure_started_at. Esse campo indica que a Cobli está enfrentando
falhas de entrega para a sua assinatura. Atue antes dos 7 dias para evitar desativação automática. -
Tolere campos ausentes. Campos opcionais podem estar ausentes ou nulos dependendo
do modelo do dispositivo e da disponibilidade do dado no momento do evento. Não assuma presença. -
Nos eventos de rota e parada, leia o
eventDataaninhado. Um handler que esperaeventDataplano não encontra os campos: eles vivem emeventData.routeeeventData.activity. Os dois blocos podem estar ausentes, edeviceId/vehicleIdtambém.
Formato legado (retrocompatível)
Assinaturas criadas antes da migração para o formato padrão continuam recebendo o payload no formato legado. Esse formato não sofrerá mudanças — a compatibilidade é garantida indefinidamente para assinaturas existentes.
O formato legado é aplicado apenas aos eventos geofence_in e geofence_out.
{
"event_id" : "7decdf99-283d-4c70-9b95-a3b3f896e9b9",
"event_type": "geofence_in",
"event_time": "2022-09-08 15:47:46",
"event_data": {
"fleetId" : "cf3f1990-2ce3-4ed9-85c5-9a528295ecfe",
"deviceId" : "879797465464874",
"latitude" : -23.764235,
"longitude" : -46.595110,
"geofenceId": "59e88bca-d3b9-4980-95a9-421fe2ffb275",
"name" : "MEU LOCAL DE INTERESSE",
"address" : "Rua Lourenço Marques, 297, São Paulo - SP, 04547-100"
}
}Diferenças em relação ao formato padrão:
| Aspecto | Formato padrão | Formato legado |
|---|---|---|
| Chaves do envelope | camelCase | snake_case |
eventTime / event_time | ISO 8601 (2024-03-15T10:23:07Z) | "yyyy-MM-dd HH:mm:ss" (UTC) |
vehicleId | presente | ausente |
| Eventos disponíveis | todos | apenas ponto de interesse |
Updated 5 days ago