Administration
Subscriber records, workflow definitions, provider credentials, and delivery status —
the operator-facing surface. Everything here is under /api/v1/notifications/manage/
and needs a secret key (sk_*) or an admin JWT.
Subscriber Management
A subscriber is the notification system's record of a person: their contact
details, their channel registrations, and their preferences. It is created for you the
first time a user registers a push device, so most integrations never call
create-subscriber directly.
Create a Subscriber
Use this to seed a subscriber ahead of their first login — for an email-only recipient, or when importing existing users.
POST /api/v1/notifications/manage/create-subscriber
{
"subscriberId": "user-1",
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@example.com",
"phone": "+1234567890",
"locale": "en-US"
}
Response:
{
"subscriberId": "user-1",
"novuSubscriberId": "6512f0a1c3d4e5f60718293a"
}
subscriberId is your own user ID — the same value you pass as userId when sending.
novuSubscriberId is the provider's internal ID; you rarely need it.
Read the Caller's Subscriber
get-subscriber and delete-subscriber act on the authenticated caller and take an
empty request body. There is no way to address another user's record through them.
POST /api/v1/notifications/manage/get-subscriber
{}
Response:
{
"subscriberId": "user-1",
"data": {
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@example.com",
"locale": "en-US",
"timezone": "Europe/London"
},
"channels": [
{"channel": "CHANNEL_PUSH", "registered": true, "credentialCount": 2},
{"channel": "CHANNEL_IN_APP", "registered": true, "credentialCount": 1}
],
"globalPreferences": {
"enabled": true,
"channels": {"inApp": true, "push": true, "email": false}
},
"workflowPreferences": [
{
"workflowId": "weekly-summary",
"workflowName": "Weekly Summary",
"critical": false,
"channels": {"inApp": true, "push": false}
}
],
"createdAt": "2026-01-14T09:12:00Z",
"updatedAt": "2026-08-02T17:40:11Z"
}
This is the one call that returns profile, channel registrations and preferences together — useful for rendering a whole settings screen without three round trips.
Update Profile Data
POST /api/v1/notifications/manage/update-subscriber-data
{
"data": {
"email": "jane.updated@example.com",
"locale": "en-GB",
"customData": {"plan": "pro"}
}
}
Response:
{
"data": {
"firstName": "Jane",
"lastName": "Doe",
"email": "jane.updated@example.com",
"locale": "en-GB",
"customData": {"plan": "pro"}
},
"updatedAt": "2026-08-14T11:02:44Z"
}
customData is free-form JSON available to workflow templates, so it is the place to
put anything you want to render into a message.
Delete the Caller's Subscriber
Permanently removes the caller's subscriber profile and everything attached to it — device tokens, preferences, inbox history. It does not delete the user elsewhere on the platform.
POST /api/v1/notifications/manage/delete-subscriber
{}
Response:
{
"acknowledged": true,
"status": "done"
}
Deleting a subscriber that does not exist is an idempotent success, not a 404: you
get acknowledged: true with status: "not_found". status is otherwise Novu's own
acknowledgement string, defaulting to "done" — branch on acknowledged, not on the
text.
List Subscribers
POST /api/v1/notifications/manage/list-subscribers
{
"page": 1,
"pageSize": 50
}
Response:
{
"subscribers": [
{
"subscriberId": "user-1",
"email": "jane@example.com",
"firstName": "Jane",
"lastName": "Doe",
"isOnline": false,
"lastOnlineAt": "2026-08-13T21:05:00Z"
}
],
"totalCount": 1,
"hasMore": false
}
Workflows
Workflows are managed as opaque Novu JSON objects — the API passes definitions through
without interpreting them, so the shape of workflow is Novu's, not ours.
Create a Workflow
POST /api/v1/notifications/manage/create-workflow
{
"workflow": {
"name": "Welcome Notification",
"description": "Sent when a user completes onboarding",
"__source": "editor",
"steps": [
{
"name": "In-App Step",
"type": "in_app",
"controlValues": {
"body": "Welcome to your health coaching journey!"
}
}
]
}
}
Response: {"workflow": {...}} — the created definition as Novu stored it,
including the workflowId you will trigger with.
Update a Workflow
POST /api/v1/notifications/manage/update-workflow
{
"workflowId": "welcome-notification",
"workflow": {
"name": "Welcome Notification",
"steps": [
{
"name": "In-App Step",
"type": "in_app",
"controlValues": {"body": "Welcome aboard!"}
}
]
}
}
The workflow object replaces the stored definition — send the whole thing, not a
patch.
Get, List and Delete Workflows
get-workflow and delete-workflow accept either workflowId or
triggerIdentifier:
POST /api/v1/notifications/manage/get-workflow
{
"triggerIdentifier": "welcome-notification"
}
Response: {"workflow": {...}}.
POST /api/v1/notifications/manage/list-workflows
{
"page": 1,
"pageSize": 50
}
Response:
{
"workflows": [{"...": "opaque Novu workflow JSON"}],
"totalCount": 12,
"hasMore": false
}
This is the call to make before any send — it is how you discover valid workflowId
values.
POST /api/v1/notifications/manage/delete-workflow
{
"workflowId": "welcome-notification"
}
Response:
{
"workflowId": "welcome-notification"
}
Deleting a workflow does not cancel notifications already in flight — cancel those by
transaction ID with manage/cancel.
Provider Configuration
Configure external delivery providers (FCM, APNS, SendGrid, etc.).
POST /api/v1/notifications/manage/configure-provider
{
"provider": "PROVIDER_TYPE_FCM",
"credentials": {
"serviceAccount": "{...}"
},
"active": true
}
Response:
{
"integrationId": "6512f0a1c3d4e5f60718293b",
"active": true
}
configure-provider uses upsert semantics: if an active integration already exists for the specified provider type, it updates the existing integration in place (preserving its ID and subscriber linkages). If no active integration exists, a new one is created.
This prevents duplicate integrations and ensures existing device registrations continue to work after credential updates. If multiple active integrations exist for the same provider type, the call returns 409 Conflict — resolve the duplicates manually via the Novu dashboard.
POST /api/v1/notifications/manage/get-providers
{}
Response:
{
"providers": [
{
"provider": "PROVIDER_TYPE_FCM",
"integrationId": "6512f0a1c3d4e5f60718293b",
"active": true
}
]
}
Delivery Status
One Notification
Returns the raw Novu activity record for a single transaction — per-channel attempts, provider responses, and timestamps. This is the first place to look when someone says a notification never arrived.
POST /api/v1/notifications/manage/get-delivery-status
{
"transactionId": "txn_abc123"
}
Response: {"activity": {...}} with raw Novu data.
Activity Log
Query delivery history with channel and time filtering.
POST /api/v1/notifications/manage/get-notification-activity
{
"page": 1,
"pageSize": 50,
"channels": ["in_app", "push"],
"from": "2026-03-01T00:00:00Z",
"to": "2026-03-23T23:59:59Z"
}
Response:
{
"entries": [{"...": "raw Novu activity entry"}],
"hasMore": true
}
channels filters on provider channel names (in_app, push, email, sms, chat)
— lowercase, not the CHANNEL_* enum used elsewhere. pageSize caps at 100.