跳到正文
DEV Community· Nidhi·· 3 小時前AI 評分55

India Tech Jobs Scraper 與 AI & Startup Jobs Scraper 如何各以一次 API 呼叫取得職位資料

Pull Indian tech and AI-startup job data from employer career pages, in one API call

AI 導讀

作者 Nidhi 建立並介紹兩款 Apify actor,讓用戶各以一次 API 呼叫,從 ATS 廠商提供的公開 JSON 職位資料流擷取印度科技及 AI 新創職位。

正文

If you build a job board, run recruiting outreach or track hiring as a market signal, sooner or later you need the same thing: a clean, structured list of open roles. The usual approach is to scrape LinkedIn or Naukri, and that means logins, proxies, CAPTCHAs and reposted listings.

There is a simpler source. Most product companies host their careers page on an applicant tracking system (ATS) such as Greenhouse, Lever, Ashby or SmartRecruiters. Those vendors publish public JSON job-board feeds, so that companies can embed their openings on any site. No login is required.

I built two Apify actors on top of those feeds:

This post shows how to call them, what you get back, what it costs and where they fall short.

What each actor covers

India Tech Jobs Scraper has a built-in directory of 57 employers that hire in India. The Store page lists names such as Stripe, Databricks, Okta, MongoDB, Zscaler, Swiggy, CRED, Meesho, Freshworks, Groww, Sarvam AI and InMobi. Every job is tagged isIndia and indiaCity, and the actor normalises spellings like Bangalore/Bengaluru and Gurgaon/Gurugram. In my test run on 27 Oct 2026 it returned 1,431 live India jobs from 61 company boards in 51 seconds.

AI & Startup Jobs Scraper has a directory of 144 companies, each tagged by sector: ai, fintech, devtools, security, crypto, health, autonomy_space_defense and consumer_gaming. It includes OpenAI, Anthropic, Perplexity, ElevenLabs, Cursor (Anysphere), Stripe, Databricks and SpaceX. A full run on 27 Oct 2026 returned 23,192 jobs from 144 boards (Greenhouse 16,881, Ashby 5,506, Lever 805), and 4,303 of them were remote.

