Публичный API webfas

webfas — облачный WAF: reverse-proxy защита сайтов и API для российского рынка. Всё, что доступно в личном кабинете, доступно и через HTTP API — управление доменами, журналом событий безопасности, правилами, Anti-Bot, сертификатами и биллингом.

API находится в разработке. Эта страница описывает целевой контракт, по которому пишется бэкенд. До публичного запуска состав полей и эндпоинтов может уточняться без обратной совместимости. Не закладывайтесь на контракт в production-интеграциях — следите за обновлениями на этой странице.

Обзор

Базовый URL
https://api.webfas.ru/v1
Аутентификация
Authorization: Bearer <jwt>
Формат данных
JSON (application/json), кодировка UTF-8
Формат ошибок
{ "error": { "code": "…", "message": "…" } }
Пагинация списков
запрос ?page=&per=&sort=&filters… → ответ { items, total, page, per }
Идентификаторы
ULID — сортируемые по времени, 26 символов
Время
ISO 8601, всегда UTC — например 2026-08-22T14:30:00Z

Пример запроса и ошибочного ответа:

GET /v1/domains?page=1&per=20 HTTP/1.1
Host: api.webfas.ru
Authorization: Bearer eyJhbGciOiJIUzI1NiIs…

HTTP/1.1 401 Unauthorized
Content-Type: application/json

{ "error": { "code": "unauthorized", "message": "Токен просрочен или отозван" } }

Токен выдаётся после POST /auth/login (и POST /auth/2fa, если включена двухфакторная аутентификация) либо создаётся как долгоживущий API-токен в разделе «Интеграции» кабинета.

Сущности

Поля и типы соответствуют zod-схемам фронтенда (src/entities/index.ts) — это единый источник истины для кабинета и бэкенда. Типы указаны в TS-нотации; ulid — строковый ULID, ISO 8601 — строка даты-времени в UTC.

Account аккаунт компании

ПолеТипОписание
idulidИдентификатор аккаунта
namestringНазвание компании
plan'start' | 'business' | 'enterprise'Тарифный план
createdAtISO 8601Дата регистрации

User пользователь кабинета

ПолеТипОписание
idulidИдентификатор пользователя
emailstringE-mail (логин)
namestringИмя и фамилия
role'owner' | 'admin' | 'analyst' | 'viewer'Роль в команде
twoFabooleanВключена ли двухфакторная аутентификация
lastLoginAtISO 8601 | nullПоследний вход; null — ещё не входил

Domain защищаемый домен

ПолеТипОписание
idulidИдентификатор домена
hoststringИмя хоста, например example.com
mode'monitor' | 'partial' | 'block'Режим WAF: наблюдение / частичная / полная блокировка
protectedbooleanПроксируется ли трафик через webfas
originIpstringIP исходного сервера (в кабинете скрыт точками)
reqPerDaynumberЗапросов за сутки
blockedPerDaynumberБлокировок за сутки
p50MsnumberМедианная задержка обработки, мс
cert{ issuer, validTo, auto }Сводка сертификата: издатель, срок действия, автопродление
createdAtISO 8601Дата добавления домена
monitorDaysoptionalnumberДней в режиме мониторинга — для подсказки «пора включать блокировку»

SecurityEvent событие безопасности

ПолеТипОписание
idulidИдентификатор события
tsISO 8601Момент запроса
domainIdulidДомен, на который пришёл запрос
verdict'blocked' | 'challenged' | 'passed'Вердикт WAF
attackTypestringТип атаки: SQLi, XSS, path traversal и т. д.
methodstringHTTP-метод запроса
pathstringПуть запроса
payloadExcerptstringВредоносный фрагмент запроса. Заведомо враждебная строка — выводить только как текст, без интерпретации HTML
ipstringIP источника
countrystringСтрана источника (ISO-код)
asnstringАвтономная система источника
ja4stringJA4-отпечаток TLS-клиента
ruleIdstring | nullСработавшее правило; null — вердикт вынесен движком
confidencenumber | nullУверенность движка, 0…1
processingMsnumberВремя обработки запроса, мс
userAgentstringUser-Agent клиента

Rule правило WAF

