Skip to content
Talk to an Engineer Dashboard

HarvestAPI

Connect to HarvestAPI to log time in Harvest and access LinkedIn data — profiles, companies, posts, ads, jobs, and connection management.

Connect to HarvestAPI to log and retrieve time entries in Harvest, and access live LinkedIn data — scrape profiles, companies, and jobs; search for people, companies, and posts; and manage connection requests and messages on behalf of a LinkedIn account.

HarvestAPI logo

Supports authentication: API Key

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.

  1. 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.

  2. Create a connection in Scalekit

    In Scalekit dashboard, go to Agent AuthCreate Connection. Find HarvestAPI and click Create.

  3. 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 dashboard
const identifier = 'user_123'; // must match the identifier used when adding the connected account
// Get credentials from app.scalekit.com → Developers → API Credentials
const 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 URL
const 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 location
const 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 page
const 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 location
const 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 URL
const 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 request
const 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);

Scalekit Tools

Create a new time entry in Harvest for a specific project and task. Returns the created time entry with its ID, billable status, and invoice details.

Supports two logging modes:

  • Duration-based: provide hours (e.g., 1.5 for 90 minutes)
  • Timer-based: provide both started_time and ended_time (e.g., 8:00am / 9:30am)

If neither hours nor start/end times are provided, Harvest creates a running timer that you must stop manually.

NameTypeRequiredDescription
project_idintegerYesHarvest project ID to log time against. Use list_projects to find IDs.
task_idintegerYesHarvest task ID within the project.
spent_datestringYesDate of the time entry in YYYY-MM-DD format (e.g., 2025-03-16)
hoursnumberNoDuration in decimal hours (e.g., 1.5 for 90 minutes). Use this or started_time/ended_time.
started_timestringNoStart time for timer-based entry (e.g., 8:00am). Must be paired with ended_time.
ended_timestringNoEnd time for timer-based entry (e.g., 9:30am). Must be paired with started_time.
notesstringNoNotes or description for the time entry
user_idintegerNoUser ID to log time for. Defaults to the authenticated user. Admin permissions required to log for another user.

List time entries in your Harvest account with optional filters by project, user, client, task, or date range. Returns paginated time entries with hours logged, notes, billable status, and associated project, task, and user details.

NameTypeRequiredDescription
project_idintegerNoFilter by Harvest project ID
user_idintegerNoFilter by Harvest user ID
client_idintegerNoFilter by Harvest client ID
task_idintegerNoFilter by Harvest task ID
fromstringNoStart of date range in YYYY-MM-DD format
tostringNoEnd of date range in YYYY-MM-DD format
is_billedbooleanNoFilter by billed status
is_runningbooleanNoReturn only active running timers when true
pageintegerNoPage number for pagination. Defaults to 1.
per_pageintegerNoNumber of results per page (max 100). Defaults to 100.

List all projects in your Harvest account. Returns project details including name, client, budget, billing method, start and end dates, and active status. Use this to find project_id values for log_time_entry.

NameTypeRequiredDescription
client_idintegerNoFilter projects by client ID
is_activebooleanNoFilter by active status. Set true to return only active projects.
updated_sincestringNoISO 8601 datetime — return only projects updated after this timestamp (e.g., 2025-01-01T00:00:00Z)
pageintegerNoPage number for pagination. Defaults to 1.
per_pageintegerNoNumber of results per page (max 100). Defaults to 100.

List all users in your Harvest account. Returns user profiles including name, email, roles, and weekly capacity. Use this to find user_id values for filtering time entries or logging on behalf of another user.

NameTypeRequiredDescription
is_activebooleanNoFilter by active status. Set true to return only active users.
updated_sincestringNoISO 8601 datetime — return only users updated after this timestamp
pageintegerNoPage number for pagination. Defaults to 1.
per_pageintegerNoNumber of results per page (max 100). Defaults to 100.

