← All documentationContents ↓

API Reference: Notifications

Read and manage the signed-in user's notification feed: list and filter notifications, poll unread counts, mark items read, manage per-device notification preferences, and register mobile push tokens.

Overview

Notifications are per-user alerts inside Simply360 — the feed that powers the in-app notification center. Each notification belongs to one user in one team and records what happened (a new conversation, a new message, an assignment, a mention, a system event, or a workflow-generated alert), when it happened, and whether the user has read it.

The Notifications API lets a client render that feed: list and filter the current user's notifications, poll the unread count, mark items read (individually or all at once), delete items, manage per-device notification preferences, and register or deregister mobile push tokens (APNs / FCM).

Authentication and Tier

All ten notification operations are standard tier, but they are user-scoped: they act on the notification feed of the authenticated user, so they require first-party user credentials — a Cognito user session (webapp or mobile sign-in) or a first-party OAuth user access token — with a selected team context.

Team API keys (s360_live_...) and session tokens (s360_sess_...) are not accepted on this surface; they return 403 COGNITO_REQUIRED because an API key does not represent a specific user with a notification feed. The examples below use $S360_ACCESS_TOKEN as a placeholder for a first-party user access token. See Authentication for the full credential model.

  • 403 COGNITO_REQUIRED — the caller is not a first-party user (for example, an API key).
  • 400 VALIDATION_ERROR — no team context is selected.
  • 403 PERMISSION_DENIED — the user is not an active member of the selected team.

Endpoints

MethodPathTierPurpose
GET/v1/notificationsstandardList the current user's notifications for the selected team.
GET/v1/notifications/unread-countstandardGet the current user's unread notification count.
GET/v1/notifications/{notificationSimplyId}standardGet a single notification.
PUT/v1/notifications/{notificationSimplyId}/readstandardMark one notification read.
PUT/v1/notifications/read-allstandardMark all of the user's team notifications read.
DELETE/v1/notifications/{notificationSimplyId}standardDelete a notification.
GET/v1/notifications/preferencesstandardGet per-category notification preferences for one device.
PUT/v1/notifications/preferencesstandardUpdate per-category notification preferences for one device.
POST/v1/notifications/device-tokenstandardRegister a push notification token for the current mobile device.
DELETE/v1/notifications/device-tokenstandardDeregister a push notification token.

The Notification Object

FieldTypeDescription
simplyIdstringPublic notification ID.
notificationTypestringEvent type, e.g. NEW_CONVERSATION, NEW_MESSAGE, ASSIGNMENT, MENTION, SYSTEM, TEAM_GENERATED.
titleobject | nullLocalized title (language code → string).
bodyobject | nullLocalized body text (language code → string).
iconTypestring | nullIcon hint for rendering.
actionUrlstring | nullIn-app destination to open when the notification is tapped or clicked.
referenceEntityTypestring | nullType of the related entity, when the notification points at one.
referenceEntityIdstring | nullIdentifier of the related entity.
isReadbooleanWhether the user has read the notification.
readAtstring | nullISO 8601 timestamp of when it was marked read.
createdAt / updatedAtstringISO 8601 timestamps.

List Notifications

Returns the user's notifications for the selected team, newest first.

TypeScript SDK

const result = await s360.notifications.list({ isRead: false, limit: 25 });

for (const notification of result.data.notifications) {
  console.log(`${notification.createdAt}: ${notification.notificationType}`);
}

cURL

curl -s "https://api.simply360.app/v1/notifications?isRead=false&limit=25" \
  -H "Authorization: Bearer $S360_ACCESS_TOKEN"

Query Parameters

ParameterTypeDescription
limitintegerPage size. Default 50, maximum 100.
offsetintegerSkip count for pagination. Default 0.
isReadbooleanFilter to read (true) or unread (false) notifications.
notificationTypestringFilter to a single notification type.
installationIdstringOptional mobile installation ID. When provided, notification categories the user disabled on that device are excluded from the results.

Unread Count

A lightweight endpoint designed for badge counters. Pass installationId to respect that device's category preferences.

const { data } = await s360.notifications.getUnreadCount();
console.log(`Unread: ${data.unreadCount}`);
curl -s "https://api.simply360.app/v1/notifications/unread-count" \
  -H "Authorization: Bearer $S360_ACCESS_TOKEN"
{
  "data": {
    "unreadCount": 4
  }
}

Get a Notification

const notification = await s360.notifications.get('NTFC-1234-ABCD');
console.log(notification.data.actionUrl);
curl -s "https://api.simply360.app/v1/notifications/NTFC-1234-ABCD" \
  -H "Authorization: Bearer $S360_ACCESS_TOKEN"

Mark Read

Mark a single notification read, or mark everything read at once. Read-state changes are also published to the platform's realtime channel, so other signed-in surfaces (webapp, mobile) update their badges immediately.

