yandex-direct-mcp-plus 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -37
- package/dist/app/registry.js +13 -5
- package/dist/shared/api/errors.d.ts +1 -0
- package/dist/shared/api/errors.js +31 -0
- package/dist/shared/api/fetch.js +2 -0
- package/dist/shared/config/api-fields.d.ts +161 -0
- package/dist/shared/config/api-fields.js +682 -0
- package/dist/shared/config/enums.d.ts +11 -6
- package/dist/shared/config/enums.js +30 -8
- package/dist/shared/config/limits.d.ts +6 -0
- package/dist/shared/config/limits.js +12 -0
- package/dist/shared/lib/fields.d.ts +2 -0
- package/dist/shared/lib/fields.js +20 -0
- package/dist/shared/lib/format.js +44 -9
- package/dist/shared/lib/id.d.ts +1 -0
- package/dist/shared/lib/id.js +14 -0
- package/dist/tools/ad-extensions/handler.js +12 -2
- package/dist/tools/ad-groups/handler.js +8 -1
- package/dist/tools/ad-groups/schema.js +6 -3
- package/dist/tools/ad-images/handler.js +2 -1
- package/dist/tools/ads/handler.js +40 -3
- package/dist/tools/ads/tool.js +7 -1
- package/dist/tools/audience-targets/handler.js +2 -10
- package/dist/tools/bid-adjustments/handler.d.ts +3 -1
- package/dist/tools/bid-adjustments/handler.js +159 -7
- package/dist/tools/bid-adjustments/schema.d.ts +19 -1
- package/dist/tools/bid-adjustments/schema.js +70 -10
- package/dist/tools/bid-adjustments/tool.d.ts +2 -0
- package/dist/tools/bid-adjustments/tool.js +20 -4
- package/dist/tools/businesses/handler.js +2 -13
- package/dist/tools/campaigns/handler.js +50 -12
- package/dist/tools/campaigns/schema.d.ts +6 -3
- package/dist/tools/campaigns/schema.js +32 -7
- package/dist/tools/campaigns/tool.js +13 -6
- package/dist/tools/changes/handler.js +13 -2
- package/dist/tools/changes/schema.d.ts +2 -2
- package/dist/tools/changes/schema.js +2 -2
- package/dist/tools/changes/tool.js +1 -1
- package/dist/tools/dictionaries/handler.js +17 -0
- package/dist/tools/dictionaries/schema.d.ts +1 -0
- package/dist/tools/dictionaries/schema.js +3 -0
- package/dist/tools/dictionaries/tool.js +1 -1
- package/dist/tools/dynamic-targets/handler.js +2 -13
- package/dist/tools/feeds/handler.js +5 -2
- package/dist/tools/keywords/handler.d.ts +3 -1
- package/dist/tools/keywords/handler.js +53 -5
- package/dist/tools/keywords/schema.d.ts +18 -0
- package/dist/tools/keywords/schema.js +60 -1
- package/dist/tools/keywords/tool.d.ts +2 -0
- package/dist/tools/keywords/tool.js +27 -4
- package/dist/tools/negative-keywords/handler.js +4 -1
- package/dist/tools/retargeting/handler.d.ts +3 -1
- package/dist/tools/retargeting/handler.js +41 -19
- package/dist/tools/retargeting/schema.d.ts +17 -0
- package/dist/tools/retargeting/schema.js +46 -15
- package/dist/tools/retargeting/tool.d.ts +2 -0
- package/dist/tools/retargeting/tool.js +19 -3
- package/dist/tools/sitelinks/handler.d.ts +2 -1
- package/dist/tools/sitelinks/handler.js +12 -2
- package/dist/tools/sitelinks/schema.d.ts +3 -0
- package/dist/tools/sitelinks/schema.js +9 -1
- package/dist/tools/sitelinks/tool.d.ts +1 -0
- package/dist/tools/sitelinks/tool.js +11 -3
- package/dist/tools/vcards/handler.d.ts +2 -1
- package/dist/tools/vcards/handler.js +6 -0
- package/dist/tools/vcards/schema.d.ts +3 -0
- package/dist/tools/vcards/schema.js +6 -0
- package/dist/tools/vcards/tool.d.ts +1 -0
- package/dist/tools/vcards/tool.js +11 -3
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,33 +1,60 @@
|
|
|
1
1
|
# yandex-direct-mcp-plus
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Ведение контекстной рекламы Яндекс.Директа из диалога с ассистентом: собрать кампанию, разобрать поисковые запросы, вычистить минус-фразы, поправить ставки и посмотреть расход — не переключаясь между разделами кабинета. Работает в любом MCP-клиенте: Claude Code, Claude Desktop, Cursor и другие.
|
|
4
4
|
|
|
5
|
+
[](https://www.npmjs.com/package/yandex-direct-mcp-plus)
|
|
5
6
|
[](https://opensource.org/licenses/MIT)
|
|
6
7
|
[](https://nodejs.org)
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
- **58 инструментов**, из них 24 только читают. Кампании и стратегии, группы, объявления и модерация, ключевые фразы и ставки, минус-фразы и общие наборы, быстрые ссылки, уточнения, изображения, визитки, корректировки ставок, ретаргетинг, аудиторные и динамические цели, фиды, расписание показов, статистика, поисковые запросы, баланс и справочники.
|
|
10
|
+
- **Деньги — в рублях**, на вводе и на выводе; в микроединицы API сервер переводит сам. Поддержан агентский режим (`Client-Login`).
|
|
11
|
+
- **ID — строками** (`"1915016273214320641"`): 64-битные идентификаторы Директа не помещаются в число JavaScript и молча теряют точность. Здесь это стережёт правило линтера, а не внимательность.
|
|
12
|
+
- **Реклама боевая.** Тестовой среды у Директа больше нет — какие инструменты тратят деньги и что удаляют необратимо, перечислено в разделе [Что меняет данные](#что-меняет-данные).
|
|
13
|
+
- **Телеметрии нет.** Сервер не отправляет никуда ничего, кроме запросов к API Яндекса.
|
|
11
14
|
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
## Содержание
|
|
16
|
+
|
|
17
|
+
- [Что можно делать](#что-можно-делать) — примеры запросов обычным текстом
|
|
18
|
+
- [Установка](#установка) — Claude Code, Claude Desktop, Cursor, из исходников
|
|
19
|
+
- [Токен](#токен) — как получить и какие переменные окружения нужны
|
|
20
|
+
- [Что меняет данные](#что-меняет-данные) — что тратит бюджет и что необратимо
|
|
21
|
+
- [Инструменты](#инструменты-58) — полный список с описаниями
|
|
22
|
+
- [Разработка](#разработка) — сборка, тесты, архитектура
|
|
23
|
+
|
|
24
|
+
## Что можно делать
|
|
25
|
+
|
|
26
|
+
Обычным текстом в чате — инструменты сервер подставляет сам:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Собери кампанию «Летняя распродажа»: бюджет 5000 ₽/день, старт 1 мая, показы будни 9–21
|
|
30
|
+
Добавь минус-фразы «бесплатно» и «скачать» в кампанию 12345, не затерев остальные
|
|
31
|
+
Посмотри поисковые запросы за месяц и предложи, что заминусовать
|
|
32
|
+
Подними ставку до 25 ₽ там, где CTR выше 8%, а показов меньше сотни
|
|
33
|
+
Что изменилось в кампаниях со вчера?
|
|
34
|
+
Покажи расход по кампаниям за неделю и баланс аккаунта
|
|
35
|
+
Найди код региона для Новосибирска
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Полный список — [58 инструментов](#инструменты-58) ниже.
|
|
14
39
|
|
|
15
40
|
## Установка
|
|
16
41
|
|
|
42
|
+
Нужен Node.js 22+ и OAuth-токен Яндекс.Директа — [как его получить](#токен).
|
|
43
|
+
|
|
44
|
+
### Claude Code
|
|
45
|
+
|
|
17
46
|
```bash
|
|
18
|
-
|
|
19
|
-
cd yandex-direct-mcp-plus
|
|
20
|
-
npm ci && npm run build
|
|
47
|
+
claude mcp add yandex-direct -e YANDEX_DIRECT_TOKEN=ваш_токен -- npx -y yandex-direct-mcp-plus
|
|
21
48
|
```
|
|
22
49
|
|
|
23
|
-
### Claude Desktop
|
|
50
|
+
### Claude Desktop, Cursor и другие клиенты
|
|
24
51
|
|
|
25
52
|
```json
|
|
26
53
|
{
|
|
27
54
|
"mcpServers": {
|
|
28
55
|
"yandex-direct": {
|
|
29
|
-
"command": "
|
|
30
|
-
"args": ["
|
|
56
|
+
"command": "npx",
|
|
57
|
+
"args": ["-y", "yandex-direct-mcp-plus"],
|
|
31
58
|
"env": {
|
|
32
59
|
"YANDEX_DIRECT_TOKEN": "ваш_токен"
|
|
33
60
|
}
|
|
@@ -36,12 +63,19 @@ npm ci && npm run build
|
|
|
36
63
|
}
|
|
37
64
|
```
|
|
38
65
|
|
|
39
|
-
###
|
|
66
|
+
### Из исходников
|
|
40
67
|
|
|
41
68
|
```bash
|
|
42
|
-
|
|
69
|
+
git clone git@github.com:Pavelsiba/yandex-direct-mcp-plus.git
|
|
70
|
+
cd yandex-direct-mcp-plus
|
|
71
|
+
npm ci && npm run build
|
|
43
72
|
```
|
|
44
|
-
|
|
73
|
+
|
|
74
|
+
Дальше тот же конфиг, но `"command": "node"` и путь к `dist/app/index.js` вместо `npx`.
|
|
75
|
+
|
|
76
|
+
## Токен
|
|
77
|
+
|
|
78
|
+
OAuth-токен выпускается для приложения, зарегистрированного в [Яндекс OAuth](https://oauth.yandex.ru/), с доступом к API Директа. Подробности — [регистрация приложения и получение токена](https://yandex.ru/dev/direct/doc/ru/token). Доступ к API нужно [запросить в интерфейсе Директа](https://yandex.ru/dev/direct/doc/ru/access-request) — заявку рассматривают от часа до нескольких суток.
|
|
45
79
|
|
|
46
80
|
| Переменная | Обязательна | Назначение |
|
|
47
81
|
|------------|:-----------:|------------|
|
|
@@ -49,17 +83,36 @@ claude mcp add yandex-direct -e YANDEX_DIRECT_TOKEN=ваш_токен -- node /
|
|
|
49
83
|
| `YANDEX_DIRECT_LOGIN` | нет | Логин клиента для агентских токенов (заголовок `Client-Login`). Обязателен, если токен агентский |
|
|
50
84
|
| `YANDEX_DIRECT_POLYGON_CAMPAIGN_ID` | нет | Только для `npm run test:int`: ID кампании-полигона, оставленной черновиком. Сетевые тесты пишут в неё и ни во что другое; без переменной они пропускаются |
|
|
51
85
|
|
|
52
|
-
|
|
86
|
+
## Что меняет данные
|
|
53
87
|
|
|
54
|
-
|
|
88
|
+
Тестовой среды у Яндекс.Директа больше нет: песочница отключена с июля 2026, и любой вызов идёт по боевому аккаунту. Отлаживать сценарии приходится на отдельной кампании, оставленной черновиком, — показов она не даёт и потому не тратит бюджет, пока не пройдёт модерацию и не будет включена.
|
|
55
89
|
|
|
56
|
-
|
|
90
|
+
Граница проходит не по «чтение или запись», а по скорости, с которой действие превращается в деньги.
|
|
57
91
|
|
|
58
|
-
|
|
92
|
+
**24 инструмента только читают** — все `list_*`, `get_*` и справочники. Вызвать их безопасно всегда.
|
|
59
93
|
|
|
60
|
-
|
|
94
|
+
**Тратят бюджет или запускают показы** — восемь:
|
|
95
|
+
|
|
96
|
+
| Инструмент | Чем именно |
|
|
97
|
+
|------------|------------|
|
|
98
|
+
| `manage_campaigns` | `resume` — включает показы остановленной кампании |
|
|
99
|
+
| `manage_ads` | `resume` и `moderate` — возвращает объявления в показ |
|
|
100
|
+
| `moderate_ads` | Отправляет объявления на модерацию, после неё начнутся показы |
|
|
101
|
+
| `update_campaign` | Меняет дневной бюджет |
|
|
102
|
+
| `set_keyword_bids` | Меняет ставки, то есть цену клика |
|
|
103
|
+
| `set_strategy` | Меняет стратегию — переписывает всю экономику кампании |
|
|
104
|
+
| `add_bid_adjustments` | Заводит корректировку: +N% к ставке на срезе аудитории |
|
|
105
|
+
| `set_bid_adjustments` | Меняет коэффициент существующей корректировки |
|
|
106
|
+
|
|
107
|
+
**Удаляют необратимо** — эти инструменты помечены аннотацией `DESTRUCTIVE`, и хороший MCP-клиент спросит подтверждение перед вызовом:
|
|
61
108
|
|
|
62
|
-
|
|
109
|
+
`manage_campaigns` (`delete`), `manage_ads` (`delete`), `manage_keywords` (`delete`), `delete_ad_groups`, `delete_ad_extensions`, `delete_sitelinks`, `delete_vcards`, `delete_bid_adjustments`, `delete_retargeting_lists`, `manage_ad_images` (`delete`), `manage_dynamic_targets` (`delete`), `set_audience_targets` (`delete`), `manage_negative_keyword_shared_sets` (`delete`).
|
|
110
|
+
|
|
111
|
+
Сюда же — `set_campaign_negative_keywords` и `set_ad_group_negative_keywords` в режиме `replace`: он затирает прежний список минус-фраз целиком. Именно поэтому у них нет режима по умолчанию — `mode` приходится назвать явно.
|
|
112
|
+
|
|
113
|
+
Остальные инструменты создают и правят объекты. Пока кампания не прошла модерацию и не включена, показов по ней нет и бюджет не расходуется.
|
|
114
|
+
|
|
115
|
+
## Инструменты (58)
|
|
63
116
|
|
|
64
117
|
**Кампании**
|
|
65
118
|
|
|
@@ -69,7 +122,7 @@ OAuth-токен выпускается для приложения, зарег
|
|
|
69
122
|
| `get_campaign` | Детальная информация о кампании по ID |
|
|
70
123
|
| `create_campaign` | Создать кампанию (бюджет в рублях, выбор стратегии, часовой пояс, UTM-разметка) |
|
|
71
124
|
| `update_campaign` | Обновить название/бюджет/UTM-разметку и/или статус (SUSPEND/RESUME/ARCHIVE/UNARCHIVE) |
|
|
72
|
-
| `manage_campaigns` | suspend/resume/archive/unarchive для списка кампаний |
|
|
125
|
+
| `manage_campaigns` | suspend/resume/archive/unarchive/delete для списка кампаний |
|
|
73
126
|
| `get_strategy` | Получить стратегию текстово-графической кампании |
|
|
74
127
|
| `set_strategy` | Сменить стратегию: ручная, максимум кликов, средняя цена клика/конверсии, оплата за конверсию |
|
|
75
128
|
| `get_time_targeting` | Расписание показов: часовой пояс, часы по дням недели, праздники |
|
|
@@ -100,6 +153,7 @@ OAuth-токен выпускается для приложения, зарег
|
|
|
100
153
|
|------------|----------|
|
|
101
154
|
| `list_keywords` | Ключевые фразы в группах (ставки в рублях) |
|
|
102
155
|
| `add_keywords` | Добавить ключевые фразы |
|
|
156
|
+
| `update_keywords` | Изменить текст фразы и подстановочные переменные `{param1}`/`{param2}` |
|
|
103
157
|
| `set_keyword_bids` | Установить ставки (поиск/сети, рубли) на фразах/группах/кампаниях |
|
|
104
158
|
| `manage_keywords` | suspend/resume/delete |
|
|
105
159
|
| `set_campaign_negative_keywords` | Минус-фразы кампании: `mode` обязателен — `replace`, `add` или `remove` |
|
|
@@ -111,12 +165,15 @@ OAuth-токен выпускается для приложения, зарег
|
|
|
111
165
|
|------------|----------|
|
|
112
166
|
| `list_sitelinks` | Получить наборы быстрых ссылок |
|
|
113
167
|
| `set_sitelinks` | Создать новый набор быстрых ссылок |
|
|
168
|
+
| `delete_sitelinks` | Удалить наборы быстрых ссылок |
|
|
114
169
|
| `list_ad_extensions` | Получить уточнения (callouts) |
|
|
115
170
|
| `add_ad_extensions` | Создать уточнения |
|
|
116
171
|
| `delete_ad_extensions` | Удалить уточнения |
|
|
117
172
|
| `manage_ad_images` | Загрузить, получить или удалить изображения |
|
|
118
|
-
| `get_bid_adjustments` | Получить
|
|
173
|
+
| `get_bid_adjustments` | Получить корректировки: устройства, пол и возраст, аудитории, регионы, платёжеспособность, размещение |
|
|
174
|
+
| `add_bid_adjustments` | Создать корректировки на кампаниях или группах |
|
|
119
175
|
| `set_bid_adjustments` | Изменить коэффициенты существующих корректировок |
|
|
176
|
+
| `delete_bid_adjustments` | Удалить корректировки по ID |
|
|
120
177
|
|
|
121
178
|
**Аудитории, цели и фиды**
|
|
122
179
|
|
|
@@ -124,6 +181,8 @@ OAuth-токен выпускается для приложения, зарег
|
|
|
124
181
|
|------------|----------|
|
|
125
182
|
| `list_retargeting_lists` | Получить условия ретаргетинга и подбора аудитории |
|
|
126
183
|
| `add_retargeting_list` | Создать условие ретаргетинга |
|
|
184
|
+
| `update_retargeting_lists` | Изменить название, описание и правила условий (правила заменяются целиком) |
|
|
185
|
+
| `delete_retargeting_lists` | Удалить условия ретаргетинга |
|
|
127
186
|
| `list_audience_targets` | Получить аудиторные цели |
|
|
128
187
|
| `set_audience_targets` | add/set_bids/suspend/resume/delete аудиторных целей |
|
|
129
188
|
| `list_dynamic_targets` | Получить динамические цели |
|
|
@@ -139,26 +198,15 @@ OAuth-токен выпускается для приложения, зарег
|
|
|
139
198
|
|------------|----------|
|
|
140
199
|
| `get_statistics` | Статистика за период (показы, клики, расход, CTR, CPC) |
|
|
141
200
|
| `get_search_queries` | Фактические поисковые запросы для подбора минус-фраз |
|
|
142
|
-
| `get_changes` | Проверить изменения кампаний,
|
|
201
|
+
| `get_changes` | Проверить изменения кампаний, групп, объявлений и справочников |
|
|
143
202
|
| `list_vcards` | Получить виртуальные визитки |
|
|
144
203
|
| `add_vcard` | Создать виртуальную визитку |
|
|
204
|
+
| `delete_vcards` | Удалить визитки по ID |
|
|
145
205
|
| `list_businesses` | Получить профили организаций Яндекс Бизнеса |
|
|
146
206
|
| `get_account_balance` | Баланс аккаунта (Live API v4) |
|
|
147
|
-
| `get_regions` | Справочник кодов регионов (225 = Россия) |
|
|
207
|
+
| `get_regions` | Справочник кодов регионов (225 = Россия), с вложенностью по запросу |
|
|
148
208
|
| `list_time_zones` | Справочник часовых поясов для расписания показов |
|
|
149
209
|
|
|
150
|
-
## Примеры запросов
|
|
151
|
-
|
|
152
|
-
```
|
|
153
|
-
Покажи все активные рекламные кампании
|
|
154
|
-
Создай кампанию "Летняя распродажа" с бюджетом 5000 ₽/день, старт 2026-05-01
|
|
155
|
-
Установи ставку 25 ₽ на ключевые фразы 111 и 222
|
|
156
|
-
Добавь минус-фразы "бесплатно", "скачать" в кампанию 12345
|
|
157
|
-
Какая статистика у кампаний 12345 и 67890 за последнюю неделю?
|
|
158
|
-
Найди код региона для Новосибирска
|
|
159
|
-
Покажи баланс аккаунта
|
|
160
|
-
```
|
|
161
|
-
|
|
162
210
|
## Разработка
|
|
163
211
|
|
|
164
212
|
```bash
|
package/dist/app/registry.js
CHANGED
|
@@ -4,21 +4,21 @@ import { createAdGroupTool, deleteAdGroupsTool, listAdGroupsTool } from "#tools/
|
|
|
4
4
|
import { manageAdImagesTool } from "#tools/ad-images/tool";
|
|
5
5
|
import { createTextAdTool, listAdsTool, manageAdsTool, moderateAdsTool, updateTextAdTool } from "#tools/ads/tool";
|
|
6
6
|
import { listAudienceTargetsTool, setAudienceTargetsTool } from "#tools/audience-targets/tool";
|
|
7
|
-
import { getBidAdjustmentsTool, setBidAdjustmentsTool } from "#tools/bid-adjustments/tool";
|
|
7
|
+
import { addBidAdjustmentsTool, deleteBidAdjustmentsTool, getBidAdjustmentsTool, setBidAdjustmentsTool } from "#tools/bid-adjustments/tool";
|
|
8
8
|
import { listBusinessesTool } from "#tools/businesses/tool";
|
|
9
9
|
import { createCampaignTool, getCampaignTool, getStrategyTool, listCampaignsTool, manageCampaignsTool, setStrategyTool, updateCampaignTool } from "#tools/campaigns/tool";
|
|
10
10
|
import { getChangesTool } from "#tools/changes/tool";
|
|
11
11
|
import { getRegionsTool, listTimeZonesTool } from "#tools/dictionaries/tool";
|
|
12
12
|
import { listDynamicTargetsTool, manageDynamicTargetsTool } from "#tools/dynamic-targets/tool";
|
|
13
13
|
import { listFeedsTool } from "#tools/feeds/tool";
|
|
14
|
-
import { addKeywordsTool, listKeywordsTool, manageKeywordsTool, setKeywordBidsTool } from "#tools/keywords/tool";
|
|
14
|
+
import { addKeywordsTool, getKeywordAuctionTool, listKeywordsTool, manageKeywordsTool, setKeywordBidsTool, updateKeywordsTool } from "#tools/keywords/tool";
|
|
15
15
|
import { getCampaignNegativeKeywordsTool, linkNegativeKeywordSetsTool, listNegativeKeywordSharedSetsTool, manageNegativeKeywordSharedSetsTool, setAdGroupNegativeKeywordsTool, setCampaignNegativeKeywordsTool } from "#tools/negative-keywords/tool";
|
|
16
|
-
import { addRetargetingListTool, listRetargetingListsTool } from "#tools/retargeting/tool";
|
|
16
|
+
import { addRetargetingListTool, deleteRetargetingListsTool, listRetargetingListsTool, updateRetargetingListsTool } from "#tools/retargeting/tool";
|
|
17
17
|
import { getSearchQueriesTool } from "#tools/search-queries/tool";
|
|
18
|
-
import { listSitelinksTool, setSitelinksTool } from "#tools/sitelinks/tool";
|
|
18
|
+
import { deleteSitelinksTool, listSitelinksTool, setSitelinksTool } from "#tools/sitelinks/tool";
|
|
19
19
|
import { getStatisticsTool } from "#tools/statistics/tool";
|
|
20
20
|
import { getTimeTargetingTool, setTimeTargetingTool } from "#tools/time-targeting/tool";
|
|
21
|
-
import { addVcardTool, listVcardsTool } from "#tools/vcards/tool";
|
|
21
|
+
import { addVcardTool, deleteVcardsTool, listVcardsTool } from "#tools/vcards/tool";
|
|
22
22
|
export const tools = [
|
|
23
23
|
// Кампании и стратегии
|
|
24
24
|
listCampaignsTool,
|
|
@@ -43,8 +43,10 @@ export const tools = [
|
|
|
43
43
|
// Ключевые фразы и ставки
|
|
44
44
|
listKeywordsTool,
|
|
45
45
|
addKeywordsTool,
|
|
46
|
+
updateKeywordsTool,
|
|
46
47
|
manageKeywordsTool,
|
|
47
48
|
setKeywordBidsTool,
|
|
49
|
+
getKeywordAuctionTool,
|
|
48
50
|
// Минус-фразы
|
|
49
51
|
getCampaignNegativeKeywordsTool,
|
|
50
52
|
setCampaignNegativeKeywordsTool,
|
|
@@ -55,12 +57,14 @@ export const tools = [
|
|
|
55
57
|
// Ассеты объявления
|
|
56
58
|
listSitelinksTool,
|
|
57
59
|
setSitelinksTool,
|
|
60
|
+
deleteSitelinksTool,
|
|
58
61
|
listAdExtensionsTool,
|
|
59
62
|
addAdExtensionsTool,
|
|
60
63
|
deleteAdExtensionsTool,
|
|
61
64
|
manageAdImagesTool,
|
|
62
65
|
listVcardsTool,
|
|
63
66
|
addVcardTool,
|
|
67
|
+
deleteVcardsTool,
|
|
64
68
|
// Таргетинг и корректировки
|
|
65
69
|
listAudienceTargetsTool,
|
|
66
70
|
setAudienceTargetsTool,
|
|
@@ -68,8 +72,12 @@ export const tools = [
|
|
|
68
72
|
manageDynamicTargetsTool,
|
|
69
73
|
listRetargetingListsTool,
|
|
70
74
|
addRetargetingListTool,
|
|
75
|
+
updateRetargetingListsTool,
|
|
76
|
+
deleteRetargetingListsTool,
|
|
71
77
|
getBidAdjustmentsTool,
|
|
78
|
+
addBidAdjustmentsTool,
|
|
72
79
|
setBidAdjustmentsTool,
|
|
80
|
+
deleteBidAdjustmentsTool,
|
|
73
81
|
// Отчёты
|
|
74
82
|
getStatisticsTool,
|
|
75
83
|
getSearchQueriesTool,
|
|
@@ -1,10 +1,29 @@
|
|
|
1
1
|
// Разбор ошибок Директа. Хендлеры сюда не заглядывают: их дело — сценарий.
|
|
2
|
+
// 53 — единственная ошибка, которую не чинит ни повтор, ни другой запрос: токен истёк,
|
|
3
|
+
// отозван или указан неверно. Проба 06.09.2026: v5 отдаёт её телом с HTTP 200
|
|
4
|
+
// («Ошибка авторизации» / «Недействительный OAuth-токен»), v4 — тем же кодом, но с пустым
|
|
5
|
+
// error_detail, а Reports — HTTP 400 и XML, где код лежит в <reports:errorCode>.
|
|
6
|
+
const AUTH_ERROR_CODE = 53;
|
|
7
|
+
// Текст адресован модели на другом конце протокола, а не человеку в логе: без явного
|
|
8
|
+
// «повтор не поможет» она уводит вызов в ретраи, и пользователь так и не узнает, что
|
|
9
|
+
// нужно перевыпустить токен.
|
|
10
|
+
const AUTH_ERROR_MESSAGE = [
|
|
11
|
+
"Токен Яндекс.Директа не принят: истёк, отозван или задан неверно.",
|
|
12
|
+
"Это не сбой сети и не временная ошибка — повторять вызов бесполезно.",
|
|
13
|
+
"Нужен новый OAuth-токен (https://yandex.ru/dev/direct/doc/ru/token):",
|
|
14
|
+
"передайте его в переменной YANDEX_DIRECT_TOKEN в конфигурации MCP-клиента и перезапустите сервер."
|
|
15
|
+
].join(" ");
|
|
16
|
+
function isAuthError(code) {
|
|
17
|
+
return Number(code) === AUTH_ERROR_CODE;
|
|
18
|
+
}
|
|
2
19
|
// v5 возвращает ошибку уровня запроса телом с HTTP 200 — статус проверять бесполезно,
|
|
3
20
|
// признак ошибки один: ключ `error`. Док: https://yandex.ru/dev/direct/doc/en/concepts/errors-list
|
|
4
21
|
export function assertNoApiError(data) {
|
|
5
22
|
const error = data?.error;
|
|
6
23
|
if (!error || typeof error !== "object")
|
|
7
24
|
return;
|
|
25
|
+
if (isAuthError(error.error_code))
|
|
26
|
+
throw new Error(AUTH_ERROR_MESSAGE);
|
|
8
27
|
const parts = [`Ошибка API Яндекс.Директ [${error.error_code ?? "?"}]: ${error.error_string ?? "неизвестная ошибка"}`];
|
|
9
28
|
if (error.error_detail)
|
|
10
29
|
parts.push(`— ${error.error_detail}`);
|
|
@@ -16,6 +35,18 @@ export function assertNoApiError(data) {
|
|
|
16
35
|
export function assertNoApiErrorV4(data) {
|
|
17
36
|
if (!data || (data.error_code === undefined && data.error_str === undefined))
|
|
18
37
|
return;
|
|
38
|
+
if (isAuthError(data.error_code))
|
|
39
|
+
throw new Error(AUTH_ERROR_MESSAGE);
|
|
19
40
|
const detail = data.error_detail ? ` — ${data.error_detail}` : "";
|
|
20
41
|
throw new Error(`Ошибка API v4 [${data.error_code ?? "?"}]: ${data.error_str ?? "неизвестная ошибка"}${detail}`);
|
|
21
42
|
}
|
|
43
|
+
const REPORT_ERROR_CODE = /<reports:errorCode>(\d+)<\/reports:errorCode>/;
|
|
44
|
+
// Reports — единственный сервис, отвечающий настоящим HTTP-кодом и XML, поэтому его
|
|
45
|
+
// ошибка не доходит ни до assertNoApiError, ни до схемы: транспорт бросает раньше.
|
|
46
|
+
// Вызывается из fetchWithRetry — там тело неуспешного ответа и оказывается. Код тянем
|
|
47
|
+
// регуляркой: разбирать XML ради одного числа — лишняя зависимость.
|
|
48
|
+
export function assertNoReportAuthError(body) {
|
|
49
|
+
const code = REPORT_ERROR_CODE.exec(body)?.[1];
|
|
50
|
+
if (code && isAuthError(code))
|
|
51
|
+
throw new Error(AUTH_ERROR_MESSAGE);
|
|
52
|
+
}
|
package/dist/shared/api/fetch.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Транспорт: заголовки, повторы, таймаут. Знает про HTTP и токен, не знает про домен.
|
|
2
|
+
import { assertNoReportAuthError } from "#shared/api/errors";
|
|
2
3
|
import { getClientLogin, getToken } from "#shared/config/env";
|
|
3
4
|
import { MAX_RETRIES, MAX_RETRY_DELAY_MS, REQUEST_TIMEOUT_MS } from "#shared/config/limits";
|
|
4
5
|
export function commonHeaders() {
|
|
@@ -45,6 +46,7 @@ export async function fetchWithRetry(url, options = {}, retries = MAX_RETRIES) {
|
|
|
45
46
|
continue;
|
|
46
47
|
}
|
|
47
48
|
const body = await response.text().catch(() => "");
|
|
49
|
+
assertNoReportAuthError(body);
|
|
48
50
|
throw new Error(`HTTP ${response.status}: ${response.statusText}. ${body}`);
|
|
49
51
|
}
|
|
50
52
|
catch (error) {
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
export declare const API_FIELDS: {
|
|
2
|
+
readonly adextensions: {
|
|
3
|
+
readonly AdExtensionFieldEnum: readonly ["Associated", "Id", "State", "Status", "StatusClarification", "Type"];
|
|
4
|
+
readonly CalloutFieldEnum: readonly ["CalloutText"];
|
|
5
|
+
};
|
|
6
|
+
readonly adgroups: {
|
|
7
|
+
readonly AdGroupFieldEnum: readonly ["CampaignId", "Id", "Name", "NegativeKeywordSharedSetIds", "NegativeKeywords", "RegionIds", "RestrictedRegionIds", "ServingStatus", "Status", "Subtype", "TrackingParams", "Type"];
|
|
8
|
+
readonly DynamicTextAdGroupFieldEnum: readonly ["AutotargetingCategories", "AutotargetingSettings", "DomainUrl", "DomainUrlProcessingStatus"];
|
|
9
|
+
readonly DynamicTextFeedAdGroupFieldEnum: readonly ["AutotargetingCategories", "AutotargetingSettings", "FeedId", "Source", "SourceProcessingStatus", "SourceType"];
|
|
10
|
+
readonly MobileAppAdGroupFieldEnum: readonly ["AppAvailabilityStatus", "AppIconModeration", "AppOperatingSystemType", "StoreUrl", "TargetCarrier", "TargetDeviceType", "TargetOperatingSystemVersion"];
|
|
11
|
+
readonly SmartAdGroupFieldEnum: readonly ["AdBodySource", "AdTitleSource", "FeedId"];
|
|
12
|
+
readonly TextAdGroupFeedParamsFieldEnum: readonly ["FeedCategoryIds", "FeedId"];
|
|
13
|
+
readonly UnifiedAdGroupFieldEnum: readonly ["OfferRetargeting"];
|
|
14
|
+
};
|
|
15
|
+
readonly adimages: {
|
|
16
|
+
readonly AdImageFieldEnum: readonly ["AdImageHash", "Associated", "Name", "OriginalUrl", "PreviewUrl", "Subtype", "Type"];
|
|
17
|
+
};
|
|
18
|
+
readonly ads: {
|
|
19
|
+
readonly AdFieldEnum: readonly ["AdCategories", "AdGroupId", "AgeLabel", "CampaignId", "Id", "State", "Status", "StatusClarification", "Subtype", "Type"];
|
|
20
|
+
readonly CpcVideoAdBuilderAdFieldEnum: readonly ["AutogeneratedErirAdDescription", "Creative", "ErirAdDescription", "Href", "TurboPageId", "TurboPageModeration"];
|
|
21
|
+
readonly CpmBannerAdBuilderAdFieldEnum: readonly ["AutogeneratedErirAdDescription", "Creative", "ErirAdDescription", "Href", "TrackingPixels", "TurboPageId", "TurboPageModeration"];
|
|
22
|
+
readonly CpmVideoAdBuilderAdFieldEnum: readonly ["AutogeneratedErirAdDescription", "Creative", "ErirAdDescription", "Href", "TrackingPixels", "TurboPageId", "TurboPageModeration"];
|
|
23
|
+
readonly DynamicTextAdFieldEnum: readonly ["AdExtensions", "AdImageHash", "AdImageModeration", "SitelinkSetId", "SitelinksModeration", "Text", "VCardId", "VCardModeration"];
|
|
24
|
+
readonly ListingAdFieldEnum: readonly ["AdExtensions", "BusinessId", "DefaultTexts", "FeedFilterConditions", "FeedId", "FeedProcessingStatus", "SitelinkSetId", "SitelinksModeration", "TextSources", "TitleSources"];
|
|
25
|
+
readonly MobileAppAdBuilderAdFieldEnum: readonly ["AutogeneratedErirAdDescription", "Creative", "ErirAdDescription", "TrackingUrl"];
|
|
26
|
+
readonly MobileAppAdFieldEnum: readonly ["Action", "AdImageHash", "AdImageModeration", "AutogeneratedErirAdDescription", "ErirAdDescription", "Features", "Text", "Title", "TrackingUrl", "VideoExtension"];
|
|
27
|
+
readonly MobileAppCpcVideoAdBuilderAdFieldEnum: readonly ["AutogeneratedErirAdDescription", "Creative", "ErirAdDescription", "TrackingUrl"];
|
|
28
|
+
readonly MobileAppImageAdFieldEnum: readonly ["AdImageHash", "AutogeneratedErirAdDescription", "ErirAdDescription", "TrackingUrl"];
|
|
29
|
+
readonly ResponsiveAdFieldEnum: readonly ["AdExtensions", "AdImages", "BusinessId", "DisplayDomain", "DisplayUrlPath", "DisplayUrlPathModeration", "ErirAdDescription", "Href", "PriceExtension", "SitelinkSetId", "SitelinksModeration", "Texts", "Titles", "VideoExtensions"];
|
|
30
|
+
readonly ShoppingAdFieldEnum: readonly ["AdExtensions", "BusinessId", "DefaultTexts", "FeedFilterConditions", "FeedId", "FeedProcessingStatus", "SitelinkSetId", "SitelinksModeration", "TextSources", "TitleSources"];
|
|
31
|
+
readonly SmartAdBuilderAdFieldEnum: readonly ["Creative"];
|
|
32
|
+
readonly TextAdBuilderAdFieldEnum: readonly ["AutogeneratedErirAdDescription", "Creative", "ErirAdDescription", "FinalUrl", "Href", "TurboPageId", "TurboPageModeration"];
|
|
33
|
+
readonly TextAdFieldEnum: readonly ["AdExtensions", "AdImageHash", "AdImageModeration", "AutogeneratedErirAdDescription", "BusinessId", "DisplayDomain", "DisplayUrlPath", "DisplayUrlPathModeration", "ErirAdDescription", "FinalUrl", "Href", "Mobile", "PreferVCardOverBusiness", "SitelinkSetId", "SitelinksModeration", "Text", "Title", "Title2", "TurboPageId", "TurboPageModeration", "VCardId", "VCardModeration", "VideoExtension"];
|
|
34
|
+
readonly TextAdPriceExtensionFieldEnum: readonly ["OldPrice", "Price", "PriceCurrency", "PriceQualifier"];
|
|
35
|
+
readonly TextImageAdFieldEnum: readonly ["AdImageHash", "AutogeneratedErirAdDescription", "ErirAdDescription", "FinalUrl", "Href", "TurboPageId", "TurboPageModeration"];
|
|
36
|
+
};
|
|
37
|
+
readonly agencyclients: {
|
|
38
|
+
readonly AgencyClientFieldEnum: readonly ["AccountQuality", "Archived", "AvailableAdGroupTypes", "AvailableCampaignTypes", "Bonuses", "ClientId", "ClientInfo", "CountryId", "CreatedAt", "Currency", "ForbiddenPlatform", "Grants", "Login", "Notification", "OverdraftSumAvailable", "Phone", "Representatives", "Restrictions", "Settings", "Type", "VatRate"];
|
|
39
|
+
};
|
|
40
|
+
readonly audiencetargets: {
|
|
41
|
+
readonly AudienceTargetFieldEnum: readonly ["AdGroupId", "CampaignId", "ContextBid", "Id", "InterestId", "RetargetingListId", "State", "StrategyPriority"];
|
|
42
|
+
};
|
|
43
|
+
readonly bidmodifiers: {
|
|
44
|
+
readonly AdGroupAdjustmentFieldEnum: readonly ["BidModifier"];
|
|
45
|
+
readonly BidModifierFieldEnum: readonly ["AdGroupId", "CampaignId", "Id", "Level", "Type"];
|
|
46
|
+
readonly DemographicsAdjustmentFieldEnum: readonly ["Age", "BidModifier", "Enabled", "Gender"];
|
|
47
|
+
readonly DesktopAdjustmentFieldEnum: readonly ["BidModifier"];
|
|
48
|
+
readonly DesktopOnlyAdjustmentFieldEnum: readonly ["BidModifier"];
|
|
49
|
+
readonly IncomeGradeAdjustmentFieldEnum: readonly ["BidModifier", "Enabled", "Grade"];
|
|
50
|
+
readonly MobileAdjustmentFieldEnum: readonly ["BidModifier", "OperatingSystemType"];
|
|
51
|
+
readonly RegionalAdjustmentFieldEnum: readonly ["BidModifier", "Enabled", "RegionId"];
|
|
52
|
+
readonly RetargetingAdjustmentFieldEnum: readonly ["Accessible", "BidModifier", "Enabled", "RetargetingConditionId"];
|
|
53
|
+
readonly SerpLayoutAdjustmentFieldEnum: readonly ["BidModifier", "Enabled", "SerpLayout"];
|
|
54
|
+
readonly SmartAdAdjustmentFieldEnum: readonly ["BidModifier"];
|
|
55
|
+
readonly SmartTvAdjustmentFieldEnum: readonly ["BidModifier"];
|
|
56
|
+
readonly TabletAdjustmentFieldEnum: readonly ["BidModifier", "OperatingSystemType"];
|
|
57
|
+
readonly VideoAdjustmentFieldEnum: readonly ["BidModifier"];
|
|
58
|
+
};
|
|
59
|
+
readonly bids: {
|
|
60
|
+
readonly BidFieldEnum: readonly ["AdGroupId", "AuctionBids", "AutotargetingSearchBidIsAuto", "Bid", "CampaignId", "CompetitorsBids", "ContextBid", "ContextCoverage", "CurrentSearchPrice", "KeywordId", "MinSearchPrice", "SearchPrices", "ServingStatus", "StrategyPriority"];
|
|
61
|
+
};
|
|
62
|
+
readonly businesses: {
|
|
63
|
+
readonly BusinessFieldEnum: readonly ["Address", "HasOffice", "Id", "InternalUrl", "IsPublished", "MergedIds", "Name", "Phone", "ProfileUrl", "Rubric", "Urls"];
|
|
64
|
+
};
|
|
65
|
+
readonly campaigns: {
|
|
66
|
+
readonly CampaignFieldEnum: readonly ["BlockedIps", "ClientInfo", "Currency", "DailyBudget", "EndDate", "ExcludedSites", "Funds", "Id", "Name", "NegativeKeywords", "Notification", "RepresentedBy", "SourceId", "StartDate", "State", "Statistics", "Status", "StatusClarification", "StatusPayment", "TimeTargeting", "TimeZone", "Type"];
|
|
67
|
+
readonly CpmBannerCampaignFieldEnum: readonly ["BiddingStrategy", "CounterIds", "FrequencyCap", "Settings", "VideoTarget"];
|
|
68
|
+
readonly DynamicTextCampaignFieldEnum: readonly ["AttributionModel", "BiddingStrategy", "CanBeUsedAsPackageBiddingStrategySource", "CounterIds", "NegativeKeywordSharedSetIds", "PackageBiddingStrategy", "PlacementTypes", "PriorityGoals", "Settings", "TrackingParams"];
|
|
69
|
+
readonly DynamicTextCampaignSearchStrategyPlacementTypesFieldEnum: readonly ["DynamicPlaces", "ProductGallery", "SearchResults"];
|
|
70
|
+
readonly MobileAppCampaignFieldEnum: readonly ["BiddingStrategy", "CanBeUsedAsPackageBiddingStrategySource", "NegativeKeywordSharedSetIds", "PackageBiddingStrategy", "Settings", "WeeklyBudgetRollover"];
|
|
71
|
+
readonly SmartCampaignFieldEnum: readonly ["AttributionModel", "BiddingStrategy", "CanBeUsedAsPackageBiddingStrategySource", "CounterId", "PackageBiddingStrategy", "PriorityGoals", "Settings", "TrackingParams"];
|
|
72
|
+
readonly TextCampaignFieldEnum: readonly ["AttributionModel", "BiddingStrategy", "CanBeUsedAsPackageBiddingStrategySource", "CounterIds", "NegativeKeywordSharedSetIds", "PackageBiddingStrategy", "PriorityGoals", "RelevantKeywords", "Settings", "TrackingParams", "WeeklyBudgetRollover"];
|
|
73
|
+
readonly TextCampaignSearchStrategyPlacementTypesFieldEnum: readonly ["DynamicPlaces", "ProductGallery", "SearchResults"];
|
|
74
|
+
readonly UnifiedCampaignFieldEnum: readonly ["AttributionModel", "BiddingStrategy", "CanBeUsedAsPackageBiddingStrategySource", "CounterIds", "NegativeKeywordSharedSetIds", "PackageBiddingStrategy", "PriorityGoals", "Settings", "TrackingParams", "WeeklyBudgetRollover"];
|
|
75
|
+
readonly UnifiedCampaignPackageBiddingStrategyPlatformsFieldEnum: readonly ["DynamicPlaces", "Maps", "Network", "ProductGallery", "SearchOrganizationList", "SearchResult"];
|
|
76
|
+
readonly UnifiedCampaignSearchStrategyPlacementTypesFieldEnum: readonly ["DynamicPlaces", "Maps", "ProductGallery", "SearchOrganizationList", "SearchResults"];
|
|
77
|
+
};
|
|
78
|
+
readonly changes: {
|
|
79
|
+
readonly CheckFieldEnum: readonly ["AdGroupIds", "AdIds", "CampaignIds", "CampaignsStat"];
|
|
80
|
+
};
|
|
81
|
+
readonly clients: {
|
|
82
|
+
readonly ClientFieldEnum: readonly ["AccountQuality", "Archived", "AvailableAdGroupTypes", "AvailableCampaignTypes", "Bonuses", "ClientId", "ClientInfo", "CountryId", "CreatedAt", "Currency", "ForbiddenPlatform", "Grants", "Login", "Notification", "OverdraftSumAvailable", "Phone", "Representatives", "Restrictions", "Settings", "Type", "VatRate"];
|
|
83
|
+
};
|
|
84
|
+
readonly creatives: {
|
|
85
|
+
readonly CpcVideoCreativeFieldEnum: readonly ["Duration"];
|
|
86
|
+
readonly CpmVideoCreativeFieldEnum: readonly ["Duration"];
|
|
87
|
+
readonly CreativeFieldEnum: readonly ["Associated", "Height", "Id", "IsAdaptive", "Name", "PreviewUrl", "ThumbnailUrl", "Type", "Width"];
|
|
88
|
+
readonly SmartCreativeFieldEnum: readonly ["BusinessType", "CreativeGroupId", "CreativeGroupName"];
|
|
89
|
+
readonly VideoExtensionCreativeFieldEnum: readonly ["Duration"];
|
|
90
|
+
};
|
|
91
|
+
readonly dictionaries: {
|
|
92
|
+
readonly GeoRegionFieldEnum: readonly ["GeoRegionId", "GeoRegionName", "ParentGeoRegionNames"];
|
|
93
|
+
};
|
|
94
|
+
readonly dynamictextadtargets: {
|
|
95
|
+
readonly WebpageFieldEnum: readonly ["AdGroupId", "Bid", "CampaignId", "ConditionType", "Conditions", "ContextBid", "Id", "Name", "State", "StatusClarification", "StrategyPriority"];
|
|
96
|
+
};
|
|
97
|
+
readonly feeds: {
|
|
98
|
+
readonly FeedFieldEnum: readonly ["BusinessType", "CampaignIds", "FilterSchema", "Id", "Name", "NumberOfItems", "NumberOfListings", "SourceType", "Status", "TitleAndTextSources", "UpdatedAt"];
|
|
99
|
+
readonly FileFeedFieldEnum: readonly ["Filename"];
|
|
100
|
+
readonly UrlFeedFieldEnum: readonly ["Login", "RemoveUtmTags", "Url"];
|
|
101
|
+
};
|
|
102
|
+
readonly keywordbids: {
|
|
103
|
+
readonly KeywordBidFieldEnum: readonly ["AdGroupId", "CampaignId", "KeywordId", "ServingStatus", "StrategyPriority"];
|
|
104
|
+
readonly KeywordBidNetworkFieldEnum: readonly ["Bid", "Coverage"];
|
|
105
|
+
readonly KeywordBidSearchFieldEnum: readonly ["AuctionBids", "AutotargetingSearchBidIsAuto", "Bid"];
|
|
106
|
+
};
|
|
107
|
+
readonly keywords: {
|
|
108
|
+
readonly KeywordFieldEnum: readonly ["AdGroupId", "AutotargetingBrandOptions", "AutotargetingCategories", "AutotargetingSearchBidIsAuto", "Bid", "CampaignId", "ContextBid", "Id", "Keyword", "Productivity", "ServingStatus", "State", "StatisticsNetwork", "StatisticsSearch", "Status", "StrategyPriority", "UserParam1", "UserParam2"];
|
|
109
|
+
};
|
|
110
|
+
readonly keywordsresearch: {
|
|
111
|
+
readonly HasSearchVolumeFieldEnum: readonly ["AllDevices", "Desktops", "Keyword", "MobilePhones", "RegionIds", "Tablets"];
|
|
112
|
+
};
|
|
113
|
+
readonly leads: {
|
|
114
|
+
readonly LeadFieldEnum: readonly ["Data", "Id", "SubmittedAt", "TurboPageId", "TurboPageName"];
|
|
115
|
+
};
|
|
116
|
+
readonly negativekeywordsharedsets: {
|
|
117
|
+
readonly NegativeKeywordSharedSetFieldEnum: readonly ["Associated", "Id", "Name", "NegativeKeywords"];
|
|
118
|
+
};
|
|
119
|
+
readonly retargetinglists: {
|
|
120
|
+
readonly RetargetingListFieldEnum: readonly ["AvailableForTargetsInAdGroupTypes", "Description", "Id", "IsAvailable", "Name", "Rules", "Scope", "Type"];
|
|
121
|
+
};
|
|
122
|
+
readonly sitelinks: {
|
|
123
|
+
readonly SitelinkFieldEnum: readonly ["Description", "Href", "Title", "TurboPageId"];
|
|
124
|
+
readonly SitelinksSetFieldEnum: readonly ["Id", "Sitelinks"];
|
|
125
|
+
};
|
|
126
|
+
readonly smartadtargets: {
|
|
127
|
+
readonly SmartAdTargetFieldEnum: readonly ["AdGroupId", "Audience", "AvailableItemsOnly", "AverageCpa", "AverageCpc", "CampaignId", "ConditionType", "Conditions", "Id", "Name", "State", "StrategyPriority"];
|
|
128
|
+
};
|
|
129
|
+
readonly strategies: {
|
|
130
|
+
readonly StrategyAverageCpaFieldEnum: readonly ["AverageCpa", "BidCeiling", "BudgetType", "CustomPeriodBudget", "ExplorationBudget", "GoalId", "WeeklyBudgetRollover", "WeeklySpendLimit"];
|
|
131
|
+
readonly StrategyAverageCpaMultipleGoalsFieldEnum: readonly ["BidCeiling", "BudgetType", "CustomPeriodBudget", "ExplorationBudget", "WeeklyBudgetRollover", "WeeklySpendLimit"];
|
|
132
|
+
readonly StrategyAverageCpaPerCampaignFieldEnum: readonly ["AverageCpa", "BidCeiling", "BudgetType", "CustomPeriodBudget", "ExplorationBudget", "GoalId", "WeeklySpendLimit"];
|
|
133
|
+
readonly StrategyAverageCpaPerFilterFieldEnum: readonly ["BidCeiling", "BudgetType", "CustomPeriodBudget", "ExplorationBudget", "FilterAverageCpa", "GoalId", "WeeklySpendLimit"];
|
|
134
|
+
readonly StrategyAverageCpcFieldEnum: readonly ["AverageCpc", "BudgetType", "CustomPeriodBudget", "WeeklyBudgetRollover", "WeeklySpendLimit"];
|
|
135
|
+
readonly StrategyAverageCpcPerCampaignFieldEnum: readonly ["AverageCpc", "BidCeiling", "BudgetType", "CustomPeriodBudget", "WeeklySpendLimit"];
|
|
136
|
+
readonly StrategyAverageCpcPerFilterFieldEnum: readonly ["BidCeiling", "BudgetType", "CustomPeriodBudget", "FilterAverageCpc", "WeeklySpendLimit"];
|
|
137
|
+
readonly StrategyAverageCrrFieldEnum: readonly ["BudgetType", "Crr", "CustomPeriodBudget", "ExplorationBudget", "GoalId", "WeeklyBudgetRollover", "WeeklySpendLimit"];
|
|
138
|
+
readonly StrategyFieldEnum: readonly ["AttributionModel", "CounterIds", "Id", "Name", "PriorityGoals", "StatusArchived", "Type"];
|
|
139
|
+
readonly StrategyMaximumClicksFieldEnum: readonly ["BidCeiling", "BudgetType", "CustomPeriodBudget", "WeeklyBudgetRollover", "WeeklySpendLimit"];
|
|
140
|
+
readonly StrategyMaximumConversionRateFieldEnum: readonly ["BidCeiling", "BudgetType", "CustomPeriodBudget", "GoalId", "WeeklyBudgetRollover", "WeeklySpendLimit"];
|
|
141
|
+
readonly StrategyMaxProfitFieldEnum: readonly ["BudgetType", "CustomPeriodBudget", "ExplorationBudget", "WeeklyBudgetRollover", "WeeklySpendLimit"];
|
|
142
|
+
readonly StrategyPayForConversionCrrFieldEnum: readonly ["BudgetType", "Crr", "CustomPeriodBudget", "GoalId", "WeeklySpendLimit"];
|
|
143
|
+
readonly StrategyPayForConversionFieldEnum: readonly ["BudgetType", "Cpa", "CustomPeriodBudget", "GoalId", "WeeklySpendLimit"];
|
|
144
|
+
readonly StrategyPayForConversionMultipleGoalsFieldEnum: readonly ["BudgetType", "CustomPeriodBudget", "WeeklySpendLimit"];
|
|
145
|
+
readonly StrategyPayForConversionPerCampaignFieldEnum: readonly ["BudgetType", "Cpa", "CustomPeriodBudget", "GoalId", "WeeklySpendLimit"];
|
|
146
|
+
readonly StrategyPayForConversionPerFilterFieldEnum: readonly ["BudgetType", "Cpa", "CustomPeriodBudget", "GoalId", "WeeklySpendLimit"];
|
|
147
|
+
};
|
|
148
|
+
readonly turbopages: {
|
|
149
|
+
readonly TurboPageFieldEnum: readonly ["BoundWithHref", "Href", "Id", "Name", "PreviewHref", "TurboSiteHref"];
|
|
150
|
+
};
|
|
151
|
+
readonly vcards: {
|
|
152
|
+
readonly VCardFieldEnum: readonly ["Apartment", "Building", "CampaignId", "City", "CompanyName", "ContactEmail", "ContactPerson", "Country", "ExtraMessage", "House", "Id", "InstantMessenger", "MetroStationId", "Ogrn", "Phone", "PointOnMap", "Street", "WorkTime"];
|
|
153
|
+
};
|
|
154
|
+
readonly "general.xsd": {
|
|
155
|
+
readonly AutotargetingBrandOptionsFieldEnum: readonly ["WithAdvertiserBrand", "WithCompetitorsBrand", "WithoutBrands"];
|
|
156
|
+
readonly AutotargetingCategoriesFieldEnum: readonly ["Accessory", "Alternative", "Broader", "Exact", "Narrow"];
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
type ApiService = keyof typeof API_FIELDS;
|
|
160
|
+
export type FieldOf<S extends ApiService, E extends keyof (typeof API_FIELDS)[S]> = (typeof API_FIELDS)[S][E] extends readonly (infer Value)[] ? Value : never;
|
|
161
|
+
export {};
|