{"id":26503074,"url":"https://github.com/borgesenioc/ethical-linkedin-profile-extractor","last_synced_at":"2026-04-13T12:31:56.510Z","repository":{"id":279064317,"uuid":"937184598","full_name":"borgesenioc/ethical-linkedin-profile-extractor","owner":"borgesenioc","description":"A simple and efficient node web app that extracts public Linkedin profile data to CSVs for free.","archived":false,"fork":false,"pushed_at":"2025-03-12T21:30:27.000Z","size":126,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-20T19:12:49.064Z","etag":null,"topics":["api","csv","javascript","linkedin","node","professional","profile","scraping","url"],"latest_commit_sha":null,"homepage":"https://linkedin-private-extractor-4goy-enios-projects-76a72274.vercel.app/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/borgesenioc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-22T14:39:17.000Z","updated_at":"2025-03-12T21:30:31.000Z","dependencies_parsed_at":"2025-02-23T15:24:04.058Z","dependency_job_id":"16615222-a300-492b-b392-14979c572a8e","html_url":"https://github.com/borgesenioc/ethical-linkedin-profile-extractor","commit_stats":null,"previous_names":["borgesenioc/linkedin-private-extractor","borgesenioc/ethical-linkedin-profile-extractor"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/borgesenioc/ethical-linkedin-profile-extractor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borgesenioc%2Fethical-linkedin-profile-extractor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borgesenioc%2Fethical-linkedin-profile-extractor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borgesenioc%2Fethical-linkedin-profile-extractor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borgesenioc%2Fethical-linkedin-profile-extractor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/borgesenioc","download_url":"https://codeload.github.com/borgesenioc/ethical-linkedin-profile-extractor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borgesenioc%2Fethical-linkedin-profile-extractor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31753089,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T09:16:15.125Z","status":"ssl_error","status_checked_at":"2026-04-13T09:16:05.023Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","csv","javascript","linkedin","node","professional","profile","scraping","url"],"created_at":"2025-03-20T18:58:00.666Z","updated_at":"2026-04-13T12:31:56.489Z","avatar_url":"https://github.com/borgesenioc.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ethical LinkedIn Profile Extractor\n\nNon-corporate developers have a hard time accessing the LinkedIn API to extract user-profile data.\n\nOn the other hand, scraping LinkedIn profiles with bots and browser-controlled apps is unethical and risky.\n\nThis solution addresses both concerns: it is an open-source web app that extracts publicly available LinkedIn profile data and converts it into CSV.\n\nIt is composed of a minimalistic BEM frontend, an Express JS server, and deployed on Vercel.\n\nThe LinkedIn profile data is acquired from Bright Data’s Scraper API, so it has free starting funds for the first 1000 profiles for any developer forking this repo.\n\n---\n\n## Live Demo\n\nCheck out the live version here:  \n[https://linkedin-private-extractor-4goy.vercel.app/](https://linkedin-private-extractor-4goy.vercel.app/)\n\n---\n\n## Brief Context\n\nThis project provides a comliant, low-cost way to extract LinkedIn profile data that is publicly accessible (i.e., not behind login) and convert it to CSV for rapid prototyping. It bypasses LinkedIn’s CSV and API limitations, giving users quick, accurate results using a streamlined, minimal codebase.\n\n- **Low-cost \u0026 Fast:** Profile data extraction for free or for a fraction of a cent if you go over Bright Data's few thousand free API calls.\n- **Ethical \u0026 Open-Source:** Uses publicly available data only. Most LinkedIn profiles are fully available in incognito mode, but each LinkedIn user can choose their own privacy levels.\n- **Efficient:** Converts complex profile data (including multiple positions) into a single CSV row.\n\n---\n\n## Acceptance Criteria\n\n1. **Ease of Use:**  \n   Users can extract a CSV file with public LinkedIn data using a simple URL input.\n2. **Speed \u0026 Accuracy:**  \n   The CSV extraction is performed quickly and the CSV file accurately reflects the profile data.\n3. **Scalability:**  \n   The tool is built with modularity and simplicity in mind, making it easy to adapt and extend.\n\n---\n\n## Draft Solution\n\n1. **User Input:**\n\n   - The user enters a LinkedIn profile URL into a single-line input field.\n   - On clicking \"Convert to CSV\", the script reads the URL.\n\n2. **Data Extraction:**\n\n   - The script makes a (simulated) API call to trigger a scraping process.\n   - The returned profile JSON is processed by a mapping function that flattens and converts the data into CSV format.\n\n3. **CSV Generation \u0026 Download:**\n   - Once the conversion is complete, a confirmation message is displayed.\n   - The CSV file is then generated and downloaded automatically.\n\n---\n\n### File Structure\n\n```\nThe project is structured to keep client-side assets and server code separate for clarity and maintainability:\nethical-linkedin-profile-extractor/\n├── public/\n│ ├── index.html # Main HTML file\n│ ├── favicon.ico # Favicon for the site\n│ ├── css/\n│ │ ├── pages/\n│ │ │ └── index.css # Page-specific styles\n│ │ └── blocks/\n│ │ └── header.css # Header styling (see note below)\n│ ├── images/\n│ │ └── profile_icon.png # Icon used in the header\n│ └── js/\n│ ├── events/\n│ │ └── domEvents.js # Client-side event handlers\n│ └── api/\n│ ├── convert.js # API route for triggering scraping\n│ └── checkSnapshot.js # API route for checking CSV readiness\n├── server.js # Express server configuration\n├── package.json # Project metadata and dependencies\n└── .env # Environment variables for API credentials\n```\n\n### Dependencies\n\n- **Express:** For serving static assets and handling API endpoints.\n- **Axios:** For making HTTP requests to the scraping API.\n- **Dotenv:** For managing environment variables.\n- **Prettier:** For code formatting and consistency.\n\nThese dependencies ensure that the project remains lightweight while still being powerful and extendable.\n\n---\n\n## Server Structure\n\nThe Express server (`server.js`) is responsible for:\n\n- Serving static files from the `public` directory.\n- Handling API endpoints under `/api/` for both converting the profile data and checking the scraping status.\n\nThis separation keeps the code modular and allows you to maintain the client-side logic (DOM interactions) separately from the server-side API logic.\n\n---\n\n## Screenshots\n\nBelow is a screenshot of the main screen:\n\n![Main Screen](./path/to/screenshot.png)\n\n_Note: Replace `./path/to/screenshot.png` with the actual path to your screenshot image file._\n\n---\n\n## Check All My Projects\n\nFor more projects and details, visit:  \n[Portfolio Projects - Enio Borges](https://www.notion.so/Portfolio-Projects-Enio-Borges-9a05de4958944474bcc4579251e99f27?pvs=21)\n\n---\n\n## Final Thoughts\n\nThe **Ethical LinkedIn Profile Extractor** is designed to be simple, modular, and easy to understand—even for engineers who are new to the project. With a clear file structure and minimal dependencies, this tool exemplifies an efficient approach to solving a common problem with LinkedIn data extraction.\n\nFeel free to fork, contribute, or use this project as a starting point for your own developments!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fborgesenioc%2Fethical-linkedin-profile-extractor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fborgesenioc%2Fethical-linkedin-profile-extractor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fborgesenioc%2Fethical-linkedin-profile-extractor/lists"}