ПолеТипОписание
idulidИдентификатор правила
namestringНазвание
scopeulid | nullДомен действия; null — все домены аккаунта
kind'custom' | 'exception' | 'vpatch'Вид: пользовательское / исключение / виртуальный патч
exprstringВыражение правила (текстовый DSL)
enabledbooleanВключено ли
hits7dnumberСрабатываний за 7 дней
authorstringКто создал
createdAtISO 8601Дата создания
cveoptionalstringДля виртуальных патчей: закрываемая уязвимость
productoptionalstringДля виртуальных патчей: уязвимый продукт
reasonoptionalstringДля исключений: причина создания

BotSignature сигнатура бота

ПолеТипОписание
idulidИдентификатор сигнатуры
namestringНазвание бота или семейства
class'good' | 'bad' | 'suspicious'Класс: полезный / вредоносный / подозрительный
action'block' | 'challenge' | 'pass'Действие при обнаружении
sharenumberДоля в бот-трафике, %
requests24hnumberЗапросов за последние 24 часа

Incident DDoS-инцидент

ПолеТипОписание
idulidИдентификатор инцидента
domainIdulidАтакуемый домен
startedAtISO 8601Начало атаки
endedAtISO 8601 | nullОкончание; null — атака продолжается
peakRpsnumberПиковая нагрузка, запросов в секунду
status'active' | 'mitigated'Статус: активен / отражён
vectorstringВектор атаки
timelineArray<{ ts, text }>Таймлайн: отметки времени и что произошло

ApiEndpoint эндпоинт клиента (API Security)

ПолеТипОписание
idulidИдентификатор записи
domainIdulidДомен, которому принадлежит эндпоинт
methodstringHTTP-метод
pathstringПуть эндпоинта
schemaMatchnumberСоответствие OpenAPI-схеме, доля 0…1
violations24hnumberНарушений схемы за 24 часа
strictbooleanСтрогий режим: блокировать запросы вне схемы
shadowbooleanShadow-API: есть в трафике, но отсутствует в схеме

Certificate TLS-сертификат

ПолеТипОписание
idulidИдентификатор сертификата
domainIdulidДомен, к которому привязан
hoststringИмя хоста в сертификате
issuerstringИздатель
validFromISO 8601Действителен с
validToISO 8601Действителен до
autobooleanАвтопродление включено
status'valid' | 'expiring' | 'expired'Статус: действителен / истекает / истёк
daysLeftnumberДней до окончания срока

ApiToken токен интеграции

ПолеТипОписание
idulidИдентификатор токена
namestringНазвание (для чего создан)
scopesstring[]Разрешённые области доступа
lastUsedAtISO 8601 | nullПоследнее использование; null — не использовался
createdAtISO 8601Дата создания
prefixstringПрефикс ключа; полный секрет показывается один раз при создании

Invoice счёт

ПолеТипОписание
idulidИдентификатор счёта
periodstringРасчётный период
amountnumberСумма, ₽
status'paid' | 'pending' | 'overdue'Статус: оплачен / ожидает / просрочен
pdfUrlstringСсылка на PDF-версию счёта

Usage потребление ресурсов

ПолеТипОписание
trafficTbnumberИзрасходовано трафика, ТБ
trafficLimitTbnumberЛимит трафика по тарифу, ТБ
domainsnumberПодключено доменов
domainsLimitnumberЛимит доменов по тарифу
requestsnumberЗапросов за период
requestsLimitnumberЛимит запросов по тарифу
forecast{ date, addTb, price } | nullПрогноз исчерпания трафика: дата и стоимость докупки; null — перерасход не прогнозируется

Контракт также включает служебные сущности Session, Channel, NotificationRule, AuditEntry и Ticket — их подробное описание появится к публичному запуску.

Эндпоинты

Все пути указаны относительно базы https://api.webfas.ru/v1. Списочные эндпоинты поддерживают пагинацию и фильтры (см. Обзор). Сегменты вида :id — path-параметры (ULID).

Авторизация

