# Modified Jobs

`modified-ats` is the companion endpoint to [`active-ats`](/api/new-jobs#ats-jobs) that lets you keep an existing copy of the dataset in sync without re-fetching the full feed. Requires a Pro plan.

- **ATS only.** There is no `modified-jb` - LinkedIn and the other job-board sources are not re-checked for field-level modifications.
- Contains every ATS job whose tracked fields (title, description, location, salary, apply URL, …) changed in the last 24 hours.
- Typically returns between 100,000 and 150,000 jobs per day.

## How to call it

We recommend calling `modified-ats` **once per day at the same time**. As long as you stick to a fixed cadence you will never receive duplicate modifications between runs. Pagination is identical to `active-ats` - use `limit` + `offset` and keep going until the API returns fewer rows than `limit`. `cursor` is also available if you prefer it, but note the ordering caveat below.

## Two extra response fields

In addition to the full `ActiveAtsJob` shape, every row also includes:

- **`date_modified`** - the UTC timestamp when we detected the change. Default sort order is `date_modified` descending. **Caveat:** if you paginate with `cursor` instead of `offset`, results are ordered by `id` ascending instead.
- **`modified_fields`** - a string array listing exactly which fields changed (e.g. `["title", "ai_salary_min_value"]`). Use this to apply targeted updates instead of overwriting whole rows.

## Posted-date modifications

Some ATS bump the job's `date_posted` very frequently to keep it looking "fresh". To avoid drowning your sync in cosmetic changes, we only treat a posted-date change as a modification if the new `date_posted` is older than 14 or 30 days (depending on the ATS). Modifications to other fields are always reported.

See [Recommended Strategy](/documentation/recommended-strategy#modified-jobs) for how `modified-ats` fits into the broader sync workflow.
