Публичное 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 |
Домены |
Быстрый старт
- В кабинете откройте Настройки пользователя → вкладка «Ключи MCP» (
https://adset.pro/user-settings), нажмите «Создать API-ключ» и выберите тип Personal Access Token. Скопируйте токен сразу — он показывается только один раз. - Передавайте токен в каждом запросе заголовком
Authorization: Bearer pat_…. - Проверьте доступ справочным запросом:
curl 'https://adset.pro/api/stats/meta/metrics' \
-H 'Authorization: Bearer pat_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
- Списки сущностей пагинируются на сервере:
GET /api/campaigns?page=1&pageSize=100. - Для создания и правки добавьте ключу 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 будет закрыт.
Полезные ссылки
- Swagger UI:
https://adset.pro/api/docs - MCP-сервис Adset — доступ LLM-клиентов к данным по Model Context Protocol и OAuth 2.0
- Конструктор отчётов — те же метрики и группировки в интерфейсе кабинета
