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

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

# Data-binding map: S18 Read · Read

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

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

| Field | Source (endpoint or local state) | Format | Fallback |
|---|---|---|---|
| kind tag | `api GET /sessions/{session_id} kind` · `session.kind` | `read.tag.<kind>` | — |
| topic tag | `api GET /sessions/{session_id} article.topic.name` · `session.article.topic.name` (Accept-Language) | — | hide |
| language tag | `api GET /sessions/{session_id} language` · `session.language` | `lang.short.<tag>` (title = endonym) | — |
| read time | `api GET /sessions/{session_id} article.est_read_seconds` · `session.article.est_read_seconds` | `common.read_*` | hide |
| length | `api GET /sessions/{session_id} article.length.label` · `session.article.length.label` | as is | hide |
| title / byline / paragraphs / hint | `api GET /sessions/{session_id} article` · `session.article.*` (article language) | `t-reading`, `lang=` | load error → `read.load_error`, never another article |
| source line | `api GET /sessions/{session_id} article.source.name` · `session.article.source.name`, `version` | `read.source` | hide |
| source line | `api GET /sessions/{session_id} article.version` |  |  |
| CTA | `call POST /sessions/{id}/reading-complete` · `POST /v1/sessions/{id}/reading-complete {read_duration_ms = now − local:reader.openedAt}` | — | offline: queued, proceed |
| `session.article.byline` | `api GET /sessions/{session_id} article.byline` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.paragraphs[0]` | `api GET /sessions/{session_id} article.paragraphs[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.paragraphs[1]` | `api GET /sessions/{session_id} article.paragraphs[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.paragraphs[2]` | `api GET /sessions/{session_id} article.paragraphs[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.paragraphs[3]` | `api GET /sessions/{session_id} article.paragraphs[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.paragraphs[4]` | `api GET /sessions/{session_id} article.paragraphs[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.paragraphs[5]` | `api GET /sessions/{session_id} article.paragraphs[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.paragraphs[6]` | `api GET /sessions/{session_id} article.paragraphs[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.paragraphs[7]` | `api GET /sessions/{session_id} article.paragraphs[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.paragraphs[8]` | `api GET /sessions/{session_id} article.paragraphs[]` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.reading_hint` | `api GET /sessions/{session_id} article.reading_hint` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.source.name + version` | `api GET /sessions/{session_id} article.source.name` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.article.source.name + version` | `api GET /sessions/{session_id} article.version` |  |  |
| `session.article.title` | `api GET /sessions/{session_id} article.title` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |
| `session.stage → derived step` | `api GET /sessions/{session_id} stage` · From the board's `data-bind`; no row in data-binding.md yet. |  |  |

## Binds on the boards

The `data-bind` values across every state.

- `session.article.byline`
- `session.article.est_read_seconds`
- `session.article.length.label`
- `session.article.paragraphs[0]`
- `session.article.paragraphs[1]`
- `session.article.paragraphs[2]`
- `session.article.paragraphs[3]`
- `session.article.paragraphs[4]`
- `session.article.paragraphs[5]`
- `session.article.paragraphs[6]`
- `session.article.paragraphs[7]`
- `session.article.paragraphs[8]`
- `session.article.reading_hint`
- `session.article.source.name + version`
- `session.article.title`
- `session.article.topic.name`
- `session.kind`
- `session.language`
- `session.stage → derived step`

## States

- Loading: From [states.md](/design/states/index.md) (Read): article skeleton
- Empty: From [states.md](/design/states/index.md) (Read): n/a
- Error (retryable / not): From [states.md](/design/states/index.md) (Read): `read.load_error` + Retry, never another article · fatal: 404 → generic error, session abandoned
- Offline: From [states.md](/design/states/index.md) (Read): cached article (daily quest is prefetched)
