Recommended strategy
A complete plan for keeping your own database in step with the catalogue: one backfill, then three small scheduled jobs.
1. Backfill once
Load the current catalogue for your filters with time_frame=6m and cursor pagination. Check the size first with Count jobs.
curl --get "https://api.thejobsapi.com/v1/active-ats" -H "Authorization: Bearer $THEJOBSAPI_KEY" \
--data-urlencode 'time_frame=6m' --data-urlencode 'location=Canada' \
--data-urlencode 'limit=1000' --data-urlencode 'cursor=0' --data-urlencode 'description_format=html'Repeat with cursor set to the last id until a page is short. Note when you started: the hourly job below takes over from there.
2. New jobs every hour
A few minutes past each hour, fetch time_frame=1h with offset pagination and insert the jobs. Each run receives exactly the previous UTC hour, so nothing is skipped or repeated. If you prefer a daily run, use 24h in the same hour every day.
3. Remove expired jobs
Delete the ids from Expired jobs: time_frame=1h each hour, or 1d once a day after 00:00 UTC.
4. Apply modifications daily
Once a day at a fixed time, fetch Modified jobs and replace each stored job by id.
| When | Call | Then |
|---|---|---|
| Hourly, :05 | /v1/active-ats?time_frame=1h | Insert new jobs. |
| Hourly, :05 | /v1/expired-ats?time_frame=1h | Delete expired ids. |
| Daily, 01:05 UTC | /v1/modified-ats | Replace changed jobs. |
Recovering from an outage
If your scheduler misses runs, don't widen the time frame: replay exactly the missed window with date_created_gte and date_created_lt on time_frame=7d (or 6m for longer gaps), then catch up removals with expired-ats?time_frame=1m and changes with modified-ats and a date_modified_gte window.
curl --get "https://api.thejobsapi.com/v1/active-ats" -H "Authorization: Bearer $THEJOBSAPI_KEY" \
--data-urlencode 'time_frame=7d' \
--data-urlencode 'date_created_gte=2026-10-12T03:00:00Z' \
--data-urlencode 'date_created_lt=2026-10-12T05:00:00Z' \
--data-urlencode 'limit=1000' --data-urlencode 'offset=0'Need it fresher than hourly?
The changes feed is an ordered log of every created, updated, expired and excluded job, seconds behind collection. One checkpoint (next_since) replaces all three scheduled jobs, and a missed run simply resumes where it stopped. It is per country, so follow country=CA and country=US separately if you need both.Choosing filters
- Filter at the source (location, title, organization) rather than after downloading: you pay for every job returned.
- Leave descriptions out (
description_formatomitted) if you only list titles, and fetch one job's details later with Get a job. - Store
idas a 64-bit integer. Ids never change and are never reused.