---
title: "Read messages from a conversation"
method: GET
path: "/chats/linkedin/messages"
tags: ["chat"]
---

# Read messages from a conversation

`GET /chats/linkedin/messages`

Fetch messages from a specific LinkedIn conversation.

Pass the full `conversationUrn` as a query parameter, as returned by `/chats/linkedin` or `/chats/linkedin/search`. No parsing required — the server handles extraction internally.

Example: `GET /chats/linkedin/messages?conversationUrn=urn:li:msg_conversation:(urn:li:fsd_profile:ACoAAXXX,2-YWUx...)`

## Query parameters

- `conversationUrn` string, required — Full conversation URN as returned by /chats/linkedin (e.g. 'urn:li:msg_conversation:(urn:li:fsd_profile:ACoAAXXX,2-YWUx...)')
- `deliveredAt` integer — Timestamp (ms) of the oldest message from previous page — pass this to load older messages

## Response `200`

Conversation messages

- object
  - `success` true, required
  - `messages` object[], required
    - `messageUrn` string, required
    - `text` string, nullable, required
    - `deliveredAt` integer, required
    - `senderProfileUrn` string, required
    - `sender` object, required
      - `firstName` string, required
      - `lastName` string, required
      - `profileUrl` string, nullable, required
      - `headline` string, nullable, required
      - `profilePicture` string, nullable, required
      - `publicIdentifier` string, nullable, required
      - `profileUrn` string, nullable, required
    - `attachments` object[], required
      - `type` 'audio' | 'shared_post' | 'replied_message' | 'image' | 'file' | 'unknown', required
      - `audioUrl` string
      - `audioDuration` number
      - `hostUrn` string
      - `repliedText` string
      - `repliedSenderName` string
      - `imageUrl` string
      - `fileName` string
      - `fileUrl` string
    - `isOutbound` boolean, required — True if the authenticated user sent this message.
  - `prevCursor` integer, nullable, required — deliveredAt timestamp (ms) of the oldest message — pass as 'deliveredAt' to load older messages. Null when no more messages.
  - `creditsUsed` integer, required — Credits consumed by this call (0 for free endpoints, cached results, or duplicates).
  - `retryAfter` integer, required — Seconds to wait before making another call of the same type. 0 means no wait needed.

## Other responses

- `400` — The server cannot or will not process the request due to something that is perceived to be a client error.
- `401` — Although HTTP specifies "unauthorized", this response means "unauthenticated". Authenticate to continue. NOTE: 401 is also returned with code "linkedin_not_connected" when the caller IS authenticated but has no connected LinkedIn account — connect LinkedIn (not re-authenticate) to continue.
- `403` — The client does not have access rights to the content.
- `404` — The server cannot find the requested resource.
- `409` — The request conflicts with the current state of the server.
- `410` — The requested content has been permanently deleted from the server.
- `422` — The request was well-formed but was unable to be followed due to semantic errors.
- `429` — Rate limit exceeded. Read error.retryAfter for the wait time in seconds.
- `500` — The server encountered a situation it does not know how to handle.
- `502` — LinkedIn returned a server error or the proxy connection failed. Retry after a few seconds.
- `503` — Proxy capacity temporarily exceeded. Retry after a few seconds.

---

[API](https://skmtc.net/berea/apis/bereach-api.md) · [All operations](https://skmtc.net/berea/apis/bereach-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/berea/bereach-api/versions/3caf12036b26/schema)
