Repository files navigation

NodeJS LinkedIn API

Build

NodeJS Wrapper API for LinkedIn API, written in TypeScript.
No tokens are needed for using this API, only a working LinkedIn account.

Installation

npm install linkedin-private-api

Example usage

Check out the post I've written that describes a great example of how to use this library.
Also, see a list of examples here.

import{Client}from'linkedin-private-api';constusername=process.env.USERNAMEasstring;constpassword=process.env.PASSWORDasstring;(async()=>{// Loginconstclient=newClient();awaitclient.login.userPass({ username, password });// Search for React development jobs in IsraelconstjobsScroller=awaitclient.search.searchJobs({keywords: 'React',filters: {location: 'Israel'},limit: 20,skip: 5,});const[someReactJobHit]=awaitjobsScroller.scrollNext();constjobCompanyName=someReactJobHit.hitInfo.jobPosting.companyDetails.company.name;// Fetch the job's companyconstcompaniesScroller=awaitclient.search.searchCompanies({keywords: jobCompanyName});const[{company: jobCompany}]=awaitcompaniesScroller.scrollNext();// Search for profiles and send an invitationconstpeopleScroller=awaitclient.search.searchPeople({keywords: 'Bill Gates'});const[{profile: billGates}]=awaitpeopleScroller.scrollNext();awaitclient.invitation.sendInvitation({profileId: billGates.profileId,trackingId: billGates.trackingId,});// Search in my connectionsconstownConnectionsScroller=awaitclient.search.searchOwnConnections({keywords: 'Bill Gates',limit: 1});constconnections=awaitownConnectionsScroller.scrollNext();// Get conversationconst[billConversation]=awaitclient.conversation.getConversations({recipients: billGates.profileId}).scrollNext();constconversationMessages=awaitclient.message.getMessages({conversationId: billConversation.conversationId}).scrollNext()// Send a messageconstsentMessage=awaitclient.message.sendMessage({profileId: billGates.profileId,text: 'Hey Bill!',});})();

API

Repositories

Classes that expose methods for communicating with linkedin API.
Each repository describes a LinkedIn entity that we can operate on it. Example: InvitationRepository.

The methods are divided into 3 types:

  • Single entity getters - example: conversation.getConversation({ conversationId: CONVERSATION_ID }) Single entity getters return a LinkedIn Entity.

  • Multiple entities getters - for example invitation.getSentInvitations({ skip: 10, limit: 5 })
    Multiple entities getters return a Scroller.

  • Mutations - for example invitation.sendInvitation({ ... })
    Mutations return a Response entity

NameExample UsageDocs Reference
loginclient.login.userPass(...)Login Docs
searchclient.search.searchPeople()Search Docs
profileclient.profile.getOwnProfile()Profile Docs
invitationclient.invitation.getReceivedInvitations()Invitation Docs
conversationclient.conversation.getConversation(...)Conversation Docs
messageclient.message.getMessages(...)Message Docs

Entities

Interfaces that describe LinkedIn objects. For example - Conversation object.
Most of those entities contain the properties returned from the LinkedIn response and in addition to these properties, the API adds some extra properties to make the usage a bit easier.

The full list of entities can be found here, this is the list of the most important ones:

Entities
Profile
MiniProfile
MiniCompany
Invitation
Conversation
Message
CompanySearchHit
PeopleSearchHit
JobSearchHit
MessageCreateResponse

Scrollers

Wrapper classes that enable a convenient work with paginated responses. For example - PeopleScroller.
Most of LinkedIn requests return paginated responses, (just like in the UI), scrollers just provide a structured way to navigate between pages.

There are two types of scrollers:

  • Index scroller - Accepts 2 properties:
    skip (number) - Starting index (How many entities to skip).
    limit (number) - How many entities to fetch on each iteration.

  • Time scrollers - Accepts one property:
    createdBefore (Date) - Defines the point of time to start fetching entities.

Example:

// index scrollerletcompaniesScroller=client.search.searchCompanies();letcompanies=awaitcompaniesScroller.scrollNext();// returns first page with 10 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding skip and limitcompaniesScroller=client.search.searchCompanies({skip: 100,limit: 1});companies=awaitcompaniesScroller.scrollNext();// returns first page with 1 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding createdBefore for time scrollerconsttwoDaysAgo=moment().subtract(2,'days').toDate();letmessagesScroller=client.message.getMessages({conversationId: CONVERSATION_ID,createdBefore: twoDaysAgo});messages=awaitcompaniesScroller.scrollNext();

What's coming next?

A lot!

This is a new project, and as such, there's a lot that need to be done.
Some new features that I expect to develop soon:

  • Media support - fetch, like, comment and create a new post.
  • Invitation improvements - be able to do some more actions like "remove connection".
  • Improve login API
  • Add services so automate common workflows

Want a specific feature? Please open a feature request :)
Also, i'll be more than happy to welcome new contributors to this project.

Legal

This code is in no way affiliated with, authorized, maintained, sponsored or endorsed by Linkedin or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Note that using this API might cause your account being banned.
Always take care; we cannot be held for any account being banned.

About

LinkedIn NodeJS API, written in TypeScript.

Topics

Resources

Stars

293 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

NodeJS LinkedIn API

Build

NodeJS Wrapper API for LinkedIn API, written in TypeScript.
No tokens are needed for using this API, only a working LinkedIn account.

Installation

npm install linkedin-private-api

Example usage

Check out the post I've written that describes a great example of how to use this library.
Also, see a list of examples here.

import{Client}from'linkedin-private-api';constusername=process.env.USERNAMEasstring;constpassword=process.env.PASSWORDasstring;(async()=>{// Loginconstclient=newClient();awaitclient.login.userPass({ username, password });// Search for React development jobs in IsraelconstjobsScroller=awaitclient.search.searchJobs({keywords: 'React',filters: {location: 'Israel'},limit: 20,skip: 5,});const[someReactJobHit]=awaitjobsScroller.scrollNext();constjobCompanyName=someReactJobHit.hitInfo.jobPosting.companyDetails.company.name;// Fetch the job's companyconstcompaniesScroller=awaitclient.search.searchCompanies({keywords: jobCompanyName});const[{company: jobCompany}]=awaitcompaniesScroller.scrollNext();// Search for profiles and send an invitationconstpeopleScroller=awaitclient.search.searchPeople({keywords: 'Bill Gates'});const[{profile: billGates}]=awaitpeopleScroller.scrollNext();awaitclient.invitation.sendInvitation({profileId: billGates.profileId,trackingId: billGates.trackingId,});// Search in my connectionsconstownConnectionsScroller=awaitclient.search.searchOwnConnections({keywords: 'Bill Gates',limit: 1});constconnections=awaitownConnectionsScroller.scrollNext();// Get conversationconst[billConversation]=awaitclient.conversation.getConversations({recipients: billGates.profileId}).scrollNext();constconversationMessages=awaitclient.message.getMessages({conversationId: billConversation.conversationId}).scrollNext()// Send a messageconstsentMessage=awaitclient.message.sendMessage({profileId: billGates.profileId,text: 'Hey Bill!',});})();

API

Repositories

Classes that expose methods for communicating with linkedin API.
Each repository describes a LinkedIn entity that we can operate on it. Example: InvitationRepository.

The methods are divided into 3 types:

  • Single entity getters - example: conversation.getConversation({ conversationId: CONVERSATION_ID }) Single entity getters return a LinkedIn Entity.

  • Multiple entities getters - for example invitation.getSentInvitations({ skip: 10, limit: 5 })
    Multiple entities getters return a Scroller.

  • Mutations - for example invitation.sendInvitation({ ... })
    Mutations return a Response entity

NameExample UsageDocs Reference
loginclient.login.userPass(...)Login Docs
searchclient.search.searchPeople()Search Docs
profileclient.profile.getOwnProfile()Profile Docs
invitationclient.invitation.getReceivedInvitations()Invitation Docs
conversationclient.conversation.getConversation(...)Conversation Docs
messageclient.message.getMessages(...)Message Docs

Entities

Interfaces that describe LinkedIn objects. For example - Conversation object.
Most of those entities contain the properties returned from the LinkedIn response and in addition to these properties, the API adds some extra properties to make the usage a bit easier.

The full list of entities can be found here, this is the list of the most important ones:

Entities
Profile
MiniProfile
MiniCompany
Invitation
Conversation
Message
CompanySearchHit
PeopleSearchHit
JobSearchHit
MessageCreateResponse

Scrollers

Wrapper classes that enable a convenient work with paginated responses. For example - PeopleScroller.
Most of LinkedIn requests return paginated responses, (just like in the UI), scrollers just provide a structured way to navigate between pages.

There are two types of scrollers:

  • Index scroller - Accepts 2 properties:
    skip (number) - Starting index (How many entities to skip).
    limit (number) - How many entities to fetch on each iteration.

  • Time scrollers - Accepts one property:
    createdBefore (Date) - Defines the point of time to start fetching entities.

Example:

// index scrollerletcompaniesScroller=client.search.searchCompanies();letcompanies=awaitcompaniesScroller.scrollNext();// returns first page with 10 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding skip and limitcompaniesScroller=client.search.searchCompanies({skip: 100,limit: 1});companies=awaitcompaniesScroller.scrollNext();// returns first page with 1 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding createdBefore for time scrollerconsttwoDaysAgo=moment().subtract(2,'days').toDate();letmessagesScroller=client.message.getMessages({conversationId: CONVERSATION_ID,createdBefore: twoDaysAgo});messages=awaitcompaniesScroller.scrollNext();

What's coming next?

A lot!

This is a new project, and as such, there's a lot that need to be done.
Some new features that I expect to develop soon:

  • Media support - fetch, like, comment and create a new post.
  • Invitation improvements - be able to do some more actions like "remove connection".
  • Improve login API
  • Add services so automate common workflows

Want a specific feature? Please open a feature request :)
Also, i'll be more than happy to welcome new contributors to this project.

Legal

This code is in no way affiliated with, authorized, maintained, sponsored or endorsed by Linkedin or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Note that using this API might cause your account being banned.
Always take care; we cannot be held for any account being banned.

About

LinkedIn NodeJS API, written in TypeScript.

Topics

Resources

Stars

293 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NodeJS LinkedIn API

Build

NodeJS Wrapper API for LinkedIn API, written in TypeScript.
No tokens are needed for using this API, only a working LinkedIn account.

Installation

npm install linkedin-private-api

Example usage

Check out the post I've written that describes a great example of how to use this library.
Also, see a list of examples here.

import{Client}from'linkedin-private-api';constusername=process.env.USERNAMEasstring;constpassword=process.env.PASSWORDasstring;(async()=>{// Loginconstclient=newClient();awaitclient.login.userPass({ username, password });// Search for React development jobs in IsraelconstjobsScroller=awaitclient.search.searchJobs({keywords: 'React',filters: {location: 'Israel'},limit: 20,skip: 5,});const[someReactJobHit]=awaitjobsScroller.scrollNext();constjobCompanyName=someReactJobHit.hitInfo.jobPosting.companyDetails.company.name;// Fetch the job's companyconstcompaniesScroller=awaitclient.search.searchCompanies({keywords: jobCompanyName});const[{company: jobCompany}]=awaitcompaniesScroller.scrollNext();// Search for profiles and send an invitationconstpeopleScroller=awaitclient.search.searchPeople({keywords: 'Bill Gates'});const[{profile: billGates}]=awaitpeopleScroller.scrollNext();awaitclient.invitation.sendInvitation({profileId: billGates.profileId,trackingId: billGates.trackingId,});// Search in my connectionsconstownConnectionsScroller=awaitclient.search.searchOwnConnections({keywords: 'Bill Gates',limit: 1});constconnections=awaitownConnectionsScroller.scrollNext();// Get conversationconst[billConversation]=awaitclient.conversation.getConversations({recipients: billGates.profileId}).scrollNext();constconversationMessages=awaitclient.message.getMessages({conversationId: billConversation.conversationId}).scrollNext()// Send a messageconstsentMessage=awaitclient.message.sendMessage({profileId: billGates.profileId,text: 'Hey Bill!',});})();

API

Repositories

Classes that expose methods for communicating with linkedin API.
Each repository describes a LinkedIn entity that we can operate on it. Example: InvitationRepository.

The methods are divided into 3 types:

  • Single entity getters - example: conversation.getConversation({ conversationId: CONVERSATION_ID }) Single entity getters return a LinkedIn Entity.

  • Multiple entities getters - for example invitation.getSentInvitations({ skip: 10, limit: 5 })
    Multiple entities getters return a Scroller.

  • Mutations - for example invitation.sendInvitation({ ... })
    Mutations return a Response entity

NameExample UsageDocs Reference
loginclient.login.userPass(...)Login Docs
searchclient.search.searchPeople()Search Docs
profileclient.profile.getOwnProfile()Profile Docs
invitationclient.invitation.getReceivedInvitations()Invitation Docs
conversationclient.conversation.getConversation(...)Conversation Docs
messageclient.message.getMessages(...)Message Docs

Entities

Interfaces that describe LinkedIn objects. For example - Conversation object.
Most of those entities contain the properties returned from the LinkedIn response and in addition to these properties, the API adds some extra properties to make the usage a bit easier.

The full list of entities can be found here, this is the list of the most important ones:

Entities
Profile
MiniProfile
MiniCompany
Invitation
Conversation
Message
CompanySearchHit
PeopleSearchHit
JobSearchHit
MessageCreateResponse

Scrollers

Wrapper classes that enable a convenient work with paginated responses. For example - PeopleScroller.
Most of LinkedIn requests return paginated responses, (just like in the UI), scrollers just provide a structured way to navigate between pages.

There are two types of scrollers:

  • Index scroller - Accepts 2 properties:
    skip (number) - Starting index (How many entities to skip).
    limit (number) - How many entities to fetch on each iteration.

  • Time scrollers - Accepts one property:
    createdBefore (Date) - Defines the point of time to start fetching entities.

Example:

// index scrollerletcompaniesScroller=client.search.searchCompanies();letcompanies=awaitcompaniesScroller.scrollNext();// returns first page with 10 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding skip and limitcompaniesScroller=client.search.searchCompanies({skip: 100,limit: 1});companies=awaitcompaniesScroller.scrollNext();// returns first page with 1 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding createdBefore for time scrollerconsttwoDaysAgo=moment().subtract(2,'days').toDate();letmessagesScroller=client.message.getMessages({conversationId: CONVERSATION_ID,createdBefore: twoDaysAgo});messages=awaitcompaniesScroller.scrollNext();

What's coming next?

A lot!

This is a new project, and as such, there's a lot that need to be done.
Some new features that I expect to develop soon:

  • Media support - fetch, like, comment and create a new post.
  • Invitation improvements - be able to do some more actions like "remove connection".
  • Improve login API
  • Add services so automate common workflows

Want a specific feature? Please open a feature request :)
Also, i'll be more than happy to welcome new contributors to this project.

Legal

This code is in no way affiliated with, authorized, maintained, sponsored or endorsed by Linkedin or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Note that using this API might cause your account being banned.
Always take care; we cannot be held for any account being banned.

About

LinkedIn NodeJS API, written in TypeScript.

Topics

Resources

Stars

293 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NodeJS LinkedIn API

Build

NodeJS Wrapper API for LinkedIn API, written in TypeScript.
No tokens are needed for using this API, only a working LinkedIn account.

Installation

npm install linkedin-private-api

Example usage

Check out the post I've written that describes a great example of how to use this library.
Also, see a list of examples here.

import{Client}from'linkedin-private-api';constusername=process.env.USERNAMEasstring;constpassword=process.env.PASSWORDasstring;(async()=>{// Loginconstclient=newClient();awaitclient.login.userPass({ username, password });// Search for React development jobs in IsraelconstjobsScroller=awaitclient.search.searchJobs({keywords: 'React',filters: {location: 'Israel'},limit: 20,skip: 5,});const[someReactJobHit]=awaitjobsScroller.scrollNext();constjobCompanyName=someReactJobHit.hitInfo.jobPosting.companyDetails.company.name;// Fetch the job's companyconstcompaniesScroller=awaitclient.search.searchCompanies({keywords: jobCompanyName});const[{company: jobCompany}]=awaitcompaniesScroller.scrollNext();// Search for profiles and send an invitationconstpeopleScroller=awaitclient.search.searchPeople({keywords: 'Bill Gates'});const[{profile: billGates}]=awaitpeopleScroller.scrollNext();awaitclient.invitation.sendInvitation({profileId: billGates.profileId,trackingId: billGates.trackingId,});// Search in my connectionsconstownConnectionsScroller=awaitclient.search.searchOwnConnections({keywords: 'Bill Gates',limit: 1});constconnections=awaitownConnectionsScroller.scrollNext();// Get conversationconst[billConversation]=awaitclient.conversation.getConversations({recipients: billGates.profileId}).scrollNext();constconversationMessages=awaitclient.message.getMessages({conversationId: billConversation.conversationId}).scrollNext()// Send a messageconstsentMessage=awaitclient.message.sendMessage({profileId: billGates.profileId,text: 'Hey Bill!',});})();

API

Repositories

Classes that expose methods for communicating with linkedin API.
Each repository describes a LinkedIn entity that we can operate on it. Example: InvitationRepository.

The methods are divided into 3 types:

  • Single entity getters - example: conversation.getConversation({ conversationId: CONVERSATION_ID }) Single entity getters return a LinkedIn Entity.

  • Multiple entities getters - for example invitation.getSentInvitations({ skip: 10, limit: 5 })
    Multiple entities getters return a Scroller.

  • Mutations - for example invitation.sendInvitation({ ... })
    Mutations return a Response entity

NameExample UsageDocs Reference
loginclient.login.userPass(...)Login Docs
searchclient.search.searchPeople()Search Docs
profileclient.profile.getOwnProfile()Profile Docs
invitationclient.invitation.getReceivedInvitations()Invitation Docs
conversationclient.conversation.getConversation(...)Conversation Docs
messageclient.message.getMessages(...)Message Docs

Entities

Interfaces that describe LinkedIn objects. For example - Conversation object.
Most of those entities contain the properties returned from the LinkedIn response and in addition to these properties, the API adds some extra properties to make the usage a bit easier.

The full list of entities can be found here, this is the list of the most important ones:

Entities
Profile
MiniProfile
MiniCompany
Invitation
Conversation
Message
CompanySearchHit
PeopleSearchHit
JobSearchHit
MessageCreateResponse

Scrollers

Wrapper classes that enable a convenient work with paginated responses. For example - PeopleScroller.
Most of LinkedIn requests return paginated responses, (just like in the UI), scrollers just provide a structured way to navigate between pages.

There are two types of scrollers:

  • Index scroller - Accepts 2 properties:
    skip (number) - Starting index (How many entities to skip).
    limit (number) - How many entities to fetch on each iteration.

  • Time scrollers - Accepts one property:
    createdBefore (Date) - Defines the point of time to start fetching entities.

Example:

// index scrollerletcompaniesScroller=client.search.searchCompanies();letcompanies=awaitcompaniesScroller.scrollNext();// returns first page with 10 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding skip and limitcompaniesScroller=client.search.searchCompanies({skip: 100,limit: 1});companies=awaitcompaniesScroller.scrollNext();// returns first page with 1 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding createdBefore for time scrollerconsttwoDaysAgo=moment().subtract(2,'days').toDate();letmessagesScroller=client.message.getMessages({conversationId: CONVERSATION_ID,createdBefore: twoDaysAgo});messages=awaitcompaniesScroller.scrollNext();

What's coming next?

A lot!

This is a new project, and as such, there's a lot that need to be done.
Some new features that I expect to develop soon:

  • Media support - fetch, like, comment and create a new post.
  • Invitation improvements - be able to do some more actions like "remove connection".
  • Improve login API
  • Add services so automate common workflows

Want a specific feature? Please open a feature request :)
Also, i'll be more than happy to welcome new contributors to this project.

Legal

This code is in no way affiliated with, authorized, maintained, sponsored or endorsed by Linkedin or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Note that using this API might cause your account being banned.
Always take care; we cannot be held for any account being banned.

About

LinkedIn NodeJS API, written in TypeScript.

Topics

Resources

Stars

293 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

NodeJS LinkedIn API

Build

NodeJS Wrapper API for LinkedIn API, written in TypeScript.
No tokens are needed for using this API, only a working LinkedIn account.

Installation

npm install linkedin-private-api

Example usage

Check out the post I've written that describes a great example of how to use this library.
Also, see a list of examples here.

import{Client}from'linkedin-private-api';constusername=process.env.USERNAMEasstring;constpassword=process.env.PASSWORDasstring;(async()=>{// Loginconstclient=newClient();awaitclient.login.userPass({ username, password });// Search for React development jobs in IsraelconstjobsScroller=awaitclient.search.searchJobs({keywords: 'React',filters: {location: 'Israel'},limit: 20,skip: 5,});const[someReactJobHit]=awaitjobsScroller.scrollNext();constjobCompanyName=someReactJobHit.hitInfo.jobPosting.companyDetails.company.name;// Fetch the job's companyconstcompaniesScroller=awaitclient.search.searchCompanies({keywords: jobCompanyName});const[{company: jobCompany}]=awaitcompaniesScroller.scrollNext();// Search for profiles and send an invitationconstpeopleScroller=awaitclient.search.searchPeople({keywords: 'Bill Gates'});const[{profile: billGates}]=awaitpeopleScroller.scrollNext();awaitclient.invitation.sendInvitation({profileId: billGates.profileId,trackingId: billGates.trackingId,});// Search in my connectionsconstownConnectionsScroller=awaitclient.search.searchOwnConnections({keywords: 'Bill Gates',limit: 1});constconnections=awaitownConnectionsScroller.scrollNext();// Get conversationconst[billConversation]=awaitclient.conversation.getConversations({recipients: billGates.profileId}).scrollNext();constconversationMessages=awaitclient.message.getMessages({conversationId: billConversation.conversationId}).scrollNext()// Send a messageconstsentMessage=awaitclient.message.sendMessage({profileId: billGates.profileId,text: 'Hey Bill!',});})();

API

Repositories

Classes that expose methods for communicating with linkedin API.
Each repository describes a LinkedIn entity that we can operate on it. Example: InvitationRepository.

The methods are divided into 3 types:

  • Single entity getters - example: conversation.getConversation({ conversationId: CONVERSATION_ID }) Single entity getters return a LinkedIn Entity.

  • Multiple entities getters - for example invitation.getSentInvitations({ skip: 10, limit: 5 })
    Multiple entities getters return a Scroller.

  • Mutations - for example invitation.sendInvitation({ ... })
    Mutations return a Response entity

NameExample UsageDocs Reference
loginclient.login.userPass(...)Login Docs
searchclient.search.searchPeople()Search Docs
profileclient.profile.getOwnProfile()Profile Docs
invitationclient.invitation.getReceivedInvitations()Invitation Docs
conversationclient.conversation.getConversation(...)Conversation Docs
messageclient.message.getMessages(...)Message Docs

Entities

Interfaces that describe LinkedIn objects. For example - Conversation object.
Most of those entities contain the properties returned from the LinkedIn response and in addition to these properties, the API adds some extra properties to make the usage a bit easier.

The full list of entities can be found here, this is the list of the most important ones:

Entities
Profile
MiniProfile
MiniCompany
Invitation
Conversation
Message
CompanySearchHit
PeopleSearchHit
JobSearchHit
MessageCreateResponse

Scrollers

Wrapper classes that enable a convenient work with paginated responses. For example - PeopleScroller.
Most of LinkedIn requests return paginated responses, (just like in the UI), scrollers just provide a structured way to navigate between pages.

There are two types of scrollers:

  • Index scroller - Accepts 2 properties:
    skip (number) - Starting index (How many entities to skip).
    limit (number) - How many entities to fetch on each iteration.

  • Time scrollers - Accepts one property:
    createdBefore (Date) - Defines the point of time to start fetching entities.

Example:

// index scrollerletcompaniesScroller=client.search.searchCompanies();letcompanies=awaitcompaniesScroller.scrollNext();// returns first page with 10 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding skip and limitcompaniesScroller=client.search.searchCompanies({skip: 100,limit: 1});companies=awaitcompaniesScroller.scrollNext();// returns first page with 1 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding createdBefore for time scrollerconsttwoDaysAgo=moment().subtract(2,'days').toDate();letmessagesScroller=client.message.getMessages({conversationId: CONVERSATION_ID,createdBefore: twoDaysAgo});messages=awaitcompaniesScroller.scrollNext();

What's coming next?

A lot!

This is a new project, and as such, there's a lot that need to be done.
Some new features that I expect to develop soon:

  • Media support - fetch, like, comment and create a new post.
  • Invitation improvements - be able to do some more actions like "remove connection".
  • Improve login API
  • Add services so automate common workflows

Want a specific feature? Please open a feature request :)
Also, i'll be more than happy to welcome new contributors to this project.

Legal

This code is in no way affiliated with, authorized, maintained, sponsored or endorsed by Linkedin or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Note that using this API might cause your account being banned.
Always take care; we cannot be held for any account being banned.

About

LinkedIn NodeJS API, written in TypeScript.

Topics

Resources

Stars

293 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NodeJS LinkedIn API

Build

NodeJS Wrapper API for LinkedIn API, written in TypeScript.
No tokens are needed for using this API, only a working LinkedIn account.

Installation

npm install linkedin-private-api

Example usage

Check out the post I've written that describes a great example of how to use this library.
Also, see a list of examples here.

import{Client}from'linkedin-private-api';constusername=process.env.USERNAMEasstring;constpassword=process.env.PASSWORDasstring;(async()=>{// Loginconstclient=newClient();awaitclient.login.userPass({ username, password });// Search for React development jobs in IsraelconstjobsScroller=awaitclient.search.searchJobs({keywords: 'React',filters: {location: 'Israel'},limit: 20,skip: 5,});const[someReactJobHit]=awaitjobsScroller.scrollNext();constjobCompanyName=someReactJobHit.hitInfo.jobPosting.companyDetails.company.name;// Fetch the job's companyconstcompaniesScroller=awaitclient.search.searchCompanies({keywords: jobCompanyName});const[{company: jobCompany}]=awaitcompaniesScroller.scrollNext();// Search for profiles and send an invitationconstpeopleScroller=awaitclient.search.searchPeople({keywords: 'Bill Gates'});const[{profile: billGates}]=awaitpeopleScroller.scrollNext();awaitclient.invitation.sendInvitation({profileId: billGates.profileId,trackingId: billGates.trackingId,});// Search in my connectionsconstownConnectionsScroller=awaitclient.search.searchOwnConnections({keywords: 'Bill Gates',limit: 1});constconnections=awaitownConnectionsScroller.scrollNext();// Get conversationconst[billConversation]=awaitclient.conversation.getConversations({recipients: billGates.profileId}).scrollNext();constconversationMessages=awaitclient.message.getMessages({conversationId: billConversation.conversationId}).scrollNext()// Send a messageconstsentMessage=awaitclient.message.sendMessage({profileId: billGates.profileId,text: 'Hey Bill!',});})();

API

Repositories

Classes that expose methods for communicating with linkedin API.
Each repository describes a LinkedIn entity that we can operate on it. Example: InvitationRepository.

The methods are divided into 3 types:

  • Single entity getters - example: conversation.getConversation({ conversationId: CONVERSATION_ID }) Single entity getters return a LinkedIn Entity.

  • Multiple entities getters - for example invitation.getSentInvitations({ skip: 10, limit: 5 })
    Multiple entities getters return a Scroller.

  • Mutations - for example invitation.sendInvitation({ ... })
    Mutations return a Response entity

NameExample UsageDocs Reference
loginclient.login.userPass(...)Login Docs
searchclient.search.searchPeople()Search Docs
profileclient.profile.getOwnProfile()Profile Docs
invitationclient.invitation.getReceivedInvitations()Invitation Docs
conversationclient.conversation.getConversation(...)Conversation Docs
messageclient.message.getMessages(...)Message Docs

Entities

Interfaces that describe LinkedIn objects. For example - Conversation object.
Most of those entities contain the properties returned from the LinkedIn response and in addition to these properties, the API adds some extra properties to make the usage a bit easier.

The full list of entities can be found here, this is the list of the most important ones:

Entities
Profile
MiniProfile
MiniCompany
Invitation
Conversation
Message
CompanySearchHit
PeopleSearchHit
JobSearchHit
MessageCreateResponse

Scrollers

Wrapper classes that enable a convenient work with paginated responses. For example - PeopleScroller.
Most of LinkedIn requests return paginated responses, (just like in the UI), scrollers just provide a structured way to navigate between pages.

There are two types of scrollers:

  • Index scroller - Accepts 2 properties:
    skip (number) - Starting index (How many entities to skip).
    limit (number) - How many entities to fetch on each iteration.

  • Time scrollers - Accepts one property:
    createdBefore (Date) - Defines the point of time to start fetching entities.

Example:

// index scrollerletcompaniesScroller=client.search.searchCompanies();letcompanies=awaitcompaniesScroller.scrollNext();// returns first page with 10 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding skip and limitcompaniesScroller=client.search.searchCompanies({skip: 100,limit: 1});companies=awaitcompaniesScroller.scrollNext();// returns first page with 1 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding createdBefore for time scrollerconsttwoDaysAgo=moment().subtract(2,'days').toDate();letmessagesScroller=client.message.getMessages({conversationId: CONVERSATION_ID,createdBefore: twoDaysAgo});messages=awaitcompaniesScroller.scrollNext();

What's coming next?

A lot!

This is a new project, and as such, there's a lot that need to be done.
Some new features that I expect to develop soon:

  • Media support - fetch, like, comment and create a new post.
  • Invitation improvements - be able to do some more actions like "remove connection".
  • Improve login API
  • Add services so automate common workflows

Want a specific feature? Please open a feature request :)
Also, i'll be more than happy to welcome new contributors to this project.

Legal

This code is in no way affiliated with, authorized, maintained, sponsored or endorsed by Linkedin or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Note that using this API might cause your account being banned.
Always take care; we cannot be held for any account being banned.

About

LinkedIn NodeJS API, written in TypeScript.

Topics

Resources

Stars

293 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NodeJS LinkedIn API

Build

NodeJS Wrapper API for LinkedIn API, written in TypeScript.
No tokens are needed for using this API, only a working LinkedIn account.

Installation

npm install linkedin-private-api

Example usage

Check out the post I've written that describes a great example of how to use this library.
Also, see a list of examples here.

import{Client}from'linkedin-private-api';constusername=process.env.USERNAMEasstring;constpassword=process.env.PASSWORDasstring;(async()=>{// Loginconstclient=newClient();awaitclient.login.userPass({ username, password });// Search for React development jobs in IsraelconstjobsScroller=awaitclient.search.searchJobs({keywords: 'React',filters: {location: 'Israel'},limit: 20,skip: 5,});const[someReactJobHit]=awaitjobsScroller.scrollNext();constjobCompanyName=someReactJobHit.hitInfo.jobPosting.companyDetails.company.name;// Fetch the job's companyconstcompaniesScroller=awaitclient.search.searchCompanies({keywords: jobCompanyName});const[{company: jobCompany}]=awaitcompaniesScroller.scrollNext();// Search for profiles and send an invitationconstpeopleScroller=awaitclient.search.searchPeople({keywords: 'Bill Gates'});const[{profile: billGates}]=awaitpeopleScroller.scrollNext();awaitclient.invitation.sendInvitation({profileId: billGates.profileId,trackingId: billGates.trackingId,});// Search in my connectionsconstownConnectionsScroller=awaitclient.search.searchOwnConnections({keywords: 'Bill Gates',limit: 1});constconnections=awaitownConnectionsScroller.scrollNext();// Get conversationconst[billConversation]=awaitclient.conversation.getConversations({recipients: billGates.profileId}).scrollNext();constconversationMessages=awaitclient.message.getMessages({conversationId: billConversation.conversationId}).scrollNext()// Send a messageconstsentMessage=awaitclient.message.sendMessage({profileId: billGates.profileId,text: 'Hey Bill!',});})();

API

Repositories

Classes that expose methods for communicating with linkedin API.
Each repository describes a LinkedIn entity that we can operate on it. Example: InvitationRepository.

The methods are divided into 3 types:

  • Single entity getters - example: conversation.getConversation({ conversationId: CONVERSATION_ID }) Single entity getters return a LinkedIn Entity.

  • Multiple entities getters - for example invitation.getSentInvitations({ skip: 10, limit: 5 })
    Multiple entities getters return a Scroller.

  • Mutations - for example invitation.sendInvitation({ ... })
    Mutations return a Response entity

NameExample UsageDocs Reference
loginclient.login.userPass(...)Login Docs
searchclient.search.searchPeople()Search Docs
profileclient.profile.getOwnProfile()Profile Docs
invitationclient.invitation.getReceivedInvitations()Invitation Docs
conversationclient.conversation.getConversation(...)Conversation Docs
messageclient.message.getMessages(...)Message Docs

Entities

Interfaces that describe LinkedIn objects. For example - Conversation object.
Most of those entities contain the properties returned from the LinkedIn response and in addition to these properties, the API adds some extra properties to make the usage a bit easier.

The full list of entities can be found here, this is the list of the most important ones:

Entities
Profile
MiniProfile
MiniCompany
Invitation
Conversation
Message
CompanySearchHit
PeopleSearchHit
JobSearchHit
MessageCreateResponse

Scrollers

Wrapper classes that enable a convenient work with paginated responses. For example - PeopleScroller.
Most of LinkedIn requests return paginated responses, (just like in the UI), scrollers just provide a structured way to navigate between pages.

There are two types of scrollers:

  • Index scroller - Accepts 2 properties:
    skip (number) - Starting index (How many entities to skip).
    limit (number) - How many entities to fetch on each iteration.

  • Time scrollers - Accepts one property:
    createdBefore (Date) - Defines the point of time to start fetching entities.

Example:

// index scrollerletcompaniesScroller=client.search.searchCompanies();letcompanies=awaitcompaniesScroller.scrollNext();// returns first page with 10 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding skip and limitcompaniesScroller=client.search.searchCompanies({skip: 100,limit: 1});companies=awaitcompaniesScroller.scrollNext();// returns first page with 1 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding createdBefore for time scrollerconsttwoDaysAgo=moment().subtract(2,'days').toDate();letmessagesScroller=client.message.getMessages({conversationId: CONVERSATION_ID,createdBefore: twoDaysAgo});messages=awaitcompaniesScroller.scrollNext();

What's coming next?

A lot!

This is a new project, and as such, there's a lot that need to be done.
Some new features that I expect to develop soon:

  • Media support - fetch, like, comment and create a new post.
  • Invitation improvements - be able to do some more actions like "remove connection".
  • Improve login API
  • Add services so automate common workflows

Want a specific feature? Please open a feature request :)
Also, i'll be more than happy to welcome new contributors to this project.

Legal

This code is in no way affiliated with, authorized, maintained, sponsored or endorsed by Linkedin or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Note that using this API might cause your account being banned.
Always take care; we cannot be held for any account being banned.

About

LinkedIn NodeJS API, written in TypeScript.

Topics

Resources

Stars

293 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

NodeJS LinkedIn API

Build

NodeJS Wrapper API for LinkedIn API, written in TypeScript.
No tokens are needed for using this API, only a working LinkedIn account.

Installation

npm install linkedin-private-api

Example usage

Check out the post I've written that describes a great example of how to use this library.
Also, see a list of examples here.

import{Client}from'linkedin-private-api';constusername=process.env.USERNAMEasstring;constpassword=process.env.PASSWORDasstring;(async()=>{// Loginconstclient=newClient();awaitclient.login.userPass({ username, password });// Search for React development jobs in IsraelconstjobsScroller=awaitclient.search.searchJobs({keywords: 'React',filters: {location: 'Israel'},limit: 20,skip: 5,});const[someReactJobHit]=awaitjobsScroller.scrollNext();constjobCompanyName=someReactJobHit.hitInfo.jobPosting.companyDetails.company.name;// Fetch the job's companyconstcompaniesScroller=awaitclient.search.searchCompanies({keywords: jobCompanyName});const[{company: jobCompany}]=awaitcompaniesScroller.scrollNext();// Search for profiles and send an invitationconstpeopleScroller=awaitclient.search.searchPeople({keywords: 'Bill Gates'});const[{profile: billGates}]=awaitpeopleScroller.scrollNext();awaitclient.invitation.sendInvitation({profileId: billGates.profileId,trackingId: billGates.trackingId,});// Search in my connectionsconstownConnectionsScroller=awaitclient.search.searchOwnConnections({keywords: 'Bill Gates',limit: 1});constconnections=awaitownConnectionsScroller.scrollNext();// Get conversationconst[billConversation]=awaitclient.conversation.getConversations({recipients: billGates.profileId}).scrollNext();constconversationMessages=awaitclient.message.getMessages({conversationId: billConversation.conversationId}).scrollNext()// Send a messageconstsentMessage=awaitclient.message.sendMessage({profileId: billGates.profileId,text: 'Hey Bill!',});})();

API

Repositories

Classes that expose methods for communicating with linkedin API.
Each repository describes a LinkedIn entity that we can operate on it. Example: InvitationRepository.

The methods are divided into 3 types:

  • Single entity getters - example: conversation.getConversation({ conversationId: CONVERSATION_ID }) Single entity getters return a LinkedIn Entity.

  • Multiple entities getters - for example invitation.getSentInvitations({ skip: 10, limit: 5 })
    Multiple entities getters return a Scroller.

  • Mutations - for example invitation.sendInvitation({ ... })
    Mutations return a Response entity

NameExample UsageDocs Reference
loginclient.login.userPass(...)Login Docs
searchclient.search.searchPeople()Search Docs
profileclient.profile.getOwnProfile()Profile Docs
invitationclient.invitation.getReceivedInvitations()Invitation Docs
conversationclient.conversation.getConversation(...)Conversation Docs
messageclient.message.getMessages(...)Message Docs

Entities

Interfaces that describe LinkedIn objects. For example - Conversation object.
Most of those entities contain the properties returned from the LinkedIn response and in addition to these properties, the API adds some extra properties to make the usage a bit easier.

The full list of entities can be found here, this is the list of the most important ones:

Entities
Profile
MiniProfile
MiniCompany
Invitation
Conversation
Message
CompanySearchHit
PeopleSearchHit
JobSearchHit
MessageCreateResponse

Scrollers

Wrapper classes that enable a convenient work with paginated responses. For example - PeopleScroller.
Most of LinkedIn requests return paginated responses, (just like in the UI), scrollers just provide a structured way to navigate between pages.

There are two types of scrollers:

  • Index scroller - Accepts 2 properties:
    skip (number) - Starting index (How many entities to skip).
    limit (number) - How many entities to fetch on each iteration.

  • Time scrollers - Accepts one property:
    createdBefore (Date) - Defines the point of time to start fetching entities.

Example:

// index scrollerletcompaniesScroller=client.search.searchCompanies();letcompanies=awaitcompaniesScroller.scrollNext();// returns first page with 10 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding skip and limitcompaniesScroller=client.search.searchCompanies({skip: 100,limit: 1});companies=awaitcompaniesScroller.scrollNext();// returns first page with 1 resultscompanies=awaitcompaniesScroller.scrollNext();// next pagecompanies=awaitcompaniesScroller.scrollBack();// previous page// overriding createdBefore for time scrollerconsttwoDaysAgo=moment().subtract(2,'days').toDate();letmessagesScroller=client.message.getMessages({conversationId: CONVERSATION_ID,createdBefore: twoDaysAgo});messages=awaitcompaniesScroller.scrollNext();

What's coming next?

A lot!

This is a new project, and as such, there's a lot that need to be done.
Some new features that I expect to develop soon:

  • Media support - fetch, like, comment and create a new post.
  • Invitation improvements - be able to do some more actions like "remove connection".
  • Improve login API
  • Add services so automate common workflows

Want a specific feature? Please open a feature request :)
Also, i'll be more than happy to welcome new contributors to this project.

Legal

This code is in no way affiliated with, authorized, maintained, sponsored or endorsed by Linkedin or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Note that using this API might cause your account being banned.
Always take care; we cannot be held for any account being banned.

About

LinkedIn NodeJS API, written in TypeScript.

Topics

Resources

Stars

293 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages