Партнёрские сети (CPA)
Партнёрская сеть (CPA-сеть) — справочник рекламодателей, с которыми работает команда: название, валюта выплат, маппинг статусов постбэков на события трекера, макросы постбэка и шаблон параметров для ссылок. Офферы и потоки всегда принадлежат какой-то CPA-сети. В кабинете это раздел Трекер → Aff. Networks (см. Aff. Networks (Партнёрские сети) и Статусы конверсий и настройка postback).
Получение токена, общий формат ответов, параметры списков и ошибки — в головной статье раздела.
Скоупы
| Скоуп | Доступ | В дефолте PAT |
|---|---|---|
api:cpa |
чтение CPA-сетей и CPA-шаблонов | да |
api:cpa:write |
создание и правка CPA-сетей | нет |
Эндпойнты
| Метод | Путь | Скоуп | RBAC-право |
|---|---|---|---|
GET |
/api/cpa |
api:cpa |
cpa:list |
POST |
/api/cpa |
api:cpa:write |
cpa:create |
GET |
/api/cpa/{id} |
api:cpa |
cpa:read |
PATCH |
/api/cpa/{id}?changeAllUrl= |
api:cpa:write |
cpa:update |
Права cpa:list, cpa:read, cpa:create есть у всех ролей. cpa:update нет у BUYER — для его токена PATCH /api/cpa/{id} вернёт 403 forbidden даже при наличии скоупа api:cpa:write. Видимость: ADMIN — все сети, остальные роли — сети своей команды (BUYER — свои и доступные по настройкам доступа). Чужая сеть → 404.
Параметры списка GET /api/cpa
| Поля | |
|---|---|
Фильтры filter[...] |
name, team, user, isActive, lastLoginAt, created, updated, tags |
Сортировка sort |
name, isActive, created, updated |
| Populate по умолчанию | user (name, email, avatar), team (name), tags |
curl -G 'https://adset.pro/api/cpa' \
-H 'Authorization: Bearer pat_…' \
--data-urlencode 'pageSize=100' \
--data-urlencode 'sort=name:asc' \
--data-urlencode 'filter[isActive]=true'
Объект CPA-сети
| Поле | Тип | Описание |
|---|---|---|
id |
string | ObjectId |
name |
string | название (обязательно при создании), до 255 символов |
description |
string | описание, до 2000 символов |
shortName |
string | короткое имя, до 50 символов; по нему распознаются входящие постбэки |
isActive |
boolean | по умолчанию true |
currency |
string | ISO-код валюты выплат (USD, EUR, …), по умолчанию USD; доход конвертируется в USD по курсу |
paramTemplate |
string | строка GET-параметров, которая дописывается к URL потоков этой сети, например sub1={click_id}&sub2={campaign_id} |
statuses |
объект | маппинг статусов партнёрки на события трекера (см. ниже) |
postbackMacros |
объект | имена параметров постбэка партнёрки (см. ниже) |
acceptDuplicates |
boolean | принимать повторные постбэки с тем же click_id и статусом (по умолчанию false) |
acceptDuplicatesFor |
string[] | для каких событий разрешены дубли; по умолчанию ["CPA_HOLD", "CPA_ACCEPT"]; допустимы также CPA_REDEP, CPA_DECLINE, CPA_TRASH |
user, team |
id | объект | владелец и команда |
tags[] |
id[] | объекты | теги |
created, updated |
date | только чтение |
statuses — маппинг статусов
Значения — строки, которые партнёрка присылает в параметре статуса постбэка. Каждое поле соответствует событию трекера:
| Поле | Событие трекера | По умолчанию | Смысл |
|---|---|---|---|
hold |
CPA_HOLD |
hold |
регистрация / лид в холде |
accept |
CPA_ACCEPT |
accept |
первый депозит, выплата подтверждена |
redep |
CPA_REDEP |
"" |
повторный депозит |
decline |
CPA_DECLINE |
decline |
отклонён |
trash |
CPA_TRASH |
trash |
мусорная регистрация |
postbackMacros — параметры постбэка
Как называются параметры в постбэке партнёрки, из которых трекер берёт данные:
| Поле | Что содержит | По умолчанию |
|---|---|---|
clickId |
имя параметра с click_id трекера | "" |
status |
имя параметра со статусом конверсии | "" |
revenue |
имя параметра с суммой выплаты | "0" |
currency |
имя параметра с валютой или фиксированная валюта | "USD" |
externalId |
имя параметра с внешним id конверсии (для дедупликации) | "" |
POST /api/cpa — создать CPA-сеть
Обязательное поле — name. Владелец и команда по умолчанию берутся из токена; ADMIN обязан передать team и/или user (иначе 400). Заполнять statuses и postbackMacros вручную необязательно — удобнее взять их из CPA-шаблона нужной партнёрки.
// POST /api/cpa
{
"name": "Casino Partners",
"shortName": "casinop",
"description": "Прямой рекламодатель, выплаты в EUR",
"currency": "EUR",
"paramTemplate": "sub1={click_id}&sub2={campaign_id}",
"statuses": { "hold": "lead", "accept": "sale", "redep": "redeposit", "decline": "rejected", "trash": "trash" },
"postbackMacros": { "clickId": "sub1", "status": "status", "revenue": "payout", "currency": "EUR", "externalId": "conversion_id" },
"acceptDuplicates": false,
"tags": []
}
Ответ — 201 Created, заголовок Location: /cpa/{id}:
{
"data": {
"id": "6704b1c2d3e4f5a6b7c8d9e0",
"name": "Casino Partners",
"description": "Прямой рекламодатель, выплаты в EUR",
"shortName": "casinop",
"isActive": true,
"statuses": { "accept": "sale", "redep": "redeposit", "hold": "lead", "decline": "rejected", "trash": "trash" },
"postbackMacros": { "clickId": "sub1", "status": "status", "revenue": "payout", "currency": "EUR", "externalId": "conversion_id" },
"currency": "EUR",
"paramTemplate": "sub1={click_id}&sub2={campaign_id}",
"acceptDuplicates": false,
"acceptDuplicatesFor": ["CPA_HOLD", "CPA_ACCEPT"],
"user": "64a0…",
"team": "64b0…",
"tags": [],
"created": "2026-10-13T10:00:00.000Z",
"updated": "2026-10-13T10:00:00.000Z"
},
"traceId": "01HX…"
}
PATCH /api/cpa/{id} — изменить CPA-сеть
Все поля необязательны; передавайте только то, что меняете. Ответ 200 OK с полным объектом.
Флаг ?changeAllUrl=true
Если в теле меняется paramTemplate, флаг каскадно обновляет url всех потоков этой CPA-сети:
- у сети не было шаблона — новый дописывается к URL через
?или&; - шаблон был — его вхождение в URL заменяется на новое.
Без флага меняется только сама сеть, URL потоков остаются прежними. Потоки обновляются в пределах видимости владельца токена.
# сменить шаблон параметров и прокинуть его во все потоки сети
curl -X PATCH 'https://adset.pro/api/cpa/6704b1c2d3e4f5a6b7c8d9e0?changeAllUrl=true' \
-H 'Authorization: Bearer pat_…' \
-H 'Content-Type: application/json' \
-d '{ "paramTemplate": "sub1={click_id}&sub2={campaign_id}&sub3={source_id}" }'
Было: https://partner.example/offer?aff=123&sub1={click_id}&sub2={campaign_id} → стало: https://partner.example/offer?aff=123&sub1={click_id}&sub2={campaign_id}&sub3={source_id}.
Ошибки
| HTTP | Когда |
|---|---|
400 validationError |
ADMIN-токен создаёт сеть без team/user |
403 forbidden + Insufficient OAuth scope. Required: api:cpa:write |
у токена нет write-скоупа |
403 forbidden |
BUYER вызывает PATCH /api/cpa/{id} — у роли нет права cpa:update |
404 notFound |
сети нет или она принадлежит другой команде |
422 validationError |
нет name, неизвестная currency, значение acceptDuplicatesFor вне списка событий |
Связанные статьи
- CPA-шаблоны — готовые
statuses,postbackMacrosиparamTemplateпопулярных партнёрок - Офферы и Потоки — дочерние сущности сети
- Статусы конверсий и настройка postback — как партнёрка должна слать постбэки
- Подключение новой CPA (партнёрки) с нуля
