Документация API
DevShield API v1 — антиспам, антибот и защита админки для любого сайта.
Быстрый старт
1. Зарегистрируйтесь и добавьте сайт в дашборде.
2. Скопируйте API-ключ (ds_...).
3. Вставьте виджет на сайт:
<script async src="https://devshield.ru/widget.js" data-key="ds_ваш_ключ"></script>Готово. Все формы на сайте теперь защищены.
Аутентификация
API-ключ (для /api/check и /api/admin-check)
Передаётся в теле запроса как api_key:
{
"api_key": "ds_ваш_ключ",
...
}JWT (для дашборда и /api/billing, /api/ip-lists)
Cookie access_token (httpOnly, 15 мин) + refresh_token. Токен выдаётся при логине через POST /api/auth/login.
POST /api/check
Основной эндпоинт проверки форм.
Параметры запроса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| api_key | string | Да | API-ключ сайта |
| form_data | object | Нет | Данные формы (ключ-значение) |
| honeypot | string | Нет | Значение скрытого поля |
| time_spent | number | Нет | Время заполнения (секунды) |
| behavior | object | Нет | {mouse, keys, clicks, scroll, touch} |
| bot_detection | object | Нет | {bot: boolean, botKind: string} |
| fingerprint_hash | string | Нет | Хеш отпечатка браузера |
| pow | object | Нет | Ответ на PoW-challenge |
Ответ
{
"verdict": "ham", // "ham" | "challenge" | "spam"
"score": 15, // 0-100
"checks": [
{ "name": "honeypot", "passed": true, "score": 0 },
{ "name": "time_check", "passed": true, "score": 0 },
{ "name": "ip_reputation", "passed": true, "score": 0, "detail": "IP чист" }
],
"challenge": { ... } // только при verdict=challenge
}POST /api/admin-check
Защита страницы входа от брутфорса.
Параметры
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| api_key | string | Да | API-ключ |
| ip | string | Да | IP-адрес клиента |
| username | string | Нет | Логин |
| user_agent | string | Нет | User-Agent браузера |
Ответ
// Разрешено
{ "verdict": "allow", "remaining_attempts": 3 }
// Заблокировано
{ "verdict": "block", "reason": "Превышен лимит попыток входа" }IP-списки
Белый и чёрный список IP-адресов. Поддержка CIDR (например, 192.168.0.0/24).
GET /api/ip-lists
Получить все записи тенанта. Требует JWT.
POST /api/ip-lists
{
"ip": "1.2.3.4", // или "10.0.0.0/24"
"type": "whitelist", // "whitelist" | "blacklist"
"site_id": null, // null = все сайты
"note": "Офисный IP"
}DELETE /api/ip-lists?id=UUID
Удалить запись по ID.
Логика проверки
Whitelist — мгновенный ham (score 0). Blacklist — мгновенный spam (score 100). Проверка происходит до всех остальных scoring-чеков.
Биллинг
POST /api/billing/subscribe
Создать подписку. Требует JWT.
{ "plan": "business" } // "start" | "business" | "agency"
// Ответ:
{ "redirect_url": "https://yoomoney.ru/checkout/...", "payment_id": "..." }POST /api/billing/webhook
Webhook от ЮKassa. Публичный (без авторизации). Обрабатывает payment.succeeded и payment.canceled.
POST /api/billing/cancel
Отмена подписки. Требует JWT.
GET /api/billing/history
История платежей и текущая подписка. Требует JWT.
Тарифы
| План | Цена/мес | Сайтов | Проверок |
|---|---|---|---|
| Free | 0 ₽ | 1 | 1 000/мес |
| Старт | 300 ₽ | 1 | Безлимит |
| Бизнес | 700 ₽ | 3 | Безлимит |
| Агентство | 2 000 ₽ | 10 | Безлимит |
Скоринг и вердикты
Баллы проверок
| Проверка | Баллы | Условие |
|---|---|---|
| honeypot | 100 | Honeypot-поле заполнено |
| time_fast | 80 | Форма отправлена за < 2 сек |
| time_slow | 30 | Форма отправлена через > 3600 сек |
| empty_form | 60 | Все поля формы пусты |
| disposable_email | 30 | Одноразовый email (mailinator и т.п.) |
| ip_reputation | 10-40 | IP в базе спамеров |
| behavior | 25-40 | Нет/мало поведенческих данных |
| botd | 15-70 | Обнаружен headless-браузер |
| fingerprint | 10-50 | Fingerprint с историей спама |
| rate_limit | 50 | > 10 запросов/мин с одного IP |
| ip_list (wl) | 0 | IP в белом списке → instant ham |
| ip_list (bl) | 100 | IP в чёрном списке → instant spam |
Вердикты
| Вердикт | Score | Действие |
|---|---|---|
| ham | 0-49 | Пропустить запрос |
| challenge | 50-79 | PoW-challenge (прозрачный для юзера) |
| spam | 80-100 | Заблокировать |
Коды ошибок
| Код | Описание |
|---|---|
| 400 | Невалидный запрос (отсутствует api_key и т.п.) |
| 401 | Не авторизован (нет JWT или истёк) |
| 403 | Невалидный API-ключ |
| 429 | Лимит запросов или проверок исчерпан |
| 500 | Внутренняя ошибка сервера |
JS-виджет
Автоматически защищает все формы на странице.
Установка
<script async src="https://devshield.ru/widget.js" data-key="ds_ваш_ключ"></script>Что делает
- Добавляет скрытое honeypot-поле в каждую форму
- Замеряет время заполнения формы
- Собирает поведенческие данные (mouse, keys, clicks, scroll, touch)
- Запускает BotD-детекцию
- Генерирует fingerprint хеш
- Отправляет данные на
/api/checkпри submit - Блокирует отправку при вердикте
spam - Прозрачно решает PoW-challenge при
challenge
Настройки
<script async
src="https://devshield.ru/widget.js"
data-key="ds_ваш_ключ"
data-mode="passive" <!-- "active" (блокирует) | "passive" (только логирует) -->
></script>WordPress-плагин
Официальный плагин для WordPress. Устанавливается через wp-admin.
Установка
- Скачайте zip с
devshield.ru/downloads/ - WordPress → Плагины → Добавить → Загрузить
- Активируйте, введите API-ключ в настройках
Возможности
- Защита комментариев, Contact Form 7, WPForms
- Защита wp-login.php от брутфорса
- Автоматическая вставка виджета
- Настройки в WP-admin → Настройки → DevShield
PHP SDK
Composer-пакет для vanilla PHP, WordPress и 1С-Битрикс.
composer require devorra/devshield-phpПроверка формы
$ds = new \Devorra\DevShield\DevShield('ds_ваш_ключ');
$result = $ds->checkForm([
'form_data' => [
'name' => $_POST['name'],
'email' => $_POST['email'],
],
'honeypot' => $_POST['__ds_hp'] ?? '',
'time_spent' => $_POST['__ds_ts'] ?? 0,
]);
if ($result['verdict'] === 'spam') {
http_response_code(403);
die('Спам');
}Защита входа
$ds = new \Devorra\DevShield\DevShield('ds_ваш_ключ');
$ip = \Devorra\DevShield\DevShield::getClientIp();
$result = $ds->checkLogin($ip, $_POST['login'] ?? null);
if ($result['verdict'] === 'block') {
die('Заблокировано: ' . $result['reason']);
}1С-Битрикс
// /local/php_interface/init.php
AddEventHandler('main', 'OnBeforeEventSend', function (&$arFields) {
$ds = new \Devorra\DevShield\DevShield('ds_ваш_ключ');
$result = $ds->checkForm(['form_data' => $arFields]);
if ($result['verdict'] === 'spam') return false;
});FAQ
Где хранятся данные?
В России (Timeweb). Соответствие 152-ФЗ.
Нужна ли CAPTCHA?
Нет. DevShield работает без CAPTCHA — невидимо для пользователя.
Что происходит при вердикте challenge?
Виджет автоматически решает Proof-of-Work задачу (0.5-2 сек). Пользователь ничего не делает.
Как работает без JavaScript?
Используйте PHP SDK или прямые API-вызовы из бэкенда. Виджет не обязателен.
Как отключить проверку одноразовых email?
В дашборде → настройки тенанта. Или через API: поле disposableEmailBlock в tenant.
Поддерживается ли IPv6?
IP-репутация работает с IPv4. IPv6 поддерживается в белых/чёрных списках.
Как связаться с поддержкой?
Email: info@devorra.ru, Telegram: поддержка через бот.