# Fantastic.jobs API - Developer Portal > Documentation files for Large Language Models ## Documentation - [Terms & Conditions](/terms.md) - [Sample Data](/sample-data.md): Download sample API responses to test the Fantastic.jobs data. Includes ATS jobs (active-ats), job board listings (active-jb), and advanced organization enrichments. The samples are structured exactly the same as our API output and contain all enrichments. - [Privacy Policy](/privacy.md) - [/home](/home.md): High performance job posting API for ATS and job board data. - [FAQ](/faq.md): Frequently asked questions about the API: Is CORS enabled? How does deduplication work? How many Job Titles / Companies / Locations can I include in my request? What is the timeout for an API request? - [Support & Contact](/contact.md): All parameters and fields are exposed in our public OpenAPI documentation: http://data.fantastic.jobs/openapi. Please ingest the specification for a complete overview of all options and capabilities - [Changelog](/changelog.md) - [Your First API Call](/documentation/your-first-api-call.md): Hands-on quickstart that walks through a first `GET` request to the `active-ats` endpoint, combining `title`, `location`, `time_frame`, and `limit` query parameters with `OR` operators and quoted multi-word values. Demonstrates a Software Engineer / Data Scientist search across New York and San Francisco using the API playground and provides ready-to-run curl, Node.js, and Python snippets. Includes a sidebar on how to structure the `location` parameter (full names, no abbreviations, UK constituent-country requirement) and links into the full API reference for additional filters like `organization`, `source`, `seniority`, and AI-enriched fields. - [Time Fields](/documentation/time-fields.md): Reference for the three UTC timestamp fields exposed on Fantastic.jobs job rows and which one to filter on for which use case. `date_posted` is what the source site says (can sit before `date_created`) - use it for "newly published" filters that mirror what end-users see on the source. `date_created` is when our system first indexed the job - always populated and monotonically increasing - use it for incremental syncs via `date_created_gte=` to guarantee no missed rows. `date_modified` is available only on `modified-ats` and marks when a tracked field last changed upstream. Also covers the 1-2 hour ingestion delay (jobs are at least 1 hour behind real time on `1h`/`24h` `time_frame` parameters), the windowed semantics of those time frames, and `date_modified` specifics including the `modified_fields` companion array and the 14-day cosmetic-bump suppression rule for posted-date-only changes on certain ATS. - [Supported ATS Sources](/documentation/supported-ats-sources.md): Canonical list of the 54 Applicant Tracking Systems Fantastic.jobs currently indexes via `active-ats` and `modified-ats`. Each row maps the exact `source` query-parameter value (used with `source` / `exclude_source` to include or exclude a specific platform) to its canonical product name and vendor, covering the full alphabetical range from `adp` and `applicantpro` through `workday` and `zoho`. Includes the universally-polled cadence (every ATS source is checked hourly to discover new jobs and re-checked for field-level modifications surfaced via `modified-ats`), and links out to the relevant endpoint docs, the `source` parameter on `active-ats`, and the changelog where newly-added ATS platforms are announced. - [Recommended Strategy](/documentation/recommended-strategy.md): End-to-end integration playbook for ingesting Fantastic.jobs data into your own database. Covers the recommended polling cadence (`active-ats` / `active-jb` with `time_frame=1h` every hour or `24h` at the same hour daily, both served with a 1-hour enrichment delay), `description_format` choice (`text`, `html`, or omit), offset pagination with `limit` between 100-1000, and key filters (`include_basic_organization_details`, `location`, `title`). Walks through pairing it with `expired-ats` / `expired-jb` (1h or 1d) to invalidate stale rows, backfilling with `7d` (offset) or `6m` (cursor, with the `date_posted` desc → `id` asc reordering caveat), running `modified-ats` once per day to sync field-level changes via `modified_fields`, and recovering from outages with `date_created_gte` to replay exactly the missed window without duplicates or gaps. Includes a worked 2-hour outage recovery example and warnings about expired-jb LinkedIn-only coverage and Wellfound / Y Combinator freshness. - [Nuances of Location Search](/documentation/nuances-of-location-search.md): Deep dive into how the `location` and `location_advanced` parameters work, including the underlying `locations_derived` field they query against. Explains the `City/County, Region, Country` structure (state for US, province for NL, constituent country for UK like `London, England, United Kingdom`, no region for Berlin/Hamburg), the always-English spelling convention (`Munich` not `Muenchen`), the rule that `locations_derived` holds either city or county but never both (county is exposed separately via `counties_derived`), and the limitation that county set via municipality is not currently searchable. Covers the recommended quoting + country-inclusion pattern (`"Birmingham, England, United Kingdom" OR "London, England, United Kingdom"`) to avoid cross-country collisions, points to the Geoapify Playground for validating exact location names, and walks through the 14-step normalization pipeline used to populate `locations_derived` from raw `locations`, `locations_alt`, and `location_requirements` fields - including the priority ordering used to pick the best match per job. - [How Fantastic.jobs API Works](/documentation/how-fantastic-jobs-api-works.md): Overview of the Fantastic.jobs API - a high-volume job postings feed built for recurring ingestion. Indexes new ATS jobs every hour from 54 ATS platforms across 200,000+ companies (plus Google, Meta, Apple, Amazon) and supplements them with job board listings from LinkedIn (hourly for English-speaking countries and tech roles), Wellfound, and Y Combinator. Designed for storing results in your own database via recurring polling rather than on-demand user-facing queries, with guidance on the trade-offs (latency, credit cost, lack of semantic search) of using it for real-time end-user requests. - [Field changes old to new API](/documentation/field-changes-old-to-new.md): Migration cheat sheet for moving from the old `api.fantastic.jobs` / RapidAPI endpoints to the new v1 endpoints. Covers response-field changes only (parameter renames live in the Changelog) across four buckets - **Type changes** (`id` is now `int64`/bigint instead of stringified number), **New** fields added in v1 (`org_linkedin_name`, `org_crunchbase_categories`, `org_crunchbase_total_investment`, `org_logo_permalink` on ATS; `ai_employment_type` on JB), **Removed** (`remote_derived` replaced by the AI-derived `ai_work_arrangement`; `external_apply_url` retired on JB - use `url` plus `direct_apply`; `organization_logo` deprecated on ATS - use `org_logo_permalink`), and **Renamed** (snake_case fixes like `date_validthrough` → `date_valid_through` and `ai_salary_minvalue` → `ai_salary_min_value`; the `_raw` suffix dropped on source-supplied fields like `locations_raw` → `locations`; the LinkedIn org family re-prefixed from `linkedin_org_*` to `org_linkedin_*` with semantic renames such as `linkedin_org_employees` → `org_linkedin_headcount` and `linkedin_org_url` → `org_linkedin_website`; plus `ai_education_requirements` → `ai_education` and `directapply` → `direct_apply`). - [Enrichments](/documentation/enrichments.md): Catalogue of the enrichments Fantastic.jobs layers on top of raw ATS and job board data. Covers `locations_derived` (Geoapify-powered location normalization to a consistent `city/county, region, country` format across all sources, with raw `locations` / `locations_alt` available as alternatives), AI-derived `ai_*` fields opted into via `include_ai` (LLM-extracted salary, benefits, experience level, detailed remote/work-arrangement signals, etc., covering ~99.9% of jobs via a multi-LLM failover system that uses only the job's own context with no outside data), two tiers of organization enrichment (Basic LinkedIn fields plus a few Crunchbase scalars - opt-in on ATS via `include_basic_organization_details=true`, always-on inline on `active-jb`; Advanced beta only via the separate `ats-organizations-advanced` endpoint, adding extra LinkedIn fields, NAICS/SIC classification, Crunchbase fiscal data, Glassdoor ratings, and opt-in heavy nested data like funding rounds and headcount timeseries), `domain_derived` employer-domain inference (~96% populated, ~98% accuracy on the populated subset, best for medium-to-large US companies), and `exclude_ats_duplicate` cross-feed deduplication on `active-jb` that flags LinkedIn listings matching ATS jobs by title + organization or title + LinkedIn company mapping (precision-first, with documented false-positive sources where fuzzy dedup should be layered on top). - [Plans, Limits & Upgrades](/documentation/credit-usage.md): Complete guide to Fantastic.jobs subscription plans and quota mechanics. Explains the two metered units - `Jobs` credits (consumed per job returned by the `active-ats` and `active-jb` new-jobs endpoints; modified, expired, and organization endpoints are complimentary) and `API Requests` credits (consumed per call, hard-capped on all plans while some plans allow `Jobs` overages at a per-job rate). Covers overage pricing (e.g. Pro-100k at $0.0025/job past quota), plan-tier feature gating (Modified Jobs requires Pro, Advanced Organization Enrichment beta requires Pro-100k+), prorated upgrade credits calculated from the max of time-elapsed / Jobs-consumed / Requests-consumed, the universal 600 req/min rate limit, and real-time usage tracking via `x-api-jobs-*` and `x-api-requests-*` response headers (with a caching caveat) or the subscriptions dashboard. - [Country Job Statistics](/documentation/country-job-statistics.md): Country-by-country reference tables of estimated new jobs indexed per month, split between the ATS feed (`active-ats`) and the job board feed (`active-jb`), intended to help size a subscription plan against your target market. Largest ATS markets are United States (1.8M-2.2M/month), India, Canada, United Kingdom, France, and Germany; largest JB markets are United States (6.0M-7.3M), Germany, United Kingdom, India, France, Brazil, Canada, and Netherlands - JB volumes are roughly an order of magnitude higher than ATS in most countries. Last updated April 21, 2026. - [Authentication](/documentation/authentication.md): How to authenticate requests to the Fantastic.jobs API using Bearer token authentication. Every request requires an `Authorization: Bearer YOUR_API_KEY` header, with keys managed from the subscriptions page. Includes copy-paste examples in curl, Node.js, and Python against the `active-ats` endpoint, a Try-in-Playground shortcut, and best-practice guidance for keeping keys secret (environment variables, no client-side exposure, no source control, rotation when leaked). - [ATS vs Job Board Fields](/documentation/ats-vs-jb-fields.md): Side-by-side reference of response field differences between `active-ats` (and `modified-ats`, which shares its shape) and `active-jb`. Both endpoints expose 72 fields with 64 in common and 8 unique to each. ATS-only fields cover basic-organization extras returned with `include_basic_organization_details=true` (`org_linkedin_name`, `org_crunchbase_categories`, `org_crunchbase_total_investment`, `org_logo_permalink`), modification tracking (`date_modified`, `modified_fields` - populated on `time_frame=6m` and always on `modified-ats`), and source-enrichment fields (`domain_derived`, `locations_alt`). JB-only fields cover LinkedIn-specific signals (`linkedin_id`, `direct_apply`, `seniority`), recruiter info (`recruiter_name`, `recruiter_title`, `recruiter_url`, droppable via `exclude_recruiter_fields=true`), and dedup / data-quality flags (`ats_duplicate`, `no_jb_schema`). Also covers behavioral differences in the 64 shared fields - organization fields are always-on for JB but opt-in for ATS, description search is not supported on `active-jb` with `time_frame=6m`, and `organization_logo` is deprecated on ATS only (use `org_logo_permalink` instead). - [Advanced Searching Guide](/documentation/advanced-searching-guide.md): Reference for the `_advanced` query parameters (`title_advanced`, `description_advanced`, `location_advanced`, `organization_advanced`) which accept an explicit Boolean search-expression syntax. Documents the supported operators (`&` AND, `|` OR, `!` NOT, `<->` FOLLOWED BY, `` distance, single-quoted phrases as a shorthand for `<->`, `()` grouping, `:*` prefix matching), URL-encoding requirements for operator characters, and worked examples for each parameter plus combination patterns. - [New Jobs](/documentation/endpoints/new-jobs.md): Reference for the two new-jobs endpoints - `active-ats` (54 ATS platforms incl. greenhouse, lever, workday, ashby, bamboohr, icims, smartrecruiters, etc., polled hourly) and `active-jb` (LinkedIn hourly for English-speaking countries, plus Wellfound and Y Combinator on a multi-hour cadence). Documents all four `time_frame` values (`1h` hourly polling, `24h` daily polling, both with 1-hour enrichment delay; `7d` and `6m` for backfills refreshed every 1-3 minutes with ~45-minute delay), key query parameters (`description_format`, `include_basic_organization_details`, `title`, `location`, `source`), pagination strategy (offset for `1h`/`24h`/`7d`, cursor for `6m` to avoid deep-offset inefficiency), and credit consumption (one `Jobs` credit per job returned, with cadence-matched polling advice to avoid duplicate spend). - [Modified Jobs](/documentation/endpoints/modified-jobs.md): Reference for the `modified-ats` endpoint - the Pro-plan companion to `active-ats` that lets you keep an existing copy of the dataset in sync without re-fetching the full feed. ATS only (no `modified-jb` equivalent for LinkedIn / Wellfound / Y Combinator), returns every ATS job whose tracked fields (title, description, location, salary, apply URL, etc.) changed in the last 24 hours - typically 100,000-150,000 jobs/day. Recommends calling once per day at a fixed time to avoid duplicates between runs, supports both `offset` and `cursor` pagination (with the same ordering caveat as `active-ats`), and returns two extra fields beyond the `ActiveAtsJob` shape: `date_modified` (UTC timestamp of detected change, default sort) and `modified_fields` (string array of changed field names for targeted updates). Posted-date-only changes are filtered out unless the new `date_posted` is older than 14-30 days to suppress cosmetic "freshness" bumps from certain ATS. - [Expired Jobs](/documentation/endpoints/expired-jobs.md): Reference for the `expired-ats` and `expired-jb` endpoints, which return arrays of internal job IDs for postings that have expired or been removed from their source - match each ID against the `id` field in your stored copies to invalidate stale rows. Jobs are re-checked daily until 6 months old, after which they are auto-expired. `expired-ats` covers every ATS source while `expired-jb` covers LinkedIn only (Wellfound and Y Combinator are never flagged - bring your own freshness logic). Four `time_frame` values are available: `1h` (rolling 1-hour window, continuously refreshed, for hourly mirrors), `1d` (daily snapshot of the previous UTC day refreshed at 01:00 UTC - not a rolling 24-hour window), `1m` (jobs expired during the last 31 days), and `6m` (full 6-month backfill, intended for multi-day outage recovery, not routine polling). Jobs surfaced here are automatically removed from the `7d` and `6m` backfill windows on the active-jobs endpoints. - [Count Endpoints](/documentation/endpoints/count-endpoints.md): Reference for the `active-ats-count` and `active-jb-count` endpoints, which return the number of listings matching your filters in a time window without returning any job rows. Primarily used for plan sizing - call with `time_frame=1m` to see how many jobs match your filters over the last 31 days before subscribing - and for estimating how many jobs a `6m` backfill will pull. Accept the same filters as the active-jobs endpoints minus response-shaping and pagination params (`limit`, `offset`, `cursor`, `description_format`, etc.). Each call consumes 1 API Request, scans the entire filtered set, and times out after 60 seconds, so `6m` should be used sparingly. Not needed for paginating the data endpoints. - [Company List](/documentation/endpoints/company-list.md): Reference for the `ats-organizations` endpoint - a single ~50MB JSON array (also available as CSV) of every organization in the ATS catalog with a small set of basic LinkedIn identifier fields. It is a one-shot lookup table for discovering valid `organization`, `organization_domain`, and `organization_slug` filter values to use against the jobs endpoints, refreshed daily at 02:00 UTC. Distinct from `include_basic_organization_details=true` (which returns the full set of basic LinkedIn fields inline on jobs) and from the `ats-organizations-advanced` enrichment endpoint. - [Advanced Company Details](/documentation/endpoints/advanced-company-details.md): Reference for the `ats-organizations-advanced` endpoint (beta) - the full enriched company profile returned 100 per page, refreshed monthly on the 1st at 02:00 UTC, joinable to ATS jobs by `org_linkedin_slug`. Returns everything in the basic organization details plus extra LinkedIn fields (URL, ID, short description, full industry list, estimated revenue bounds, largest headcount country), NAICS/SIC/market classifications, Crunchbase fiscal data and acquisition/IPO status, Glassdoor rating scalars and review/salary/interview/benefit counts, and opt-in heavy nested fields via dedicated `include_*` flags (Crunchbase funding rounds, headcount/follower/revenue timeseries, news articles, Glassdoor reviews) that each significantly grow payload size.