TGMarket

Документация API

REST API v1 для поиска и выгрузки Telegram-каналов. JSON, пагинация курсором, одна схема фильтров с интерфейсом и выгрузками. Машиночитаемая схема — OpenAPI бэкенда (/openapi.json).

Авторизация

Ключ создаётся в кабинете → Ключи API (тарифы Premium и Super). Формат ключа: mk_live_<prefix>_<secret>, показывается один раз. Передавайте его в заголовке:

Authorization: Bearer mk_live_ab12cd34_xxxxxxxxxxxxxxxx
# или
X-API-Key: mk_live_ab12cd34_xxxxxxxxxxxxxxxx

Скоупы: read (по умолчанию) и export — для POST /v1/exports. Не больше двух активных ключей: так ключ можно ротировать без простоя.

Тарификация

Платите за отданные данные, а не за вызовы. Всё списывается кредитами: 1 кредит = $0,001.

  • Каждый платный запрос — 1 кредит ($1 за 1 000 запросов).
  • Каждая строка канала — по ставке набора полей: Base 0,5 кредита, +Metrics 1,5, +Ads 2, History 3.
  • Пост — 0,5 кредита.
  • Канал, за который этот ключ уже платил за последние 30 дней, отдаётся бесплатно.
  • /count и фасеты — только плата за запрос.

Сколько списано за запрос — в заголовке X-Credits-Charged. Баланс и расход — GET /v1/usage. Цены выгрузок — на странице тарифов.

Эндпоинты

МетодПутьЧто делаетСписание
GET/v1/categoriesДерево категорийбесплатно
GET/v1/languagesЯзыки и число каналовбесплатно
GET/v1/usageБаланс, расход по дням, лимитыбесплатно
POST/v1/channels/searchФильтры + q, курсор, до 100 на страницузапрос + строки
POST/v1/channels/countСчётчики и фасеты по запросузапрос
GET/v1/channels/{id|username}Карточка канала (?fields=base,metrics,ads)запрос + строка
GET/v1/channels/{id}/historyРяд подписчиков и метрик по дням (?days=)запрос + History
GET/v1/channels/{id}/postsПоследние посты (?limit= до 100)запрос + посты
GET/v1/channels/{id}/referencesКто цитирует и кого цитируетзапрос + строки
POST/v1/posts/searchПолнотекстовый поиск по постамзапрос + посты
POST/v1/exportsАсинхронная выгрузка (scope export)по прайсу выгрузки
GET/v1/exports/{id}Статус и ссылка на файлбесплатно

Фильтры (ChannelQuery)

Объект query одинаков для /channels/search, /channels/count и /exports. Пустые поля можно не передавать.

qstringтекст: название, username, описание, посты
category_ids / exclude_category_idsint[]категории (области или подкатегории)
channel_idsint[]конкретные каналы
languagesstring[]коды языков: ru, en, uk…
kindall | channel | groupтип
subscribers_min / subscribers_maxintподписчики
avg_views_min, reach_24h_minnumberпросмотры и охват 24 ч
er_min, err_24h_minnumberER / ERR, %
growth_7d_min, growth_30d_min, growth_pct_30d_minnumberприрост
posts_30d_min, last_post_afterint, dateактивность
created_after / created_beforedateдата создания
has_ads_contact, ad_share_maxbool, 0..1реклама
fraud_max0..1порог fraud-score
verified_only, exclude_scamboolфлаги (exclude_scam=true по умолчанию)
sort, orderstringrelevance, subscribers, growth_7d, growth_30d, growth_pct_30d, reach_24h, avg_views, er, citation_index, created_at, last_post_at; desc|asc

Примеры

Поиск каналов

curl -X POST https://api.tgmarket.example/v1/channels/search \
  -H "Authorization: Bearer $MK_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": {"q": "нейросети", "languages": ["ru"], "subscribers_min": 5000, "sort": "growth_30d"},
    "fields": ["base", "metrics"],
    "limit": 100
  }'

Ответ:

{
  "items": [{"id": 2365318039, "username": "GPTronhub", "title": "…", "subscribers": 169432, "er": 0.16, …}],
  "total": 605,
  "next_cursor": "eyJoIjoi…"   // передайте в следующем запросе как cursor
}

Счётчик без строк

curl -X POST https://api.tgmarket.example/v1/channels/count -H "Authorization: Bearer $MK_KEY" \
  -H "Content-Type: application/json" -d '{"query": {"category_ids": [21]}}'

Карточка и история

curl "https://api.tgmarket.example/v1/channels/durov?fields=base,metrics" -H "Authorization: Bearer $MK_KEY"
curl "https://api.tgmarket.example/v1/channels/1006503122/history?days=90" -H "Authorization: Bearer $MK_KEY"

Выгрузка

curl -X POST https://api.tgmarket.example/v1/exports -H "Authorization: Bearer $MK_KEY" -H "Content-Type: application/json" \
  -d '{"query": {"q": "крипта"}, "fields": ["base","metrics"], "format": "csv", "row_limit": 20000}'
# → {"export_id": "…", "rows": 20000, "price_credits": 32000, "status": "queued"}

curl https://api.tgmarket.example/v1/exports/<export_id> -H "Authorization: Bearer $MK_KEY"
# → {"status": "done", "progress": 100, "download_url": "https://…", …}

Лимиты

  • Premium — 1 запрос в секунду, Super — 10, Enterprise — по договору.
  • Каждый ответ содержит заголовки X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
  • Глубже 10 000 результатов по одному запросу — используйте /v1/exports.
  • Жёсткий суточный потолок уникальных каналов на ключ; при переборе ключ замораживается до ручной проверки.

Ошибки

Все ошибки — в едином формате:

{"error": {"code": "payment_required", "message": "…"}}
  • 401 invalid_api_key — неверный или отозванный ключ
  • 402 payment_required / 402 insufficient_funds — баланс исчерпан, пополните в кабинете (в ответе need/have)
  • 403 api_not_in_plan, 403 scope_required, 403 key_frozen, 403 ip_not_allowed
  • 429 rate_limited — превышен RPS; подождите столько секунд, сколько указано в Retry-After
  • 400 too_deep, 400 bad_cursor, 422 — ошибка в параметрах