pfpulse.tech API
Решение капч Яндекса и генерация Android-отпечатков — через REST API. Два HTTP-запроса для капч (create + result), один GET для fingerprints. Разворачивать ничего не нужно.
Аутентификация
API поддерживает два способа авторизации. Для внешних интеграций используйте API-ключ:
curl -X POST https://pfpulse.tech/captcha/create \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"type":"SmartCaptcha","click":"...","task":"..."}'
curl -X POST "https://pfpulse.tech/captcha/create?key=YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"type":"SmartCaptcha","click":"...","task":"..."}'
API-ключ создаётся в личном кабинете. Для Fingerprint API — дополнительно нужна привязка IP (whitelist).
Серверы
API доступен через два маршрута. Оба принимают одинаковые ключи и запросы — разница только в сетевом маршруте.
https://pfpulse.tech
Оптимальный маршрут для клиентов вне РФ.
https://api.pfpulse.tech
Прямой маршрут для клиентов из России. Используйте если pfpulse.tech недоступен.
Выбор сервера доступен в конструкторе запроса в личном кабинете.
Для капч замените домен в URL: api.pfpulse.tech/captcha/create вместо pfpulse.tech/captcha/create.
Quickstart
SmartCaptcha — два запроса:
# 1) создаём задачу curl -X POST https://pfpulse.tech/captcha/create \ -H "X-API-Key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "type": "SmartCaptcha", "click": "<base64 PNG/JPG — картинка с иконками>", "task": "<base64 PNG/JPG — целевые силуэты>" }' # ← {"task_id": "9051d4b4-…", "status": "pending"} # 2a) Capsola-совместимый формат (рекомендованный, поле id) curl -X POST https://pfpulse.tech/captcha/result \ -H "Content-Type: application/json" \ -d '{"id": "9051d4b4-…"}' # ← {"status": 1, "response": "coordinates:x=34.7,y=108.0;…"} # 2b) Legacy формат (deprecated, поле task_id — для прокси Go-2/PS) curl -X POST https://pfpulse.tech/captcha/result \ -H "Content-Type: application/json" \ -d '{"task_id": "9051d4b4-…"}' # ← {"task_id":"…","status":"ready","solution":"coordinates:x=34.7,…","solve_time_ms":87,"error":""}
PazlCaptcha:
curl -X POST https://pfpulse.tech/captcha/create \ -H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" \ -d '{"type": "PazlCaptcha", "image": "<base64 PNG>", "task": "[10,24,5,9,8,...]"}' # result → {"solution": "14"} — номер шага слайдера
TextCaptcha:
curl -X POST https://pfpulse.tech/captcha/create \ -H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" \ -d '{"type": "TextCaptcha", "task": "<base64 PNG/JPG>"}' # result → {"solution": "молоко дерево"} — 2 слова
Fingerprint:
curl "https://pfpulse.tech/api/v1/fingerprint/generate?browser=chrome" \ -H "X-API-Key: YOUR_KEY" # ← JSON ~375KB с полным отпечатком устройства
SmartCaptcha
PRODUCTIONЯндекс-капча с силуэтами: на click-картинке — 5-7 иконок, на task-картинке — те, что нужно кликнуть (слева-направо). Решение = координаты кликов в правильном порядке.
Запрос
{
"type": "SmartCaptcha",
"click": "<base64 PNG/JPG>", // картинка с иконками
"task": "<base64 PNG/JPG>", // целевые силуэты
"coord_space": "native" // optional: "native" (default) | "css300"
}
coord_space: native — пиксели исходной картинки;
css300 — нормированные в 300×300 (для CSS-виджета).
Ответ
"solution": "coordinates:x=34.7,y=108.0;x=234.3,y=72.3;x=72.5,y=62.6;..."
Пары (x,y) через ; — в порядке силуэтов на task-картинке.
Рекомендуем human-like задержки 100-300 мс между кликами.
PazlCaptcha
PRODUCTIONПазл/калейдоскоп-капча: картинка разбита на сетку, строки сдвинуты swap-операциями. Слайдер снизу контролирует количество swap'ов. Решение = номер правильного шага слайдера.
Запрос — два формата
{
"type": "PazlCaptcha",
"image": "<base64 PNG>", // картинка паззла
"task": "[10,24,5,9,8,...]" // JSON-массив swap-индексов
}
image — из JS-стейта imageSrc, в base64.
task — массив из JS-стейта, чётная длина.
Регекспы: imageSrc:"(https://[^"]+)", task:"(\[[\d,]+\])".
{
"type": "PazlCaptcha",
"task": "<base64 полной HTML-страницы капчи>"
}
Сервер сам парсит HTML, скачивает картинку и решает.
Ответ
"solution": "14" // шаг слайдера (0..max, где max = len(task)/2)
Применение: кнопка «→» N раз, или drag ползунка в позицию N/max.
TextCaptcha
PRODUCTION БЕСПЛАТНОТекстовая капча Яндекса — два искажённых русских слова на картинке. Точность 97.8%, решение ~1 с. Бесплатно на период тестирования.
Запрос
{
"type": "TextCaptcha",
"task": "<base64 PNG/JPG — картинка с текстом>"
}
Ответ
"solution": "молоко дерево" // 2 русских слова через пробел
Тарифы на капчи и Fingerprint — на отдельной странице
payments Смотреть тарифыФормат ответа
Все эндпоинты — JSON.
POST /captcha/create
{ "task_id": "9051d4b4-...", "status": "pending" }
POST /captcha/result — Capsola-совместимый формат
Используется когда клиент шлёт поле id. HTTP всегда 200. Формат ответа:
{ "status": 1, "response": "coordinates:x=34.7,y=108.0;…" }
Магические строки в поле response при ошибочных/неготовых состояниях:
CAPCHA_NOT_READY— задача ещё в обработке (pending/processing)CAPCHA_NOT_AVAILABLE— solver не смог или internal exceptionERROR_NO_SUCH_TASK_ID— задача не найдена или TTL истёкERROR_INVALID_TASK_ID— битый запрос (нетid/task_idили невалидное значение)
Заголовок X-Captcha-Debug: 1 (case-insensitive truthy: 1/true/yes/on)
добавляет к ответу поле _debug с подмножеством internal_status,
solve_time_ms, error. Работает только в Capsola-режиме.
В legacy-режиме заголовок игнорируется. Внешний reference: capsola.space/docs.
POST /captcha/result — Legacy формат (deprecated)
Используется когда клиент шлёт поле task_id. HTTP 200 на ready/pending/error,
HTTP 404 на not_found. Поля solution и error всегда строки
(никогда null). Формат:
// Готово { "task_id": "...", "status": "ready", "solution": "coordinates:x=34.7,…", "solve_time_ms": 87, "error": "" } // Ещё решается { "task_id": "...", "status": "pending", "solution": "", "solve_time_ms": null, "error": "" } // Ошибка solver { "task_id": "...", "status": "error", "solution": "", "solve_time_ms": 1420, "error": "причина" }
Коды ошибок
- Неизвестный
type - Нет обязательных полей (SmartCaptcha:
click+task, PazlCaptcha:image+task) - Битая картинка / не base64 / <100 байт / >200 КБ
status: "error""no detections"— не нашли элементы (шумная картинка)"counter mismatch"— внутренняя несогласованность"timeout"— не уложились в SLA
При ошибке запросите новую капчу — retry той же картинкой не поможет.
TTL задачи истёк (120 сек) или неверный ID.
Polling
POST /captcha/create→task_id- Ждёте 1-2 сек (solve обычно <200 мс, но буфер на сеть)
POST /captcha/resultс{"task_id": "..."}"pending"— повторить через 2-5 сек"ready"— забирайтеsolution"error"— запросите новую капчу- TTL задачи — 120 сек
Лимиты и SLA
/createFingerprint API
PRODUCTIONГенерация Android-отпечатков из базы 457 реальных устройств. Canvas, WebGL, AudioContext, сенсоры, шрифты — снятые с настоящих телефонов. Подписка по req/min, привязка IP.
Эндпоинт
GET /api/v1/fingerprint/generate -H "X-API-Key: YOUR_KEY"
Параметры
browser — см. версии ниже (default: chrome)
profile — v1 (default) или v2
version — фильтр по версии браузера (для v2)
perfectCanvas — true для perfect canvas хешей
Ответ
// ~375KB JSON { "ua": "Mozilla/5.0 ... Chrome/147.0...", "canvas": "0cd58ae4...", "webgl": { ... }, "audio": { ... }, "battery": { ... }, "sensor": { ... }, "plugins": [ ... ], "fonts": [ ... ], "perfectcanvas": { ... } // если perfectCanvas=true }
V1, V2, V3
Три профиля генерации на выбор.
9 браузеров, Chrome 146, проверенные отпечатки.
curl "https://pfpulse.tech/api/v1/fingerprint/generate?browser=chrome&profile=v1" \ -H "X-API-Key: YOUR_KEY"
6 браузеров, Chrome 145-148, дифференциация YaBrowser/YaApp, фильтр по версиям.
curl "https://pfpulse.tech/api/v1/fingerprint/generate?browser=yaapp&version=26.3&profile=v2" \ -H "X-API-Key: YOUR_KEY"
Новейшие отпечатки Chrome 148, расширенные font_data, улучшенный canvas.
curl "https://pfpulse.tech/api/v1/fingerprint/generate?browser=chrome&profile=v3&perfectCanvas=true" \ -H "X-API-Key: YOUR_KEY"
Тарифы Fingerprint
Подписка по req/min. Привязка IP обязательна.
Индивидуальные тарифы доступны по запросу при наличии объёмов — напишите в поддержку.
Warming API
PRODUCTIONAI-прокачка аккаунтов: генерация поведенческих сценариев для Яндекса с учётом соцдем-профиля. LLM создаёт уникальные сценарии, система распределяет интересы 70/20/10 (core/secondary/background), warmup progression автоматически адаптирует интенсивность по дням.
Все warming endpoints доступны по X-API-Key. Базовый URL: https://pfpulse.tech/api/v1/warming/.
Генерация сценариев
Основной endpoint — генерирует Portal-совместимый сценарий прокачки.
POST /api/v1/warming/generate
{
"key_cat": "авто", // категория ключей (авто, недвижимость, медицина...)
"lr": "213", // код региона Яндекса (213=Москва)
"pid": "profile_001", // ID профиля (для persistent socdem)
"archetype": "businessman", // optional: соцдем-архетип
"target_cat": "авто", // optional: целевая категория
"target_intensity": 0.2, // optional: 0.0-1.0
"weights": "search:40,direct:30,suggest:20,referral:10" // optional
}
Ответ
{
"scenario": "openUrl||ya.ru\nwait||2000\nsearch||купить авто москва\n...",
"pid_profile": {
"context_mode": "restore",
"session_count": 5,
"warmup_stage": "warming",
"days_alive": 12
}
}
GET /api/v1/warming/generate/preview
Preview без сохранения сессии. Те же параметры через query string.
curl "https://pfpulse.tech/api/v1/warming/generate/preview?key_cat=авто&lr=213&pid=test1" \ -H "X-API-Key: YOUR_KEY"
AI генерация
AIОпишите задачу на естественном языке — LLM извлечёт параметры и автоматически вызовет генератор сценариев. Модель возвращает готовый Portal-совместимый сценарий за один запрос.
POST /api/v1/warming/ai-generate
{
"message": "Прокачай профиль бизнесмена 35 лет, интересы авто и недвижимость, регион Москва",
"pid": "profile_001" // optional: привязка к профилю
}
Ответ
{
"type": "scenario",
"scenario": "openUrl||ya.ru\nwait||2000\n...",
"params": {
"key_cat": "авто",
"lr": "213",
"archetype": "businessman"
},
"ai_message": "Создал сценарий для бизнесмена 35 лет..."
}
Ключи и сайты
GET /api/v1/warming/keys
Ключевые слова из базы word_keys.db по категории.
curl "https://pfpulse.tech/api/v1/warming/keys?categories=авто,недвижимость&limit=20" \ -H "X-API-Key: YOUR_KEY" // ← {"keys": ["купить авто москва", "автосалон рядом", ...], "total": 1250}
GET /api/v1/warming/sites
Проверенные сайты из sites_checked.db.
curl "https://pfpulse.tech/api/v1/warming/sites?category=авто&limit=10" \ -H "X-API-Key: YOUR_KEY" // ← {"sites": [{"url": "auto.ru", "category": "авто", ...}], "total": 340}
Сессии
GET /api/v1/warming/sessions
Список warming сессий с фильтрацией.
curl "https://pfpulse.tech/api/v1/warming/sessions?limit=20&offset=0" \ -H "X-API-Key: YOUR_KEY"
GET /api/v1/warming/sessions/stats
Агрегированная статистика по сессиям.
curl "https://pfpulse.tech/api/v1/warming/sessions/stats" \ -H "X-API-Key: YOUR_KEY" // ← {"total_sessions": 142, "today": 12, "avg_duration": 45.2}
Справочные данные
Вспомогательные endpoints для получения справочников. Все GET, все требуют X-API-Key.
Список регионов с LR-кодами Яндекса (Москва=213, СПб=2, и т.д.)
Типы источников трафика: search, direct, suggest, referral
Поддерживаемые браузеры: yandex, chrome, edge и др.
Список безопасных реферреров (без Яндекс.Метрики)
Шаблоны сценариев для разных типов поведения
Socdem API — Профили
PRODUCTIONPersistent соцдем-профили привязаны к PID (Profile ID). При первом обращении система создаёт профиль с выбранным архетипом и распределяет интересы: 70% core, 20% secondary, 10% background. Профиль сохраняется между сессиями.
GET /api/v1/socdem/profile
curl "https://pfpulse.tech/api/v1/socdem/profile?pid=profile_001&archetype=businessman" \ -H "X-API-Key: YOUR_KEY" // Ответ: { "pid": "profile_001", "archetype": "businessman", "gender": "male", "age_group": "30-45", "profession": "предприниматель", "interests": ["авто", "недвижимость", "финансы", "путешествия"], "target_cat": "авто", "target_intensity": 0.2, "session_count": 5, "context_mode": "restore", "warmup_stage": "warming", "days_alive": 12 }
GET /api/v1/socdem/interests
Граф интересов для PID — weighted по tier.
curl "https://pfpulse.tech/api/v1/socdem/interests?pid=profile_001" \ -H "X-API-Key: YOUR_KEY" // ← {"interests": [{"cat": "авто", "tier": "core", "weight": 0.70}, ...]}
GET /api/v1/socdem/profiles
Список всех соцдем-профилей клиента с пагинацией.
curl "https://pfpulse.tech/api/v1/socdem/profiles?limit=20&offset=0" \ -H "X-API-Key: YOUR_KEY" // ← {"profiles": [...], "total": 42}
Архетипы
20 предустановленных соцдем-архетипов. Endpoint не требует авторизации.
GET /api/v1/socdem/archetypes
curl "https://pfpulse.tech/api/v1/socdem/archetypes" // Ответ (пример): { "archetypes": [ { "key": "businessman", "name": "Бизнесмен", "gender": "male", "age": "30-45" }, { "key": "mama", "name": "Мама", "gender": "female", "age": "25-35" }, { "key": "student", "name": "Студент", "gender": "any", "age": "18-25" }, // ...ещё 17 архетипов ] }
Подписка Warming
Тарифы warming привязаны к RPM (requests per minute).
GET /api/v1/socdem/tiers
Доступные тарифы (без авторизации).
curl "https://pfpulse.tech/api/v1/socdem/tiers"
GET /api/v1/socdem/subscription
Текущий статус подписки клиента.
curl "https://pfpulse.tech/api/v1/socdem/subscription" \ -H "X-API-Key: YOUR_KEY"
POST /api/v1/socdem/subscribe
curl -X POST "https://pfpulse.tech/api/v1/socdem/subscribe" \ -H "X-API-Key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"tier": "basic"}'
POST /api/v1/socdem/cancel
curl -X POST "https://pfpulse.tech/api/v1/socdem/cancel" \ -H "X-API-Key: YOUR_KEY"
Server Health
GETМониторинг warming-сервера: CPU, RAM, диск, Redis, SQLite, активные сессии.
GET /api/v1/warming/server-health
curl "https://pfpulse.tech/api/v1/warming/server-health" \ -H "X-API-Key: YOUR_KEY" // Ответ: { "status": "healthy", "cpu_percent": 12.5, "memory": { "used_gb": 8.2, "total_gb": 62.0, "percent": 13.2 }, "disk": { "used_gb": 45.0, "total_gb": 460.0 }, "redis": { "connected": true, "keys": 1250 }, "sessions": { "active": 3, "total_today": 142 } }
Legacy API режим
Поддерживаем совместимый формат для клиентов, которые используют стороннюю API-схему
(поля status: 1/0, response). Документация legacy-режима — по запросу.