Слогер Создать блог
Карьера

Как отслеживать найм в 4400+ компаниях через Greenhouse Job Board API

Публичный API Greenhouse отдаёт живые вакансии в JSON без ключа и логина, но по одной доске за вызов. Разбираем, что он возвращает, где ломается ручной сбор и как из этого сделать регулярный датасет.

Greenhouse — это ATS, на котором держатся карьерные страницы тысяч компаний: Stripe, Airbnb, GitLab, Anthropic. Каждая открытая вакансия живёт на публичной доске вида boards.greenhouse.io/…, и это едва ли не самый честный сигнал о том, что в компании происходит прямо сейчас. Отдел продаж читает по найму готовность покупать, рекрутер получает список целей, аналитик — картину по зарплатам.

Загвоздка в том, что API у Greenhouse есть, а удобного способа забрать вакансии сразу по всем компаниям — нет. Ниже: что доступно из коробки, где ручной сбор разваливается и как выглядит конвейер, который не надо чинить каждую неделю.

Два API Greenhouse, и нужен вам второй

Интерфейсов два. Harvest — приватный, для работодателей: без ключа к компании, где вы не работаете, туда не попасть. Job Board — публичный и только для чтения, задокументирован для интеграторов, которые строят сценарии отклика на вакансии.

КритерийHarvest APIJob Board API
Доступключ работодателяпубличный, ключ не нужен
Режимчтение и записьтолько чтение
За один вызовданные компании-владельца ключаодна доска
Список всех досокне публикуется
Документациядля работодателейdevelopers.greenhouse.io/job-board.html

Ограничения Job Board API простые и неприятные: один вызов — одна доска, токен доски надо знать заранее, а перечня всех досок Greenhouse не публикует вообще. Для одной компании и одного раза этого хватает. Для вопроса «кто в моей нише сейчас набирает людей» — нет.

Что приходит в ответе

Строка на каждую открытую вакансию, структурированный JSON. Поля такие:

ПолеПримерЧто рядом
titleAccount Executive - ItalycompanyName, boardToken, id, url
locationRemote, ItalyisRemote, departments, offices
dateUpdated2026-08-03T16:43:10-04:00метка работодателя, есть и datePublished
salaryDerivedmin 71400, max 126000, currency EURразобранный диапазон, с period; salaryRaw — дословный текст вакансии

Про зарплату отдельно. salaryRaw — это фраза из текста вакансии как есть, salaryDerived — уже разобранные min, max, currency и period. Именно здесь чаще всего отваливаются самодельные парсеры: регулярка, заточенная под доллары, молча пропускает вакансии в евро.

Ручной путь: работает, пока компаний три

Схема элементарная: скрипт дёргает публичный эндпоинт по токену доски и сравнивает ответ со вчерашним файлом. На трёх компаниях — вполне. На тридцати выясняется, что токен доски не совпадает с названием компании, и начинается чтение исходников страницы. Описания приходят HTML-ом, зарплата спрятана внутри предложения, диффам нужна база, а не json-файл. И главное: эндпоинта «все компании на Greenhouse» не существует.

Ничего сложного ни в одном из шагов. Всё вместе — обслуживание. А хотелось датасет.

Кому это нужно

  • Продажи и GTM. Найм читается как сигнал покупки: если у компании разом открылись роли в отделе продаж, у неё, скорее всего, появился бюджет и новая нагрузка на процессы.
  • Рекрутеры. Один запрос — все открытые роли по списку целевых компаний, с локациями и вилками.
  • Аналитики рынка труда: скорость появления вакансий, прозрачность зарплат, переезд ролей в другие локации.
  • LLM-агенты. Живые вакансии с Markdown-описанием — готовый контекст для модели.

Как собрать конвейер

Дальше конкретика. Готовый актор для Job Board API на Apify закрывает пробелы публичного интерфейса: внутри справочник из 4400+ проверенных досок, парсер зарплат и фильтры, которые отрабатывают до начисления за строки. Мёртвые доски не тарифицируются.

  1. Соберите список досок. Либо свои токены и URL-ы, либо сплошной проход по встроенному справочнику: discoveryQuery ищет по названиям компаний, maxCompanies ограничивает размах. Режим companiesOnly отдаёт по строке на компанию — boardToken, boardUrl и актуальный jobCount. Это первый запуск, когда надо понять, кто тихо наращивает штат в вашей нише.
  2. Сузьте выборку. titleKeywords режет по словам в заголовке, maxJobs ставит потолок.
  3. Решите, что делать со временем. updatedAfter со значением вида 25h на ежедневном расписании отдаёт только то, что изменилось со вчера, без списка уже виденного. publishedAfter оставляет лишь новые роли.
  4. Забирайте вилки. Опубликованные диапазоны идут дословно в salaryRaw, разобранные — в salaryDerived.
  5. Поставьте на расписание. Один запуск — снимок, серия запусков — временной ряд: по нему видно, как компания открывает двенадцать инженерных ролей задолго до любого пресс-релиза.

Нужен дешёвый индекс — режим urlsOnly вернёт только id, заголовок, компанию, ссылку и метки времени. Из Python это вызов актора через apify-client: в run_input уходят companies, titleKeywords и maxJobs, а из датасета берутся строки, у которых resultType равен job. Каждая несёт title, companyName, location, dateUpdated, salaryDerived и url. Через REST (api.apify.com/v2/acts/…) или в консоли — то же самое, просто другим способом.

Ключ Harvest, логин и подписка для чтения публичных досок не нужны: предустановленный запуск открывает доску Stripe с включённым Markdown и лимитом в 100 вакансий.

Вакансии как инструмент для LLM

Актор отдаётся по MCP, и Claude, Claude Code, Cursor и ChatGPT получают инструмент greenhouse-job-board-api, который отвечает на вопрос «кто из этих двадцати компаний открыл sales-роли за неделю» живыми данными, а не памятью модели. Адрес сервера: mcp.apify.com/?tools=actors,docs,johnvc/greenhouse-job-board-api — в Claude Code он добавляется командой claude mcp add --transport http apify. Описания вакансий приходят в Markdown по умолчанию, так что вычищать HTML перед подачей в модель не надо.

Где обычно спотыкаются

  • Ждут единого эндпоинта по всем компаниям. Его нет — есть справочник досок и цикл по токенам.
  • Путают токен доски с доменом компании. Совпадает редко.
  • Парсят зарплату регуляркой по долларам и теряют вакансии в евро.
  • Считают, что одного запуска достаточно. Снимок говорит «столько-то вакансий», серия — «вот здесь стало на двенадцать больше».

Публичный Job Board API Greenhouse — это не про «скачать все вакансии мира». Это один вызов на одну доску, зато с живыми данными, зарплатами и метками времени работодателя. Если компаний меньше пяти, хватит скрипта и терпения. Если нужен регулярный поток по сотням и тысячам досок, справочник, фильтры по времени и парсинг вилок придётся собрать самому — или взять готовый конвейер и потратить время на разбор данных вместо поддержки парсера.

По материалам: career. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (0)

Войдите, чтобы комментировать.

Пока нет комментариев. Будьте первым.