WendyOS Docs
AdvancedCloud

Notifications API

The NotificationService gRPC service creates, lists, and manages operator-facing Wendy Notifications in a Wendy Cloud organization.

Notifications API

The NotificationService gRPC service creates, lists, and manages operator-facing Wendy Notifications in a Wendy Cloud organization.

Proto package

wendycloud.v1 — defined in Proto/cloud/notifications.proto.

App-facing API (wendy.system.v1)

Apps with the notifications entitlement call wendy.system.v1.NotificationService over the Unix socket at $WENDY_SYSTEM_SOCKET (/run/wendy/system/system.sock). WendyKit exposes this as WendyNotification.send(_:), so apps normally do not call gRPC directly.

The private socket binds every call to trusted app identity. The request cannot supply an app ID, device ID, or organization ID; the agent adds app identity and Cloud derives device and organization identity from device mTLS.

Send

Send(SendRequest) → SendResponse

The agent forwards the request to Cloud with a 15-second deadline and makes one Cloud creation attempt per call. notification_id is the caller-chosen resource identity, not a retry token. After successful creation, every reuse of its canonical UUID—including an otherwise identical request or a differently cased spelling—returns ALREADY_EXISTS; the prior success is never replayed.

Local validation and rate-limit failures happen before forwarding and do not claim the UUID. After correcting the request or waiting for the local rate limit, the caller may retry with the same notification_id.

SendRequest

FieldTypeDescription
audienceNotificationAudienceUnion of the user, organization team, and organization role selectors below.
titlestringNotification title.
bodystringNotification body.
severityNotificationSeverityINFO, WARNING, ERROR, or CRITICAL.
deep_linkstringAbsolute wendy:// URI.
notification_idstringCaller-chosen Notification resource UUID v4. Cloud returns canonical lowercase; any canonical reuse after creation returns ALREADY_EXISTS.
metadataoptional StructStructured JSON-compatible metadata.

NotificationAudience

The app-facing and Cloud messages use the same plural selector shape. All three fields have union semantics. At most 100 selector entries may be supplied across the three lists. Cloud normalizes and deduplicates them, remains authoritative for recipient resolution, and resolves at most 10,000 recipients.

FieldTypeDescription
user_idsrepeated stringUser IDs to include.
team_idsrepeated int32Organization team IDs to include.
rolesrepeated OrganizationRoleOrganization roles to include.

At least one selector is required. A user selected through more than one field receives one Notification.

SendResponse

FieldTypeDescription
notification_idstringCanonical lowercase UUID of the newly created Notification resource.

Recipient totals are intentionally omitted because team and role counts can disclose organization membership.

Notification message

Fields 1–8 are the stable legacy Companion wire contract. V2 adds canonical identity, content, audience, and created_by attribution without changing those legacy fields.

FieldTypeDescription
idint32Legacy numeric ID.
user_idstringRecipient user ID in legacy and per-user read views.
organization_idint32Organization ID.
bodystringNotification body.
severityNotificationSeveritySeverity level.
related_entitiesStructLegacy structured context.
created_atTimestampCreation time.
deleted_atoptional TimestampSoft-deletion time.
titlestringNotification title.
deep_linkstringAbsolute wendy:// URI.
notification_idoptional stringCanonical caller-chosen resource UUID v4; absent on legacy records.
metadataStructStructured JSON-compatible metadata.
audienceoptional NotificationAudienceOriginal normalized selector union.
created_by_user_idoptional stringAuthenticated user that created the Notification.
created_by_asset_idoptional int32Authenticated device asset that created the Notification.
created_by_app_idoptional stringTrusted app identity stamped by the Wendy agent.

Cloud API methods

CreateNotification (legacy)

CreateNotification(CreateNotificationRequest) → Notification

Creates a Notification for one user. This RPC and CreateNotificationRequest are deprecated in their protobuf descriptors and remain intact in wendycloud.v1 only for existing Dashboard and legacy clients. The migration marker removes them from a future side-by-side wendycloud.v2, not from v1.


CreateNotificationV2

CreateNotificationV2(CreateNotificationV2Request) → CreateNotificationV2Response

Claims the caller-chosen canonical UUID and creates one Notification resource for the resolved recipient union. The first canonical UUID use may succeed; every later use returns ALREADY_EXISTS, regardless of whether request content is identical or changed. Cloud does not replay the original response or send pushes a second time.

User-authenticated callers provide organization_id. Provisioned-device callers omit it because Cloud derives the organization and device from their certificate; the Wendy agent stamps app_id from trusted container state.

CreateNotificationV2Request

FieldTypeDescription
organization_idoptional int32Required for user-authenticated callers; omitted by provisioned devices.
audienceNotificationAudienceUnion of repeated user_ids, team_ids, and roles; see above.
titlestringNotification title.
bodystringNotification body.
severityNotificationSeverityINFO, WARNING, ERROR, or CRITICAL.
deep_linkstringAbsolute wendy:// URI.
notification_idstringCaller-chosen Notification resource UUID v4; Cloud stores and returns canonical lowercase form and rejects every canonical reuse with ALREADY_EXISTS.
metadataoptional StructStructured JSON-compatible metadata.
app_idoptional stringRequired for provisioned-device calls and stamped from trusted app identity by the Wendy agent.

CreateNotificationV2Response

FieldTypeDescription
notification_idstringCanonical lowercase UUID of the newly created Notification resource.

Recipient totals are intentionally omitted because team and role counts can disclose organization membership.


ListNotifications (server-streaming)

ListNotifications(ListNotificationsRequest) → stream ListNotificationsResponse

Returns one Notification per streamed message.

ListNotificationsRequest

FieldTypeDescription
organization_idint32Organization to query.
user_idstringUser whose Notifications are requested.
offsetoptional int32Number of matching Notifications to skip.
limitoptional int32Maximum number of Notifications to return.
severity_filteroptional NotificationSeverityRestrict results by severity.
include_deletedboolInclude soft-deleted Notifications.

ListNotificationsResponse

FieldTypeDescription
notificationNotificationNotification carried by this stream message.
totalint32Total number of matching Notifications.

Migration note: ListNotifications previously returned one unary response containing repeated notifications, next_page_token, and total_count. Clients must now receive the server stream until it closes and use offset/limit instead of page_size/page_token.


GetNotification

GetNotification(GetNotificationRequest) → Notification

Returns one Notification by ID.

DeleteNotification

DeleteNotification(DeleteNotificationRequest) → DeleteNotificationResponse

Deletes one Notification by ID.

MarkAsRead

MarkAsRead(MarkAsReadRequest) → MarkAsReadResponse

Marks the requested Notification IDs as read and returns the number marked.

On this page