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

# Importing from LinkedIn

> Import candidate profiles directly from LinkedIn URLs using the EnrichLayer API with automatic experience calculation and skill extraction.

## Overview

If a candidate's CV is not readily available, you can import their profile directly from LinkedIn. Paste a LinkedIn profile URL into Recruitier, and the platform retrieves the candidate's professional information -- including work history, education, skills, and location -- and creates a complete candidate profile using the EnrichLayer API.

This is particularly useful when you discover candidates through LinkedIn searches, InMail conversations, referrals, or networking events and want to add them to your talent pool quickly without waiting for a CV. The import process builds a synthetic CV from the LinkedIn data, so the candidate is fully ready for AI job matching without needing a separate document upload.

## How to Import from LinkedIn

<Steps>
  <Step title="Open the Upload Wizard">
    Go to the **Candidates** section and click the **Upload CV** button. In the wizard dialog that opens, switch to the **LinkedIn URL** tab at the top of the first step.
  </Step>

  <Step title="Paste the LinkedIn URL">
    Enter the candidate's LinkedIn profile URL. The URL should follow one of these formats:

    ```
    https://www.linkedin.com/in/candidate-name/
    https://linkedin.com/in/candidate-name
    https://www.linkedin.com/in/candidate-name
    ```

    Both `www.linkedin.com` and `linkedin.com` URLs are accepted. Trailing slashes are handled automatically. The URL is normalized internally -- trailing slashes are stripped and the comparison is case-insensitive -- so `linkedin.com/in/John-Doe/` and `linkedin.com/in/john-doe` are treated as the same profile.

    <Tip>
      You can copy the URL directly from your browser's address bar when viewing the candidate's LinkedIn profile. Make sure the URL contains `/in/` followed by the candidate's profile slug -- this is the standard format for LinkedIn personal profiles.
    </Tip>
  </Step>

  <Step title="Profile Data Is Retrieved">
    Recruitier uses the **EnrichLayer API** to retrieve the candidate's publicly available LinkedIn data. This is a professional enrichment service that provides structured data from LinkedIn profiles. The retrieval typically completes within a few seconds.

    The following data is imported:

    | Data Field          | Description                                                                                        | Example                                      |
    | ------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------- |
    | **Full Name**       | Combined from first and last name fields. If a full\_name field is available, it takes precedence. | "Jan de Vries"                               |
    | **Headline**        | Current role or professional tagline from the LinkedIn headline field                              | "Senior Python Developer at TechCorp"        |
    | **Summary**         | The "About" section text from the LinkedIn profile                                                 | Professional summary paragraph               |
    | **Work Experience** | Job titles, companies, dates, and descriptions (up to **8 most recent** positions)                 | Title, company, start/end dates, description |
    | **Education**       | Degrees, institutions, fields of study (up to **4 entries**)                                       | "MSc Computer Science, TU Delft"             |
    | **Skills**          | Skills listed on the LinkedIn profile (if publicly visible)                                        | \["Python", "FastAPI", "PostgreSQL"]         |
    | **Location**        | City, state, and country from the profile                                                          | "Amsterdam, North Holland, Netherlands"      |

    The system also automatically calculates **years of experience** and **experience level** from the work history dates.
  </Step>

  <Step title="Experience Calculation">
    The system analyzes the imported work history to determine two key fields:

    **Years of Experience**: Calculated from the sum of all work experience durations. Each position's duration is computed from its start and end dates. Overlapping positions (concurrent roles) are counted individually, which may result in total years exceeding calendar time.

    **Experience Level**: Derived directly from the calculated years of experience using these thresholds:

    | Years of Experience | Assigned Level |
    | ------------------- | -------------- |
    | 0 - 2 years         | **Junior**     |
    | 3 - 5 years         | **Medior**     |
    | 6 - 10 years        | **Senior**     |
    | 11+ years           | **Lead**       |

    <Note>
      The experience level assignment is automatic but fully editable. If you believe a candidate's seniority does not match their years of experience (for example, a career changer with 15 years in a different field who is junior in tech), you can adjust the experience level during the review step. The experience level influences the matching algorithm, so getting it right matters.
    </Note>
  </Step>

  <Step title="Skills Are Extracted">
    Skills come from two possible sources, with a clear priority order:

    **Primary: LinkedIn Skills Section**
    If the LinkedIn profile includes listed skills, those are imported directly with a confidence score of **0.80**. This is a high-confidence score because these are skills the candidate explicitly self-reported on their LinkedIn profile.

    **Fallback: AI Extraction**
    If the profile does not have publicly visible skills (or the skills section is empty), the AI falls back to extracting skills from the candidate's headline, summary, and work experience descriptions. This uses the same Gemini-powered extraction logic as CV upload, with variable confidence scores based on how explicitly each skill was mentioned.

    In both cases, skills go through the same **normalization pipeline** used for CV uploads -- the SKILL\_ALIASES taxonomy maps over 1,000 variations to canonical forms. "React.js" from LinkedIn becomes the same "react" as "ReactJS" from a CV.

    <Info>
      LinkedIn skills with a confidence of 0.80 sit between AI-extracted skills from CVs (typically 0.95+ for explicit mentions) and the legacy default (0.70 for imported skills without clear provenance). The 0.80 score reflects high confidence with a small margin for the fact that LinkedIn skills are self-reported and may include aspirational or outdated technologies.
    </Info>
  </Step>

  <Step title="Review Profile">
    Just like the CV upload flow, you are presented with the candidate's name and job title for review. Both fields are pre-filled but fully editable. The wizard checks for duplicate names.

    Pay particular attention to:

    * **Title/Headline**: LinkedIn headlines are often marketing-oriented ("Passionate about building scalable solutions"). Consider editing to a more standard job title for better matching.
    * **Name**: Verify the name was correctly combined from the LinkedIn profile data.
  </Step>

  <Step title="Review Skills">
    Review the AI-extracted skills with confidence scores. Toggle skills on or off, remove irrelevant ones, and add any that are missing. You can also skip this step.
  </Step>

  <Step title="Set Location and Start Matching">
    Configure the candidate's location using the autocomplete field and set the search radius (default **40 km**, adjustable from 5 km to 200 km). Once you click **Start Matching**, the wizard completes and the full 5-stage AI job matching pipeline starts automatically in the background.

    You are redirected to the candidate detail page where real-time progress updates show each matching stage as it executes.

    <Note>
      Additional preferences like salary expectations, job type, and flexibility can be configured later from the candidate's profile edit dialog.
    </Note>
  </Step>
