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.

bash
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.

WhenCallThen
Hourly, :05/v1/active-ats?time_frame=1hInsert new jobs.
Hourly, :05/v1/expired-ats?time_frame=1hDelete expired ids.
Daily, 01:05 UTC/v1/modified-atsReplace 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.

Replay 03:00–05:00 UTC on October 12
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_format omitted) if you only list titles, and fetch one job's details later with Get a job.
  • Store id as a 64-bit integer. Ids never change and are never reused.