МетодПутьНазначение
POST/auth/registerРегистрация. Отвечает 202 { status: "verification_sent" } одинаково для свободного и занятого адреса — по ответу нельзя проверить, есть ли аккаунт
POST/auth/verifyПодтверждение почты по ссылке из письма; сразу открывает сессию
POST/auth/resend-verificationПовторная отправка письма подтверждения
POST/auth/loginВход по e-mail и паролю; при включённой 2FA возвращает { twoFaRequired, challengeId }
POST/auth/2faПодтверждение входа кодом из приложения или резервным кодом вида WF-XXXX-XXXX
POST/auth/refreshОбмен httpOnly-cookie на новый токен запросов. Токен живёт 30 минут, cookie ротируется на каждом обмене
POST/auth/recoverЗапрос восстановления пароля; ответ одинаков независимо от существования адреса
GET/auth/reset/checkЖива ли ссылка восстановления — до показа формы
POST/auth/resetНовый пароль по ссылке из письма. Закрывает все прежние сессии
POST/auth/logoutВыход, отзыв текущей сессии

Профиль и сессии

МетодПутьНазначение
GET/meТекущий пользователь и аккаунт
PATCH/meИзменение профиля (имя, пароль, настройки 2FA)
GET/me/sessionsСписок активных сессий
DELETE/me/sessionsЗавершить все сессии, кроме текущей
PATCH/me/passwordСмена пароля; закрывает остальные устройства
GET/me/2faСостояние второго фактора и остаток резервных кодов
POST/me/2fa/initСекрет и ссылка otpauth:// для QR-кода
POST/me/2fa/enableВключение по коду из приложения; в ответе — десять резервных кодов, показываются один раз
POST/me/2fa/codesПеревыпуск резервных кодов (старые перестают работать)
POST/me/2fa/disableОтключение — тоже по коду: украденная сессия не снимет фактор

Домены

МетодПутьНазначение
GET/domainsСписок доменов аккаунта
POST/domainsДобавить домен (начало онбординга)
GET/domains/:idКарточка домена
PATCH/domains/:idИзменить настройки: режим WAF, origin-IP и другое
DELETE/domains/:idУдалить домен из защиты
POST/domains/:id/verify-dnsПроверить, что DNS-записи переключены на webfas
POST/domains/:id/pauseПриостановить или возобновить защиту
POST/domains/:id/cache/purgeСбросить кэш домена

События безопасности

МетодПутьНазначение
GET/eventsЖурнал событий: фильтры по периоду, домену, вердикту, типу атаки, поиск
GET/events/:idДеталка события: payload, JA4, ASN, гео
POST/events/:id/exception«Ложное срабатывание»: создаёт Rule с kind = exception
SSE/events/streamЖивой поток событий и счётчиков — см. SSE-поток

Правила

МетодПутьНазначение
GET/rulesСписок правил: свои, исключения, виртуальные патчи
POST/rulesСоздать правило
GET/rules/:idОдно правило
PATCH/rules/:idИзменить правило, включить или выключить
DELETE/rules/:idУдалить правило
POST/rules/previewПредпросмотр по трафику за сутки → { matched24h, samples[] }

Anti-Bot

МетодПутьНазначение
GET/antibot/statsСтатистика: люди / полезные боты / вредоносные боты, временной ряд
GET/antibot/signatures/:idСигнатура бота
PATCH/antibot/signatures/:idИзменить действие для сигнатуры: block / challenge / pass

DDoS-защита

МетодПутьНазначение
GET/incidentsИстория DDoS-инцидентов
GET/incidents/:idДеталка инцидента с таймлайном
GET/ddos/limitsТекущие лимиты: чувствительность, RPS на IP, burst
PUT/ddos/limitsОбновить лимиты

API Security

МетодПутьНазначение
GET/apisec/schemasЗагруженные OpenAPI-схемы
POST/apisec/schemasЗагрузить OpenAPI-схему (YAML или JSON)
GET/apisec/endpointsОбнаруженные эндпоинты, включая shadow-API
PATCH/apisec/endpoints/:idИзменить настройки эндпоинта, включить строгий режим

Аналитика

МетодПутьНазначение
GET/analytics/timeseriesВременной ряд: ?metric=&from=&to=&groupBy=
GET/analytics/breakdownРазбивка по измерению: ?dim= (тип атаки, страна, домен…)

Сертификаты

МетодПутьНазначение
GET/certsСписок TLS-сертификатов
POST/certs/:id/renewПродлить сертификат сейчас
POST/certs/uploadЗагрузить собственный сертификат

