Admin API: расходы
Четыре метода Admin API для расходов: состояние по дням, настройки, приём дневного снимка рекламного аккаунта и скачивание расширения.
Через эти методы работает вкладка Настройки → Расходы и расширение для расходов. Ими же можно передавать в трекер расход рекламного аккаунта из своей интеграции. Авторизация описана на странице Admin API: обзор и авторизация, формат ответов и ошибок — на странице Формат запросов, ответов и ошибок.
Доступ и лицензия
| Метод | spend:write | full |
|---|---|---|
GET /api/v1/spend | да | да |
POST /api/v1/spend/snapshots | да | да |
PUT /api/v1/spend/settings | нет | да |
GET /api/v1/spend/extension | нет | да |
Токен spend:write создаётся в панели: Настройки → Расходы, блок Подключить профиль, кнопка Создать ключ. Срок такого ключа — 90 дней. Токен full создаётся во вкладке API — см. Виды доступа.
Все четыре метода работают только на платной лицензии. На пробной они отвечают кодом 403:
{"code": "spend_paid_required", "message": "Расширение для расходов доступно после оплаты лицензии."}При неактивной лицензии ответ — 402, см. Истёкшая лицензия.
Методы
Получить настройки и состояние дней
GET /api/v1/spendВозвращает настройки расходов и состояние последних 60 дней, по которым приходили снимки.
Права токена: spend:write или full. Параметров и тела нет.
Ответ — код 200:
| Поле | Тип | Описание |
|---|---|---|
settings.ad_key | строка | Поле клика, в котором приходит ID объявления. Пока настройки не сохранены — sub_id_4 |
settings.timezone | строка | Часовой пояс рекламного аккаунта. Пока настройки не сохранены — UTC |
jobs | массив | Дни со снимками, от нового к старому. Если снимков не было — [] |
jobs[].day | строка, ГГГГ-ММ-ДД | Дата расхода в часовом поясе рекламного аккаунта |
jobs[].pending | логическое | true — снимок принят и ждёт раскладки по кампаниям, false — расход учтён в отчётах |
jobs[].error | строка | Текст ошибки последней раскладки. Пустая строка, если ошибки нет. Трекер повторяет раскладку сам |
jobs[].campaigns | число | Сколько кампаний получили расход за день |
jobs[].unmatched_ads | число | Сколько объявлений не привязано: за день нет кликов с их ID |
jobs[].unmatched_spend | число | Расход этих объявлений в USD |
jobs[].updated_at | строка, дата RFC 3339 | Время последнего изменения |
Те же данные показывает таблица на вкладке Расходы — см. Таблица дней.
Пример ответа:
{
"settings": {"ad_key": "sub_id_4", "timezone": "Europe/Warsaw"},
"jobs": [
{
"day": "2026-10-03",
"pending": false,
"error": "",
"campaigns": 4,
"unmatched_ads": 1,
"unmatched_spend": 3.2,
"updated_at": "2026-10-04T06:15:22.104512Z"
}
]
}Сохранить настройки расходов
PUT /api/v1/spend/settingsЗадаёт поле клика с ID объявления и часовой пояс рекламного аккаунта. В панели это поля Поле с ID объявления и Timezone рекламного аккаунта.
Права токена: full.
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
ad_key | строка | да | Одно из значений sub_id_1 … sub_id_30 |
timezone | строка | да | Часовой пояс в формате IANA, например Europe/Warsaw. Значение Local не принимается |
Ответ — код 200 и сохранённые значения:
{"ad_key": "sub_id_4", "timezone": "Europe/Warsaw"}Настройки можно менять, пока трекер не принял ни одного снимка. После первого снимка поле и часовой пояс закреплены, метод отвечает 409. Проверьте оба значения до первой загрузки расхода.
Ошибки:
| Код | code | message | Когда |
|---|---|---|---|
422 | validation | Выберите sub_id_1…30 с ID объявления | Тело не разобрано или ad_key вне списка |
422 | validation | Укажите IANA timezone рекламного кабинета | timezone пустой, неизвестный или Local |
409 | spend_history | После первого импорта поле и timezone фиксированы, чтобы не пересчитать историю другим способом | В трекере уже есть хотя бы один снимок |
Передать дневной снимок расхода
POST /api/v1/spend/snapshotsПринимает полный расход одного рекламного аккаунта за один день: список объявлений и сумму по каждому.
Права токена: spend:write или full. Тело — один JSON-объект размером до 2 МиБ. Поля, которых нет в таблице, приводят к ошибке 422.
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
account_id | строка | да | ID рекламного аккаунта: только цифры, от 1 до 32 знаков |
day | строка, ГГГГ-ММ-ДД | да | Дата расхода в часовом поясе timezone. Сегодняшний день или один из 30 предыдущих |
currency | строка | да | Валюта аккаунта: три латинские буквы, например PLN. Регистр не важен |
timezone | строка | да | Часовой пояс аккаунта в формате IANA. Должен совпадать с settings.timezone |
fetched_at | строка, дата RFC 3339 | да | Когда данные получены из рекламного кабинета. Не старше 24 часов и не больше чем на 5 минут в будущем |
rows | массив | да | Объявления аккаунта за день, до 10 000 строк. Пустой массив обнуляет расход аккаунта за этот день. Запрос без поля обрабатывается как пустой массив |
rows[].ad_id | строка | да | ID объявления: только цифры, от 1 до 32 знаков. Без повторов внутри снимка |
rows[].spend | число | да | Расход объявления за день в валюте currency, от 0 до 1 000 000 000 |
Как трекер обрабатывает снимок:
- Снимок заменяет прежние данные этого аккаунта за этот день, а не прибавляется к ним. Передавайте все объявления аккаунта, а не только изменившиеся.
- Из двух снимков одного аккаунта за один день остаётся тот, у которого
fetched_atпозже. Снимок с более ранним временем не применяется. - Сумма переводится в USD по курсу на дату расхода. Курс закрепляется за аккаунтом и днём при первом снимке — см. Курс для расходов из расширения. Для
USDкурс не нужен. - Расход объявления делится между кампаниями по кликам с его ID в поле
settings.ad_key— см. Как расход попадает в отчёты.
Ответ — код 202: снимок принят, раскладка по кампаниям идёт в фоне. Результат смотрите в jobs метода GET /api/v1/spend.
| Поле | Тип | Описание |
|---|---|---|
accepted | логическое | Всегда true |
changed | логическое | true — снимок сохранён, день поставлен на раскладку. false — в трекере уже есть снимок с тем же или более поздним fetched_at, данные не менялись |
rows | число | Сколько строк было в запросе |
Пример запроса:
curl -X POST https://panel.example.com/api/v1/spend/snapshots \
-H "Api-Key: <токен>" \
-H "Content-Type: application/json" \
-d '{
"account_id": "1234567890123456",
"day": "2026-10-03",
"currency": "PLN",
"timezone": "Europe/Warsaw",
"fetched_at": "2026-10-04T06:15:00Z",
"rows": [
{"ad_id": "120210000000000001", "spend": 182.4},
{"ad_id": "120210000000000002", "spend": 57.15}
]
}'Пример ответа:
{"accepted": true, "changed": true, "rows": 2}Ошибки:
| Код | code | message | Когда |
|---|---|---|---|
422 | validation | разные, см. список ниже | Ошибка в теле или в значениях полей |
422 | timezone_mismatch | Timezone аккаунта отличается от настроек расширения в трекере | timezone не совпадает с settings.timezone |
422 | currency_rate | Нет курса USD на дату расхода; добавьте курс и повторите | Для currency нет курса на дату day — см. Если курса нет |
422 | snapshot_limit | Лимит дня: 100 аккаунтов, 100000 объявлений и допустимая сумма USD; ad_id должен принадлежать одному аккаунту | За день больше 100 аккаунтов или 100 000 объявлений, сумма дня в USD больше 1 000 000 000, либо этот ad_id за день уже пришёл из другого аккаунта |
409 | currency_mismatch | Валюта сохранённого снимка отличается | За этот день аккаунт уже загружен в другой валюте |
409 | snapshot_conflict | Снимки с одинаковым временем содержат разные данные; выполните новый сбор | fetched_at совпадает с сохранённым, а строки отличаются. Отправьте снимок с новым временем |
429 | rate_limited | слишком много запросов, попробуйте позже | Больше 120 запросов в минуту с одного IP — см. Ограничения частоты |
Сообщения с кодом validation
Некорректный снимок расходов (до 2 МиБ)— тело не JSON, больше 2 МиБ, есть неизвестное поле или значение не того типа.Ожидается один JSON снимок— после объекта в теле есть ещё данные.Некорректный аккаунт, валюта или размер снимка (до 10000 объявлений)— ошибка вaccount_idилиcurrency, либо строк больше 10 000.Некорректная timezone—timezoneпустой, неизвестный илиLocal.Дата должна быть в пределах последних 31 дней—dayв другом формате, в будущем или старше 30 дней.Обновите снимок расхода: время получения устарело или находится в будущем—fetched_atне задан или вне допустимого окна.Некорректный расход или повтор ID объявления— ошибка вad_id, повторad_id, отрицательный или слишком большойspend.Суммарный расход слишком велик— сумма строк снимка в валютеcurrencyбольше 1 000 000 000.Недопустимый курс или сумма USD— сумма снимка после перевода в USD больше 1 000 000 000.
Повтор того же снимка с тем же fetched_at безопасен: трекер ответит 202 с "changed": false.
Скачать расширение
GET /api/v1/spend/extensionОтдаёт архив расширения расходов, собранный под домен панели, название и логотип этой установки. Это тот же файл, что скачивается кнопкой на вкладке Расходы — см. Расширение для расходов Facebook.
Права токена: full. Параметров и тела нет.
Ответ — код 200, тип application/zip, имя файла micator-spend.zip.
Пример запроса:
curl https://panel.example.com/api/v1/spend/extension \
-H "Api-Key: <токен>" \
-o micator-spend.zipОшибки:
| Код | code | message | Когда |
|---|---|---|---|
503 | extension_config | Проверьте домен панели и логотип в конфигурации установки | Архив не собран — см. Архив не скачивается |
Порядок загрузки из своей интеграции
- Сохраните настройки методом
PUT /api/v1/spend/settingsили на вкладке Настройки → Расходы. - Отправляйте по одному запросу
POST /api/v1/spend/snapshotsна каждую пару «аккаунт — день». - Запросите
GET /api/v1/spendи дождитесь у нужного дня"pending": falseс пустымerror. - Если
unmatched_adsне ноль, проверьте, что ссылка в объявлении передаёт ID объявления в полеsettings.ad_key— см. Токены источника и параметры ссылки.
Чтобы расход разложился по кликам, которые пришли после загрузки, отправьте снимок этого дня ещё раз с новым fetched_at.