🔌

ПУБЛИЧНЫЙ API

Подключай к боту, сервису или таблице. GET-запросы, без ключей, ответ в JSON.

📊 623 жалоб в базе ⚡ Без ключей · Бесплатно
📡 Интерактивная документация (OpenAPI / Swagger UI)
Quickstart — за 30 секунд
1. Запрос (curl / terminal)
curl https://aff.top/api/check/mostbet
2. Ответ (200 OK, JSON)
{
  "found": true,
  "username": "mostbet",
  "reports_count": 23,
  "categories": ["gambling"]
}
💡 found: false = username чист ИЛИ ещё не проверялся — это не гарантия
Base URL
https://aff.top

Все запросы — GET, без авторизации. Формат ответа — JSON. Без ключей, без rate-limits на чтение.

GET

/api/check/{username}

— проверить спамера

Проверяет, есть ли username в базе. Передай с @ или без — работает в обоих случаях. Если найден — вернёт статистику и связанные компании.

Параметры пути

Параметр Тип Описание
username string Telegram username. Знак @ необязателен.
Пример запроса curl
curl https://aff.top/api/check/spammer_username
200 — найден
{
  "found": true,
  "username": "spammer_username",
  "reports_count": 23,
  "confidence_max": 75,
  "first_seen": "2026-01-15T10:23:00Z",
  "last_seen": "2026-03-10T18:41:00Z",
  "categories": ["gambling", "crypto"],
  "companies": ["Mostbet", "1xBet"],
  "url": "https://aff.top/reports?q=spammer_username"
}
404 — не найден
{
  "found": false,
  "username": "clean_user",
  "reports_count": 0
}
GET

/api/companies

— рейтинг компаний

Компании по числу жалоб. Есть пагинация и фильтр по slug.

Query параметры

Параметр Тип По умолчанию Описание
limit integer 50 Записей на страницу. Макс. 200.
page integer 1 Номер страницы.
slug string Фильтр по конкретной компании.
Примеры
curl "https://aff.top/api/companies?limit=10&page=1"
curl "https://aff.top/api/companies?slug=mostbet"
200 OK
{
  "data": [
    {
      "id": 1,
      "name": "Mostbet",
      "slug": "mostbet",
      "reports_count": 142,
      "url": "https://aff.top/company/mostbet"
    },
    ...
  ],
  "total": 8029,
  "page": 1,
  "pages": 161
}
GET

/api/spammers

— список спамеров

Спамеры с известным username. Можно фильтровать по категории или искать конкретный аккаунт.

Query параметры

Параметр Тип По умолчанию Описание
limit integer 50 Записей на страницу. Макс. 200.
username string Поиск конкретного пользователя.
category string Фильтр по категории: gambling crypto nutra traffic affiliate job adult forex tools payments infobiz other
Примеры
curl "https://aff.top/api/spammers?limit=20"
curl "https://aff.top/api/spammers?category=gambling"
curl "https://aff.top/api/spammers?username=someuser"
200 OK
{
  "data": [
    {
      "username": "spammer123",
      "reports_count": 14,
      "last_seen": "2026-03-10T18:41:00Z",
      "category": "gambling",
      "url": "https://aff.top/reports?q=spammer123"
    },
    ...
  ],
  "total": 187
}
GET

/api/search

— live-поиск

Поиск по компаниям и спамерам одновременно. Возвращает оба типа результатов.

Query параметры

ПараметрТипОписание
qstringПоисковый запрос (мин. 2 символа). Компания, @username или домен.
Пример
curl "https://aff.top/api/search?q=mostbet"
200 OK
{
  "companies": [
    {"name": "Mostbet", "url": "/company/mostbet", "count": 142, "cat": "gambling"}
  ],
  "spammers": [
    {"username": "mostbet_agent", "url": "/reports?q=mostbet_agent", "count": 5}
  ]
}
GET

/api/company/{slug}

— проверить компанию

Подробная информация о компании: категория, тренд за неделю, алиасы, ссылки на бейдж и карточку.

Параметры пути

ПараметрТипОписание
slugstringSlug или название компании.
Пример
curl https://aff.top/api/company/mostbet
200 OK
{
  "found": true,
  "name": "Mostbet",
  "slug": "mostbet",
  "category": "gambling",
  "reports_count": 142,
  "week_trend": 12.5,
  "last_7_days": 9,
  "aliases": ["мосбет", "mostbet.com"],
  "badge_url": "/api/badge/mostbet.svg",
  "card_url": "/card/mostbet",
  "url": "/company/mostbet"
}
GET

/api/widget/{slug}

— данные для виджета

Компактные данные для встраиваемых виджетов: тренд, график за 7 дней, ссылки на бейдж и embed-виджет.

Параметры пути

ПараметрТипОписание
slugstringSlug компании.
200 OK
{
  "found": true,
  "name": "Mostbet",
  "slug": "mostbet",
  "reports_count": 142,
  "trend": "+12.5%",
  "trend_direction": "up",
  "last_7_days": [3, 1, 0, 2, 1, 0, 2],
  "top_category": "gambling",
  "badge_url": "/api/badge/mostbet.svg",
  "embed_url": "/embed/counter-dark/mostbet",
  "page_url": "/company/mostbet"
}
POST

