Newly indexed job listings from ATS sources and job boards. Use these endpoints to ingest fresh listings.
ATS jobs
Retrieves active ATS job listings with support for filtering, full-text search, date ranges, pagination, and field selection. Use the time_frame parameter to select the time window.
query Parameters
time_frameTime window for job listings. Smaller windows return fresher jobs in smaller batches; larger windows are best for backfills.
1h- firehose of just-discovered jobs (best for hourly polling).24h- most common choice for daily syncs.7d- weekly batch jobs.6m- full backfill (very large; description search (description,description_advanced) is allowed on6mbut can be slow and may time out - simplify the query, lowerlimit, or use a shorter time window if so).
limitNumber of results to return. Default: 100, min: 1, max: 1000.
Use with offset to paginate, e.g. limit=100&offset=0, then limit=100&offset=100, then limit=100&offset=200. For very large feeds prefer cursor over offset.
offsetNumber of results to skip for pagination. e.g. limit=100&offset=200 returns the third page (results 201–300). Use cursor instead for very large feeds - offset becomes inefficient at deep pages.
cursorCursor-based pagination. Pass the last job's id to get the next page. Note: When cursor is set, results are ordered by id ascending - this overrides the default ordering (date_posted desc, or date_modified desc on /modified-ats). Cursor and offset pagination therefore traverse the feed in different orders.
Interaction with offset: cursor overrides offset. If both are passed, offset is ignored. Pick one pagination strategy and stick with it.
description_formatFormat the job description should be returned in. Choose text for plain text or html for raw HTML. Omit the parameter entirely to exclude the description field from the response - descriptions are not included by default because they significantly increase payload size.
Caution: html returns the description as it was scraped from the source - sanitize before rendering on a web page.
include_basic_organization_detailsOff by default to keep responses small. Set to true to include basic LinkedIn-derived organization fields inline with each job: org_linkedin_name, org_linkedin_website, org_linkedin_industry, org_linkedin_headcount, org_linkedin_size, org_linkedin_followers, org_linkedin_headquarters, org_linkedin_locations, org_linkedin_type, org_linkedin_founded_date, org_linkedin_slogan, org_linkedin_description, org_linkedin_specialties, org_linkedin_recruitment_agency_derived, org_crunchbase_categories, org_crunchbase_total_investment, org_logo_permalink. org_linkedin_slug is always returned (regardless of this flag) so jobs can be joined to /organizations-advanced.
You don't need this flag if you're already calling /organizations-advanced - every field above is included there (alongside additional advanced fields).
titleFull-text search on job title (weighted, natural language). Searches like a Google query:
software engineer- jobs with both words in the title."software engineer"- exact phrase.software OR engineer- either word.-engineer- exclude jobs withengineerin the title.
For Boolean operators, parentheses, or prefix matching, use title_advanced instead.
descriptionFull-text search on job description (weighted, natural language). Same syntax as title. e.g. python OR javascript OR js returns descriptions mentioning any of those keywords. Heavy queries (long phrases, many ORs) on long time windows can time out when using time_frame=6m - keep it tight.
locationFull-text search on location fields (weighted, natural language). Search using full names, abbreviations are not supported.
- Use
United States, notUS. - Use
United Kingdom, notUK. - US states need their full name and country:
New York, United States,California, United States. - UK cities need the constituent country:
Birmingham, England, United Kingdom,Glasgow, Scotland, United Kingdom.
Multi-location with OR: "United States" OR "United Kingdom" or "San Francisco" OR "New York". For Boolean operators (parentheses, AND, NOT), use location_advanced.
See Nuances of Location Search for more.
organizationFilter by organization name(s). Exact, case-sensitive match - nvidia will not match NVIDIA. For fuzzy or Boolean matching, use organization_advanced. Caveat: organization names containing parentheses are not supported here - use organization_slug (preferred when available) or organization_advanced instead.
Fetch the full list of organizations we currently track via /organizations.
Input a comma-separated list.
exclude_organizationExclude organization name(s). Same matching rules as organization (exact, case-sensitive). For fuzzy/Boolean exclusion, use organization_advanced with !.
Input a comma-separated list.
title_advancedBoolean full-text search on title. Operators: & (AND), | (OR), ! (NOT), <-> (followed-by), parentheses for grouping, :* for prefix matching.
Multi-word phrases must be single-quoted ('machine learning') or chained with <-> (machine <-> learning). If title is also passed, title_advanced takes precedence and title is ignored.
Examples:
(AI | 'machine learning' | robotics) & !marketing- AI/ML/robotics roles, no marketing titles.senior & (python | rust) & !staff- senior IC roles in either stack, excluding staff-engineer.project <-> manag:*- matchesproject manager,project management,project managing, ...
See Advanced Searching Guide for more.
description_advancedBoolean full-text search on description. Same operator syntax as title_advanced. If description is also passed, description_advanced takes precedence and description is ignored. Description searches are expensive when using time_frame=6m, if a query times out, simplify it, lower limit, or shrink the time window.
location_advancedBoolean full-text search on location. Same operator syntax as title_advanced. If location is also passed, location_advanced takes precedence and location is ignored. The same naming rules as location apply (full names, no abbreviations).
Examples:
'United States' & !California- US minus California.Germany & !(Berlin | Munich)- Germany excluding two cities.'New York' | 'San Francisco' | Boston- multi-city.
organization_advancedBoolean full-text search on organization name. Same operator syntax as title_advanced. If organization is also passed, organization_advanced takes precedence and organization is ignored.
Examples:
University & !Harvard- every "University" employer except Harvard.(Microsoft | Google | Apple)- match any of the three.Open <-> AI:*- matchesOpenAI,Open AI,Open-AI, etc.
date_posted_gteFilter jobs posted on or after this date (ISO 8601). e.g. 2026-04-20T00:00:00. Posted-date timestamps are UTC, with a 1-2 hour ingestion delay between the source publishing the job and it appearing in this API.
See Time Fields for the difference between date_posted, date_created, and date_modified.
date_posted_ltFilter jobs posted before this date (ISO 8601).
date_created_gteFilter jobs indexed on or after this date (ISO 8601). date_created reflects when our system first indexed the job.
date_created_ltFilter jobs indexed before this date (ISO 8601).
domainFilter by employer domain(s). The domain_derived field is mapped to jobs using an LLM agent with 99% accuracy. Please report any mistakes.
This parameter is especially useful to capture employers that have multiple ATS across regions. For example, nvidia.com,microsoft.com,google.com. Each tracked organization's domain is exposed via /organizations.
Input a comma-separated list.
exclude_domainExclude employer domain(s). Same rules as domain. e.g. nvidia.com,microsoft.com.
Input a comma-separated list.
sourceFilter by source ATS/job board(s). Currently supported values: 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. New ATS platforms are added regularly, recheck this list periodically.
Input a comma-separated list.
exclude_sourceExclude source ATS/job board(s). See source for the full list of supported values.
Input a comma-separated list.
organization_industryFilter by LinkedIn industry. Use the exact LinkedIn industry name (case-sensitive). Common values: Software Development, Information Technology and Services, Financial Services, Hospital & Health Care, Staffing and Recruiting, Marketing and Advertising. The full taxonomy of ~400 industries lives at LinkedIn Industries.
For names containing & (e.g. "Hospital & Health Care"), .
Input a comma-separated list.
exclude_organization_industryExclude LinkedIn industry/industries. Same matching rules as organization_industry (exact, case-sensitive). See LinkedIn Industries for the full taxonomy.
Input a comma-separated list.
organization_slugFilter by LinkedIn organization slug(s), the company-specific portion of a LinkedIn URL.
For https://www.linkedin.com/company/walmart/, the slug is walmart.
For https://www.linkedin.com/company/tesla-motors/, it's tesla-motors.
Exact match only. Generally more reliable than organization (no spelling/casing variation) and the only way to filter on names containing parentheses.
Fetch the full list of organizations (with their slugs) via /organizations.
Input a comma-separated list.
exclude_organization_slugExclude LinkedIn organization slug(s). Same rules as organization_slug (exact match). Fetch slugs via /organizations.
Input a comma-separated list.
organization_headcount_gteFilter companies with at least this many LinkedIn employees (inclusive lower bound). Source: LinkedIn company profile (org_linkedin_headcount).
Combine with organization_headcount_lt for a range, e.g. organization_headcount_gte=50&organization_headcount_lt=500 for 50–499-employee companies.
organization_headcount_ltFilter companies with fewer than this many LinkedIn employees (exclusive upper bound). Source: LinkedIn company profile (org_linkedin_headcount).
Combine with organization_headcount_gte for a range.
ai_experience_levelFilter by AI-derived experience level (years of experience required, inferred from the job description and other elements from the job page).
0-22-55-1010+
Pass multiple to broaden the match (e.g. 0-2,2-5). Input a comma-separated list.
ai_work_arrangementFilter by AI-derived work arrangement.
On-site- no remote at all.Hybrid- split between office and remote.Remote OK- fully remote, but an office is available.Remote Solely- fully remote, no office.
Pass multiple to broaden, e.g. Hybrid,Remote OK,Remote Solely for any-remote-flexibility roles. Input a comma-separated list.
ai_employment_typeFilter by AI-derived employment type(s) (overlap match, a job tagged with multiple types matches if any are in your list)
FULL_TIME,PART_TIMECONTRACTOR,TEMPORARY,PER_DIEMINTERN,VOLUNTEER,OTHER
Input a comma-separated list.
ai_educationFilter by AI-derived education requirements. The LLM is instructured to flag education that's required, preferred, or desired (overlap match, jobs are tagged with one or more requirements).
high schoolassociate degreebachelor degreeprofessional certificatepostgraduate degree
Note: Overlap match means bachelor degree matches jobs that explicitly require a bachelor's, it doesn't broaden to also match jobs that only require high school.
Input a comma-separated list.
ai_taxonomies_a_primaryFilter by AI taxonomy/taxonomies. Similar to ai_taxonomies_a, but only matches the first (most relevant) taxonomy assigned to a job. Use when you want a tight category match, e.g. jobs that are primarily about Technology, not just adjacent to it.
Input a comma-separated list.
ai_taxonomies_aFilter by AI taxonomy/taxonomies (overlap match, jobs are tagged with one or more, ordered by relevance). The first taxonomy in the array is the primary taxonomy.
Matches a job if any of its assigned taxonomies are in your list (broad). For tighter matches use ai_taxonomies_a_primary (matches only the primary). To exclude taxonomies use exclude_ai_taxonomies_a.
For names containing & (e.g. "Management & Leadership"), please double-quote.
Input a comma-separated list.
exclude_ai_taxonomies_aExclude AI taxonomy/taxonomies - excludes a job if any of its assigned taxonomies are in this list. See ai_taxonomies_a for the value list and overlap-match semantics.
Input a comma-separated list.
ai_visa_sponsorshipFilter listings by AI-derived visa-sponsorship availability. Omit to include both.
only- return only listings that offer visa sponsorship.exclude- exclude listings that offer visa sponsorship (return only those that don't).
Note: Detection is based on language in the job description, not all companies are very clear about their requirements in the job description.
has_salarySet to true to only return jobs that have salary information (raw or AI-enriched). Omit (or pass false) to include both.
organization_agencyFilter listings by recruitment-agency status of the organization. Omit to include both.
only- return only listings whose organization is a recruitment/staffing agency.exclude- exclude listings from recruitment/staffing agencies.
The agency flag itself is exposed in the response as org_linkedin_recruitment_agency_derived.
idFilter by one or more internal Fantastic.jobs IDs. Matches the id field in each response object, the same identifier surfaced by /expired-ats and /modified-ats for expiration and change tracking. e.g. id=8123456,8123457 returns those two specific jobs (useful for refreshing rows you already store).
Input a comma-separated list.
Headers
AuthorizationThe Authorization header is used to authenticate with the API using your API key. Value is of the format Bearer YOUR_KEY_HERE.
ATS jobs › Responses
A list of active ATS job listings
idThe job's internal ID. Used for expiration.
titleJob title.
date_createdDate & time of indexing in our database.
urlThe URL of the job.
sourceSource ATS or job board.
source_typeFor ActiveAtsJob, this is always 'ats'.
organizationName of the hiring organization.
organization_urlURL to the organization's page.
date_postedDate & time of posting.
date_valid_throughDate & time of the future expiry date.
Source-supplied location objects per the Google JobPosting schema (e.g. {address: {addressLocality, addressRegion, addressCountry, postalCode}, ...}). Use locations_derived, cities_derived, regions_derived, countries_derived, lats_derived / lngs_derived for normalized, geocoded values.
locations_altFallback location string used when the source ATS doesn't supply structured location data in its Job Posting schema. Populated primarily from HTML scraping; for a small subset of ATS (currently ~4 of 54) it is AI-structured from the listing's free-text content. Null when the schema-supplied locations is sufficient.
Normalized location strings. Geocoded. This is the field used for location search.
location_typeTo identify remote jobs: 'TELECOMMUTE' per the Google JobPosting schema.
location_requirementsLocation requirement to accompany remote (TELECOMMUTE) jobs per the Google JobPosting schema.
salarySource-supplied salary object per the Google JobPosting schema. Often partial or missing. For a normalized numeric breakdown use ai_salary_value, ai_salary_min_value, ai_salary_max_value, ai_salary_currency, and ai_salary_unit_text.
employment_typeTypes like 'Full Time', 'Contract', 'Internship'. Usually a single value. For better accuracy, use ai_employment_type.
source_domainDomain of the career site or job board. Not present for all ATS; use domain_derived instead.
domain_derivedAI-discovered domain of the employer's main website.
description_textPlain text job description. Returned when description_format=text.
description_htmlRaw HTML job description. Returned when description_format=html.
cities_derivedAll cities from locations_derived.
counties_derivedAll counties from locations_derived. Only present when cities_derived is not.
regions_derivedAll regions/states/provinces from locations_derived.
countries_derivedAll countries from locations_derived.
timezones_derivedAll timezones from locations_derived.
lats_derivedLatitudes derived from locations_derived.
lngs_derivedLongitudes derived from locations_derived.
date_modifiedDate and time of the most recent modification of the listing. Only returned when time_frame=6m.
modified_fieldsArray of field names that have changed in the most recent modification of the listing. Only returned when time_frame=6m.
ai_salary_currencySalary currency in ISO 4217 format.
ai_salary_valueSalary value when there is a single salary with no range.
ai_salary_min_valueMinimum salary in a range.
ai_salary_max_valueMaximum salary in a range.
ai_salary_unit_textSalary period: HOUR, DAY, WEEK, MONTH, or YEAR.
ai_benefitsNon-salary benefits mentioned in the job listing.
ai_experience_levelYears of experience required.
ai_work_arrangementRemote Solely (no office), Remote OK (optional office), Hybrid, or On-site.
ai_work_arrangement_office_daysWhen Hybrid, the number of days per week in office.
ai_remote_locationWhen remote but restricted to a certain location, returns that location.
ai_remote_location_derivedDerived remote location data matched with a location database (same as locations_derived).
ai_key_skillsKey skills mentioned in the job listing.
ai_hiring_manager_nameHiring manager name, if present.
ai_hiring_manager_email_addressHiring manager's email address, if present.
ai_core_responsibilitiesA 2-sentence summary of the job's core responsibilities.
ai_requirements_summaryA 2-sentence summary of the job's requirements.
ai_working_hoursRequired working hours. Defaults to 40 if not mentioned.
ai_employment_typeEmployment type as derived from the job description.
ai_job_languageLanguage of the job description.
ai_visa_sponsorshipTrue if the job description mentions visa sponsorship opportunities.
ai_taxonomies_aUp to 5 taxonomies per job ordered by relevancy (e.g., Technology, Healthcare, Finance & Accounting). The first item in the array is the primary taxonomy and is what the ai_taxonomies_a_primary filter matches against.
ai_keywordsImportant keywords: technologies, tools, skills, certifications, industry terms, methodologies, programming languages.
ai_educationExplicitly mentioned educational requirements from the job description.
org_linkedin_slugCompany-specific part of the LinkedIn URL (e.g., 'tesla-motors'). Unique per company. Always returned (regardless of include_basic_organization_details) so jobs can be joined to /organizations-advanced results.
org_linkedin_headcountNumber of employees according to LinkedIn. Returned when include_basic_organization_details=true.
org_linkedin_websiteCompany's main website URL (sourced from LinkedIn). Returned when include_basic_organization_details=true.
org_linkedin_sizeEmployee count range according to the company. Returned when include_basic_organization_details=true.
org_linkedin_sloganCompany's slogan. Returned when include_basic_organization_details=true.
org_linkedin_industryCompany's industry from LinkedIn's fixed list. Returned when include_basic_organization_details=true.
org_linkedin_followersNumber of LinkedIn followers. Not populated for all companies. Returned when include_basic_organization_details=true.
org_linkedin_headquartersCompany's HQ location. Returned when include_basic_organization_details=true.
org_linkedin_typeCompany type (e.g., 'Privately Held', 'Public'). Returned when include_basic_organization_details=true.
org_linkedin_founded_dateCompany's founded date. Returned when include_basic_organization_details=true.
org_linkedin_specialtiesCompany's specialties. Returned when include_basic_organization_details=true.
org_linkedin_locationsFull addresses of the company's locations. Returned when include_basic_organization_details=true.
org_linkedin_descriptionDescription from the company's LinkedIn page. Returned when include_basic_organization_details=true.
org_linkedin_recruitment_agency_derivedTrue if the company is a recruitment agency or job board (AI-identified). Returned when include_basic_organization_details=true.
org_linkedin_nameCompany's full name from LinkedIn. Returned when include_basic_organization_details=true.
org_crunchbase_categoriesList of Crunchbase categories the company is tagged with. Returned when include_basic_organization_details=true.
org_crunchbase_total_investmentTotal investment in USD raised by the company according to Crunchbase. Returned when include_basic_organization_details=true.
org_logo_permalinkStable Crustdata-hosted URL for the company's logo. Returned when include_basic_organization_details=true.
organization_logoDeprecated. ATS-supplied logo URL. Not present for all ATS and the underlying URL can break or expire. Use org_logo_permalink instead - a Crustdata-hosted permanent URL returned when include_basic_organization_details=true (or always present on /organizations-advanced).
Job board jobs
Retrieves active job board listings with support for filtering, full-text search, date ranges, pagination, and field selection. Use the time_frame parameter to select the time window.
Supported sources: linkedin, wellfound, ycombinator (filter via source / exclude_source). Only linkedin listings are checked for expiration at the moment.
Note: Description search (description, description_advanced) is not available for time_frame=6m.
AI fields & staffing agencies: AI-enriched fields (every ai_* response field) are not populated for staffing/recruitment agency listings (organization_agency=true). As a consequence, any ai_* filter you apply (ai_experience_level, ai_work_arrangement, ai_employment_type, ai_education, ai_taxonomies_a, ai_visa_sponsorship, has_salary, etc.) will exclude agency listings, regardless of the values you pass. If you need agency listings, drop ai_* filters and use the raw equivalents (employment_type, seniority, organization_agency, …) instead.
query Parameters
time_frameTime window for job listings. Smaller windows return fresher jobs in smaller batches; larger windows are best for backfills.
1h- firehose of just-discovered jobs (best for hourly polling).24h- most common choice for daily syncs.7d- weekly batch jobs.6m- full backfill (large; description search (description,description_advanced) is not available on6mfor/active-jb).
limitNumber of results to return. Default: 100, min: 1, max: 1000.
Use with offset to paginate, e.g. limit=100&offset=0, then limit=100&offset=100, then limit=100&offset=200. For very large feeds prefer cursor over offset.
offsetNumber of results to skip for pagination. e.g. limit=100&offset=200 returns the third page (results 201–300). Use cursor instead for very large feeds - offset becomes inefficient at deep pages.
cursorCursor-based pagination. Pass the last job's id to get the next page. Note: When cursor is set, results are ordered by id ascending - this overrides the default ordering (date_posted desc, or date_modified desc on /modified-ats). Cursor and offset pagination therefore traverse the feed in different orders.
Interaction with offset: cursor overrides offset. If both are passed, offset is ignored. Pick one pagination strategy and stick with it.
organization_agencyFilter listings by recruitment-agency status of the organization. Omit to include both.
only- return only listings whose organization is a recruitment/staffing agency.exclude- exclude listings from recruitment/staffing agencies.
The agency flag itself is exposed in the response as org_linkedin_recruitment_agency_derived.
Heads-up: AI-enriched fields (every ai_* response field) are not populated for agency listings on this endpoint, see the endpoint description.
description_formatFormat the job description should be returned in. Choose text for plain text or html for raw HTML. Omit the parameter entirely to exclude the description field from the response - descriptions are not included by default because they significantly increase payload size.
Caution: html returns the description as it was scraped from the source - sanitize before rendering on a web page.
exclude_recruiter_fieldsSet to true to exclude recruiter fields (recruiter_name, recruiter_title, recruiter_url) from the response. Default: included.
titleFull-text search on job title (weighted, natural language). Searches like a Google query:
software engineer- jobs with both words in the title."software engineer"- exact phrase.software OR engineer- either word.-engineer- exclude jobs withengineerin the title.
For Boolean operators, parentheses, or prefix matching, use title_advanced instead.
descriptionFull-text search on job description (weighted, natural language). Same syntax as title. e.g. python OR javascript OR js returns descriptions mentioning any of those keywords. Not available for time_frame=6m. Heavy queries (long phrases, many ORs) on long time windows can time out - keep it tight.
locationFull-text search on location fields (weighted, natural language). Search using full names, abbreviations are not supported.
- Use
United States, notUS. - Use
United Kingdom, notUK. - US states need their full name and country:
New York, United States,California, United States. - UK cities need the constituent country:
Birmingham, England, United Kingdom,Glasgow, Scotland, United Kingdom.
Multi-location with OR: "United States" OR "United Kingdom" or "San Francisco" OR "New York". For Boolean operators (parentheses, AND, NOT), use location_advanced.
See Nuances of Location Search for more.
organizationFilter by organization name(s). Exact, case-sensitive match - nvidia will not match NVIDIA. For fuzzy or Boolean matching, use organization_advanced. Caveat: organization names containing parentheses are not supported here - use organization_slug (preferred when available) or organization_advanced instead.
Fetch the full list of organizations we currently track via /organizations.
Input a comma-separated list.
exclude_organizationExclude organization name(s). Same matching rules as organization (exact, case-sensitive). For fuzzy/Boolean exclusion, use organization_advanced with !.
Input a comma-separated list.
title_advancedBoolean full-text search on title. Operators: & (AND), | (OR), ! (NOT), <-> (followed-by), parentheses for grouping, :* for prefix matching.
Multi-word phrases must be single-quoted ('machine learning') or chained with <-> (machine <-> learning). If title is also passed, title_advanced takes precedence and title is ignored.
Examples:
(AI | 'machine learning' | robotics) & !marketing- AI/ML/robotics roles, no marketing titles.senior & (python | rust) & !staff- senior IC roles in either stack, excluding staff-engineer.project <-> manag:*- matchesproject manager,project management,project managing, ...
See Advanced Searching Guide for more.
description_advancedBoolean full-text search on description. Same operator syntax as title_advanced. If description is also passed, description_advanced takes precedence and description is ignored. Not available for time_frame=6m. Description searches are expensive, if a query times out, simplify it, lower limit, or shrink the time window.
location_advancedBoolean full-text search on location. Same operator syntax as title_advanced. If location is also passed, location_advanced takes precedence and location is ignored. The same naming rules as location apply (full names, no abbreviations).
Examples:
'United States' & !California- US minus California.Germany & !(Berlin | Munich)- Germany excluding two cities.'New York' | 'San Francisco' | Boston- multi-city.
organization_advancedBoolean full-text search on organization name. Same operator syntax as title_advanced. If organization is also passed, organization_advanced takes precedence and organization is ignored.
Examples:
University & !Harvard- every "University" employer except Harvard.(Microsoft | Google | Apple)- match any of the three.Open <-> AI:*- matchesOpenAI,Open AI,Open-AI, etc.
date_posted_gteFilter jobs posted on or after this date (ISO 8601). e.g. 2026-04-20T00:00:00. Posted-date timestamps are UTC, with a 1-2 hour ingestion delay between the source publishing the job and it appearing in this API.
See Time Fields for the difference between date_posted, date_created, and date_modified.
date_posted_ltFilter jobs posted before this date (ISO 8601).
date_created_gteFilter jobs indexed on or after this date (ISO 8601). date_created reflects when our system first indexed the job.
date_created_ltFilter jobs indexed before this date (ISO 8601).
sourceFilter by source job board(s). Input a comma-separated list.
Note on expiry tracking: only linkedin listings are re-checked for expiration and surfaced via /expired-jb. wellfound and ycombinator listings stay in the active feed until naturally aged out, so plan your freshness logic accordingly if you ingest them.
exclude_sourceExclude source job board(s). Input a comma-separated list.
seniorityFilter by LinkedIn-posted seniority level. English values: Internship, Entry level, Associate, Mid-Senior level, Director, Executive, Not Applicable. Case-sensitive.
Heads-up: many employers default to Not Applicable. If you filter to a specific level, you'll miss those, consider whether that's acceptable. Non-English postings may use localized seniority strings; if you target multiple markets, include both the English and local-language values.
Alternative: for a normalized, market-independent signal, use ai_experience_level instead (note: AI fields exclude staffing-agency listings, see the endpoint description).
Input a comma-separated list.
organization_industryFilter by LinkedIn industry. Use the exact LinkedIn industry name (case-sensitive). Common values: Software Development, Information Technology and Services, Financial Services, Hospital & Health Care, Staffing and Recruiting, Marketing and Advertising. The full taxonomy of ~400 industries lives at LinkedIn Industries.
For names containing & (e.g. "Hospital & Health Care"), please double-quote.
Input a comma-separated list.
exclude_organization_industryExclude LinkedIn industry/industries. Same matching rules as organization_industry (exact, case-sensitive). See LinkedIn Industries for the full taxonomy.
Input a comma-separated list.
organization_slugFilter by LinkedIn organization slug(s), the company-specific portion of a LinkedIn URL.
For https://www.linkedin.com/company/walmart/, the slug is walmart.
For https://www.linkedin.com/company/tesla-motors/, it's tesla-motors.
Exact match only. Generally more reliable than organization (no spelling/casing variation) and the only way to filter on names containing parentheses.
Fetch the full list of organizations (with their slugs) via /organizations.
Input a comma-separated list.
exclude_organization_slugExclude LinkedIn organization slug(s). Same rules as organization_slug (exact match). Fetch slugs via /organizations.
Input a comma-separated list.
organization_headcount_gteFilter companies with at least this many LinkedIn employees (inclusive lower bound). Source: LinkedIn company profile (org_linkedin_headcount).
Combine with organization_headcount_lt for a range, e.g. organization_headcount_gte=50&organization_headcount_lt=500 for 50–499-employee companies.
organization_headcount_ltFilter companies with fewer than this many LinkedIn employees (exclusive upper bound). Source: LinkedIn company profile (org_linkedin_headcount).
Combine with organization_headcount_gte for a range.
employment_typeFilter by raw employment type(s) (overlap match, a job tagged with multiple types matches if any are in your list). Values are country-specific and vary by job board.
Alternative: for normalized, market-independent values use ai_employment_type (note: AI fields exclude staffing-agency listings, see the endpoint description).
Input a comma-separated list.
ai_employment_typeFilter by AI-derived employment type(s) (overlap match, a job tagged with multiple types matches if any are in your list).
FULL_TIME,PART_TIMECONTRACTOR,TEMPORARY,PER_DIEMINTERN,VOLUNTEER,OTHER
For raw, country-specific values use employment_type. Like every ai_* filter on /active-jb, this excludes staffing-agency listings, see the endpoint description.
Input a comma-separated list.
ai_experience_levelFilter by AI-derived experience level (years of experience required, inferred from the job description and other elements from the job page).
0-22-55-1010+
Pass multiple to broaden the match (e.g. 0-2,2-5). Input a comma-separated list.
ai_work_arrangementFilter by AI-derived work arrangement.
On-site- no remote at all.Hybrid- split between office and remote.Remote OK- fully remote, but an office is available.Remote Solely- fully remote, no office.
Pass multiple to broaden, e.g. Hybrid,Remote OK,Remote Solely for any-remote-flexibility roles. Input a comma-separated list.
ai_educationFilter by AI-derived education requirements. The LLM is instructured to flag education that's required, preferred, or desired (overlap match, jobs are tagged with one or more requirements).
high schoolassociate degreebachelor degreeprofessional certificatepostgraduate degree
Note: Overlap match means bachelor degree matches jobs that explicitly require a bachelor's, it doesn't broaden to also match jobs that only require high school.
Input a comma-separated list.
ai_taxonomies_a_primaryFilter by AI taxonomy/taxonomies. Similar to ai_taxonomies_a, but only matches the first (most relevant) taxonomy assigned to a job. Use when you want a tight category match, e.g. jobs that are primarily about Technology, not just adjacent to it.
Input a comma-separated list.
ai_taxonomies_aFilter by AI taxonomy/taxonomies (overlap match, jobs are tagged with one or more, ordered by relevance). The first taxonomy in the array is the primary taxonomy.
Matches a job if any of its assigned taxonomies are in your list (broad). For tighter matches use ai_taxonomies_a_primary (matches only the primary). To exclude taxonomies use exclude_ai_taxonomies_a.
For names containing & (e.g. "Management & Leadership"), please double-quote.
Input a comma-separated list.
exclude_ai_taxonomies_aExclude AI taxonomy/taxonomies - excludes a job if any of its assigned taxonomies are in this list. See ai_taxonomies_a for the value list and overlap-match semantics.
Input a comma-separated list.
ai_visa_sponsorshipFilter listings by AI-derived visa-sponsorship availability. Omit to include both.
only- return only listings that offer visa sponsorship.exclude- exclude listings that offer visa sponsorship (return only those that don't).
Note: Detection is based on language in the job description, not all companies are very clear about their requirements in the job description.
has_salarySet to true to only return jobs that have salary information (raw or AI-enriched). Omit (or pass false) to include both.
direct_applyFilter listings by direct-apply availability. "Direct apply" means the candidate can apply within the source job board itself (e.g. LinkedIn's Easy Apply / one-click in-platform application) rather than being redirected to an external site. Omit to include both.
only- return only listings that support direct apply on the source job board.exclude- exclude direct-apply listings (return only those that redirect to an external apply flow).
Direct-apply listings have almost no overlap with the ATS feed (/active-ats), making them complementary rather than duplicates.
exclude_ats_duplicateUse this only if you also consume /active-ats - when true it removes the majority of LinkedIn jobs we've matched against an existing ATS posting. Omit (or pass false) to include both.
How matching works. For each LinkedIn job we run two checks against the ATS dataset:
- Job title + organization name match.
- Job title + LinkedIn company-profile match.
If either check hits, the job is flagged ats_duplicate=true. If neither hits, it's ats_duplicate=false. Some jobs are not checked - agency listings (org_linkedin_recruitment_agency_derived=true) and direct-apply listings (direct_apply=true) - and are flagged ats_duplicate=null (these are also kept when this filter is true, since they're unlikely to be ATS duplicates by construction).
We aim for high precision over recall, so a small number of duplicates can still slip through. For full deduplication, add a fuzzy-match layer client-side.
linkedin_idFilter by one or more LinkedIn job posting IDs (comma-separated when passed as a raw URL). This is LinkedIn's public job ID - the digits at the end of a linkedin.com/jobs/view/{linkedin_id} URL - surfaced as linkedin_id in each response object. Distinct from id, which is the internal Fantastic.jobs ID.
idFilter by one or more internal Fantastic.jobs IDs. Matches the id field in each response object, the same identifier surfaced by /expired-jb for expiration tracking. e.g. id=8123456,8123457 returns those two specific jobs (useful for refreshing rows you already store). Distinct from linkedin_id, which is LinkedIn's public posting ID.
Input a comma-separated list.
Headers
AuthorizationThe Authorization header is used to authenticate with the API using your API key. Value is of the format Bearer YOUR_KEY_HERE.
Job board jobs › Responses
A list of active job board listings
idThe job's internal ID. Used for expiration.
titleJob title.
date_createdDate & time of indexing in our database.
urlThe URL of the job.
sourceSource job board.
source_typeFor ActiveJbJob, this is always 'jobboard'.
organizationName of the hiring organization.
organization_urlURL to the organization's page.
organization_logoURL to the organization's logo.
date_postedDate & time of posting.
date_valid_throughDate & time of the future expiry date.
Source-supplied location objects per the Google JobPosting schema (e.g. {address: {addressLocality, addressRegion, addressCountry, postalCode}, ...}). Use locations_derived, cities_derived, regions_derived, countries_derived, lats_derived / lngs_derived for normalized, geocoded values.
Normalized location strings. Geocoded. This is the field used for location search.
location_typeTo identify remote jobs: 'TELECOMMUTE' per the Google JobPosting schema.
location_requirementsLocation requirement to accompany remote (TELECOMMUTE) jobs per the Google JobPosting schema.
salarySource-supplied salary object per the Google JobPosting schema. Often partial or missing. For a normalized numeric breakdown use ai_salary_value, ai_salary_min_value, ai_salary_max_value, ai_salary_currency, and ai_salary_unit_text.
employment_typeTypes like 'Full Time', 'Contract', 'Internship'. Usually a single value. For better accuracy, use ai_employment_type.
source_domainDomain of the job board.
description_textPlain text job description. Returned when description_format=text. Description search returns a 400 error when used with time_frame=6m.
description_htmlRaw HTML job description. Returned when description_format=html. Description search returns a 400 error when used with time_frame=6m.
cities_derivedAll cities from locations_derived.
counties_derivedAll counties from locations_derived. Only present when cities_derived is not.
regions_derivedAll regions/states/provinces from locations_derived.
countries_derivedAll countries from locations_derived.
timezones_derivedAll timezones from locations_derived.
lats_derivedLatitudes derived from locations_derived.
lngs_derivedLongitudes derived from locations_derived.
ai_salary_currencySalary currency in ISO 4217 format.
ai_salary_valueSalary value when there is a single salary with no range.
ai_salary_min_valueMinimum salary in a range.
ai_salary_max_valueMaximum salary in a range.
ai_salary_unit_textSalary period: HOUR, DAY, WEEK, MONTH, or YEAR.
ai_benefitsNon-salary benefits mentioned in the job listing.
ai_experience_levelYears of experience required.
ai_work_arrangementRemote Solely (no office), Remote OK (optional office), Hybrid, or On-site.
ai_work_arrangement_office_daysWhen Hybrid, the number of days per week in office.
ai_remote_locationWhen remote but restricted to a certain location, returns that location.
ai_remote_location_derivedDerived remote location data matched with a location database (same as locations_derived).
ai_key_skillsKey skills mentioned in the job listing.
ai_hiring_manager_nameHiring manager name, if present.
ai_hiring_manager_email_addressHiring manager's email address, if present.
ai_core_responsibilitiesA 2-sentence summary of the job's core responsibilities.
ai_requirements_summaryA 2-sentence summary of the job's requirements.
ai_working_hoursRequired working hours. Defaults to 40 if not mentioned.
ai_employment_typeEmployment type as derived from the job description.
ai_job_languageLanguage of the job description.
ai_visa_sponsorshipTrue if the job description mentions visa sponsorship opportunities.
ai_taxonomies_aUp to 5 taxonomies per job ordered by relevancy (e.g., Technology, Healthcare, Finance & Accounting). The first item in the array is the primary taxonomy and is what the ai_taxonomies_a_primary filter matches against.
ai_keywordsImportant keywords: technologies, tools, skills, certifications, industry terms, methodologies, programming languages.
ai_educationExplicitly mentioned educational requirements from the job description.
org_linkedin_slugCompany-specific part of the LinkedIn URL (e.g., 'tesla-motors'). Unique per company. Always returned so jobs can be joined to /organizations-advanced results.
org_linkedin_headcountNumber of employees according to LinkedIn.
org_linkedin_websiteCompany's main website URL (sourced from LinkedIn).
org_linkedin_sizeEmployee count range according to the company.
org_linkedin_sloganCompany's slogan.
org_linkedin_industryCompany's industry from LinkedIn's fixed list.
org_linkedin_followersNumber of LinkedIn followers. Not populated for all companies.
org_linkedin_headquartersCompany's HQ location.
org_linkedin_typeCompany type (e.g., 'Privately Held', 'Public').
org_linkedin_founded_dateCompany's founded date.
org_linkedin_specialtiesCompany's specialties.
org_linkedin_locationsFull addresses of the company's locations.
org_linkedin_descriptionDescription from the company's LinkedIn page.
org_linkedin_recruitment_agency_derivedTrue if the company is a recruitment agency or job board (AI-identified).
recruiter_nameName of the recruiter who posted the job. Excluded when exclude_recruiter_fields=true.
recruiter_titleTitle of the recruiter. Excluded when exclude_recruiter_fields=true.
recruiter_urlURL to the recruiter's profile. Excluded when exclude_recruiter_fields=true.
senioritySeniority level as listed by the job board.
direct_applyTrue if the job supports direct application on the job board (e.g. LinkedIn Easy Apply).
no_jb_schemaTrue if the job board listing has no structured schema data.
ats_duplicateTrue if this job is a duplicate of an ATS listing.
linkedin_idLinkedIn job posting ID.