Changelog
All notable changes to the Fantastic.jobs API will be documented here.
2026-07-16
- Improved duplicate detection across all 63 ATS sources. Listings with matching
title,organization,description,locations, andlocation_requirementsare now suppressed even when they use different URLs, reducing duplicate results returned by active-ats and modified-ats. This applies to ATS listings only; LinkedIn and job board listings are unchanged.
2026-07-13
- Fixed
x-api-jobs-limitandx-api-requests-limitresponse headers, which previously inflated once a customer exceeded their plan's included allowance. They now consistently report the plan's included monthly limit (e.g.100000on a 100k plan) regardless of overage. See Plans, Limits & Upgrades. - Fixed
x-api-jobs-remainingandx-api-requests-remainingresponse headers to account for accumulated overage. When you are over your included allowance these headers now report the true remaining balance (a negative value reflecting total overage), instead of only the current request's overage.
2026-07-08
- Added
source_slugresponse field on active-ats and modified-ats. It carries the employer's identifier (slug) on the source ATS - e.g.anthropicinjob-boards.greenhouse.io/anthropic/...- so you can combine it withsourceto call the ATS's own public API when building automations. Currently populated forgreenhouseonly;nullfor other sources while coverage expands. See ATS vs Job Board Fields.
2026-06-26
- Added
organization_funding_gteandorganization_funding_ltparameters on active-ats, modified-ats, and active-ats-count. They filter by total funding raised in USD, according to Crunchbase, exposed asorg_crunchbase_total_investment.
2026-06-25
- Added Deel as a supported ATS source. Filter with
source=deel(or exclude it withexclude_source=deel) on active-ats, modified-ats, and the matching count endpoints. See Supported ATS Sources.
2026-06-22
- Added
ai_languageparameter on active-ats, active-jb, modified-ats, and the matching count endpoints. It filters by the AI-detected job-description language exposed asai_job_languagein responses and accepts a comma-separated list of supported language values. - Added
organization_sizeparameter on the same job and count endpoints. It accepts company-size bucket values (1,2-10,11-50,51-200,201-500,501-1000,1001-5000,5001-10000,10001+) and matches theorg_linkedin_sizeresponse field.
2026-06-05
- Added
x-api-next-billing-dateresponse header on all successful responses - an ISO-8601 (UTC) timestamp of your next billing date, when the current period'sJobsandAPI Requestsquotas renew. See Plans, Limits & Upgrades. - Added
time_frame=1mto expired-ats and expired-jb for monthly expired-job reconciliation.
2026-06-03
- Added
linkedin_slugandlinkedin_namefilters to ats-organizations-advanced for fetching specific companies. Both accept a comma-separated list:linkedin_slugfilters onorg_linkedin_slug(unique, stable per company - recommended) andlinkedin_namefilters onorg_linkedin_name(exact, case-sensitive match).
2026-06-01
exclude_ats_duplicate(LinkedIn ↔ ATS deduplication) now includes country in both checks, and agency listings are now checked. Matching now uses title + organization name + country and title + LinkedIn company profile + country.
v1 - Migrating from Rapid and api.fantastic.jobs
This is our first major refactor of the Fantastic.jobs API. Below we will describe all major changes. For a focused, field-by-field response-field migration cheat sheet, see Field changes: old → new API.
New Features
- active-ats-count and active-jb-count (beta) - Return the total count of ATS / job board listings matching your parameters in the selected time window. No job rows are returned. Intended for selecting a subscription tier that matches your job volume - call with the new 'time_frame=1m' (jobs indexed during the last 31 days, the default) for a monthly estimate. Also accepts '1h', '24h', and '6m'. The endpoints accept the same parameters as active-ats / active-jb except those that shape the response or paginate.
description/description_advancedare not available on 'time_frame=6m'. Each call consumes 1 API Request and 0 Jobs credits. - Expanded
include_basic_organization_details=true(replacement of include_li) on active-ats and modified-ats with four additional company fields:org_linkedin_name,org_crunchbase_categories,org_crunchbase_total_investment, andorg_logo_permalink. These four fields are populated for newly indexed jobs only; backfilling them across the 'time_frame=6m' window is in progress. - Added ats-organizations - a slim catalog of every organization currently tracked across ATS sources (org name, derived domain, LinkedIn slug, name, industry, headcount, HQ). Intended for browsing the catalog and discovering valid
organization,organization_domain, andorganization_slugfilter values - not an enrichment endpoint. - Added ats-organizations-advanced (beta) - returns advanced organization data including LinkedIn profile, Crunchbase funding & investment, Glassdoor ratings & reviews, headcount/follower/revenue timeseries, and news articles. Fixed at 100 results per page. Heavy nested fields are excluded by default and must be opted into via
include_crunchbase_funding_and_investment,include_linkedin_headcount_timeseries,include_linkedin_followers_timeseries,include_linkedin_estimated_revenue_timeseries,include_news_articles, andinclude_glassdoor_reviews. - Added
has_no_locationparameter to active-ats, active-jb, modified-ats, active-ats-count, and active-jb-count. Set to 'true' to return only listings with no normalized location set (i.e.locations_derivedis null) - useful for surfacing jobs whose source feed didn't include structured location data and would otherwise be missed by location-based searches. Omit (or pass 'false') to include all listings.
Breaking Changes
- Response field
idis now returned as a numeric 'bigint' instead of a string. - active-ats - Unified ATS endpoint replacing the separate 'active-ats-1h', 'active-ats-24h', 'active-ats-7d', and 'active-ats-6m' endpoints. Use the
time_frameparameter to select the time window ('1h', '24h', '7d', '6m'). - active-jb - Unified job board endpoint replacing the separate 'active-jb-hourly', 'active-jb-24h', 'active-jb-7d', and 'active-jb-6m' endpoints. Use the
time_frameparameter to select the time window ('1h', '24h', '7d', '6m'). - Expired feeds - Unified expired endpoints replacing the separate 'ats-expired-1h', 'ats-expired-6m', 'jb-expired-1h', and 'jb-expired-6m' endpoints. Use expired-ats or expired-jb with
time_frameset to '1h' (rolling), '1d' (daily snapshot, refreshed at 01:00 UTC), or '6m'. - Default
limitis now 100, max increased to 1000 on active-ats, active-jb, and modified-ats. ats-organizations-advanced is fixed at 100 per page. - Removed
date_filterparameter. Usedate_posted_gteanddate_posted_ltinstead. - Removed
remoteparameter andremote_derivedresponse field. Useai_work_arrangementinstead, which provides a more comprehensive analysis ('Remote Solely', 'Remote OK', 'Hybrid', 'On-site') than the previous keyword-matching heuristic. - Removed
organization_descriptionparameter. - Removed
organization_specialtiesparameter. - Removed
include_aiparameter. AI-enriched fields are now included by default. - Renamed
include_litoinclude_basic_organization_details - Renamed query parameters for consistency:
-
title_filter->title -
description_filter->description -
location_filter->location -
advanced_title_filter->title_advanced -
advanced_description_filter->description_advanced -
advanced_location_filter->location_advanced -
advanced_organization_filter->organization_advanced -
organization_filter->organization -
organization_exclusion_filter->exclude_organization -
domain_filter->domain -
domain_exclusion_filter->exclude_domain -
li_industry_filter->organization_industry -
li_organization_slug_filter->organization_slug -
li_organization_slug_exclusion_filter->exclude_organization_slug -
li_organization_employees_gte->organization_headcount_gte -
li_organization_employees_lte->organization_headcount_lt(note: bound is now exclusive - see below) -
ai_experience_level_filter->ai_experience_level -
ai_work_arrangement_filter->ai_work_arrangement -
ai_employment_type_filter->ai_employment_type -
ai_education_requirements_filter->ai_education -
ai_taxonomies_a_filter->ai_taxonomies_a -
ai_taxonomies_a_exclusion_filter->exclude_ai_taxonomies_a -
ai_taxonomies_a_primary_filter->ai_taxonomies_a_primary -
ai_visa_sponsorship_filter->ai_visa_sponsorship -
ai_has_salary->has_salary -
agency->organization_agency -
description_type->description_format
-
- Exclusion parameters now use the 'exclude_' prefix instead of the '_exclusion' suffix (e.g.
organization_exclusion->exclude_organization). - New Tri-state parameters
organization_agency,direct_apply(active-jb only), andai_visa_sponsorshipno longer accept 'true'/'false'. They now take an enum of 'only' or 'exclude'; omit the parameter to include both. (e.g. '?organization_agency=only' returns only agency listings, '?organization_agency=exclude' returns only non-agency listings, omitting it returns both.) - Renamed
directapplytodirect_applyfor snake_case consistency. This applies to both the query parameter on active-jb and the response field on 'ActiveJbJob'. The wire format is otherwise unchanged. - Renamed response field
org_linkedin_urltoorg_linkedin_websiteon active-ats, active-jb, and modified-ats. The value is the company's website (e.g. 'https://example.com'), not the LinkedIn profile URL - the new name reflects the actual data and matches the field name on ats-organizations-advanced. On ats-organizations-advanced,org_linkedin_url(the LinkedIn profile URL) andorg_linkedin_website(the company website) remain as two distinct fields. - Deprecated response field
organization_logoon active-ats and modified-ats. The ATS-supplied URL can break or expire over time. Useorg_logo_permalinkinstead.organization_logocontinues to be returned without a flag in the meantime. active-jb keepsorganization_logoas the primary logo field. - Dropped the '_raw' suffix from source-supplied response fields.
locations_raw->locations,locations_alt_raw->locations_alt(active-ats and modified-ats only; not present on active-jb),location_requirements_raw->location_requirements,salary_raw->salary. The 'raw' suffix was redundant given the existing convention ('derived' for normalized values, 'ai' for AI-extracted, 'org' for organization context, bare name for source-of-truth). Applies to active-ats, active-jb, and modified-ats. - Renamed response fields to proper snake_case:
date_validthrough→date_valid_throughai_salary_minvalue→ai_salary_min_valueai_salary_maxvalue→ai_salary_max_valueai_salary_unittext→ai_salary_unit_textai_education_requirements→ai_educationlinkedin_org_foundeddate→org_linkedin_founded_date
- Renamed all 'linkedin_org_' response field prefixes to 'org_linkedin_' to group organization fields by entity. This applies to all LinkedIn organization fields (e.g.,
linkedin_org_slug→org_linkedin_slug,linkedin_org_employees→org_linkedin_headcount, etc.). - Renamed
org_linkedin_employeesresponse field andorganization_employees_gte/organization_employees_ltefilter parameters toorg_linkedin_headcount,organization_headcount_gte, andorganization_headcount_lt. - All range parameters now follow a consistent '_gte' (inclusive lower) + '_lt' (exclusive upper) convention. The previous
organization_headcount_lte(inclusive upper) has been replaced byorganization_headcount_lt(exclusive upper); to keep the same result set, increment the value by 1 (e.g. 'organization_headcount_lte=100' → 'organization_headcount_lt=101'). - Added
exclude_organization_industryparameter to active-ats, active-jb, and modified-ats for parity withorganization_industry(matches the existingorganization/exclude_organization,domain/exclude_domain,source/exclude_source,organization_slug/exclude_organization_slugpattern). - Removed
advanced_organization_description_filterparameters. - active-jb - additional parameter and field changes:
sourceparameter now supports multiple values (comma-separated) instead of single value.- Removed
has_external_applyquery parameter andexternal_apply_urlresponse field. The LinkedIn joburlremains the canonical apply entry point. Note thatdirect_applyis a separate signal from LinkedIn (whether the job offers in-platform "Easy Apply") and is not an inverse of having an external apply URL - it remains available as both a filter and a response field. - Renamed
recruitertoggle toexclude_recruiter_fields(polarity flipped: default is still to include the three recruiter fields; pass 'exclude_recruiter_fields=true' to drop them). - Renamed
type_filtertoemployment_type. - Renamed
seniority_filtertoseniority. - Added
exclude_organization,exclude_source,ai_education,ai_employment_typeparameters. - Same parameter naming conventions as ATS (dropped 'filter' suffixes, 'organization' prefix for LinkedIn params, '_advanced' suffix for FTS).
- Same limit/offset, snake_case renames, and 'org_linkedin_' prefix changes as ATS.
- active-jb -
employment_typefilter is deprecated and will be removed in a future version. Useai_employment_typeinstead, which provides normalized, market-independent values now that every job is AI-analysed.
Minor Changes
- For active-ats,
date_modifiedandmodified_fieldsare only available when 'time_frame=6m'. - Description search (
description,description_advanced) is not available with 'time_frame=6m' on active-jb, active-ats-count, and active-jb-count (returns 400). It remains allowed on active-ats. org_linkedin_slugis now always included so jobs can be matched to advanced company details, even wheninclude_basic_organization_detailsis not set.