Advanced LinkedIn Job Search API avatar

Advanced LinkedIn Job Search API

Pricing

from $1.50 / 1,000 jobs

Go to Apify Store
Advanced LinkedIn Job Search API

Advanced LinkedIn Job Search API

Access our real-time LinkedIn Jobs database with over 10 million new jobs per month. With detailed company data, recruiter data, and AI enrichments! Get exact results with our advanced filters on title, description, location, company description, no. of employees, industry. Powered by Fantastic.jobs

Pricing

from $1.50 / 1,000 jobs

Rating

3.9

(12)

Developer

Fantastic.jobs

Fantastic.jobs

Maintained by Community

Actor stats

73

Bookmarked

4.1K

Total users

1.2K

Monthly active users

7.8 hours

Issues response

5 days ago

Last modified

Share

Warning, breaking changes from 2026-06-08

We're launching our new API on Fantastic.jobs! This comes with some changes to this Apify Actor as well. Please review the migration changelog carefully.

Some features of our new API are not available on Apify. Also, if you're retrieving more than 20,000 jobs per month, the API will likely be a better deal:

  • ATS, LinkedIn, Y Combinator, and Wellfound jobs combined under a single plan
  • Expired jobs endpoints with hourly refresh, compared to daily refresh on Apify
  • Endpoints to count the number of jobs before retrieving them
  • Advanced filtering parameters with Boolean search for job title, location, and description
  • Much faster response times to your queries

If you're interested, start building with the new API: developer.fantastic.jobs If not, please carry on below!

The perfect actor for applications requiring high quality LinkedIn jobs, every week, day, or hour! We aim to index all LinkedIn jobs worldwide, over 10 million roles per month!

For estimated monthly job counts per country, see our Country Job Statistics.

The maximum number of jobs per run is 5,000. If you wish to go over this number, please reach out to us!

Technical Details

  • This Actor calls a database that includes LinkedIn jobs indexed during the last hour, day, or week. Our scrapers are continuously indexing new roles, several hundreds of thousands every day!

  • You may choose a time range using the 'Time Range' parameter. Please note that there are slight differences between the ranges:

1h: Includes jobs that have been indexed by our systems during the last hour. These jobs can be older than 1 hour, for example a reposted job.

24h: Includes jobs that have been indexed by our systems during the last 24 hours. These jobs can be older than 24 hours, for example a reposted job.

7d: Includes jobs that have been indexed by our systems during the last 7 days. These jobs can be older than 7 days, for example a reposted job.

6m: Includes all active jobs from the last 6 months. This endpoint refreshes every minute with a 45 minute delay. Expired jobs are removed once per hour (we check every job once per hour)

Note: The 6m time range does NOT support the following search types: descriptionSearch, descriptionExclusionSearch. If any of these filters are used with the 6m time range, the run will return 0 jobs with an error message.

  • The job data is returned in our APIs with a one hour delay. For example, if a job is posted at 06:00 UTC, it will appear between 07:00 and 08:00 UTC

  • All jobs in the database are unique based on their URL. However, organizations occasionally create duplicates themselves. More commonly, organizations sometimes create the same job listing for multiple cities or states. If you wish to create a rich and unique dataset, we recommend further deduplication on title + organization, or title + organization + locations

  • All jobs are checked on expiry once per day. You can use our companion Actor to retrieve a daily list of expired jobs. The cost of using the companion actor is $20 per month.

  • We extract useful job details from the description with an LLM. We are currently enriching over 99.9% of all Technology jobs. Please note that our enrichment is a simple one-shot prompt on each job description, so there might be some errors.

  • There are a number of jobs on LinkedIn without jobposting schema. We also index these but they have slightly less features. These are marked with the field no_jb_schema=true:

  • Where included we provide the external apply url.

FAQ

Wait, this isn't a scraper?
Technically, no, or yes? We scrape all jobs in the backend, and you're accessing our database with scraped jobs with a small delay. This is a much more reliable system then scraping LinkedIn directly. This also allows us to enrich and derive data before sharing it with you, adding more value per job!

Can I see how many jobs will be returned for my query

Not at the moment, please test with the free plan or create an issue and we'll have a look for you! Make sure to include all parameters.

