Career Site Jobs

Şirket kariyer sitelerinden güncel iş ilanlarını almak için bir MCP sunucusu.

Dokümantasyon

Career Site Job Listing API (fantastic-jobs/career-site-job-listing-api) Actor

The perfect Job Posting API for high-quality real jobs! Direct postings from over 175k+ company career sites across 54 ATS platforms like: Workday, Greenhouse, and Ashby. Enriched with AI and LinkedIn company data! Includes Lever, Rippling, SuccessFactors, iCIMS. Powered by Fantastic.jobs

Pricing

from $4.00 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events. Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows. In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours, and optionally produces a well-defined JSON output, datasets with results, or files in key-value store. In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server. Actors are written with capital "A".

How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects. You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready. The best way to integrate Actors is as follows.

  • AI agents and MCP clients — the Apify MCP server at https://mcp.apify.com (remote, streamable HTTP, OAuth on first use).
  • Agentic workflows and local Actor developmentAgent Skills with the Apify CLI: npm install -g apify-cli, then apify login.
  • JavaScript/TypeScript projects — the official JS/TS client: npm install apify-client.
  • Python projects — the official Python client: pip install apify-client.
  • Any other language — the REST API.

For usage examples, see the API section below.

For more details, see Apify documentation as Markdown index and Markdown full-text.

README

Check out our instruction video on how to add jobs automatically to your job board:

https://www.youtube.com/watch?v=p96zMGQdKUU

The perfect actor for job boards requiring high quality jobs, every week, day, or hour! We scrape data from 54 ATS Platforms, which covers over 200k company career sites. Jobs are stored in our database and enriched with AI and LinkedIn company profiles. We typically index over 1.8 million jobs every month

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

Jobs in this Actor are solely from Career Sites / ATS platforms, allowing your users to directly apply with the employer without the need of a 3rd party.

Also available: the Fantastic.jobs API

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

  • ATS, LinkedIn, Y Combinator, and Wellfound jobs combined under a single plan
  • An endpoint for modified jobs
  • Expired jobs endpoints with hourly refresh, compared to daily refresh on Apify
  • Advanced company details with Glassdoor, Crunchbase, and news articles
  • 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

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

Difference between this Actor and the Career Site Job Listing Feed

  • This Actor is incremental en contains new jobs posted/indexed during a set time frame (1 hour, 24 hours, 1 week). It comes with a companion Actor for expired jobs.
  • This Actor works well for a multitude of applications that require fresh jobs like advanced job boards, lead gen and more.
  • The Career Site Job Listing Feed contains all active jobs from the last 6 months every time your run the actor (up to your configured limit).
  • The Career Site Job Listing Feed works well with job board software requiring an active XML feed with auto-deletion once a job is removed from the feed.

If you like this actor, please have a look at our LinkedIn Jobs API! We deduplicate between these actors!

The Data

We currently have jobs for the following ATS:

ADPApplicantProAshby
BambooHRBreezy HRCareerPlug
ComeetCSODDayforce
DoverEightfoldFirstStage
FreshteamGemGoHire
GreenhouseHiBobHireBridge
HireHiveHireologyHiringThing
iCIMSiSolvedJazzHR
JobviteJOIN.comKula
Lever.coManatalOraclecloud
PageUpParadoxPaycom
PaycorPaylocityPersonio
PhenompeoplePinpointPolymer
RecruiteeRecootyRippling
RivalSmartRecruitersSuccessFactors
TaleoTeamTailorTrakstar
TriNetUltiProWeRecruit
WorkableWorkdayZoho Recruit

In addition, we currently have jobs for the following organizations not using an ATS:

  • Apple
  • Amazon
  • Meta
  • Google

Missing an organization? Please let us know and we might be able to add it to the database

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

Technical Details

  • This Actor calls a database that includes ATS and career site jobs indexed during the last hour, day, week, or 6 months (for backfill purposes)

  • You may choose a time range using the 'Time Range' paramater. Pleae 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 new ATS customer or a reposted job.

