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

Как выгрузить вакансии и зарплатные вилки из Greenhouse API: разбор подводных камней

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

Greenhouse — система, через которую компании публикуют вакансии. Побочный эффект: любая доска отдаётся наружу обычным JSON, без ключа, без регистрации и без постраничной выдачи. Доска SpaceX целиком — 2 832 вакансии — приезжает одним ответом. Замеры, о которых речь ниже, делались 27 октября 2026 года, между запросами пара секунд.

Это удобно, если нужен свой агрегатор, аналитика по рынку или просто список открытых позиций в компании, куда хочется попасть. И это же место, где легко получить мусор вместо данных: половина полей появляется только по флагу, а часть цифр означает не то, что кажется. Ниже — что выяснилось на живых досках.

Адрес один, токен — не название компании

Базовая ручка выглядит так:

curl -s "https://boards-api.greenhouse.io/v1/boards/spacex/jobs"

Подставляете токен доски — получаете список. Ошибка новичка в том, что токен кажется производным от имени. Проверка трёх вариантов подряд дала 404 для anduril, 200 для andurilindustries и 200 для xai. То есть у Anduril доска называется andurilindustries, а anduril не существует вовсе.

Разница между кодами ответа тут принципиальная. 404 — доски с таким токеном нет. 200 с пустым списком — доска есть, но сейчас ничего не открыто. Если код не проверять, оба случая сливаются в «данных не пришло», и вы будете чинить рабочий запрос вместо опечатки в токене.

Вилки зарплат спрятаны за флагом

В обычном ответе поля с зарплатой нет вообще. Добавляете ?pay_transparency=true — и у каждой вакансии появляется pay_input_ranges, в том же ответе. У Anduril вилка нашлась у 2 342 позиций из 2 520. Первая в списке: 9 000 000–11 000 000 центов, валюта USD, подпись «US Salary Range». В долларах это 90–110 тысяч, но пересчитывать центы придётся самому.

Две вещи, которые ломают наивный парсер. Первая: диапазонов у вакансии может быть несколько — например, отдельный «Zone 2 Pay Range» для другой географии. Вторая: подпись не гарантирует период. Среди диапазонов с заголовком «HOURLY POSITION» верхняя граница была 60 000, и из ответа не следует, за какой отрезок времени эта сумма. Валюту, период и тип ставки придётся нормализовать вручную, иначе сравнение вакансий превращается в случайные числа.

По 60 крупнейшим доскам Greenhouse вилки публикуют 32 компании, и ranges нашлись у 14 208 позиций из 53 750. SpaceX в этом поле не публикует ничего, зато у 1 518 из 2 832 вакансий строка «Pay Range» вписана в текст описания. Хотите зарплаты по этой компании — доставайте их регуляркой из HTML, а не из структурированного поля.

content=true: в двенадцать раз больше байт и двойное экранирование

Описание, отделы и офисы приходят только с ?content=true. Доска SpaceX без флага весит 2,7 МБ, с флагом — 32 МБ. Разница в двенадцать раз по объёму, и это на одну компанию.

Дальше начинается весёлое: HTML приезжает экранированным, вместо <p> в ответе лежит &lt;p&gt;. Сначала снимаете экранирование, потом вырезаете теги. В обратном порядке стриппер не находит ни одного тега и в текст уезжает <p> — ошибка выглядит глупо, а встречается почти в каждом самописном скрапере. И держите в голове вес: 32 МБ по расписанию — это память, таймауты и трафик.

Постинг и вакансия — разные единицы счёта

У каждого объявления свой id, а internal_job_id показывает, какая вакансия за ним стоит. У SpaceX 2 832 постинга раскладываются в 2 125 уникальных вакансий: одну позицию в Хоторне рекламируют под 13 разными заголовками. У Anduril 2 520 постингов — это 1 527 вакансий, и одна из них висит 14 раз: 7 заголовков, 5 локаций.

Отсюда простое правило. Считаете открытые позиции — группируйте по internal_job_id. Показываете список объявлений — берите id. Если перепутать, в отчёте «сколько компания нанимает» будет завышение в разы, а в интерфейсе — пачки почти одинаковых строк.

location — одна строка, offices — список

У Anduril в location.name может лежать до девяти городов через точку с запятой: так оформлены 196 постингов из 2 520. Разбирать это сплитом по «; » можно, но есть offices — там места лежат отдельными элементами со своими кодами вроде «Costa Mesa, CA (OC-00)».

Ещё есть metadata с полями конкретной компании. «Employment Type» у Anduril — «Full-time», у SpaceX — «Regular», рядом у SpaceX лежит «Discipline». Одинаковых значений у полей с одинаковым смыслом не ждите, нормализовать придётся руками.

КомпанияТокен доскиПостинговУникальных вакансийВилки в pay_input_ranges
SpaceXspacex2 8322 125нет; 1 518 с «Pay Range» в описании
Andurilandurilindustries2 5201 5272 342 позиции

Сводка по флагам, если нужен быстрый чек-лист перед запуском:

Что нужноПараметрЧто появляетсяЧем платите
Зарплатные вилкиpay_transparency=truepay_input_ranges в центах, без периодаРучная нормализация валюты и ставки
Текст описания, отделы, офисыcontent=trueПоле content и связанные блокиРост ответа до 32 МБ, двойное экранирование
Число открытых позиций—Ничего, нужен пересчётГруппировка по internal_job_id

