> ## 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.

# Send a LinkedIn message

> Send one LinkedIn message from your account to one person or conversation.

> [!CAUTION]
>
> This sends a real message from your LinkedIn account, and it cannot be taken back. Check the text and the recipient before you press Send. A `conversation_id` can be a group: everyone in it gets the message.

## What this call does

| | |
| - | - |
| **LinkedIn** | **Sends a real message.** Can also cost 1 live profile view |
| **Your CRM** | Recorded automatically by the message sync. With your auto-create preference on, it can also create a contact, turn on sync, import the history and spend an email credit |
| **Also** | About 100 messages a day |
| **Repeating it** | **Never repeat blindly.** After a timeout, a 5xx or no answer at all, the message may have gone out. Wait a few minutes, check the chat, and only then try once. |

## Good to know

* Send exactly one of `conversation_id`, `linkedin_profile_id`, `sales_nav_profile_id`, `linkedin_profile_slug` or `crm_contact_id`.
* `sent: true` means LinkedIn accepted the message.
* Do not build bulk sequences with this route. It is made for one approved message at a time, and sending too much can get your LinkedIn account restricted.

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


## OpenAPI

````yaml reference/openapi.json POST /linkedin/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/messages:
    post:
      tags:
        - LinkedIn
      summary: Send a LinkedIn message
      description: >-
        Send one LinkedIn message from your account to one person or
        conversation.
      operationId: send_linkedin_message
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                text:
                  type: string
                  description: The message, up to 8,000 characters.
                conversation_id:
                  type: string
                  description: >-
                    Who to reach, by existing conversation: the best option. It
                    can be a group conversation.
                linkedin_profile_id:
                  type: string
                  description: Who to reach, by LinkedIn profile id (`ACoAA…`).
                sales_nav_profile_id:
                  type: string
                  description: Who to reach, by Sales Navigator profile id (`ACwAA…`).
                linkedin_profile_slug:
                  type: string
                  description: >-
                    Who to reach, by the end of their LinkedIn URL. This can
                    cost one live LinkedIn profile view, and a URL that changed
                    owner can point to someone else: prefer an id.
                crm_contact_id:
                  type: string
                  description: >-
                    Who to reach, by CRM contact id. The contact needs a linked
                    profile or a LinkedIn URL on its record.
                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:
                - text
            examples:
              placeholder:
                summary: Replace every value
                value:
                  text: REPLACE_WITH_YOUR_MESSAGE
                  conversation_id: REPLACE_WITH_CONVERSATION_ID
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SendLinkedinMessageResult'
              example:
                org_linkedin_account_id: 4821
                sent: true
                conversation_id: example-conversation-id
                message_id: example-message-id
                recipient_linkedin_profile_id: null
                recipient_resolution: conversation_id
                used_live_profile_fetch: false
        '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'
        '422':
          description: The CRM contact's LinkedIn URL cannot be used.
          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'
        '504':
          description: No confirmation in time. **The message may still have been sent.**
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    SendLinkedinMessageResult:
      type: object
      description: LinkedIn accepted the message.
      required:
        - org_linkedin_account_id
        - sent
        - conversation_id
        - message_id
        - recipient_linkedin_profile_id
        - recipient_resolution
        - used_live_profile_fetch
      properties:
        org_linkedin_account_id:
          type: integer
          description: Groovin's id for the LinkedIn account this answer is about.
        sent:
          const: true
          description: Always `true` on success.
        conversation_id:
          type:
            - string
            - 'null'
          description: The conversation the message went to.
        message_id:
          type:
            - string
            - 'null'
          description: The new message's id, when LinkedIn gives one.
        recipient_linkedin_profile_id:
          type:
            - string
            - 'null'
          description: Who it was addressed to. `null` when you sent a `conversation_id`.
        recipient_resolution:
          type: string
          enum:
            - conversation_id
            - provided_id
            - provided_slug
            - pair_table
            - crm_record
          description: How Groovin found the recipient.
        used_live_profile_fetch:
          type: boolean
          description: >-
            `true` when finding the recipient cost one live LinkedIn profile
            view.
    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.
  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.