Публічне 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
- Конструктор звітів — ті ж метрики та групування в інтерфейсі кабінету