</Steps>

## What Data Is Extracted in Detail

### Profile Information

* **Name**: Combined from first and last name fields. If the `full_name` field is available from the API, it takes precedence over the combined first/last name to ensure accuracy with multi-part names.
* **Title/Headline**: The LinkedIn headline, which typically describes the candidate's current role or professional identity (e.g., "Senior Data Engineer | Python | Spark | AWS"). If no headline exists, the title from the most recent work experience is used as a fallback.
* **Location**: Built from city, state, and country fields from the LinkedIn profile. This location string is automatically geocoded to latitude/longitude coordinates using the GeocodingService (Dutch city list, then Nominatim API, then AI normalization) for distance-based matching.
* **Summary**: The "About" section from the LinkedIn profile. This text provides professional context and is incorporated into the synthetic CV text used for matching.

### Experience and Education Details

Work history and education are imported with specific limits to balance completeness with processing efficiency:

<Tabs>
  <Tab title="Work Experience">
    Up to **8 most recent positions** are imported, each including:

    * Job title
    * Company name
    * Start and end dates (or "Present" for current roles)
    * Description/responsibilities text

    These positions are used to:

    1. Calculate total years of experience
    2. Determine experience level (Junior/Medior/Senior/Lead)
    3. Build the synthetic CV text used for AI scoring
    4. Provide context for the Experience vector embedding
  </Tab>

  <Tab title="Education">
    Up to **4 education entries** are imported, each including:

    * Institution name
    * Degree type
    * Field of study
    * Dates attended

    Education entries contribute to the synthetic CV text and influence the Secondary Fit dimension during AI scoring (education alignment, relevant qualifications).
  </Tab>