24h: Includes jobs that have been indexed by our systems during the last 24 hours. These jobs can be older than 1 hour, for example a new ATS customer or 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 new ATS customer or a reposted job.

6m: Includes jobs that have been posted during the last 6 months.

  • 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

  • Our scrapers run continuously. We typically add a new job to our database within 3 hours of posting!

  • 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 will add new ATS platforms regularly, please check every once in a while if you apply filters on 'ats'.

  • 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

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

  • We attempt to map every job to a LinkedIn Company profile, bringing in useful data like the number of employees, industry, and more. Please note that this enrichment is AI assisted, so there might be some errors. We've measured accuracy at 99%. Over 95% of jobs include LinkedIn Company data.

  • Domain Derived. Since ATS platforms don’t always include the domain or homepage of the company, we’ve developed a system to identify the company’s domain. This can be very helpful to do further analysis and enrichments. The accuracy is ~98%

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 since we're targeting over 200,000 company career sites across 54 ATS platforms. This also allows us to enrich and derive data before sharing it with you, adding more value per job!

I wish to retrieve a feed of active jobs, is this possible?
A: Your use case is likely more suited for our Feed Actor, which has a more friendly price for this purpose: https://apify.com/fantastic-jobs/career-site-job-listing-feed

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!

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. We're here to

  • 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)
  • descriptionExclusionSearch: Terms to exclude from job descriptions (includes title)
  • organizationSearch: Terms to search in organization names
  • organizationExclusionSearch: Terms to exclude from organization names

Domain Filter

Alternative for organizationSearch. Allows filtering on company domain instead of searching on name. Requires an exact match.

  • domainFilter: Domains to include
  • domainExclusionFilter: Domains to exclude

Has No Location

  • hasNoLocation: Return only jobs with no normalized location (locations_derived is null). Useful for surfacing jobs whose source feed didn't include structured location data. Don't combine with location search, which would always return zero rows.

Description Type

Type of description to fetch. Options:

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

Remote (deprecated, use AI Work Arrangement)

The remote only (legacy) parameter is deprecated. When set to true it is translated to aiWorkArrangementFilter = Remote OK,Remote Solely, and it is ignored if you set aiWorkArrangementFilter explicitly. Use the AI Work Arrangement filter directly for more precise results.

ATS

Array of ATS platforms to filter by. Available options:

  • adp, applicantpro, ashby, bamboohr, breezy, careerplug, comeet, csod, dayforce, dover, eightfold, firststage, freshteam, gem, gohire, greenhouse, hibob, hirebridge, hirehive, hireology, hiringthing, icims, isolved, jazzhr, jobvite, join.com, kula, lever.co, manatal, oraclecloud, pageup, paradox, paycom, paycor, paylocity, personio, phenompeople, pinpoint, polymer, recruitee, recooty, rippling, rival, smartrecruiters, successfactors, taleo, teamtailor, trakstar, trinet, ultipro, werecruit, workable, workday, zoho

ATS Exclusion Filter

Array of ATS platforms to exclude. This allows you to filter out jobs from specific ATS platforms.

Remove Agency Jobs

  • removeAgency: Filter out recruitment agencies

Date Posted After

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

Warning, several ATS 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.

AI Filters

AI-enriched fields are now included by default. The includeAi parameter has been removed.

  • aiEmploymentTypeFilter: Filter by employment type. Available options: FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER

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

  • aiLanguageFilter: Filter by the AI-detected language of the job description (e.g. English, French, German, Spanish). Matches the ai_job_language field.

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

