HarvestAPI
Connect to HarvestAPI to scrape LinkedIn profiles, companies, and job listings, and search for people and jobs using LinkedIn data. Enables AI agents to access real-time LinkedIn data for recruiting, sales prospecting, and market research. Pay-as-you-go credit model.
Connect to HarvestAPI to scrape LinkedIn profiles, companies, and job listings, and search for people and jobs using LinkedIn data. Enables AI agents to access real-time LinkedIn data for recruiting, sales prospecting, and market research. Pay-as-you-go credit model.
Supports authentication: API Key
Set up the agent connector
Section titled “Set up the agent connector”Register your HarvestAPI key with Scalekit so it can authenticate LinkedIn data requests on your behalf. You’ll need an API key from your HarvestAPI dashboard.
-
Generate an API key
-
Sign in to your HarvestAPI dashboard.
-
Click Create API key, give it a descriptive name (e.g.,
My Agent), and click Create. -
Copy the generated API key. It is shown only once — store it securely before navigating away.

-
-
Create a connection in Scalekit
In Scalekit dashboard, go to Agent Auth → Create Connection. Find HarvestAPI and click Create.

-
Add a connected account
Open the connection you just created and click the Connected Accounts tab → Add account. Fill in the required fields:
- Your User’s ID — a unique identifier for the user in your system
- API Key — the key you copied in step 1

