# API проверки блогеров — check.adisom.ai

База: реестр иноагентов Минюста, перечень террористов и экстремистов Росфинмониторинга, перечень
экстремистских организаций, список лиц с ограничительными мерами (115-ФЗ), а также кандидаты
«репутационный риск» — люди и каналы, о которых писали СМИ в негативном контексте (это не реестр).
Обновление: реестры и новости — ежедневно.

Базовый URL: `https://check.adisom.ai`. Все ответы — JSON (UTF-8). Даты — `YYYY-MM-DD`.

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

Персональный API-ключ (выдаётся в аккаунте: /account). Передавайте одним из способов:

- заголовок `Authorization: Bearer <ключ>` (рекомендуется)
- заголовок `X-Api-Token: <ключ>`
- параметр запроса `?token=<ключ>`

Без ключа доступны только `GET /health`, `GET /docs`, `GET /docs.md`. Ошибки: `401` — нет/неверный ключ,
`403` — недостаточно прав, `400` — неверный запрос, `404` — не найдено, `429` — превышен лимит.

## GET /check?q=<запрос>

Одиночная проверка. `q` — одно из:

- ссылка на канал/аккаунт: YouTube (`youtube.com/@handle`, `/channel/UC…`, `/c/…`, `/user/…`, устаревший `youtube.com/Name`),
  Telegram (`t.me/…`, в т. ч. инвайт-ссылки), Instagram, VK, TikTok, Twitch, OK, Дзен, Rutube, Max, Facebook, X, Threads, Boosty, Patreon;
- ФИО («Фамилия Имя Отчество», порядок слов не важен), псевдоним или название канала;
- название организации; ИНН (10/12 цифр) или ОГРН (13/15 цифр).

Параметр `all=1` — включать записи, исключённые из реестров.

Ответ:

```json
{"query": "https://t.me/tvrain", "found": true, "matches": [ {…match…} ]}
```

Объект `match`:

| поле | описание |
|---|---|
| `url` | постоянная ссылка на карточку, например `/s/724` |
| `subject` | `{id, kind: "person"|"org", name, birth_date, birth_place, inn, ogrn}` |
| `match` | `{type, confidence, via?}` — как найдено (см. ниже) |
| `designations` | список записей реестров: `{registry, subject_type, date_added, date_removed, is_active, basis, status}` |
| `aliases` | псевдонимы, прежние имена, названия каналов |
| `socials` | аккаунты: `{platform, handle, url, source, confidence, title?, status?, current_handle?, channel_id?}` |
| `digest` | блок «Кратко»: `{facts: [{text, url, date}], updated_at}` — факты из публикаций, у каждого ровно один источник |
| `mentions` | все публикации: `{url, title, quote, kind, date}` |
| `summary`, `wikidata` | краткая справка и ссылка на Wikidata, если есть |

`registry`: `foreign_agent` (иноагент, Минюст), `terrorist_extremist` (перечень Росфинмониторинга),
`extremist_org` (экстремистская организация), `restrictive_measures` (115-ФЗ), `media_risk` (репутационный
риск по публикациям; `status`: `new`/`ambiguous` — не проверено модератором, `confirmed`).

`match.type` и уверенность: `social` 1.0 — совпала ссылка на аккаунт (0.9–0.95: по ID канала или нику);
`exact` 1.0 — точное ФИО/название; `inn`/`ogrn` 1.0; `alias` 0.9 — псевдоним; `linked` 0.9 — канал ссылается
на аккаунт фигуранта (в `via` — какой); `partial` 0.5/0.3 — частичное совпадение имени или только фамилия;
`title` 0.4 — по названию канала. Всё ниже 0.9 требует ручной проверки.

Рекомендуемая трактовка: `found=false` — размещаться можно; есть match с `confidence ≥ 0.9` и реестром,
отличным от `media_risk`, — **нельзя**; только `media_risk` или `confidence < 0.9` — **ручная проверка**.

## POST /check

Пакетная проверка, до 500 запросов: тело `{"queries": ["…", "…"], "all": false}` →
`{"results": [ {"query", "found", "matches"}, … ]}` в том же порядке.

## GET /public/subject/<id>

Карточка по id (то же, что в `matches`, с `match.type = "direct"`). HTML-версия: `/s/<id>`.

## GET /health

Без ключа. `{"ok", "subjects", "active": {registry: n}, "counts": {registry: {person, org}}, "last_fetch": {source: время}}`.

## Вход по ссылке

`https://check.adisom.ai/?token=<ключ>` (или любая страница, например `/s/372?token=<ключ>`) — сервер
проверяет ключ, ставит cookie-сессию и перенаправляет на тот же адрес без ключа. Удобно для ссылок из
таблиц и ботов; помните, что ключ в URL может остаться в истории браузера у получателя.

## Аккаунт (для интерфейса)

`POST /login` `{login, password}` или `{token}` → cookie-сессия; `POST /logout`; `GET /me`;
`POST /me` `{login?, email?, password?, current_password}`; `GET|POST /me/api-key` (показать / перевыпустить).

## Примеры

```bash
curl -H "Authorization: Bearer $KEY" "https://check.adisom.ai/check?q=https://www.youtube.com/@vdud"
curl -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"queries":["https://t.me/tvrain","Хестанов Андрей Владимирович","7709471429"]}' https://check.adisom.ai/check
```

Лимиты: до 500 запросов в одном `POST /check`; проверка ссылки, которой нет в базе, может занять 2–5 с
(резолв канала). Результат носит справочный характер; первоисточники — в `designations.basis` и `mentions`.
