Flip a notification from unread -> read. Idempotent.
Empty body: the PATCH itself signals the read. Future state transitions (mark-unread, dismiss, archive) would extend the body schema; for MVP, mark-read is the only operation.
Documentation Index
Fetch the complete documentation index at: https://docs.roughy.ai/llms.txt
Use this file to discover all available pages before exploring further.
Either your Supabase session JWT (UI flows) or an API key minted via POST /api-keys (programmatic flows). Pass it as Authorization: Bearer <token>. The server inspects the token format and routes to JWT or API-key verification automatically.
Successful Response
Single notification in the list response.
payload is opaque (raw dict) at this surface -- typed payload
schemas (like DataExportPayload) are kept for the per-flow
response models. The list endpoint serves every type uniformly so
the bell-icon UI can render a generic feed without a type-by-type
discriminator.
Concrete notification kinds.
Add-only. Per ADR 0006, values may be deprecated (no longer
produced) but never removed: notification_preferences.type
references them as Postgres enum values, and the static mandatory /
default-channel maps in app/services/notification_preferences.py
key off these names. Removing one would orphan rows + silently
change behaviour for any future type with the same name.
Adding a value: extend this enum AND ship an ALTER TYPE ... ADD VALUE migration in the same PR. Then update
app/services/notification_preferences.py to map it to a category
pipeline_completed, pipeline_failed, credits_low, credits_exhausted, subscription_activated, subscription_renewed, subscription_payment_failed, security_new_signin, data_export_ready