Pular para o conteúdo

Webhooks

Webhooks

Com os webhooks, você recebe notificações em tempo real quando ocorrem eventos no seu workspace — por exemplo, quando um código QR é escaneado.

Criar um Webhook

Terminal window
POST /v1/webhooks
{
"url": "https://example.com/webhooks/qr3",
"events": ["qr.scanned", "qr.created"],
"secret": "my-secret-key-min-16-chars"
}

Resposta

{
"id": "wh_abc123",
"url": "https://example.com/webhooks/qr3",
"events": ["qr.scanned", "qr.created"],
"is_active": true,
"secret": "my-secret-key-min-16-chars",
"secret_hint": "my-s…",
"created_at": "2026-03-15T10:00:00.000Z"
}

Tipos de Eventos

EventoDescrição
*Todos os eventos
qr.createdCódigo QR criado
qr.updatedCódigo QR atualizado (URL, status, tags)
qr.deletedCódigo QR excluído
qr.scannedCódigo QR escaneado
qr.flaggedCódigo QR marcado como inseguro
scan.createdEvento de escaneamento (alias para qr.scanned)
workspace.updatedWorkspace atualizado
webhook.pingPing de teste (via endpoint /ping)

Formato do Payload

Todos os payloads de webhook têm este formato:

{
"id": "evt_abc123xyz",
"type": "qr.scanned",
"created": "2026-03-15T10:00:00.000Z",
"data": {
"code_id": "qr_abc123",
"short_code": "r7f3Kx",
"scan_id": "scn_xyz",
"country": "AT",
"device_type": "mobile",
"os": "iOS"
}
}

Verificação de Assinatura

O qr3.app assina cada requisição de webhook com HMAC-SHA256:

X-QR3-Signature: sha256=a1b2c3d4e5f6...

Implementar a Verificação

import crypto from "crypto";
function verifySignature(
payload: string,
signature: string,
secret: string
): boolean {
const expected = crypto
.createHmac("sha256", secret)
.update(payload)
.digest("hex");
const received = signature.replace("sha256=", "");
return crypto.timingSafeEqual(
Buffer.from(expected, "hex"),
Buffer.from(received, "hex")
);
}
// In Express:
app.post("/webhooks/qr3", (req, res) => {
const signature = req.headers["x-qr3-signature"] as string;
const valid = verifySignature(
JSON.stringify(req.body),
signature,
process.env.QR3_WEBHOOK_SECRET
);
if (!valid) return res.status(401).json({ error: "Invalid signature" });
const event = req.body;
console.log(event.type, event.data);
res.json({ received: true });
});

Lógica de Tentativas

Em caso de erros (HTTP >= 300 ou timeout), o qr3.app tenta reenviar a entrega:

TentativaAtraso
1Imediatamente
21 minuto
35 minutos

Após 10 erros consecutivos, o webhook é desativado automaticamente.

Logs de Envio

Terminal window
GET /v1/webhooks/:id/deliveries
{
"data": [
{
"id": "whd_abc123",
"event_type": "qr.scanned",
"status": "success",
"status_code": 200,
"response_time_ms": 145,
"attempt": 1,
"created_at": "2026-03-15T10:00:00.000Z"
}
]
}

Ping de Teste

Teste um webhook imediatamente:

Terminal window
POST /v1/webhooks/:id/ping

Isso envia um evento webhook.ping para a URL do seu endpoint.