JSON-LD JobPosting : comment trouver des postes avant que les agrégateurs ne les indexent
De nombreuses pages Carrières intègrent des données lisibles par machine pour décrire un poste. Lorsqu'un bloc JSON-LD JobPosting valide est présent, il peut fournir une source de surveillance plus propre que le HTML rendu. Il aide aussi à comprendre comment les moteurs de recherche découvrent et affichent les offres.
De nombreuses pages d'offres incluent, à côté du HTML visible, une description lisible par machine avec des champs comme le titre, le lieu, la date, le salaire et l'employeur. Le format courant est JSON-LD JobPosting, intégré dans une balise script. Sa présence et son exhaustivité varient : voyez-le comme une source utile à inspecter, pas comme une garantie sur chaque page Carrières.
Comprendre ce format apporte deux choses utiles. Il montre comment un moteur de recherche peut lire les informations structurées d'une page d'entreprise et offre aux lecteurs techniques une voie de surveillance plus propre lorsque les données sont présentes. Il faut tout de même gérer les données absentes, invalides ou rendues en JavaScript.
Ce que c'est concrètement
JSON-LD (« JSON for Linked Data ») est un moyen d'intégrer des données lisibles par les machines dans une page web. Le schéma JobPosting, défini sur schema.org/JobPosting, est l'un des dizaines de types que Google utilise pour ingérer des informations structurées du web.
Google documente les données structurées JobPosting comme une voie d'éligibilité à son expérience de recherche d'emploi, sans garantir l'affichage. De nombreux ATS modernes, dont Workday, Greenhouse, Lever, Ashby, Phenom et iCIMS, exposent ces données sur au moins certaines pages publiques. La mise en œuvre varie encore selon la plateforme et la configuration de l'employeur.
À quoi cela ressemble
Si vous affichez le code source d'une offre d'emploi typique hébergée sur Greenhouse et recherchez application/ld+json, vous verrez quelque chose de similaire à ceci :
{
"@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"
}
}
}
Deux champs utiles sont datePosted, qui reprend la date fournie dans les données structurées, et baseSalary, quand l'employeur l'inclut. L'un ou l'autre peut être absent, périmé ou mal formaté. Vérifiez l'annonce visible avant de vous y fier.
Pourquoi c'est important pour la recherche d'emploi
Trois raisons pratiques.
1. Cela vous donne la date fournie par l'employeur
Le champ datePosted indique ce que déclare la page de l'employeur, ce qui est souvent plus utile qu'une mention relative comme « publié il y a 3 jours ». Il n'est pas infaillible : l'employeur peut modifier, omettre ou réutiliser une date, et les agrégateurs reçoivent les offres par différents circuits. Notre comparaison entre source et agrégateur traite ce champ comme une preuve à vérifier, pas comme une horloge incontestable.
2. Cela explique comment un moteur de recherche peut lire une offre
Les données structurées donnent aux moteurs une description directe du poste lorsqu'ils explorent la page. Le moment de l'exploration, l'indexation et l'affichage ne sont pas garantis, tandis que d'autres plateformes peuvent recevoir ou traiter l'offre par différents circuits. Notre analyse du retard des agrégateurs étudie l'effet pratique d'une découverte postérieure à la source.
3. Cela vous offre un moyen propre de surveiller les entreprises vous-même
Pour construire une surveillance, un JSON-LD valide est une bonne première source parce que les champs sont déjà structurés. Il ne dispense pas de solutions de repli : le bloc peut manquer, être mal formé, imbriqué de façon inattendue ou chargé après le HTML initial. Cherchez <script type="application/ld+json">, validez ce que vous trouvez et gérez aussi son absence.
Comment l'inspecter vous-même
Dans n'importe quel navigateur :
- Ouvrez une page d'offre d'emploi (essayez une URL Greenhouse ou Lever).
- Faites un clic droit et choisissez « Afficher le code source de la page » (ou appuyez sur Ctrl+U / Cmd+U).
- Recherchez
application/ld+json. - Vous trouverez un ou plusieurs blocs JSON. Celui avec
"@type": "JobPosting"correspond aux données du poste.
L'outil Rich Results Test de Google peut repérer des erreurs de données structurées et des problèmes d'éligibilité. Réussir le test ne garantit ni l'indexation ni l'affichage par Google.
Pourquoi le nom de l'ATS ne suffit pas
- Pages hébergées par un ATS : Greenhouse, Lever, Ashby, Workday, Phenom, iCIMS et SmartRecruiters peuvent exposer des données JobPosting, mais la prise en charge varie selon le modèle et la configuration.
- Pages rendues en JavaScript : les données peuvent n'apparaître qu'après l'exécution de la page et manquer dans la réponse brute.
- Sites Carrières sur mesure : la mise en œuvre varie selon l'employeur. La taille ou la marque n'est pas un raccourci fiable.
- Toute plateforme : inspectez l'annonce que vous comptez surveiller. Une attente au niveau de la plateforme ne prouve pas que cette page contient des données valides.
Notre référence complète des ATS couvre comment identifier quel système une entreprise utilise.
Un guide minimal « devenez votre propre explorateur »
Pour les lecteurs techniques, voici la structure générale d'un script Python qui surveille une seule page Carrières pour détecter de nouvelles entrées 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
# À exécuter selon un calendrier ; comparer avec l'exécution précédente ; envoyer les nouvelles entrées par e-mail.
Un système de production doit aussi gérer les pages rendues en JavaScript, les échecs de requêtes, les limites de fréquence, les doublons et les changements de schéma. C'est nettement plus de travail que l'exemple ci-dessus. Notre guide de surveillance des pages Carrières compare cette approche aux autres solutions.
Ce que cela signifie pour votre recherche d'emploi
Lorsqu'un employeur publie des données structurées valides, elles sont disponibles sur la page source avant ou en même temps que les copies qui apparaissent ailleurs. Cela ne prouve pas quand une autre plateforme a reçu l'offre. Cela justifie de vérifier la page employeur au lieu de prendre l'horodatage d'un agrégateur pour l'horloge d'origine.
La conséquence pratique est de ne pas dépendre d'un seul canal. Vérifiez la page canonique de l'employeur avant de postuler et utilisez les données structurées si vous construisez votre propre surveillance. Notre comparaison des systèmes d'alerte détaille les compromis.
Comment l'utiliser
JSON-LD JobPosting est une couche utile de la découverte d'emploi moderne. Lorsqu'une entreprise le publie correctement, moteurs de recherche et outils de surveillance peuvent lire les mêmes champs déclarés. Cette disponibilité ne révèle pas quand une autre plateforme a ingéré ou affiché l'offre.
Pour un candidat, la source compte davantage que le détail technique : vérifiez le poste sur la page de l'employeur et postulez pendant qu'une offre pertinente est fraîche. L'atteindre avant la formation de la file ou de la sélection donne un véritable avantage de timing et de visibilité. Si vous construisez votre propre surveillance, cherchez d'abord un JSON-LD valide, puis prévoyez une solution de repli lorsqu'il est absent ou incomplet.