New Jobs
Fantastic.jobs checks for new jobs every hour. Two endpoints are available:
| Endpoint | Sources | Refresh cadence |
|---|---|---|
active-ats | 54 ATS platforms (company career pages) | Hourly |
active-jb | LinkedIn, Wellfound, Y Combinator | LinkedIn hourly (select countries); others every few hours |
active-ats
All ATS platforms are polled hourly to discover new jobs. For the full catalog of indexed platforms - including the exact source value, canonical product name, and vendor - see Supported ATS Sources.
New ATS platforms are added regularly. Keep an eye on our changelog to stay up to date.
active-jb
For job boards, LinkedIn jobs in English-speaking countries are indexed hourly: United States, United Kingdom, Canada, New Zealand, Australia, Singapore, and Ireland.
Other major countries are checked every few hours, and remaining countries are updated less frequently.
Job board sources available via the source parameter: linkedin, wellfound, ycombinator.
Note on expiry tracking: only
/expired-jb.wellfoundandycombinatorlistings are never flagged as expired - if you ingest them you'll need your own freshness logic (e.g. age-out anything older than N days).
time_frame
| Value | Intended use | Window | Ingestion delay |
|---|---|---|---|
1h | Hourly polling | Rolling 1-hour window | 1 hour |
24h | Daily polling | Rolling 24-hour window | 1 hour |
7d | Weekly batch / short backfill | Rolling 7-day window, refreshed every 1–3 minutes | ~45 minutes |
6m | Full backfill | Rolling 6-month window, refreshed every 1–3 minutes | ~45 minutes |
To give your users an edge, we recommend using 1h to keep your feed as fresh as possible. If hourly polling isn't practical, 24h works well - just make sure to call it during the same one-hour window every day to avoid pulling duplicate jobs.
Both 1h and 24h serve jobs with a one-hour enrichment delay (UTC):
1h— if you call the endpoint at 09:15 you receive all jobs indexed between 07:00 and 08:00.24h— if you call on 2026-01-02 at 09:15 you receive all jobs indexed between 2026-01-01 07:00 and 2026-01-02 08:00.
Enrichments applied before a job enters these windows include LLM-assisted field extraction, location normalisation, company data, and company reviews. See Enrichments for the full list of enriched fields.
We recommend using 7d and 6m only for backfilling your database. Both windows are refreshed roughly every minute with a ~45-minute delay. See Recommended Strategy for a full backfill guide including cursor pagination.
Key parameters
| Parameter | Applies to | Description |
|---|---|---|
time_frame | Both | Required. 1h, 24h, 7d, or 6m. See table above. |
description_format | Both | text or html. Descriptions are not returned by default because they add significant payload size. |
include_basic_organization_details | active-ats only | Set to true to include inline LinkedIn company fields (name, industry, headcount, HQ, etc.). Not needed if you already call /ats-organizations-advanced - all those fields are included there. org_linkedin_slug is always returned regardless. |
title | Both | Natural-language title search. "software engineer" for exact phrase, Software OR Engineer for either word. Use title_advanced for Boolean operators. |
location | Both | Natural-language location search. Use full names: "United States" not US. Multi-location: "United States" OR Canada. See Nuances of Location Search. |
source | Both | Comma-separated list of ATS/job-board sources to include. Useful for filtering to a specific ATS. |
For the full parameter reference, see All parameters at the bottom of this page.
Pagination
For 1h, 24h, and 7d, use offset pagination. Set a limit between 100 and 1,000 and keep increasing offset by limit until the response returns fewer rows than limit:
Code
For 6m, use cursor pagination instead. Offset becomes inefficient at deep pages on very large feeds:
Code
Pass the last id returned as the cursor for the next request. Note that cursor pagination orders results by id ascending rather than date_posted descending. If both cursor and offset are passed, cursor wins.
See Recommended Strategy for more detail.
Credit consumption
Both active-ats and active-jb consume Jobs credits, one credit per job returned. All other endpoints (modified, expired, ats-organizations) are complimentary to certain plans, and do not count against your Jobs quota.
To avoid consuming duplicate credits, always match your polling cadence to your time_frame:
1h→ poll every hour24h→ poll once per day in the same hour
See Plans, Limits & Upgrades for quota details, overage pricing, and how to track usage via response headers.
All parameters
Every query parameter accepted by active-ats and active-jb. The Applies to column shows which endpoint(s) support each parameter (Both, active-ats, or active-jb).
Pagination & response shape
| Parameter | Applies to | Description |
|---|---|---|
time_frame | Both | Required. Time window: 1h, 24h, 7d, or 6m (default 24h). See the time_frame table above. |
limit | Both | Number of results to return. Default 100, min 1, max 1000. Use with offset to paginate. |
offset | Both | Number of results to skip for pagination. Use cursor instead for very large feeds - offset becomes inefficient at deep pages. |
cursor | Both | Cursor pagination - pass the last job's id to get the next page. Orders by id ascending (overrides default ordering). If both cursor and offset are passed, cursor wins. |
description_format | Both | text or html. Omit entirely to exclude the description field - descriptions are not returned by default because they add significant payload size. html is unsanitized scraped markup. |
include_basic_organization_details | active-ats | Set true to include inline LinkedIn company fields (name, industry, headcount, HQ, etc.). Not needed if you already call /ats-organizations-advanced. org_linkedin_slug is always returned regardless. |
exclude_recruiter_fields | active-jb | Set true to exclude recruiter fields (recruiter_name, recruiter_title, recruiter_url) from the response. Default: included. |
Text search
| Parameter | Applies to | Description |
|---|---|---|
title | Both | Google-style search on job title. "software engineer" for exact phrase, software OR engineer for either word, -engineer to exclude. Use title_advanced for Boolean operators. |
description | Both | Google-style search on title and description combined. Same syntax as title. For active-jb this is not available on time_frame=6m. |
location | Both | Search on location fields. Use full names (United States, not US). Multi-location with OR. See Nuances of Location Search. |
organization | Both | Filter by organization name(s). Exact, case-sensitive. Comma-separated list. Use organization_slug or organization_advanced for names with parentheses. |
exclude_organization | Both | Exclude organization name(s). Same matching rules as organization. Comma-separated list. |
title_advanced | Both | Boolean full-text search on title. Operators: & | ! <->, parentheses, :* prefix. Takes precedence over title. See Advanced Searching Guide. |
description_advanced | Both | Boolean full-text search on title + description. Same operators as title_advanced. Takes precedence over description. Not available on time_frame=6m for active-jb. |
location_advanced | Both | Boolean full-text search on location. Same operators as title_advanced. Takes precedence over location. |
organization_advanced | Both | Boolean full-text search on organization name. Same operators as title_advanced. Takes precedence over organization. |
Date filters
| Parameter | Applies to | Description |
|---|---|---|
date_posted_gte | Both | Jobs posted on or after this date (ISO 8601, UTC). See Time Fields. |
date_posted_lt | Both | Jobs posted before this date (ISO 8601). |
date_created_gte | Both | Jobs indexed on or after this date (ISO 8601). date_created reflects when our system first indexed the job. |
date_created_lt | Both | Jobs indexed before this date (ISO 8601). |
Source & organization filters
| Parameter | Applies to | Description |
|---|---|---|
source | Both | Filter by source(s), comma-separated. active-ats: ATS platform values (greenhouse, lever.co, workday, …). active-jb: linkedin, wellfound, ycombinator. |
exclude_source | Both | Exclude source(s). Same value sets as source. Comma-separated list. |
domain | active-ats | Filter by employer domain(s), e.g. nvidia.com,microsoft.com. Useful to capture employers with multiple ATS across regions. Comma-separated list. |
exclude_domain | active-ats | Exclude employer domain(s). Same rules as domain. Comma-separated list. |
organization_industry | Both | Filter by exact LinkedIn industry name (case-sensitive). See LinkedIn Industries. Comma-separated list. |
exclude_organization_industry | Both | Exclude LinkedIn industry/industries. Same rules as organization_industry. Comma-separated list. |
organization_slug | Both | Filter by LinkedIn organization slug(s) (e.g. tesla-motors). Exact match. More reliable than organization. Comma-separated list. |
exclude_organization_slug | Both | Exclude LinkedIn organization slug(s). Same rules as organization_slug. Comma-separated list. |
organization_headcount_gte | Both | Companies with at least this many LinkedIn employees (inclusive lower bound). |
organization_headcount_lt | Both | Companies with fewer than this many LinkedIn employees (exclusive upper bound). |
organization_agency | Both | only to return only recruitment/staffing agencies, exclude to remove them. Flag is exposed as org_linkedin_recruitment_agency_derived. |
AI-derived filters
| Parameter | Applies to | Description |
|---|---|---|
ai_experience_level | Both | AI-derived years of experience: 0-2, 2-5, 5-10, 10+. Comma-separated to broaden. |
ai_work_arrangement | Both | AI-derived arrangement: On-site, Hybrid, Remote OK, Remote Solely. Comma-separated to broaden. |
ai_employment_type | Both | AI-derived employment type (overlap match): FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, PER_DIEM, INTERN, VOLUNTEER, OTHER. Comma-separated list. |
ai_education | Both | AI-derived education (overlap match): high school, associate degree, bachelor degree, professional certificate, postgraduate degree. Comma-separated list. |
ai_taxonomies_a_primary | Both | Match only the primary (first, most relevant) AI taxonomy. Tighter than ai_taxonomies_a. Comma-separated list. |
ai_taxonomies_a | Both | Match if any assigned AI taxonomy is in your list (broad, overlap match). Comma-separated list. |
exclude_ai_taxonomies_a | Both | Exclude jobs if any assigned AI taxonomy is in this list. Same value list as ai_taxonomies_a. |
ai_visa_sponsorship | Both | only to return only listings offering visa sponsorship, exclude to remove them. Detected from description language. |
Other filters
| Parameter | Applies to | Description |
|---|---|---|
has_salary | Both | Set true to only return jobs with salary information (raw or AI-enriched). |
has_no_location | Both | Set true to return only listings with no normalized location (locations_derived is null). Don't combine with location / location_advanced. |
seniority | active-jb | Filter by LinkedIn-posted seniority (case-sensitive): Internship, Entry level, Associate, Mid-Senior level, Director, Executive, Not Applicable. Prefer ai_experience_level for a normalized signal. Comma-separated list. |
employment_type | active-jb | Deprecated - use ai_employment_type. Raw, country-specific employment type values (overlap match). Comma-separated list. |
direct_apply | active-jb | only for listings that support in-platform apply (e.g. LinkedIn Easy Apply), exclude for those that redirect externally. Almost no overlap with the ATS feed. |
exclude_ats_duplicate | active-jb | Set true (only useful if you also consume active-ats) to drop most LinkedIn jobs matched against an existing ATS posting. See ats_duplicate in the response. |
linkedin_id | active-jb | Filter by LinkedIn public job posting ID(s) - the digits in linkedin.com/jobs/view/{linkedin_id}. Distinct from id. Comma-separated list. |
id | Both | Filter by one or more internal Fantastic.jobs IDs (matches the id response field). e.g. id=8123456,8123457. Comma-separated list. |