Webhooks
Receba notificações em tempo real sobre eventos de facturação, pagamentos e estado de documentos.
Estrutura do Evento
O Vero envia um POST HTTPS para o URL configurado com o seguinte payload JSON:
Payload Example
{
"event": "invoice.issued",
"orgId": "779b90ce-...",
"timestamp": "2026-07-07T10:00:00.000Z",
"data": {
"id": "a1b2c3d4-...",
"number": "FR FR6326S47071N/1",
"status": "issued",
"total": 15000000,
"pdfUrl": "https://api.vero.ao/v1/public/invoices/a1b2c3d4-.../pdf"
}
}data.pdfUrl em eventos de factura é um link público, sem necessidade de autenticação - pode ser usado directamente num email ou aberto pelo utilizador final. Gerado na hora a cada pedido, não fica em storage.
data é o próprio documento (mesma forma da resposta da API), não um objecto aninhado.
Eventos Suportados
| invoice.issued | Emitido quando uma factura é assinada e certificada. |
| invoice.cancelled | Emitido quando uma factura é anulada (gera Nota de Crédito). |
| invoice.agt_validated | A AGT validou a factura (FT, FR, FA...). Chega alguns segundos depois do invoice.issued. |
| invoice.agt_rejected | A AGT rejeitou a factura. Os motivos vêm em data.agtErrors (código e mensagem da AGT). |
| credit_note.issued | A nota de crédito foi emitida (tem número). data.kind é cancel (anulação) ou advance (regularização de uma FA; data.invoiceId é a FA e data.regularizedInvoiceId a factura final). A de adiantamento pode sair depois da factura final, se a AGT estiver em baixo. |
| credit_note.agt_validated | A AGT validou a nota de crédito. data.invoiceId é a factura de origem; data.kind e data.regularizedInvoiceId como em credit_note.issued. |
| credit_note.agt_rejected | A AGT rejeitou a nota de crédito, com os motivos em data.agtErrors. |
| proforma.converted | Emitido quando um orçamento é convertido em factura. |
| proforma.cancelled | Emitido quando um orçamento é anulado. |
Estado na AGT
A validação pela AGT acontece em segundo plano. Em vez de consultar cada documento com GET, subscreve invoice.agt_validated e invoice.agt_rejected. Cada evento é enviado uma vez por documento, com a mesma assinatura X-Vero-Signature e as mesmas novas tentativas dos outros eventos. O campo idempotencyKey é a chave que enviaste ao emitir, para ligares o evento à venda no teu sistema.
{
"event": "invoice.agt_rejected",
"orgId": "5f1c…",
"data": {
"id": "a3b9…",
"number": "FR FR27X/1452",
"documentType": "FR",
"total": 11400000,
"currency": "AOA",
"agtStatus": "rejected",
"agtErrors": [{ "idError": "E12", "descriptionError": "NIF do adquirente inválido" }],
"agtRespondedAt": "2026-11-05T10:15:02.000Z",
"idempotencyKey": "venda-001"
},
"timestamp": "2026-11-05T10:15:10.000Z"
}