</Tabs>

### Synthetic CV Text

Since LinkedIn imports do not have an actual CV file, Recruitier generates a structured text representation of the candidate's profile. This "synthetic CV" is assembled from the imported data in a specific format:

```
[Name]
[Headline]
[Location]

[Summary]

Experience:
- [Title] at [Company] ([Start] - [End])
  [Description]
(up to 8 positions)

Education:
- [Degree] in [Field] at [Institution] ([Dates])
(up to 4 entries)

Skills:
[Comma-separated skill list]
```

This synthetic CV text is stored on the candidate's `cv_text` field and serves the same purpose as extracted CV text from uploaded documents:

* It is used to generate the **Experience vector embedding** for semantic search
* It is sent to the AI during **scoring** (up to 8,000 characters) for evaluating match quality
* It provides the professional context needed for accurate role fit and experience fit assessment

<Info>
  The synthetic CV text is stored on the candidate profile and used for all subsequent matching and scoring operations. You do not need to upload a separate CV for LinkedIn-imported candidates. The synthetic text provides sufficient context for the AI to produce quality match scores.
</Info>

## When to Use LinkedIn Import vs. CV Upload

| Scenario                                            | Recommended Method  | Rationale                                                                                          |
| --------------------------------------------------- | ------------------- | -------------------------------------------------------------------------------------------------- |
| You have the candidate's CV file                    | **CV Upload**       | Provides the most detailed extraction. CV text is richer and skills get higher confidence (0.95+). |
| Candidate was found via LinkedIn search             | **LinkedIn Import** | Fastest path to a profile. No need to request a CV first.                                          |
| Candidate has a sparse LinkedIn profile             | **CV Upload**       | A CV typically contains more detail than a minimal LinkedIn profile.                               |
| You want structured work history and education data | **LinkedIn Import** | EnrichLayer provides cleanly structured employment data with dates.                                |
| Candidate's CV is a scanned image                   | **LinkedIn Import** | Avoids OCR issues entirely. LinkedIn data is always text-based.                                    |
| You need email and phone number                     | **CV Upload**       | LinkedIn does not expose contact details publicly through the API.                                 |
| Candidate is a career changer                       | **CV Upload**       | The full CV narrative gives the AI more context to understand the transition.                      |
| You need to add candidates quickly in bulk          | **LinkedIn Import** | Faster per-candidate than the CV upload review process.                                            |

<Tip>
  If you have both a CV and a LinkedIn URL, uploading the CV is generally the better choice for matching quality. CVs contain more detailed skill descriptions (yielding 0.95+ confidence vs. 0.80 for LinkedIn skills) and often include contact information that LinkedIn does not expose. You can always add the LinkedIn URL to the candidate's profile later for reference.
</Tip>

## Limitations

