---
title: "Settings Email Prefs Get"
method: GET
path: "/api/settings/email-prefs"
tags: ["settings", "sync", "ai"]
---

# Settings Email Prefs Get

`GET /api/settings/email-prefs`

## 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/settings/email-prefs`
- Auth: none declared

Read the user's weekly-digest opt-in state.

Returns all three fields (subscribed, subscribed_at,
unsubscribed_at) as Optional. None on subscribed means the user
has never seen the opt-in (FE renders the first-time pitch).

## Response `200`

Successful Response

- EmailPrefsResponse: Response from GET/POST /api/settings/email-prefs. Wave 6 / PR11.1 (audit triage 2026-05-07): foundational opt-in for the weekly digest email feature. Three-valued model: `weekly_digest_subscribed = None` means the user has never seen the opt-in (FE shows first-time pitch); False means explicitly declined; True means actively subscribed. The two timestamps preserve the GDPR Art. 7 audit trail (when did the user consent / withdraw consent). FE doesn't render them unless an admin/support tool needs to display the history.
  - `weekly_digest_subscribed` boolean, nullable: True if user is on the weekly digest list; False if explicitly unsubscribed; None if user has never been shown the opt-in (FE renders the first-time pitch).
  - `weekly_digest_subscribed_at` string, nullable: ISO-8601 timestamp of the last subscribe action. Set even after a later unsubscribe — the audit trail preserves toggle history.
  - `weekly_digest_unsubscribed_at` string, nullable: ISO-8601 timestamp of the last unsubscribe action. Null if the user has never unsubscribed.
  - `daily_practice_subscribed` boolean, nullable: True if user opted in to the local-noon daily-practice email; False if explicitly unsubscribed; None if the user has never been shown this opt-in. Default is always None for new users (OWNER Q4 ratification: opt-in, not default-on).
  - `daily_practice_subscribed_at` string, nullable: ISO-8601 timestamp of the last daily-practice subscribe action. Audit trail anchor.
  - `daily_practice_unsubscribed_at` string, nullable: ISO-8601 timestamp of the last daily-practice unsubscribe action.
  - `email_timezone` string, nullable: IANA tz name (e.g. 'America/New_York') stored when the user opted in to the daily-practice email. Drives the cron's user-local-noon send target. Null = server fallback 'America/New_York'.
  - `learn_drip_subscribed` boolean, nullable: True if user opted in to the weekly LEARN email-drip; False if explicitly unsubscribed; None if the user has never been shown this opt-in (FE renders the first-time pitch).
  - `learn_drip_subscribed_at` string, nullable: ISO-8601 timestamp of the last LEARN-drip subscribe action. GDPR Art. 7 audit-trail anchor.
  - `learn_drip_unsubscribed_at` string, nullable: ISO-8601 timestamp of the last LEARN-drip unsubscribe action. Paired audit anchor.
  - `learn_drip_track` string, nullable: Chosen track slug (FK-by-convention to static/data/learning-paths.json `tracks[].slug`). Null means use the default track resolved at cron time (currently 'investment-analyst-foundations').
  - `learn_drip_cursor` integer, nullable: 0-indexed position in the track's `module_ids[]` array — the next module the cron will send. Reset to 0 on re-subscribe. When cursor >= len(track.module_ids) the cron sends a completion email and pauses.
  - `learn_drip_last_sent_date` string, nullable: ISO-8601 date (user-local) of the last successful LEARN-drip send. Cadence-period idempotency anchor — the cron skips users who already received a drip in the current period.

---

[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)
