I checked 37,000 career portals for India jobs. Only 2,354 had any.

I run careerscan.in, a free job board for India. It lists 382,000+ jobs right now, and every one of them comes straight from the employer's own career page, with no middlemen, no reposts, and no fees for jobseekers. I built it for $0, with no paid tools and no credit card.

Building the board was the easy part. The surprise was how little of the internet actually has India jobs on it.

Where we started

Most companies do not type their jobs into a job board. They enter each role once into an applicant tracking system, and that system publishes a public career page. Greenhouse, Lever, Ashby, Workday, Zoho Recruit, and the rest all expose those pages, and most of them serve the job list as JSON with no key, no login, and no headless browser.

So I collected every company career page I could find. Two lists made up the pile: 61,817 boards from one list, plus 46,078 new ones from a public dataset of ATS career page URLs. That is about 108,000 boards in total.

The plan was simple. Check each board for India jobs, keep the ones that have them, and wire those into the scraper.

The 6% finding

We have checked about 37,000 boards so far. Only 2,354 of them have any India jobs at all. That is about 6%.

Those 2,354 boards hold 42,317 India jobs between them. The rest are dead boards, US-only boards, or boards with zero India openings.

If you start from a big list, expect most of it to be noise. The filtering step is the real work. I spent far more time deciding which boards count than I spent fetching jobs from the ones that do.

The ATS breakdown

The scraper now covers 16,920 boards. Here is how they split by platform:

ATS Boards in the scraper
Greenhouse 4,331
Ashby 3,871
SmartRecruiters 2,360
Lever 1,992
Workday 1,308
Keka 735
Recruitee 726
Pinpoint 467
Workable 344
Zoho Recruit 251
BambooHR 89
iCIMS 41
Jobvite 32
Breezy 21
Freshteam 18
UKG / Ultipro 13
Darwinbox 5
Oracle HCM 5
Eightfold 2
Other / standalone 309
Total 16,920

Greenhouse and Ashby lead the list; that is the mix in my pile. Keka and Zoho Recruit show up because of the India focus. Workday is the one that took the most work to crack, and it is worth its own section below.

The endpoints

Every platform below serves its job list from a public endpoint. These are the ones I use in production, verified against live boards:

Platform Endpoint
Greenhouse GET boards-api.greenhouse.io/v1/boards/{slug}/jobs?content=true
Lever GET api.lever.co/v0/postings/{slug}?mode=json
Ashby GET api.ashbyhq.com/posting-api/job-board/{slug}?includeCompensation=true
Workable GET apply.workable.com/api/v1/widget/accounts/{slug}?details=true
SmartRecruiters GET api.smartrecruiters.com/v1/companies/{id}/postings
Recruitee GET {slug}.recruitee.com/api/offers/
BambooHR GET {board}.bamboohr.com/careers/list
Zoho Recruit {board}.zohorecruit.com/jobs/Careers (embedded list)
Breezy {board}.breezy.hr/ (HTML only, no JSON API)
Keka GET {board}.keka.com/careers/api/embedjobs/default/active/{company_uuid}
Pinpoint GET {board}.pinpointhq.com/postings.json
Workday POST {tenant}.wdN.myworkdayjobs.com/wday/cxs/{tenant}/{site}/jobs

The {slug} is whatever the company typed when it set up the account, not always the company name. The fastest way to find it is to open the company's career page and look at where the jobs come from. For Keka, the company UUID sits in the careers page HTML.

The gotchas

Workday cost me the most time. Its jobs endpoint is a POST, it returns 20 jobs per page, and any limit over 20 comes back as a 400 error. I found that out by sending limit 50 and watching it fail.

POST /wday/cxs/{tenant}/{site}/jobs {"appliedFacets": {}, "limit": 20, "offset": 0, "searchText": ""} 

Pagination has to use limit 20, and you need the India facet filter or you will count the whole global headcount by mistake. Accenture alone reports 2,000 jobs globally.

SmartRecruiters undercounts on page one. The first page of results can show a single India job for a company that actually has dozens. The total lives in the totalFound field when you filter by country, so ask for country=in and read that number. Veolia went from 2 to 71 once I did that. Intuitive went from 1 to 56.

Counting India jobs by searching for the word "India" in the location does not work. Job listings in South Bend, Indiana get counted. So do jobs in Punjab, Pakistan. I count by country code or by Indian city and state names now. One batch counted 41 jobs in Salem, Oregon, New Hampshire, and Arkansas as India jobs, and 5 more in Punjab, Pakistan. Those two traps added 46 false jobs before I caught them.

Demo boards pollute the counts too. One Keka board called "csdemo" listed 602 India jobs that turned out to be test postings, with departments named "abc" and "123 c". I exclude demo and test boards before I count anything.

Breezy and iCIMS have no public JSON feed. Breezy serves plain HTML, and iCIMS serves a plain HTML list at /jobs/search?ss=1. They still work, they just need parsing instead of a JSON call.

Being polite

Each board gets fetched in rotation, not hammered in a loop. When Workable rate-limited us through Cloudflare, we backed off to two workers instead of pushing through. These are the vendors' own public career pages, and the jobs are what they publish for anyone to see.

What the board is today

careerscan.in lists 382,000+ jobs, India only, all pulled from employers' own career pages. Jobseekers apply on the employer's own site, so there is nothing in between. It runs on free tiers and one small Oracle box, and the whole thing cost $0 to build.

The pile is still growing. The remaining boards from the 108,000 are still being checked, and the verified count will move as they finish.

If you build something like this, build the filter first. Most of what you find will be noise, and the noise is what eats your time.

What ATS should I add next? The board is at https://careerscan.in