{"_id":"@blackswampai/n8n-nodes-novu","_rev":"2-57ba070a5a126121d786cf23451227f5","name":"@blackswampai/n8n-nodes-novu","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@blackswampai/n8n-nodes-novu","version":"0.1.0","keywords":["n8n-community-node-package","n8n","novu","notifications"],"author":{"name":"Christopher J. Nelson","email":"christopherjnelson@proton.me"},"license":"MIT","_id":"@blackswampai/n8n-nodes-novu@0.1.0","maintainers":[{"name":"christopherjnelson","email":"root@chris.guru"}],"homepage":"https://blackswampai.com/n8n-nodes/novu/","bugs":{"url":"https://github.com/BlackSwampAI/n8n-nodes-novu/issues"},"n8n":{"nodes":["dist/nodes/Novu/Novu.node.js"],"strict":true,"credentials":["dist/credentials/NovuApi.credentials.js"],"n8nNodesApiVersion":1},"dist":{"shasum":"0233210b8e494e5cc62b93683bb87ba21ae76751","tarball":"https://registry.npmjs.org/@blackswampai/n8n-nodes-novu/-/n8n-nodes-novu-0.1.0.tgz","fileCount":60,"integrity":"sha512-+VqwrHRRohkI53Dr+VjGSCO8wHMjyLwUULScP9zYv/Jl8Eq8UDFgJ8FTJ8En58327+ZpXQKZv2746AJ39dT2Mg==","signatures":[{"sig":"MEUCIEbI2ttiwhsLXDDaRF7yFCV9Ck5MkJ5ClIVDvNpfmgOhAiEAhFTjtZOJKQKDp7YaCp36G08F3I9gT2zUbr9f2leYMSE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackswampai%2fn8n-nodes-novu@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":191957},"engines":{"node":">=22.22.0"},"gitHead":"b043909cc7cfa2faa4d8e997407032f7a8e4ea73","scripts":{"dev":"n8n-node dev","lint":"n8n-node lint","test":"vitest run","build":"n8n-node build","format":"prettier --write .","release":"n8n-node release","lint:fix":"n8n-node lint --fix","test:unit":"vitest run","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","smoke:load":"node scripts/node-load-smoke.mjs","build:watch":"tsc --watch","scan:source":"node scripts/scan-source.mjs","format:check":"prettier --check .","package:check":"npm run release:check && npm pack --dry-run --json --cache .npm-cache | node scripts/validate-pack.mjs","release:check":"node scripts/release-check.mjs","smoke:install":"node scripts/package-install-smoke.mjs","prepublishOnly":"n8n-node prerelease","scan:published":"node scripts/scan-published.mjs"},"_npmUser":{"name":"christopherjnelson","email":"root@chris.guru"},"repository":{"url":"git+https://github.com/BlackSwampAI/n8n-nodes-novu.git","type":"git"},"_npmVersion":"11.19.0","description":"Independent n8n community node for Novu notification workflows","directories":{},"_nodeVersion":"24.20.0","allowScripts":{"eslint-plugin-n8n-nodes-base":false},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"npm@11.19.0","devDependencies":{"eslint":"9.39.4","vitest":"4.1.11","prettier":"3.8.3","release-it":"20.2.0","typescript":"5.9.3","@n8n/node-cli":"0.46.4","@n8n/scan-community-package":"0.34.0"},"peerDependencies":{"n8n-workflow":"*"},"_npmOperationalInternal":{"tmp":"tmp/n8n-nodes-novu_0.1.0_1788744210072_0.2773138669442077","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"_id":"@blackswampai/n8n-nodes-novu@0.1.2","n8n":{"nodes":["dist/nodes/Novu/Novu.node.js"],"strict":true,"credentials":["dist/credentials/NovuApi.credentials.js"],"n8nNodesApiVersion":1},"bugs":{"url":"https://github.com/BlackSwampAI/n8n-nodes-novu/issues"},"dist":{"shasum":"cd26ca3545132cba725094d5266f56f3efcabf96","tarball":"https://registry.npmjs.org/@blackswampai/n8n-nodes-novu/-/n8n-nodes-novu-0.1.2.tgz","fileCount":54,"integrity":"sha512-RB/Me9+o6eB1OtAgeYWYXqL2RS3NF2UwmtY6xPxYNUAO7F+Q3eGKzDIzAWLnzG2sZb00pTNlt02q9EWlVNlWQw==","signatures":[{"sig":"MEQCIEevtrFwyJwgMuBwL9levGxB21cfdIKdTpi2KjsUIhfgAiAXDmS3hjHuUvr5ly7mWnB34Kh2LcLFEkP3GBqGTEi1eQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDm77bZrlAsKpUfWc3ghdlw8l6zDDbthkSSue5bak8Z9AIhALPbr7Sd3dbxWKk38HsXTS0eZvmgA7wORYG5hLHL+9ol"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackswampai%2fn8n-nodes-novu@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":196136},"name":"@blackswampai/n8n-nodes-novu","author":{"name":"Christopher J. Nelson","email":"christopherjnelson@proton.me"},"engines":{"node":">=22.22.0"},"gitHead":"8241b1434d2098ffdf4dd3002db467496be8d8e0","license":"MIT","scripts":{"dev":"n8n-node dev","lint":"n8n-node lint","test":"vitest run","build":"n8n-node build","format":"prettier --write .","release":"n8n-node release","lint:fix":"n8n-node lint --fix","test:unit":"vitest run","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","smoke:load":"node scripts/node-load-smoke.mjs","build:watch":"tsc --watch","scan:source":"node scripts/scan-source.mjs","format:check":"prettier --check .","package:check":"npm run release:check && npm pack --dry-run --json --cache .npm-cache | node scripts/validate-pack.mjs","release:check":"node scripts/release-check.mjs","smoke:install":"node scripts/package-install-smoke.mjs","prepublishOnly":"n8n-node prerelease","scan:published":"node scripts/scan-published.mjs"},"version":"0.1.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4451fbad-4cd0-491d-941a-7ca159f83412"}},"homepage":"https://blackswampai.com/n8n-nodes/novu/","keywords":["n8n-community-node-package","n8n","novu","notifications"],"repository":{"url":"git+https://github.com/BlackSwampAI/n8n-nodes-novu.git","type":"git"},"_npmVersion":"11.19.0","description":"Independent n8n community node for Novu notification workflows","directories":{},"maintainers":[{"name":"christopherjnelson","email":"root@chris.guru"}],"_nodeVersion":"24.20.0","allowScripts":{"eslint-plugin-n8n-nodes-base":false},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"npm@11.19.0","devDependencies":{"eslint":"9.39.4","vitest":"4.1.11","prettier":"3.8.3","release-it":"20.2.0","typescript":"5.9.3","@n8n/node-cli":"0.46.4","@n8n/scan-community-package":"0.34.0"},"peerDependencies":{"n8n-workflow":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/n8n-nodes-novu_0.1.2_1788955138867_0.7005621823655896"}}},"time":{"created":"2026-09-07T01:23:29.854Z","modified":"2026-09-09T11:58:59.305Z","0.1.0":"2026-09-07T01:23:30.246Z","0.1.2":"2026-09-09T11:58:58.961Z"},"bugs":{"url":"https://github.com/BlackSwampAI/n8n-nodes-novu/issues"},"author":{"name":"Christopher J. Nelson","email":"christopherjnelson@proton.me"},"license":"MIT","homepage":"https://blackswampai.com/n8n-nodes/novu/","keywords":["n8n-community-node-package","n8n","novu","notifications"],"repository":{"url":"git+https://github.com/BlackSwampAI/n8n-nodes-novu.git","type":"git"},"description":"Independent n8n community node for Novu notification workflows","maintainers":[{"name":"christopherjnelson","email":"root@chris.guru"}],"readme":"# @blackswampai/n8n-nodes-novu\n\nAn independent n8n community integration for the Novu notification platform.\n\nThis project is not affiliated with, endorsed by, sponsored by, or maintained by Novu or n8n. Product names and marks belong to their respective owners and are used only to identify compatibility. The package is not official, approved, or verified by n8n or Novu.\n\n## Installation\n\nThis is an unverified community package for self-hosted n8n. In n8n, open **Settings → Community Nodes**, select **Install**, enter `@blackswampai/n8n-nodes-novu`, accept the community-node risk prompt, and install. See n8n's [manual Community Nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation-and-management/gui-installation/). It is not available through verified-node discovery unless n8n later approves it.\n\n## Compatibility\n\n- n8n and Novu Cloud: the owner exercised the node in a local n8n editor against Novu Cloud. Exact versions and operation-by-operation evidence were not recorded, so this is limited smoke evidence rather than a compatibility claim.\n- Self-hosted Novu: unverified; no compatibility version is claimed\n- Node.js development baseline: 22.22.0 or newer\n\n## Credentials\n\nThe registered **Novu API** credential stores a secret API key and selects US (`https://api.novu.co`), EU (`https://eu.api.novu.co`), or a custom base URL. Novu server API authentication uses `Authorization: ApiKey <secret>` and never fails over between regions.\n\nA custom base URL must use HTTPS. It may contain a reverse-proxy path prefix; surrounding whitespace and trailing slashes are normalized. User information, query strings, fragments, malformed URLs, and paths ending in `/v1` or `/v2` are rejected. API versions belong to individual operation routes, which prevents doubled versions. There is no option to disable TLS verification.\n\nThe credential test performs `GET /v2/workflows?limit=1`, requiring no subscriber or mutation. It maps 401, 403, 404, and 429 responses to setup guidance. n8n's declarative credential-test mechanism handles connection/DNS/TLS failures with its standard network error rather than this node's richer execution-time mapping; no live credential test has been run for this scaffold.\n\n## Operations\n\nThe Subscriber resource implements:\n\n- Create or Update, with optional strict duplicate rejection\n- Get by external subscriber ID\n- Get Many with filters, limits, and forward cursor pagination\n- Update selected fields or explicitly clear them to null\n- Delete\n\nCommon profile fields are typed inputs; Custom Data accepts an expression-capable JSON object or null. Update sends selected fields only. List results retain input-item linkage and empty lists emit no fabricated item.\n\nThe Subscriber Preference resource gets the full global/workflow preference envelope and updates global or workflow-specific channel settings. Email, SMS, in-app, push, chat, and tool each use Unchanged/Enabled/Disabled controls, so PATCH requests omit unrelated settings and preserve `false`. Workflow references may be a Novu internal `_id`, identifier, or slug. Get supports documented criticality and context-key filters. Schedule and context mutation remain deferred, and changing a preference is not claimed to cancel already queued work.\n\nThe Topic resource implements Create or Update, Get, Get Many, Update, and Delete. Topic keys remain distinct from internal IDs and are encoded in paths. Create accepts an optional display name and flat custom-data object or null; strict creation is optional. Get Many uses forward `after` pagination with Novu's documented maximum of 100 per request, without exposing raw cursors or `includeCursor`. Delete returns only the targeted key and Novu's actual acknowledgment; deleting a topic irreversibly removes its subscriptions.\n\nTopic Subscription implements Create, Get Many, and Delete using Novu's current `subscriptions` array. Create may cause Novu to create a missing topic. Mutation responses preserve partial-result `data`, `meta`, and `errors` instead of claiming all entries succeeded. Subscriber-only deletion removes every relationship for that subscriber in the topic; relationship identifiers can target narrower removals. Context-scoped relationships and per-subscription preferences remain deferred.\n\nTrigger Workflow supports either one subscriber or one Topic recipient. Topic mode sends `{ \"type\": \"Topic\", \"topicKey\": \"...\" }` and lets Novu perform fan-out; it does not loop through members or broadcast globally. Fan-out may affect provider usage and billing. The response remains acceptance/processing evidence, not delivery proof.\n\nThe Notification resource implements **Trigger Workflow** for one subscriber or one Topic per input item. It sends the workflow identifier as REST field `name`, the selected recipient as `to`, and an object payload. The full Novu acknowledgment is preserved, including its transaction ID when returned. An acknowledgment means Novu accepted or reported processing of the request; it does not prove email, SMS, push, or in-app delivery.\n\nWorkflow identifiers can be searched and paginated From List or entered manually By ID; list permissions never make manual entry a prerequisite. The Workflow resource implements Get and Get Many, returns full workflow objects, and keeps public `workflowId` distinct from internal `_id`. Workflow lists use their endpoint-specific offset/limit pagination.\n\nNotification also implements **Cancel Execution** by transaction ID. It reports Novu's actual boolean result and can cancel only eligible active or pending work such as delays or digests. It cannot recall messages already delivered.\n\nTransaction ID and Idempotency Key are separate optional inputs. Transaction ID supports tracing and later cancellation but is not API-boundary deduplication. When enabled for the Novu organization, Idempotency Key caches a request result for a finite 24-hour window. The opt-in retry control requires that key and makes no more than three total attempts for HTTP 408, 409 in-progress, 429, 500/502/503/504, or status-free network/timeout failures. Numeric `Retry-After` values are respected up to 30 seconds; longer values surface an error rather than waiting less than Novu requested. Without `Retry-After`, delays are one then two seconds. Do not combine this policy with n8n node-level retries.\n\nGet Many uses Novu's forward cursor pagination. Novu documents a minimum cursor-list limit of 1 and a maximum of 100, using `/v2/subscribers` as its pagination example; the node requests at most that documented maximum, detects repeated/malformed cursors, and enforces the requested total limit exactly. No automatic retries are performed. Subscriber behavior is contract-tested with mocks. The owner reported broader post-envelope-fix smoke behavior as solid, but exact operation coverage and versions were not recorded.\n\nShared requests use n8n's authenticated HTTP helper, URL-encode every path segment, and map 401, 403, 404, 429 (including `Retry-After` when present), and network failures without copying upstream bodies or secrets into messages. Subscriber calls remain no-retry; only Trigger Workflow can opt into the bounded idempotency-protected policy described above.\n\n## Development\n\n```sh\nnpm ci\nnpm run format:check\nnpm run lint\nnpm run typecheck\nnpm test\nnpm run build\nnpm run scan:source\nnpm run package:check\nnpm run smoke:load\nnpm run smoke:install\n```\n\nSee [project status](https://github.com/BlackSwampAI/n8n-nodes-novu/blob/main/docs/STATUS.md), [ADR 0001](https://github.com/BlackSwampAI/n8n-nodes-novu/blob/main/docs/decisions/0001-node-architecture.md), and the [implementation gameplan](https://github.com/BlackSwampAI/n8n-nodes-novu/blob/main/docs/Novu-n8n-Codex-Gameplan.md).\n\n## Examples\n\n- [Customer onboarding](examples/customer-onboarding.json) creates or updates a sanitized example Subscriber, then triggers a manually identified onboarding workflow.\n- [Topic opt-in/out](examples/topic-opt-in-out.json) creates a test Topic and relationship; the destructive opt-out node is disabled by default.\n\nAfter import, select your Novu API credential, replace every `bsa-example-*` value with owned test identifiers, and replace `replace-with-workflow-id` with an active development workflow identifier before executing. The examples contain no credential, secret, real customer data, or dependency on another community package. See the [manual smoke checklist](docs/SMOKE_TESTS.md) before live execution.\n\n## Troubleshooting\n\n- **Authentication fails:** confirm the API key, environment permissions, and US/EU region. The node never fails over regions. A custom reverse-proxy URL must be HTTPS and must not end in `/v1` or `/v2`.\n- **Workflow trigger succeeds but no message arrives:** the returned acknowledgment is acceptance/processing evidence, not delivery. Inspect the workflow's active state, steps, Novu activity, subscriber preferences, and provider/test inbox.\n- **Topic results differ from subscriber count:** Novu performs topic fan-out, and a subscriber may have multiple relationships. Partial subscription mutation details remain in `meta` and `errors`.\n- **Retry is unavailable or rejected:** the bounded trigger retry requires a nonempty Idempotency Key and organization-level Novu idempotency support. Do not stack it with n8n node retries.\n- **Installation fails:** confirm this is a self-hosted n8n instance with Community Nodes enabled, enter the exact scoped package name, and inspect the n8n logs. This package is not available through verified-node discovery unless n8n approves it.\n\nSee the [changelog](CHANGELOG.md), [operation matrix](docs/api-matrix.md), and [testing evidence guide](docs/testing.md) when diagnosing version or contract behavior.\n\n## Resources\n\n- [Novu API reference](https://docs.novu.co/api-reference)\n- [n8n node development](https://docs.n8n.io/connect/create-nodes/)\n- [n8n community-node verification](https://docs.n8n.io/connect/create-nodes/deploy-your-node/submit-community-nodes/)\n- [Brand provenance](docs/branding.md)\n- [Proposed release notes](docs/RELEASE_NOTES.md)\n- [Submission checklist](docs/SUBMISSION_CHECKLIST.md)\n\n## License\n\n[MIT](LICENSE.md)\n","readmeFilename":"README.md"}