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

# Check a connections import

> See how an import is going, and read its rows. Without `import_id`, you get your most recent one.

> [!NOTE]
>
> Safe to try. One exception: asking about a stalled import can start it again, and a real run then carries on writing to your CRM.

## What this call does

| | |
| - | - |
| **LinkedIn** | None |
| **Your CRM** | None, but a stalled real run can resume and keep writing |
| **Repeating it** | Safe to repeat: wait for `poll_after_seconds` between calls. |

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


## OpenAPI

````yaml reference/openapi.json POST /crm/connections-import/status
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/connections-import/status:
    post:
      tags:
        - LinkedIn connections import
      summary: Check a connections import
      description: >-
        See how an import is going, and read its rows. Without `import_id`, you
        get your most recent one.
      operationId: get_linkedin_connections_import
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                import_id:
                  type: string
                  description: Which import. Leave it out for your most recent one.
                rows:
                  type: string
                  enum:
                    - none
                    - needs_attention
                    - created
                    - skipped
                    - all
                  description: >-
                    `none` (the default) gives counts only. `needs_attention`
                    lists what you must settle yourself. `created`, `skipped`
                    and `all` list the rest.
                limit:
                  type: integer
                  minimum: 1
                  maximum: 100
                  description: 'Rows per page: 25 by default, 100 at most.'
                offset:
                  type: integer
                  minimum: 0
                  description: How many rows to skip, to get the next page.
              required: []
            examples:
              placeholder:
                summary: Replace every value
                value:
                  rows: none
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ImportAnswer'
              example:
                import_id: example-import-id
                status: running
                dry_run: true
                crm_name: attio
                file_name: Connections.csv
                created_at: '2026-11-02T09:00:00.000Z'
                started_at: '2026-11-02T09:00:04.000Z'
                finished_at: null
                total_rows: 2400
                processed_rows: 600
                pending_rows: 1800
                counts:
                  contacts_found: 120
                  contacts_found_by_name_and_company: 4
                  contacts_created: 0
                  contacts_would_create: 460
                  contacts_possible_duplicate: 8
                  companies_found: 90
                  companies_created: 0
                  companies_would_create: 310
                  company_domains_found: 240
                  companies_domain_pending: 70
                  skipped_blocked: 0
                  skipped_duplicate_in_file: 2
                  skipped_unusable: 10
                  errors: 0
                  ambiguous: 0
                lists:
                  contact: null
                  company: null
                column_map: {}
                parse_warnings: []
                last_error: null
                is_processing: true
                cancel_requested_at: null
                rows_purged_at: null
                finished_notified_at: null
                retention_hours: 72
                company_domain_credits_remaining: 200
                domain_credits_exhausted_at: null
                on_behalf_of: null
                update_recognised_contacts: true
                poll_after_seconds: 120
                next_step: Check again in about two minutes.
                rows_available: true
        '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:
    ImportAnswer:
      type: object
      description: The state of an import. Every import route answers with this.
      required:
        - import_id
        - status
        - dry_run
        - crm_name
        - file_name
        - created_at
        - started_at
        - finished_at
        - total_rows
        - processed_rows
        - pending_rows
        - counts
        - lists
        - column_map
        - parse_warnings
        - last_error
        - is_processing
        - cancel_requested_at
        - rows_purged_at
        - finished_notified_at
        - retention_hours
        - company_domain_credits_remaining
        - domain_credits_exhausted_at
        - on_behalf_of
        - update_recognised_contacts
        - poll_after_seconds
        - next_step
        - rows_available
      properties:
        import_id:
          type: string
          description: The import.
        status:
          type: string
          description: >-
            `ready` or `running` while it works, then `completed`, `cancelled`
            or `failed`.
        dry_run:
          type: boolean
          description: '`true` for a preview.'
        crm_name:
          type: string
          description: 'Your CRM: `"attio"` or `"hubspot"`.'
        file_name:
          type:
            - string
            - 'null'
          description: The name of the result file.
        created_at:
          type: string
          description: When the import was created.
        started_at:
          type:
            - string
            - 'null'
          description: When it started.
        finished_at:
          type:
            - string
            - 'null'
          description: When it finished.
        total_rows:
          type: integer
          description: >-
            Data rows in the file. Compare this with your file: a mismatch means
            the file was cut on the way in.
        processed_rows:
          type: integer
          description: Rows done.
        pending_rows:
          type: integer
          description: Rows left.
        counts:
          $ref: '#/components/schemas/ImportCounts'
        lists:
          type: object
          description: The CRM lists the import adds records to.
          properties:
            contact:
              type:
                - object
                - 'null'
              properties:
                id:
                  type: string
                name:
                  type: string
            company:
              type:
                - object
                - 'null'
              properties:
                id:
                  type: string
                name:
                  type: string
        column_map:
          type: object
          description: Which column of the file was read as what.
        parse_warnings:
          type: array
          items:
            type: string
          description: What the file reader could not read.
        last_error:
          type:
            - string
            - 'null'
          description: The latest problem, if any.
        is_processing:
          type: boolean
          description: '`true` while rows are being worked on right now.'
        cancel_requested_at:
          type:
            - string
            - 'null'
          description: When you asked to stop.
        rows_purged_at:
          type:
            - string
            - 'null'
          description: >-
            When the row data was deleted. No row detail and no re-run after
            that.
        finished_notified_at:
          type:
            - string
            - 'null'
          description: When you were emailed.
        retention_hours:
          type: integer
          description: How long row data is kept, in hours.
        company_domain_credits_remaining:
          type:
            - integer
            - 'null'
          description: Your domain credits when this run last looked.
        domain_credits_exhausted_at:
          type:
            - string
            - 'null'
          description: >-
            When credits ran out. Later companies were created with a name but
            no domain.
        on_behalf_of:
          type:
            - object
            - 'null'
          description: The teammate whose connections these are. `null` means your own.
          properties:
            crm_user_id:
              type: string
            name:
              type: string
            email:
              type:
                - string
                - 'null'
        update_recognised_contacts:
          type: boolean
          description: '`true` when a real run updates the contacts it recognises.'
        poll_after_seconds:
          type:
            - integer
            - 'null'
          description: >-
            Wait this long before asking again. `null` once the import can no
            longer change.
        next_step:
          type: string
          description: What to do now, in one sentence.
        rows_available:
          type: boolean
          description: '`false` once the row data was deleted: counts only.'
        rows:
          type: array
          items:
            $ref: '#/components/schemas/ImportRowView'
          description: One page of rows, if you asked.
        rows_total_matched:
          type: integer
          description: Rows matching your filter.
        rows_returned:
          type: integer
          description: Rows in this answer.
        rows_offset:
          type: integer
          description: The `offset` you sent.
        rows_truncated:
          type: boolean
          description: '`true` when more rows exist: ask with a new `offset`.'
    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.
    ImportCounts:
      type: object
      description: >-
        The running totals of an import. On a preview, `*_would_create` says
        what a real run would create.
      required:
        - contacts_found
        - contacts_found_by_name_and_company
        - contacts_created
        - contacts_would_create
        - contacts_possible_duplicate
        - companies_found
        - companies_created
        - companies_would_create
        - company_domains_found
        - companies_domain_pending
        - skipped_blocked
        - skipped_duplicate_in_file
        - skipped_unusable
        - errors
        - ambiguous
      properties:
        contacts_found:
          type: integer
          description: Contacts already in your CRM and recognised.
        contacts_found_by_name_and_company:
          type: integer
          description: Of those, how many were recognised by name and company alone.
        contacts_created:
          type: integer
          description: New contacts created.
        contacts_would_create:
          type: integer
          description: New contacts a real run would create.
        contacts_possible_duplicate:
          type: integer
          description: >-
            Rows left alone because someone in your CRM may be the same person.
            Only you can settle these.
        companies_found:
          type: integer
          description: Companies already in your CRM.
        companies_created:
          type: integer
          description: New companies created.
        companies_would_create:
          type: integer
          description: New companies a real run would create.
        company_domains_found:
          type: integer
          description: Companies whose web domain was found.
        companies_domain_pending:
          type: integer
          description: Companies to create whose domain was not found for free.
        skipped_blocked:
          type: integer
          description: Rows skipped because the person is blocked.
        skipped_duplicate_in_file:
          type: integer
          description: Rows repeated in the file.
        skipped_unusable:
          type: integer
          description: Rows without a usable LinkedIn URL.
        errors:
          type: integer
          description: Rows in error.
        ambiguous:
          type: integer
          description: Rows that matched several records.
    ImportRowView:
      type: object
      description: One row of an import.
      required:
        - row_number
        - first_name
        - last_name
        - linkedin_url
        - company_name
        - outcome
        - match_reason
        - crm_contact_id
        - crm_contact_url
        - company_outcome
        - crm_company_id
        - possible_duplicate_crm_contact_ids
        - possible_duplicate_urls
        - error_source
        - message
      properties:
        row_number:
          type: integer
          description: 1 is the first data row after the header.
        first_name:
          type:
            - string
            - 'null'
          description: First name.
        last_name:
          type:
            - string
            - 'null'
          description: Last name.
        linkedin_url:
          type:
            - string
            - 'null'
          description: LinkedIn URL.
        company_name:
          type:
            - string
            - 'null'
          description: Company.
        outcome:
          type: string
          description: >-
            What happened to this row, or `not_processed` if the import never
            reached it.
        match_reason:
          type:
            - string
            - 'null'
          description: How an existing contact was recognised.
        crm_contact_id:
          type:
            - string
            - 'null'
          description: The CRM contact.
        crm_contact_url:
          type:
            - string
            - 'null'
          description: A link to it in your CRM.
        company_outcome:
          type:
            - string
            - 'null'
          description: What happened to the company.
        crm_company_id:
          type:
            - string
            - 'null'
          description: The CRM company.
        possible_duplicate_crm_contact_ids:
          type: array
          items:
            type: string
          description: Same-name contacts that stopped a creation.
        possible_duplicate_urls:
          type: array
          items:
            type: string
          description: Links to them, to settle by hand.
        error_source:
          type:
            - string
            - 'null'
          description: Where an error came from.
        message:
          type:
            - string
            - 'null'
          description: Why the row was left alone, or what failed.
  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.