Changelog
All notable changes to the Fantastic.jobs API will be documented here.
v0.9 (beta) - Migrating from Rapid and api.fantastic.jobs
This is our first major refactor of the Fantastic.jobs API and is currently shipping under the v0.9 beta namespace ahead of the v1.0 stable release. Below we will describe all major changes.
Breaking Changes
- Response field
idis now returned as a numericbigintinstead of a string. active-ats- Unified ATS endpoint replacing the separateactive-ats-1h,active-ats-24h,active-ats-7d, andactive-ats-6mendpoints. Use thetime_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, andjb-expired-6mendpoints. Useexpired-atsorexpired-jbwithtime_frameset to1h(rolling),1d(daily snapshot, refreshed at 01:00 UTC), or6m. - Expired feeds - The previous daily snapshot value
time_frame=24hhas been renamed totime_frame=1dto indicate the cadence rather than imply a rolling 24-hour window.1dis a once-per-day snapshot of the previous UTC day (refreshed at 01:00 UTC). The1hrolling window and6mbackfill are unchanged. - Default limit unified to 100, max increased to 1000.
- Added
organizations-advanced- 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 viainclude_crunchbase_funding_and_investment,include_linkedin_headcount_timeseries,include_linkedin_followers_timeseries,include_linkedin_estimated_revenue_timeseries,include_news_articles, andinclude_glassdoor_reviews. - Added
organizations- returns the full list of organizations currently tracked across ATS sources, including basic LinkedIn company details. - 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 - Expanded
include_basic_organization_details=trueonactive-atsandmodified-atswith four additional company fields:org_linkedin_name,org_crunchbase_categories,org_crunchbase_total_investment, andorg_logo_permalink(Crustdata-hosted logo URL, aliased to matchorganizations-advanced). These four fields are populated for newly indexed jobs only; backfilling them across thetime_frame=6mwindow is in progress. - 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 filters now use the
exclude_prefix instead of the_exclusionsuffix (e.g.organization_exclusion->exclude_organization). - Tri-state filters
organization_agency,direct_apply, andai_visa_sponsorshipno longer accepttrue/false. They now take an enum ofonlyorexclude; omit the parameter to include both. (e.g.?organization_agency=onlyreturns only agency listings,?organization_agency=excludereturns only non-agency listings, omitting it returns both.) - Renamed
directapplytodirect_applyfor snake_case consistency. This applies to both the query parameter onactive-jband the response field onActiveJbJob. The wire format is otherwise unchanged. - Renamed response field
org_linkedin_urltoorg_linkedin_websiteonactive-ats,active-jb, andmodified-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 onorganizations-advanced. Onorganizations-advanced,org_linkedin_url(the LinkedIn profile URL) andorg_linkedin_website(the company website) remain as two distinct fields. - Deprecated response field
organization_logoonactive-atsandmodified-ats. The ATS-supplied URL can break or expire over time. Useorg_logo_permalinkinstead - a Crustdata-hosted permanent URL returned wheninclude_basic_organization_details=true(or always present onorganizations-advanced).organization_logocontinues to be returned without a flag in the meantime.active-jbkeepsorganization_logoas the primary logo field. - Dropped the
_rawsuffix from source-supplied response fields.locations_raw->locations,locations_alt_raw->locations_alt,location_requirements_raw->location_requirements,salary_raw->salary. The_rawsuffix was redundant given the existing convention (_derivedfor normalized values,ai_for AI-extracted,org_for organization context, bare name for source-of-truth). Applies toactive-ats,active-jb, andmodified-ats. - Multi-value free-text filters (
organization,exclude_organization,domain,exclude_domain,source,exclude_source,organization_industry,exclude_organization_industry,organization_slug,exclude_organization_slug,seniority,id,linkedin_id) are now typed asarray<string>(style: form,explode: false) in the OpenAPI spec for proper SDK generation. The wire format is unchanged (?param=val1,val2). Whitespace around commas in raw URL inputs (e.g.?source=greenhouse, lever) is now trimmed automatically rather than treated as part of the value. - 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 toorg_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 filters now follow a consistent
_gte(inclusive lower) +_lt(exclusive upper) convention. The previousorganization_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_industryfilter toactive-ats,active-jb, andmodified-atsfor parity withorganization_industry(matches the existingorganization/exclude_organization,domain/exclude_domain,source/exclude_source,organization_slug/exclude_organization_slugpattern). idandlinkedin_idfilter parameters are now typed asarray<integer>(format: int64) to match the corresponding response fields. Thecursorparameter is similarly typed asinteger / int64. Wire format is unchanged.active-jb- Unified job board endpoint replacing the separateactive-jb-hourly,active-jb-24h,active-jb-7d, andactive-jb-6mendpoints. Use thetime_frameparameter to select the time window (1h,24h,7d,6m).- Organization details are now always included (no toggle).
- AI-enriched fields are now included by default (removed
include_ai). sourcefilter now supports multiple values (comma-separated) instead of single value.- Description search (
description,description_advanced) returns a 400 error when used withtime_frame=6m. - Removed
li_startup,remote,date_filter,organization_description_filter,organization_specialties_filter,advanced_organization_description_filter. - 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; passexclude_recruiter_fields=trueto drop them). - Renamed
type_filtertoemployment_type. - Renamed
seniority_filtertoseniority. - Added
exclude_organization,exclude_source,ai_education,ai_employment_typefilters. - Same parameter naming conventions as ATS (dropped
_filtersuffixes,organization_prefix for LinkedIn params,_advancedsuffix for FTS). - Same limit/offset, snake_case renames, and
org_linkedin_prefix changes as ATS.
Minor Changes
- For
active-ats,date_modifiedandmodified_fieldsare only available whentime_frame=6m. org_linkedin_slugis now always included so jobs can be matched to advanced company details, even wheninclude_basic_organization_detailsis not set.exclude_ats_duplicate(LinkedIn ↔ ATS deduplication) now uses two checks instead of three - the cleaned-URL match has been removed. Title + organization name and title + LinkedIn company-profile matches remain.ats_duplicate=nullsemantics for agency and direct-apply listings are unchanged.