> ## Documentation Index
> Fetch the complete documentation index at: https://chatbase.co/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Conversation & Message

> Reference for Conversation, Message, Page, and related types used in conversation history.

## Conversation

`data class Conversation` — **Package:** `com.chatbase.sdk.model`

```kotlin theme={null}
data class Conversation(
    val id: String,
    val title: String?,
    val createdAt: Long,
    val updatedAt: Long,
    val userId: String?,
    val status: ConversationStatus
)
```

<ResponseField name="id" type="String" required>
  Unique conversation ID.
</ResponseField>

<ResponseField name="title" type="String?">
  Auto-generated or server-assigned title.
</ResponseField>

<ResponseField name="createdAt" type="Long" required>
  Creation timestamp (Unix epoch seconds).
</ResponseField>

<ResponseField name="updatedAt" type="Long" required>
  Timestamp of the last message (Unix epoch seconds).
</ResponseField>

<ResponseField name="userId" type="String?">
  The identified user who owns this conversation, or `null` for anonymous (device-scoped) conversations.
</ResponseField>

<ResponseField name="status" type="ConversationStatus" required>
  `ONGOING`, `ENDED`, or `TAKEN_OVER`.
</ResponseField>

### ConversationStatus

```kotlin theme={null}
enum class ConversationStatus {
    ONGOING,     // serialized as "ongoing" — active conversation
    ENDED,       // serialized as "ended" — conversation has ended
    TAKEN_OVER   // serialized as "taken_over" — conversation taken over by a human agent
}
```

## Message

`data class Message` — **Package:** `com.chatbase.sdk.model`

```kotlin theme={null}
data class Message(
    val id: String,
    val role: Role,
    val parts: List<Part>,
    val createdAt: Long?,
    val feedback: Feedback?,
    val metadata: MessageMetadata?
)
```

<ResponseField name="id" type="String" required>
  Unique message ID.
</ResponseField>

<ResponseField name="role" type="Role" required>
  `USER` or `ASSISTANT`.
</ResponseField>

<ResponseField name="parts" type="List<Part>" required>
  Message content parts — `Text`, `ToolCall`, or `ToolResult`. See [ChatResponse](/docs/android-sdk/chat-response) for details.
</ResponseField>

<ResponseField name="createdAt" type="Long?">
  Creation timestamp (Unix epoch seconds). Absent on some older messages.
</ResponseField>

<ResponseField name="feedback" type="Feedback?">
  User feedback on this message.
</ResponseField>

<ResponseField name="metadata" type="MessageMetadata?">
  <Expandable title="properties">
    <ResponseField name="score" type="Double?">
      Confidence/relevance score.
    </ResponseField>
  </Expandable>
</ResponseField>

### Feedback

```kotlin theme={null}
enum class Feedback {
    POSITIVE,  // serialized as "positive"
    NEGATIVE   // serialized as "negative"
}
```

## Page\<T>

`data class Page<T>` — **Package:** `com.chatbase.sdk.model`

Returned by `listConversations()` and `listMessages()`.

```kotlin theme={null}
data class Page<T>(
    val data: List<T>,
    val cursor: String?,
    val hasMore: Boolean,
    val total: Int
)
```

<ResponseField name="data" type="List<T>" required>
  Items on this page.
</ResponseField>

<ResponseField name="cursor" type="String?">
  Cursor for the next page. `null` if no more pages.
</ResponseField>

<ResponseField name="hasMore" type="Boolean" required>
  Whether more pages exist.
</ResponseField>

<ResponseField name="total" type="Int" required>
  Total item count across all pages.
</ResponseField>

```kotlin theme={null}
val canLoadMore: Boolean
```

`true` if `hasMore` is true and `cursor` is non-null.

```kotlin theme={null}
suspend fun loadMore(): Page<T>?
```

Load the next page. Returns a new `Page` with the older items prepended to the existing `data`, so you always have the full accumulated list. Returns `null` if there are no more pages.