Retrieve a Harvest user profile by user ID, including name, email, roles, weekly capacity, and avatar. Use list_users to discover user IDs.

NameTypeRequiredDescription
user_idstringYesHarvest user ID

Retrieve the Harvest company (account) information for the authenticated user, including company name, base URI, plan type, clock format, currency, and weekly capacity settings. Takes no parameters.

Scrape a LinkedIn profile by URL or public identifier. Returns contact details, current and past employment history, education, skills, and profile metadata. Provide either profile_url or public_identifier — at least one is required.

Use main=true to get a simplified profile faster and at fewer credits. Enable find_email=true only when email is needed — it costs extra credits per successful match.

NameTypeRequiredDescription
profile_urlstringNo*Full LinkedIn profile URL (e.g., https://www.linkedin.com/in/satyanadella). Use this or public_identifier.
public_identifierstringNo*LinkedIn profile handle — the slug after /in/ (e.g., satyanadella). Use this or profile_url.
mainbooleanNoReturn a simplified profile at fewer credits (~2.6s). Defaults to false (full profile, ~4.9s).
find_emailbooleanNoAttempt to find the contact’s email address. Costs extra credits per successful match. Defaults to false.

*Provide either profile_url or public_identifier — at least one is required.

Scrape a LinkedIn company page for overview, headcount, employee count range, follower count, locations, specialties, industries, and funding data. Provide at least one of company_url, universal_name, or search.

NameTypeRequiredDescription
company_urlstringNo*Full LinkedIn company page URL (e.g., https://www.linkedin.com/company/microsoft).
universal_namestringNo*Company universal name — the slug after /company/ (e.g., microsoft).
searchstringNo*Company name to search for. Returns the most relevant match. Useful when you don’t have the URL.

*Provide at least one of company_url, universal_name, or search.

Retrieve full job listing details from LinkedIn. Returns title, company, description, requirements, salary, location, workplace type, employment type, applicant count, and application details. Provide either job_url or job_id — at least one is required.

NameTypeRequiredDescription
job_urlstringNo*Full LinkedIn job posting URL (e.g., https://www.linkedin.com/jobs/view/1234567890). Use this or job_id.
job_idstringNo*LinkedIn job listing ID. Use this or job_url.

*Provide either job_url or job_id — at least one is required.

Batch scrape multiple LinkedIn profiles in a single request using the HarvestAPI Apify scraper. Returns an array of profile objects in the same order as the input. Failed profiles return an error object instead of profile data.

Pricing: $4 per 1,000 profiles; $10 per 1,000 profiles with email.

NameTypeRequiredDescription
urlsarray<string>YesList of LinkedIn profile URLs to scrape. Each entry must be a full URL (e.g., https://www.linkedin.com/in/username). Maximum 50 URLs per request.
apify_tokenstringYesApify API token from console.apify.com/settings/integrations

Search LinkedIn profiles using basic filters. Returns paginated profiles with name, title, location, and LinkedIn URL.

NameTypeRequiredDescription
searchstringYesName or keywords to search for (e.g., "Jane Smith")
titlestringNoJob title filter (e.g., "Software Engineer")
companystringNoCurrent or past company name filter
schoolstringNoSchool or university name filter
locationstringNoLocation filter by city, state, or country
pageintegerNoPage number for pagination. Defaults to 1.

Search LinkedIn for people using filters such as job title, current company, location, and industry. Uses LinkedIn Lead Search for unmasked results. All parameters are optional and support comma-separated values for multiple filters.

NameTypeRequiredDescription
keywordsstringNoFree-text search terms matched against name, headline, and bio
titlestringNoJob title filter (e.g., "VP of Engineering"). Comma-separate multiple values.
companystringNoCurrent company name filter (e.g., "OpenAI,Anthropic"). Comma-separate multiple values.
locationstringNoLocation filter by city, state, or country. Comma-separate multiple values.
industrystringNoIndustry vertical filter (e.g., "Software,Healthcare"). Comma-separate multiple values.
pageintegerNoPage number for pagination. Defaults to 1.

Search LinkedIn profiles that offer specific services — freelancers, consultants, and service providers. Returns paginated profiles with name, position, location, and LinkedIn URL.

NameTypeRequiredDescription
searchstringYesService name or keywords (e.g., "UX design", "tax consulting")
locationstringNoLocation filter by city, state, or country
geo_idstringNoLinkedIn Geo ID for the location — overrides location when provided. Use search_geo_id to look up Geo IDs.
pageintegerNoPage number for pagination. Defaults to 1.

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.

NameTypeRequiredDescription
keywordsstringNoJob title or skill keywords (e.g., "machine learning engineer")
locationstringNoLocation filter by city, state, or country (e.g., "New York, NY")
companystringNoFilter listings by company name (e.g., "Stripe")
workplace_typestringNoFilter by workplace arrangement: remote, on-site, or hybrid
employment_typestringNoFilter by contract type: full-time, part-time, contract, temporary, volunteer, internship
experience_levelstringNoFilter by seniority: entry, associate, mid-senior, director, executive
salarystringNoSalary range filter (format varies by region)
pageintegerNoPage number for pagination. Defaults to 1.

Search for companies on LinkedIn by name, industry, company size, or location. Returns a paginated list of company results with name, domain, headcount, industry, and LinkedIn URL.

NameTypeRequiredDescription
searchstringYesKeywords to match against company names (e.g., "AI infrastructure")
locationstringNoFilter by city, state, or country
company_sizestringNoFilter by headcount range: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+
industry_idstringNoFilter by LinkedIn industry ID. Comma-separate multiple IDs (e.g., "4,96"). Industry IDs can be found in the LinkedIn API documentation.
pageintegerNoPage number for pagination. Defaults to 1.

Search for LinkedIn groups by keyword or topic. Returns group name, member count, description, and LinkedIn URL. Use this to discover groups before fetching posts or details with get_linkedin_group and get_group_posts.

NameTypeRequiredDescription
searchstringYesKeywords to search for groups (e.g., "AI product managers")
pageintegerNoPage number for pagination. Defaults to 1.

Retrieve details for a LinkedIn group including name, description, member count, and group metadata. Provide either group_url or group_id — at least one is required.

NameTypeRequiredDescription
group_urlstringNo*Full LinkedIn group URL (e.g., https://www.linkedin.com/groups/1234567). Use this or group_id.
group_idstringNo*LinkedIn group ID. Use this or group_url.

*Provide either group_url or group_id — at least one is required.

Retrieve posts from a LinkedIn group. Returns post content, author info, engagement stats, and timestamps. Provide either group_url or group_id.

NameTypeRequiredDescription
group_urlstringNo*Full LinkedIn group URL. Use this or group_id.
group_idstringNo*LinkedIn group ID. Use this or group_url.
pageintegerNoPage number for pagination. Defaults to 1.

*Provide either group_url or group_id — at least one is required.

Retrieve recent LinkedIn posts from a person’s profile. Returns post content, engagement stats, and timestamps. Provide either profile_url or public_identifier.

NameTypeRequiredDescription
profile_urlstringNo*Full LinkedIn profile URL. Use this or public_identifier.
public_identifierstringNo*LinkedIn handle — the slug after /in/ (e.g., satyanadella). Use this or profile_url.
pageintegerNoPage number for pagination. Defaults to 1.

*Provide either profile_url or public_identifier — at least one is required.

Retrieve recent LinkedIn posts from a company page. Returns post content, likes, comments, shares, and engagement stats. Provide either company_url or universal_name.

NameTypeRequiredDescription
company_urlstringNo*Full LinkedIn company page URL. Use this or universal_name.
universal_namestringNo*Company universal name — the slug after /company/ (e.g., openai). Use this or company_url.
posted_limitstringNoFilter posts by recency: 24h, week, or month
pageintegerNoPage number for pagination. Defaults to 1.

*Provide either company_url or universal_name — at least one is required.

Search for LinkedIn posts by keyword, author, company, or content type. Returns paginated posts with content, engagement metrics, and author info. All parameters are optional — provide at least one for meaningful results.

NameTypeRequiredDescription
searchstringNoKeywords to search in post content (e.g., "generative AI regulation")
profilestringNoFilter posts by author LinkedIn profile URL. Comma-separate multiple URLs.
companystringNoFilter posts by company LinkedIn URL. Comma-separate multiple URLs.
content_typestringNoFilter by post format: videos, images, documents, live_videos
posted_limitstringNoFilter by recency: 24h, week, or month
sort_bystringNoSort order: relevance (default) or date
pageintegerNoPage number for pagination. Defaults to 1.

Retrieve full details of a LinkedIn post, including content, author, likes, comments, shares, and engagement metrics. Provide either post_url or activity_id — at least one is required.

NameTypeRequiredDescription
post_urlstringNo*Full LinkedIn post URL. Use this or activity_id.
activity_idstringNo*LinkedIn activity ID of the post (found in the post URL). Use this or post_url.

*Provide either post_url or activity_id — at least one is required.

Retrieve comments on a LinkedIn post. Returns commenter profiles, comment text, likes, and timestamps.

NameTypeRequiredDescription
poststringYesFull LinkedIn post URL
sort_bystringNoSort order: relevance (default) or date
pageintegerNoPage number for pagination. Defaults to 1.

Retrieve users who reacted to a LinkedIn post, including their name, title, and reaction type.

Reaction types: like, celebrate, support, insightful, funny, love

NameTypeRequiredDescription
poststringYesFull LinkedIn post URL
pageintegerNoPage number for pagination. Defaults to 1.

Retrieve replies to a specific LinkedIn comment. Returns reply content, author info, and engagement stats.

NameTypeRequiredDescription
comment_urlstringYesLinkedIn comment URL or comment ID
pageintegerNoPage number for pagination. Defaults to 1.

Retrieve users who reacted to a specific LinkedIn comment, including their name, title, and reaction type.

NameTypeRequiredDescription
comment_urlstringYesLinkedIn comment URL or comment ID
pageintegerNoPage number for pagination. Defaults to 1.

Retrieve recent comments made by a LinkedIn profile. Returns comment content, the post context, and timestamps. Provide either profile_url or public_identifier.

NameTypeRequiredDescription
profile_urlstringNo*Full LinkedIn profile URL. Use this or public_identifier.
public_identifierstringNo*LinkedIn handle — the slug after /in/. Use this or profile_url.
pageintegerNoPage number for pagination. Defaults to 1.

*Provide either profile_url or public_identifier — at least one is required.

Retrieve recent reactions (likes, celebrates, etc.) made by a LinkedIn profile on posts and articles. Provide either profile_url or public_identifier.

NameTypeRequiredDescription
profile_urlstringNo*Full LinkedIn profile URL. Use this or public_identifier.
public_identifierstringNo*LinkedIn handle — the slug after /in/. Use this or profile_url.
pageintegerNoPage number for pagination. Defaults to 1.

*Provide either profile_url or public_identifier — at least one is required.

Search LinkedIn ads using keywords, account owner, country, and date filters. Returns paginated ad results including ad content, creative, and targeting details.

Provide either search_url (a LinkedIn Ad Library URL) or keyword/filter parameters — the two approaches are mutually exclusive.

NameTypeRequiredDescription
search_urlstringNoLinkedIn Ad Library search URL. Use this or keyword/filter parameters.
keywordstringNoSearch ads by keyword
account_ownerstringNoFilter by company or advertiser name
countriesstringNoComma-separated ISO country codes (e.g., "US,GB") or "ALL" for global results
date_optionstringNoDate range preset: last-30-days, current-month, current-year, last-year, or custom-date-range
start_datestringNoStart of custom date range in YYYY-MM-DD format. Only applies when date_option is custom-date-range.
end_datestringNoEnd of custom date range in YYYY-MM-DD format. Only applies when date_option is custom-date-range.
pagination_tokenstringNoToken returned in the previous response for fetching the next page of results

Retrieve details of a specific LinkedIn ad from the Ad Library, including ad content, creative, advertiser, and targeting information. Provide either ad_url or ad_id — at least one is required.

NameTypeRequiredDescription
ad_urlstringNo*LinkedIn Ad Library URL for the specific ad. Use this or ad_id.
ad_idstringNo*LinkedIn ad ID. Use this or ad_url.

*Provide either ad_url or ad_id — at least one is required.

Search for LinkedIn geographic IDs (geoId) by location name. Use the returned geoId values as precise location filters in search_jobs and search_profile_servicesgeoId overrides text-based location filters and produces more accurate results.

NameTypeRequiredDescription
searchstringYesLocation name to look up (e.g., "San Francisco", "United Kingdom", "Greater London")

Send a LinkedIn connection request to a profile on behalf of a LinkedIn account. Optionally include a personalized message (max 300 characters).

NameTypeRequiredDescription
profilestringYesLinkedIn profile URL, public identifier, or profile ID of the recipient
cookiestringYesLinkedIn session cookie (li_at) for the sending account
messagestringNoPersonalized connection message (max 300 characters). Omit to send without a note.
proxystringNoProxy server URL for the request (e.g., http://user:pass@proxy.example.com:8080)

Retrieve pending connection requests sent from a LinkedIn account. Returns recipient profiles and request timestamps.

NameTypeRequiredDescription
cookiestringYesLinkedIn session cookie (li_at) for the account
proxystringNoProxy server URL for the request

Retrieve pending connection requests received on a LinkedIn account. Returns sender profiles, optional messages, and request timestamps. Use the invitation_id and shared_secret from each result to accept requests with accept_connection_request.

NameTypeRequiredDescription
cookiestringYesLinkedIn session cookie (li_at) for the account
proxystringNoProxy server URL for the request

Accept a pending LinkedIn connection request. The invitation_id and shared_secret are returned by get_received_connection_requests.

NameTypeRequiredDescription
invitation_idstringYesID of the connection invitation to accept (from get_received_connection_requests)
shared_secretstringYesShared secret for the invitation (from get_received_connection_requests)
cookiestringYesLinkedIn session cookie (li_at) for the account
proxystringNoProxy server URL for the request

Send a direct message to a LinkedIn connection on behalf of a LinkedIn account. The recipient must be a 1st-degree connection — you cannot message people you are not connected with.

NameTypeRequiredDescription
recipient_profilestringYesLinkedIn profile URL of the message recipient
messagestringYesText content of the direct message
cookiestringYesLinkedIn session cookie (li_at) for the sending account
proxystringNoProxy server URL for the request

Retrieve information about the current HarvestAPI user account. Call this before high-volume scraping workflows to verify you have sufficient credits. Takes no parameters.

Returns:

FieldDescription
idYour HarvestAPI user ID
emailAccount email address
creditsCurrent credit balance
credits_usedTotal credits consumed to date
planActive subscription plan name
rate_limitMaximum API requests per second for your plan
created_atAccount creation timestamp

Retrieve the list of private LinkedIn account pools configured on your HarvestAPI account. Private pools route requests through dedicated LinkedIn accounts, providing better rate limit isolation for high-volume workflows. Takes no parameters.

Returns an array of pools, each containing:

FieldDescription
idPool ID — pass this as usePrivatePool in supported tools
nameDisplay name of the pool
accounts_countNumber of LinkedIn accounts in the pool
statusPool status: active or inactive
created_atPool creation timestamp