iGRPIGRP 3.0Documentation

API REST

Endpoints REST do iGRP Notification Service — envio, inbox, anexos, templates, destinatários, recorrências, configuração e administração, com as permissões de cada um.

Base<base do serviço>/api/v1 — no workspace do Studio: http://<slug>:<porta>/gateway-api/igrp-notification-service/api/v1
OpenAPI/v3/api-docs · Swagger UI em /swagger-ui.html
AutenticaçãoAuthorization: Bearer <jwt> emitido pelo Access Management, exceto health/info, OpenAPI, Swagger e /webhooks/**
GraphQLtambém disponível (consultas de notificações e templates)

Os clientes TypeScript e Java cobrem todos estes endpoints.


Permissões e aplicação

Cada endpoint exige uma permissão, lida das claims do token:

PermissãoPara quê
igrp.notification.sendEnviar, reenviar, anexar, cancelar lotes
igrp.notification.readConsultar notificações, lotes, anexos, estatísticas
igrp.notification.inboxInbox do próprio utilizador
igrp.notification.adminTemplates, destinatários, grupos, recorrências, configuração, RGPD
igrp.notification.manual_statusMudar à mão o estado de uma entrega OFFLINE

Os pedidos pertencem a uma aplicação. O serviço usa o claim application_code do token; sem ele, usa o applicationCode do pedido (query nas leituras, corpo nas escritas). Erros: 400 APPLICATION_CODE_REQUIRED, 403 APPLICATION_ACCESS_DENIED, 422 ACCESS_MANAGER_UNAVAILABLE.

Os envios (POST /notifications, bulk e CSV) são M2M: token client_credentials.


Notificações

EMAIL precisa de SMTP configurado

Para enviar por EMAIL, o provider SMTP tem de estar configurado no Notification Service (NOTIFICATION_PROVIDERS_EMAILSMTP_*: servidor, porta, credenciais e remetente). Sem ele, o envio é recusado com 422 CHANNEL_NOT_ENABLED e nenhum email sai — ver Configurar os canais › EMAIL (SMTP). O canal também tem de estar ativo nas Definições da aplicação.

MétodoEndpointPermissãoDescrição
POST/notificationssendEnviar. Responde 202 com id e deliveries
GET/notificationsreadListar com filtros
GET/notifications/{id}readDetalhe, entregas e conteúdo renderizado
POST/notifications/{id}/resendsendReenviar (canais/destinatários opcionais)

Filtros da listagem: businessKey, category, priority, channel, status, batchId, recurrenceId, recipient, createdFrom, createdTo (ISO 8601), applicationCode, page, size, sort.

Corpo do envio

CampoDescrição
channelStrategyObrigatório. SPECIFIC, ALL ou PREFERRED
channelsEMAIL, SMS, WHATSAPP, PUSH, IN_APP, OFFLINE
recipients[{ userId?, email?, phone?, pushToken? }]
groups[{ groupId | departmentCode | roleCode | permissionName }] — resolvidos no envio
template{ code, locale? } — template publicado
inline{ subject?, title?, body? } — em vez de template
variablesValores das variáveis do template
priorityLOW, NORMAL, HIGH, URGENT
attachments[{ filename, contentRef }]
idempotencyKeyEvita envios duplicados
businessKey, category, correlationIdRastreio e agrupamento
locale, scheduledAt, expiresAtOpcionais
callbackUrlHTTPS, num domínio registado nas definições da aplicação

Envios em massa e lotes

MétodoEndpointPermissãoDescrição
POST/notifications/bulksendMesmo pedido para muitos destinatários → batchId
POST/notifications/bulk/csvsendMultipart: parte request (JSON) + parte file (CSV)
GET/batches/{batchId}readProgresso do lote
POST/batches/{batchId}/cancelsendCancelar as entregas ainda pendentes

Anexos

MétodoEndpointPermissãoDescrição
POST/attachmentssendUpload multipart (parte file) → id, contentRef, filename, mimeType, sizeBytes, checksum
GET/attachments/{id}readDownload

Inbox (IN_APP)

Token do utilizador (o userId sai do token). Permissão igrp.notification.inbox.

MétodoEndpointDescrição
GET/inboxListar. Filtros unreadOnly, includeArchived; página de 20 por omissão
GET/inbox/unread-count{ "unreadCount": n }
POST/inbox/{deliveryId}/readMarcar como lida
POST/inbox/readMarcar todas como lidas
POST/inbox/{deliveryId}/archiveArquivar

Templates

Todos exigem igrp.notification.admin.

MétodoEndpointDescrição
GET/templatesListar. Filtros code, channel, status, locale
POST/templatesCriar (rascunho)
GET/templates/{id}Obter
PUT/templates/{id}Atualizar
POST/templates/{id}/publishPublicar
POST/templates/{id}/archiveArquivar
POST/templates/{id}/previewRenderizar com variáveis de teste

Não há obtenção por código: para encontrar um template publicado, lista com code e status=PUBLISHED. Ver Templates.


Destinatários e grupos

Todos exigem igrp.notification.admin.

MétodoEndpointDescrição
GET/recipients/{userId}Contactos e preferências de um utilizador
PUT/recipients/{userId}Criar ou atualizar
PUT/recipients/{userId}/preferencesCanais preferidos (usados por PREFERRED)
PUT/recipients/{userId}/opt-outsOpt-outs por canal/categoria
DELETE/recipients/{userId}Remover
GET, POST/groupsListar, criar grupo
GET, PUT, DELETE/groups/{id}Obter, atualizar, remover

Recorrências

MétodoEndpointPermissãoDescrição
GET, POST/recurrencesadminListar, criar
GET, DELETE/recurrences/{id}adminObter, remover
POST/recurrences/{id}/pauseadminPausar
POST/recurrences/{id}/resumeadminRetomar
GET/recurrences/{id}/executionsreadExecuções

Entregas e estatísticas

MétodoEndpointPermissãoDescrição
POST/deliveries/{id}/statusmanual_statusMudar o estado de uma entrega OFFLINE
GET/stats/deliveriesreadContagens agrupadas: groupBy (obrigatório: CHANNEL, STATUS, APPLICATION), from, to, allApplications, applicationCode

Configuração e administração

MétodoEndpointPermissãoDescrição
GET, PUT/settingsadminDefinições da aplicação: canais, remetentes, quotas, domínios de callback, retenção
POST/admin/recipients/{userId}/forgetadminAnonimizar os contactos de um utilizador (RGPD)
POST/admin/retention/purgeadminApagar dados fora do prazo de retenção

Webhooks dos providers

Sem /api/v1 e sem token (a autenticidade é validada por provider):

MétodoEndpointDescrição
POST/webhooks/{providerId}Recibos de entrega e leitura enviados pelo provider
GET/webhooks/{providerId}Verificação do webhook (hub.*)

Exemplo: email com template

EMAIL precisa de SMTP configurado

Para enviar por EMAIL, o provider SMTP tem de estar configurado no Notification Service (NOTIFICATION_PROVIDERS_EMAILSMTP_*: servidor, porta, credenciais e remetente). Sem ele, o envio é recusado com 422 CHANNEL_NOT_ENABLED e nenhum email sai — ver Configurar os canais › EMAIL (SMTP). O canal também tem de estar ativo nas Definições da aplicação.

curl -X POST "$NOTIFICATION_SERVICE_BASE_URL/api/v1/notifications" \
  -H "Authorization: Bearer $TOKEN_M2M" \
  -H "Content-Type: application/json" \
  -d '{
    "applicationCode": "MINHA_APP",
    "channelStrategy": "SPECIFIC",
    "channels": ["EMAIL"],
    "recipients": [{ "email": "utente@exemplo.cv" }],
    "template": { "code": "pedido-confirmacao", "locale": "pt-CV" },
    "variables": { "nome": "Maria Silva", "numeroPedido": "PED-2026-456" },
    "category": "pedido-confirmacao",
    "businessKey": "PED-2026-456",
    "idempotencyKey": "pedido-confirmacao-PED-2026-456"
  }'

Resposta 202 Accepted: a entrega é assíncrona. O estado de cada entrega consulta-se em GET /notifications/{id}.


Erros

Corpo de erro: { "code": "…", "message": "…" }.

HTTPCódigos
400VALIDATION_ERROR, INVALID_REQUEST, APPLICATION_CODE_REQUIRED
403APPLICATION_ACCESS_DENIED, ATTACHMENT_ACCESS_DENIED, MISSING_USER_ID
404TEMPLATE_NOT_FOUND, NOTIFICATION_NOT_FOUND, RECIPIENT_NOT_FOUND, GROUP_NOT_FOUND, BATCH_NOT_FOUND, DELIVERY_NOT_FOUND, INBOX_ITEM_NOT_FOUND, ATTACHMENT_NOT_FOUND, …
413ATTACHMENT_TOO_LARGE
422TEMPLATE_ERROR, CHANNEL_NOT_ENABLED, CHANNEL_NOT_ALLOWED, CSV_INVALID, CALLBACK_DOMAIN_NOT_ALLOWED, SCHEDULING_NOT_SUPPORTED, INVALID_STATE_TRANSITION, ACCESS_MANAGER_UNAVAILABLE
429QUOTA_EXCEEDED

Estados de entrega (DeliveryStatus)

EstadoDescrição
PENDINGAceite, à espera (ou agendada para scheduledAt)
QUEUEDNa fila de processamento
SENDINGEnvio em curso
SENTAceite pelo provider
DELIVEREDEntrega confirmada (recibo do provider, IN_APP guardada, OFFLINE entregue à mão)
READLeitura confirmada (recibo de leitura, IN_APP aberta, marcação manual)
FAILEDFalha definitiva depois das tentativas
CANCELLEDCancelada antes do envio
EXPIREDexpiresAt passou sem envio
How is this guide?

Última atualização: