> ## Documentation Index
> Fetch the complete documentation index at: https://social-b97141fb-feat-user-history-moderation-detail.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Get and View a Message

> Retrieve one chat message by ID and inspect its SDK fields.

Use a single-message lookup when your app needs to open a message permalink, refresh a message after an action, or observe a specific message for edits, deletion, reactions, flags, and marker updates.

The SDK returns the same message model used by message queries. Rendering is app-owned: inspect `messageType` or `dataType`, read the typed data payload, and handle `isDeleted` before displaying content.

## Platform Surface

| Platform | Retrieval shape | Update behavior |
| - | - | - |
| TypeScript | `MessageRepository.getMessage(messageId, callback)` | Live object callback; returns unsubscriber |
| iOS | `messageRepository.getMessage(messageId)` | `AmityObject<AmityMessage>` observation |
| Android | `messageRepository.getMessage(messageId)` | `Flowable<AmityMessage>` |
| Flutter | `messageRepository.getMessage(messageId)` | One-shot `Future<AmityMessage>`; use `message.listen` for local live updates |

## Parameters

| Parameter | Required | Description |
| - | - | - |
| `messageId` | Yes | Message ID to retrieve or observe. |
| Callback / observer | Depends | Required by TypeScript and native live-object APIs to receive loading, error, and data updates. |
| Unsubscriber / token / disposable | No | Handle returned by live APIs; retain it while observing and release it when the UI no longer needs updates. |

## Retrieve A Message

Retrieve or observe a single message by `messageId`.

<CodeGroup>
  ```typescript TypeScript theme={null}
  import { MessageRepository } from '@amityco/ts-sdk';

  const unsubscribe = MessageRepository.getMessage(
    messageId,
    ({ data: fetchedMessage, loading, error }) => {
      if (error) {
        handleError(error);
        return;
      }

      if (!loading && fetchedMessage) {
        renderResults(fetchedMessage);
      }
    },
  );

  unsubscribe();
  ```

  ```swift iOS theme={null}
  let liveMessage = messageRepository.getMessage("message-id")

  token = liveMessage.observe { liveObject, error in
      if let error {
          handleError(error)
          return
      }

      if let message = liveObject.snapshot {
          showSuccessMessage(message.messageId)
      }
  }
  ```

  ```kotlin Android theme={null}
  val disposable = messageRepository
      .getMessage(messageId = messageId)
      .subscribe(
          { fetchedMessage ->
              showSuccessMessage(fetchedMessage.getMessageId())
          },
          { error -> handleGeneralError(error) },
      )
  ```

  ```dart Flutter theme={null}
  final fetchedMessage = await AmityChatClient.newMessageRepository()
      .getMessage(messageId);

  final fetchedMessageId = fetchedMessage.messageId;
  final isDeleted = fetchedMessage.isDeleted ?? false;
  ```
</CodeGroup>

## Inspect Message Content

Read the message type and data payload before choosing the renderer for your UI.

<CodeGroup>
  ```typescript TypeScript theme={null}
  if (message.dataType === 'text') {
    const text = message.data?.text;
    renderResults(text);
  }

  if (message.dataType === 'image') {
    const fileId = message.data?.fileId;
    renderResults(fileId);
  }
  ```

  ```swift iOS theme={null}
  let liveMessage = messageRepository.getMessage("message-id")

  token = liveMessage.observe { liveObject, _ in
      guard let message = liveObject.snapshot else { return }

      switch message.messageType {
      case .text:
          showSuccessMessage(message.messageId)
      case .image, .file, .video, .audio, .custom:
          showSuccessMessage(message.messageId)
      }
  }
  ```

  ```kotlin Android theme={null}
  messageRepository
      .getMessage(messageId = messageId)
      .subscribe { fetchedMessage ->
          when (fetchedMessage.getData()) {
              is AmityMessage.Data.TEXT -> showSuccessMessage()
              is AmityMessage.Data.IMAGE -> showSuccessMessage()
              is AmityMessage.Data.FILE -> showSuccessMessage()
              is AmityMessage.Data.VIDEO -> showSuccessMessage()
              is AmityMessage.Data.AUDIO -> showSuccessMessage()
              is AmityMessage.Data.CUSTOM -> showSuccessMessage()
              else -> showSuccessMessage()
          }
      }
  ```

  ```dart Flutter theme={null}
  final fetchedMessage = await AmityChatClient.newMessageRepository()
      .getMessage(messageId);

  switch (fetchedMessage.dataType) {
    case AmityMessageDataType.TEXT:
    case AmityMessageDataType.IMAGE:
    case AmityMessageDataType.FILE:
    case AmityMessageDataType.VIDEO:
    case AmityMessageDataType.AUDIO:
    case AmityMessageDataType.CUSTOM:
      final fetchedMessageId = fetchedMessage.messageId;
      break;
  }
  ```
</CodeGroup>

## Deletion And Edit Fields

| Field | What to use it for |
| - | - |
| `isDeleted` | Decide whether to hide content or render a deleted-message placeholder. |
| `editedAt` | Show an edited indicator when present. |
| `parentId` | Link a reply back to its parent message. |
| `childrenNumber` | Show reply/thread counts when available. |
| `flagCount` / `isFlaggedByMe` | Render report state and moderation affordances. |

<Note>
  Single-message retrieval does not replace list queries. Use `getMessages` for timelines and use `getMessage` for detail refresh, deep links, or focused observation.
</Note>

## Related Topics

<CardGroup cols={3}>
  <Card title="Query Messages" href="./query-and-filter-messages" icon="list-filter">
    Load message lists and thread replies.
  </Card>

  <Card title="Edit and Delete" href="./edit-and-delete-messages" icon="pen-to-square">
    Update or soft-delete a message after sending.
  </Card>

  <Card title="Message Flagging" href="../message-flagging" icon="flag">
    Report and unreport chat messages.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.