uloggdDevelopers
Developer portaluloggd
Get startedResourcesArcade
Developer portaluloggdIdentityCatalogProfileLibraryReviewsJournalListsAwardsScreenshotsSocialAccountNotificationsCommentsLikesHistoryPeopleMineralsArcade

Notifications

The inbox, already resolved.

Each notification arrives with its actor and with path, where it points. Working that out used to be the reader's job: eleven chained reads, because a reply's address is the address of what it answers plus an anchor. It is a join, and it happens where the joins are.

The system's own notices, moderation's and Arcade's, arrive with actor null: they never say which member of staff acted.

path comes without the language prefix (that belongs to the reader), and comes back null when there is nowhere left to go.

GET/api/v1/notifications

The inbox, newest first, with the preferences alongside. Each item carries path: where it points, without the language prefix, which belongs to the reader rather than to the notification. It comes back null when there is nowhere left to go (the post is gone, or the reader may no longer see it) and the words then stand without a link, rather than pointing at a page that would refuse them. actor is null on the system's own notices, moderation's and Arcade's: they never say which member of staff acted.

Scope profile.read · Counted against the read allowance

Query

FieldTypeNotes
limitintegerHow many to bring, 1 to 100. The default is 40.

Example response

{
  "data": [
    {
      "id": "...",
      "kind": "post_comment",
      "created_at": "2026-09-05T18:00:00.000Z",
      "read_at": null,
      "target_title": "Hollow Knight",
      "actor": { "username": "ada", "display_name": "Ada", "avatar_url": null },
      "path": "review/aB3xY#comment-9kQ2",
      "is_reply": true
    }
  ],
  "preferences": { "follows_enabled": true, "comments_enabled": true }
}
PATCH/api/v1/notifications

Marks everything unread as read.

Scope profile.write · Counted against the write allowance

PATCH/api/v1/notifications/{id}

Marks one as read. Doing it twice does not move the time: the second call answers with what the first one wrote.

Scope profile.write · Counted against the write allowance

PATCH/api/v1/notifications/preferences

Turns on and off what is worth being told about. Send only what changes.

Scope profile.write · Counted against the write allowance

Body

FieldTypeNotes
follows_enabledbooleanTrue to be told, false not to be.
review_likes_enabledbooleanTrue to be told, false not to be.
list_likes_enabledbooleanTrue to be told, false not to be.
comments_enabledbooleanTrue to be told, false not to be.
screenshots_enabledbooleanTrue to be told, false not to be.
journal_likes_enabledbooleanTrue to be told, false not to be.
GET/api/v1/notifications/devices

The browsers registered to be pushed to, newest first.

Scope profile.read · Counted against the read allowance

POST/api/v1/notifications/devices

Registers a browser. Re-subscribing in the same browser returns the same endpoint, so repeating updates the registration rather than making a second one; an endpoint that already belongs to another account answers 409.

Scope profile.write · Counted against the write allowance

Body

FieldTypeNotes
endpointrequiredstringThe address the push service gave this browser.
p256dhrequiredstringThe subscription's public key.
authrequiredstringThe subscription's authentication secret.
device_labelstringA short name, only so the device can be recognised in the list.
DELETE/api/v1/notifications/devices/{id}

Forgets a device. Its browser stays subscribed with the push service until it unsubscribes, which only it can do.

Scope profile.write · Counted against the write allowance

Account

The account itself, and only with a session.

Comments

The replies under a post and under a profile.