Уведомления и каналы

МетодПутьНазначение
GET/notifications/matrixМатрица «событие × канал» и порог всплеска
PUT/notifications/matrixОбновить матрицу уведомлений
GET/channelsКаналы доставки: e-mail, Telegram, webhook
POST/channelsПодключить канал
DELETE/channels/:idОтключить канал

API-токены

МетодПутьНазначение
GET/tokensСписок токенов интеграций
POST/tokensСоздать токен; полный секрет возвращается один раз
DELETE/tokens/:idОтозвать токен

Биллинг

МетодПутьНазначение
GET/billing/planТекущий тариф и дата следующего списания
GET/billing/usageПотребление ресурсов и прогноз перерасхода
GET/billing/invoicesСчета с ссылками на PDF
POST/billing/change-planСменить тарифный план

Команда и журнал действий

МетодПутьНазначение
GET/teamУчастники команды
POST/teamПригласить участника
PATCH/team/:idИзменить роль участника
DELETE/team/:idУдалить участника
GET/auditЖурнал действий с фильтрами

Поддержка

МетодПутьНазначение
GET/ticketsСписок тикетов
POST/ticketsСоздать тикет, опционально с привязкой к событию
GET/tickets/:idТикет с перепиской
POST/tickets/:id/messagesНаписать сообщение в тикет

ИИ-консультант

Консультант по настройке защиты. Ключи провайдеров живут на сервере: клиент отправляет текст вопроса, ответ приходит потоком text/event-stream (события start, delta, done, error).

МетодПутьНазначение
GET/assistant/configДоступные модели, можно ли выбирать модель, остаток дневной квоты, заготовки вопросов
GET/assistant/chatsДиалоги текущего пользователя
POST/assistant/chatsСоздать диалог
GET/assistant/chats/:idДиалог с историей сообщений
POST/assistant/chats/:id/messagesВопрос модели; ответ идёт потоком SSE
DELETE/assistant/chats/:idУдалить диалог

Мастер настройки

МетодПутьНазначение
GET/wizardШаги ввода защиты в работу с прогрессом аккаунта
POST/wizard/steps/:idОтметить шаг: todo, in_progress, done, skipped (обязательные шаги не пропускаются)
POST/wizard/resetНачать мастер заново
GET/wizard/toursОбучающие туры по интерфейсу и их состояние
POST/wizard/tours/:idОтметить тур пройденным или отложенным

SSE-поток событий

Живая лента кабинета работает поверх стандартного Server-Sent Events. Откройте долгоживущее соединение — сервер будет присылать именованные события по мере их появления.

Эндпоинт
GET  https://api.webfas.ru/v1/events/stream
Заголовки
Accept: text/event-stream, Authorization: Bearer <jwt>
Типы событий
security_event · counters · incident
eventdataКогда приходит
security_event SecurityEvent Новое событие безопасности: блокировка, челлендж или пропуск запроса
counters { requests, blocked, challenged, … } Периодическое обновление суточных счётчиков для метрик-плиток
incident Incident Начало, обновление или завершение DDoS-инцидента

Пример потока:

event: security_event
data: {"id":"01J5X8…","ts":"2026-08-22T11:03:41Z","verdict":"blocked","attackType":"SQLi","path":"/catalog", …}

event: counters
data: {"requests":2412380,"blocked":38214,"challenged":4120}

event: incident
data: {"id":"01J5XA…","status":"active","peakRps":214000, …}

При обрыве соединения переподключайтесь с заголовком Last-Event-ID — сервер дошлёт пропущенные события в пределах окна ретрансляции.

Статус API

Часть API уже работает, часть — ещё нет. Отвечают разделы /auth, /me, /assistant и /wizard: они обслуживают личный кабинет. Разделы защиты трафика — домены, события, правила, Anti-Bot, DDoS, API Security, аналитика, биллинг — возвращают 501 not_implemented с заголовком Retry-After, пока не запущен обработчик трафика: так интеграция отличает «ещё не готово» от опечатки в пути. Отдельные поля и коды ошибок до открытия публичного доступа могут измениться. Ранний доступ — hello@webfas.ru.