Facturas recorrentes API
Avenças, rendas, mensalidades: uma FT repetida no dia X, de N em N meses. O Vero emite-a no próprio dia (a AGT exige a data da emissão, por isso nunca sai com data futura) e, se quiseres, envia o PDF ao cliente.
Já tens o calendário no teu sistema?
Não precisas destas rotas: um cron que chama POST /invoices com uma idempotencyKey por período (ex.: avenca:CLIENTE:2026-11) dá o mesmo resultado, e uma repetição nunca cria duas facturas. Estas rotas servem para deixar o calendário do lado do Vero, visível e gerível no dashboard (Facturas → Recorrentes).
Criar recorrência
/v1/organisations/:orgId/recurring-invoicesSó com chave live: com chave de teste a resposta é 403 not_available_in_test, porque a recorrência emitiria depois facturas reais.
const rec = await vero.recurringInvoices.create(ORG_ID, {
customerId: customer.id,
items: [{ description: 'Avença de manutenção', quantity: 1, unitPrice: 5000000 }],
dayOfMonth: 13,
intervalMonths: 1,
startDate: '2026-11-01',
mode: 'auto',
sendEmail: true,
})
rec.upcoming // ['2026-11-13', '2026-12-13', '2027-01-13']| Campo | Tipo | Descrição |
|---|---|---|
| customerId | string (uuid) | Cliente - obrigatório |
| items | InvoiceItem[] | Linhas, no mesmo formato de POST /invoices - obrigatório |
| dayOfMonth | 1–31 | Dia de cada factura - obrigatório. 31 = último dia nos meses mais curtos |
| startDate | AAAA-MM-DD | A partir de quando - obrigatório. Se a primeira data for hoje, fica logo pronta (ou emitida, com mode auto) |
| intervalMonths | 1 | 3 | 6 | 12 | Mensal (default), trimestral, semestral, anual |
| endDate | AAAA-MM-DD? | Terminar nesta data |
| maxCount | integer? | Terminar ao fim de N facturas |
| mode | 'confirm' | 'auto' | confirm (default): no dia fica pronta e espera por /issue · auto: emite sozinha |
| sendEmail | boolean | Enviar o PDF ao cliente por email ao emitir (default: true) |
| notes | string? | Notas da factura |
Resposta (201 Created)
{
"id": "5f1c...",
"customerId": "b2c3...",
"customerName": "Empresa ABC",
"description": "Avença de manutenção",
"total": 5700000,
"intervalMonths": 1,
"dayOfMonth": 13,
"startDate": "2026-11-01",
"endDate": null,
"maxCount": null,
"generatedCount": 0,
"nextRunDate": "2026-11-13",
"upcoming": ["2026-11-13", "2026-12-13", "2027-01-13"],
"mode": "auto",
"sendEmail": true,
"status": "active",
"pendingRuns": 0,
"firstRun": null
}total é o valor de cada factura, com IVA, em kwanzas × 100. firstRun só vem preenchido quando a primeira data é hoje.
Como corre
- A partir das 07h (Luanda) do dia marcado, o Vero gera a factura dessa data - uma só vez por data, mesmo com repetições.
- Com
mode: 'auto'emite a FT na AGT (comidempotencyKeyrecurring:<id>:<data>) e envia-a ao cliente sesendEmail. Se falhar, tenta de novo (até 5 vezes, uma por hora) e avisa o dono por email. - Com
mode: 'confirm'fica pronta: o dono recebe um email e emite com um clique, ou tu pela API. - Se o servidor estiver parado vários meses, gera só uma factura atrasada e salta para a próxima data futura.
- Os webhooks
invoice.issueddisparam como em qualquer factura.
Prontas a emitir
/v1/organisations/:orgId/recurring-invoices-pendingFacturas que chegaram ao dia: ready (à espera de confirmação) ou failed (com error).
/v1/organisations/:orgId/recurring-invoices-pending/:runId/issue/v1/organisations/:orgId/recurring-invoices-pending/:runId/skipfor (const run of await vero.recurringInvoices.pending(ORG_ID)) {
const { invoiceId, emailed } = await vero.recurringInvoices.issue(ORG_ID, run.id)
}A factura sai com a data de hoje. Emitir duas vezes a mesma dá 409 already_done; se a AGT recusar, 422 issue_failed com a mensagem.
Gerir
| GET | /v1/organisations/:orgId/recurring-invoices | Lista ({ data: [...] }) |
| GET | /v1/organisations/:orgId/recurring-invoices/:id | Detalhe, com o histórico em runs[] (data, estado, número e estado AGT de cada factura) |
| PATCH | /v1/organisations/:orgId/recurring-invoices/:id | Mudar linhas, calendário, fim, modo ou email - só as próximas facturas mudam |
| POST | /v1/organisations/:orgId/recurring-invoices/:id/pause | Pausar |
| POST | /v1/organisations/:orgId/recurring-invoices/:id/resume | Retomar a partir da próxima data futura (não gera as que passaram) |
| POST | /v1/organisations/:orgId/recurring-invoices/:id/end | Terminar de vez (409 recurring_ended depois) |
SDK: vero.recurringInvoices.list / get / update / pause / resume / end (@veroao/node 1.5+). Ainda não disponível para apps OAuth.