Developer guide
Getting started
Choose how you access the feed catalog, then fetch job postings from each ATS. There are two ways:
- Snapshot download — manual catalog download on-demand
- API — full catalog access via REST API; mirror feeds locally or query at runtime
Evaluating the API? Subscribe to the free BASIC plan to explore the catalog before spending any money.
Step 1
Access the catalog via API
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.
Subscribe on RapidAPI and call the catalog API when you need feed URLs and account slugs. Mirror the catalog in your own database, or query at runtime without a local copy — you choose the integration pattern.
For a full catalog download, call GET /active-feeds without a since parameter. Paginate with next_cursor until the response has no next page.
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 (up to 1,000 feeds on the paid plan). 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'For live lookups, omit since on GET /active-feeds and narrow results with ats, job_count_gte, job_count_lte, and pagination. When you already hold a feed id, GET /active-feeds/{feedId} returns that single catalog row.
curl --request GET \
--url 'https://ats-job-feed-directory.p.rapidapi.com/active-feeds?ats=greenhouse&job_count_gte=5' \
--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
--header 'X-RapidAPI-Host: ats-job-feed-directory.p.rapidapi.com'curl --request GET \
--url 'https://ats-job-feed-directory.p.rapidapi.com/active-feeds/00000000-0000-4000-8000-000000000001' \
--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
--header 'X-RapidAPI-Host: ats-job-feed-directory.p.rapidapi.com'{
"id": "00000000-0000-4000-8000-000000000001",
"ats": "greenhouse",
"account": "example-co",
"feed_url": "https://boards.example.com/example-co",
"available_since": "2026-01-15T08:00:00Z",
"company_name": "Example Co",
"job_count": 42
}API subscription links are on the Pricing.
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
If you mirror the catalog locally, companies launching and retiring job boards over time means your 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. If you query at runtime instead, re-fetch when you need an up-to-date feed list.
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 the Pricing or the RapidAPI listing linked there.
For authentication, query parameters, and worked examples, see the RapidAPI API docs.