/api/fingerprint/match

— матч отпечатка против библиотеки

Принимает набор сигналов (JA4 TLS, canvas hash, WebGL renderer, audio hash и др.) и возвращает известный профиль — браузер/антидетект/бот/HTTP-клиент. Полезно для автоматизированных антифрод-пайплайнов: один POST даёт verdict + confidence.

Endpoint stateless — наблюдения в библиотеку не попадают. Результат кэшируется на 5 минут. Видны только публичные профили (trust: canonical, community, либо crowdsource с ≥50 подтверждений). Открытый каталог: /tools/fingerprint/library.

Тело запроса

Поле Тип Описание
signals object Ключ → значение сигнала. Поддерживаемые ключи: ja4, ja3, ja4_t, webgl_renderer, canvas_geom, canvas_text, audio, fonts_hash, akamai_h2.

Лимиты

60 запросов в минуту с одного IP. Размер тела — до 20 сигналов, каждый до 255 символов.

Пример запроса curl
curl -X POST https://aff.top/api/fingerprint/match \
  -H "Content-Type: application/json" \
  -d '{"signals": {"ja4": "t13d1516h2_8daaf6152771_02713d6af862"}}'
200 — профиль найден
{
  "match": {
    "profile": {
      "id": 42,
      "label": "Chrome 147 / Macos",
      "kind": "browser",
      "name": "Chrome",
      "os_family": "macos",
      "trust_level": "community",
      "observations": 342
    },
    "confidence": 0.87,
    "verdict": "high",
    "matched_signals": ["ja4"],
    "unmatched_signals": [],
    "top_candidates": [...]
  },
  "cached": true
}
200 — не найден
{
  "match": {
    "profile": null,
    "verdict": "unknown",
    "confidence": 0,
    "matched_signals": [],
    "top_candidates": []
  },
  "cached": false
}
Пример клиента Python
import requests

r = requests.post(
    "https://aff.top/api/fingerprint/match",
    json={"signals": {
        "ja4": "t13d1516h2_8daaf6152771_02713d6af862",
        "webgl_renderer": "ANGLE (Apple, Apple M2)",
    }}
)
data = r.json()
if data["match"]["profile"]:
    print(f"{data['match']['profile']['label']} — {data['match']['verdict']}")
else:
    print("unknown browser")

Verdict levels

  • high — confidence ≥ 0.75. Совпадение достоверное, можно доверять решению.
  • medium — confidence 0.45..0.74. Вероятно, но проверьте дополнительные сигналы.
  • low — есть совпадения, но confidence низкий. Не используйте для автоматических решений.
  • unknown — ни один сигнал не матчится в публичной части библиотеки.

🏷️ Виджеты и бейджи

GET /api/badge/{slug}.svg — SVG-бейдж для сайта
<img src="https://aff.top/api/badge/mostbet.svg" alt="aff.top badge">
GET /api/card/{slug}.svg — SVG-карточка с деталями
GET /embed/{style}/{slug} — iframe-виджет
Стили: badge, counter-dark, counter-light, banner-dark, banner-light
<iframe src="https://aff.top/embed/counter-dark/mostbet" width="200" height="60"></iframe>

🛡️ API защиты чатов

GET /api/chat/{username}/status — статус чата (активен ли бот, статистика)
GET /api/chat/{username}/badge.svg — SVG-бейдж защиты чата
GET /api/detection-rules — правила детекции спама в JSON (публичная прозрачность)

💡 Примеры использования

Telegram бот на Python

import requests

def is_spammer(username):
    r = requests.get(
        f"https://aff.top/api/check/{username}"
    )
    data = r.json()
    return data.get("found", False)

# В хэндлере нового участника:
if is_spammer(new_member.username):
    await bot.ban_chat_member(chat_id, new_member.id)

JavaScript / Node.js

async function checkSpammer(username) {
  const res = await fetch(
    `https://aff.top/api/check/${username}`
  );
  const data = await res.json();
  return {
    isSpammer: data.found,
    reports: data.reports_count,
    companies: data.companies ?? [],
  };
}

PHP

function checkSpammer(string $username): bool {
    $response = file_get_contents(
        "https://aff.top/api/check/{$username}"
    );
    $data = json_decode($response, true);
    return $data['found'] ?? false;
}

Google Sheets / Apps Script

function CHECK_SPAM(username) {
  const url = "https://aff.top/api/check/"
    + username.replace("@", "");
  const r = UrlFetchApp.fetch(url);
  const d = JSON.parse(r.getContentText());
  return d.found ? d.reports_count : 0;
}

📋 Ограничения и заметки

🔓 Открытые данные

Данные открыты для исследователей, разработчиков и аналитиков.

📡
RSS Feed
/rss/all
📊
CSV дамп
Еженедельно
📋
Все компании
/companies

Получил спам — перешли боту, добавим в базу

📩 Написать @SPAMpartnersBOT