Dev.to WebDev 🛠 Dev 👁 0 📖 3 min read

A no-auth, no-key API for live job data from the world's biggest ATS (Greenhouse)

Most job-market data either costs money (paid APIs) or means scraping HTML that breaks on every redesign. There is a third option I keep underusing: a public, no-auth, no-key JSON endpoint behind the ATS that powers a hu

Most job-market data either costs money (paid APIs) or means scraping HTML that breaks on every redesign. There is a third option I keep underusing: a public, no-auth, no-key JSON endpoint behind the ATS that powers a huge chunk of big-company careers pages — Greenhouse.

Greenhouse is the applicant-tracking system behind Airbnb, Stripe, Anthropic, Databricks, Vercel, and hundreds of other companies. Each company's Greenhouse board exposes a plain JSON job list at a single URL, no sign-in, no API key, no rate-limit wall:

https://boards.greenhouse.io/v1/boards/{company}/jobs

That one endpoint is enough to pull structured, live job data for an entire company. I verified it this week with zero auth:

airbnb      -> 162 jobs
stripe      -> 727 jobs
anthropic   -> 648 jobs
databricks  -> 893 jobs
vercel      -> 90 jobs

Each job is a clean object — no HTML to parse:

{
  "title": "Account Manager",
  "company_name": "Airbnb",
  "location": { "name": "London, United Kingdom" },
  "updated_at": "2026-09-29T20:00:54-04:00",
  "first_published": "2026-09-20T...",
  "application_deadline": null,
  "absolute_url": "https://careers.airbnb.com/positions/8184174?gh_jid=8184174",
  "internal_job_id": 8184174
}

A 15-line keyless job feed

The whole thing is stdlib urllib — no requests, no BeautifulSoup, no API key:

import json, urllib.request

def greenhouse_jobs(company, limit=20):
    url = f"https://boards.greenhouse.io/v1/boards/{company}/jobs"
    req = urllib.request.Request(url, headers={"User-Agent": "your-agent/1.0"})
    with urllib.request.urlopen(req, timeout=30) as r:
        data = json.load(r)
    out = []
    for j in data["jobs"][:limit]:
        out.append({
            "title": j["title"],
            "company": j.get("company_name"),
            "location": (j.get("location") or {}).get("name"),
            "updated_at": j.get("updated_at"),
            "url": j.get("absolute_url"),
        })
    return out

for c in ["stripe", "databricks", "anthropic", "vercel"]:
    rows = greenhouse_jobs(c, limit=5)
    print(f"\n## {c} ({len(rows)} of many)")
    for r in rows:
        print(f"  {r['title']} — {r['location']} — {r['url']}")

That's it. Point it at a company slug and you get live, structured postings.

What this unlocks

  • A free job dataset by company — no scraping, no paid API, no HTML fragility.
  • Freshness signals — updated_at and first_published let you tell stale postings from live ones, which most board scrapers can't.
  • A clean link back to the real posting via absolute_url (the real careers page), so you can alert without dead links.

Honest caveats (so you don't get burned)

  1. The base list endpoint has no salary field. I checked stripe and airbnb — salary is not populated in the list response. If you need comp data, that's a different source.
  2. Not every company uses Greenhouse. The slug must be a Greenhouse host (careers.airbnb.com is Greenhouse; some big brands use Lever, Workable, or Ashby instead). If a board 404s, the company is on a different ATS.
  3. It's an undocumented public endpoint. It can change shape or get gated. Treat it like any third-party API: monitor it. I built a small zero-dependency CI guardrail (jobfeed-watchdog) precisely so a silent schema change or outage turns my CI red instead of quietly serving stale data.

Why I'm writing this

I built the Remote Jobs API — a free, keyless REST API that normalizes 16 job sources (including Greenhouse's ~164,000 listings) into one schema — so I don't have to scrape each board separately. Greenhouse is by far the single largest source in it. I'm sharing the raw endpoint here because it's genuinely useful on its own, even if you never want the aggregator.

If you're building a job tracker, an ATS integration, or just want clean company-level posting data without an API bill, this one URL is worth bookmarking.

No API key. No account. Stdlib only. If your endpoint is Greenhouse, you already have this.

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.