- Shipped
- September 7, 2026 at 12:52 AM UTC
- Author
- Kamo
- Commit
- aa70061
Every notification so far is raised by the service that watched something happen. These two cannot be: whether a member looked at a conversation within five seconds of a message landing in it is a fact about a browser tab, and no server has it. So POST /api/notifications/self takes the CONDITION from the browser and the service still makes the decision — entitlement, mutes, quiet hours, do-not-disturb and the once-until-dismissed rule are applied exactly as they are for a calendar reminder, and a decoder is a 204 rather than an error, because "you have muted this" is an ordinary answer. Restricted to NEW_EMAIL and CHAT_MESSAGE. A member spamming their own centre is not worth defending against, but a browser that could raise any kind could raise a LEAD_CALLBACK — and a card claiming to come from the leads system when it does not is a lie the member has no way to see through. sourceType and sourceId are refused for the same reason: they drive the "already told" guard and the withdraw-by-source endpoint, so a client-chosen pair would let one tab suppress or withdraw another tab's notification. The once-until-dismissed rule is a property of the KIND, not a flag on the request. Every producer of one of these wants it, and a rule each caller has to remember is one a caller eventually forgets — the browser already raises both from two separate listeners.