Kufar Spy · публичное API
Публичное API (read-only)
Кэш tops и графиков цен. Без живых запросов к Kufar на каждый hit. Не официальный API Куфара.
Защита: браузерные запросы только с Origin/Referer
https://monhunt.xyz + короткий X-MH-Token (JS challenge).
Лимит ≈15 req/мин с IP. Без Origin — 403. SEO/AI-краулеры (Googlebot, YandexBot, …) — allowlist без token.
1. Challenge (браузер)
GET /api/public/challenge
Origin: https://monhunt.xyz
→ { "ok": true, "token": "…", "expires_in": 120, "guard": true }
2. Tops (кэш-ленты)
GET /api/public/tops?category=hot|phones|laptops|bikes|gaming&limit=18
Origin: https://monhunt.xyz
Header: X-MH-Token: <token>
→ { ok, cached, items[], lotOfDay?, updatedAt, categories[] }
3. Prices (кэш статистики)
GET /api/public/prices?category=phones&days=7
GET /api/public/prices?query=iphone&days=7
GET /api/public/prices/popular?days=7&limit=10
Origin + X-MH-Token
→ { ok, cached, series: [{ date, avg_price, sample_size }], … }
Пример (same-origin браузер)
// На лендинге уже есть mhPublicFetch — он сам берёт challenge
const tops = await mhPublicFetch('/api/public/tops?category=hot&limit=6')
.then(r => r.json());
SEO
Категорийные страницы (/phones, …) и /sitemap.xml — серверный HTML без challenge.
Краулеры получают контент в HTML; JSON API для них тоже без token (UA allowlist).
Не входит в публичный API
- Фильтры, радар, VIP — Mini App + Telegram
initData - Webhook бота, admin (Turnstile), платежи
- Прямой прокси к Kufar