# Read a single message or thread

Source: https://developer.nylas.com/docs/cookbook/email/get-message-thread/

Listing messages gives you summaries, and a `message.created` webhook gives you an ID. When you actually need the full body, headers, and attachment list of one message, or every message in a conversation, you fetch it directly by ID rather than paging the whole mailbox.

The Nylas Email API has a single endpoint for each: one to read a message, one to read a thread. Both take the ID you already have and return the full object across every connected provider.

## How do I fetch a single message?

Send a `GET /v3/grants/{grant_id}/messages/{message_id}` request with the message ID from a list response or a webhook. Nylas returns the full message: the body, all headers, the participants, and metadata for any attachments. This is the call you make when a summary isn't enough, and it returns the same shape across all 6 providers.

```bash
curl --compressed --request GET \
  --url 'https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/messages/<MESSAGE_ID>' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <NYLAS_API_KEY>' \
  --header 'Content-Type: application/json'

```

## How do I fetch a whole thread?

Send a `GET /v3/grants/{grant_id}/threads/{thread_id}` request to read an entire conversation. Nylas returns the thread with its participants, subject, and the IDs of every message in it. It unifies Gmail's threading and the other providers' conversation models into 1 object, the same shape across all 6 providers.

```bash
curl --compressed --request GET \
  --url 'https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/threads/<THREAD_ID>' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <NYLAS_API_KEY>' \
  --header 'Content-Type: application/json'

```

## Things to know about reading by ID

A couple of points save round-trips. Fetching a message returns attachment metadata, including each attachment's ID and size, but not the file content, so you download attachments in a separate call. A thread response carries the message IDs for the whole conversation plus one expanded `latest_draft_or_message`, rather than every full body, so you fetch the other messages only as needed.

ID stability differs across providers: Google and Microsoft (2 providers) use stable provider-native IDs, while on IMAP they're derived from the grant, so a re-created grant changes them. That's 1 more reason to re-authenticate rather than delete a grant. For attachment downloads, see the [attachments recipe](/docs/cookbook/email/attachments/download-attachments/).

## What's next

- [Download attachments](/docs/cookbook/email/attachments/download-attachments/) to get the file content a message references
- [List Google email messages](/docs/cookbook/email/messages/list-messages-google/) to find the message IDs you fetch
- [Clean message HTML and quoted text](/docs/cookbook/email/clean-messages/) to tidy a fetched body
- [Get real-time updates with webhooks](/docs/cookbook/use-cases/build/realtime-webhooks/) for the message.created IDs you read