Greenhouse — это ATS, на котором держатся карьерные страницы тысяч компаний: Stripe, Airbnb, GitLab, Anthropic. Каждая открытая вакансия живёт на публичной доске вида boards.greenhouse.io/…, и это едва ли не самый честный сигнал о том, что в компании происходит прямо сейчас. Отдел продаж читает по найму готовность покупать, рекрутер получает список целей, аналитик — картину по зарплатам.
Загвоздка в том, что API у Greenhouse есть, а удобного способа забрать вакансии сразу по всем компаниям — нет. Ниже: что доступно из коробки, где ручной сбор разваливается и как выглядит конвейер, который не надо чинить каждую неделю.
Два API Greenhouse, и нужен вам второй
Интерфейсов два. Harvest — приватный, для работодателей: без ключа к компании, где вы не работаете, туда не попасть. Job Board — публичный и только для чтения, задокументирован для интеграторов, которые строят сценарии отклика на вакансии.
| Критерий | Harvest API | Job Board API |
|---|---|---|
| Доступ | ключ работодателя | публичный, ключ не нужен |
| Режим | чтение и запись | только чтение |
| За один вызов | данные компании-владельца ключа | одна доска |
| Список всех досок | — | не публикуется |
| Документация | для работодателей | developers.greenhouse.io/job-board.html |
Ограничения Job Board API простые и неприятные: один вызов — одна доска, токен доски надо знать заранее, а перечня всех досок Greenhouse не публикует вообще. Для одной компании и одного раза этого хватает. Для вопроса «кто в моей нише сейчас набирает людей» — нет.
Что приходит в ответе
Строка на каждую открытую вакансию, структурированный JSON. Поля такие:
| Поле | Пример | Что рядом |
|---|---|---|
| title | Account Executive - Italy | companyName, boardToken, id, url |
| location | Remote, Italy | isRemote, departments, offices |
| dateUpdated | 2026-08-03T16:43:10-04:00 | метка работодателя, есть и datePublished |
| salaryDerived | min 71400, max 126000, currency EUR | разобранный диапазон, с period; salaryRaw — дословный текст вакансии |
Про зарплату отдельно. salaryRaw — это фраза из текста вакансии как есть, salaryDerived — уже разобранные min, max, currency и period. Именно здесь чаще всего отваливаются самодельные парсеры: регулярка, заточенная под доллары, молча пропускает вакансии в евро.
Ручной путь: работает, пока компаний три
Схема элементарная: скрипт дёргает публичный эндпоинт по токену доски и сравнивает ответ со вчерашним файлом. На трёх компаниях — вполне. На тридцати выясняется, что токен доски не совпадает с названием компании, и начинается чтение исходников страницы. Описания приходят HTML-ом, зарплата спрятана внутри предложения, диффам нужна база, а не json-файл. И главное: эндпоинта «все компании на Greenhouse» не существует.
Ничего сложного ни в одном из шагов. Всё вместе — обслуживание. А хотелось датасет.
Кому это нужно
- Продажи и GTM. Найм читается как сигнал покупки: если у компании разом открылись роли в отделе продаж, у неё, скорее всего, появился бюджет и новая нагрузка на процессы.
- Рекрутеры. Один запрос — все открытые роли по списку целевых компаний, с локациями и вилками.
- Аналитики рынка труда: скорость появления вакансий, прозрачность зарплат, переезд ролей в другие локации.
- LLM-агенты. Живые вакансии с Markdown-описанием — готовый контекст для модели.
Как собрать конвейер
Дальше конкретика. Готовый актор для Job Board API на Apify закрывает пробелы публичного интерфейса: внутри справочник из 4400+ проверенных досок, парсер зарплат и фильтры, которые отрабатывают до начисления за строки. Мёртвые доски не тарифицируются.
- Соберите список досок. Либо свои токены и URL-ы, либо сплошной проход по встроенному справочнику: discoveryQuery ищет по названиям компаний, maxCompanies ограничивает размах. Режим companiesOnly отдаёт по строке на компанию — boardToken, boardUrl и актуальный jobCount. Это первый запуск, когда надо понять, кто тихо наращивает штат в вашей нише.
- Сузьте выборку. titleKeywords режет по словам в заголовке, maxJobs ставит потолок.
- Решите, что делать со временем. updatedAfter со значением вида 25h на ежедневном расписании отдаёт только то, что изменилось со вчера, без списка уже виденного. publishedAfter оставляет лишь новые роли.
- Забирайте вилки. Опубликованные диапазоны идут дословно в salaryRaw, разобранные — в salaryDerived.
- Поставьте на расписание. Один запуск — снимок, серия запусков — временной ряд: по нему видно, как компания открывает двенадцать инженерных ролей задолго до любого пресс-релиза.
Нужен дешёвый индекс — режим 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 — это не про «скачать все вакансии мира». Это один вызов на одну доску, зато с живыми данными, зарплатами и метками времени работодателя. Если компаний меньше пяти, хватит скрипта и терпения. Если нужен регулярный поток по сотням и тысячам досок, справочник, фильтры по времени и парсинг вилок придётся собрать самому — или взять готовый конвейер и потратить время на разбор данных вместо поддержки парсера.
Комментарии (0)
Войдите, чтобы комментировать.
Пока нет комментариев. Будьте первым.