How I automated the LinkedIn Profile Extract and JSON Resume Building with Bright Data & Google Gemini
Ranjan Dailata

Ranjan Dailata @ranjancse

About: A Professional based out of India specialized in handling AI-powered automations. Contact me at ranjancse@gmail.com, LinkedIn - https://www.linkedin.com/in/ranjan-dailata/

Joined:
Nov 16, 2023

How I automated the LinkedIn Profile Extract and JSON Resume Building with Bright Data & Google Gemini

Publish Date: Jun 6
7 2

LinkedIn Profile Extract and Build JSON Resume with Bright Data & Google Gemini

Introduction

If you've ever found yourself copy-pasting LinkedIn profile or trying to piece together someone's work history for a resume, you know how tedious (and time-consuming) it can be. What if I told you there's a smarter, faster way to fully automate and build cleanly structured, and ready for any kind of hiring or profiling system?

Let me introduce you to the LinkedIn Profile Extract and JSON Resume Builder — An n8n-powered automation that does all the heavy lifting for you.

With the help of Bright Data for reliable LinkedIn scraping and Google Gemini for intelligent data extraction and formatting, this workflow turns raw profile data into a polished, standards-compliant JSON Resume ready to be used in HR tools, recruiting platforms, or even personal websites.

Whether you're building a talent pipeline, automating candidate intake, or just love cool workflows that combine scraping + AI, this one’s for you.

New users of Bright Data, please make sure to sign-up here - Bright Data

What Problem does it solve?

Parsing resumes or LinkedIn profiles into machine-readable formats is often a manual, error-prone process. Most scraping tools either fail due to anti-bot protections or return unstructured HTML that’s hard to work with.

This workflow solves that by:

  • Using Bright Data’s Web Unlocker for reliable, CAPTCHA-free LinkedIn scraping

  • Extracting clean text and structured profile data via Google Gemini LLM

  • Automatically generating a standards-compliant JSON Resume and Skills

  • Sending the resume to webhooks or storing it for downstream usage

Why Bright Data?

  • Reliable Access to Complex Sites
    Handles sites like LinkedIn, Amazon, and Google with built-in anti-bot evasion and CAPTCHA solving.

  • Global IP Coverage
    Offers rotating residential, datacenter, and mobile proxies from over 195 countries great for geo-specific scraping.

  • API-First Design
    Easy-to-integrate REST APIs that fit well into workflows, backend systems, or tools like n8n, Zapier, or Postman.

  • Smart Unlocking with Web Unlocker
    Automatically handles JavaScript rendering, redirects, cookies, and headers no need to reverse-engineer pages.

  • Scalable & Production-Ready
    Suitable for single profile scraping or scraping thousands of pages with built-in rate limiting and retry logic.

  • Built for Stealth
    Human-like behavior, session rotation, and browser fingerprinting evasion make it hard to detect.

  • Great Logging & Dashboard
    Provides detailed logs, usage stats, and error insights to monitor scraper performance.

  • Enterprise-Level Security
    GDPR & CCPA compliant with secure proxy handling and traffic encryption.

  • Amazing Support
    Offers 24/7 live support, dedicated success engineers, and well-documented SDKs.

JSON Resume

JSON Resume is an open-source, machine-readable format for resumes and CVs, designed to standardize how resume data is structured and shared.

Common use-cases :

  • Resume builders or editors

  • Automated parsing & profile generation

  • Job application bots

  • Personal developer portfolio sites

  • Candidate profiling in ATS/HR tools

Tools I Used

Here's a breakdown of the tools that power this workflow:

n8n

The workflow automation platform that connects everything together. I used n8n for:

  • Triggering the workflow with input

  • Managing the flow of data

  • Integrating API calls and parsing logic

Bright Data

  • Bright Data's Web Unlocker lets you scrape LinkedIn profile pages reliably with rotating IPs, anti-bot bypassing, and proxy management.

Google Gemini

I used Gemini to:

  • Interpret scraped HTML

  • Parse relevant details (experience, skills, education)

  • Generate a structured JSON based on the JSON Resume schema

Download

How It Works

The flow is simple but powerful. Here’s a step-by-step breakdown:

Step 1: Input Node

  • Accepts a LinkedIn profile URL
  • Set the Bright Data zone
  • Set the Webhook URL for the notification purposes

Step 2: Bright Data Web Scraper

  • Makes a request to Bright Data’s Web Unlocker with the LinkedIn URL
  • Receives the raw HTML of the public profile

