Notify node operations
All paths are relative to the credential Base URL (baseUrl). Versioned routes live under /api/v1/...; health is unversioned at /api/health. Every versioned call sends the configured key as X-API-KEY plus Accept: application/json and Content-Type: application/json. Only Service / Check health omits the key (the service marks it @Public()).
Operation and endpoint matrix
| Resource | Operation (UI label) | Serialized operation | HTTP method and path | Auth |
|---|---|---|---|---|
Send (send) | Send Notification | sendNotification | POST /api/v1/notifysimple (optional ?preview=true) | X-API-KEY |
Send (send) | Send Email | sendEmail | POST /api/v1/notifysimple/email (optional ?preview=true) | X-API-KEY |
Send (send) | Send SMS | sendSms | POST /api/v1/notifysimple/sms (optional ?preview=true) | X-API-KEY |
Send (send) | Cancel or Reschedule | cancelOrReschedule | PATCH /api/v1/notifysimple/{notificationId} | X-API-KEY |
Notification status (notificationStatus) | List Notification Requests | listNotificationRequests | GET /api/v1/notification_request (page/limit/sort/repeated filter) | X-API-KEY |
Notification status (notificationStatus) | List Delivery Records | listDeliveryRecords | GET /api/v1/notification_request/request_details | X-API-KEY |
Notification status (notificationStatus) | Get Delivery Records | getDeliveryRecords | GET /api/v1/notification_request/{id}/request_details (id from notificationId) | X-API-KEY |
Templates (templates) | List Templates | listTemplates | GET /api/v1/templates (page/limit/sort/repeated filter) | X-API-KEY |
Templates (templates) | Create Template | createTemplate | POST /api/v1/templates | X-API-KEY + NOTIFY_TEMPLATE_EDITOR role |
Templates (templates) | Get Template | getTemplate | GET /api/v1/templates/{templateId} | X-API-KEY |
Templates (templates) | Update Template | updateTemplate | PATCH /api/v1/templates/{templateId} | X-API-KEY + NOTIFY_TEMPLATE_EDITOR role |
Templates (templates) | Delete Template | deleteTemplate | DELETE /api/v1/templates/{templateId} (204, no body) | X-API-KEY + NOTIFY_TEMPLATE_EDITOR role |
Templates (templates) | Preview Template | previewTemplate | POST /api/v1/templates/{templateId}/preview (body { params }) | X-API-KEY |
Webhooks (webhooks) | Register Callback | registerCallback | POST /api/v1/notify/registerCallback (201, returns callbackId) | X-API-KEY |
Webhooks (webhooks) | Update Callback | updateCallback | PATCH /api/v1/notify/registerCallback/{callbackId} | X-API-KEY |
Webhooks (webhooks) | Delete Callback | deleteCallback | DELETE /api/v1/notify/registerCallback/{callbackId} (204, no body) | X-API-KEY |
Service (service) | Check Health | checkHealth | GET /api/health | None (no X-API-KEY) |
Inputs per operation
- Send / Send Notification (
payload, JSON, required): fullNotifySimpleRequestbody with at least one ofemail/sms/msgApp; templateId XOR inline content per channel; channelparamsoverride top-levelparams. A bare channel (recipientsat top level) is rejected locally — wrap it or use a shorthand below. - Send / Send Email (
emailPayload, JSON, required): bare email channel (recipients.to/cc/bccorrecipients.mergeArraymail merge,content,attachments,delayedSend,params,identityId) with noemailwrapper. A wrapped{"email": {...}}body (the Swagger example for the generic endpoint) is rejected locally — unwrap it or switch to Send Notification. - Send / Send SMS (
smsPayload, JSON, required): full SMS request with ansmschannel ({"sms": {...}, "params": {...}}); numbers normalise to E.164;403when SMS is disabled for the tenant. A bare channel or anemail/msgAppbody is rejected locally — thesmschannel is required. - Preview (
preview, boolean, defaultfalse): shown only on the three send POSTs; when enabled appends?preview=true, which returns200with rendered content without sending. Attachments andmergeArrayare not supported in preview. - Send / Cancel or Reschedule (
notificationIdrequired +actioncancel/reschedule;scheduledTimerequired and shown only forreschedule): cancel sends{"action":"cancel"}; reschedule sends{"scheduledTime":"..."}with a future time including a timezone (Zsuffix or numeric offset). Unparsable, past, or timezone-less times are rejected locally.404/422cases are pass-through upstream errors. - Notification status / List Notification Requests (
pagedefault1,limitdefault10max100,sorte.g.-createdAt,status, repeatablefiltersentries infield:operator:valueformat e.g.status:eq:QUEUED, sent as repeatedfilterquery params witharrayFormat: repeat). - Notification status / List Delivery Records: no parameters; returns all delivery records for the tenant.
- Notification status / Get Delivery Records (
notificationId, required): per-recipient records withchannelCode/status/errorReason. - Templates / List (
page/limit/sort/filtersas above, e.g.channelCode:eq:EMAIL; newest first by default). - Templates / Create (
namerequired, unique per tenant;channelCodeEMAIL/SMSrequired;bodyrequired;subjectoptional locally but required forEMAIL— server validates;engineCodehandlebars/mustache, defaults tohandlebarsserver-side when omitted;bodyTypemarkdownonly;descriptionoptional). - Templates / Get / Delete (
templateId, required). - Templates / Update (
templateIdrequired + optional patch fields; stores a new version, keeping history so already-scheduled notifications are unaffected). - Templates / Preview (
templateIdrequired +paramsJSON default'{}', sent as{ params }; every placeholder the template uses must be supplied). - Webhooks / Register (
urlrequired, https-only;channelTypemulti-optionemail/sms/msgApp, at least one;triggermulti-optionsuccess/failure, at least one;secretpassword-masked, optional;headersJSON object, optional;activeboolean defaulttrue;webhookTypegeneric/teams, omitted means generic server-side). - Webhooks / Update (
callbackIdrequired + same fields, all optional: emptyurl/secret/headers/webhookTypeomitted, emptychannelType/triggerleft unchanged,activealways sent — confirm its value when changing other fields). - Webhooks / Delete (
callbackIdonly; 204 with no body).
Send payload examples (copy-paste shapes)
Send / Send Notification — full request, channel wrapped, top-level params:
{
"email": {
"recipients": { "to": ["citizen@example.com"] },
"content": {
"subject": "Your permit application",
"body": "# Hello {{firstName}}\n\nYour application has been received.",
"bodyType": "markdown",
"renderer": "handlebars"
}
},
"params": { "firstName": "Alice" }
}
Send / Send Email — bare channel, no email wrapper (a wrapped {"email": {...}} body belongs to Send Notification):
{
"recipients": { "to": ["citizen@example.com"] },
"content": {
"subject": "Your permit application",
"body": "# Hello {{firstName}}\n\nYour application has been received.",
"bodyType": "markdown",
"renderer": "handlebars"
},
"params": { "firstName": "Alice" }
}
Send / Send SMS — full request with an sms channel (unlike email, the SMS route takes the wrapped shape):
{
"sms": {
"recipients": { "to": ["+12505550123"] },
"content": { "body": "Your appointment is confirmed for 09:00 tomorrow." }
},
"params": {}
}
Visibility rules (identifiers only where used)
notificationIdis shown/required only on Send / Cancel or Reschedule and Notification status / Get Delivery Records; list operations never read it.templateIdis shown/required only on template get/update/delete/preview; list and create never read it.callbackIdis shown/required only on webhook update/delete; register never reads it; delete reads no other webhook fields.scheduledTimeappears only whenactionisreschedule.page/limit/sort/filtersappear only on the two list operations (listNotificationRequests,listTemplates).
Follow-up, roles, and webhook verification
- Async delivery: sends return
202withnotifyId(accepted, not delivered). Correlate via Notification status: the sendnotifyIdappears asid(andnotificationRequestIdon delivery records) there. - Template roles: create/update/delete require the
NOTIFY_TEMPLATE_EDITORrole on the API key (403otherwise); the node surfaces this as an upstream error and documents it rather than pre-validating roles. - SMS guard: SMS sends return
403when the tenant lacks SMS; surfaced as an upstream error. - Webhooks: URLs must be https (plain http rejected locally). Deliveries retry with backoff; when
secretis set each delivery carries an HMACX-Webhook-Signatureheader for verification.
Responses and errors
- Local validation (blank
notificationId/templateId/callbackId/url, missingscheduledTimeon reschedule, unparsable/past/timezone-lessscheduledTime, bad channel/engine/body enums, non-https URLs, invalid JSON bodies, wrong-shape send bodies — bare channel on generic, wrapped full request on Send Email, non-smsbody on Send SMS — channel-less generic payloads, recipient-less email payloads, empty template patches) fails before transport without mutating the request. Error messages name the field label, never the supplied secret value; API keys and webhook secrets never appear in errors. - Upstream errors (template/safelist
422, SMS-disabled403, missing-editor-role403, unknown-id404) pass through with n8n's normal error settings. Continue On Fail pairing behavior applies to transport failures.
See credentials and release notes.