How can I retrieve a XML with the jobs from my latest run?

  • Follow the documentation to create a saved task: https://docs.apify.com/platform/actors/running/tasks
  • Create a schedule for the task: https://docs.apify.com/platform/schedules
  • Copy the following endpoint to access the latest succesfull run from your scheduled task:
    • Replace task-id with the the id of your task, which is the last string of characters in the task's url: Screenshot showing task ID location

    • Replace apiKey with your api key. You can find your API key at 'Settings' --> 'API & Integrations'

https://api.apify.com/v2/actor-tasks/*task-id*/runs/last/dataset/items?token=*apiKey*&format=xml&status=SUCCEEDED

You can export in several formats, not just XML. Please see the documentation for more information:

https://docs.apify.com/api/v2/actor-task-runs-last-get

https://docs.apify.com/api/v2/dataset-items-get

Input Parameters

Maximum Jobs

The maximum number of jobs that can be retrieved in a single run. Must be between 10 and 5,000.

Please set the memory to 512 for runs above 2,000 jobs!

Date Posted After

Filter jobs posted on or after a specific date using the datePostedAfter parameter.

Warning, some LinkedIn jobs don't include time and default to 00:00. Filter without time or don't use this parameter at all to be on the safe side. We don't recommend using this parameter if you retrieve jobs on a regular interval with the 1h/24h/7d time range.

  • datePostedAfter: A date or datetime string in UTC. Examples:
    • Date only: '2025-01-01'
    • With time: '2025-01-01T14:00:00'

Please keep in mind that the jobs posted date/time is UTC and there's a 1 to 2 hour delay before jobs appear on this API. Please be wary of duplicate jobs when using this filter.

Search Parameters

Our search parameters allow you to include or exclude jobs based on keywords. You may include :* for prefix matching (e.g., 'Soft:*' will match 'Software', 'Softball', etc.)

Location search uses phrase matching, so you must use the exact 'City, State/Region, Country' format. All locations use English names (e.g., 'Munich' not 'München', 'Bavaria' not 'Bayern'). For the UK, use the constituent country as the state (e.g., 'London, England, United Kingdom', 'Edinburgh, Scotland, United Kingdom'). For the US, use the full state name (e.g., 'New York, New York, United States', 'San Francisco, California, United States'). You can also search by just a country (e.g., 'United Kingdom') or a city (e.g., 'London'). Do not use abbreviations (NY, US, UK). If anything is unclear or you're unsure about the correct format for a location, please create an issue.

WARNING. The description searches are VERY intensive and at risk of time-out. Please be very specific, limit your searches to a handful of keywords, and combine with one of the other searches, preferably titleSearch. If you receive errors while using descriptionSearch or descriptionExclusionSearch, please reach out to us.

  • titleSearch: Terms to search in job titles
  • titleExclusionSearch: Terms to exclude from job titles
  • locationSearch: Terms to search in job locations
  • locationExclusionSearch: Terms to exclude from job locations
  • descriptionSearch: Terms to search in job descriptions (includes title) - Not supported with 6m time range
  • descriptionExclusionSearch: Terms to exclude from job descriptions (includes title) - Not supported with 6m time range
  • organizationSearch: Terms to search in organization names
  • organizationExclusionSearch: Terms to exclude from organization names

Description Type

Type of description to fetch. Options:

  • text: Plain text description
  • html: HTML formatted description

Remote (deprecated, use AI Work Arrangement)

Deprecated in favor of AI Work Arrangement (aiWorkArrangementFilter). When set to true, this is translated to ai_work_arrangement=Remote OK,Remote Solely. If you set AI Work Arrangement explicitly, this parameter is ignored. Set to false to include all jobs.

