Scanner les portails d'emploi
Configurez et lancez le scanner de portails pour trouver automatiquement de nouvelles offres d'emploi.
Ce guide vous accompagne dans la configuration de portals.yml et le lancement du scanner de portails pour trouver automatiquement de nouvelles offres d'emploi.
Avant de commencer
Assurez-vous d'avoir terminé le guide Démarrage rapide. Vous devez disposer de cv.md et de modes/_profile.md avant que le scan ne soit utile.
Configurer portals.yml
portals.yml est le fichier qui contrôle ce que le scanner recherche et où il le cherche. Vous le créez une seule fois à partir du modèle inclus, puis vous le modifiez pour correspondre aux postes que vous visez.
Exécutez cette commande depuis le dossier du projet :
cp templates/portals.example.yml portals.ymlOuvrez portals.yml dans n'importe quel éditeur de texte. Les étapes ci-dessous passent en revue les trois sections que vous modifiez en premier : le filtre de titres, les entreprises à suivre et les requêtes de recherche.
Configurer votre filtre de titres
Le filtre de titres est ce qui permet au scanner de décider si une offre mérite de vous être présentée. Il compare le titre du poste à deux listes de mots-clés.
Repérez la section title_filter vers le haut du fichier :
title_filter:
positive:
- "AI"
- "ML"
- "Product Manager"
negative:
- "Junior"
- "Intern"
seniority_boost:
- "Senior"
- "Staff"
- "Lead"Remplacez la liste positive par des mots-clés correspondant aux postes que vous visez. Une offre doit correspondre à au moins un mot-clé de cette liste pour être retenue. La vérification n'est pas sensible à la casse : "AI" détecte donc aussi "ai engineer".
Remplacez la liste negative par des mots-clés qui éliminent une offre. Si l'un d'eux apparaît dans le titre, l'offre est écartée — même si elle correspondait à un mot-clé positif.
Laissez seniority_boost tel quel, sauf si vous souhaitez ajouter ou retirer des niveaux de séniorité. Ces mots-clés ne filtrent rien — ils font simplement remonter les offres correspondantes dans les résultats.
Exemple : si vous cherchez des postes d'ingénierie Rails, votre filtre pourrait ressembler à ceci :
title_filter:
positive:
- "Rails"
- "Ruby"
- "Full Stack"
- "Backend"
negative:
- "Junior"
- "Intern"
- "PHP"
- "Java"
seniority_boost:
- "Senior"
- "Staff"
- "Lead"Astuce
Commencez avec une petite liste positive de trois à cinq mots-clés. Vous pourrez toujours en ajouter plus tard. Une longue liste rend plus difficile de comprendre pourquoi une offre a été retenue ou écartée.
Ajouter des entreprises à suivre
La section tracked_companies est une liste d'entreprises précises que le scanner doit vérifier à chaque exécution. Le scanner se rend directement sur la page emploi de chaque entreprise et lit les postes ouverts.
Repérez la section tracked_companies vers le bas du fichier. Chaque entrée ressemble à ceci :
tracked_companies:
- name: Anthropic
careers_url: https://job-boards.greenhouse.io/anthropic
api: https://boards-api.greenhouse.io/v1/boards/anthropic/jobs
enabled: true
- name: OpenAI
careers_url: https://openai.com/careers
enabled: truePour ajouter une entreprise, copiez une entrée existante et modifiez les valeurs :
| Champ | Ce qu'il faut renseigner |
|---|---|
name | Le nom de l'entreprise tel que vous voulez le voir apparaître dans les résultats |
careers_url | L'URL directe de la page listant les offres d'emploi de l'entreprise |
api | Facultatif. L'URL de l'API Greenhouse si l'entreprise utilise Greenhouse. Omettez-le si vous n'êtes pas sûr. |
enabled | Mettez true pour inclure l'entreprise ou false pour l'ignorer sans supprimer l'entrée. |
Pour trouver la careers_url d'une entreprise, rendez-vous sur son site web, cliquez sur Careers ou Jobs, et copiez l'URL de la page qui liste les postes ouverts. C'est cette URL qu'il faut utiliser.
Pour désactiver une entreprise sans la supprimer, mettez enabled: false :
- name: Stripe
careers_url: https://stripe.com/jobs/search
enabled: falseRemarque
Chaque entreprise de tracked_companies doit avoir une careers_url. Sans elle, le scanner n'a aucune page à visiter et ignorera cette entrée.
Passer en revue les requêtes de recherche
La section search_queries lance des recherches web plus larges pour trouver des postes dans des entreprises absentes de votre liste suivie. Le modèle inclut de nombreuses requêtes prédéfinies.
Vous n'avez pas besoin de modifier cette section pour démarrer. Les requêtes prédéfinies couvrent les principaux sites d'emploi, dont Greenhouse et Ashby, entre autres.
Quand vous serez prêt à personnaliser, chaque requête ressemble à ceci :
search_queries:
- name: Greenhouse — Rails Engineer
query: 'site:job-boards.greenhouse.io "Rails Engineer" OR "Ruby on Rails" remote'
enabled: truePour désactiver une requête dont vous n'avez pas besoin, mettez enabled: false. Pour en ajouter une nouvelle, copiez une entrée existante, donnez-lui un nouveau name et mettez à jour le texte de query.
Choisir la langue des annonces (facultatif)
Certains sites d'emploi publient la même annonce en plusieurs langues. Si vous ne postulez que dans certaines d'entre elles, listez ces langues par ordre de préférence :
preferred_languages: [en]Quand une annonce existe dans ces langues, le scan conserve la version dans la langue qui apparaît en premier dans votre liste ; sinon, il conserve la version par défaut de l'annonce. Il s'agit d'un ordre de préférence, pas d'un filtre : aucune annonce n'est écartée, et vous obtenez toujours une ligne par annonce. Les variantes régionales comptent comme une seule langue : en-GB équivaut donc à en. Pour définir la langue d'une seule entreprise, ajoutez le paramètre propre au site à sa careers_url : ?language=xx sur Personio, ?lang=xx sur Recruitee.
Lancer un scan
Il existe deux façons de lancer un scan. Utilisez celle qui correspond à votre besoin.
Option A — Exécuter le script directement
npm run scanExécutez cette commande depuis le dossier du projet. Le script lit portals.yml, interroge directement l'API de chaque entreprise et écrit les nouvelles offres dans data/pipeline.md. Il n'utilise aucun token d'IA et s'exécute en environ 30 secondes.
Cette option fonctionne pour toute entreprise dont la page emploi repose sur une plateforme pour laquelle le scanner dispose d'un provider intégré : Greenhouse, Ashby et Lever, ainsi que des dizaines d'autres logiciels de recrutement (ATS) et sites d'emploi comme Workable, Workday et SmartRecruiters. La liste complète se trouve dans SUPPORTED_JOB_BOARDS.md. Les entreprises sans provider correspondant sont ignorées, et le scan indique combien il y en a.
Prévisualiser les résultats avant de les enregistrer :
npm run scan -- --dry-runCette commande exécute le scan complet mais n'écrit rien sur le disque. Utilisez-la pour vérifier vos réglages de filtre avant d'enregistrer les résultats.
Scanner une seule entreprise :
npm run scan -- --company AnthropicRemplacez Anthropic par n'importe quel nom d'entreprise de votre liste tracked_companies. La correspondance n'est pas sensible à la casse.
Scanner les sites carrières Dayforce :
Les sites carrières hébergés sur Dayforce (Ceridian), à l'adresse jobs.dayforcehcm.com, bloquent les requêtes web simples : npm run scan ne peut donc pas les lire. Un script distinct ouvre à la place une véritable session de navigateur, ce qui le rend plus lent que le scan principal. Listez ces sites sous dayforce_boards dans portals.yml, avec une entrée par entreprise indiquant son name et son tenant (le code de l'entreprise dans l'adresse Dayforce) ; templates/portals.example.yml montre le format. Puis exécutez :
npm run scan:dayforceLes nouvelles offres sont ajoutées à data/pipeline.md, comme avec le scan principal. Ajoutez -- --dry-run pour prévisualiser sans enregistrer, -- --tenant <tenant> pour scanner un seul site, ou -- --debug pour enregistrer une capture d'écran de chaque site dans output/. Si un site affiche une vérification anti-bot, le script l'ignore ; il ne tente jamais de la contourner.
Option B — Lancer le scan piloté par l'IA dans Claude Code
Ouvrez Claude Code dans le dossier du projet et tapez :
/career-ops scanCette version visite directement la page emploi de chaque entreprise à l'aide d'un navigateur, elle fonctionne donc même pour les entreprises qui n'ont pas d'API publique. Elle exécute aussi les search_queries de votre portals.yml pour trouver des postes dans des entreprises absentes de votre liste suivie.
Utilisez cette option quand :
- Une entreprise de votre liste utilise une plateforme pour laquelle le script n'a pas de provider, donc le scan par script l'ignore
- Vous voulez découvrir de nouvelles entreprises, pas seulement vérifier celles que vous connaissez déjà
- Le scan par script a manqué quelque chose que vous vous attendiez à voir
Si le script a manqué une annonce que vous avez trouvée vous-même, demandez-lui d'abord pourquoi :
node coverage-check.mjs <url> --company "<company>" --title "<job title>"Il lit votre portals.yml et l'historique de scan sans se connecter à internet, indique pourquoi l'annonce a été manquée (l'entreprise n'est pas suivie, son entrée est désactivée, aucun provider ne lit sa page emploi, ou un filtre de titres ou de localisation l'a écartée) et propose la seule modification qui l'aurait détectée. Il ne modifie jamais portals.yml à votre place.
Astuce
L'option B consomme des tokens du modèle d'IA et prend plus de temps que le script. Que ces tokens soient facturés sur une clé API ou décomptés de votre abonnement dépend de la configuration de votre CLI (voir la FAQ). Pour une vérification quotidienne rapide, l'option A est plus rapide.
Lire le résultat du scan
Quand le scan se termine, vous verrez un résumé comme celui-ci :
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Portal Scan — 2026-04-13
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Companies scanned: 42
Total jobs found: 318
Filtered by title: 291 removed
Duplicates: 4 skipped
New offers added: 23
New offers:
+ Anthropic | AI Engineer | San Francisco, CA
+ ElevenLabs | Solutions Architect | Remote
...
→ Run /career-ops pipeline to evaluate new offers.Voici ce que signifie chaque ligne :
| Ligne | Ce qu'elle vous indique |
|---|---|
| Companies scanned | Combien d'entreprises de tracked_companies ont été vérifiées |
| Total jobs found | Tous les postes ouverts vus dans ces entreprises, avant tout filtrage |
| Filtered by title | Offres écartées parce que le titre ne correspondait pas à votre title_filter |
| Duplicates skipped | Offres déjà présentes dans votre pipeline ou votre tracker — elles ne sont pas ajoutées à nouveau |
| New offers added | Offres qui ont passé tous les filtres et qui sont nouvelles pour vous |
Si New offers added est à 0, cherchez d'abord cet avertissement dans la sortie du scan :
⚠️ 1 target(s) returned zero jobs without a successful HTTP response: AcmeIl signifie que le portail de cette entreprise n'a jamais répondu correctement : ce zéro ne prouve donc pas qu'il n'a aucune offre. L'entreprise est enregistrée comme unverified_zero dans data/portal-health.tsv et compte dans sa série d'échecs. Vérifiez ce portail avant de modifier vos filtres. Un portail lent peut aussi dépasser le délai avant de répondre : le scanner attend 10 secondes par requête par défaut, et CAREER_OPS_HTTP_TIMEOUT_MS=30000 npm run scan lui en accorde 30.
Si cet avertissement n'apparaît pas, votre filtre de titres est peut-être trop strict. Essayez d'ajouter un mot-clé à votre liste positive et relancez le scan.
Où vont les nouvelles offres : chaque nouvelle offre est ajoutée sous forme de ligne dans data/pipeline.md. C'est la liste des offres en attente d'évaluation.
À quoi sert data/scan-history.tsv : chaque URL vue par le scanner — qu'elle ait été ajoutée, filtrée ou ignorée — est consignée ici. C'est ainsi que le scanner évite de vous montrer deux fois la même offre lors des scans futurs. Une exception : les offres écartées par votre location_filter ou votre max_posting_age_days dans portals.yml. Elles sont consignées comme skipped_location ou skipped_age et peuvent réapparaître dès que vous modifiez ce réglage. Vous n'avez pas besoin de modifier ce fichier.
Évaluer les nouvelles offres issues d'un scan
Après qu'un scan a ajouté de nouvelles offres à data/pipeline.md — votre liste d'offres d'emploi en attente — lancez la commande pipeline pour évaluer chacune d'elles par rapport à votre profil. Cette étape utilise Claude pour lire la description du poste, la comparer à votre cv.md et à votre modes/_profile.md, et produire un résumé noté pour chaque poste.
Ouvrez Claude Code dans le dossier du projet et tapez :
/career-ops pipelineClaude lit chaque URL en attente dans data/pipeline.md, visite chaque annonce et l'évalue. Les résultats arrivent par lots. Chaque lot affiche un tableau comme celui-ci :
Lot 1 terminé (Anthropic, ElevenLabs, Mistral) :
| # | Entreprise | Poste | Score | Légitimité |
|---|---|---|---|---|
| 024 | Anthropic | AI Engineer | 4.8/5 | High Confidence |
| 025 | ElevenLabs | Solutions Architect | 4.1/5 | High Confidence — fast-growing |
| 026 | Mistral AI | Product Manager | 3.2/5 | Proceed w/ Caution — role closed |
Voici ce que signifie chaque colonne :
| Colonne | Ce qu'elle vous indique |
|---|---|
| # | Le numéro du rapport. Utilisez-le pour retrouver le rapport complet dans reports/ — par exemple, le rapport 024 est reports/024-anthropic-2026-04-13.md |
| Score | Dans quelle mesure le poste correspond à votre profil, de 1 à 5 |
| Légitimité | Si l'annonce semble réelle et active. « High Confidence » signifie que l'offre est en ligne et que les détails sont cohérents. « Proceed w/ Caution » signifie que quelque chose a attiré l'attention — lisez la note à côté. |
Pour lire l'évaluation complète d'un poste, vous avez deux options :
- Ouvrir directement le fichier du rapport — retrouvez-le dans le dossier
reports/grâce au numéro du tableau. - Utiliser le dashboard — exécutez
./dashboard/career-dashboarddepuis le dossier du projet pour parcourir tous vos rapports dans une interface en terminal. Vous pouvez filtrer par score et par statut, et ouvrir n'importe quel rapport sans quitter le terminal.
Que faire ensuite
Quand /career-ops pipeline se termine, chaque offre a un score de 1 à 5. Vous trouverez le rapport complet de chaque poste dans le dossier reports/. Le score indique dans quelle mesure le poste correspond à votre profil.
Utilisez le score comme point de départ :
| Score | Action recommandée |
|---|---|
| 4.5 ou plus | Forte correspondance. Lancez /career-ops apply sans attendre. |
| 4.0 – 4.4 | Bonne adéquation. Lancez /career-ops apply. Vous pouvez aussi lancer d'abord /career-ops contacto pour contacter quelqu'un de l'équipe avant de postuler. |
| 3.5 – 3.9 | Ça peut aller dans les deux sens. Lancez /career-ops deep pour en savoir plus avant de décider. |
| Moins de 3.5 | Passez votre chemin, sauf si vous avez une raison précise de postuler. |
Voici ce que fait chaque commande :
/career-ops apply— Ouvre le formulaire de candidature et rédige des réponses adaptées à votre profil. Il s'arrête avant l'envoi pour que vous puissiez tout relire d'abord./career-ops contacto— Trouve un responsable du recrutement ou un membre de l'équipe sur LinkedIn et rédige un court message de prise de contact que vous pourrez envoyer./career-ops deep— Effectue des recherches approfondies sur l'entreprise et le poste. Utilisez-la quand vous hésitez et que vous voulez plus d'informations avant de décider./career-ops tracker— Affiche le statut de chaque poste de votre pipeline. Lancez-la à tout moment pour savoir où vous en êtes.
Astuce
Vous n'êtes pas obligé de suivre l'ordre. Si un poste obtient 4.8 mais que vous n'avez jamais entendu parler de l'entreprise, lancez d'abord /career-ops deep. Les commandes fonctionnent indépendamment — utilisez celle qui correspond à votre situation.
Vaut-il la peine de postuler à cette offre ?
Décidez avant de postuler. career-ops note une annonce de 1 à 5 au regard de votre CV et de vos objectifs, vous montre son raisonnement et vous laisse trancher.
Postuler à une offre d'emploi
Utilisez career-ops pour remplir vos candidatures avec des réponses adaptées à votre profil et au poste visé.