LinkedIn Filters

  • includeCompanyDetails: Include basic company data fields (LinkedIn, Crunchbase, logo). We use AI to map each job to a LinkedIn organization. We map over 95% of all jobs with 99% accuracy. (Previously includeLinkedIn, which still works as a deprecated alias.)

  • liIndustryFilter: Filter by LinkedIn industries. You can find an overview on our website: LinkedIn Industries

  • liIndustryExclusionFilter: Exclude jobs from specific LinkedIn industries. Same exact, case-sensitive matching as liIndustryFilter.

  • liOrganizationEmployeesLte: Maximum number of employees in the company. Must be greater than or equal to 0.

  • liOrganizationEmployeesGte: Minimum number of employees in the company. Must be greater than or equal to 0.

  • liOrganizationSizeFilter: Filter by LinkedIn company-size bucket (matches the org_linkedin_size field). Available options: 1, 2-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+

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_logoDeprecated: ATS-supplied logo URL that may break or expire. Prefer org_logo_permalink.text
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_altFallback location string used when the source ATS doesn't supply structured location data.text
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 ATS or career sitetext
source_typealways 'ats' for this Actortext
source_domainthe domain of the career site. Not present for all ATS; use domain_derived.text
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_derivedjson[]
lngs_derivedlngs derived from locations_derivednumber[]
counties_derivedAll counties from locations_derived. Only present when cities_derived is not.text[]
date_modifiedDate & time of the most recent modification. Only returned with time_frame=6m.timestamp
modified_fieldsField names changed in the most recent modification. Only with time_frame=6m.text[]
domain_derivedWe use AI to discover the domain of the employer's main website. The accuracy of this field is ~98%text

AI Output Fields

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[]

Company Output Fields

Set includeCompanyDetails to true to include the fields in this table (the old includeLinkedIn name still works as a deprecated alias). These fields are matched to the job company with AI and might contain mistakes.

NameDescriptionType
org_linkedin_nameThe company's full name from LinkedIntext
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 this flag, so jobs can be joined to organization data.text
org_crunchbase_categoriesList of Crunchbase categories the company is tagged withtext[]
org_crunchbase_total_investmentTotal investment in USD raised by the company according to Crunchbaseint
org_logo_permalinkStable hosted URL for the company's logotext

Actor input Schema

timeRange (type: string):

Select the time range for job listings. You can choose between hourly (1h), daily (24h), weekly (7d), or backfill of all active jobs (great to get started, 6m). We strongly recommend running the Actor at the same time every hour/day/week to ensure that you get all jobs withou duplicates

limit (type: integer):

Maximum number of jobs to return per run. The minimum is 10 and the maximum is 5,000. Please set the memory to 1GB for runs above 2,000 jobs.

includeCompanyDetails (type: boolean):

Include basic company data fields (LinkedIn, Crunchbase, logo). We use AI to map each job to a LinkedIn organization. We map over 95% of all jobs with 99% accuracy.

titleSearch (type: array):

Array of job titles to search for. Use :* for prefix matching (e.g., 'Soft:*' will match 'Software', 'Softball', etc.)

titleExclusionSearch (type: array):

Array of job titles to exclude. Use :* for prefix matching (e.g., 'Soft:*' will match 'Software', 'Softball', etc.)

locationSearch (type: array):

Array of locations to search for. 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). Use :* for prefix matching (e.g., 'New:*' will match 'New York', 'New Jersey', etc.). If anything is unclear, please create an issue.

locationExclusionSearch (type: array):

Array of locations to exclude. Location search uses phrase matching, so you must use the exact 'City, State/Region, Country' format. All locations use English names. For the UK, use the constituent country as the state (e.g., 'London, England, United Kingdom'). Do not use abbreviations (NY, US, UK). Use :* for prefix matching (e.g., 'New:*' will match 'New York', 'New Jersey', etc.). If anything is unclear, please create an issue.

descriptionSearch (type: array):

Warning, this search might be too intenstive for the 6m backfill API. Please be very specific, limit your searches to a handful of keywords, and combine with one of the other searches, preferably titleSearch. Array of terms to search in job title & description. Use :* for prefix matching (e.g., 'Python:*' will match 'Python', 'Pythonic', etc.)

descriptionExclusionSearch (type: array):

Warning, this search might be too intenstive for the 6m backfill API. Please be very specific, limit your searches to a handful of keywords, and combine with one of the other searches, preferably titleSearch. Array of terms to exclude from job title & description. Use :* for prefix matching (e.g., 'Python:*' will match 'Python', 'Pythonic', etc.)

organizationSearch (type: array):

