# New Jobs

Fantastic.jobs checks for new jobs every hour. Two endpoints are available:

| Endpoint | Sources | Refresh cadence |
| --- | --- | --- |
| [`active-ats`](/api/new-jobs#ats-jobs) | 54 ATS platforms (company career pages) | Hourly |
| [`active-jb`](/api/new-jobs#job-board-jobs) | 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](/documentation/supported-ats-sources).

New ATS platforms are added regularly. Keep an eye on our [changelog](/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 `linkedin` listings are re-checked for expiration and surfaced via [`/expired-jb`](/api/expired-jobs#expired-job-board-jobs). `wellfound` and `ycombinator` listings 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](/documentation/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](/documentation/recommended-strategy#backfill) 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`](/api/ats-organizations#advanced-organization-details) - 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](/documentation/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](#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`:

```
request 1: limit=1000&offset=0
request 2: limit=1000&offset=1000
request 3: limit=1000&offset=2000
...
```

For `6m`, use **cursor pagination** instead. Offset becomes inefficient at deep pages on very large feeds:

```
request 1: limit=200&cursor=1
request 2: limit=200&cursor=<last id from request 1>
request 3: limit=200&cursor=<last id from request 2>
...
```

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](/documentation/recommended-strategy#pagination) 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 hour
- `24h` → poll once per day in the same hour

See [Plans, Limits & Upgrades](/documentation/credit-usage) for quota details, overage pricing, and how to track usage via response headers.

## All parameters

Every query parameter accepted by [`active-ats`](/api/new-jobs#ats-jobs) and [`active-jb`](/api/new-jobs#job-board-jobs). 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`](#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`](/api/ats-organizations#advanced-organization-details). `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](/documentation/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](/documentation/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](/documentation/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](https://fantastic.jobs/article/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. |
