Career Site Job Feed

io.github.HwangByeongSeonv1.0.0更新於 Oct 11, 2026

Read job postings live from employer career sites across 10 applicant tracking systems.

概覽

AI 產生的概覽

從雇主招募網站讀取十多種申請人追蹤系統上的即時職缺,並以統一的資料列格式回傳。

功能
讓助理透過 Apify Actors 從 Greenhouse、Lever、Workday、Ashby、Workable、SmartRecruiters、Breezy、Personio、Recruitee、BambooHR、Pinpoint 與 Rippling 等平台的雇主招募頁面抓取開放職缺。結果會正規化為統一的資料列格式,包含 provider、company、title、location、remote 標記、張貼日期、應徵連結與薪資等欄位。README 也提供比較兩次執行之間公司職缺變化、擷取附薪資範圍的職缺、列出某公司所有開放職缺,以及只把新職缺附加到 CSV 的範例腳本。
適用情境
當助理需要來自公司招募頁面而非綜合求職網站的現有職缺,或需要比較多個申請人追蹤系統的招募狀況時使用。也適合長期追蹤一批公司新發布或已關閉的職缺。
執行需求
遠端 MCP 端點 mcp.apify.com,使用 streamable HTTP。需要 Apify API 權杖,透過 Authorization 標頭以 'Bearer ' 形式傳送。README 中的腳本使用 APIFY_TOKEN 環境變數。需要能連線至 Apify 以及各招募網站端點。
安裝前請注意
Authorization 標頭攜帶 Apify API 權杖,應視為機密。README 說明這些 Actors 依交付列數計費;腳本預設限制在數百列並讀取 MAX_ROWS,提高該上限會增加費用。職缺資料來自第三方招募網站,部分平台不提供張貼日期、職缺描述、薪資或遠端標記,結果可能不完整。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Career Site Job Feed,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "career-site-job-feed": {
      "type": "http",
      "url": "https://mcp.apify.com/?tools=starbright_overlap/ats-job-feed"
    }
  }
}

README

ATS job feed recipes

[AllMCPs Verified]

Working code for pulling job postings straight out of company applicant tracking systems — Greenhouse, Lever, Workday, Ashby, Workable, SmartRecruiters, Breezy, Personio, Recruitee, BambooHR, Pinpoint and Rippling — and doing something useful with them.

Which ATS API gives you what — salary, posting dates and remote flags across all twelve platforms, measured across 1,549,353 live postings. Nothing else publishes these numbers, so start there if you are choosing which platform to build on.

Every script here runs as-is. Set APIFY_TOKEN and go.

bash
export APIFY_TOKEN=...        # https://console.apify.com/settings/integrationspython python/new_jobs_to_csv.py

Why this exists

Each of these platforms publishes an open JSON endpoint that the company's own careers page reads — no key, no login, no scraping of rendered HTML. The awkward parts are everything around that:

  • Every platform has a different shape. Greenhouse nests offices and departments; Workday sends a POST and reports posting age as the string "Posted 30+ Days Ago"; SmartRecruiters caps a response at 100 rows whatever limit you pass; Breezy answers 403 for a board that does not exist, where everyone else uses 404.
  • Finding out who is on which platform is the actual work. There is no public directory of Greenhouse or Personio boards. The slug is in a careers URL somewhere, if you can find the careers URL.
  • Dates are unreliable. Three of these ten platforms publish no posting date at all, so any "posted in the last N days" filter has to decide what to do with rows whose age is unknown.

The scripts below use Apify Actors that have already dealt with all of that and return one row shape across every platform. You can equally point them at the raw endpoints — the notes at the bottom list them.

Recipes

FileWhat it does
javascript/watch-companies.mjsDiff a shortlist between runs — what opened, what closed
javascript/salary-data.mjsPostings that publish a pay range, normalised to an annual figure
python/one_company.pyEvery open role at one company, from its careers URL
python/new_jobs_to_csv.pyOnly postings that appeared since the last run, appended to CSV

These Actors bill per row delivered. Every script caps itself at a couple of hundred rows and reads MAX_ROWS if you want more, so running an example does not produce a surprise.

The row shape

Every recipe gets the same fields, whichever platform the job came from:

json
{  "provider": "greenhouse",  "company": "Databricks",  "companySlug": "databricks",  "jobId": "7845321",  "title": "Staff Software Engineer",  "location": "San Francisco, CA",  "department": "Engineering",  "employmentType": "Full-time",  "remote": false,  "postedAt": "2026-08-14T09:12:00.000Z",  "applyUrl": "https://boards.greenhouse.io/databricks/jobs/7845321",  "salary": null,  "descriptionText": "...",  "scrapedAt": "2026-08-19T11:02:41.883Z"}

companySlug:jobId is stable while a posting is open, which is what makes the diffing recipes work.

What each platform actually publishes

Measured from live boards, not from vendor documentation. Useful before you build on any one of them:

The same table, with the reasoning behind each column, is on the full reference page.

PlatformPosting dateDescriptionPayMarked remote
Workday78.2%nonono
SmartRecruitersyesnono7.7%
Greenhouseyesyesnono
Workableyesyesno36.3%
BambooHRnononono
Leveryes94.7%no4.8%
Breezy HRyesno45.7%15.7%
Personiononono8.8%
Ashbyyesyes38.9%54.2%
Recruiteeyesyes26.9%9.9%
Ripplingnonono17.4%
Pinpointnoyes42.5%8.8%

title, company, location and applyUrl come back on every row from every platform.

These are measured numbers, not a feature matrix. Each row is every live board this project tracks for that platform — between 17,000 and 179,000 postings per platform, measured 2026-08-20. yes means 99.5% or more; no means the endpoint carries no such field at all.

Three things the table is telling you:

  • Four platforms publish pay, and none of them fills it most of the time. Breezy and Pinpoint come closest at 45.7% and 42.5%. Breezy and Ashby give you prose ("$28 – $100 / hour", "$211.4K – $290.6K • Offers Equity"); Pinpoint and Recruitee give you separate minimum, maximum, currency and period. If you are benchmarking, use the latter two.
  • Half the platforms have no posting date. Personio, Rippling, Pinpoint and BambooHR publish none, and Workday dates only 78.2% of rows because it ships prose like "Posted 30+ Days Ago" rather than a timestamp. Any freshness filter has to decide whether to drop undated rows or keep them, and the honest default is to keep them.
  • "Remote" is a real field on five platforms and a guess on the rest. Ashby marks 54.2% of its postings remote, which says more about who uses Ashby than about the job market. Where the platform has no such field, the only option is matching the location string, which misses "Anywhere" and misfires on "Remote Support Engineer, London office".

Raw endpoints

If you would rather call the platforms directly, these are the public endpoints. All of them answer without a key. Replace {company} with the board slug.

PlatformEndpoint
Greenhousehttps://boards-api.greenhouse.io/v1/boards/{company}/jobs?content=true
Leverhttps://api.lever.co/v0/postings/{company}?mode=json
Ashbyhttps://api.ashbyhq.com/posting-api/job-board/{company}?includeCompensation=true
SmartRecruitershttps://api.smartrecruiters.com/v1/companies/{company}/postings?limit=100&offset=0
Workablehttps://apply.workable.com/api/v1/widget/accounts/{company}?details=true
Breezyhttps://{company}.breezy.hr/json
Personiohttps://{company}.jobs.personio.de/search.json
Pinpointhttps://{company}.pinpointhq.com/postings.json
Recruiteehttps://{company}.recruitee.com/api/offers/
BambooHRhttps://{company}.bamboohr.com/careers/list
Ripplinghttps://api.rippling.com/platform/api/ats/v1/board/{company}/jobs
WorkdayPOST https://{tenant}.{cluster}.myworkdayjobs.com/wday/cxs/{tenant}/{site}/jobs

Four things that will bite you if you write your own client:

  • SmartRecruiters returns at most 100 postings per response regardless of limit. Page with offset, and take the real total from totalFound rather than counting rows.
  • Recruitee keeps the salary object present with zeros when the employer skipped the field, so a naive reader ships "0 USD hour" as a pay range. Treat min <= 0 && max <= 0 as absent.
  • BambooHR splits its careers API in two. /careers/list has no posting date, description or compensation; those live on /careers/{id}/detail, one request per posting. And its isRemote field exists but is never populated — across 50,616 postings measured, not one had it set.
  • Breezy returns 403, not 404, for a subdomain with no board on it. Treating that as rate limiting and backing off turns a half-hour job into a fourteen-hour one.

Licence

MIT. The Actors these scripts call are commercial and priced per row; the code here is not.

來源:README.md,提交 f4f053c

工具

0
工具後設資料尚未被收錄。

版本歷史

1
  1. v1.0.0最新Sep 16, 2026