LinkedIn Filters

  • seniorityFilter: Filter by seniority level. Available options: "Associate", "Director", "Executive", "Mid-Senior level", "Entry level", "Not Applicable", "Internship" This filter applies to English speaking countries only. Other countries have seniority in their own language.

  • directApply: Filter for jobs that can be applied to directly through LinkedIn Easy Apply

  • noDirectApply: Filter for jobs that do NOT have LinkedIn Easy Apply (i.e. they redirect to an external apply flow)

  • organizationSlugFilter: Filter by LinkedIn organization slugs (exact match). The slug is the company specific part of the url. For example the slug in the following url is 'tesla-motors': https://www.linkedin.com/company/tesla-motors/

  • organizationSlugExclusionFilter: Exclude jobs from specific LinkedIn organization slugs (exact match)

  • industryFilter: Filter by LinkedIn industries. Use exact industry names. Industries containing commas will be automatically wrapped in quotes. You can find a list of industries on our website: https://fantastic.jobs/article/linkedin-industries

  • organizationEmployeesLte: Maximum number of employees in the company

  • organizationEmployeesGte: Minimum number of employees in the company

  • removeAgency: Filter out recruitment agencies, job boards and other low quality sources

  • aiEmploymentTypeFilter: Filter by AI-derived employment type. Normalized, market-independent values. Available options: FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER

  • EmploymentTypeFilter: Deprecated, use aiEmploymentTypeFilter. Filter by raw, source-provided employment type (values are country-specific and vary by job board). Available options: FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER

