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

# Read a conversation

> Read the messages of one LinkedIn conversation, newest first. Get the `conversation_id` from the conversation list.

> [!NOTE]
>
> Safe to try: this reads Groovin's copy of your LinkedIn inbox. Nothing changes, and no LinkedIn limit applies.

## What this call does

| | |
| - | - |
| **LinkedIn** | None: reads a server-side copy of your inbox |
| **Your CRM** | None |
| **Repeating it** | Safe to repeat. |

## Good to know

* `seen` is only a hint: `false` does not prove a message is unread. See [Known issues](https://docs.groovin.ai/reference/known-issues.md).

Your AI assistant reaches the same action through the MCP tool `get_linkedin_chat_messages`.


## OpenAPI

````yaml reference/openapi.json POST /linkedin/chat-messages
openapi: 3.1.0
info:
  title: Groovin API
  version: 1.0.0
  description: >-
    Connect LinkedIn and your CRM. Every call acts on your real LinkedIn account
    and CRM: there is no test mode.
servers:
  - url: https://api.groovin.ai/functions/v1/api/v1
security:
  - apiKey: []
tags:
  - name: LinkedIn
  - name: CRM contacts and companies
  - name: LinkedIn connections import
paths:
  /linkedin/chat-messages:
    post:
      tags:
        - LinkedIn
      summary: Read a conversation
      description: >-
        Read the messages of one LinkedIn conversation, newest first. Get the
        `conversation_id` from the conversation list.
      operationId: get_linkedin_chat_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                conversation_id:
                  type: string
                  description: >-
                    The conversation to read, from
                    `linkedin/conversation-attendees`. Another account's
                    conversation answers 404.
                limit:
                  type: integer
                  description: 'How many messages to return: 1 to 250, 100 by default.'
                cursor:
                  type: string
                  description: >-
                    To read older messages, send back the `cursor` of the
                    previous answer.
                org_linkedin_account_id:
                  type: integer
                  description: >-
                    Leave this out to use your own LinkedIn account. Another
                    person's account is refused with a 403.
              required:
                - conversation_id
            examples:
              placeholder:
                summary: Replace every value
                value:
                  conversation_id: REPLACE_WITH_CONVERSATION_ID
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListChatMessagesResult'
              example:
                chat_id: example-conversation-id
                org_linkedin_account_id: 4821
                messages:
                  - id: example-message-id
                    provider_id: null
                    text: Thanks for connecting!
                    timestamp: '2026-11-02T08:41:00.000Z'
                    sent_by_me: false
                    sender_id: ACoAAExampleLinkedinProfileId
                    sender_attendee_id: null
                    message_type: MESSAGE
                    subject: null
                    seen: true
                    edited: false
                    deleted: false
                    is_event: false
                    attachments: []
                    quoted: null
                    reply_to_message_id: null
                    attendee_distance: 1
                cursor: null
        '400':
          description: 'Something in the request is wrong: `error` says what.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: The API key is missing, wrong or revoked.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            Your account cannot do this: no CRM connected, inactive
            subscription, Billing admin role, or a teammate's LinkedIn account.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: >-
            What you asked for does not exist, or your LinkedIn account is not
            connected.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: LinkedIn or your CRM is slowing you down. Wait at least 5 minutes.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Something failed on our side.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '502':
          description: >-
            LinkedIn or your CRM could not be reached or gave an unreadable
            answer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    ListChatMessagesResult:
      type: object
      description: One page of a chat's messages, newest first.
      required:
        - chat_id
        - org_linkedin_account_id
        - messages
        - cursor
      properties:
        chat_id:
          type: string
          description: >-
            The chat you read. It is the `conversation_id` you sent, under
            another name.
        org_linkedin_account_id:
          type: integer
          description: Groovin's id for the LinkedIn account this answer is about.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ConversationMessage'
          description: The messages.
        cursor:
          type:
            - string
            - 'null'
          description: >-
            Send it back as `cursor` to get older messages. `null` when there
            are no more.
    Error:
      type: object
      description: >-
        What every failed request answers, with an HTTP status. The text can
        change: decide what to do from the status, and show the text to a
        person.
      required:
        - error
      properties:
        error:
          type: string
          description: What went wrong, and sometimes what to do next.
    ConversationMessage:
      type: object
      description: One message of a LinkedIn chat.
      required:
        - id
        - provider_id
        - text
        - timestamp
        - sent_by_me
        - sender_id
        - sender_attendee_id
        - message_type
        - subject
        - seen
        - edited
        - deleted
        - is_event
        - attachments
        - quoted
        - reply_to_message_id
        - attendee_distance
      properties:
        id:
          type: string
          description: Message id.
        provider_id:
          type:
            - string
            - 'null'
          description: LinkedIn's own id for this message.
        text:
          type: string
          description: The message text.
        timestamp:
          type:
            - string
            - 'null'
          description: When it was sent (ISO 8601).
        sent_by_me:
          type: boolean
          description: '`true` when you sent this message.'
        sender_id:
          type:
            - string
            - 'null'
          description: The sender's LinkedIn profile id.
        sender_attendee_id:
          type:
            - string
            - 'null'
          description: The sender's id within this chat. Most integrations can ignore it.
        message_type:
          type:
            - string
            - 'null'
          description: '`"MESSAGE"` or `"INMAIL"`.'
        subject:
          type:
            - string
            - 'null'
          description: Subject line, set for InMails and some threads.
        seen:
          type: boolean
          description: >-
            A read receipt. `true` means LinkedIn reported it read. `false`
            proves nothing: see [Known issues](/reference/known-issues).
        edited:
          type: boolean
          description: '`true` when the message was edited.'
        deleted:
          type: boolean
          description: '`true` when the message was deleted.'
        is_event:
          type: boolean
          description: >-
            `true` for a system event, such as someone joining, rather than a
            real message.
        attachments:
          type: array
          items:
            $ref: '#/components/schemas/ConversationMessageAttachment'
          description: Files attached to this message.
        quoted:
          type:
            - object
            - 'null'
          description: The message this one quotes, if any.
          required:
            - sender_id
            - text
            - attachments_count
          properties:
            sender_id:
              type:
                - string
                - 'null'
              description: Who wrote the quoted message.
            text:
              type:
                - string
                - 'null'
              description: The quoted text.
            attachments_count:
              type: integer
              description: Files on the quoted message.
        reply_to_message_id:
          type:
            - string
            - 'null'
          description: The message this one replies to.
        attendee_distance:
          type:
            - integer
            - 'null'
          description: How close the sender is in your network, when LinkedIn says.
    ConversationMessageAttachment:
      type: object
      description: A file attached to a LinkedIn message.
      required:
        - id
        - type
        - url
        - unavailable
      properties:
        id:
          type: string
          description: Attachment id.
        type:
          type: string
          description: '`"img"`, `"video"`, `"audio"` or `"file"`.'
        url:
          type:
            - string
            - 'null'
          description: Where to get the file, when known.
        unavailable:
          type: boolean
          description: '`true` when LinkedIn can no longer provide the file.'
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >-
        Your Groovin API key (`gv_live_…`), created in the extension under
        Settings, MCP and API.

````

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