---
title: "Mark a triggered alert event as read (clears bell-badge row)"
method: POST
path: "/api/alerts/{alert_id}/read"
tags: ["Alerts"]
---

# Mark a triggered alert event as read (clears bell-badge row)

`POST /api/alerts/{alert_id}/read`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/alerts/{alert_id}/read`
- Auth: none declared

Mark a single triggered alert as read. The frontend POSTs
this when the user clicks a row in the bell-badge dropdown so
the badge count decrements + the row drops out of the next
`/api/alerts/unread` response.

Owner-scoped: a user cannot mark another user's alert as read
(the helper's WHERE matches both id + user_id).

Response shape:
  { "ok": True, "id": <alert_id> }   on success
  { "ok": False, "id": <alert_id> }  when no row matched

## Path parameters

- `alert_id` integer, required: The alert id to mark read.

## Response `200`

Successful Response

- AlertReadResponse: `POST /api/alerts/{id}/read` response. Frontend reads `data.ok` to dispatch success/error + `data.id` to find the right row to remove from the in-memory unread list.
  - `ok` boolean, required: True on successful mark-read; false on not-found.
  - `id` integer, required: Echo of the path parameter for client-side row matching.

## Other responses

- `401`: Unauthorized
- `404`: Not Found
- `422`: Validation Error
- `500`: Internal Server Error

---

[API](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api.md) · [All operations](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/revisions/e832a1260f0b?raw)
