Career Site Job Listing API
Pricing
from $4.00 / 1,000 jobs
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
Maintained by CommunityActor stats
98
Bookmarked
3.4K
Total users
689
Monthly active users
7.4 hours
Issues response
8 hours ago
Last modified
Categories
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.
- Do you love this Actor? Please leave a review!
- Any issues or feedback? Please create an issue!
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:
| ADP | ApplicantPro | Ashby |
| BambooHR | Breezy HR | 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 Recruit |
In addition, we currently have jobs for the following organizations not using an ATS:
- Apple
- Amazon
- Meta
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:

-
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 titlestitleExclusionSearch: Terms to exclude from job titleslocationSearch: Terms to search in job locationslocationExclusionSearch: Terms to exclude from job locationsdescriptionSearch: Terms to search in job descriptions (includes title)descriptionExclusionSearch: Terms to exclude from job descriptions (includes title)organizationSearch: Terms to search in organization namesorganizationExclusionSearch: 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 includedomainExclusionFilter: Domains to exclude
Description Type
Type of description to fetch. Options:
text: Plain text descriptionhtml: 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'
- Date only:
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
includeAiparameter 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). (PreviouslyaiHasSalary, 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, populatesai_remote_locationwithlocations_derivedwhenai_remote_locationis empty. Useful for normalizing location data. -
populateAiRemoteLocationDerived: If enabled, populatesai_remote_location_derivedwithlocations_derivedwhenai_remote_location_derivedis 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. (PreviouslyincludeLinkedIn, 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
| Name | Description | Type |
|---|---|---|
| id | The job's internal ID, also used for expiration. Now returned as an integer (previously a stringified number). | number |
| title | Job Title | text |
| organization | Name of the hiring organization | text |
| organization_url | URL to the organization's page | text |
| organization_logo | Deprecated: ATS-supplied logo URL that may break or expire. Prefer org_logo_permalink. | text |
| date_posted | Date & Time of posting | timestamp |
| date_created | Date & Time of indexing in our systems | timestamp |
| date_valid_through | Date & Time of the future expiry date. Null in most cases. | timestamp |
| locations | Source-supplied location objects per the Google JobPosting schema. Use the *_derived fields for normalized, geocoded values. | json[] |
| locations_alt | Fallback location string used when the source ATS doesn't supply structured location data. | text |
| locations_derived | Derived location data, matched with a database. This is the field you search locations on. | text[] [{city, admin (state), country}] |
| location_type | To identify remote jobs: 'TELECOMMUTE' per the Google JobPosting schema | text |
| location_requirements | Location requirement to accompany remote (TELECOMMUTE) jobs per the Google JobPosting schema. | json[] |
| salary | Source-supplied salary object per the Google JobPosting schema. Often partial; prefer the ai_salary_* fields. | json |
| employment_type | Types like 'Full Time', 'Contract', 'Internship'. Usually a single value; prefer ai_employment_type. | text[] |
| url | The URL of the job, can be used to direct traffic to apply for the job | text |
| source | the source ATS or career site | text |
| source_type | always 'ats' for this Actor | text |
| source_domain | the domain of the career site. Not present for all ATS; use domain_derived. | text |
| description_text | plain text job description - if included | text |
| description_html | raw HTML job description - if included | text |
| cities_derived | All cities from locations_derived | json[] |
| regions_derived | All regions/states/provinces from locations_derived | json[] |
| countries_derived | All countries from locations_derived | json[] |
| timezones_derived | Timezones derived from locations_derived | json[] |
| lats_derived | lats derived from locations_derived | json[] |
| lngs_derived | lngs derived from locations_derived | number[] |
| counties_derived | All counties from locations_derived. Only present when cities_derived is not. | text[] |
| date_modified | Date & time of the most recent modification. Only returned with time_frame=6m. | timestamp |
| modified_fields | Field names changed in the most recent modification. Only with time_frame=6m. | text[] |
| domain_derived | We 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.
| Name | Description | Type |
|---|---|---|
| ai_salary_currency | The salary currency | text |
| ai_salary_value | The salary value, if there's a single salary with no salary range | numeric |
| ai_salary_min_value | The minimum salary in a range | numeric |
| ai_salary_max_value | The maximum salary in a range | numeric |
| ai_salary_unit_text | If the salary is per HOUR/DAY/WEEK/MONTH/YEAR | text |
| ai_benefits | An array with other non-salary benefits mentioned in the job listing | text[] |
| ai_experience_level | years of experience required, one of: 0-2, 2-5, 5-10, or 10+ | text |
| ai_work_arrangement | Remote 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_days | when work_arrangement is Hybrid, returns the number of days per week in office | bigint |
| ai_remote_location | When remote but only in a certain location, returns the location | text[] |
| ai_remote_location_derived | Derived 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_skills | An array of key skills mentioned in the job listing | text[] |
| ai_hiring_manager_name | If present, the hiring manager name | text |
| ai_hiring_manager_email_address | If present, the hiring manager's email address | text |
| ai_core_responsibilities | A 2-sentence summary of the job's core responsibilities | text |
| ai_requirements_summary | A 2-sentence summary of the job's requirements | text |
| ai_working_hours | The number of required working hours. Defaults to 40 if not mentioned | bigint |
| ai_employment_type | One or more employment types as derived from the job description: FULL_TIME/PART_TIME/CONTRACTOR/TEMPORARY/INTERN/VOLUNTEER/PER_DIEM/OTHER | text[] |
| ai_job_language | The language of the job description | text |
| ai_visa_sponsorship | Returns true if the job description mentions Visa sponsorship opportunities | boolean |
| ai_keywords | An array of AI extracted keywords from the job description | text[] |
| ai_taxonomies_a | Up to 5 AI-assigned taxonomies ordered by relevancy; the first item is the primary taxonomy | text[] |
| ai_education | An array of AI extracted education requirements from the job description | text[] |
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.
| Name | Description | Type |
|---|---|---|
| org_linkedin_name | The company's full name from LinkedIn | text |
| org_linkedin_headcount | the number of employees within the job's company according to LinkedIn | int |
| org_linkedin_website | url to the company's main website | text |
| org_linkedin_size | the employee count range according to the company | text |
| org_linkedin_slogan | the company's slogan | text |
| org_linkedin_industry | the 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 HQ | text |
| org_linkedin_followers | the company's followers on LinkedIn | int |
| org_linkedin_headquarters | the company's HQ location | text |
| org_linkedin_type | the company's type, like 'Privately Held', 'Public', etc | text |
| org_linkedin_founded_date | the company's founded date | text |
| org_linkedin_specialties | the company's specialties | text[] |
| org_linkedin_locations | the full address of the company's locations | text[] |
| org_linkedin_description | the description of the company's LinkedIn page | text |
| org_linkedin_recruitment_agency_derived | If the company is a recruitment agency or job board, true or false (AI-identified). The accuracy may vary. | bool |
| org_linkedin_slug | The 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_categories | List of Crunchbase categories the company is tagged with | text[] |
| org_crunchbase_total_investment | Total investment in USD raised by the company according to Crunchbase | int |
| org_logo_permalink | Stable hosted URL for the company's logo | text |
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 field | Use instead | Type |
|---|---|---|
| date_validthrough | date_valid_through | timestamp |
| locations_raw | locations | json[] |
| locations_alt_raw | locations_alt | text |
| location_requirements_raw | location_requirements | json[] |
| salary_raw | salary | json |
| ai_salary_minvalue | ai_salary_min_value | numeric |
| ai_salary_maxvalue | ai_salary_max_value | numeric |
| ai_salary_unittext | ai_salary_unit_text | text |
| ai_education_requirements | ai_education | text[] |
| linkedin_org_employees | org_linkedin_headcount | int |
| linkedin_org_url | org_linkedin_website | text |
| linkedin_org_size | org_linkedin_size | text |
| linkedin_org_slogan | org_linkedin_slogan | text |
| linkedin_org_industry | org_linkedin_industry | text |
| linkedin_org_followers | org_linkedin_followers | int |
| linkedin_org_headquarters | org_linkedin_headquarters | text |
| linkedin_org_type | org_linkedin_type | text |
| linkedin_org_foundeddate | org_linkedin_founded_date | text |
| linkedin_org_specialties | org_linkedin_specialties | text[] |
| linkedin_org_locations | org_linkedin_locations | text[] |
| linkedin_org_description | org_linkedin_description | text |
| linkedin_org_slug | org_linkedin_slug | text |
| linkedin_org_recruitment_agency_derived | org_linkedin_recruitment_agency_derived | bool |