JSON-LD JobPosting: как находить вакансии раньше агрегаторов
Многие карьерные страницы добавляют машиночитаемое описание вакансии в формате JSON-LD. Оно помогает понять данные у источника и следить за изменениями, но не гарантирует, что поисковик или агрегатор сразу проиндексирует роль.
На многих страницах вакансий рядом с видимым HTML есть машиночитаемое описание: название роли, локация, дата публикации, зарплата и работодатель. Обычно это JSON-LD JobPosting, встроенный в тег script. Он есть не везде и заполняется с разной полнотой, поэтому воспринимайте его как полезный источник для проверки, а не как обязательную часть каждой карьерной страницы.
Понимание этого формата полезно по двум причинам. Во-первых, становится ясно, как поисковик считывает структурированные сведения со страницы компании. Во-вторых, техническим специалистам он даёт более чистый путь для мониторинга, когда данные доступны. Но всё равно придётся обрабатывать отсутствующие, некорректные или загружаемые через JavaScript данные.
Что это на самом деле
JSON-LD (JSON for Linked Data) позволяет встраивать машиночитаемые данные в веб-страницу. Схема JobPosting, описанная на schema.org/JobPosting, входит в число типов, которые Google использует для получения структурированной информации из интернета.
Google указывает структурированные данные JobPosting как один из способов получить право на показ в сервисе поиска вакансий, но соответствие требованиям не гарантирует показ. Многие современные системы отслеживания кандидатов, включая Workday, Greenhouse, Lever, Ashby, Phenom и iCIMS, публикуют структурированные данные хотя бы на части открытых страниц вакансий. Реализация всё равно зависит от платформы и настроек работодателя.
Как это выглядит
Если открыть исходный код типичной вакансии на Greenhouse и найти application/ld+json, можно увидеть примерно такой блок:
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Backend Engineer",
"description": "We're looking for...",
"datePosted": "2026-05-12",
"validThrough": "2026-08-12",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "Acme",
"sameAs": "https://acme.example"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"addressLocality": "London",
"addressCountry": "GB"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "GBP",
"value": {
"@type": "QuantitativeValue",
"minValue": 90000,
"maxValue": 130000,
"unitText": "YEAR"
}
}
}
Два полезных поля: datePosted, где записана указанная в структурированных данных дата публикации, и baseSalary, если работодатель добавил зарплату. Любое из них может отсутствовать, устареть или быть плохо отформатировано, поэтому сверяйтесь с видимым текстом объявления.
Почему это важно при поиске работы
Есть три практические причины.
1. Вы видите дату публикации, указанную работодателем
Поле datePosted показывает, какую дату объявляет страница работодателя. Часто это полезнее относительной метки платформы вроде «опубликовано 3 дня назад». Но поле не безошибочно: работодатель может обновить, пропустить или повторно использовать дату, а агрегаторы получают объявления разными путями. В нашем сравнении источника и агрегатора это поле считается свидетельством, которое нужно проверить, а не безусловно точными часами.
2. Вы понимаете, как поисковик может прочитать страницу вакансии
Структурированные данные дают поисковику прямое описание роли, когда он обходит страницу. Время обхода, индексация и показ не гарантированы, а другие платформы могут получать или обрабатывать вакансии иными путями. В нашем разборе задержки агрегаторов объясняется, что на практике значит увидеть роль позже, чем она появилась у первоисточника.
3. Вы получаете чистый способ самостоятельно следить за компаниями
Если вы создаёте собственный мониторинг, корректный JSON-LD удобен как первый источник: поля уже структурированы. Но резервные варианты всё равно нужны. Блок может отсутствовать, быть некорректным, неожиданно вложенным или загружаться после первоначального HTML. Ищите <script type="application/ld+json">, проверяйте найденное и предусмотрите работу страницы без него.
Как проверить данные самостоятельно
В любом браузере:
- Откройте страницу вакансии, например на Greenhouse или Lever.
- Щёлкните правой кнопкой мыши и выберите «Просмотреть исходный код страницы» либо нажмите Ctrl+U / Cmd+U.
- Найдите
application/ld+json. - Вы увидите один или несколько JSON-блоков. Данные роли находятся в блоке с
"@type": "JobPosting".
Google Rich Results Test помогает найти ошибки в структурированных данных и проблемы с соответствием требованиям. Успешная проверка не гарантирует, что Google проиндексирует или покажет вакансию.
Почему одного названия ATS недостаточно
- Страницы, размещённые в ATS: Greenhouse, Lever, Ashby, Workday, Phenom, iCIMS и SmartRecruiters могут публиковать данные JobPosting, но поддержка зависит от шаблона и настроек работодателя.
- Страницы, отрисованные JavaScript: структурированные данные могут появиться только после выполнения кода страницы и отсутствовать в исходном ответе.
- Собственные карьерные сайты: реализация зависит от работодателя. Размер компании или известность бренда ничего не доказывают.
- Любая платформа: проверяйте именно то объявление, за которым собираетесь следить. Ожидание на уровне платформы не подтверждает, что конкретная страница содержит корректные данные.
Наш полный справочник по ATS объясняет, как определить систему, которой пользуется компания.
Минимальный пример собственного мониторинга
Для технических читателей ниже показана общая форма Python-скрипта, который следит за одной карьерной страницей и ищет новые записи JSON-LD JobPosting:
import json, re, requests, hashlib
from bs4 import BeautifulSoup
def fetch_postings(url):
html = requests.get(url, headers={"User-Agent": "Mozilla/5.0"}).text
soup = BeautifulSoup(html, "html.parser")
out = []
for tag in soup.find_all("script", type="application/ld+json"):
try:
data = json.loads(tag.string)
except (json.JSONDecodeError, TypeError):
continue
items = data if isinstance(data, list) else [data]
for item in items:
if item.get("@type") == "JobPosting":
out.append(item)
return out
# Run on a schedule; diff against previous run; email new entries.
Рабочий мониторинг также должен справляться со страницами, отрисованными JavaScript, сбоями запросов, ограничениями частоты, дубликатами и изменениями схем. Это заметно сложнее примера выше. Наше руководство по мониторингу карьерных страниц сравнивает этот подход с альтернативами.
Что это значит для вашего поиска
Если работодатель публикует корректные структурированные данные, они доступны на исходной странице до или одновременно с копиями, которые позже появляются в других местах. Это не доказывает, когда другая платформа получила вакансию. Зато это повод свериться со страницей работодателя, а не считать временную метку агрегатора исходными часами объявления.
Практический вывод: не полагайтесь на один канал поиска. Перед откликом проверяйте каноническую страницу работодателя, а для собственного мониторинга используйте структурированные данные. Наше сравнение способов получать оповещения разбирает их компромиссы.
Что делать с этой информацией
JSON-LD JobPosting — один из полезных слоёв современного поиска вакансий. Если компания публикует его корректно, поисковики и инструменты мониторинга могут читать одинаковые заявленные поля. Но само наличие данных не показывает, когда другая платформа получила или отобразила роль.
Для кандидата технические детали менее важны, чем первоисточник: проверяйте роль на странице работодателя и откликайтесь, пока подходящая вакансия свежая. Если найти её до того, как сформируется очередь кандидатов или шорт-лист, вы получаете реальное преимущество во времени и видимости. При самостоятельном мониторинге сначала ищите корректный JSON-LD, а если его нет или он неполон, аккуратно переходите к резервному способу.