<AccordionGroup>
  <Accordion title="No Contact Information">
    LinkedIn imports do **not** include email addresses or phone numbers. This data is not publicly available through the EnrichLayer API. If you need contact details, you will need to add them manually to the candidate profile after import, obtain them through InMail or direct conversation, or use a separate contact enrichment tool.
  </Accordion>

  <Accordion title="Profile Visibility Restrictions">
    The import relies on publicly available LinkedIn data accessed through the EnrichLayer API. If a candidate has heavily restricted privacy settings, some information may be unavailable. In such cases, the import will still succeed with whatever data is accessible, but the profile may be less complete -- particularly the skills section and detailed work descriptions.
  </Accordion>

  <Accordion title="Duplicate Detection">
    Recruitier checks for duplicate LinkedIn URLs within your account using normalized URL comparison. If you try to import a candidate whose LinkedIn URL has already been used, you receive a conflict error with the existing candidate's name.

    The normalization handles common URL variations:

    * Trailing slashes: `linkedin.com/in/john-doe/` = `linkedin.com/in/john-doe`
    * Case differences: `linkedin.com/in/John-Doe` = `linkedin.com/in/john-doe`
    * www prefix: `www.linkedin.com/in/john-doe` = `linkedin.com/in/john-doe`

    This prevents accidental duplicates when the same LinkedIn URL is entered in slightly different formats.
  </Accordion>

  <Accordion title="Skills Availability">
    Not all LinkedIn profiles have publicly visible skills. When skills are not available from the API, the AI falls back to extracting them from the candidate's summary and experience descriptions. This fallback works well but typically produces lower confidence scores (variable, based on extraction context) compared to directly imported LinkedIn skills (0.80 fixed).

    Profiles with very limited public information may produce a sparse skill set. In these cases, manually adding skills during the review step is especially important.
  </Accordion>

  <Accordion title="Work Experience Limits">
    Only the **8 most recent** work experiences are imported. For candidates with extensive careers (15+ positions), older roles are not captured. If older experience is relevant to the candidate's current job search, you can add key details to the candidate's summary field.

    Similarly, only **4 education entries** are imported. For candidates with multiple degrees or certifications, you may need to add missing entries manually.
  </Accordion>

  <Accordion title="Overlapping Experience Durations">
    Years of experience is calculated by summing all position durations individually. If a candidate held two positions simultaneously (e.g., a consulting role alongside a permanent position), both durations count toward the total. This can result in calculated years exceeding actual calendar years. The experience level may need manual adjustment in these cases.
  </Accordion>
</AccordionGroup>

## After Import

Once a LinkedIn profile is imported, the candidate follows the exact same workflow as a CV-uploaded candidate:

1. **Review and confirm the extracted profile** -- Pay special attention to the headline/title, as LinkedIn headlines are often marketing-oriented rather than standard job titles
2. **Confirm skills** -- Especially important when the AI used fallback extraction from experience descriptions rather than importing LinkedIn-listed skills
3. **Set location and search preferences** -- Configure radius, salary, job types, and flexibility
4. **AI matching runs automatically** -- The full 5-stage pipeline executes in the background

<Warning>
  Always confirm the extracted skills before relying on match results. LinkedIn-listed skills are self-reported and may include outdated technologies, aspirational skills, or tools the candidate used briefly years ago. A quick review ensures the matching engine targets the right opportunities. Remember that skills carry 45% of the vector search weight -- inaccurate skills significantly degrade match quality.
</Warning>

## Advanced

### How the EnrichLayer Integration Works

The LinkedIn import uses the EnrichLayer API, a professional data enrichment service. Here is the technical flow:

1. **URL Validation**: The system validates that the provided URL is a properly formatted LinkedIn profile URL (must contain `/in/` path segment)
2. **API Request**: The normalized URL is sent to the EnrichLayer API endpoint, which returns structured profile data in JSON format
3. **Data Mapping**: The API response is mapped to Recruitier's candidate entity fields:
   * `full_name` or `first_name` + `last_name` maps to candidate `name`
   * `headline` maps to candidate `title`
   * `location` fields are combined and geocoded
   * `experiences` array is processed for duration calculation
   * `skills` array is normalized through SKILL\_ALIASES
4. **Synthetic CV Generation**: A text representation is assembled from all imported data
5. **Profile Creation**: The candidate record is created with all mapped data

### Confidence Score Hierarchy

Different data sources produce different confidence levels for skills. Understanding this hierarchy helps you interpret the skill review screen:

