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

# List your synced contacts

> See the CRM contacts whose LinkedIn conversation is synced with Groovin, most recently synced first.

> [!NOTE]
>
> Safe to try: this reads Groovin's own data. With `include_crm_details`, it also makes one CRM request per contact.

## What this call does

| | |
| - | - |
| **LinkedIn** | None |
| **Your CRM** | None by default. With `include_crm_details`: 1 read per contact |
| **Repeating it** | Safe to repeat. |

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


## OpenAPI

````yaml reference/openapi.json POST /crm/contacts/synced
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:
  /crm/contacts/synced:
    post:
      tags:
        - CRM contacts and companies
      summary: List your synced contacts
      description: >-
        See the CRM contacts whose LinkedIn conversation is synced with Groovin,
        most recently synced first.
      operationId: list_synced_crm_contacts
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                include_crm_details:
                  type: boolean
                  description: >-
                    `true` adds name, email and job details from your CRM, at
                    one CRM request per contact.
                limit:
                  type: integer
                  description: >-
                    The most contacts to return. The playground fills this in
                    for you. The API itself has no default: without `limit`, you
                    get everything.
                  default: 10
                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: []
            examples:
              placeholder:
                summary: Replace every value
                value:
                  limit: 10
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListSyncedCrmContactsResult'
              example:
                org_linkedin_account_id: 4821
                crm_name: attio
                crm_details_included: false
                total_matched: 42
                returned: 1
                truncated: true
                contacts:
                  - crm_contact_id: example-crm-contact-id
                    crm_url: null
                    linkedin_profile_id: ACoAAExampleLinkedinProfileId
                    sales_nav_profile_id: null
                    linkedin_profile_slugs:
                      - john-smith
                    last_sync_msg_at: '2026-11-02T08:41:00.000Z'
                    is_msg_sync_enabled: true
                    is_crm_contact_creation_blocked: 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'
        '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:
    ListSyncedCrmContactsResult:
      type: object
      description: Your synced contacts, most recently synced first.
      required:
        - org_linkedin_account_id
        - crm_name
        - crm_details_included
        - total_matched
        - returned
        - truncated
        - contacts
      properties:
        org_linkedin_account_id:
          type: integer
          description: Groovin's id for the LinkedIn account this answer is about.
        crm_name:
          type: string
          description: Your CRM, such as `"attio"`.
        crm_details_included:
          type: boolean
          description: '`true` when you asked for CRM details.'
        total_matched:
          type: integer
          description: Synced contacts, before `limit`.
        returned:
          type: integer
          description: Contacts in this answer.
        truncated:
          type: boolean
          description: '`true` when `limit` left contacts out.'
        contacts:
          type: array
          items:
            $ref: '#/components/schemas/SyncedCrmContact'
          description: The contacts.
    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.
    SyncedCrmContact:
      type: object
      description: A CRM contact whose LinkedIn conversation Groovin syncs.
      required:
        - crm_contact_id
        - crm_url
        - linkedin_profile_id
        - sales_nav_profile_id
        - linkedin_profile_slugs
        - last_sync_msg_at
        - is_msg_sync_enabled
        - is_crm_contact_creation_blocked
      properties:
        crm_contact_id:
          type: string
          description: The CRM contact.
        crm_url:
          type:
            - string
            - 'null'
          description: A link to the contact in your CRM.
        linkedin_profile_id:
          type: string
          description: LinkedIn profile id, the `ACoAA…` identifier of a person.
        sales_nav_profile_id:
          type:
            - string
            - 'null'
          description: Their Sales Navigator profile id.
        linkedin_profile_slugs:
          type: array
          items:
            type: string
          description: The public URL slugs known for this person.
        last_sync_msg_at:
          type:
            - string
            - 'null'
          description: >-
            When the last message was imported. `null` when nothing has been
            imported yet.
        is_msg_sync_enabled:
          type: boolean
          description: '`true` when message sync is on.'
        is_crm_contact_creation_blocked:
          type: boolean
          description: >-
            `true` when you blocked this person from CRM contact creation.
            Unlike the other routes, this one always returns it.
        full_name:
          type:
            - string
            - 'null'
          description: >-
            From your CRM, with `include_crm_details: true`. The fields below
            work the same way.
        picture_url:
          type:
            - string
            - 'null'
          description: Attio only.
        job_title:
          type:
            - string
            - 'null'
          description: Attio and HubSpot.
        description:
          type:
            - string
            - 'null'
          description: Attio only.
        primary_email:
          type:
            - string
            - 'null'
          description: Their main email.
        linkedin_url:
          type:
            - string
            - 'null'
          description: Attio and HubSpot.
        location:
          type:
            - string
            - 'null'
          description: Attio and HubSpot.
  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.