{
  "id": 2168392,
  "title": "How to pull every open job from Greenhouse, Lever, Ashby and SmartRecruiters with public APIs (and monitor changes)",
  "url": "https://urgent.news/2026/08/20/how-to-pull-every-open-job-from-greenhouse-lever-ashby-and",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-08-20T15:56:55.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/primeflowio/how-to-pull-every-open-job-from-greenhouse-lever-ashby-and-smartrecruiters-with-public-apis-and-55l5"
  },
  "original_language": "en",
  "account": "In the world of job postings, there is a wealth of unexploited data that can be found on the internet. Recruiters utilize these postings to identify placement opportunities, B2B teams interpret them as indicators of investment, and job seekers prefer to apply promptly rather than waiting for the postings to reach aggregators. The common practice is to scrape career pages, but this approach is discouraged. Most tech companies host their career pages on a select few Applicant Tracking Systems (ATS), and these four major systems - Greenhouse, Lever, Ashby, and SmartRecruiters - all provide public, documented JSON APIs. No authentication or proxies are required, and the career page itself loads the same JSON as the one you will fetch.\n\nIn this tutorial, a Python tool will be created to accomplish the following tasks: fetching open job listings from any of the four ATS, automatically identifying the ATS used by a company, normalizing all data into a single consistent schema, and monitoring changes in job postings. The tool can be executed on a schedule and will only retrieve new, removed, or modified postings.\n\nThe four APIs for the ATS are as follows:\n- Greenhouse: GET https://boards-api.greenhouse.io/v1/boards/{slug}/jobs?content=true\n- Lever: GET https://api.lever.co/v0/postings/{slug}?mode=json\n- Ashby: GET https://api.ashbyhq.com/posting-api/job-board/{slug}\n- SmartRecruiters: GET https://api.smartrecruiters.com/v1/companies/{slug}/postings (paginated)\n\nTo fetch these job postings, the {slug} is the unique identifier for the company that appears in the career-page URLs. For example, boards.greenhouse.io/stripe becomes \"stripe\", jobs.lever.co/spotify becomes \"spotify\", jobs.ashbyhq.com/linear becomes \"linear\", and careers.smartrecruiters.com/Visa becomes \"Visa\". It's important to note that no API key is necessary for any of these APIs.\n\nThe tutorial outlines the steps for fetching data from each ATS, including the normalized JSON structure for each job posting. The process begins with defining the User-Agent header for each API call, which includes the identifier \"ats-jobs-tutorial/1.0\". This header is crucial for proper API interaction.\n\nNext, a function is defined to fetch JSON data from the APIs. This function takes a URL and optional parameters, sends a GET request using the requests library, sets the User-Agent header, and returns the parsed JSON data. Proper error handling is also included to ensure the request was successful.\n\nFour separate functions are then created to fetch job postings from each ATS. These functions differ slightly due to the varying JSON structures returned by each API. They each make a GET request to the appropriate API endpoint, replace the {slug} placeholder with the company identifier, and parse the returned JSON data. For each job listing, the essential information such as job ID, title, location, URL, and publication date is extracted and organized into a Python dictionary.\n\nFinally, the tutorial concludes by emphasizing the importance of using these public APIs to access a valuable source of job data, and how this tutorial provides a step-by-step guide to building a Python tool that can efficiently leverage this data for various purposes.",
  "summary": "Job postings are one of the most underrated public data sources on the internet. Recruiters use them to spot placement opportunities, B2B teams read them as buying signals (a new Head of Data means data-tooling budget), and job seekers want to apply on day one — not when a posting finally reaches the aggregators. The usual instinct is to scrape career pages. Don't. Most tech companies host their…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}