| Source                                      | Confidence Score         | Rationale                                                         |
| ------------------------------------------- | ------------------------ | ----------------------------------------------------------------- |
| AI extraction from CV (explicit mention)    | **0.95+**                | Highest confidence -- skill explicitly stated in the document     |
| LinkedIn profile skills section             | **0.80**                 | High confidence -- candidate self-reported the skill              |
| AI extraction from LinkedIn text (fallback) | **Variable (0.60-0.90)** | Depends on how explicitly the skill was mentioned in descriptions |
| Legacy/unknown source                       | **0.70**                 | Default score for imported skills without clear provenance        |

When reviewing skills, use these confidence levels as a guide for where to focus your attention. Skills at 0.80 (LinkedIn-imported) are generally reliable but worth a quick verification. Skills below 0.70 deserve closer scrutiny.

### How Synthetic CV Text Affects Matching

The synthetic CV is not just a convenience display -- it actively drives matching quality:

* **Experience Vector**: The synthetic CV text is used to generate the Experience embedding vector (20% of semantic search weight). A richer synthetic CV produces a better Experience vector, which captures domain knowledge, industry context, and work complexity that skills and titles alone cannot represent.
* **AI Scoring Input**: During Stage 5 of matching, the synthetic CV text (up to 8,000 characters) is sent to the AI alongside each job description. The AI uses this to evaluate role fit, experience fit, and secondary fit with specific evidence from the candidate's background.
* **Query Generation**: The synthetic CV text also influences how search queries are generated in Stage 2 of matching. The AI reads the candidate's background to generate diverse, relevant search strategies.

<Tip>
  **Enrich the synthetic CV manually if needed.** If you know additional details about the candidate -- perhaps from a phone screening or interview notes -- you can add them to the candidate's summary field. This summary is incorporated into the AI's context during matching and scoring, effectively enriching the synthetic CV with insider knowledge.
</Tip>

### Duplicate Detection Logic

The duplicate detection system normalizes LinkedIn URLs before comparison to prevent false negatives:

1. Protocol and `www` prefix are stripped
2. Trailing slashes are removed
3. The entire URL is lowercased
4. The comparison is performed on the normalized form

This means the following URLs all resolve to the same identity:

* `https://www.linkedin.com/in/Jan-de-Vries/`
* `https://linkedin.com/in/jan-de-vries`
* `http://www.linkedin.com/in/jan-de-vries/`

If a duplicate is detected, you receive a conflict error that includes the existing candidate's name, helping you decide whether to update the existing profile or investigate the conflict.

### Power-User Tips

<Tip>
  **Import first, refine later.** When sourcing candidates from LinkedIn, import profiles as quickly as possible to build your pipeline. You can return later to refine skills, update titles, and set precise preferences. The import captures enough data for initial matching, and you can improve accuracy incrementally.
</Tip>

<Tip>
  **Edit LinkedIn headlines to standard titles.** LinkedIn headlines like "Passionate Full-Stack Engineer | Building the Future of FinTech" are great for personal branding but poor for matching. Edit the title to something like "Senior Full-Stack Engineer" for better Title vector alignment. The Title vector carries 35% of the semantic search weight.
</Tip>

<Tip>
  **Use LinkedIn import for candidates with scanned CVs.** If a candidate only has a scanned PDF that cannot be processed by the CV upload pipeline (image-only, no text), LinkedIn import is the best alternative. The EnrichLayer API always returns structured text data regardless of the candidate's CV format.
</Tip>

## Related

* [Managing Candidate Profiles](/candidates/managing-profiles) -- Edit and maintain imported profiles
* [Skills & Expertise](/candidates/skills-and-expertise) -- Review and confirm extracted skills
* [How Matching Works](/candidates/matching/how-matching-works) -- Understand the AI matching pipeline
* [Uploading a CV](/candidates/uploading-a-cv) -- Alternative method for adding candidates