Step 3: Gemini API - Parse Profile

  • Extract the resume in JSON format. {{ $json.text }} and schema as
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "JSON Resume",
  "type": "object",
  "properties": {
    "basics": {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "label": { "type": "string" },
        "image": { "type": "string", "format": "uri" },
        "email": { "type": "string", "format": "email" },
        "phone": { "type": "string" },
        "url": { "type": "string", "format": "uri" },
        "summary": { "type": "string" },
        "location": {
          "type": "object",
          "properties": {
            "address": { "type": "string" },
            "postalCode": { "type": "string" },
            "city": { "type": "string" },
            "countryCode": { "type": "string" },
            "region": { "type": "string" }
          }
        },
        "profiles": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "network": { "type": "string" },
              "username": { "type": "string" },
              "url": { "type": "string", "format": "uri" }
            }
          }
        }
      }
    },
    "work": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "position": { "type": "string" },
          "url": { "type": "string", "format": "uri" },
          "startDate": { "type": "string", "format": "date" },
          "endDate": { "type": "string", "format": "date" },
          "summary": { "type": "string" },
          "highlights": {
            "type": "array",
            "items": { "type": "string" }
          }
        }
      }
    },
    "volunteer": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "organization": { "type": "string" },
          "position": { "type": "string" },
          "url": { "type": "string", "format": "uri" },
          "startDate": { "type": "string", "format": "date" },
          "endDate": { "type": "string", "format": "date" },
          "summary": { "type": "string" },
          "highlights": {
            "type": "array",
            "items": { "type": "string" }
          }
        }
      }
    },
    "education": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "institution": { "type": "string" },
          "url": { "type": "string", "format": "uri" },
          "area": { "type": "string" },
          "studyType": { "type": "string" },
          "startDate": { "type": "string", "format": "date" },
          "endDate": { "type": "string", "format": "date" },
          "score": { "type": "string" },
          "courses": {
            "type": "array",
            "items": { "type": "string" }
          }
        }
      }
    },
    "awards": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "title": { "type": "string" },
          "date": { "type": "string", "format": "date" },
          "awarder": { "type": "string" },
          "summary": { "type": "string" }
        }
      }
    },
    "certificates": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "date": { "type": "string", "format": "date" },
          "issuer": { "type": "string" },
          "url": { "type": "string", "format": "uri" }
        }
      }
    },
    "publications": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "publisher": { "type": "string" },
          "releaseDate": { "type": "string", "format": "date" },
          "url": { "type": "string", "format": "uri" },
          "summary": { "type": "string" }
        }
      }
    },
    "skills": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "level": { "type": "string" },
          "keywords": {
            "type": "array",
            "items": { "type": "string" }
          }
        }
      }
    },
    "languages": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "language": { "type": "string" },
          "fluency": { "type": "string" }
        }
      }
    },
    "interests": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "keywords": {
            "type": "array",
            "items": { "type": "string" }
          }
        }
      }
    },
    "references": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "reference": { "type": "string" }
        }
      }
    },
    "projects": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "startDate": { "type": "string", "format": "date" },
          "endDate": { "type": "string", "format": "date" },
          "description": { "type": "string" },
          "highlights": {
            "type": "array",
            "items": { "type": "string" }
          },
          "url": { "type": "string", "format": "uri" }
        }
      }
    }
  },
  "required": ["basics"]
}
Enter fullscreen mode Exit fullscreen mode

Extraction of skills

Perform Data Mining and extract the skills from the provided resume {{ $json.text }}

{
    "type": "array",
    "properties": {
        "skill": {
            "type": "string"
        },
        "desc": {
            "type": "string"
        }
    }
}
Enter fullscreen mode Exit fullscreen mode
  • Gemini returns a clean, formatted JSON resume and the skillsets

Step 4: Output / Webhook / Storage
Final JSON resume and skills exported via:

  • Webhook notification
  • Persisted on local disk

Benefits

Here's why this approach is awesome:

  • Zero Manual Copying – No more copy pasting and manual parsing of resume

  • Scalable – Handle hundreds of profiles in batches via API

  • Extensible – Add support for PDFs, Word exports, or visualization

  • Fast Prototyping – All built with low-code, and Gemini handles unstructured data beautifully

Conclusion

The LinkedIn Profile Extract and JSON Resume Builder isn't just a clever tech stack; it's a productivity supercharger. It takes something messy (HTML from a public profile) and transforms it into something beautifully organized (a JSON Resume) that you can plug into databases, ATS systems, websites, or even resume visualizers.

Whether you're a developer building a recruiting platform, a startup automating candidate onboarding, or just someone who enjoys smart automations, this workflow is a powerful example of what's possible when you combine scraping, AI, and no-code tools the right way.

Comments 2 total

Add comment