Array of organization names to search for. Use :* for prefix matching (e.g., 'Google:*' will match 'Google', 'Google Cloud', etc.) Getting several companies with the same name? Use the liOrganizationSlugFilter to filter by LinkedIn organization slugs.

organizationExclusionSearch (type: array):

Array of organization names to exclude. Use :* for prefix matching (e.g., 'Google:*' will match 'Google', 'Google Cloud', etc.) Getting several companies with the same name? Use the liOrganizationSlugExclusionFilter to filter by LinkedIn organization slugs.

domainFilter (type: array):

Array of company domains to search for. Requires an exact match.

domainExclusionFilter (type: array):

Array of company domains to exclude. Requires an exact match.

descriptionType (type: string):

Format of the job description

ats (type: array):

Filter jobs by one ore more ATS.

atsExclusionFilter (type: array):

Exclude jobs from one or more ATS.

aiEmploymentTypeFilter (type: array):

Filter by employment type

aiWorkArrangementFilter (type: array):

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.

hasSalary (type: boolean):

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

aiExperienceLevelFilter (type: array):

Filter by years of experience

aiVisaSponsorshipFilter (type: boolean):

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

aiTaxonomiesFilter (type: array):

Filter by AI taxonomies

aiTaxonomiesPrimaryFilter (type: array):

Filter by primary AI taxonomy

aiTaxonomiesExclusionFilter (type: array):

Exclude jobs by AI taxonomies. Warning: this filter is very broad and will exclude jobs that are not in any of the selected taxonomies. For example, 'Healthcare' might exclude Software Engineer job in Healthcare. Use inclusive filters to avoid this.

populateAiRemoteLocation (type: boolean):

If enabled, populates ai_remote_location with locations_derived when ai_remote_location is empty.

populateAiRemoteLocationDerived (type: boolean):

If enabled, populates ai_remote_location_derived with locations_derived when ai_remote_location_derived is empty.

removeAgency (type: boolean):

Filter out recruitment agencies

liIndustryFilter (type: array):

Filter by LinkedIn industries

liOrganizationEmployeesLte (type: integer):

Maximum number of employees in the company

liOrganizationEmployeesGte (type: integer):

Minimum number of employees in the company

datePostedAfter (type: string):

We don't recommend using this parameter if you retrieve jobs on a regular interval with the 1h/24h/7d time range. Filter jobs posted on or after a specific date. The correct format is '2025-01-01'. To include time, use the following syntax: '2025-01-01T14:00:00'. Warning, several ATS don't include time and default to 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.

liIndustryExclusionFilter (type: array):

Exclude jobs from these LinkedIn industries. Same exact, case-sensitive matching as LinkedIn Industries.

liOrganizationSizeFilter (type: array):

Filter by LinkedIn company-size bucket (matches the org_linkedin_size field).

aiLanguageFilter (type: array):

Filter by the AI-detected language of the job description (e.g. English, French, German, Spanish). Matches the ai_job_language field.

hasNoLocation (type: boolean):

When true, returns only jobs with no normalized location (locations_derived is null). Do not combine with location search, which would always return zero rows.

includeLinkedIn (type: boolean):

Deprecated alias of includeCompanyDetails with the same functionality. Include basic company data fields. We use AI to map each job to a LinkedIn organization. We map over 95% of all jobs with 99% accuracy.

remote only (legacy) (type: boolean):

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.

aiHasSalary (type: boolean):

Deprecated alias of hasSalary with the same functionality. 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).

Actor input object example

{
  "timeRange": "7d",
  "limit": 10,
  "descriptionType": "text",
  "populateAiRemoteLocation": false,
  "populateAiRemoteLocationDerived": false,
  "hasNoLocation": false
}

Actor output Schema

results (type: string):

No description

API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

JavaScript example

import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("fantastic-jobs/career-site-job-listing-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

Python example

from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("fantastic-jobs/career-site-job-listing-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

CLI example

echo '{}' |
apify call fantastic-jobs/career-site-job-listing-api --silent --output-dataset

MCP server setup

{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fantastic-jobs/career-site-job-listing-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/s3dtSTZSZWFtAVLn5/builds/grhONKiZYti0GEzbJ/openapi.json