
Security News
Axios Maintainer Confirms Social Engineering Attack Behind npm Compromise
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.
@harvestapi/scraper
Advanced tools
HarvestAPI provides LinkedIn data scraping tools for real-time, high-performance scraping at a low cost. API allows to search for Linkedin `jobs`, `companies`, `profiles`, and `posts` using a wide range of filters.
HarvestAPI provides LinkedIn data scraping tools for real-time, high-performance scraping at a low cost.
API allows to search for Linkedin jobs, companies, profiles, and posts using a wide range of filters.
npm install @harvestapi/scraper
To search for specific items, such as job listings, you can use the searchJobs method. Below is an example of how to search for job listings and retrieve details for a specific job:
import { createLinkedinScraper } from '@harvestapi/scraper';
// Initialize the scraper with your API key
const scraper = createLinkedinScraper({
apiKey: 'your-api-key', // Replace with your HarvestAPI key. Obtain it at https://harvest-api.com/admin/api-keys
});
(async () => {
const jobs = await scraper.searchJobs({
search: 'software engineer', // Job title to search for
location: 'California', // Location filter
page: 1, // Page number to retrieve
});
console.log(`jobs`, JSON.stringify(jobs, null, 2));
const jobDetails = await scraper.getJob({
jobId: jobs.elements[0].id, // Use the job ID from the search results
});
console.log(`jobDetails`, JSON.stringify(jobDetails, null, 2));
})();
The scrape methods allows you to scrape all pages of search results and save the data either to a SQLite database or a JSON file. This method automatically handles pagination and will scrape all available pages based on the totalPages metadata.
After fetching a page, the scraper will also make a separate request per each item, to fetch its details (default behavior).
npm i sqlite sqlite3
scrapeJobs, scrapeCompanies, scrapeProfiles, or scrapePosts methods to scrape data and save it to a SQLite database or JSON file.await scraper.scrapeProfiles({
query: {
search: 'Mark',
companyId: '1441', // Google company id.
location: 'US',
},
outputType: 'sqlite',
});
If you you want make requests to only fetch search pages, without fetching item details, you can pass scrapeDetails: false option to the scrape method. For example scrapeJobs will not fetch job descriptions in this case, but you will get job title, links and some other basic info (check JobShort below).
After the scraping process is complete, you can view the data using any SQLite database browser. The data will be saved in a file located at ./output/{timestamp}_profiles_{id}.{sqlite|json}.
For more detailed information on the available methods and their parameters, check the API reference below
createLinkedinScraper(
options):LinkedinScraper
createConcurrentQueues<
TArgs,TRes>(concurrency,fn,opts?):AsyncFunction<TArgs,TRes>
• TArgs extends any[] = any[]
• TRes = any
number
AsyncFunction<TArgs, TRes>
AsyncFunction<TArgs, TRes>
createConcurrentQueuesPerKey<
TArgs,TRes>(keyGetter,queuesNumber,fn,opts?):AsyncFunction<TArgs,TRes>
• TArgs extends any[]
• TRes = any
(...args) => string
number
AsyncFunction<TArgs, TRes>
AsyncFunction<TArgs, TRes>
getProfile(
params):Promise<ApiItemResponse<Profile>>
BaseFetchParams & GetLinkedInProfileParams
Promise<ApiItemResponse<Profile>>
getProfileId(
params):Promise<ApiItemResponse<{id:string; }>>
BaseFetchParams & object
Promise<ApiItemResponse<{ id: string; }>>
searchProfiles(
params):Promise<ApiListResponse<ProfileShort>>
BaseFetchParams & SearchLinkedInProfilesParams
Promise<ApiListResponse<ProfileShort>>
getCompany(
params):Promise<ApiItemResponse<Company>>
BaseFetchParams & GetLinkedinCompanyParams
Promise<ApiItemResponse<Company>>
searchCompanies(
params):Promise<ApiListResponse<CompanyShort>>
BaseFetchParams & SearchLinkedinCompaniesParams
Promise<ApiListResponse<CompanyShort>>
getJob(
params):Promise<ApiItemResponse<Job>>
BaseFetchParams & GetLinkedinJobParams
Promise<ApiItemResponse<Job>>
searchJobs(
params):Promise<ApiListResponse<JobShort>>
BaseFetchParams & SearchLinkedinJobsParams
Promise<ApiListResponse<JobShort>>
searchPosts(
params):Promise<ApiListResponse<PostShort>>
BaseFetchParams & SearchLinkedinPostsParams
Promise<ApiListResponse<PostShort>>
getProfilePosts(
params):Promise<ApiListResponse<PostShort>>
BaseFetchParams & GetProfilePostsParams
Promise<ApiListResponse<PostShort>>
getCompanyPosts(
params):Promise<ApiListResponse<PostShort>>
BaseFetchParams & GetCompanyPostsParams
Promise<ApiListResponse<PostShort>>
getPost(
params):Promise<ApiItemResponse<PostShort>>
BaseFetchParams & GetLinkedinPostParams
Promise<ApiItemResponse<PostShort>>
getSinglePostComment(
params):Promise<ApiItemResponse<PostComment>>
BaseFetchParams & GetLinkedinPostCommentParams
Promise<ApiItemResponse<PostComment>>
getPostReactions(
params):Promise<ApiListResponse<PostReaction>>
BaseFetchParams & GetLinkedinPostReactionsParams
Promise<ApiListResponse<PostReaction>>
getPostComments(
params):Promise<ApiListResponse<PostComment>>
BaseFetchParams & GetLinkedinPostCommentsParams
Promise<ApiListResponse<PostComment>>
getPostCommentReplies(
params):Promise<ApiListResponse<PostComment>>
BaseFetchParams & GetLinkedinPostCommentRepliesParams
Promise<ApiListResponse<PostComment>>
getCommentReactions(
params):Promise<ApiListResponse<PostReaction>>
BaseFetchParams & GetLinkedinPostCommentReactionsParams
Promise<ApiListResponse<PostReaction>>
getProfileComments(
params):Promise<ApiListResponse<PostComment>>
BaseFetchParams & GetLinkedinProfileCommentsParams
Promise<ApiListResponse<PostComment>>
getProfileReactions(
params):Promise<ApiListResponse<ProfileReaction>>
BaseFetchParams & GetLinkedinProfileReactionsParams
Promise<ApiListResponse<ProfileReaction>>
scrapeJobs(
__namedParameters):Promise<undefined| {pages:number;pagesSuccess:number;items:number;itemsSuccess:number;requests:number;requestsStartTime:Date; }>
Promise<undefined | { pages: number; pagesSuccess: number; items: number; itemsSuccess: number; requests: number; requestsStartTime: Date; }>
scrapeCompanies(
__namedParameters):Promise<undefined| {pages:number;pagesSuccess:number;items:number;itemsSuccess:number;requests:number;requestsStartTime:Date; }>
Promise<undefined | { pages: number; pagesSuccess: number; items: number; itemsSuccess: number; requests: number; requestsStartTime: Date; }>
scrapeProfiles(
__namedParameters):Promise<undefined| {pages:number;pagesSuccess:number;items:number;itemsSuccess:number;requests:number;requestsStartTime:Date; }>
Promise<undefined | { pages: number; pagesSuccess: number; items: number; itemsSuccess: number; requests: number; requestsStartTime: Date; }>
scrapePosts(
__namedParameters):Promise<undefined| {pages:number;pagesSuccess:number;items:number;itemsSuccess:number;requests:number;requestsStartTime:Date; }>
Promise<undefined | { pages: number; pagesSuccess: number; items: number; itemsSuccess: number; requests: number; requestsStartTime: Date; }>
scrapePostReactions(
__namedParameters):Promise<undefined| {pages:number;pagesSuccess:number;items:number;itemsSuccess:number;requests:number;requestsStartTime:Date; }>
ScrapeLinkedinPostReactionsParams
Promise<undefined | { pages: number; pagesSuccess: number; items: number; itemsSuccess: number; requests: number; requestsStartTime: Date; }>
scrapePostComments(
__namedParameters):Promise<undefined| {pages:number;pagesSuccess:number;items:number;itemsSuccess:number;requests:number;requestsStartTime:Date; }>
ScrapeLinkedinPostCommentsParams
Promise<undefined | { pages: number; pagesSuccess: number; items: number; itemsSuccess: number; requests: number; requestsStartTime: Date; }>
scrapePostCommentReplies(
__namedParameters):Promise<undefined| {pages:number;pagesSuccess:number;items:number;itemsSuccess:number;requests:number;requestsStartTime:Date; }>
ScrapeLinkedinPostCommentRepliesParams
Promise<undefined | { pages: number; pagesSuccess: number; items: number; itemsSuccess: number; requests: number; requestsStartTime: Date; }>
scrapeProfileComments(
__namedParameters):Promise<undefined| {pages:number;pagesSuccess:number;items:number;itemsSuccess:number;requests:number;requestsStartTime:Date; }>
ScrapeLinkedinProfileCommentsParams
Promise<undefined | { pages: number; pagesSuccess: number; items: number; itemsSuccess: number; requests: number; requestsStartTime: Date; }>
scrapeProfileReactions(
__namedParameters):Promise<undefined| {pages:number;pagesSuccess:number;items:number;itemsSuccess:number;requests:number;requestsStartTime:Date; }>
ScrapeLinkedinProfileReactionsParams
Promise<undefined | { pages: number; pagesSuccess: number; items: number; itemsSuccess: number; requests: number; requestsStartTime: Date; }>
searchSalesNavigatorLeads(
params):Promise<ApiListResponse<ProfileShort>>
BaseFetchParams & SearchLinkedInSalesNavLeadsParams
Promise<ApiListResponse<ProfileShort>>
scrapeSalesNavigatorLeads(
__namedParameters):Promise<undefined| {pages:number;pagesSuccess:number;items:number;itemsSuccess:number;requests:number;requestsStartTime:Date; }>
ScrapeLinkedinSalesNavLeadsParams
Promise<undefined | { pages: number; pagesSuccess: number; items: number; itemsSuccess: number; requests: number; requestsStartTime: Date; }>
getGroup(
params):Promise<ApiItemResponse<{name:string;url:string; }>>
BaseFetchParams & object
Promise<ApiItemResponse<{ name: string; url: string; }>>
searchGroups(
params):Promise<ApiListResponse<{name:string;url:string; }>>
BaseFetchParams & object
Promise<ApiListResponse<{ name: string; url: string; }>>
searchServices(
params):Promise<ApiListResponse<ProfileServiceShort>>
BaseFetchParams & SearchLinkedinServicesParams
Promise<ApiListResponse<ProfileServiceShort>>
scrapeServices(
__namedParameters):Promise<undefined| {pages:number;pagesSuccess:number;items:number;itemsSuccess:number;requests:number;requestsStartTime:Date; }>
Promise<undefined | { pages: number; pagesSuccess: number; items: number; itemsSuccess: number; requests: number; requestsStartTime: Date; }>
searchAds(
params):Promise<ApiListResponse<LinkedinAdShort>>
BaseFetchParams & SearchLinkedinAdsParams
Promise<ApiListResponse<LinkedinAdShort>>
getAd(
params):Promise<ApiItemResponse<LinkedInAd>>
BaseFetchParams & GetLinkedinAdParams
Promise<ApiItemResponse<LinkedInAd>>
sendConnection(
params):Promise<ApiListResponse<any>>
BaseFetchParams & object
Promise<ApiListResponse<any>>
getMyReceivedConnections(
params):Promise<ApiListResponse<any>>
Promise<ApiListResponse<any>>
getMySentConnections(
params):Promise<ApiListResponse<any>>
Promise<ApiListResponse<any>>
acceptMyConnectionInvitation(
params):Promise<ApiListResponse<any>>
BaseFetchParams & object
Promise<ApiListResponse<any>>
getMyProfile(
params):Promise<ApiItemResponse<Profile>>
Promise<ApiItemResponse<Profile>>
sendMessage(
params):Promise<ApiListResponse<any>>
BaseFetchParams & object
Promise<ApiListResponse<any>>
follow(
params):Promise<ApiListResponse<any>>
BaseFetchParams & object
Promise<ApiListResponse<any>>
optionaladdHeaders:Record<string,string>
optionalcookie:string
optionalproxy:string
optionaluserAgent:string
optionalsessionId:string
optionalusePrivatePool:boolean
optionalurl:string
optionalpublicIdentifier:string
optionalprofileId:string
optionalquery:string
optionalfindEmail:boolean
optionalskipSmtp:boolean
optionalmain:boolean
optionalcurrentCompany:string|string[]
optionalcurrentCompanyId:string|string[]
optionalcurrentCompanyUniversalName:string|string[]
optionalpastCompany:string|string[]
optionalpastCompanyId:string|string[]
optionalpastCompanyUniversalName:string|string[]
optionalschool:string|string[]
optionalschoolId:string|string[]
optionalschoolUniversalName:string|string[]
optionalgeoId:string|string[]
optionallocation:string|string[]
optionalindustryId:string|string[]
optionalsearch:string
optionaltitle:string
optionalfirstName:string
optionallastName:string
optionalkeywordsCompany:string
optionalkeywordsSchool:string
optionalfollowerOf:string|string[]
optionalpage:number
optionalcurrentCompanies:string|string[]
optionalpastCompanies:string|string[]
optionalschools:string|string[]
optionallocations:string|string[]
optionalgeoIds:string|string[]
optionalsearch:string
optionalpage:number
optionalsalesNavUrl:string
optionalcurrentJobTitles:string|string[]
optionalpastJobTitles:string|string[]
optionalfirstNames:string|string[]
optionallastNames:string|string[]
optionalindustryIds:string|string[]
optionalyearsAtCurrentCompanyIds:string|string[]
Map: { "1": "Less than 1 year", "2": "1 to 2 years", "3": "3 to 5 years", "4": "6 to 10 years", "5": "More than 10 years" }
optionalyearsOfExperienceIds:string|string[]
Map: { "1": "Less than 1 year", "2": "1 to 2 years", "3": "3 to 5 years", "4": "6 to 10 years", "5": "More than 10 years" }
optionalseniorityLevelIds:string|string[]
Map: { "100": "In Training", "110": "Entry Level", "120": "Senior", "130": "Strategic", "200": "Entry Level Manager", "210": "Experienced Manager", "220": "Director", "300": "Vice President", "310": "CXO", "320": "Owner / Partner" }
optionalfunctionIds:string|string[]
Map: { "1": "Accounting", "2": "Administrative", "3": "Arts and Design", "4": "Business Development", "5": "Community and Social Services", "6": "Consulting", "7": "Education", "8": "Engineering", "9": "Entrepreneurship", "10": "Finance", "11": "Healthcare Services", "12": "Human Resources", "13": "Information Technology", "14": "Legal", "15": "Marketing", "16": "Media and Communication", "17": "Military and Protective Services", "18": "Operations", "19": "Product Management", "20": "Program and Project Management", "21": "Purchasing", "22": "Quality Assurance", "23": "Real Estate", "24": "Research", "25": "Sales", "26": "Customer Success and Support" }
optionalrecentlyChangedJobs:boolean
optionalprofileLanguages:string|string[]
Map: { "ar": "Arabic", "en": "English", "es": "Spanish", "pt": "Portuguese", "zh": "Chinese", "fr": "French", "it": "Italian", "ru": "Russian", "de": "German", "nl": "Dutch", "tr": "Turkish", "tl": "Tagalog", "pl": "Polish", "ko": "Korean", "ja": "Japanese", "ms": "Malay", "no": "Norwegian", "da": "Danish", "ro": "Romanian", "sv": "Swedish", "in": "Bahasa Indonesia", "cs": "Czech" }
optionalcompanyHeadcount:LsnCompanyHeadcount|LsnCompanyHeadcount[]
Map: { "A": "self-employed", "B": "1-10", "C": "11-50", "D": "51-200", "E": "201-500", "F": "501-1000", "G": "1001-5000", "H": "5001-10000", "I": "10001+" }
optionalcompanyHeadquarterLocations:string|string[]
optionalexcludeCurrentCompanies:string|string[]
optionalexcludePastCompanies:string|string[]
optionalexcludeLocations:string|string[]
optionalexcludeGeoIds:string|string[]
optionalexcludeSchools:string|string[]
optionalexcludeCurrentJobTitles:string[]
optionalexcludePastJobTitles:string[]
optionalexcludeIndustryIds:string|string[]
optionalexcludeSeniorityLevelIds:string|string[]
optionalexcludeFunctionIds:string|string[]
optionalexcludeCompanyHeadquarterLocations:string|string[]
optionalsearch:string
optionalpage:number
optionallocation:string
optionalgeoId:string
optionaluniversalName:string
optionalurl:string
optionalcompanyId:string
optionalsearch:string
optionalquery:string
optionallocation:string
optionalscrapePeopleTab:boolean
optionalsearchUrl:string
optionalaccountOwner:null|string
optionalkeyword:null|string
optionalcountries:null|string|string[]
optionaldateOption:null|"last-30-days"|"current-month"|"current-year"|"last-year"|"custom-date-range"
optionalstartdate:null|string
optionalenddate:null|string
optionalpaginationToken:null|string
optionaladId:string
optionalurl:string
optionalgeoId:string
optionallocation:string
optionalsearch:string
optionalpage:number
optionalcompanySize:LinkedinCompanySize|LinkedinCompanySize[]
optionalindustryId:string|number|string[] |number[]
optionaljobId:string
optionalurl:string
optionalwithCompany:boolean
optionalsearch:string
optionalcompany:string|string[]
optionalcompanyId:string|string[]
optionalcompanyUniversalName:string|string[]
optionallocation:string
optionalgeoId:string
optionalsortBy:"date"|"relevance"
optionalworkplaceType:LinkedinWorkplaceType|LinkedinWorkplaceType[]
optionalemploymentType:LinkedinJobType|LinkedinJobType[]
optionalexperienceLevel:ExperienceLevel|ExperienceLevel[]
optionalunder10Applicants:boolean
optionaleasyApply:boolean
optionalpostedLimit:"1h"|"24h"|"week"|"month"
optionalpage:number
optionalsalary:LinkedinSalaryRange|LinkedinSalaryRange[]
optionalsearch:string
optionalpage:number
optionalsortBy:"date"|"relevance"
optionalpostedLimit:"24h"|"week"|"month"
optionaltargetUrl:string|string[]
optionalscrapePostedLimit:ScrapePostedLimitOptions
optionalprofile:string|string[]
optionalcompanyId:string|string[]
optionalprofileId:string|string[]
optionalcompany:string|string[]
optionalcompanyUniversalName:string|string[]
optionalprofilePublicIdentifier:string|string[]
optionalauthorsCompany:string|string[]
optionalauthorsCompanyUniversalName:string|string[]
optionalauthorsCompanyId:string|string[]
optionalgroup:string
optionalpaginationToken:null|string
optionalmentioningMember:string|string[]
optionalmentioningCompany:string|string[]
optionalcontentType:"videos"|"images"|"jobs"|"live_videos"|"documents"|"collaborative_articles"
optionalauthorsIndustryId:string|string[]
optionalauthorKeywords:string
optionalprofile:string
optionalprofileId:string
optionalprofilePublicIdentifier:string
optionalpage:number
optionalpaginationToken:string
optionalscrapePostedLimit:ScrapePostedLimitOptions
optionalcompany:string
optionalcompanyId:string
optionalcompanyUniversalName:string
optionalpage:number
optionalpaginationToken:string
optionalscrapePostedLimit:ScrapePostedLimitOptions
optionalpost:string|number
optionaltargetUrl:string
optionalurl:string|number
post:
string|number
optionalpage:number
url:
string|number
optionalpage:number
post:
string|number
optionalpage:number
optionalpaginationToken:null|string
optionalsortBy:"date"|"relevance"
optionalpostedLimit:"24h"|"week"|"month"
url:
string|number
optionalpaginationToken:null|string
optionalpostedLimit:"24h"|"week"|"month"
optionaltargetUrl:string
optionalprofile:string
optionalprofileId:string
optionalprofilePublicIdentifier:string
optionalcompany:string
optionalcompanyId:string
optionalcompanyUniversalName:string
optionalpage:number
optionalpaginationToken:null|string
optionalpostedLimit:"24h"|"week"|"month"
optionaltargetUrl:string
optionalprofile:string
optionalprofileId:string
optionalprofilePublicIdentifier:string
optionalcompany:string
optionalcompanyId:string
optionalcompanyUniversalName:string
optionalpage:number
optionalpaginationToken:null|string
entityId:
null|string
requestId:
string
status:
number
error:
any
query:
Record<string,any>
originalQuery:
Record<string,any>
optionaluser:object
membershipTier:
string
requestsConcurrency:
number
payments:
string[]
cost:
number
ListingScraperConfig<
TItemShot,TItemDetails>:object
• TItemShot
• TItemDetails
optionaloutputType:"json"|"sqlite"|"callback"
optionaloutputDir:string
optionalfilename:string
optionaltableName:string
Table name for SQLite output.
optionalscrapeDetails:boolean
Whether to make an additional request for each item details.
true
optionalkeepScrapingIfAllSkippedOnPage:boolean
Whether to keep scraping further pages if all items on the current page were skipped.
false
optionalonItemScraped: (args) =>any
object & Partial<ApiItemResponse<TItemShot | TItemDetails>>
any
optionalonFirstPageFetched: (args) =>any
ApiListResponse<TItemShot> | null
any
optionalonPageFetched: (args) =>Promise<OnPageFetchedCallbackRes|void> |OnPageFetchedCallbackRes|void
number
ApiListResponse<TItemShot> | null
Promise<OnPageFetchedCallbackRes | void> | OnPageFetchedCallbackRes | void
optionaloverrideConcurrency:number
optionaloverridePageConcurrency:number
optionalmaxItems:number
optionaldisableLog:boolean
optionaldisableErrorLog:boolean
optionaloptionsOverride:Partial<ListingScraperOptions<TItemShot,TItemDetails>>
optionaldisableLogTimestamps:boolean
optionalonLog: (args) =>undefined| {skip:boolean;overrideArgs:any[]; }
any[]
undefined | { skip: boolean; overrideArgs: any[]; }
optionalsessionId:string
optionaladdListingHeaders:Record<string,string>
optionaladdItemHeaders:Record<string,string>
optionaltakePages:number
optionalstartPage:number
optionalgetFetchListParams: (args) =>Record<string,any>
number
ApiPagination | null
Record<string, any>
ScraperOptions:
object
apiKey:
string
optionalbaseUrl:string
optionaladdHeaders:Record<string,string>
optionallogger:object
log: (...
args) =>void
...any[]
void
error: (...
args) =>void
...any[]
void
LsnCompanyHeadcount:
"self-employed"|"1-10"|"11-50"|"51-200"|"201-500"|"501-1000"|"1001-5000"|"5001-10000"|"10001+"
LinkedinCompanySize:
"1-10"|"11-50"|"51-200"|"201-500"|"501-1000"|"1001-5000"|"5001-10000"|"10001+"
LinkedinSalaryRange:
"40k+"|"60k+"|"80k+"|"100k+"|"120k+"|"140k+"|"160k+"|"180k+"|"200k+"
LinkedinJobType:
"full-time"|"part-time"|"contract"|"internship"
LinkedinWorkplaceType:
"office"|"hybrid"|"remote"
ExperienceLevel:
"internship"|"entry"|"associate"|"mid-senior"|"director"|"executive"
ScrapePostedLimitOptions:
"1h"|"24h"|"week"|"month"|"3months"|"6months"|"year"
Profile:
object
id:
string
publicIdentifier:
string
lastName:
string
firstName:
string
headline:
string
about:
string
linkedinUrl:
string
photo:
string
emails:
string[]
websites:
string[]
registeredAt:
string
topSkills:
string
connectionsCount:
number
followerCount:
number
openToWork:
boolean
hiring:
boolean
location:
object
linkedinText:
string
countryCode:
string
parsed:
object
text:
string
countryCode:
string
regionCode:
string|null
country:
string
countryFull:
string
state:
string
city:
string
currentPosition:
object[]
experience:
object[]
education:
object[]
certifications:
object[]
receivedRecommendations:
object[]
skills:
object[]
languages:
object[]
projects:
object[]
publications:
object[]
honorsAndAwards:
object[]
courses:
object[]
featured:
object
images:
string[]
link:
string
title:
string
subtitle:
string
verified:
boolean
moreProfiles:
object[]
ProfileShort:
object
id:
string
publicIdentifier:
string
optionalname:string
optionalposition:string
optionallocation:object
optionallinkedinText:string
optionallinkedinUrl:string
optionalphoto:string
optionalhidden:boolean
ProfileServiceShort:
object
id:
string
optionalname:string
optionalposition:string
optionallocation:object
optionallinkedinText:string
optionallinkedinProfileUrl:string
optionalpicture:string
services:
string[]
optionalsummary:string
objectUrn:
string
Company:
object
id:
string
universalName:
string
optionalname:string
optionaltagline:string
optionalwebsite:string
optionallinkedinUrl:string
optionallogo:string
optionalfoundedOn:object
optionalmonth:string|null
optionalyear:number
optionalday:string|null
optionalemployeeCount:number
optionalemployeeCountRange:object
optionalstart:number
optionalend:number
optionalfollowerCount:number
optionaldescription:string
optionallocations:object[]
optionalspecialities:string[]
optionalindustries:object[]
optionallogos:object[]
optionalbackgroundCovers:object[]
optionalactive:boolean
optionaljobSearchUrl:string
optionalphone:object
number:
string
optionalextension:string|null
optionalcrunchbaseFundingData:object
optionalnumberOfFundingRounds:number
optionallastFundingRound:object
optionallocalizedFundingType:string
optionalleadInvestors:Record<string,never>[]
optionalmoneyRaised:object
optionalamount:string
optionalcurrencyCode:string
optionalfundingRoundUrl:string
optionalannouncedOn:object
optionalmonth:number
optionalyear:number
optionalday:number
optionalnumberOfOtherInvestors:number
optionalinvestorsUrl:string
optionalorganizationUrl:string
optionalupdatedAt:number
optionalfundingRoundsUrl:string
optionalpageVerified:boolean
optionalsimilarOrganizations:CompanyShort[]
CompanyShort:
object
id:
string
universalName:
string
linkedinUrl:
string
optionalname:string
optionalindustries:string
optionallocation:object
optionallinkedinText:string
optionalfollowers:string
optionalsummary:string
optionallogo:string
Job:
object
id:
string
optionaltitle:string
optionalurl:string
optionaljobState:string
optionalpostedDate:string
optionaldescriptionText:string
optionaldescriptionHtml:string
optionallocation:object
optionallinkedinText:string
optionalpostalAddress:string|null
optionalparsed:object
optionaltext:string
optionalcountryCode:string
optionalregionCode:string|null
optionalcountry:string
optionalcountryFull:string
optionalstate:string
optionalcity:string
optionalemploymentType:"full_time"|"part_time"|"contract"|"internship"
optionalworkplaceType:"on_site"|"hybrid"|"remote"
optionalworkRemoteAllowed:boolean
optionaleasyApplyUrl:string
optionalapplicants:number
company:
Company
salary: {
text:string;min:number;max:number;currency:string;payPeriod:string;compensationType:string;compensationSource:string;providedByEmployer:boolean; } |null
optionalviews:number
optionalexpireAt:string
optionalnew:boolean
optionaljobApplicationLimitReached:boolean
optionalapplicantTrackingSystem:string
optionalexperienceLevel:string
JobShort:
object
id:
string
optionalurl:string
optionaltitle:string
optionalpostedDate:string
optionalcompany:CompanyShort
optionallocation:object
optionallinkedinText:string
optionaleasyApply:boolean
PostShort:
object
id:
string
linkedinUrl:
string
optionalcontent:string
contentAttributes:
object[]
author:
object
optionaluniversalName:string|null
optionalpublicIdentifier:string|null
optionaltype:"company"|"profile"
optionalname:string
optionallinkedinUrl:string
optionalinfo:string
optionalwebsite:string|null
optionalwebsiteLabel:string|null
optionalavatar:object
url:
string
width:
number
height:
number
expiresAt:
number
article: {
title:string|null;subtitle:string|null;link:string|null;linkLabel:string|null;description:string|null;image:string|null; } |null
postedAt:
object
timestamp:
number
date:
string
postedAgoShort:
string
postedAgoText:
string
optionalpostImages:object[]
optionalrepostId:string|null
optionalrepost:PostShort
optionalrepostedBy:object
name:
string
optionalpublicIdentifier:string
optionaluniversalName:string
linkedinUrl:
string
optionalnewsletterUrl:string
optionalnewsletterTitle:string
optionalsocialContent:object
hideCommentsCount:
boolean
hideReactionsCount:
boolean
hideSocialActivityCounts:
boolean
hideShareAction:
boolean
hideSendAction:
boolean
hideRepostsCount:
boolean
hideViewsCount:
boolean
hideReactAction:
boolean
hideCommentAction:
boolean
shareUrl:
string
showContributionExperience:
boolean
showSocialDetail:
boolean
optionalengagement:object
likes:
number
comments:
number
shares:
number
reactions:
object[]
optionalcomments:PostComment[]
optionalreactions:PostReaction[]
PostReaction:
object
id:
string
reactionType:
string
postId:
string
actor:
object
id:
string
name:
string
linkedinUrl:
string
position:
string
image:
object
url:
string
width:
number
height:
number
expiresAt:
number
ProfileReaction:
object
id:
string
action:
string
postId:
string
linkedinUrl:
string
createdAt:
string
createdAtTimestamp:
number
actor:
object
id:
string
linkedinUrl:
string
picture:
string
post:
PostShort
PostComment:
object
id:
string
linkedinUrl:
string
commentary:
string
createdAt:
string
postId:
string
actor:
object
id:
string
name:
string
linkedinUrl:
string
position:
string
pictureUrl:
string
optionaluniversalName:string|null
type:
"profile"|"company"
picture:
object
url:
string
width:
number
height:
number
expiresAt:
number
optionalreplies:PostComment[]
createdAtTimestamp:
number
optionalpinned:boolean|null
optionalcontributed:boolean|null
optionaledited:boolean|null
ScrapeLinkedinJobsParams:
object&ListingScraperConfig<JobShort,Job>
query:
SearchLinkedinJobsParams
ScrapeLinkedinCompaniesParams:
object&ListingScraperConfig<CompanyShort,Company>
optionalscrapePeopleTab:boolean
ScrapeLinkedinProfilesParams:
object&ListingScraperConfig<ProfileShort,Profile>
query:
SearchLinkedInProfilesParams
optionalfindEmail:boolean
ScrapeLinkedinSalesNavLeadsParams:
object&ListingScraperConfig<ProfileShort,Profile>
optionalfindEmail:boolean
optionalwarnPageLimit:boolean
ScrapeLinkedinPostsParams:
object&ListingScraperConfig<PostShort,PostShort>
query:
SearchLinkedinPostsParams
ScrapeLinkedinPostReactionsParams:
object&ListingScraperConfig<PostReaction,PostReaction>
ScrapeLinkedinPostCommentsParams:
object&ListingScraperConfig<PostComment,PostComment>
ScrapeLinkedinPostCommentRepliesParams:
object&ListingScraperConfig<PostComment,PostComment>
ScrapeLinkedinProfileCommentsParams:
object&ListingScraperConfig<PostComment,PostComment>
ScrapeLinkedinProfileReactionsParams:
object&ListingScraperConfig<ProfileReaction,ProfileReaction>
ScrapeLinkedinServicesParams:
object&ListingScraperConfig<ProfileServiceShort,ProfileServiceShort&Profile>
query:
SearchLinkedinServicesParams
optionalfindEmail:boolean
ErrorResponse:
object
error:
string
message:
string
status:
number
LinkedInAd:
object
id:
string
variants:
object[]
about:
object
format:
string|null
advertiserName:
string|null
advertiserUrl:
string|null
paidBy:
string|null
optionalranFrom:string|null
optionalranTo:string|null
impressions:
object
optionaltotal:string|null
optionalbyCountry:object[]
targeting:
object
segments:
object[]
parameters:
object[]
LinkedinAdShort:
object
id:
string
advertiser:
object
name:
string
imageUrl:
string
headline:
string
content:
object
headline:
string|null
commentary:
string|null
pageUrl:
string
imageUrl:
string|null
optionalmessage:string
optionalmessageAuthor:string
creativeType:
string
ApiItemResponse<
TItem>:BaseApiResponse&object
element:
TItem
• TItem
ApiPagination:
object
totalPages:
number
totalElements:
number
pageNumber:
number
previousElements:
number
pageSize:
number
optionalpaginationToken:string|null
optionaltotalResultCount:number
ApiListResponse<
TItem>:BaseApiResponse&object
pagination:
ApiPagination|null
elements:
TItem[]
• TItem
CreateConcurrentQueuesOptions:
object
optionalid:string
FAQs
HarvestAPI provides LinkedIn data scraping tools for real-time, high-performance scraping at a low cost. API allows to search for Linkedin `jobs`, `companies`, `profiles`, and `posts` using a wide range of filters.
The npm package @harvestapi/scraper receives a total of 487 weekly downloads. As such, @harvestapi/scraper popularity was classified as not popular.
We found that @harvestapi/scraper demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.