Receba notificações em tempo real quando eventos acontecem no MeNotifica.
Webhooks são chamadas HTTP automáticas que o MeNotifica envia para uma URL que você configura. Quando um evento acontece (por exemplo, um pagamento é confirmado), enviamos um POST com os dados do evento em JSON para a sua URL.
Isso permite que seu sistema reaja automaticamente: liberar acesso em uma portaria, renovar um plano, confirmar uma matrícula, ou qualquer outra ação.
| Evento | Descrição | Quando dispara |
|---|---|---|
| payment.confirmed | Pagamento confirmado | Quando o Mercado Pago confirma que o valor foi recebido |
| payment.refunded | Estorno total | Quando o valor total é devolvido ao pagador |
| payment.partial_refund | Estorno parcial | Quando parte do valor é devolvida |
| payment.overdue | Pagamento atrasado | Quando o pagamento passa da data de vencimento |
| payment.failed | Pagamento falhou | Quando o pagamento é recusado pelo processador |
| participant.accepted | Participante aceitou | Quando o participante aceita o convite (WhatsApp ou link) |
| participant.declined | Participante recusou | Quando o participante recusa o convite |
| case.created | Case criado | Quando um novo case (cobrança) é criado |
| case.completed | Case completado | Quando o case é marcado como completo |
| case.cancelled | Case cancelado | Quando o case é cancelado |
| ping | Teste | Enviado manualmente pelo botão "Enviar Ping" |
Todos os webhooks enviam um POST com Content-Type: application/json. O payload segue esta estrutura:
{
"event": "payment.confirmed",
"timestamp": "2026-03-26T14:30:00+00:00",
"webhook_id": "uuid-unico-da-entrega",
"data": {
"payment_id": "uuid-do-pagamento",
"case_id": "uuid-do-case",
"case_title": "Condomínio Março 2026",
"case_type": "rateio",
"participant": {
"id": "uuid-do-participante",
"name": "Maria Silva",
"email": "maria@email.com",
"phone": "11987654321",
"external_id": "APT-301"
},
"amount_brl": 150.00,
"reference_month": "2026-03",
"paid_at": "2026-03-26T14:28:00+00:00",
"payment_method": "pix"
}
}
| Header | Descrição |
|---|---|
X-MeNotifica-Signature | Assinatura HMAC-SHA256 do payload (sha256=hex) |
X-MeNotifica-Event | Nome do evento (ex: payment.confirmed) |
X-MeNotifica-Delivery | ID único desta entrega |
User-Agent | MeNotifica-Webhook/1.0 |
external_idO campo participant.external_id é um identificador livre que você pode configurar ao cadastrar participantes. Use-o para mapear o participante no seu sistema externo: número do apartamento, matrícula, ID de sócio, etc.
Cada webhook inclui um header X-MeNotifica-Signature com a assinatura HMAC-SHA256 do corpo da requisição, usando o secret que você recebe ao configurar o webhook.
Sempre valide a assinatura antes de processar o webhook para garantir que veio do MeNotifica.
import hmac
import hashlib
def verify_webhook(payload_body: bytes, signature_header: str, secret: str) -> bool:
"""Valida a assinatura do webhook MeNotifica."""
# Header format: "sha256=abc123..."
expected = hmac.new(
secret.encode(),
payload_body,
hashlib.sha256
).hexdigest()
received = signature_header.removeprefix("sha256=")
return hmac.compare_digest(expected, received)
# Exemplo com Flask:
@app.route("/webhook", methods=["POST"])
def handle_webhook():
signature = request.headers.get("X-MeNotifica-Signature", "")
if not verify_webhook(request.data, signature, WEBHOOK_SECRET):
return "Invalid signature", 401
data = request.json
event = data["event"]
if event == "payment.confirmed":
participant = data["data"]["participant"]
# Liberar acesso para participant["external_id"]
liberar_acesso(participant["external_id"])
return "OK", 200
const crypto = require('crypto');
function verifyWebhook(payloadBody, signatureHeader, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(payloadBody)
.digest('hex');
const received = signatureHeader.replace('sha256=', '');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(received)
);
}
// Exemplo com Express:
app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => {
const signature = req.headers['x-menotifica-signature'] || '';
if (!verifyWebhook(req.body, signature, WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
const data = JSON.parse(req.body);
if (data.event === 'payment.confirmed') {
const externalId = data.data.participant.external_id;
// Liberar acesso para externalId
liberarAcesso(externalId);
}
res.status(200).send('OK');
});
<?php
function verifyWebhook(string $payloadBody, string $signatureHeader, string $secret): bool {
$expected = hash_hmac('sha256', $payloadBody, $secret);
$received = str_replace('sha256=', '', $signatureHeader);
return hash_equals($expected, $received);
}
// Exemplo:
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_MENOTIFICA_SIGNATURE'] ?? '';
if (!verifyWebhook($payload, $signature, $webhookSecret)) {
http_response_code(401);
exit('Invalid signature');
}
$data = json_decode($payload, true);
if ($data['event'] === 'payment.confirmed') {
$externalId = $data['data']['participant']['external_id'];
// Liberar acesso para $externalId
liberarAcesso($externalId);
}
http_response_code(200);
echo 'OK';
Se o seu endpoint retornar um erro (status 4xx/5xx) ou não responder em 10 segundos, o MeNotifica faz até 4 tentativas com backoff crescente:
| Tentativa | Quando |
|---|---|
| 1 | Imediato |
| 2 | +1 minuto |
| 3 | +5 minutos |
| 4 | +30 minutos |
Após 4 tentativas falharem, a entrega é marcada como Falhou e aparece no log de entregas na tela de Integrações.
2xx (200, 201, 204) dentro de 10 segundos. Se precisar de mais tempo para processar, retorne 200 imediatamente e processe em background.
Verifique se os eventos desejados estão marcados na configuração. Cada evento precisa ser selecionado individualmente.
X-MeNotifica-Signature (com o prefixo sha256=)200 primeiro e processe depoisexternal_id?Ao cadastrar participantes em um case, preencha o campo "ID Externo" com o identificador do seu sistema (ex: "APT-301", "MAT-4521"). Este valor é enviado em todos os webhooks relacionados ao participante.
MeNotifica — Documentação de Webhooks v1.0