Developer guide
Getting started
Choose how you access the feed directory, then fetch job postings from each ATS. There are three ways:
- Snapshot download — manual catalog download on-demand
- API (PRO plan) — backfill the catalog into your local database with incremental sync
- API (ULTRA plan) — live catalog queries, no need to store feeds in your local database
Evaluating the API? Subscribe to the free BASIC plan to explore the catalog before spending any money.
Step 1
Backfill your local catalog
A feed is an API endpoint for a company's job board on an ATS. Our catalog includes account slug, feed URL, platform, and lifecycle metadata. It is not a job posting and not a normalized job record.
The PRO plan is built for production job boards that mirror the catalog locally. Store feeds in your database and work from that copy when fetching jobs and scheduling syncs.
Subscribe to PRO on RapidAPI, then call GET /active-feeds without a since parameter. Paginate with next_cursor until the response has no next page — that gives you a full catalog backfill in your database.
curl --request GET \
--url 'https://ats-job-feed-directory.p.rapidapi.com/active-feeds' \
--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
--header 'X-RapidAPI-Host: ats-job-feed-directory.p.rapidapi.com'{
"feeds": [
{
"id": "00000000-0000-4000-8000-000000000001",
"ats": "greenhouse",
"account": "example-co",
"feed_url": "https://boards-api.greenhouse.io/v1/boards/example-co/jobs",
"available_since": "2026-01-15T08:00:00Z",
"company_name": "Example Co",
"job_count": 42
},
{
"id": "00000000-0000-4000-8000-000000000002",
"ats": "lever",
"account": "example-co",
"feed_url": "https://api.lever.co/v0/postings/example-co",
"available_since": "2026-02-01T10:00:00Z",
"company_name": "Example Co",
"job_count": 27
}
],
"next_cursor": "eyJhdmFpbGFibGVfc2luY2UiOiIyMDI2LTAyLTAxVDEwOjAwOjAwWiIsImlkIj..."
}Omit limit to receive your plan's maximum page size per request (500 on PRO). Each HTTP call counts as one request on RapidAPI.
curl --request GET \
--url 'https://ats-job-feed-directory.p.rapidapi.com/active-feeds?cursor=eyJhdmFpbGFibGVfc2luY2UiOiIyMDI2LTAyLTAxVDEwOjAwOjAwWiIsImlkIj...' \
--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
--header 'X-RapidAPI-Host: ats-job-feed-directory.p.rapidapi.com'API subscription links are on Get the catalog.
Step 2
Fetch jobs from ATS feeds
Job data lives on each company's ATS, not in the ATS Feeds catalog. For each feed in your workflow, HTTP GET the feed_url and parse the response into your job store.
Response shape is platform-specific. Greenhouse, Lever, Ashby, and others each expose their own JSON. Plan one fetch worker and one parser per ATS you support.
curl "https://boards-api.greenhouse.io/v1/boards/example-co/jobs"ATS Feeds does not normalize or enrich postings. You own storage, deduplication, search indexing, and refresh scheduling for the jobs you pull.
Public API patterns, cURL examples, and integration notes for each platform are on the ATS platform pages.
Step 3
Keep feeds in sync
Companies launch and retire job boards over time. Your local feed catalog needs to reflect new boards and drop retired ones — on whatever cadence fits your product.
Poll on your own schedule. Request GET /active-feeds?since=<watermark> to pick up feeds that appeared since your last sync, and GET /retired-feeds?since=<watermark> to learn which boards to remove.
curl --request GET \
--url 'https://ats-job-feed-directory.p.rapidapi.com/active-feeds?since=2026-03-01T00:00:00Z' \
--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
--header 'X-RapidAPI-Host: ats-job-feed-directory.p.rapidapi.com'{
"feeds": [
{
"id": "00000000-0000-4000-8000-000000000003",
"ats": "ashby",
"account": "example-co",
"feed_url": "https://api.ashbyhq.com/posting-api/job-board/example-co",
"available_since": "2026-03-10T14:30:00Z",
"company_name": "Example Co",
"job_count": 18
}
],
"next_cursor": "eyJhdmFpbGFibGVfc2luY2UiOiIyMDI2..."
}We discover and retire feeds daily on our side. You choose how often to call the API — hourly, nightly, or on demand. Advance your watermark after each successful sync.
curl --request GET \
--url 'https://ats-job-feed-directory.p.rapidapi.com/retired-feeds?since=2026-03-01T00:00:00Z' \
--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
--header 'X-RapidAPI-Host: ats-job-feed-directory.p.rapidapi.com'{
"feeds": [
{
"id": "00000000-0000-4000-8000-000000000099",
"retired_at": "2026-03-12T09:15:00Z"
},
{
"id": "00000000-0000-4000-8000-000000000098",
"retired_at": "2026-03-11T16:45:00Z"
}
],
"next_cursor": "eyJyZXRpcmVkX2F0IjoiMjAyNi0w..."
}Subscribe on Get the catalog or the RapidAPI listing linked there.
For authentication, query parameters, and worked examples, see the RapidAPI API docs.