List notifications

.md

The notification centre, in the same shape the web client reads.

Scopesnotifications:read
GET/v1/me/notifications

Newest first. Archived ones are left out: archiving is how somebody says they are done with a notice, and a list that keeps handing it back has not listened.

Request

curl "https://api.proppertrading.com/v1/me/notifications?limit=20" \
  -H "Authorization: Bearer ptat_9f2c1a44_3b8e7d2f5c9a1b4e6d8f0a2c4e6b8d1f"
ParameterDescription
unread1 to leave out the ones already read
limitUp to 100. Defaults to 20

Response

{
    "data": [
        {
            "id": "9f2c1a44-3b8e-4d2f-5c9a-1b4e6d8f0a2c",
            "object": "notification",
            "type": "new_device_signed_in",
            "title_key": "notifications/new-device-signed-in.title",
            "message_key": "notifications/new-device-signed-in.message",
            "params": { "device": "Jamie iPhone", "app": "Propper Mail" },
            "action_url": "/settings/security",
            "action_label_key": "notifications/new-device-signed-in.action_label",
            "read_at": null,
            "created_at": "2026-08-19T18:03:33+00:00"
        }
    ],
    "meta": { "request_id": "req_01kz4bkr1aj1gv63d8fv3133ey", "unread": 1 }
}

Keys, not sentences

title_key and message_key are translation keys and params fills them in. Nothing here is a finished sentence, on purpose: the reader picks the language, and a notice written six months ago still comes out in today's wording rather than in whatever was true when it was raised.

Look the keys up in your own copy of the translations. type is there so a client can branch on the kind of notice without parsing a key.

action_url is a path inside the web application. An app should map the ones it knows onto its own screens and fall back to opening the web version.

Errors

StatusCodeMeaning
400invalid_limitNot a positive integer
403insufficient_scopeThis device does not hold notifications:read