Skip to content
Talk to an Engineer Dashboard

HarvestAPI

Connect to HarvestAPI to log time entries in Harvest and scrape LinkedIn profiles, companies, and job listings for recruiting, sales, and market research.

Connect to HarvestAPI to log and retrieve time entries in Harvest, and scrape LinkedIn profiles, companies, and job listings for recruiting, sales prospecting, and market research.

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.

import scalekit.client, os
from dotenv import load_dotenv
load_dotenv()
connection_name = "harvestapi" # connection name from Scalekit dashboard
identifier = "user_123" # must match the identifier used when adding the connected account
# Get credentials from app.scalekit.com → Developers → API Credentials
scalekit_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 URL
profile = scalekit_client.actions.request(
connection_name=connection_name,
identifier=identifier,
path="/profile",
method="GET",
params={"url": "https://www.linkedin.com/in/satyanadella"}
)
print(profile)
# Search LinkedIn for people by title and location
people = scalekit_client.actions.request(
connection_name=connection_name,
identifier=identifier,
path="/search/people",
method="GET",
params={"title": "VP of Engineering", "location": "San Francisco, CA"}
)
print(people)
# Scrape a LinkedIn company page
company = scalekit_client.actions.request(
connection_name=connection_name,
identifier=identifier,
path="/company",
method="GET",
params={"url": "https://www.linkedin.com/company/openai"}
)
print(company)
# Search LinkedIn job listings by keyword and location
jobs = scalekit_client.actions.request(
connection_name=connection_name,
identifier=identifier,
path="/search/jobs",
method="GET",
params={"keywords": "machine learning engineer", "location": "New York, NY"}
)
print(jobs)
# Scrape a single job listing by URL
job = scalekit_client.actions.request(
connection_name=connection_name,
identifier=identifier,
path="/job",
method="GET",
params={"url": "https://www.linkedin.com/jobs/view/1234567890"}
)
print(job)
# Bulk scrape multiple LinkedIn profiles in one request
bulk = scalekit_client.actions.request(
connection_name=connection_name,
identifier=identifier,
path="/profiles/bulk",
method="POST",
json={
"urls": [
"https://www.linkedin.com/in/satyanadella",
"https://www.linkedin.com/in/jeffweiner08",
"https://www.linkedin.com/in/reidhoffman"
]
}
)
print(bulk)

Create a new time entry in Harvest for a specific project and task. Supports both duration-based (hours) and start/end time-based logging. Returns the created time entry with its ID, billable status, and invoice details.

NameTypeRequiredDescription
project_idintegerYesHarvest project ID to log time against
task_idintegerYesHarvest task ID within the project
spent_datestringYesDate of the time entry in YYYY-MM-DD format
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). Requires ended_time.
ended_timestringNoEnd time for timer-based entry (e.g., 9:30am). Requires started_time.
notesstringNoNotes or description for the time entry
user_idintegerNoUser ID to log time for. Defaults to the authenticated user. Requires admin permissions to set for other users.

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 with optional filters. Returns project details including name, client, budget, billing method, start and end dates, and active status.

NameTypeRequiredDescription
client_idintegerNoFilter projects by client ID
is_activebooleanNoFilter by active status
updated_sincestringNoISO 8601 datetime — return only projects updated after this timestamp
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 with optional filters. Returns user profiles including name, email, roles, and weekly capacity.

NameTypeRequiredDescription
is_activebooleanNoFilter by active status
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. Requires the Harvest-Account-Id header returned during OAuth.

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, 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).

NameTypeRequiredDescription
profile_urlstringNoFull LinkedIn profile URL (e.g., https://www.linkedin.com/in/satyanadella). Use this or public_identifier.
public_identifierstringNoLinkedIn profile handle — the slug after /in/ (e.g., satyanadella). Use this or profile_url.
mainbooleanNoReturn a simplified profile using 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.

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

NameTypeRequiredDescription
company_urlstringNoFull LinkedIn company page URL (e.g., https://www.linkedin.com/company/microsoft).
universal_namestringNoLinkedIn company universal name — the slug after /company/ (e.g., microsoft).
searchstringNoCompany name to search for. Returns the most relevant match.

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.

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). Comma-separate multiple values.
locationstringNoLocation filter by city, state, or country. Comma-separate multiple values.
industrystringNoIndustry vertical filter. Comma-separate multiple values.
pageintegerNoPage number for pagination. Starts at 1. 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 to search for (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 employment 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. Starts at 1. Defaults to 1.

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.

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

Batch scrape multiple LinkedIn profiles in a single request using the HarvestAPI Apify scraper. Accepts a list of LinkedIn profile URLs. Returns an array of profile objects in the same order as the input. Each profile counts as one credit.

Pricing: $4 per 1,000 profiles; $10 per 1,000 profiles with email. Requires an Apify API token.

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. Obtain from console.apify.com/settings/integrations.