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

# Find missing LinkedIn URLs

> Find the LinkedIn URL of CRM contacts that have none, and save it on the contact. Groovin only saves a URL when the evidence is clear.

> [!CAUTION]
>
> This writes to your real CRM and spends one credit per URL found, out of 500 a month. It can read LinkedIn live through your account. It only fills empty fields and never overwrites a URL.

## What this call does

| | |
| - | - |
| **LinkedIn** | Live reads, within daily limits |
| **Your CRM** | Fills empty LinkedIn URL fields only |
| **Also** | 1 credit per URL found, 500 credits a month |
| **Repeating it** | Resend only what is in `not_processed`, never the whole list. A second batch at the same time answers 409. |

## Good to know

* `not_found` or `ambiguous` with an `error` means the search could not run in full. It does not prove the person is not on LinkedIn.
* This route can run for more than a minute. A failure shown by your tool does not prove the batch stopped: check your contacts before running it again.

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


## OpenAPI

````yaml reference/openapi.json POST /crm/contacts/find-linkedin-url
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/find-linkedin-url:
    post:
      tags:
        - CRM contacts and companies
      summary: Find missing LinkedIn URLs
      description: >-
        Find the LinkedIn URL of CRM contacts that have none, and save it on the
        contact. Groovin only saves a URL when the evidence is clear.
      operationId: find_linkedin_profile_url
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                crm_contact_ids:
                  type: array
                  items:
                    type: string
                  minItems: 1
                  maxItems: 25
                  description: >-
                    The CRM contacts, up to 25 per call, as text. 5 to 10 is the
                    practical size.
              required:
                - crm_contact_ids
            examples:
              placeholder:
                summary: Replace every value
                value:
                  crm_contact_ids:
                    - REPLACE_WITH_CRM_CONTACT_ID
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FindLinkedinProfileUrlsResult'
              example:
                total: 1
                processed: 1
                found: 1
                failed: 0
                not_processed: []
                not_processed_reason: null
                remaining_credits: 499
                retry_guidance: null
                results:
                  - crm_contact_id: example-crm-contact-id
                    status: found
                    linkedin_profile_url: https://www.linkedin.com/in/john-smith
                    error: null
                    error_status: 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'
        '402':
          description: You have no finder credits left.
          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'
        '409':
          description: Another batch of yours is already running.
          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:
    FindLinkedinProfileUrlsResult:
      type: object
      description: >-
        The result of a batch. The batch can stop early: send what is in
        `not_processed` again.
      required:
        - total
        - processed
        - found
        - failed
        - not_processed
        - not_processed_reason
        - remaining_credits
        - retry_guidance
        - results
      properties:
        total:
          type: integer
          description: Contacts asked for, without duplicates.
        processed:
          type: integer
          description: Contacts actually searched.
        found:
          type: integer
          description: URLs found.
        failed:
          type: integer
          description: Searches that failed.
        not_processed:
          type: array
          items:
            type: string
          description: >-
            Contacts this call did not search. Nothing was spent for them. Send
            only these again, never the whole list.
        not_processed_reason:
          type:
            - string
            - 'null'
          enum:
            - time_budget_exhausted
            - credits_exhausted
            - upstream_blocked
            - null
          description: >-
            Why the batch stopped early. `upstream_blocked` usually means your
            CRM must be reconnected.
        remaining_credits:
          type: integer
          description: Your finder credits after this call.
        retry_guidance:
          type:
            - string
            - 'null'
          description: >-
            Plain-text advice when some items failed for a temporary reason,
            otherwise `null`. Follow it: it says when to retry, and which items.
        results:
          type: array
          items:
            $ref: '#/components/schemas/FindLinkedinProfileUrlsItemResult'
          description: One item per contact searched.
    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.
    FindLinkedinProfileUrlsItemResult:
      type: object
      description: What happened for one contact.
      required:
        - crm_contact_id
        - status
        - linkedin_profile_url
        - error
        - error_status
      properties:
        crm_contact_id:
          type: string
          description: The contact.
        status:
          type: string
          enum:
            - found
            - already_present
            - not_found
            - ambiguous
            - error
          description: >-
            `found`: saved on the contact, and one credit spent.
            `already_present`, `not_found` and `ambiguous` spend nothing.
        linkedin_profile_url:
          type:
            - string
            - 'null'
          description: The URL, when there is one.
        error:
          type:
            - string
            - 'null'
          description: >-
            Read it on every status. On `found`, it means the URL could not be
            saved: add it by hand. On `not_found` or `ambiguous`, it means the
            search could not run in full, so the result proves nothing.
        error_status:
          type:
            - integer
            - 'null'
          description: >-
            HTTP status behind `error`. `429` means rate limited and `5xx`
            usually means temporary: retry later. `null` when there is no error.
  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.