---
title: "S27 bindings"
description: "Data-binding map of Profile · Settings: every field to its source, and what each required state shows."
source: "design/hifi/S27/bindings.md"
---

> Part of [Brand and design](/design/llms.txt). Every page: [llms.txt](/llms.txt).

# Data-binding map: S27 Profile · Settings

> Generated by `botgumi-design index` from `../../screens.json`. Edit that file, not this page.

Every field [S27](/design/hifi/s27/index.md) shows and where it comes from.

| Field | Source (endpoint or local state) | Format | Fallback |
|---|---|---|---|
| app language | `api GET /me settings.ui_locale` · `me.settings.ui_locale` (null = follow device); options `config.supported_ui_locales` | "Follow system · English" | follow device |
| app language | `api GET /config supported_ui_locales` |  |  |
| practice languages | `api GET /me settings.practice_languages` · `me.settings.practice_languages` (first = primary); options `config.supported_practice_languages` | toggles; last one can't be turned off | — |
| practice languages | `api GET /config supported_practice_languages` |  |  |
| reminders | `api GET /me settings.reminders_enabled` · `me.settings.reminders_enabled / reminder_time / streak_risk_alert` + `UNUserNotificationCenter` status | toggles | system-off → `settings.notifications_off` |
| reminders | `api GET /me settings.reminder_time` |  |  |
| reminders | `api GET /me settings.streak_risk_alert` |  |  |
| reminders | `device notification_permission` |  |  |
| retention | `api GET /me settings.audio_retention_days` · `me.settings.audio_retention_days` | 7 / 30 / 365 segmented | 30 |
| delete data | `call DELETE /me/training-data` · `DELETE /v1/me/training-data` → `{job_id, purge_backups_by}`; count from `me.stats.completed_sessions` | alert | — |
| delete data | `api GET /me stats.completed_sessions` |  |  |
| delete account | `call DELETE /me` · `DELETE /v1/me` → then `POST /v1/auth/anonymous` (fresh) | alert | — |
| delete account | `call POST /auth/anonymous` |  |  |
| version | `api GET /config rubric_version` · Bundle version/build + `config.rubric_version` | caption | — |
| `AppStore.showManageSubscriptions` | `store manage_subscriptions` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `Bundle version + config.rubric_version` | `device app_version` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `Bundle version + config.rubric_version` | `api GET /config rubric_version` |  |  |
| `DELETE /v1/me → 204 → POST /v1/auth/anonymous (fresh)` | `call DELETE /me` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `DELETE /v1/me/training-data → {job_id, purge_backups_by}` | `call DELETE /me/training-data` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `PATCH /v1/me {settings.ui_locale: en}` | `call PATCH /me` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `PATCH /v1/me {settings.ui_locale: zh-Hans}` | `call PATCH /me` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `me.settings.audio_retention_days → PATCH /v1/me` | `api GET /me settings.audio_retention_days` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `me.settings.audio_retention_days → PATCH /v1/me` | `call PATCH /me` |  |  |
| `me.settings.practice_languages[] ∋ en (GET /v1/config → supported_practice_languages)` | `api GET /me settings.practice_languages[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `me.settings.practice_languages[] ∋ zh-Hans (GET /v1/config → supported_practice_languages)` | `api GET /me settings.practice_languages[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `me.settings.reminder_time` | `api GET /me settings.reminder_time` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `me.settings.streak_risk_alert` | `api GET /me settings.streak_risk_alert` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `me.settings.ui_locale (null = follow device) → Accept-Language` | `api GET /me settings.ui_locale` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `me.settings.ui_locale = null` | `api GET /me settings.ui_locale` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |

## Binds on the boards

The `data-bind` values across every state.

- `AppStore.showManageSubscriptions`
- `Bundle version + config.rubric_version`
- `DELETE /v1/me`
- `DELETE /v1/me → 204 → POST /v1/auth/anonymous (fresh)`
- `DELETE /v1/me/training-data`
- `DELETE /v1/me/training-data → {job_id, purge_backups_by}`
- `PATCH /v1/me {settings.ui_locale: en}`
- `PATCH /v1/me {settings.ui_locale: zh-Hans}`
- `me.settings.audio_retention_days → PATCH /v1/me`
- `me.settings.practice_languages`
- `me.settings.practice_languages[] ∋ en (GET /v1/config → supported_practice_languages)`
- `me.settings.practice_languages[] ∋ zh-Hans (GET /v1/config → supported_practice_languages)`
- `me.settings.reminder_time`
- `me.settings.reminders_enabled`
- `me.settings.streak_risk_alert`
- `me.settings.ui_locale (null = follow device) → Accept-Language`
- `me.settings.ui_locale = null`
- `me.stats.completed_sessions`

## States

- Loading: From [states.md](/design/states/index.md) (Settings): toggles disabled until `/me`
- Empty: From [states.md](/design/states/index.md) (Settings): —
- Error (retryable / not): From [states.md](/design/states/index.md) (Settings): PATCH failed → revert toggle + toast · fatal: —
- Offline: From [states.md](/design/states/index.md) (Settings): changes queued; retention / delete disabled offline
