npm install linkedapi-node
β οΈ Note: This package is currently in beta. Features and APIs are subject to change.
This official Linked API package simplifies interaction with LinkedIn's functionalities by wrapping the Linked API, making it easier to build applications without dealing with complex API calls.
You can find various examples in the /examples
folder to help you get started.
import LinkedApi from "linkedapi-node";
// Initialize with your API tokens
const linkedapi = new LinkedApi({
linkedApiToken: "your-linked-api-token",
identificationToken: "your-identification-token",
});
// Use Linked API for your LinkedIn account automation
const connectionWorkflow = await linkedapi.sendConnectionRequest({
personUrl: "https://www.linkedin.com/in/person1",
message: "It would be great to add you to my network!",
});
await connectionWorkflow.result();
const commentWorkflow = await linkedapi.commentOnPost({
postUrl: "https://www.linkedin.com/posts/post1",
text: "Great post! Thanks for sharing.",
});
await commentWorkflow.result();
// Search companies
const searchCompaniesWorkflow = await linkedapi.searchCompanies({
filter: {
sizes: ["11-50", "51-200", "201-500", "501-1000"],
locations: ["California", "Wyoming", "Texas"],
industries: ["Software Development", "Robotics Engineering"],
},
});
const companiesResult = await searchCompaniesWorkflow.result();
// Retrieving company basic info, employees
const companyWorkflow = await linkedapi.fetchCompany({
companyUrl: "https://www.linkedin.com/company/company1",
retrieveEmployees: true,
employeesRetrievalConfig: {
filter: {
schools: ["Harvard University", "Stanford University"],
},
},
});
const companyResult = await companyWorkflow.result();
Linked API lets you manage LinkedIn accounts programmatically through an API interface.
To use Linked API you must initialize with:
linkedApiToken
β your main token that enables overall Linked API access.identificationToken
β unique token specific to each managed LinkedIn account.
const linkedapi = new LinkedApi({
linkedApiToken: "your-linked-api-token",
identificationToken: "your-identification-token",
});
You can obtain these tokens through Linked API Platform, as demonstrated below:
π Documentation: Documentation
Execute custom LinkedIn automation workflows with raw workflow definitions.
- Parameters:
TWorkflowDefinition
- Custom workflow definition - Returns:
Promise<WorkflowHandler>
- Workflow handler for result management - Documentation: Building Workflows | Executing Workflows | Actions Overview
const workflow = await linkedapi.executeCustomWorkflow({
actionType: "st.searchCompanies",
term: "Tech Inc",
then: { actionType: "st.doForCompanies", ... }
});
const result = await workflow.result();
Retrieve the result of a previously started workflow by its ID.
- Parameters:
string
- Workflow ID - Returns:
Promise<TWorkflowResponse>
- Workflow response with completion data - Documentation: Executing Workflows
const result = await linkedapi.getWorkflowResult("workflow-id-123");
Restore a WorkflowHandler for a previously started workflow using its ID and function name with type safety.
- Parameters:
workflowId: string
- The unique identifier of the workflow to restorefunctionName: TSupportedFunctionName
- The name of the function that was used to create the workflow
- Returns:
Promise<WorkflowHandler<TRestoreResultType<TFunction>>>
- WorkflowHandler with exact result type based on the function name - Type Safety: Full TypeScript inference for exact return types based on the function name
- Documentation: Executing Workflows
// Restore a person fetching workflow with full type safety
const personHandler = await linkedapi.restoreWorkflow(
"workflow-id-123",
"fetchPerson"
);
const personResult = await personHandler.result();
// Restore a company fetching workflow
const companyHandler = await linkedapi.restoreWorkflow(
"workflow-id-456",
"fetchCompany"
);
const companyResult = await companyHandler.result();
Retrieve comprehensive LinkedIn person profile data including experience, education, skills, and posts.
- Parameters:
TBaseFetchPersonParams
- Person URL and data retrieval options - Returns:
Promise<WorkflowHandler<TFetchPersonResult>>
- Person profile data
const personWorkflow = await linkedapi.fetchPerson({
personUrl: "https://www.linkedin.com/in/john-doe",
retrieveExperience: true, // Get work experience and job history
retrieveEducation: true, // Get educational background and degrees
retrieveSkills: true, // Get skills and endorsements
retrieveLanguages: true, // Get languages and proficiency levels
retrievePosts: true, // Get recent posts and articles
retrieveComments: true, // Get comments made by the person
retrieveReactions: true, // Get reactions/likes given by the person
postsRetrievalConfig: {
limit: 20, // Maximum number of posts to retrieve (1-20)
since: "2024-01-01", // Retrieve posts since this date (YYYY-MM-DD)
},
commentsRetrievalConfig: {
limit: 10, // Maximum number of comments to retrieve (1-20)
since: "2024-01-01", // Retrieve comments since this date
},
reactionsRetrievalConfig: {
limit: 15, // Maximum number of reactions to retrieve (1-20)
since: "2024-01-01", // Retrieve reactions since this date
},
});
const personResult = await personWorkflow.result();
Retrieve person data through Sales Navigator for enhanced prospecting capabilities.
- Parameters:
TNvOpenPersonPageParams
- Sales Navigator person parameters - Returns:
Promise<WorkflowHandler<TNvOpenPersonPageResult>>
- Enhanced person data
const nvPersonWorkflow = await linkedapi.salesNavigatorFetchPerson({
personHashedUrl: "https://www.linkedin.com/in/ABC123",
});
const personResult = await nvPersonWorkflow.result();
Retrieve detailed LinkedIn company profile data including employees, posts, and direct messages.
- Parameters:
TBaseFetchCompanyParams
- Company URL and data retrieval options - Returns:
Promise<WorkflowHandler<TFetchCompanyResult>>
- Company profile data
const companyWorkflow = await linkedapi.fetchCompany({
companyUrl: "https://www.linkedin.com/company/microsoft",
retrieveEmployees: true, // Get company employees with their profiles
retrievePosts: true, // Get recent company posts and updates
retrieveDMs: true, // Get decision makers and key personnel
employeesRetrievalConfig: {
limit: 25, // Maximum number of employees to retrieve (1-500)
filter: {
firstName: "John", // Filter by employee first name
lastName: "Smith", // Filter by employee last name
position: "engineer", // Filter by job position/title
locations: ["United States", "Canada"], // Filter by employee locations
industries: ["Software Development"], // Filter by industries
currentCompanies: ["Microsoft", "Google"], // Filter by current companies
previousCompanies: ["Apple", "Amazon"], // Filter by previous companies
schools: ["Stanford University", "MIT"], // Filter by educational background
},
},
postsRetrievalConfig: {
limit: 10, // Maximum number of posts to retrieve (1-20)
since: "2024-01-01", // Retrieve posts since this date (YYYY-MM-DD)
},
dmsRetrievalConfig: {
limit: 5, // Maximum number of decision makers to retrieve
},
});
const companyResult = await companyWorkflow.result();
Retrieve company data through Sales Navigator with advanced filtering and prospecting features.
- Parameters:
TNvBaseFetchCompanyParams
- Sales Navigator company parameters - Returns:
Promise<WorkflowHandler<TNvFetchCompanyResult>>
- Enhanced company data
const nvCompanyWorkflow = await linkedapi.salesNavigatorFetchCompany({
companyHashedUrl: "https://www.linkedin.com/sales/company/1035",
retrieveEmployees: true, // Get company employees with Sales Navigator
retrieveDMs: true, // Get decision makers
employeesRetrievalConfig: {
limit: 25, // Maximum number of employees to retrieve (1-500)
filter: {
firstName: "John",
lastName: "Doe",
positions: ["Manager", "Executive"],
locations: ["New York", "San Francisco", "London"],
industries: ["Software Development", "Professional Services"],
schools: ["Harvard University", "MIT"],
yearsOfExperiences: ["threeToFive", "sixToTen"],
},
},
dmsRetrievalConfig: {
limit: 10, // Maximum number of decision makers to retrieve (1-20)
},
});
const companyResult = await nvCompanyWorkflow.result();
Retrieve detailed information about a LinkedIn post including content, engagement, and comments.
- Parameters:
TFetchPostParams
- Post URL - Returns:
Promise<WorkflowHandler<TFetchPostResult>>
- Post data and metrics
const postWorkflow = await linkedapi.fetchPost({
postUrl: "https://www.linkedin.com/posts/john-doe_activity-123456789",
});
const postResult = await postWorkflow.result();
Search for companies on LinkedIn using standard search with advanced filtering options.
- Parameters:
TSearchCompanyParams
- Search term, filters, and pagination - Returns:
Promise<WorkflowHandler<TSearchCompanyResult[]>>
- Array of company search results
const companySearchWorkflow = await linkedapi.searchCompanies({
term: "software development", // Search term/keywords for company name or description
filter: {
locations: ["San Francisco", "New York", "Seattle"],
industries: ["Technology", "Software", "Artificial Intelligence"],
sizes: ["51-200", "201-500", "501-1000"],
},
limit: 50, // Maximum number of results to return (1-100, default: 10)
});
const companiesResult = await companySearchWorkflow.result();
Search for companies using Sales Navigator with advanced prospecting filters.
- Parameters:
TNvSearchCompanyParams
- Enhanced search parameters for Sales Navigator - Returns:
Promise<WorkflowHandler<TNvSearchCompanyResult[]>>
- Enhanced company search results
const nvCompanySearch = await linkedapi.salesNavigatorSearchCompanies({
term: "enterprise software", // Search term for company name, description, or keywords
filter: {
locations: ["San Francisco", "New York", "London"],
industries: ["Software Development", "Enterprise Software", "SaaS"],
sizes: ["201-500", "501-1000", "1001-5000"],
annualRevenue: {
min: "10", // Minimum annual revenue in millions USD
max: "500", // Maximum annual revenue in millions USD
},
},
limit: 75, // Maximum number of results to return (1-100)
});
const companiesResult = await nvCompanySearch.result();
Search for people on LinkedIn using standard search with location, experience, and company filters.
- Parameters:
TSearchPeopleParams
- Search term, filters, and pagination - Returns:
Promise<WorkflowHandler<TSearchPeopleResult[]>>
- Array of people search results
const peopleSearchWorkflow = await linkedapi.searchPeople({
term: "product manager", // Search term
filter: {
firstName: "John",
lastName: "Doe",
position: "CEO",
locations: ["New York", "San Francisco", "London"],
industries: ["Software Development", "Professional Services"],
currentCompanies: ["Tech Solutions", "Innovatech"],
previousCompanies: ["FutureCorp"],
schools: ["Harvard University", "MIT"],
},
limit: 20, // Maximum number of results to return (1-100, default: 10)
});
const peopleResult = await peopleSearchWorkflow.result();
Search for people using Sales Navigator with advanced prospecting and lead generation filters.
- Parameters:
TNvSearchPeopleParams
- Enhanced search parameters for Sales Navigator - Returns:
Promise<WorkflowHandler<TNvSearchPeopleResult[]>>
- Enhanced people search results
const nvPeopleSearch = await linkedapi.salesNavigatorSearchPeople({
term: "VP Engineering",
limit: 20, // Maximum number of results to return (1-100, default: 10)
filter: {
firstName: "John",
lastName: "Doe",
position: "VP Engineering",
locations: ["New York", "San Francisco", "London"],
industries: ["Software Development", "Professional Services"],
currentCompanies: ["Tech Solutions", "Innovatech"],
previousCompanies: ["FutureCorp"],
schools: ["Harvard University", "MIT"],
yearsOfExperience: ["lessThanOne", "oneToTwo", "threeToFive"],
},
});
const prospectsResult = await nvPeopleSearch.result();
Send connection requests to LinkedIn users with optional personalized messages.
- Parameters:
TSendConnectionRequestParams
- Person URL and optional message - Returns:
Promise<WorkflowHandler<void>>
- Workflow handler (void)
await linkedapi.sendConnectionRequest({
personUrl: "https://www.linkedin.com/in/john-doe",
note: "Hello! I'd love to connect and discuss opportunities.",
});
Check the current connection status with a LinkedIn user.
- Parameters:
TCheckConnectionStatusParams
- Person URL - Returns:
Promise<WorkflowHandler<TCheckConnectionStatusResult>>
- Connection status information
const statusWorkflow = await linkedapi.checkConnectionStatus({
personUrl: "https://www.linkedin.com/in/john-doe",
});
const statusResult = await statusWorkflow.result();
Withdraw previously sent connection requests.
- Parameters:
TWithdrawConnectionRequestParams
- Person URL - Returns:
Promise<WorkflowHandler<void>>
- Workflow handler (void)
await linkedapi.withdrawConnectionRequest({
personUrl: "https://www.linkedin.com/in/john-doe",
});
Retrieve all pending connection requests sent by your account.
- Parameters: None
- Returns:
Promise<WorkflowHandler<TRetrievePendingRequestsResult>>
- List of pending requests
const pendingWorkflow = await linkedapi.retrievePendingRequests();
const pendingResult = await pendingWorkflow.result();
console.log("Pending requests:", pendingResult.data.length);
Retrieve existing connections with advanced filtering options.
- Parameters:
TRetrieveConnectionsParams
- Filter and pagination options - Returns:
Promise<WorkflowHandler<TRetrieveConnectionsResult>>
- List of connections
const connectionsWorkflow = await linkedapi.retrieveConnections({
filter: {
firstName: "John",
positions: ["Engineer", "Manager"],
locations: ["San Francisco", "New York"],
},
limit: 100,
});
Remove existing connections from your LinkedIn network.
- Parameters:
TRemoveConnectionParams
- Person URL - Returns:
Promise<WorkflowHandler<void>>
- Workflow handler (void)
await linkedapi.removeConnection({
personUrl: "https://www.linkedin.com/in/former-colleague",
});
React to LinkedIn posts with various reaction types (like, love, support, etc.).
- Parameters:
TReactToPostParams
- Post URL and reaction type - Returns:
Promise<WorkflowHandler<void>>
- Workflow handler (void)
await linkedapi.reactToPost({
postUrl: "https://www.linkedin.com/posts/john-doe_activity-123456789",
reactionType: "like",
});
Comment on LinkedIn posts to engage with your network.
- Parameters:
TCommentOnPostParams
- Post URL and comment text - Returns:
Promise<WorkflowHandler<void>>
- Workflow handler (void)
await linkedapi.commentOnPost({
postUrl: "https://www.linkedin.com/posts/john-doe_activity-123456789",
text: "Great insight! Thanks for sharing.",
});
Retrieve your LinkedIn Social Selling Index (SSI) score and rankings.
- Parameters: None
- Returns:
Promise<WorkflowHandler<TRetrieveSSIResult>>
- SSI score and industry/network rankings
const ssiWorkflow = await linkedapi.retrieveSSI();
const ssiResult = await ssiWorkflow.result();
Retrieve LinkedIn account performance metrics including profile views and post engagement.
- Parameters: None
- Returns:
Promise<WorkflowHandler<TRetrievePerformanceResult>>
- Performance metrics
const performanceWorkflow = await linkedapi.retrievePerformance();
const performanceResult = await performanceWorkflow.result();
Retrieve Linked API usage statistics for monitoring and optimization.
- Parameters:
TApiUsageStatsParams
- Start and end timestamps (max 30 days apart) - Returns:
Promise<TApiUsageStatsResponse>
- Array of executed actions with success/failure data - Limitations: Maximum 30-day range between start and end timestamps
const endDate = new Date();
const startDate = new Date(endDate.getTime() - 7 * 24 * 60 * 60 * 1000);
const statsResponse = await linkedapi.getApiUsageStats({
start: startDate.toISOString(),
end: endDate.toISOString(),
});
if (statsResponse.success) {
console.log("Total actions:", statsResponse.result?.length);
statsResponse.result?.forEach((action) => {
console.log(
`${action.actionType}: ${action.success ? "SUCCESS" : "FAILED"}`
);
});
}
Send messages to LinkedIn users through standard LinkedIn messaging.
- Parameters:
TSendMessageParams
- Person URL and message text - Returns:
Promise<WorkflowHandler<void>>
- Workflow handler (void)
await linkedapi.sendMessage({
personUrl: "https://www.linkedin.com/in/john-doe",
text: "Hello! I saw your post about AI and wanted to connect.",
});
Sync conversation history with a LinkedIn user for message polling.
- Parameters:
TSyncConversationParams
- Person URL - Returns:
Promise<WorkflowHandler<void>>
- Workflow handler (void) - Related Methods: Use with
pollConversations()
to retrieve message history
await linkedapi.syncConversation({
personUrl: "https://www.linkedin.com/in/john-doe",
});
Send messages through Sales Navigator with enhanced messaging capabilities.
- Parameters:
TNvSendMessageParams
- Person URL, message text, and optional subject - Returns:
Promise<WorkflowHandler<void>>
- Workflow handler (void)
await linkedapi.salesNavigatorSendMessage({
personUrl: "https://www.linkedin.com/sales/people/ABC123",
subject: "Partnership Opportunity",
text: "Hi! I'd love to discuss potential collaboration opportunities.",
});
Sync Sales Navigator conversation for message polling.
- Parameters:
TNvSyncConversationParams
- Person URL - Returns:
Promise<WorkflowHandler<void>>
- Workflow handler (void)
await linkedapi.salesNavigatorSyncConversation({
personUrl: "https://www.linkedin.com/sales/people/ABC123",
});
Poll multiple conversations to retrieve message history and new messages.
- Parameters:
TConversationPollRequest[]
- Array of conversation poll requests - Returns:
Promise<TConversationPollResponse>
- Message history for requested conversations - Prerequisites: Must call
syncConversation()
orsalesNavigatorSyncConversation()
for each person before polling
const response = await linkedapi.pollConversations([
{ personUrl: "https://www.linkedin.com/in/john-doe", type: "st" },
{
personUrl: "https://www.linkedin.com/sales/people/ABC123",
type: "nv",
since: "2024-01-01T00:00:00Z",
},
]);
if (response.success) {
response.result?.forEach((conversation) => {
console.log(
`Messages from ${conversation.personUrl}:`,
conversation.messages
);
});
}
For complex multi-step workflows involving multiple actions, it's recommended to use custom workflows instead of combining predefined methods. Custom workflows provide better performance, atomicity, and error handling by executing all steps server-side in a single workflow execution.
When to use custom workflows:
- Chaining multiple search and data retrieval operations
- Performing bulk actions on search results
- High-volume operations requiring optimal performance
// β
Recommended: Custom workflow for complex operations
const customWorkflow = await linkedapi.executeCustomWorkflow({
actionType: "st.searchCompanies",
term: "AI startup",
filter: { locations: ["San Francisco"], sizes: ["11-50", "51-200"] },
limit: 10,
then: {
actionType: "st.doForCompanies",
then: {
actionType: "st.openCompanyPage",
then: {
actionType: "st.retriveCompanyEmployees",
limit: 5,
filter: {
position: ["manager"]
}
then: {
actionType: "st.doForPeople",
then: {
actionType: "st.sendConnectionRequest",
note: "Hi! I'd love to connect.",
email: "example@example.com"
},
},
}
},
},
});
// vs. β Less efficient: Multiple separate API calls
// (Multiple network requests, no atomicity, complex error handling)
try {
const searchCompaniesWorkflow = await linkedapi.searchCompanies({
term: "AI startup",
filter: { locations: ["San Francisco"], sizes: ["11-50", "51-200"] },
limit: 10,
})
const companies = await searchCompaniesWorkflow.result();
for (company of companies) {
try {
const companyEmployeesWorkflow = await linkedapi.fetchCompany({
retrieveEmployees: true,
employeesRetrievalConfig: {
limit: 5,
filter: {
position: "manager"
}
}
});
const employees = await companyEmployeesWorkflow.result();
for (employee of employees) {
try {
const sendConnectionWorkflow = await linkedapi.sendConnectionRequest({
personUrl: employee.publicUrl,
note: "Hi! I'd love to connect.",
email: "example@example.com"
});
await sendConnectionWorflow.result();
} catch (sendConnectionError) {
console.error(sendConnectionError);
}
}
} catch (companyEmployeesError) {
console.error(companyEmployeesError);
}
}
} catch (searchCompaniesError) {
console.error(searchCompaniesError);
}
π Learn more: Building Custom Workflows | Actions Overview
Linked API workflows are designed to be resilient and stateful. Each workflow receives a unique workflowId
that can be used to retrieve results even if your application restarts or loses connection during execution.
When you start a workflow, you can access its ID immediately and store it for later use:
// Start a workflow and save the ID
const personWorkflow = await linkedapi.fetchPerson({
personUrl: "https://www.linkedin.com/in/john-doe",
retrieveExperience: true,
});
// Save the workflow ID to your database or persistent storage
const workflowId = personWorkflow.workflowId;
console.log("Workflow started with ID:", workflowId);
// Store in database/file/memory for later retrieval
await saveWorkflowToDatabase(workflowId, "fetchPerson");
try {
const person = await personWorkflow.result();
} finally {
await deleteWorkflowFromDatabase(workflowId);
}
If your application restarts or you need to check workflow status later, you can:
- Restore a
WorkflowHandler
usingrestoreWorkflow(workflowId, functionName)
with full type safety
// 1) Raw handler
const rawHandler = await linkedapi.restoreWorkflow(savedWorkflowId);
// 2) Streamlined restoration with function name (wide result type with full type safety)
const handler = await linkedapi.restoreWorkflow(savedWorkflowId, "fetchPerson");
const result = await handler.result();
if (result.data) {
console.log("Person name:", result.data.name);
console.log("Experience count:", result.data.experiences?.length);
}
See examples/restore-workflow.ts
for a full example.
Linked API provides structured error handling for different failure scenarios. There are two types of errors to handle:
LinkedApiError
- throws if a common error occursLinkedApiWorkflowTimeoutError
- throws in case of timeout. ContainsworkflowId
andfunctionName
for future restoration
- Partial failures - when some actions in a workflow succeed but others fail
- Action-specific errors - errors from individual actions within a workflow that don't cause the entire workflow to fail
import LinkedApi, { LinkedApiError } from 'linkedapi-node';
try {
const workflow = await linkedapi.fetchPerson({
personUrl: "https://www.linkedin.com/in/invalid-profile",
});
const result = await workflow.result();
// Check for partial errors in the response
if (result.errors && result.errors.length > 0) {
console.warn("Workflow completed with errors:");
result.errors.forEach((error) => {
console.warn(`- ${error.type}: ${error.message}`);
});
}
// Access the data (may be undefined if workflow failed completely)
if (result.data) {
console.log("Person data:", result.data);
} else {
console.log("No data returned");
}
} catch (error) {
if (error instanceof LinkedApiError) {
console.error("Linked API Error:", error.message);
console.error("Error Type:", error.type);
console.error("Details:", error.details);
} else {
console.error("Unexpected error:", error);
}
}
linkedApiTokenRequired
- Missing API tokeninvalidLinkedApiToken
- Invalid API tokenidentificationTokenRequired
- Missing Indentification tokeninvalidIdentificationToken
- Invalid Identification TokensubscriptionRequired
- No purchased subscription seats available for this LinkedIn account.invalidRequestPayload
- Invalid request body/parameters: {validation_message}.invalidWorkflow
- Workflow configuration is not valid due to violated action constraints or invalid action parameters: {validation_details}.plusPlanRequired
- Some actions in this workflow require the Plus plan.linkedinAccountSignedOut
- Your LinkedIn account has been signed out in our cloud browser. This occasionally happens as LinkedIn may sign out accounts after an extended period. You'll need to visit our platform and reconnect your account.languageNotSupported
- Your LinkedIn account uses a language other than English, which is currently the only supported option.timeout
- Local execution timeout. ContainsworkflowId
andfunctionName
for future restoration.
personNotFound
- Provided URL is not an existing LinkedIn person. (sendMessage, syncConversation, checkConnectionStatus, sendConnectionRequest, withdrawConnectionRequest, removeConnection, fetchPerson, salesNavigatorSendMessage, salesNavigatorSyncConversation, salesNavigatorFetchPerson)messagingNotAllowed
- Sending a message to the person is not allowed. (sendMessage, salesNavigatorSendMessage)alreadyPending
- Connection request to this person has already been sent and is still pending.(sendConnectionRequest)alreadyConnected
- Your LinkedIn account is already connected with this person. (sendConnectionRequest)emailRequired
- Person requires an email address to send a connection request. (sendConnectionRequest)requestNotAllowed
- LinkedIn has restricted sending a connection request to this person. (sendConnectionRequest)notPending
- There is no pending connection request to this person. (withdrawConnectionRequest)connectionNotFound
- Person is not in your connections. (removeConnection)searchingNotAllowed
- LinkedIn has blocked performing the search due to exceeding limits or other restrictions. (searchCompanies, searchPeople, salesNavigatorSearchCompanies, salesNavigatorSearchPeople)companyNotFound
- Provided URL is not an existing LinkedIn company. (fetchCompany, salesNavigatorFetchCompany)retrievingNotAllowed
- LinkedIn has blocked performing the retrieval due to exceeding limits or other restrictions. (retrieveConnections, fetchCompany, salesNavigatorFetchCompany)postNotFound
- Provided URL is not an existing LinkedIn post. (fetchPost, reactToPost, commentOnPost)commentingNotAllowed
- Commenting is not allowed on this post. This could be due to the post author's privacy settings, LinkedIn restrictions on commenting, or because the post type does not support comments. (commentOnPost)noSalesNavigator
- Your account does not have Sales Navigator subscription. (salesNavigatorSendMessage, salesNavigatorSyncConversation, salesNavigatorSearchCompanies, salesNavigatorSearchPeople, salesNavigatorFetchCompany, salesNavigatorFetchPerson)
Licensed under the MIT License. See LICENSE for details.