Recruiter URL Filter (Paid Add-On)

  • recruiterOnly: Only return jobs that include a recruiter_url (a link to the recruiter's LinkedIn profile). Default is false.

⚠️ Pricing notice: Enabling this filter triggers an additional per-result charge on top of the standard apify-default-dataset-item event. With the default pricing, this brings the combined cost up to 3× the base price per matching result (e.g. $0.005 base + $0.010 surcharge = $0.015/result, or $15 per 1,000). Charges are only applied to results that actually pass the filter — if no jobs match, no surcharge is billed.

AI Filters

AI-enriched fields are now included by default. The includeAi parameter has been removed. We are currently only enriching technology roles.

  • aiWorkArrangementFilter: Filter by work arrangement. Remote OK = remote with an office available. Remote Solely = remote with no office available. Include both to include all remote jobs. Available options: On-site, Hybrid, Remote OK, Remote Solely

  • hasSalary: Filter for jobs with salary information only. Set to false to include all jobs. Results include jobs that have either an AI enriched salary or a raw salary (discovered in the job posting schema). (Previously aiHasSalary, which still works as a deprecated alias.)

  • aiExperienceLevelFilter: Filter by years of experience. Available options: 0-2, 2-5, 5-10, 10+

  • aiVisaSponsorshipFilter: Filter for jobs offering visa sponsorship only. Set to false to include all jobs.

  • aiTaxonomiesFilter: Filter by AI taxonomies. This filter is quite broad. Available options: Technology, Healthcare, Management & Leadership, Finance & Accounting, Human Resources, Sales, Marketing, Customer Service & Support, Education, Legal, Engineering, Science & Research, Trades, Construction, Manufacturing, Logistics, Creative & Media, Hospitality, Environmental & Sustainability, Retail, Data & Analytics, Software, Energy, Agriculture, Social Services, Administrative, Government & Public Sector, Art & Design, Food & Beverage, Transportation, Consulting, Sports & Recreation, Security & Safety

  • aiTaxonomiesPrimaryFilter: Filter by primary AI taxonomy. This filter will select jobs based on their primary AI Taxonomy

  • aiTaxonomiesExclusionFilter: Exclude jobs by AI taxonomies.

  • populateAiRemoteLocation: If enabled, populates ai_remote_location with locations_derived when ai_remote_location is empty. Useful for normalizing location data.

  • populateAiRemoteLocationDerived: If enabled, populates ai_remote_location_derived with locations_derived when ai_remote_location_derived is empty. Useful for normalizing location data.

  • excludeATSDuplicate: Set this parameter to true to remove the majority of duplicate jobs between this API and the 'Career Site Job Listing API' actor

    We have created a system where LinkedIn jobs are checked against the ATS dataset. This system performs 2 exact-match checks:

    • A match of job title + organization name + country
    • A match of job title + LinkedIn company profile mapping + country

    Agency listings are now checked. If either check has a hit, the LinkedIn job will be flagged as ats_duplicate=true in the API output. If the job is checked and neither check has a hit, the LinkedIn job will be flagged as ats_duplicate=false.

    Jobs that are not checked will be flagged as ats_duplicate=null.

    We are hoping to flag the majority of duplicates in the datasets, but we are looking for exact hits only. This means that there will still be a number of false positives slipping through the cracks. To fully eliminate duplicates between the two datasets, we recommend adding a layer of fuzzy deduplication.

Output Schema

Output Fields

NameDescriptionType
idThe job's internal ID, also used for expiration. Now returned as an integer (previously a stringified number).number
titleJob Titletext
organizationName of the hiring organizationtext
organization_urlURL to the organization's pagetext
organization_logoURL to the organization's logotext
date_postedDate & Time of postingtimestamp
date_createdDate & Time of indexing in our systemstimestamp
date_valid_throughDate & Time of the future expiry date. Null in most cases.timestamp
locationsSource-supplied location objects per the Google JobPosting schema. Use the *_derived fields for normalized, geocoded values.json[]
locations_derivedDerived location data, matched with a database. This is the field you search locations on.text[] [{city, admin (state), country}]
location_typeTo identify remote jobs: 'TELECOMMUTE' per the Google JobPosting schematext
location_requirementsLocation requirement to accompany remote (TELECOMMUTE) jobs per the Google JobPosting schema.json[]
salarySource-supplied salary object per the Google JobPosting schema. Often partial; prefer the ai_salary_* fields.json
employment_typeTypes like 'Full Time', 'Contract', 'Internship'. Usually a single value; prefer ai_employment_type.text[]
urlThe URL of the job, can be used to direct traffic to apply for the jobtext
sourcethe source job board (e.g. linkedin, wellfound, ycombinator)text
source_type'jobboard' for this Actortext
source_domainthe domain of the job boardtext
description_textplain text job description - if includedtext
description_htmlraw HTML job description - if includedtext
cities_derivedAll cities from locations_derivedjson[]
regions_derivedAll regions/states/provinces from locations_derivedjson[]
countries_derivedAll countries from locations_derivedjson[]
timezones_derivedTimezones derived from locations_derivedjson[]
lats_derivedlats derived from locations_derivednumber[]
lngs_derivedlngs derived from locations_derivednumber[]
counties_derivedAll counties from locations_derived. Only present when cities_derived is not.text[]
senioritySeniority level: Associate, Director, Executive, Mid-Senior level, Entry level, Not Applicable, Internshiptext
direct_apply'true' if the end user can apply directly on the job page, in this case LinkedIn "easyapply". False if the job contains a link to a 3rd partybool
ats_duplicateSet to true if the LinkedIn job was matched to a duplicate in the 'Career Site Job Listing API' ATS dataset (via title + organization name + country, or title + LinkedIn company profile mapping + country). Set to false if checked but no match was found. null for jobs that are not checked. See the excludeATSDuplicate input parameter for filtering.bool
no_jb_schemaSet to true if the job was indexed from LinkedIn without JobPosting schema. These jobs have slightly different data from jobs with a schema: - locations has all location data under 'addressLocality' instead of being split up by region/country/locality. (locations_derived still has the split) - orglogo and jobimage both use the same company logo as seen on the page - The following fields are not included: location_type, location_requirements, salary, date_valid_throughbool
recruiter_namename of the recruiter (if present)text
recruiter_titletitle of the recruiter (if present)text
recruiter_urlurl to the LI profile of the recruiter (if present)text
org_linkedin_headcountthe number of employees within the job's company according to LinkedInint
org_linkedin_websiteurl to the company's main websitetext
org_linkedin_sizethe employee count range according to the companytext
org_linkedin_sloganthe company's slogantext
org_linkedin_industrythe company's industry. This is a fixed list that the company can choose from, so could be useful for classification. Keep in mind that this is in the language of the company's HQtext
org_linkedin_followersthe company's followers on LinkedInint
org_linkedin_headquartersthe company's HQ locationtext
org_linkedin_typethe company's type, like 'Privately Held', 'Public', etctext
org_linkedin_founded_datethe company's founded datetext
org_linkedin_specialtiesthe company's specialtiestext[]
org_linkedin_locationsthe full address of the company's locationstext[]
org_linkedin_descriptionthe description of the company's LinkedIn pagetext
org_linkedin_recruitment_agency_derivedIf the company is a recruitment agency or job board, true or false (AI-identified). The accuracy may vary.bool
org_linkedin_slugThe company-specific part of the LinkedIn URL (e.g. 'tesla-motors' in https://www.linkedin.com/company/tesla-motors/). Always returned, regardless of company-detail flags.text
linkedin_idThe LinkedIn job ID (the digits at the end of a linkedin.com/jobs/view/{id} URL). Returned as an integer. Distinct from the internal Fantastic.jobs id.int

AI Output Fields

We are currently only enriching technology roles

These AI-enriched fields are included by default (the deprecated includeAi parameter has been removed). These fields are derived from the text with an LLM and might contain mistakes.

NameDescriptionType
ai_salary_currencyThe salary currencytext
ai_salary_valueThe salary value, if there's a single salary with no salary rangenumeric
ai_salary_min_valueThe minimum salary in a rangenumeric
ai_salary_max_valueThe maximum salary in a rangenumeric
ai_salary_unit_textIf the salary is per HOUR/DAY/WEEK/MONTH/YEARtext
ai_benefitsAn array with other non-salary benefits mentioned in the job listingtext[]
ai_experience_levelyears of experience required, one of: 0-2, 2-5, 5-10, or 10+text
ai_work_arrangementRemote Solely/Remote OK/Hybrid/On-site. Remote solely is remote without an office available, Remote OK is remote with an optional office.text
ai_work_arrangement_office_dayswhen work_arrangement is Hybrid, returns the number of days per week in officebigint
ai_remote_locationWhen remote but only in a certain location, returns the locationtext[]
ai_remote_location_derivedDerived remote location data, which is the raw data (ai_remote_location) matched with a database of locations. This is the same database as the locations_derived field.text[]
ai_key_skillsAn array of key skills mentioned in the job listingtext[]
ai_hiring_manager_nameIf present, the hiring manager nametext
ai_hiring_manager_email_addressIf present, the hiring manager's email addresstext
ai_core_responsibilitiesA 2-sentence summary of the job's core responsibilitiestext
ai_requirements_summaryA 2-sentence summary of the job's requirementstext
ai_working_hoursThe number of required working hours. Defaults to 40 if not mentionedbigint
ai_employment_typeOne or more employment types as derived from the job description: FULL_TIME/PART_TIME/CONTRACTOR/TEMPORARY/INTERN/VOLUNTEER/PER_DIEM/OTHERtext[]
ai_job_languageThe language of the job descriptiontext
ai_visa_sponsorshipReturns true if the job description mentions Visa sponsorship opportunitiesboolean
ai_keywordsAn array of AI extracted keywords from the job descriptiontext[]
ai_taxonomies_aUp to 5 AI-assigned taxonomies ordered by relevancy; the first item is the primary taxonomytext[]
ai_educationAn array of AI extracted education requirements from the job descriptiontext[]

Deprecated Fields

These fields keep their old names during the migration window and mirror their new counterparts (same values). They are scheduled for removal on 2026-06-22 — please migrate to the new names before then. The remote_derived and external_apply_url output fields have been removed (use ai_work_arrangement for remote detection); the LinkedIn active-jb data no longer returns locations_alt_raw.

Deprecated fieldUse insteadType
date_validthroughdate_valid_throughtimestamp
locations_rawlocationsjson[]
location_requirements_rawlocation_requirementsjson[]
salary_rawsalaryjson
ai_salary_minvalueai_salary_min_valuenumeric
ai_salary_maxvalueai_salary_max_valuenumeric
ai_salary_unittextai_salary_unit_texttext
ai_education_requirementsai_educationtext[]
directapplydirect_applybool
linkedin_org_employeesorg_linkedin_headcountint
linkedin_org_urlorg_linkedin_websitetext
linkedin_org_sizeorg_linkedin_sizetext
linkedin_org_sloganorg_linkedin_slogantext
linkedin_org_industryorg_linkedin_industrytext
linkedin_org_followersorg_linkedin_followersint
linkedin_org_headquartersorg_linkedin_headquarterstext
linkedin_org_typeorg_linkedin_typetext
linkedin_org_foundeddateorg_linkedin_founded_datetext
linkedin_org_specialtiesorg_linkedin_specialtiestext[]
linkedin_org_locationsorg_linkedin_locationstext[]
linkedin_org_descriptionorg_linkedin_descriptiontext
linkedin_org_slugorg_linkedin_slugtext
linkedin_org_recruitment_agency_derivedorg_linkedin_recruitment_agency_derivedbool