Career Site Job Listing API avatar

Career Site Job Listing API

Pricing

from $4.00 / 1,000 jobs

Go to Apify Store
Career Site Job Listing API

Career Site Job Listing API

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

Rating

4.9

(10)

Developer

Fantastic.jobs

Fantastic.jobs

Maintained by Community

Actor stats

98

Bookmarked

3.4K

Total users

689

Monthly active users

7.4 hours

Issues response

8 hours 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 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!

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

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.

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

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.

  • 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

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

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

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 output field has been removed; use ai_work_arrangement instead.

Deprecated fieldUse insteadType
date_validthroughdate_valid_throughtimestamp
locations_rawlocationsjson[]
locations_alt_rawlocations_alttext
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[]
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