Click Save.
Once a connected account is set up, call LinkedIn data tools on behalf of any user — Scalekit injects the stored API key into every request automatically.
You can interact with Harvest API in two ways — via direct proxy API calls or via Scalekit optimized tool calls. Scroll down to see the list of available Scalekit tools.
Proxy API Calls
import { ScalekitClient } from '@scalekit-sdk/node';import 'dotenv/config';
const connectionName = 'harvestapi'; // connection name from Scalekit dashboardconst identifier = 'user_123'; // must match the identifier used when adding the connected account
// Get credentials from app.scalekit.com → Developers → API Credentialsconst scalekit = new ScalekitClient( process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET);const actions = scalekit.actions;
// Scrape a LinkedIn profile by URLconst profile = await actions.request({ connectionName, identifier, path: '/linkedin/profile', method: 'GET', queryParams: { url: 'https://www.linkedin.com/in/satyanadella' },});console.log(profile.data);
// Search LinkedIn for people by title and locationconst people = await actions.request({ connectionName, identifier, path: '/linkedin/lead-search', method: 'GET', queryParams: { title: 'VP of Engineering', location: 'San Francisco, CA' },});console.log(people.data);
// Scrape a LinkedIn company pageconst company = await actions.request({ connectionName, identifier, path: '/linkedin/company', method: 'GET', queryParams: { url: 'https://www.linkedin.com/company/openai' },});console.log(company.data);
// Search LinkedIn job listings by keyword and locationconst jobs = await actions.request({ connectionName, identifier, path: '/linkedin/job-search', method: 'GET', queryParams: { keywords: 'machine learning engineer', location: 'New York, NY' },});console.log(jobs.data);
// Scrape a single job listing by URLconst job = await actions.request({ connectionName, identifier, path: '/linkedin/job', method: 'GET', queryParams: { url: 'https://www.linkedin.com/jobs/view/1234567890' },});console.log(job.data);
// Bulk scrape multiple LinkedIn profiles in one requestconst bulk = await actions.request({ connectionName, identifier, path: '/v2/acts/harvestapi~linkedin-profile-scraper/run-sync-get-dataset-items', method: 'POST', body: { urls: [ 'https://www.linkedin.com/in/satyanadella', 'https://www.linkedin.com/in/jeffweiner08', 'https://www.linkedin.com/in/reidhoffman', ], },});console.log(bulk.data);import scalekit.client, osfrom dotenv import load_dotenvload_dotenv()
connection_name = "harvestapi" # connection name from Scalekit dashboardidentifier = "user_123" # must match the identifier used when adding the connected account
# Get credentials from app.scalekit.com → Developers → API Credentialsscalekit_client = scalekit.client.ScalekitClient( client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), env_url=os.getenv("SCALEKIT_ENV_URL"),)
# Scrape a LinkedIn profile by URLprofile = scalekit_client.actions.request( connection_name=connection_name, identifier=identifier, path="/linkedin/profile", method="GET", params={"url": "https://www.linkedin.com/in/satyanadella"})print(profile)
# Search LinkedIn for people by title and locationpeople = scalekit_client.actions.request( connection_name=connection_name, identifier=identifier, path="/linkedin/lead-search", method="GET", params={"title": "VP of Engineering", "location": "San Francisco, CA"})print(people)
# Scrape a LinkedIn company pagecompany = scalekit_client.actions.request( connection_name=connection_name, identifier=identifier, path="/linkedin/company", method="GET", params={"url": "https://www.linkedin.com/company/openai"})print(company)
# Search LinkedIn job listings by keyword and locationjobs = scalekit_client.actions.request( connection_name=connection_name, identifier=identifier, path="/linkedin/job-search", method="GET", params={"keywords": "machine learning engineer", "location": "New York, NY"})print(jobs)
# Scrape a single job listing by URLjob = scalekit_client.actions.request( connection_name=connection_name, identifier=identifier, path="/linkedin/job", method="GET", params={"url": "https://www.linkedin.com/jobs/view/1234567890"})print(job)
# Bulk scrape multiple LinkedIn profiles in one requestbulk = scalekit_client.actions.request( connection_name=connection_name, identifier=identifier, path="/v2/acts/harvestapi~linkedin-profile-scraper/run-sync-get-dataset-items", method="POST", json={ "urls": [ "https://www.linkedin.com/in/satyanadella", "https://www.linkedin.com/in/jeffweiner08", "https://www.linkedin.com/in/reidhoffman" ] })print(bulk)Scalekit Tools
Tool list
Section titled “Tool list”harvestapi_bulk_scrape_profiles
Section titled “harvestapi_bulk_scrape_profiles”Batch scrape multiple LinkedIn profiles in a single request using the HarvestAPI Apify scraper. Accepts a JSON array of LinkedIn profile URLs. Pricing: $4 per 1,000 profiles, $10 per 1,000 with email. Requires an Apify API token from https://console.apify.com/settings/integrations.
| Name | Type | Required | Description |
|---|---|---|---|
apify_token | string | Yes | Your Apify API token from https://console.apify.com/settings/integrations. |
find_email | boolean | No | When true, attempts email discovery for all profiles. Costs $10 per 1,000 instead of $4. |
profile_urls | array<string> | Yes | JSON array of LinkedIn profile URLs to scrape in bulk. |
harvestapi_get_ad
Section titled “harvestapi_get_ad”Retrieve details of a specific LinkedIn ad by ad ID or URL.
| Name | Type | Required | Description |
|---|---|---|---|
ad_id | string | No | The unique identifier of the LinkedIn Ad. |
url | string | No | The URL of the LinkedIn Ad. |
harvestapi_get_comment_reactions
Section titled “harvestapi_get_comment_reactions”Retrieve reactions on a specific LinkedIn comment by its URL.
| Name | Type | Required | Description |
|---|---|---|---|
page | integer | No | Page number for pagination (default: 1). |
url | string | Yes | URL of the LinkedIn comment. |
harvestapi_get_company
Section titled “harvestapi_get_company”Retrieve the Harvest company (account) information for the authenticated user, including company name, base URI, plan type, clock format, currency, and weekly capacity settings.
| Name | Type | Required | Description |
|---|---|---|---|
account_id | string | Yes | Your Harvest account ID, returned during OAuth as the Harvest-Account-Id header. |
harvestapi_get_company_posts
Section titled “harvestapi_get_company_posts”Retrieve posts published by a LinkedIn company page. Returns paginated post content, engagement metrics, and timestamps.
| Name | Type | Required | Description |
|---|---|---|---|
company | string | No | LinkedIn company URL. Provide this or company_universal_name. |
company_universal_name | string | No | LinkedIn company universal name (slug from company URL). |
page | integer | No | Page number for pagination (default: 1). |
harvestapi_get_group
Section titled “harvestapi_get_group”Retrieve details of a LinkedIn group including name, description, member count, and activity by URL or group ID.
| Name | Type | Required | Description |
|---|---|---|---|
group_id | string | No | LinkedIn group ID. Provide this or url. |
url | string | No | LinkedIn group URL. Provide this or group_id. |
harvestapi_get_post
Section titled “harvestapi_get_post”Retrieve a specific LinkedIn post by its URL. Returns full post content, author details, and engagement metrics.
| Name | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The LinkedIn post URL. |
harvestapi_get_post_comments
Section titled “harvestapi_get_post_comments”Retrieve all comments on a LinkedIn post by its URL. Returns comment text, author details, and timestamps.
| Name | Type | Required | Description |
|---|---|---|---|
post | string | Yes | The LinkedIn post URL to retrieve comments for. |
harvestapi_get_post_reactions
Section titled “harvestapi_get_post_reactions”Retrieve all reactions on a LinkedIn post by its URL. Returns reaction type and reactor profile details.
| Name | Type | Required | Description |
|---|---|---|---|
post | string | Yes | The LinkedIn post URL to retrieve reactions for. |
harvestapi_get_profile_comments
Section titled “harvestapi_get_profile_comments”Retrieve comments made by a LinkedIn profile. Returns paginated results with comment content and timestamps.
| Name | Type | Required | Description |
|---|---|---|---|
page | integer | No | Page number for pagination (default: 1). |
pagination_token | string | No | Required for pages > 1. Use token from previous page response. |
posted_limit | string | No | Filter by maximum posted date. Options: ‘24h’, ‘week’, ‘month’. |
profile | string | No | URL of the LinkedIn profile. |
profile_id | string | No | Profile ID of the LinkedIn profile. Faster than URL lookup. |
harvestapi_get_profile_posts
Section titled “harvestapi_get_profile_posts”Retrieve posts made by a specific LinkedIn profile. Returns paginated post content, engagement data, and timestamps.
| Name | Type | Required | Description |
|---|---|---|---|
page | integer | No | Page number for pagination (default: 1). |
profile | string | No | LinkedIn profile URL. Provide this or profile_id. |
profile_id | string | No | LinkedIn profile ID. Provide this or profile. |
profile_public_identifier | string | No | LinkedIn public identifier (slug from profile URL). |
harvestapi_get_profile_reactions
Section titled “harvestapi_get_profile_reactions”Retrieve reactions made by a LinkedIn profile. Returns paginated results.
| Name | Type | Required | Description |
|---|---|---|---|
page | integer | No | Page number for pagination (default: 1). |
pagination_token | string | No | Required for pages > 1. Use token from previous page response. |
profile | string | No | URL of the LinkedIn profile. |
profile_id | string | No | Profile ID of the LinkedIn profile. Faster than URL lookup. |
harvestapi_scrape_company
Section titled “harvestapi_scrape_company”Scrape a LinkedIn company page for overview, headcount, employee count range, follower count, locations, specialities, industries, and funding data. Provide one of: company_url, universal_name, or search (company name).
| Name | Type | Required | Description |
|---|---|---|---|
company_url | string | No | Full LinkedIn company page URL. Provide this, universal_name, or search. |
search | string | No | Company name to look up on LinkedIn. Returns the most relevant result. Provide this, company_url, or universal_name. |
universal_name | string | No | Company universal name from the LinkedIn URL slug. Provide this, company_url, or search. |
harvestapi_scrape_job
Section titled “harvestapi_scrape_job”Retrieve full job listing details from LinkedIn by job URL or job ID. Returns title, company, description, requirements, salary, location, workplace type, employment type, applicant count, and application details. Provide one of: job_url or job_id.
| Name | Type | Required | Description |
|---|---|---|---|
job_id | string | No | LinkedIn numeric job ID from the posting URL. Provide this or job_url. |
job_url | string | No | Full LinkedIn job posting URL. Provide this or job_id. |
harvestapi_scrape_profile
Section titled “harvestapi_scrape_profile”Scrape a LinkedIn profile by URL or public identifier, returning contact details, employment history, education, skills, and more. Provide either profile_url or public_identifier. Use main=true for a simplified profile at fewer credits. Optionally find email with find_email=true (costs extra credits). Processing time ~2.6s (main) or ~4.9s (full).
| Name | Type | Required | Description |
|---|---|---|---|
find_email | boolean | No | When true, attempts to find the profile’s email address via SMTP verification. Costs extra credits. |
include_about_profile | boolean | No | When true, includes the ‘About’ section of the LinkedIn profile in the response. |
main | boolean | No | When true, returns a simplified profile with fewer fields. Charges fewer credits than a full scrape. |
profile_id | string | No | LinkedIn numeric profile ID. Can be used instead of profile_url or public_identifier. |
profile_url | string | No | Full LinkedIn profile URL. Provide this or public_identifier or profile_id. |
public_identifier | string | No | LinkedIn profile public identifier (the slug in the URL). Provide this or profile_url or profile_id. |
skip_smtp | boolean | No | When true, skips SMTP verification when finding email. Faster but less accurate. |
harvestapi_search_ads
Section titled “harvestapi_search_ads”Search the LinkedIn Ad Library for ads by keyword, advertiser, country, and date range. Useful for competitive research and ad intelligence.
| Name | Type | Required | Description |
|---|---|---|---|
account_owner | string | No | LinkedIn company URL of the advertiser. |
countries | string | No | Country codes to filter ads by, comma-separated. e.g. ‘US,GB’. |
date_option | string | No | Predefined date filter option. |
enddate | string | No | End date for ad search in YYYY-MM-DD format. |
keyword | string | No | Keyword to search for in ads. |
startdate | string | No | Start date for ad search in YYYY-MM-DD format. |
harvestapi_search_companies
Section titled “harvestapi_search_companies”Search LinkedIn for companies using keyword, location, and company size filters. Returns paginated results with company name, description, and LinkedIn URL.
| Name | Type | Required | Description |
|---|---|---|---|
company_size | string | No | Company size range filter e.g. ‘1-10’, ‘11-50’, ‘51-200’. |
location | string | No | Location to filter companies by. |
page | integer | No | Page number for pagination (default: 1). |
search | string | No | Keyword to search for companies. |
harvestapi_search_geo
Section titled “harvestapi_search_geo”Search for LinkedIn geo IDs by location name. Returns matching geographic location IDs used for filtering people and job searches by location.
| Name | Type | Required | Description |
|---|---|---|---|
search | string | Yes | Location name to search for geo IDs. |
harvestapi_search_groups
Section titled “harvestapi_search_groups”Search LinkedIn groups by keyword. Returns paginated results with group name, description, and member count.
| Name | Type | Required | Description |
|---|---|---|---|
page | integer | No | Page number for pagination (default: 1). |
search | string | Yes | Keyword to search for groups. |
harvestapi_search_jobs
Section titled “harvestapi_search_jobs”Search LinkedIn job listings by keyword, location, company, workplace type, employment type, experience level, and salary. Returns paginated job listings with title, company, location, and LinkedIn URL.
| Name | Type | Required | Description |
|---|---|---|---|
company_id | string | No | Filter by LinkedIn company ID(s), comma-separated. |
easy_apply | boolean | No | When true, filter to jobs with LinkedIn Easy Apply only. |
employment_type | string | No | Filter by employment type. Accepted values: full-time, part-time, contract, temporary, internship (comma-separated). |
experience_level | string | No | Filter by experience level. Accepted values: internship, entry, associate, mid-senior, director, executive (comma-separated). |
location | string | No | Filter by job location text (city, country, or region). |
page | integer | No | Page number for pagination (default: 1). |
posted_limit | string | No | Filter by recency of posting. Accepted values: 24h, week, month. |
salary | string | No | Minimum salary filter. Accepted values: 40k+, 60k+, 80k+, 100k+, 120k+, 140k+, 160k+, 180k+, 200k+. |
search | string | No | Job title or keyword to search for. |
sort_by | string | No | Sort results by relevance or date. |
workplace_type | string | No | Filter by workplace type. Accepted values: office, hybrid, remote (comma-separated). |
harvestapi_search_leads
Section titled “harvestapi_search_leads”Search LinkedIn for leads using advanced filters including company, job title, location, seniority, industry, and experience. Supports LinkedIn Sales Navigator URLs.
| Name | Type | Required | Description |
|---|---|---|---|
company_headcount | string | No | Filter by company size e.g. ‘1-10’, ‘11-50’, ‘51-200’. |
current_companies | string | No | Filter by current company IDs or URLs (max 50, comma-separated). |
current_job_titles | string | No | Filter by current job titles (max 70, comma-separated). |
first_names | string | No | Filter by first names (max 70, comma-separated). |
geo_ids | string | No | LinkedIn Geo IDs for location filtering. Overrides locations. |
industry_ids | string | No | Filter by industry IDs (max 70, comma-separated). |
last_names | string | No | Filter by last names (max 70, comma-separated). |
locations | string | No | Location text filter (max 70, comma-separated). |
page | integer | No | Page number for pagination (default: 1, max: 100). |
past_companies | string | No | Filter by past company IDs or URLs (max 50, comma-separated). |
past_job_titles | string | No | Filter by past job titles (max 70, comma-separated). |
recently_changed_jobs | boolean | No | Filter for people who recently changed jobs. |
sales_nav_url | string | No | LinkedIn Sales Navigator URL to use as search override. |
search | string | No | Search query supporting LinkedIn operators. |
seniority_level_ids | string | No | Filter by seniority level IDs (comma-separated). |
years_of_experience_ids | string | No | Filter by years of total experience IDs. |
harvestapi_search_people
Section titled “harvestapi_search_people”Search LinkedIn for people using filters such as job title, current company, location, and industry. Uses LinkedIn Lead Search for unmasked results. Returns paginated profiles with name, title, location, and LinkedIn URL. All parameters are optional and comma-separated for multiple values.
| Name | Type | Required | Description |
|---|---|---|---|
company_headcount | string | No | Company headcount range filter, comma-separated (e.g. ‘1-10,11-50’). |
current_companies | string | No | Current company IDs or LinkedIn URLs, comma-separated (max 50). |
current_job_titles | string | No | Current job titles, comma-separated (max 70). e.g. ‘CTO,VP Engineering’ |
first_names | string | No | First names to filter by, comma-separated (max 70). |
industry_ids | string | No | LinkedIn industry IDs, comma-separated (max 70). |
last_names | string | No | Last names to filter by, comma-separated (max 70). |
locations | string | No | Location text, comma-separated (max 70). e.g. ‘San Francisco,New York’ |
page | integer | No | Page number for pagination (default: 1, max: 100). |
search | string | No | Fuzzy keyword search across name, title, and company. Supports LinkedIn search operators. |
seniority_level_ids | string | No | LinkedIn seniority level IDs, comma-separated. |
harvestapi_search_posts
Section titled “harvestapi_search_posts”Search LinkedIn posts by keyword, company, profile, or group. Supports filtering by post age and sorting. Returns paginated results with post content, author, and engagement data.
| Name | Type | Required | Description |
|---|---|---|---|
authors_company | string | No | Filter posts by the author’s current company URL. |
company | string | No | LinkedIn company URL to filter posts by. |
company_id | string | No | LinkedIn company ID to filter posts by. |
group | string | No | LinkedIn group URL to filter posts by. |
page | integer | No | Page number for pagination (default: 1). |
posted_limit | string | No | Filter by post age. e.g. ‘past-24h’, ‘past-week’, ‘past-month’. |
profile | string | No | LinkedIn profile URL to filter posts by. |
profile_id | string | No | LinkedIn profile ID to filter posts by. |
search | string | No | Keyword to search for in posts. |
sort_by | string | No | Sort results by ‘relevance’ or ‘date’. |
harvestapi_search_services
Section titled “harvestapi_search_services”Search LinkedIn profiles offering services by name, location, or geo ID. Returns paginated results.
| Name | Type | Required | Description |
|---|---|---|---|
geo_id | string | No | Filter by LinkedIn Geo ID. Overrides the location parameter. |
location | string | No | Filter by location text. |
page | integer | No | Page number for pagination (default: 1). |
search | string | Yes | Search profiles by service name or keyword. |