Both actors also accept any other company that runs on one of the four supported ATSs. You can pass a careers URL (https://jobs.lever.co/meesho), an ats:slug pair (greenhouse:stripe) or a bare slug.

Example 1: data and ML roles in Bengaluru, posted this week

This input uses fields from the India actor's input schema:

{
  "useIndiaDirectory": true,
  "companies": ["https://jobs.lever.co/meesho", "greenhouse:stripe"],
  "indiaOnly": true,
  "includeGlobalRemote": false,
  "cities": ["Bengaluru", "Bangalore"],
  "keywords": ["data", "machine learning"],
  "excludeKeywords": ["intern"],
  "remoteOnly": false,
  "postedWithinDays": 7,
  "includeDescription": false,
  "maxItems": 500
}

Here is what the fields do:

  • keywords and excludeKeywords match against the title, department and team.
  • postedWithinDays uses the date each board publishes or updates.
  • maxItems caps the run. You pay only for jobs returned, so this is also your cost ceiling.
  • Set indiaOnly: false to get every location from the boards.

Example 2: AI-lab engineering roles in San Francisco or remote

This input uses fields from the AI & Startup actor's schema:

{
  "useDirectory": true,
  "sectors": ["ai"],
  "companies": [],
  "locations": ["San Francisco", "Remote"],
  "keywords": ["engineer"],
  "excludeKeywords": ["intern", "manager"],
  "remoteOnly": false,
  "postedWithinDays": 14,
  "includeDescription": false,
  "maxItems": 2000
}

If you leave sectors empty, the actor scans all 144 directory companies. locations keeps any job whose location string contains one of your values, such as "London", "United States" or "India".

Calling it from Python

pip install apify-client   # snippet follows the Python example on the actor's Store page
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run_input = {
    "useDirectory": True,
    "sectors": ["ai"],
    "locations": ["San Francisco", "Remote"],
    "keywords": ["engineer"],
    "postedWithinDays": 14,
    "maxItems": 2000,
}

run = client.actor("prospect_antechamber/ai-startup-jobs-scraper").call(run_input=run_input)

for job in client.dataset(run.default_dataset_id).iterate_items():
    print(job["company"], "|", job["title"], "|", job["location"], "|", job["jobUrl"])

To call the India actor instead, swap in prospect_antechamber/india-tech-jobs-scraper and its input. The same calls work from JavaScript (apify-client on npm), from the Apify CLI (apify call ... --output-dataset), or as a tool for an AI agent through the Apify MCP server (https://mcp.apify.com/?tools=prospect_antechamber/ai-startup-jobs-scraper).

What one row looks like

Both actors return the same flat schema, one row per job:

{
  "ats": "ashby",
  "companySlug": "atlan",
  "company": "Atlan",
  "jobId": "20fe5046-b287-40f6-990f-842ad75526e5",
  "title": "Staff Software Engineer - Infrastructure (AI Native)",
  "location": "India",
  "allLocations": ["India"],
  "department": "Engineering",
  "team": "Engineering",
  "employmentType": "FullTime",
  "workplaceType": "Remote",
  "postedAt": "2026-10-23T14:44:45.243000+00:00",
  "updatedAt": null,
  "jobUrl": "https://jobs.ashbyhq.com/atlan/20fe5046-b287-40f6-990f-842ad75526e5",
  "applyUrl": "https://jobs.ashbyhq.com/atlan/20fe5046-b287-40f6-990f-842ad75526e5/application",
  "salary": null,
  "descriptionText": null,
  "isIndia": true,
  "indiaCity": null,
  "isRemote": true,
  "scrapedAt": "2026-10-27T07:26:28.940092+00:00"
}

The AI & Startup actor adds a sectors array to each row. You can export results as JSON, CSV or Excel from the Apify console, or send them on to Google Sheets, Zapier, Make or a webhook.

A pattern that works: a daily "new roles" feed

  1. Schedule the actor once a day in Apify with postedWithinDays: 1.
  2. Upsert rows into your database, using ats + companySlug + jobId as the key.
  3. Mark rows that disappear from a later run as closed.

That gives you a fresh feed for a job board or newsletter. It also gives you a time series of hiring by company, team and city, which is useful for hiring-intent signals or for analyst work.

Pricing

Both actors use Apify's pay-per-event model:

  • $1.50 per 1,000 jobs returned ($0.0015 per job), plus Apify platform usage.
  • Filters are applied before charging, so jobs you filter out cost nothing.
  • For example, 500 jobs cost $0.75 plus usage. A full India directory scan of about 1,400 jobs is roughly $2.15 plus usage.
  • Set maxItems or an Apify spending limit to cap the cost.

Limitations

  • Four ATSs only. The actors cover Greenhouse, Lever, Ashby and SmartRecruiters. They do not cover LinkedIn, Naukri, Indeed, or companies that run their own careers system or Workday.
  • The directories are curated. They hold 57 and 144 companies, not "every company in India" or "every startup". Anything else has to go in companies.
  • Salary is often null. It appears only when the employer publishes it.
  • The data is only as clean as the board. Departments, teams and employment types are whatever each company enters. Some boards leave them empty.
  • Location matching is string-based. A job listed only as "Remote" with no country is dropped when indiaOnly is on, unless you set includeGlobalRemote.
  • Descriptions slow runs down. includeDescription makes SmartRecruiters boards slower in particular.
  • These are new actors. They have very few users so far and no Store ratings yet, so test on a small maxItems first.

Is it allowed?

The actors read only the public job-board endpoints that the ATS vendors provide for publishing jobs. They use no logins or cookies, and they don't collect candidate data. You are still responsible for how you use the data in your own jurisdiction, and for each source's terms.

If a company you need is missing from a directory, add its careers URL to companies, or tell me and I'll consider adding it.

Disclosure: I built and maintain both actors, and I earn the per-job fee above. (Nidhi, @RealNidhibhai, GitHub Nidhi-bhai)

來源:DEV Community · dev.to