> ## Documentation Index
> Fetch the complete documentation index at: https://social-b97141fb-auto-generate-llmstxt.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>
