Production & Security
The Bridge Endpoint is a public HTTP route, so Novu Framework includes builtin protections to ensure only Novu Cloud can invoke it.HMAC Authentication
Each request from Novu Cloud to your Bridge includes aNovu-Signature header containing a timestamp and a signature. The Framework’s serve wrapper verifies the signature against NOVU_SECRET_KEY before invoking your workflow handler.
Header format
t=<unix_seconds>— when the request was signedv1=<sha256_signature>— current valid signature scheme (more may come; always begin withv)
When is HMAC enforced?
NODE_ENV | HMAC verification |
|---|---|
development | Disabled — required for the Studio to reach your local bridge |
anything else (incl. production, staging, undefined) | Enabled |
serve() handles it.
Override behavior
Never disable strictAuthentication in production. Without HMAC, anyone who can reach your bridge URL can trigger arbitrary step resolution and exfiltrate subscriber/payload data.
Network Requirements
- Public HTTPS — your bridge must be reachable from the public internet.
- No IP allowlist published — Novu Cloud workers autoscale; we don’t expose stable IPs.
- No auth middleware on
/api/novu— Novu authenticates with HMAC, not with your app’s JWT/session.
- Place a WAF in front, but allow traffic to
/api/novu(or whatever path you mounted). - Use rate limiting per HMAC header (each request includes a recent timestamp).
- Log and alert on signature failures — they may indicate a misconfigured bridge URL or a hostile actor.
Compliance
Novu Cloud workers are:- GDPR compliant
- SOC 2 Type II certified
- ISO 27001 certified
Environment Variables
The Framework reads these env vars by default (you can override with theClient class):
| Variable | Default | Purpose |
|---|---|---|
NOVU_SECRET_KEY | — | HMAC signing key; verifies request authenticity |
NOVU_API_URL | https://api.novu.co | Cloud API URL — set to https://eu.api.novu.co for EU |
NODE_ENV | — | If development, HMAC is disabled |
EU Region Setup
Best Practices
- Keep
NOVU_SECRET_KEYserver-only — never commit it, never expose to the client. Use your platform’s secrets manager (Vercel Env Vars, AWS Secrets Manager, GitHub Encrypted Secrets). - Rotate the secret key periodically — go to
dashboard.novu.co/api-keys, create a new key, deploy it, then revoke the old one. - Use separate keys per environment — Dev and Prod must have different
NOVU_SECRET_KEYvalues. - Audit logs — log every Bridge request server-side with subscriber id and workflow id so you can trace any anomaly.
- Set request timeout — keep your
step.customoperations under 30s. Longer operations should be enqueued (BullMQ, SQS) and resolved in a separate workflow. - Don’t return secrets in step output — anything in
subject/body/datais delivered to the user. - Use HMAC for the Inbox too — see
inbox-integrationHMAC section.
HMAC for the Inbox vs HMAC for the Bridge
These are separate but related:| Bridge HMAC | Inbox HMAC | |
|---|---|---|
| Direction | Cloud → Bridge | Inbox SDK → Cloud |
| Purpose | Authenticate Novu’s call to your server | Authenticate the subscriber’s session |
| Header / Param | Novu-Signature (auto by serve) | subscriberHash prop on <Inbox> |
| Computed how | Cloud signs with NOVU_SECRET_KEY | You compute HMAC-SHA256(secretKey, subscriberId) server-side |
NOVU_SECRET_KEY. See inbox-integration references for the Inbox HMAC details.