PRODUCTION

pfpulse.tech API

Решение капч Яндекса и генерация Android-отпечатков — через REST API. Два HTTP-запроса для капч (create + result), один GET для fingerprints. Разворачивать ничего не нужно.

SmartCaptcha
99.6%
точность · 70-90 мс
PazlCaptcha
99.4%
exact match · 17 мс
TextCaptcha
78.7%
OCR · ~250 мс · бесплатно

Аутентификация

API поддерживает два способа авторизации. Для внешних интеграций используйте API-ключ:

Заголовок X-API-Key (рекомендуемый)
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":"..."}'
Query-параметр (альтернативный)
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'ов. Решение = номер правильного шага слайдера.

Запрос — два формата

V2 (рекомендуемый)
{
  "type":  "PazlCaptcha",
  "image": "<base64 PNG>",       // картинка паззла
  "task":  "[10,24,5,9,8,...]"   // JSON-массив swap-индексов
}

image — из JS-стейта imageSrc, в base64. task — массив из JS-стейта, чётная длина. Регекспы: imageSrc:"(https://[^"]+)", task:"(\[[\d,]+\])".

V1 (Capsola-совместимый)
{
  "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 exception
  • ERROR_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": "причина" }

Коды ошибок

HTTP 400 — плохой запрос
  • Неизвестный type
  • Нет обязательных полей (SmartCaptcha: click+task, PazlCaptcha: image+task)
  • Битая картинка / не base64 / <100 байт / >200 КБ
HTTP 200 + status: "error"
  • "no detections" — не нашли элементы (шумная картинка)
  • "counter mismatch" — внутренняя несогласованность
  • "timeout" — не уложились в SLA

При ошибке запросите новую капчу — retry той же картинкой не поможет.

HTTP 404 — task_id не найден

TTL задачи истёк (120 сек) или неверный ID.

Polling

  1. POST /captcha/createtask_id
  2. Ждёте 1-2 сек (solve обычно <200 мс, но буфер на сеть)
  3. POST /captcha/result с {"task_id": "..."}
  4. "pending" — повторить через 2-5 сек
  5. "ready" — забирайте solution
  6. "error" — запросите новую капчу
  7. TTL задачи — 120 сек

Лимиты и SLA

Latency
create → result: p50 <200 мс · p99 <600 мс
Throughput
~2000 solve/min, масштабируется горизонтально
Task TTL
120 сек от /create
Max image
200 КБ (PNG/JPG base64)

Fingerprint API

PRODUCTION

Генерация Android-отпечатков из базы 457 реальных устройств. Canvas, WebGL, AudioContext, сенсоры, шрифты — снятые с настоящих телефонов. Подписка по req/min, привязка IP.

Эндпоинт

GET /api/v1/fingerprint/generate
  -H "X-API-Key: YOUR_KEY"

Параметры

browser — см. версии ниже (default: chrome)

profilev1 (default) или v2

version — фильтр по версии браузера (для v2)

perfectCanvastrue для 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

Три профиля генерации на выбор.

V1 — стабильная

9 браузеров, Chrome 146, проверенные отпечатки.

chrome yandex samsung opera edge atom mi huawei honor
curl "https://pfpulse.tech/api/v1/fingerprint/generate?browser=chrome&profile=v1" \
  -H "X-API-Key: YOUR_KEY"
V2 — мульти-версии

6 браузеров, Chrome 145-148, дифференциация YaBrowser/YaApp, фильтр по версиям.

chrome 145-147 yandex 25.12, 26.3 yaapp 25.12, 26.3 samsung 28-30 opera 95-97 edge 145-146
curl "https://pfpulse.tech/api/v1/fingerprint/generate?browser=yaapp&version=26.3&profile=v2" \
  -H "X-API-Key: YOUR_KEY"
V3 — beta, Chrome 148

Новейшие отпечатки 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 обязательна.

S
3 200 ₽/мес
10 RPM
M
4 000 ₽/мес
30 RPM
L
4 800 ₽/мес
60 RPM
XL
5 600 ₽/мес
120 RPM
XXL
8 000 ₽/мес
300 RPM
Ultra
11 200 ₽/мес
600 RPM

Индивидуальные тарифы доступны по запросу при наличии объёмов — напишите в поддержку.

Warming API

PRODUCTION

AI-прокачка аккаунтов: генерация поведенческих сценариев для Яндекса с учётом соцдем-профиля. LLM создаёт уникальные сценарии, система распределяет интересы 70/20/10 (core/secondary/background), warmup progression автоматически адаптирует интенсивность по дням.

Архетипы
20
соцдем-профилей
Распределение
70/20/10
core / secondary / bg
AI Drift
LLM
генерация сценариев

Все 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.

GET /api/v1/warming/regions

Список регионов с LR-кодами Яндекса (Москва=213, СПб=2, и т.д.)

GET /api/v1/warming/traffic-sources

Типы источников трафика: search, direct, suggest, referral

GET /api/v1/warming/browsers

Поддерживаемые браузеры: yandex, chrome, edge и др.

GET /api/v1/warming/referers

Список безопасных реферреров (без Яндекс.Метрики)

GET /api/v1/warming/templates

Шаблоны сценариев для разных типов поведения

Socdem API — Профили

PRODUCTION

Persistent соцдем-профили привязаны к 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-режима — по запросу.