Read one notification
Reads one row scoped to the caller and, when supplied, the customer. title and content are resolved into the request's language before the row is returned — FROM THE KEYS ONLY. Unlike the list, this route never consults the event push template, so a templated notification reads differently here; and link_url and link_text are never populated on this route at all. See the UserNotification schema.
Authorization
BearerAuth In: header
Path Parameters
Id of the notifications.user_notifications row — the per-recipient copy, not the fan-out source row's id.
Query Parameters
Optional scope. Omitted, it stays the nil uuid and is passed through as such. A value that does not parse is refused 400 — but with common.invalid_input, not the notifications_m.invalid_id the service builds: the handler discards that AppError and calls BadRequest400 with no argument.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/notifications/497f6eca-6276-4993-bfeb-53cbbbba6f08"{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"title": "string",
"content": "string",
"user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
"customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
"event": "string",
"rec_id": "0ba687c4-349e-490d-969f-fd374e232d42",
"rec_type": "string",
"created_at": "2019-08-24T14:15:22Z",
"sent_at": "2019-08-24T14:15:22Z",
"read": true,
"read_at": "2019-08-24T14:15:22Z",
"system_sse_delivered_at": "2019-08-24T14:15:22Z",
"channels_attempted": [
"string"
],
"channels_sent": [
"string"
],
"channels_delivered": [
"string"
],
"channels_failed": [
"string"
],
"link_url": "string",
"link_text": "string",
"created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
"modified_at": "2019-08-24T14:15:22Z",
"modified_by": "e8d4374d-93a1-4e98-a6c6-fdcf00c5059f",
"active": true,
"metadata": {}
}{
"status": 400,
"message": "Invalid notification id",
"code": "notifications_m.invalid_id",
"class": "validation"
}{
"status": 401,
"message": "Unauthorized",
"code": "common.unauthorized",
"class": "business"
}{
"status": 403,
"message": "No access to the record",
"code": "common.rbac_no_rec_access",
"class": "business"
}{
"status": 404,
"message": "Notification not found",
"code": "notifications_m.not_found",
"class": "business"
}{
"status": 429,
"message": "Rate limit for 203.0.113.10 to 8f1d2c34-5b6e-4a70-9c81-2d3e4f5a6b7c exceeded.",
"code": "rate_limits_m.exceeded",
"class": "temporary",
"retryable": true
}{
"status": 500,
"message": "Database error",
"code": "common.database_error",
"class": "business"
}{
"overall_status": "unhealthy",
"message": "Service is shutting down",
"timestamp": "2026-08-27T15:04:05Z"
}