await s360.notifications.markAsRead('NTFC-1234-ABCD');

// Mark all of the user's team notifications read
const all = await s360.notifications.markAllAsRead();
curl -s -X PUT "https://api.simply360.app/v1/notifications/NTFC-1234-ABCD/read" \
  -H "Authorization: Bearer $S360_ACCESS_TOKEN"

curl -s -X PUT "https://api.simply360.app/v1/notifications/read-all" \
  -H "Authorization: Bearer $S360_ACCESS_TOKEN"

read-all accepts an optional JSON body with installationId; when provided, categories the user disabled on that device are left untouched. The response includes updatedCount, the number of notifications transitioned to read.

Delete a Notification

await s360.notifications.delete('NTFC-1234-ABCD');
curl -s -X DELETE "https://api.simply360.app/v1/notifications/NTFC-1234-ABCD" \
  -H "Authorization: Bearer $S360_ACCESS_TOKEN"

Notification Preferences

Preferences are stored per team user per mobile device and control six categories, all of which default to enabled:

Preference KeyCovers
newConversationNew conversation notifications.
newMessageNew message notifications.
assignmentRecord and task assignment notifications.
mention@-mention notifications.
systemSystem events, including report snapshots, approval requests, and background-task completion, failure, and partial-success notifications.
workflowTeam-generated (workflow) notifications.

Both preference endpoints identify the device with exactly one of installationId (the mobile app installation ID) or deviceSimplyId (the public mobile device ID). Providing both, or neither, returns 400 INVALID_DEVICE. The device must already be registered for the current user, otherwise the API returns 404 DEVICE_NOT_FOUND.

const prefs = await s360.notifications.getPreferences({ installationId: 'ios-install-01' });

await s360.notifications.updatePreferences({
  installationId: 'ios-install-01',
  newMessage: false,
  system: true,
});
curl -s "https://api.simply360.app/v1/notifications/preferences?installationId=ios-install-01" \
  -H "Authorization: Bearer $S360_ACCESS_TOKEN"

curl -s -X PUT "https://api.simply360.app/v1/notifications/preferences" \
  -H "Authorization: Bearer $S360_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "installationId": "ios-install-01",
    "newMessage": false,
    "system": true
  }'

Both endpoints return the full six-key preference object after applying any updates. The update body is strict: only the device identifier and the six boolean keys are accepted.

Device Tokens (Mobile Push)

Mobile clients register an APNs (iOS) or FCM (Android) push token so the platform can deliver push notifications to that installation. Registration associates the token with the current team user and mobile app installation; the installation must already be a registered mobile device for the user.

const registration = await s360.notifications.registerDeviceToken(
  'abcdef0123456789...', // APNs or FCM token
  'ios',
  'ios-install-01',
);

// Later, e.g. on sign-out:
await s360.notifications.deregisterDeviceToken('abcdef0123456789...');
curl -s -X POST "https://api.simply360.app/v1/notifications/device-token" \
  -H "Authorization: Bearer $S360_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "token": "abcdef0123456789...",
    "platform": "ios",
    "installationId": "ios-install-01"
  }'
  • Registering a brand-new token returns 201 with { "deviceTokenSimplyId": "...", "created": true }.
  • Re-registering an existing token refreshes it and returns 200 with { "deviceTokenSimplyId": "...", "refreshed": true }. Registration is idempotent by token, so it is safe to call on every app launch.
  • DELETE /v1/notifications/device-token takes { "token": "..." } and deactivates the token, returning { "deactivated": true }; an unknown token returns 404 TOKEN_NOT_FOUND.

Integration Patterns

  • Badge polling — Poll GET /v1/notifications/unread-count on an interval (or on app foreground) to drive an unread badge; it is much cheaper than listing.
  • Inbox rendering — List with isRead=false for the unread tab and no filter for the full history; page with limit/offset.
  • Read on open — Call the per-notification read endpoint when the user opens an item, and follow its actionUrl to deep-link into the app.
  • Device hygiene — Register the push token on every launch (idempotent) and deregister it on sign-out so a shared device stops receiving the previous user's pushes.

Usage Notes

  • Notifications are created by the platform (conversation activity, assignments, mentions, system and workflow events); this API is read-and-manage only — there is no endpoint to create notifications directly.
  • All reads and writes are scoped to the authenticated user in the selected team. Users can never see or modify another user's notifications.
  • When notificationType is combined with an installationId whose preferences disable that category, the list returns an empty result rather than an error.
  • Deleting is a soft delete from the user's feed; deleted notifications no longer appear in lists or counts.
  • For conversation-centric integrations, see API Reference: Conversations and API Reference: Messages. For server-to-server event delivery, use Webhooks instead of polling notifications.