Adset.ProAdset.ProKnowledge base
Home/Публичное HTTP API

Публичное HTTP API

Публичное HTTP API Adset.pro — программный доступ к данным и сущностям кабинета для внешних систем: BI и дашбордов, ETL-скриптов, автоматизации заведения кампаний, партнёрских сетей, офферов и потоков.

Базовый URL: https://adset.pro. Swagger UI: https://adset.pro/api/docs (OpenAPI 3.0; JSON-спецификация — https://adset.pro/api/docs/swagger.json).

Публичный API — это те же эндпойнты, которые использует веб-кабинет: отдельного слоя /api/public/* нет. Поля запросов и ответов совпадают с тем, что видит интерфейс, а видимость данных такая же, как в кабинете. В статьях раздела перечислены обязательные и ключевые поля; полные схемы — в Swagger.

Статьи раздела

Группа Скоупы Статья
Отчёты статистики, CSV, справочники полей api:stats, api:stats:export, api:stats:meta Статистика: отчёты и экспорт
Ключи фильтров, группировок и метрик — Статистика: справочник полей
Кампании api:campaigns, api:campaigns:write Кампании
Партнёрские сети (CPA) api:cpa, api:cpa:write Партнёрские сети (CPA)
CPA-шаблоны api:cpa CPA-шаблоны
Офферы api:offers, api:offers:write Офферы
Потоки api:flows, api:flows:write Потоки
Домены api:domains Домены

Быстрый старт

  1. В кабинете откройте Настройки пользователя → вкладка «Ключи MCP» (https://adset.pro/user-settings), нажмите «Создать API-ключ» и выберите тип Personal Access Token. Скопируйте токен сразу — он показывается только один раз.
  2. Передавайте токен в каждом запросе заголовком Authorization: Bearer pat_….
  3. Проверьте доступ справочным запросом:
curl 'https://adset.pro/api/stats/meta/metrics' \
  -H 'Authorization: Bearer pat_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
  1. Списки сущностей пагинируются на сервере: GET /api/campaigns?page=1&pageSize=100.
  2. Для создания и правки добавьте ключу write-скоупы — по умолчанию у нового PAT только чтение.

Получение токена

Personal Access Token (PAT)

Основной способ для скриптов и серверных интеграций. Префикс токена — pat_, длина около 64 символов.

Ключ создаётся в UI (см. «Быстрый старт») или запросом из кабинета — для него нужен JWT браузерной сессии, а не другой PAT:

POST /api/mcp/keys
Authorization: Bearer <JWT сессии кабинета>
Content-Type: application/json

{
  "type": "pat",
  "name": "BI ETL job",
  "scopes": ["api:stats", "api:stats:meta", "api:campaigns"],
  "expiresInDays": 365
}

В ответе один раз вернётся поле token — сохраните его.

Параметр Правило
type pat — для HTTP API. Значение mcp выдаёт ключ для /mcp, он на /api/* не работает
name 1–100 символов
scopes список из таблицы «Скоупы». Неизвестные значения отбрасываются; без параметра ключ получает только read-скоупы
expiresInDays 1–3650; без параметра ключ бессрочный

Управление ключами (из кабинета; пользователь видит только свои ключи):

Действие Эндпойнт
Список своих ключей GET /api/mcp/keys
Создать ключ POST /api/mcp/keys
Ротация — старый отзывается, выдаётся новый с теми же именем и скоупами POST /api/mcp/keys/{keyId}/rotate
Изменить набор скоупов PATCH /api/mcp/keys/{keyId}/scopes с телом { "scopes": [...] }
Отозвать ключ DELETE /api/mcp/keys/{keyId}

Все эти действия доступны и в UI на вкладке «Ключи MCP».

pat_ принимается только на путях /api/*. На /mcp он отклоняется — там нужен ключ типа MCP (mcp_) или OAuth-токен, см. MCP-сервис Adset.

OAuth 2.0 (для приложений)

OAuth-токены (oat_…, Authorization Code + PKCE) также принимаются на /api/* с теми же скоупами. Этот сценарий нужен в первую очередь для подключения MCP-клиентов (ChatGPT, Claude и совместимых) и описан в статье MCP-сервис Adset. Discovery-документ: GET /.well-known/oauth-authorization-server. Для скриптов и серверных интеграций используйте PAT.

Скоупы

Скоуп — разрешение самого токена вызывать группу эндпойнтов. Эффективный доступ = скоупы токена ∩ права роли владельца токена.

Скоуп Что разрешает В дефолте PAT
api:stats POST /api/stats/query — отчёты статистики да
api:stats:export POST /api/stats/export/csv — выгрузка CSV да
api:stats:meta GET /api/stats/meta/* — справочники метрик, группировок, фильтров да
api:campaigns чтение кампаний да
api:campaigns:write создание и правка кампаний нет
api:cpa чтение CPA-сетей и CPA-шаблонов да
api:cpa:write создание и правка CPA-сетей нет
api:offers чтение офферов да
api:offers:write создание и правка офферов нет
api:flows чтение потоков да
api:flows:write создание и правка потоков нет
api:domains чтение доменов да
  • Новый PAT без явного списка scopes получает все read-скоупы. Write-скоупы включаются при создании ключа или позже — через UI либо PATCH /api/mcp/keys/{keyId}/scopes.
  • Ранее выданные ключи не получают новые скоупы автоматически: добавьте их тем же способом.
  • Ни один скоуп не даёт права на удаление — удалять сущности через API нельзя.

Права роли владельца

Токен действует от имени пользователя, который его создал, и наследует его роль и видимость данных:

Роль Что видит и меняет через API
ADMIN все данные платформы
TEAM_OWNER, TEAM_LEAD, TECH данные своей команды (TEAM_LEAD — с учётом настроек доступа к ресурсам)
BUYER только собственные сущности и статистику, с учётом доступов, выданных тимлидом

У всех ролей есть права на чтение и создание/правку кампаний, офферов и потоков, на создание CPA-сетей и на чтение доменов, CPA-шаблонов и статистики. Исключение одно: BUYER не может править CPA-сети — PATCH /api/cpa/{id} вернёт 403. Чужая сущность для токена не существует: ответ 404, а не 403.

Общие соглашения

Формат запросов и ответов

  • JSON, UTF-8, Content-Type: application/json. Даты — ISO 8601 в UTC. Идентификаторы {id} — 24-символьный hex ObjectId.
  • Одиночный объект: { "data": { … }, "traceId": "…" }.
  • Список: { "data": [ … ], "meta": { "page", "pageSize", "total", "sort", "filters" }, "links": { "self", "next"?, "prev"? }, "traceId": "…" }.
  • Создание — 201 Created с заголовком Location: /<ресурс>/{id}; правка — 200 OK с полным объектом.
  • Каждый ответ содержит traceId и заголовок X-Trace-Id — указывайте его при обращении в поддержку.

Параметры списков (GET …)

Единый контракт для всех списков сущностей. Допустимые поля фильтров и сортировки у каждой сущности свои — они перечислены в статье группы.

Параметр Формат Примечание
page целое ≥ 1 по умолчанию 1
pageSize 1–1000 по умолчанию 10
sort field:asc / field:desc; несколько — через запятую или повтором параметра; -field = field:desc неизвестные поля игнорируются
filter[field]=v равенство; строка с префиксом @ — поиск подстроки неизвестные поля игнорируются
filter[field][op]=v eq, ne, gt, gte, lt, lte, in, nin, contains, startsWith, endsWith in/nin — CSV или повтор параметра
populate populate=user,team или populate[user]=name,email; пустой populate= отключает разворачивание ссылок без параметра действует набор по умолчанию (указан в статье группы)
select select=name,isActive — вернуть только эти поля
curl -G 'https://adset.pro/api/offers' \
  -H 'Authorization: Bearer pat_…' \
  --data-urlencode 'page=1' \
  --data-urlencode 'pageSize=100' \
  --data-urlencode 'sort=updated:desc' \
  --data-urlencode 'filter[isActive]=true' \
  --data-urlencode 'filter[country][in]=DE,AT'

meta.total — общее число записей; на последней странице в links нет next. Если нужен полный справочник, запрашивайте его страницами или передавайте pageSize до 1000.

Ошибки

Тело ошибки единое: { "error": { "code": "…", "message": "…", "details": [ … ] }, "traceId": "…" } (details — список нарушений по полям, присутствует не всегда).

HTTP error.code Когда
400 validationError нарушено правило запроса: занят alias кампании, у владельца токена нет команды, не передан time в отчёте
401 unauthorized нет заголовка Authorization; токен просрочен, отозван или не того типа (например, mcp_ на /api/*)
403 forbidden, message начинается с Insufficient OAuth scope. Required: … у токена нет нужного скоупа
403 forbidden у роли владельца токена нет права (например, BUYER правит CPA-сеть); отличать от предыдущего по message
404 notFound сущности нет или она принадлежит другой команде/пользователю
422 validationError тело не прошло схему: нет обязательного поля, неверный enum или формат; поля перечислены в details[]
429 — превышен лимит частоты запросов; ответ отдаёт шлюз, без traceId

На /mcp ошибки авторизации отдаются в формате OAuth ({ "error": "invalid_token", … }); на /api/* формат всегда такой, как в таблице.

Лимиты и ограничения

Параметр Значение
Частота запросов (на IP) /api/stats/** — 3 запроса/с (burst 10); остальные /api/** — 20 запросов/с (burst 40). Сверх лимита — 429
pageSize списков ≤ 1000
pagination.limit в /api/stats/query ≤ 100 000; рекомендуется ≤ 10 000
Экспорт CSV до 100 000 строк
Имя PAT / срок жизни ≤ 100 символов / expiresInDays 1–3650 или бессрочно

Рекомендации: кэшируйте справочники (/api/stats/meta/*, CPA-шаблоны), запрашивайте только нужные поля (select), при 429 повторяйте запрос с экспоненциальной задержкой.

Что не входит в публичный API

Удаление сущностей, копирование (/copy, /clone), массовые операции (/reassign-owner, /replace-domain), серверные таблицы (/table), /free-list, список доменов кампании, мастер регистрации и покупка доменов, операции с Cloudflare, создание и правка CPA-шаблонов и доменов. У этих эндпойнтов нет скоупа, они не публикуются в /api/docs, их контракт не гарантируется и может измениться без предупреждения. Не используйте их из интеграций — доступ к ним по PAT/OAuth будет закрыт.

Полезные ссылки