Webhooks
Receba notificações em tempo real sobre eventos na plataforma Nobur.
Webhooks
Webhooks permitem que seu sistema receba notificações automáticas quando eventos ocorrem na plataforma Nobur. Em vez de consultar a API periodicamente (polling), seu endpoint recebe uma requisição HTTP POST em tempo real.
Como Funciona
- Você registra uma URL de endpoint e os eventos desejados
- Quando um evento ocorre, o Nobur envia um POST para sua URL
- Seu endpoint retorna
2xxpara confirmar o recebimento - Se a entrega falhar, o Nobur tenta novamente com backoff exponencial
Eventos Disponíveis
| Evento | Descrição |
|---|---|
broker.created | Corretor criado |
broker.updated | Corretor atualizado |
broker.deleted | Corretor excluído |
property.created | Imóvel criado |
property.updated | Imóvel atualizado |
property.deleted | Imóvel excluído |
party.created | Parte criada |
party.updated | Parte atualizada |
party.deleted | Parte excluída |
proposal.created | Proposta criada |
proposal.updated | Proposta atualizada |
proposal.deleted | Proposta excluída |
contract.created | Contrato criado |
contract.updated | Contrato atualizado |
contract.deleted | Contrato excluído |
document.created | Documento criado |
document.updated | Documento atualizado |
document.deleted | Documento excluído |
Registrando um Webhook
curl -X POST https://api.nobur.com.br/public/v1/webhooks \
-H "X-API-Key: nbr_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{
"url": "https://meuapp.com/webhooks/nobur",
"events": ["broker.created", "broker.updated", "property.created"]
}'Resposta (201):
{
"id": "whs_abc123",
"url": "https://meuapp.com/webhooks/nobur",
"events": ["broker.created", "broker.updated", "property.created"],
"secret": "whsec_...",
"is_active": true,
"created_at": "2026-02-15T12:00:00Z",
"updated_at": "2026-02-15T12:00:00Z"
}O campo secret é retornado apenas na criação. Guarde-o em local seguro para verificar assinaturas.
Formato do Payload
Cada entrega contém um payload JSON com as informações do evento:
{
"id": "whd_abc123",
"event_type": "broker.created",
"created_at": "2026-02-15T12:00:00Z",
"payload": {
"id": "brk_abc123",
"name": "João da Silva",
"creci": "12345-F",
"email": "joao@imobiliaria.com",
"tenant_id": "tnt_abc123",
"organization_id": "org_abc123",
"created_at": "2026-02-15T12:00:00Z",
"updated_at": "2026-02-15T12:00:00Z"
}
}Verificação de Assinatura
Cada entrega inclui o header X-Webhook-Signature com uma assinatura HMAC-SHA256 do corpo da requisição, usando o secret do webhook como chave.
Verifique sempre a assinatura para garantir que a requisição veio do Nobur.
Exemplo em Node.js
const crypto = require("crypto");
function verifyWebhookSignature(body, signature, secret) {
const expectedSignature = "sha256=" + crypto
.createHmac("sha256", secret)
.update(body, "utf8")
.digest("hex");
if (signature.length !== expectedSignature.length) {
return false;
}
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
}
// No handler do webhook
app.post("/webhooks/nobur", (req, res) => {
const signature = req.headers["x-webhook-signature"];
const body = req.rawBody; // corpo da requisição como string
if (!verifyWebhookSignature(body, signature, process.env.WEBHOOK_SECRET)) {
return res.status(401).send("Assinatura inválida");
}
const event = JSON.parse(body);
console.log(`Evento recebido: ${event.event_type}`);
// Processar o evento
switch (event.event_type) {
case "broker.created":
// Criar corretor no seu sistema
break;
case "property.updated":
// Atualizar imóvel no seu sistema
break;
}
res.status(200).send("OK");
});Exemplo em Python
import hmac
import hashlib
def verify_webhook_signature(body: bytes, signature: str, secret: str) -> bool:
expected = "sha256=" + hmac.new(
secret.encode("utf-8"),
body,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
# No handler do webhook (Flask)
@app.route("/webhooks/nobur", methods=["POST"])
def handle_webhook():
signature = request.headers.get("X-Webhook-Signature")
body = request.get_data()
if not verify_webhook_signature(body, signature, WEBHOOK_SECRET):
return "Assinatura inválida", 401
event = request.get_json()
print(f"Evento recebido: {event['event_type']}")
# Processar o evento
if event["event_type"] == "broker.created":
# Criar corretor no seu sistema
pass
return "OK", 200Retentativas
Se a entrega falhar (timeout ou status HTTP diferente de 2xx), o Nobur tenta novamente com backoff exponencial:
| Tentativa | Intervalo aproximado |
|---|---|
| 1a | imediata |
| 2a | 1 minuto |
| 3a | 5 minutos |
| 4a | 30 minutos |
| 5a | 2 horas |
Após 5 tentativas sem sucesso, a entrega é marcada como failed.
Consultando Entregas
Você pode consultar o histórico de entregas de um webhook:
curl -X GET "https://api.nobur.com.br/public/v1/webhooks/whs_abc123/deliveries?limit=10" \
-H "X-API-Key: nbr_sua_chave_aqui"Resposta:
{
"items": [
{
"id": "whd_abc123",
"subscription_id": "whs_abc123",
"event_type": "broker.created",
"status": "success",
"http_status": 200,
"attempt_count": 1,
"created_at": "2026-02-15T12:00:00Z",
"completed_at": "2026-02-15T12:00:01Z"
}
],
"page_info": {
"has_next_page": false,
"has_previous_page": false
}
}Status de Entrega
| Status | Descrição |
|---|---|
pending | Entrega aguardando envio ou retentativa |
success | Entrega concluída com sucesso (resposta 2xx) |
failed | Todas as tentativas falharam |
Boas Práticas
- Responda rapidamente -- retorne
200o mais rápido possível e processe o evento de forma assíncrona - Implemente idempotência -- seu endpoint pode receber o mesmo evento mais de uma vez; use o
idda entrega para deduplicação - Verifique a assinatura -- sempre valide o header
X-Webhook-Signatureantes de processar - Use HTTPS -- a URL do webhook deve usar HTTPS em produção
- Monitore falhas -- consulte o endpoint de entregas para identificar problemas