---
name: vakhunter-hh-lux-format
description: "VakHunter — hh-группа парсится из HH-Lux-InitialState template; \"0 вакансий\" ≠ IP-бан"
metadata: 
  node_type: memory
  type: project
  originSessionId: 805ead91-dfa3-49d2-a5e6-01a980e715fd
---

hh.ru и вся hh-группа (hh_kz/by/uz наследуют HHParser; zarplata/rabota) отдают результаты поиска в `<template id="HH-Lux-InitialState">{JSON}</template>` с **HTML-entity-escaped** кавычками (`&#34;`). Извлекать: regex по шаблону → `html.unescape` → `json.loads` → `vacancySearchResult.vacancies`. Фикс `94e05a7` (2026-07-14).

**Why:** hh сменил формат ~29 июня 2026, старый экстрактор искал сырой `"vacancies":[` подстрокой → молча возвращал 0. Простой 15 дней, платные тарифы обещали hh — поймал только полный аудит.

**How to apply:** «hh EMPTY / 0 вакансий» — НЕ сразу IP-бан. 302 на hh.ru = региональный редирект (httpx follows сам), api.hh.ru 403 = отдельный anon-API (ложный след). `curl -sL` финальную страницу: 200 + маркер `vacancySearchResult` в теле, но парсер 0 → формат шаблона снова сменился. Гейт — `tests/test_hh_lux.py`. См. [[vakhunter_web_ai_tariff]], Obsidian Decisions D21.
