Admin API: реестры блокировок
Методы для реестров заблокированных доменов: список, создание, изменение, удаление, проверка, пробная загрузка, журнал замен и откат.
Восемь методов управляют тем же, что вкладка Настройки → Реестр PL: списками заблокированных доменов, их проверкой и журналом автозамен. Всем методам нужен токен с доступом Полный доступ (full).
Авторизация описана на странице Admin API: обзор и авторизация, формат запросов и общие коды ошибок — на странице Формат запросов, ответов и ошибок. Как работает автозамена — на странице Реестр блокировок (PL) и автозамена домена.
Объект реестра
Методы списка, создания, изменения и проверки возвращают реестр в таком виде:
| Поле | Тип | Описание |
|---|---|---|
id | строка, UUID | Идентификатор реестра |
workspace_id | строка, UUID | Идентификатор команды |
name | строка | Название. Может быть пустым |
url | строка | Адрес списка |
geo | строка | Код страны реестра в верхнем регистре, например PL |
enabled | логическое | Проверка по расписанию включена |
auto_replace | логическое | true — менять домен в потоках, false — только помечать домены и писать в системный лог |
interval_min | число | Интервал проверки в минутах |
reserve_group_id | строка, UUID или null | Группа доменов, из которой берётся замена |
last_fetch_at | дата | Время последней проверки, при которой список получен. Поля нет, пока реестр ни разу не проверен |
last_error | строка | Ошибка или предупреждение последней проверки. Пустая строка, если замечаний нет |
entry_count | число | Сколько записей было в списке при последней успешной проверке. До первой проверки — 0 |
created_at | дата | Время создания |
{
"id": "5b1f0c1e-6f0a-4d0e-9a3b-2c7d8e9f0a11",
"workspace_id": "0d9c8b7a-1234-4abc-8def-001122334455",
"name": "Реестр PL",
"url": "https://registry.example.com/domains.txt",
"geo": "PL",
"enabled": true,
"auto_replace": true,
"interval_min": 30,
"reserve_group_id": "7a6b5c4d-3e2f-4a1b-8c9d-0e1f2a3b4c5d",
"last_fetch_at": "2026-10-04T09:30:00Z",
"last_error": "",
"entry_count": 48213,
"created_at": "2026-10-01T12:00:00Z"
}Реестры
Список реестров
GET /api/v1/blocklist-sourcesВозвращает все реестры команды. Параметров нет.
Ответ — код 200 и массив объектов реестра по дате создания, старые первыми. Если реестров нет, приходит пустой массив.
Добавить реестр
POST /api/v1/blocklist-sourcesСоздаёт реестр. Включённый реестр трекер проверит сам по расписанию; чтобы не ждать, вызовите проверку.
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
url | строка | да | Адрес списка. Должен начинаться с http:// или https:// |
name | строка | нет | Название. По умолчанию пустое |
geo | строка | нет | Код страны из двух букв, например PL. Приводится к верхнему регистру. По умолчанию PL |
enabled | логическое | нет | Проверять по расписанию. По умолчанию true |
auto_replace | логическое | нет | Менять домен автоматически. По умолчанию true |
interval_min | число | нет | Интервал проверки в минутах. По умолчанию 30, минимум 5. Значения от 1 до 4 заменяются на 5, 0 и отрицательные — на 30 |
reserve_group_id | строка, UUID | нет | Резервная группа доменов. Без поля, с null или пустой строкой группа не выбрана, и автозамена не выполняется |
Ответ — код 201 и объект реестра.
curl -X POST https://panel.example.com/api/v1/blocklist-sources \
-H "Api-Key: <токен>" \
-H "Content-Type: application/json" \
-d '{"name":"Реестр PL","url":"https://registry.example.com/domains.txt","geo":"PL","interval_min":30,"reserve_group_id":"7a6b5c4d-3e2f-4a1b-8c9d-0e1f2a3b4c5d"}'Ошибки:
| Код | code | message | Причина |
|---|---|---|---|
400 | bad_request | invalid json | Тело не разобрано как JSON-объект |
400 | bad_request | некорректный идентификатор или значение | reserve_group_id не в формате UUID |
422 | validation | нужен http(s)-адрес реестра | url пуст или начинается не с http:// и не с https:// |
422 | validation | резервная группа доменов не найдена | Группы из reserve_group_id нет в команде |
Изменить реестр
PUT /api/v1/blocklist-sources/{id}Заменяет настройки реестра. {id} — идентификатор реестра.
Тело — те же поля, что при создании, url обязателен. Запись заменяется целиком, поэтому передавайте все поля, а не только изменённые:
- без
nameназвание становится пустым; - без
enabledиauto_replaceоба переключателя включаются; - без
interval_minинтервал становится30; - без
reserve_group_idрезервная группа сбрасывается; - без
geoили с пустой строкой код страны остаётся прежним.
Ответ — код 200 и объект реестра. Поля last_fetch_at, last_error и entry_count при изменении сохраняются.
Ошибки — те же, что при создании, 404 not_found, если реестра с таким {id} нет, и 400 bad_request, если {id} не в формате UUID.
Запрос PUT без reserve_group_id сбрасывает резервную группу, и автозамена перестаёт выполняться. Сначала получите реестр из списка и отправьте его поля обратно вместе с правкой.
Удалить реестр
DELETE /api/v1/blocklist-sources/{id}Удаляет реестр. Записи журнала замен остаются.
Ответ — код 204 без тела. Если реестра нет — 404 not_found, если {id} не в формате UUID — 400 bad_request.
Проверка и пробная загрузка
На оба метода действует ограничение частоты.
Проверить реестр сейчас
POST /api/v1/blocklist-sources/{id}/checkСкачивает список, сверяет с ним домены и, если у реестра включена автозамена, меняет домены в потоках. То же делает кнопка Проверить в строке реестра. Метод работает и для реестра с enabled: false. Тело запроса не нужно.
Ответ приходит после окончания проверки — код 200 и объект реестра с обновлёнными last_fetch_at, entry_count и last_error.
Код 200 не означает, что проверка прошла без замечаний. Прочитайте last_error: в нём остаётся предупреждение, например автозамена не выполнена: не выбрана резервная группа доменов — менять не на что. Тексты разобраны в разделе Если не получилось.
Ошибки:
| Код | code | Причина |
|---|---|---|
400 | bad_request | {id} не в формате UUID |
404 | not_found | Реестра с таким {id} нет |
502 | fetch_failed | Список не получен или в нём нет доменов. Причина — в message, она же записывается в last_error реестра. last_fetch_at и entry_count не меняются |
Примеры message при коде 502:
реестр ответил 404 Not Found— сервер списка вернул не код200;ответ реестра больше 64 МиБ — принимать нельзя, снимок был бы неполным;в ответе реестра не найдено ни одного домена — источник отдал не тот формат или заглушку;Get "https://registry.example.com/domains.txt": …— сетевая ошибка, после двоеточия идёт её текст, напримерслишком много редиректов.
Пробная загрузка списка
POST /api/v1/blocklist-sources/testСкачивает список по адресу и показывает, что в нём распознано и какие домены команды в нём есть. Ничего не сохраняет и не меняет. В панели это кнопка Проверить рядом с полем Адрес списка.
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
url | строка | да | Адрес списка, начинается с http:// или https:// |
Ответ — код 200:
| Поле | Тип | Описание |
|---|---|---|
total | число | Сколько записей распознано в списке |
sample | массив строк или null | Первые записи списка, не больше 20. null, если записей нет |
matched | массив строк | Домены из раздела Домены, найденные в списке, по алфавиту. Пустой массив, если совпадений нет |
curl -X POST https://panel.example.com/api/v1/blocklist-sources/test \
-H "Api-Key: <токен>" \
-H "Content-Type: application/json" \
-d '{"url":"https://registry.example.com/domains.txt"}'{
"total": 48213,
"sample": ["blocked-one.example", "blocked-two.example"],
"matched": ["go.example.com"]
}Если total равен 0, по адресу нет списка доменов в распознаваемом формате.
Ошибки:
| Код | code | Причина |
|---|---|---|
422 | validation | Тело не разобрано или url начинается не с http:// и не с https://. message — нужен http(s)-адрес реестра |
502 | fetch_failed | Список не получен. Причина — в message |
Журнал замен
Список замен
GET /api/v1/domain-replacementsВозвращает записи об автоматических заменах домена в потоках, новые первыми.
| Параметр | Тип | Обязательность | Описание |
|---|---|---|---|
limit | число | нет | Сколько записей вернуть. По умолчанию 100, максимум 500. При значении вне диапазона от 1 до 500 возвращается 100 записей |
Ответ — код 200 и массив записей. Если замен не было, приходит пустой массив.
| Поле | Тип | Описание |
|---|---|---|
id | строка, UUID | Идентификатор записи. Нужен для отката |
workspace_id | строка, UUID | Идентификатор команды |
stream_id | строка, UUID или null | Поток, в котором заменён домен. null, если поток удалён |
campaign_id | строка, UUID или null | Кампания потока. null, если кампания удалена |
stream_name | строка | Название потока на момент замены |
old_domain | строка | Домен, который стоял в потоке |
new_domain | строка | Домен из резервной группы, поставленный вместо него |
geo | строка | Код страны реестра |
reason | строка | Причина, например домен найден в реестре PL (запись «example.com») |
reverted | логическое | true, если замена откачена |
created_at | дата | Время замены |
Откатить замену
POST /api/v1/domain-replacements/{id}/revertВозвращает в поток прежний домен и снимает с него метку «в реестре». {id} — идентификатор записи журнала. Тело запроса не нужно.
В ссылке потока меняется только домен. Запись журнала получает reverted: true. Если домен по-прежнему есть в списке, следующая проверка снова пометит и заменит его.
Ответ — код 204 без тела.
Ошибки:
| Код | code | message | Причина |
|---|---|---|---|
400 | bad_request | некорректный идентификатор или значение | {id} не в формате UUID |
404 | not_found | resource not found | Записи с таким {id} нет |
409 | conflict | замена уже откачена | Запись уже отменена |
409 | conflict | в потоке уже другой домен — откат не нужен | Ссылку в потоке изменили после замены |
410 | gone | поток удалён — откатывать нечего | Потока больше нет или его кампания в архиве |
422 | validation | не удалось разобрать ссылку потока | Ссылка в потоке не разбирается как адрес |
Ограничение частоты
POST /api/v1/blocklist-sources/{id}/check и POST /api/v1/blocklist-sources/test принимают не больше 10 запросов в минуту с одного IP-адреса. Счётчик общий для обоих методов. В него попадают и нажатия кнопки Проверить в панели с того же IP-адреса, а также запросы активации лицензии и сохранения настроек IP2Proxy. При превышении приходит код 429:
{"code": "rate_limited", "message": "слишком много запросов, попробуйте позже"}Повторите запрос через минуту. На остальные методы группы ограничение не действует.