Когда этот способ не подходит

API закрывает только компании на Greenhouse. У Workday, Oracle и остальных ATS свои публичные ручки, и общий подход тот же — запрос к доске без ключа, только поля и флаги другие. Если возиться с каждой системой отдельно не хочется, есть готовые обвязки: Greenhouse Jobs Scraper на Apify принимает токен доски или домен компании, сам запрашивает pay_input_ranges, переводит центы в salaryMin и salaryMax с периодом и снимает экранирование с описания. Второй скрапер там же берёт работодателей по имени, включая компании на Workday и Oracle. Набор проверенных запросов к разным ATS лежит в открытом репозитории job-board-apis.

Если же нужна аналитика по одной компании, дешевле написать двадцать строк на shell и jq, чем подключать внешний сервис.

Главное, что стоит унести: доска Greenhouse — это бесплатный и полный срез вакансий компании, но счёт в нём двойной. Постинги считаются по id, реальные позиции — по internal_job_id, зарплаты появляются только по флагу и приходят в центах без указания периода. Проверка кода ответа, порядок «снять экранирование, потом резать теги» и группировка по внутреннему id — три вещи, без которых данные выглядят правдоподобно и врут.

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

← На главную

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

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

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

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

Маркетинг

Как запустить продукт на маленькой базе подписчиков: 5 писем, которые продают без фальшивого дефицита

Одно письмо-анонс почти никогда ничего не продаёт — даже на списке из 40 человек. Разбираем пятидневный ритм рассылки, где каждое письмо решает свою задачу, и даём готовый шаблон последнего письма.

Слогер 28.10.2026 ▲ 1
Маркетинг

Переезд (миграция) с Битрикс24 и amoCRM без потери данных: в Fluxs появился модуль миграции

4 000 контактов в Битрикс24. Сотни сделок. Задачи за несколько лет. И всё это нужно перенести в новую CRM? Раньше такой переезд мог занять несколько дней. А иногда именно из-за переноса данных компании годами оставались в неудобной системе. Мы решили эту проблему. 🚀 В Fluxs появился модуль «Миграция данных». Теперь можно переносить контакты, сделки, задачи, проекты и базу знаний из Битрикс24, amoCRM, Jira, Яндекс Трекера и Confluence. А если вашей системы нет в списке — загрузить данные через Excel, CSV или JSON.

fluxs.ru 27.10.2026 ▲ 1
Fluxs lenta
Реклама · fluxs.ru
Карьера

Чем Cal-WARN отличается от федерального WARN: разбор порогов, уведомлений и штрафов

Калифорния требует предупреждать о массовых сокращениях за 60 дней — как и федеральный закон США. Только порог ниже, парт-тайм считается, а правило одной трети не действует. Разбираем, что это меняет для работника и работодателя.

Слогер 27.10.2026 ▲ 0
Карьера

WARN Act: кто считается работодателем при массовом сокращении — разбор для дочек, холдингов и франшиз

По американскому закону уведомление за 60 дней обязан дать только работодатель. Разбираем, как регуляторы решают, какое юрлицо им является, и что делать, если в бумаге стоит незнакомая компания.

Слогер 27.10.2026 ▲ 0
Разработка

Разбор: почему профессию разработчика хоронят каждые 20 лет и как работать, когда всё меняется

Паника вокруг ИИ — не первая волна перемен в отрасли: похожие прогнозы звучали и в 1961 году, и в 2011-м. Разбираем, что в нынешней тревоге реально, а что стоит воспринимать как фоновый шум.

Слогер 27.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Карьера

Страх провала и страх свидетелей: чем они отличаются и как начинать новое, когда страшно

«Я пока недостаточно хорош» — честная и бесполезная фраза. Обычно дело не в навыке, а в конкретных людях, которые увидят вашу первую попытку. Разбираем, как уменьшить ставку и всё-таки начать.

Слогер 26.10.2026 ▲ 0
Карьера

Почему удалёнка платит меньше — и в каких профессиях всё наоборот: разбор 8 049 вакансий

Медианная вилка на удалёнке ниже офисной на 6,5%. Но внутри функций разрыв меняет знак: безопасность и продажи получают премию за удалёнку, data/ML — самую большую скидку. Показываю, как читать эти цифры на переговорах.

Слогер 26.10.2026 ▲ 0
Личный опыт

Как заказать командную вышивку без минимальной партии: разбор и чек-лист

Малая команда редко может позволить себе стартовый тираж на 30 вещей. Разбираем схему, при которой вышивка делается по одной штуке — и при этом логотип у всех выглядит одинаково.

Слогер 26.10.2026 ▲ 0
Маркетинг

Автоматизация бизнеса за 15 000 или 170 000 рублей в год: в чём разница?

Автоматизация бизнеса за 15 000 или 170 000 ₽ в год. За что такая разница? 🤔 Представьте: компании нужно всего несколько вещей — принимать заявки, согласовывать счета и контролировать задачи сотрудников. А ей предлагают целую цифровую экосистему: CRM, телефонию, маркетинг, аналитику, десятки дополнительных функций… Но что, если половина из этого бизнесу вообще не нужна?

Слогер 25.10.2026 ▲ 1
Fluxs lenta
Реклама · fluxs.ru