yandex-direct-mcp-plus 1.3.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.
Files changed (177) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +186 -0
  3. package/dist/app/index.d.ts +2 -0
  4. package/dist/app/index.js +15 -0
  5. package/dist/app/registry.d.ts +2 -0
  6. package/dist/app/registry.js +83 -0
  7. package/dist/app/server.d.ts +4 -0
  8. package/dist/app/server.js +30 -0
  9. package/dist/shared/api/client.d.ts +1 -0
  10. package/dist/shared/api/client.js +16 -0
  11. package/dist/shared/api/errors.d.ts +2 -0
  12. package/dist/shared/api/errors.js +21 -0
  13. package/dist/shared/api/fetch.d.ts +5 -0
  14. package/dist/shared/api/fetch.js +62 -0
  15. package/dist/shared/api/json.d.ts +2 -0
  16. package/dist/shared/api/json.js +13 -0
  17. package/dist/shared/api/parse.d.ts +2 -0
  18. package/dist/shared/api/parse.js +10 -0
  19. package/dist/shared/api/reports.d.ts +6 -0
  20. package/dist/shared/api/reports.js +45 -0
  21. package/dist/shared/api/v4.d.ts +1 -0
  22. package/dist/shared/api/v4.js +18 -0
  23. package/dist/shared/config/endpoints.d.ts +3 -0
  24. package/dist/shared/config/endpoints.js +8 -0
  25. package/dist/shared/config/enums.d.ts +30 -0
  26. package/dist/shared/config/enums.js +137 -0
  27. package/dist/shared/config/env.d.ts +2 -0
  28. package/dist/shared/config/env.js +14 -0
  29. package/dist/shared/config/limits.d.ts +58 -0
  30. package/dist/shared/config/limits.js +54 -0
  31. package/dist/shared/lib/campaign-type.d.ts +12 -0
  32. package/dist/shared/lib/campaign-type.js +20 -0
  33. package/dist/shared/lib/date.d.ts +3 -0
  34. package/dist/shared/lib/date.js +17 -0
  35. package/dist/shared/lib/format.d.ts +3 -0
  36. package/dist/shared/lib/format.js +51 -0
  37. package/dist/shared/lib/id.d.ts +4 -0
  38. package/dist/shared/lib/id.js +21 -0
  39. package/dist/shared/lib/money.d.ts +6 -0
  40. package/dist/shared/lib/money.js +21 -0
  41. package/dist/shared/lib/pagination.d.ts +9 -0
  42. package/dist/shared/lib/pagination.js +26 -0
  43. package/dist/shared/lib/report.d.ts +1 -0
  44. package/dist/shared/lib/report.js +5 -0
  45. package/dist/shared/lib/tool.d.ts +24 -0
  46. package/dist/shared/lib/tool.js +20 -0
  47. package/dist/tools/account/handler.d.ts +3 -0
  48. package/dist/tools/account/handler.js +12 -0
  49. package/dist/tools/account/schema.d.ts +4 -0
  50. package/dist/tools/account/schema.js +7 -0
  51. package/dist/tools/account/tool.d.ts +1 -0
  52. package/dist/tools/account/tool.js +11 -0
  53. package/dist/tools/ad-extensions/handler.d.ts +5 -0
  54. package/dist/tools/ad-extensions/handler.js +35 -0
  55. package/dist/tools/ad-extensions/schema.d.ts +14 -0
  56. package/dist/tools/ad-extensions/schema.js +37 -0
  57. package/dist/tools/ad-extensions/tool.d.ts +3 -0
  58. package/dist/tools/ad-extensions/tool.js +27 -0
  59. package/dist/tools/ad-groups/handler.d.ts +5 -0
  60. package/dist/tools/ad-groups/handler.js +33 -0
  61. package/dist/tools/ad-groups/schema.d.ts +14 -0
  62. package/dist/tools/ad-groups/schema.js +27 -0
  63. package/dist/tools/ad-groups/tool.d.ts +3 -0
  64. package/dist/tools/ad-groups/tool.js +27 -0
  65. package/dist/tools/ad-images/handler.d.ts +5 -0
  66. package/dist/tools/ad-images/handler.js +47 -0
  67. package/dist/tools/ad-images/schema.d.ts +13 -0
  68. package/dist/tools/ad-images/schema.js +37 -0
  69. package/dist/tools/ad-images/tool.d.ts +1 -0
  70. package/dist/tools/ad-images/tool.js +11 -0
  71. package/dist/tools/ads/handler.d.ts +7 -0
  72. package/dist/tools/ads/handler.js +54 -0
  73. package/dist/tools/ads/schema.d.ts +27 -0
  74. package/dist/tools/ads/schema.js +68 -0
  75. package/dist/tools/ads/tool.d.ts +5 -0
  76. package/dist/tools/ads/tool.js +43 -0
  77. package/dist/tools/audience-targets/handler.d.ts +6 -0
  78. package/dist/tools/audience-targets/handler.js +96 -0
  79. package/dist/tools/audience-targets/schema.d.ts +29 -0
  80. package/dist/tools/audience-targets/schema.js +84 -0
  81. package/dist/tools/audience-targets/tool.d.ts +2 -0
  82. package/dist/tools/audience-targets/tool.js +19 -0
  83. package/dist/tools/bid-adjustments/handler.d.ts +4 -0
  84. package/dist/tools/bid-adjustments/handler.js +43 -0
  85. package/dist/tools/bid-adjustments/schema.d.ts +16 -0
  86. package/dist/tools/bid-adjustments/schema.js +50 -0
  87. package/dist/tools/bid-adjustments/tool.d.ts +2 -0
  88. package/dist/tools/bid-adjustments/tool.js +19 -0
  89. package/dist/tools/businesses/handler.d.ts +3 -0
  90. package/dist/tools/businesses/handler.js +26 -0
  91. package/dist/tools/businesses/schema.d.ts +6 -0
  92. package/dist/tools/businesses/schema.js +12 -0
  93. package/dist/tools/businesses/tool.d.ts +1 -0
  94. package/dist/tools/businesses/tool.js +11 -0
  95. package/dist/tools/campaigns/handler.d.ts +11 -0
  96. package/dist/tools/campaigns/handler.js +200 -0
  97. package/dist/tools/campaigns/schema.d.ts +46 -0
  98. package/dist/tools/campaigns/schema.js +109 -0
  99. package/dist/tools/campaigns/tool.d.ts +7 -0
  100. package/dist/tools/campaigns/tool.js +61 -0
  101. package/dist/tools/changes/handler.d.ts +5 -0
  102. package/dist/tools/changes/handler.js +33 -0
  103. package/dist/tools/changes/schema.d.ts +9 -0
  104. package/dist/tools/changes/schema.js +35 -0
  105. package/dist/tools/changes/tool.d.ts +1 -0
  106. package/dist/tools/changes/tool.js +11 -0
  107. package/dist/tools/dictionaries/handler.d.ts +5 -0
  108. package/dist/tools/dictionaries/handler.js +66 -0
  109. package/dist/tools/dictionaries/schema.d.ts +9 -0
  110. package/dist/tools/dictionaries/schema.js +23 -0
  111. package/dist/tools/dictionaries/tool.d.ts +2 -0
  112. package/dist/tools/dictionaries/tool.js +19 -0
  113. package/dist/tools/dynamic-targets/handler.d.ts +6 -0
  114. package/dist/tools/dynamic-targets/handler.js +96 -0
  115. package/dist/tools/dynamic-targets/schema.d.ts +33 -0
  116. package/dist/tools/dynamic-targets/schema.js +91 -0
  117. package/dist/tools/dynamic-targets/tool.d.ts +2 -0
  118. package/dist/tools/dynamic-targets/tool.js +19 -0
  119. package/dist/tools/feeds/handler.d.ts +3 -0
  120. package/dist/tools/feeds/handler.js +29 -0
  121. package/dist/tools/feeds/schema.d.ts +6 -0
  122. package/dist/tools/feeds/schema.js +12 -0
  123. package/dist/tools/feeds/tool.d.ts +1 -0
  124. package/dist/tools/feeds/tool.js +11 -0
  125. package/dist/tools/keywords/handler.d.ts +6 -0
  126. package/dist/tools/keywords/handler.js +53 -0
  127. package/dist/tools/keywords/schema.d.ts +21 -0
  128. package/dist/tools/keywords/schema.js +41 -0
  129. package/dist/tools/keywords/tool.d.ts +4 -0
  130. package/dist/tools/keywords/tool.js +35 -0
  131. package/dist/tools/negative-keywords/handler.d.ts +8 -0
  132. package/dist/tools/negative-keywords/handler.js +135 -0
  133. package/dist/tools/negative-keywords/merge.d.ts +2 -0
  134. package/dist/tools/negative-keywords/merge.js +36 -0
  135. package/dist/tools/negative-keywords/schema.d.ts +37 -0
  136. package/dist/tools/negative-keywords/schema.js +139 -0
  137. package/dist/tools/negative-keywords/shared-set-link.d.ts +3 -0
  138. package/dist/tools/negative-keywords/shared-set-link.js +21 -0
  139. package/dist/tools/negative-keywords/tool.d.ts +6 -0
  140. package/dist/tools/negative-keywords/tool.js +51 -0
  141. package/dist/tools/retargeting/handler.d.ts +4 -0
  142. package/dist/tools/retargeting/handler.js +47 -0
  143. package/dist/tools/retargeting/schema.d.ts +19 -0
  144. package/dist/tools/retargeting/schema.js +57 -0
  145. package/dist/tools/retargeting/tool.d.ts +2 -0
  146. package/dist/tools/retargeting/tool.js +19 -0
  147. package/dist/tools/search-queries/handler.d.ts +3 -0
  148. package/dist/tools/search-queries/handler.js +28 -0
  149. package/dist/tools/search-queries/schema.d.ts +7 -0
  150. package/dist/tools/search-queries/schema.js +17 -0
  151. package/dist/tools/search-queries/tool.d.ts +1 -0
  152. package/dist/tools/search-queries/tool.js +11 -0
  153. package/dist/tools/sitelinks/handler.d.ts +4 -0
  154. package/dist/tools/sitelinks/handler.js +28 -0
  155. package/dist/tools/sitelinks/schema.d.ts +13 -0
  156. package/dist/tools/sitelinks/schema.js +35 -0
  157. package/dist/tools/sitelinks/tool.d.ts +2 -0
  158. package/dist/tools/sitelinks/tool.js +19 -0
  159. package/dist/tools/statistics/handler.d.ts +3 -0
  160. package/dist/tools/statistics/handler.js +20 -0
  161. package/dist/tools/statistics/schema.d.ts +7 -0
  162. package/dist/tools/statistics/schema.js +17 -0
  163. package/dist/tools/statistics/tool.d.ts +1 -0
  164. package/dist/tools/statistics/tool.js +11 -0
  165. package/dist/tools/time-targeting/handler.d.ts +6 -0
  166. package/dist/tools/time-targeting/handler.js +124 -0
  167. package/dist/tools/time-targeting/schema.d.ts +19 -0
  168. package/dist/tools/time-targeting/schema.js +73 -0
  169. package/dist/tools/time-targeting/tool.d.ts +2 -0
  170. package/dist/tools/time-targeting/tool.js +20 -0
  171. package/dist/tools/vcards/handler.d.ts +4 -0
  172. package/dist/tools/vcards/handler.js +105 -0
  173. package/dist/tools/vcards/schema.d.ts +27 -0
  174. package/dist/tools/vcards/schema.js +43 -0
  175. package/dist/tools/vcards/tool.d.ts +2 -0
  176. package/dist/tools/vcards/tool.js +19 -0
  177. package/package.json +121 -0
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+ export declare const listAudienceTargetsSchema: z.ZodObject<{
3
+ limit: z.ZodOptional<z.ZodInt>;
4
+ offset: z.ZodOptional<z.ZodInt>;
5
+ audience_target_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
6
+ ad_group_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
7
+ campaign_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
8
+ retargeting_list_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
9
+ interest_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
10
+ states: z.ZodOptional<z.ZodArray<z.ZodLiteral<"ON" | "SUSPENDED">>>;
11
+ }, z.core.$strip>;
12
+ export declare const setAudienceTargetsSchema: z.ZodObject<{
13
+ action: z.ZodLiteral<"add" | "delete" | "resume" | "set_bids" | "suspend">;
14
+ targets: z.ZodOptional<z.ZodArray<z.ZodObject<{
15
+ ad_group_id: z.ZodString;
16
+ retargeting_list_id: z.ZodOptional<z.ZodString>;
17
+ interest_id: z.ZodOptional<z.ZodString>;
18
+ context_bid: z.ZodOptional<z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>>;
19
+ strategy_priority: z.ZodOptional<z.ZodLiteral<"HIGH" | "LOW" | "NORMAL">>;
20
+ }, z.core.$strip>>>;
21
+ bids: z.ZodOptional<z.ZodArray<z.ZodObject<{
22
+ audience_target_id: z.ZodOptional<z.ZodString>;
23
+ ad_group_id: z.ZodOptional<z.ZodString>;
24
+ campaign_id: z.ZodOptional<z.ZodString>;
25
+ context_bid: z.ZodOptional<z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>>;
26
+ strategy_priority: z.ZodOptional<z.ZodLiteral<"HIGH" | "LOW" | "NORMAL">>;
27
+ }, z.core.$strip>>>;
28
+ audience_target_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
29
+ }, z.core.$strip>;
@@ -0,0 +1,84 @@
1
+ import { z } from "zod";
2
+ import { AUDIENCE_TARGET_ACTIONS, AUDIENCE_TARGET_STATES, STRATEGY_PRIORITIES } from "#shared/config/enums";
3
+ import { MAX_AD_GROUPS_PER_CALL, MAX_CAMPAIGNS_PER_AUDIENCE_CALL, MAX_IDS_PER_CALL } from "#shared/config/limits";
4
+ import { idField } from "#shared/lib/id";
5
+ import { rublesField } from "#shared/lib/money";
6
+ import { pageFields } from "#shared/lib/pagination";
7
+ export const listAudienceTargetsSchema = z.object({
8
+ audience_target_ids: z
9
+ .array(idField("ID условия нацеливания"))
10
+ .check(z.maxLength(MAX_IDS_PER_CALL, { error: `Не больше ${MAX_IDS_PER_CALL} условий за вызов` }))
11
+ .optional()
12
+ .meta({ description: "Конкретные условия нацеливания" }),
13
+ ad_group_ids: z
14
+ .array(idField("ID группы объявлений"))
15
+ .check(z.maxLength(MAX_AD_GROUPS_PER_CALL, { error: `Не больше ${MAX_AD_GROUPS_PER_CALL} групп за вызов` }))
16
+ .optional()
17
+ .meta({ description: "Условия выбранных групп" }),
18
+ campaign_ids: z
19
+ .array(idField("ID кампании"))
20
+ .check(z.maxLength(MAX_CAMPAIGNS_PER_AUDIENCE_CALL, {
21
+ error: `Не больше ${MAX_CAMPAIGNS_PER_AUDIENCE_CALL} кампаний за вызов`
22
+ }))
23
+ .optional()
24
+ .meta({ description: "Условия выбранных кампаний" }),
25
+ retargeting_list_ids: z
26
+ .array(idField("ID условия ретаргетинга"))
27
+ .check(z.maxLength(MAX_AD_GROUPS_PER_CALL, {
28
+ error: `Не больше ${MAX_AD_GROUPS_PER_CALL} условий ретаргетинга за вызов`
29
+ }))
30
+ .optional()
31
+ .meta({ description: "Условия, построенные на этих списках ретаргетинга" }),
32
+ interest_ids: z
33
+ .array(idField("ID интереса к мобильным приложениям"))
34
+ .check(z.maxLength(MAX_AD_GROUPS_PER_CALL, { error: `Не больше ${MAX_AD_GROUPS_PER_CALL} интересов за вызов` }))
35
+ .optional()
36
+ .meta({ description: "Условия, построенные на этих интересах" }),
37
+ states: z
38
+ .array(z.literal(AUDIENCE_TARGET_STATES))
39
+ .optional()
40
+ .meta({ description: "Фильтр по состоянию: ON или SUSPENDED" }),
41
+ ...pageFields
42
+ });
43
+ // Цель строится ровно на одном источнике: список ретаргетинга или интерес.
44
+ // Проверку «ровно один» делает хендлер — она про сочетание полей.
45
+ const audienceTarget = z.object({
46
+ ad_group_id: idField("ID группы, в которую добавляется условие"),
47
+ retargeting_list_id: idField("ID условия ретаргетинга").optional(),
48
+ interest_id: idField("ID интереса к мобильным приложениям").optional(),
49
+ context_bid: rublesField("Ставка в сетях в рублях; 0 — снять ставку", { allowZero: true }).optional(),
50
+ strategy_priority: z
51
+ .literal(STRATEGY_PRIORITIES)
52
+ .optional()
53
+ .meta({ description: "Приоритет для автоматических стратегий: LOW, NORMAL или HIGH" })
54
+ });
55
+ const audienceBid = z.object({
56
+ audience_target_id: idField("ID условия нацеливания").optional(),
57
+ ad_group_id: idField("ID группы: ставка применится ко всем её условиям").optional(),
58
+ campaign_id: idField("ID кампании: ставка применится ко всем её условиям").optional(),
59
+ context_bid: rublesField("Ставка в сетях в рублях; 0 — снять ставку", { allowZero: true }).optional(),
60
+ strategy_priority: z
61
+ .literal(STRATEGY_PRIORITIES)
62
+ .optional()
63
+ .meta({ description: "Приоритет для автоматических стратегий" })
64
+ });
65
+ export const setAudienceTargetsSchema = z.object({
66
+ action: z.literal(AUDIENCE_TARGET_ACTIONS).meta({
67
+ description: "Что сделать: add, set_bids, suspend, resume или delete (необратимо)"
68
+ }),
69
+ targets: z
70
+ .array(audienceTarget)
71
+ .check(z.minLength(1, { error: "Список условий пуст" }), z.maxLength(MAX_AD_GROUPS_PER_CALL, { error: `Не больше ${MAX_AD_GROUPS_PER_CALL} условий за вызов` }))
72
+ .optional()
73
+ .meta({ description: "Условия для добавления; обязателен при action=add" }),
74
+ bids: z
75
+ .array(audienceBid)
76
+ .check(z.minLength(1, { error: "Список ставок пуст" }), z.maxLength(MAX_IDS_PER_CALL, { error: `Не больше ${MAX_IDS_PER_CALL} ставок за вызов` }))
77
+ .optional()
78
+ .meta({ description: "Новые ставки и приоритеты; обязателен при action=set_bids" }),
79
+ audience_target_ids: z
80
+ .array(idField("ID условия нацеливания"))
81
+ .check(z.minLength(1, { error: "Список условий пуст" }), z.maxLength(MAX_IDS_PER_CALL, { error: `Не больше ${MAX_IDS_PER_CALL} условий за вызов` }))
82
+ .optional()
83
+ .meta({ description: "Условия для suspend, resume или delete" })
84
+ });
@@ -0,0 +1,2 @@
1
+ export declare const listAudienceTargetsTool: import("#shared/lib/tool").ToolDescriptor;
2
+ export declare const setAudienceTargetsTool: import("#shared/lib/tool").ToolDescriptor;
@@ -0,0 +1,19 @@
1
+ import { DESTRUCTIVE, defineTool, READ } from "#shared/lib/tool";
2
+ import { handleListAudienceTargets, handleSetAudienceTargets } from "./handler.js";
3
+ import { listAudienceTargetsSchema, setAudienceTargetsSchema } from "./schema.js";
4
+ export const listAudienceTargetsTool = defineTool({
5
+ name: "list_audience_targets",
6
+ title: "Аудиторные цели",
7
+ description: "Получить условия нацеливания на аудиторию по ID кампании, группы, ретаргетинга или интереса.",
8
+ annotations: READ,
9
+ schema: listAudienceTargetsSchema,
10
+ handler: handleListAudienceTargets
11
+ });
12
+ export const setAudienceTargetsTool = defineTool({
13
+ name: "set_audience_targets",
14
+ title: "Управление аудиторными целями",
15
+ description: "Добавить, остановить, возобновить, удалить аудиторные цели или изменить их ставки.",
16
+ annotations: DESTRUCTIVE,
17
+ schema: setAudienceTargetsSchema,
18
+ handler: handleSetAudienceTargets
19
+ });
@@ -0,0 +1,4 @@
1
+ import type { z } from "zod";
2
+ import type { getBidAdjustmentsSchema, setBidAdjustmentsSchema } from "./schema.js";
3
+ export declare function handleGetBidAdjustments(params: z.infer<typeof getBidAdjustmentsSchema>): Promise<string>;
4
+ export declare function handleSetBidAdjustments(params: z.infer<typeof setBidAdjustmentsSchema>): Promise<string>;
@@ -0,0 +1,43 @@
1
+ import { apiPost } from "#shared/api/client";
2
+ import { formatResult } from "#shared/lib/format";
3
+ import { apiId, apiIds } from "#shared/lib/id";
4
+ import { buildPage } from "#shared/lib/pagination";
5
+ const NO_MONEY = { money: false };
6
+ // Значения корректировок лежат в отдельных полях на каждый тип, поэтому запрашиваются
7
+ // все наборы сразу: иначе ответ придёт без самих коэффициентов.
8
+ const FIELD_NAMES = {
9
+ FieldNames: ["Id", "CampaignId", "AdGroupId", "Level", "Type"],
10
+ MobileAdjustmentFieldNames: ["BidModifier", "OperatingSystemType"],
11
+ TabletAdjustmentFieldNames: ["BidModifier", "OperatingSystemType"],
12
+ DesktopAdjustmentFieldNames: ["BidModifier"],
13
+ DesktopOnlyAdjustmentFieldNames: ["BidModifier"],
14
+ DemographicsAdjustmentFieldNames: ["Gender", "Age", "BidModifier", "Enabled"]
15
+ };
16
+ export async function handleGetBidAdjustments(params) {
17
+ if (!params.campaign_ids && !params.ad_group_ids && !params.adjustment_ids) {
18
+ throw new Error("Укажите campaign_ids, ad_group_ids или adjustment_ids.");
19
+ }
20
+ const selection = { Levels: params.levels };
21
+ if (params.campaign_ids)
22
+ selection.CampaignIds = apiIds(params.campaign_ids);
23
+ if (params.ad_group_ids)
24
+ selection.AdGroupIds = apiIds(params.ad_group_ids);
25
+ if (params.adjustment_ids)
26
+ selection.Ids = apiIds(params.adjustment_ids);
27
+ if (params.types)
28
+ selection.Types = params.types;
29
+ const request = { SelectionCriteria: selection, ...FIELD_NAMES };
30
+ const page = buildPage(params);
31
+ if (page)
32
+ request.Page = page;
33
+ return formatResult(await apiPost("bidmodifiers", "get", request), NO_MONEY);
34
+ }
35
+ export async function handleSetBidAdjustments(params) {
36
+ const data = await apiPost("bidmodifiers", "set", {
37
+ BidModifiers: params.adjustments.map((adjustment) => ({
38
+ Id: apiId(adjustment.adjustment_id),
39
+ BidModifier: adjustment.bid_modifier
40
+ }))
41
+ });
42
+ return formatResult(data, NO_MONEY);
43
+ }
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ export declare const getBidAdjustmentsSchema: z.ZodObject<{
3
+ limit: z.ZodOptional<z.ZodInt>;
4
+ offset: z.ZodOptional<z.ZodInt>;
5
+ campaign_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
6
+ ad_group_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
7
+ adjustment_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
8
+ types: z.ZodOptional<z.ZodArray<z.ZodLiteral<"DEMOGRAPHICS_ADJUSTMENT" | "DESKTOP_ADJUSTMENT" | "DESKTOP_ONLY_ADJUSTMENT" | "MOBILE_ADJUSTMENT" | "TABLET_ADJUSTMENT">>>;
9
+ levels: z.ZodArray<z.ZodLiteral<"AD_GROUP" | "CAMPAIGN">>;
10
+ }, z.core.$strip>;
11
+ export declare const setBidAdjustmentsSchema: z.ZodObject<{
12
+ adjustments: z.ZodArray<z.ZodObject<{
13
+ adjustment_id: z.ZodString;
14
+ bid_modifier: z.ZodInt;
15
+ }, z.core.$strip>>;
16
+ }, z.core.$strip>;
@@ -0,0 +1,50 @@
1
+ // Корректировки ставок: коэффициент в процентах, не деньги — rublesField здесь не к месту.
2
+ import { z } from "zod";
3
+ import { BID_ADJUSTMENT_LEVELS, BID_ADJUSTMENT_TYPES } from "#shared/config/enums";
4
+ import { BID_MODIFIER_RANGE, MAX_AD_GROUPS_PER_CALL, MAX_CAMPAIGNS_PER_ADJUSTMENT_CALL, MAX_IDS_PER_CALL } from "#shared/config/limits";
5
+ import { idField } from "#shared/lib/id";
6
+ import { pageFields } from "#shared/lib/pagination";
7
+ export const getBidAdjustmentsSchema = z.object({
8
+ campaign_ids: z
9
+ .array(idField("ID кампании"))
10
+ .check(z.minLength(1, { error: "Список кампаний пуст" }), z.maxLength(MAX_CAMPAIGNS_PER_ADJUSTMENT_CALL, {
11
+ error: `За один вызов допустимо не больше ${MAX_CAMPAIGNS_PER_ADJUSTMENT_CALL} кампаний`
12
+ }))
13
+ .optional()
14
+ .meta({ description: "Кампании, корректировки которых нужно получить" }),
15
+ ad_group_ids: z
16
+ .array(idField("ID группы объявлений"))
17
+ .check(z.minLength(1, { error: "Список групп пуст" }), z.maxLength(MAX_AD_GROUPS_PER_CALL, {
18
+ error: `За один вызов допустимо не больше ${MAX_AD_GROUPS_PER_CALL} групп`
19
+ }))
20
+ .optional()
21
+ .meta({ description: "Группы, корректировки которых нужно получить" }),
22
+ adjustment_ids: z
23
+ .array(idField("ID корректировки"))
24
+ .check(z.minLength(1, { error: "Список корректировок пуст" }), z.maxLength(MAX_IDS_PER_CALL, { error: `За один вызов допустимо не больше ${MAX_IDS_PER_CALL} корректировок` }))
25
+ .optional()
26
+ .meta({ description: "Конкретные корректировки по их ID" }),
27
+ types: z.array(z.literal(BID_ADJUSTMENT_TYPES)).optional().meta({ description: "Фильтр по типу корректировки" }),
28
+ levels: z
29
+ .array(z.literal(BID_ADJUSTMENT_LEVELS))
30
+ .check(z.minLength(1, { error: "Укажите хотя бы один уровень" }))
31
+ .meta({ description: "Уровни корректировок: CAMPAIGN и/или AD_GROUP" }),
32
+ ...pageFields
33
+ });
34
+ const bidAdjustment = z.object({
35
+ adjustment_id: idField("ID существующей корректировки"),
36
+ bid_modifier: z
37
+ .int()
38
+ .check(z.gte(BID_MODIFIER_RANGE.min, { error: `Коэффициент не меньше ${BID_MODIFIER_RANGE.min}` }), z.lte(BID_MODIFIER_RANGE.max, { error: `Коэффициент не больше ${BID_MODIFIER_RANGE.max}` }))
39
+ .meta({
40
+ description: `Коэффициент в процентах, ${BID_MODIFIER_RANGE.min}–${BID_MODIFIER_RANGE.max}: 100 — ставка без изменений`
41
+ })
42
+ });
43
+ export const setBidAdjustmentsSchema = z.object({
44
+ adjustments: z
45
+ .array(bidAdjustment)
46
+ .check(z.minLength(1, { error: "Список корректировок пуст" }), z.maxLength(MAX_AD_GROUPS_PER_CALL, {
47
+ error: `За один вызов допустимо не больше ${MAX_AD_GROUPS_PER_CALL} корректировок`
48
+ }))
49
+ .meta({ description: "Корректировки и их новые коэффициенты" })
50
+ });
@@ -0,0 +1,2 @@
1
+ export declare const getBidAdjustmentsTool: import("#shared/lib/tool").ToolDescriptor;
2
+ export declare const setBidAdjustmentsTool: import("#shared/lib/tool").ToolDescriptor;
@@ -0,0 +1,19 @@
1
+ import { defineTool, IDEMPOTENT, READ } from "#shared/lib/tool";
2
+ import { handleGetBidAdjustments, handleSetBidAdjustments } from "./handler.js";
3
+ import { getBidAdjustmentsSchema, setBidAdjustmentsSchema } from "./schema.js";
4
+ export const getBidAdjustmentsTool = defineTool({
5
+ name: "get_bid_adjustments",
6
+ title: "Корректировки ставок",
7
+ description: "Получить корректировки ставок по устройствам, полу и возрасту на уровне кампании или группы.",
8
+ annotations: READ,
9
+ schema: getBidAdjustmentsSchema,
10
+ handler: handleGetBidAdjustments
11
+ });
12
+ export const setBidAdjustmentsTool = defineTool({
13
+ name: "set_bid_adjustments",
14
+ title: "Изменить корректировки ставок",
15
+ description: "Изменить коэффициенты существующих корректировок по их ID.",
16
+ annotations: IDEMPOTENT,
17
+ schema: setBidAdjustmentsSchema,
18
+ handler: handleSetBidAdjustments
19
+ });
@@ -0,0 +1,3 @@
1
+ import type { z } from "zod";
2
+ import type { listBusinessesSchema } from "./schema.js";
3
+ export declare function handleListBusinesses(params: z.infer<typeof listBusinessesSchema>): Promise<string>;
@@ -0,0 +1,26 @@
1
+ import { apiPost } from "#shared/api/client";
2
+ import { formatResult } from "#shared/lib/format";
3
+ import { apiIds } from "#shared/lib/id";
4
+ import { buildPage } from "#shared/lib/pagination";
5
+ const LIST_FIELDS = [
6
+ "Id",
7
+ "Name",
8
+ "Address",
9
+ "Phone",
10
+ "ProfileUrl",
11
+ "InternalUrl",
12
+ "IsPublished",
13
+ "MergedIds",
14
+ "Rubric",
15
+ "Urls",
16
+ "HasOffice"
17
+ ];
18
+ export async function handleListBusinesses(params) {
19
+ const request = { FieldNames: LIST_FIELDS };
20
+ if (params.business_ids?.length)
21
+ request.SelectionCriteria = { Ids: apiIds(params.business_ids) };
22
+ const page = buildPage(params);
23
+ if (page)
24
+ request.Page = page;
25
+ return formatResult(await apiPost("businesses", "get", request), { money: false });
26
+ }
@@ -0,0 +1,6 @@
1
+ import { z } from "zod";
2
+ export declare const listBusinessesSchema: z.ZodObject<{
3
+ limit: z.ZodOptional<z.ZodInt>;
4
+ offset: z.ZodOptional<z.ZodInt>;
5
+ business_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
6
+ }, z.core.$strip>;
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ import { MAX_IDS_PER_CALL } from "#shared/config/limits";
3
+ import { idField } from "#shared/lib/id";
4
+ import { pageFields } from "#shared/lib/pagination";
5
+ export const listBusinessesSchema = z.object({
6
+ business_ids: z
7
+ .array(idField("ID профиля организации"))
8
+ .check(z.maxLength(MAX_IDS_PER_CALL, { error: `За один вызов допустимо не больше ${MAX_IDS_PER_CALL} профилей` }))
9
+ .optional()
10
+ .meta({ description: "Конкретные профили; без них возвращаются все доступные" }),
11
+ ...pageFields
12
+ });
@@ -0,0 +1 @@
1
+ export declare const listBusinessesTool: import("#shared/lib/tool").ToolDescriptor;
@@ -0,0 +1,11 @@
1
+ import { defineTool, READ } from "#shared/lib/tool";
2
+ import { handleListBusinesses } from "./handler.js";
3
+ import { listBusinessesSchema } from "./schema.js";
4
+ export const listBusinessesTool = defineTool({
5
+ name: "list_businesses",
6
+ title: "Профили организаций",
7
+ description: "Получить доступные профили организаций из Яндекс Бизнеса.",
8
+ annotations: READ,
9
+ schema: listBusinessesSchema,
10
+ handler: handleListBusinesses
11
+ });
@@ -0,0 +1,11 @@
1
+ import type { z } from "zod";
2
+ import type { createCampaignSchema, getCampaignSchema, getStrategySchema, listCampaignsSchema, manageCampaignsSchema, setStrategySchema, updateCampaignSchema } from "./schema.js";
3
+ export declare function handleListCampaigns(params: z.infer<typeof listCampaignsSchema>): Promise<string>;
4
+ export declare function handleGetCampaign(params: z.infer<typeof getCampaignSchema>): Promise<string>;
5
+ export declare function handleCreateCampaign(params: z.infer<typeof createCampaignSchema>): Promise<string>;
6
+ export declare function handleUpdateCampaign(params: z.infer<typeof updateCampaignSchema>): Promise<string>;
7
+ export declare function handleManageCampaigns(params: z.infer<typeof manageCampaignsSchema>): Promise<string>;
8
+ export declare function handleGetStrategy(params: z.infer<typeof getStrategySchema>): Promise<string>;
9
+ type StrategyParams = z.infer<typeof setStrategySchema>;
10
+ export declare function handleSetStrategy(params: StrategyParams): Promise<string>;
11
+ export {};
@@ -0,0 +1,200 @@
1
+ import { apiPost } from "#shared/api/client";
2
+ import { getCampaignSettingsKey } from "#shared/lib/campaign-type";
3
+ import { formatResult } from "#shared/lib/format";
4
+ import { apiId, apiIds } from "#shared/lib/id";
5
+ import { buildPage } from "#shared/lib/pagination";
6
+ const LIST_FIELDS = ["Id", "Name", "Status", "State", "DailyBudget", "StartDate", "Type", "Statistics"];
7
+ const DETAIL_FIELDS = [...LIST_FIELDS, "EndDate"];
8
+ // TrackingParams поддерживают не все типы: сверено с WSDL campaigns 05.09.2026 — поле есть
9
+ // в Text, DynamicText, Smart и Unified, но не в MobileApp и не в CpmBanner. Набор не тот
10
+ // же, что у общих наборов минус-фраз, поэтому список свой, а не общий.
11
+ const TRACKING_PARAMS_TYPES = ["TEXT_CAMPAIGN", "DYNAMIC_TEXT_CAMPAIGN", "SMART_CAMPAIGN", "UNIFIED_CAMPAIGN"];
12
+ async function readTrackingParamsKey(campaignId) {
13
+ const data = await apiPost("campaigns", "get", {
14
+ SelectionCriteria: { Ids: [apiId(campaignId)] },
15
+ FieldNames: ["Id", "Type"]
16
+ });
17
+ const campaign = data.result?.Campaigns?.[0];
18
+ if (!campaign)
19
+ throw new Error(`Кампания ${campaignId} не найдена или недоступна.`);
20
+ const type = campaign.Type;
21
+ const settingsKey = type && TRACKING_PARAMS_TYPES.includes(type) ? getCampaignSettingsKey(type) : undefined;
22
+ if (!settingsKey) {
23
+ throw new Error(`Кампания ${campaignId} имеет тип ${type ?? "неизвестный"}, а UTM-разметку поддерживают только ${TRACKING_PARAMS_TYPES.join(", ")}.`);
24
+ }
25
+ return settingsKey;
26
+ }
27
+ // Действие со статусом — отдельный метод API, а не поле update.
28
+ const STATUS_METHODS = {
29
+ SUSPEND: "suspend",
30
+ RESUME: "resume",
31
+ ARCHIVE: "archive",
32
+ UNARCHIVE: "unarchive"
33
+ };
34
+ export async function handleListCampaigns(params) {
35
+ const selectionCriteria = {};
36
+ if (params.status)
37
+ selectionCriteria.Statuses = [params.status];
38
+ if (params.types)
39
+ selectionCriteria.Types = params.types;
40
+ const requestParams = { SelectionCriteria: selectionCriteria, FieldNames: LIST_FIELDS };
41
+ const page = buildPage(params);
42
+ if (page)
43
+ requestParams.Page = page;
44
+ return formatResult(await apiPost("campaigns", "get", requestParams));
45
+ }
46
+ // TrackingParams лежит внутри объекта настроек, поэтому в общий FieldNames не попадает —
47
+ // его запрашивают отдельным type-specific параметром. Заранее тип неизвестен, но лишние
48
+ // *CampaignFieldNames безвредны: Директ наполняет тот объект, который соответствует
49
+ // реальному типу кампании, а остальные просто не возвращает.
50
+ export async function handleGetCampaign(params) {
51
+ const data = await apiPost("campaigns", "get", {
52
+ SelectionCriteria: { Ids: [apiId(params.campaign_id)] },
53
+ FieldNames: DETAIL_FIELDS,
54
+ TextCampaignFieldNames: ["TrackingParams"],
55
+ DynamicTextCampaignFieldNames: ["TrackingParams"],
56
+ SmartCampaignFieldNames: ["TrackingParams"],
57
+ UnifiedCampaignFieldNames: ["TrackingParams"]
58
+ });
59
+ return formatResult(data);
60
+ }
61
+ export async function handleCreateCampaign(params) {
62
+ const campaign = { Name: params.name, StartDate: params.start_date };
63
+ if (params.daily_budget !== undefined) {
64
+ campaign.DailyBudget = { Amount: params.daily_budget, Mode: "STANDARD" };
65
+ }
66
+ if (params.time_zone !== undefined)
67
+ campaign.TimeZone = params.time_zone;
68
+ const biddingStrategy = {
69
+ Search: { BiddingStrategyType: params.search_strategy },
70
+ Network: { BiddingStrategyType: params.network_strategy }
71
+ };
72
+ // TrackingParams живёт в том же объекте настроек, что и стратегия, поэтому собирается
73
+ // вместе с ним. На создании тип известен из параметров, читать его неоткуда и не нужно.
74
+ const settings = { BiddingStrategy: biddingStrategy };
75
+ if (params.tracking_params !== undefined)
76
+ settings.TrackingParams = params.tracking_params;
77
+ if (params.type === "DYNAMIC_TEXT_CAMPAIGN") {
78
+ campaign.DynamicTextCampaign = settings;
79
+ }
80
+ else {
81
+ campaign.TextCampaign = settings;
82
+ }
83
+ return formatResult(await apiPost("campaigns", "add", { Campaigns: [campaign] }));
84
+ }
85
+ // Действие со статусом и правка полей — два разных вызова API. Выполняются оба,
86
+ // если заданы оба: иначе при наличии status поля name/daily_budget молча терялись бы.
87
+ // Каждый ответ форматируется отдельно, чтобы per-item ошибки не потерялись.
88
+ export async function handleUpdateCampaign(params) {
89
+ const sections = [];
90
+ if (params.status) {
91
+ const method = STATUS_METHODS[params.status];
92
+ const data = await apiPost("campaigns", method, { SelectionCriteria: { Ids: [apiId(params.campaign_id)] } });
93
+ sections.push(formatResult(data));
94
+ }
95
+ const changesSettings = params.tracking_params !== undefined;
96
+ if (params.name !== undefined || params.daily_budget !== undefined || changesSettings) {
97
+ const campaign = { Id: apiId(params.campaign_id) };
98
+ if (params.name !== undefined)
99
+ campaign.Name = params.name;
100
+ if (params.daily_budget !== undefined) {
101
+ campaign.DailyBudget = { Amount: params.daily_budget, Mode: "STANDARD" };
102
+ }
103
+ // Имя объекта настроек зависит от типа кампании, а в запросе тип не передаётся —
104
+ // приходится прочитать. Лишний вызов только там, где разметка правда меняется.
105
+ if (changesSettings) {
106
+ const settingsKey = await readTrackingParamsKey(params.campaign_id);
107
+ campaign[settingsKey] = { TrackingParams: params.tracking_params };
108
+ }
109
+ sections.push(formatResult(await apiPost("campaigns", "update", { Campaigns: [campaign] })));
110
+ }
111
+ if (sections.length === 0) {
112
+ throw new Error("Нечего обновлять: укажите status и/или name/daily_budget/tracking_params.");
113
+ }
114
+ return sections.join("\n\n");
115
+ }
116
+ export async function handleManageCampaigns(params) {
117
+ const data = await apiPost("campaigns", params.action, {
118
+ SelectionCriteria: { Ids: apiIds(params.campaign_ids) }
119
+ });
120
+ return formatResult(data);
121
+ }
122
+ // Стратегия — часть кампании: читается тем же get, пишется тем же update.
123
+ export async function handleGetStrategy(params) {
124
+ const data = await apiPost("campaigns", "get", {
125
+ SelectionCriteria: { Ids: [apiId(params.campaign_id)] },
126
+ FieldNames: ["Id", "Name", "Type"],
127
+ TextCampaignFieldNames: ["BiddingStrategy"]
128
+ });
129
+ return formatResult(data);
130
+ }
131
+ // Цену стратегии, без которой она не имеет смысла, требуем сами: Директ вернул бы
132
+ // ту же ошибку, но после запроса и на своём языке.
133
+ function required(value, field, type) {
134
+ if (value === undefined)
135
+ throw new Error(`${field} обязателен для стратегии ${type}.`);
136
+ return value;
137
+ }
138
+ // Необязательные поля добавляются только когда заданы: пустое поле в запросе Директ
139
+ // трактует как «сбросить», а не «оставить как есть».
140
+ function withOptional(settings, params) {
141
+ if (params.weekly_spend_limit !== undefined)
142
+ settings.WeeklySpendLimit = params.weekly_spend_limit;
143
+ if (params.goal_id !== undefined)
144
+ settings.GoalId = apiId(params.goal_id);
145
+ return settings;
146
+ }
147
+ // Настройки лежат не рядом с типом, а во вложенном объекте, названном по стратегии:
148
+ // имя объекта и есть переключатель, а BiddingStrategyType только дублирует его.
149
+ function strategySettings(type, params) {
150
+ switch (type) {
151
+ case "WB_MAXIMUM_CLICKS": {
152
+ const settings = {
153
+ WeeklySpendLimit: required(params.weekly_spend_limit, "weekly_spend_limit", type)
154
+ };
155
+ if (params.bid_ceiling !== undefined)
156
+ settings.BidCeiling = params.bid_ceiling;
157
+ return { WbMaximumClicks: settings };
158
+ }
159
+ case "AVERAGE_CPC":
160
+ return { AverageCpc: withOptional({ AverageCpc: required(params.average_cpc, "average_cpc", type) }, params) };
161
+ case "AVERAGE_CPA": {
162
+ const settings = withOptional({ AverageCpa: required(params.average_cpa, "average_cpa", type) }, params);
163
+ if (params.bid_ceiling !== undefined)
164
+ settings.BidCeiling = params.bid_ceiling;
165
+ return { AverageCpa: settings };
166
+ }
167
+ // Cpa, а не AverageCpa: у оплаты за конверсию это фиксированная цена конверсии.
168
+ case "PAY_FOR_CONVERSION":
169
+ return {
170
+ PayForConversion: withOptional({ Cpa: required(params.conversion_price, "conversion_price", type) }, params)
171
+ };
172
+ case "NETWORK_DEFAULT":
173
+ return {
174
+ NetworkDefault: params.network_limit_percent === undefined ? {} : { LimitPercent: params.network_limit_percent }
175
+ };
176
+ // HIGHEST_POSITION, MAXIMUM_COVERAGE и SERVING_OFF настроек не имеют:
177
+ // в TextCampaignStrategyBase структуры под них нет вовсе.
178
+ default:
179
+ return undefined;
180
+ }
181
+ }
182
+ function strategyPart(type, params) {
183
+ return { BiddingStrategyType: type, ...strategySettings(type, params) };
184
+ }
185
+ export async function handleSetStrategy(params) {
186
+ const data = await apiPost("campaigns", "update", {
187
+ Campaigns: [
188
+ {
189
+ Id: apiId(params.campaign_id),
190
+ TextCampaign: {
191
+ BiddingStrategy: {
192
+ Search: strategyPart(params.search_type, params),
193
+ Network: strategyPart(params.network_type, params)
194
+ }
195
+ }
196
+ }
197
+ ]
198
+ });
199
+ return formatResult(data);
200
+ }
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+ export declare const listCampaignsSchema: z.ZodObject<{
3
+ limit: z.ZodOptional<z.ZodInt>;
4
+ offset: z.ZodOptional<z.ZodInt>;
5
+ status: z.ZodOptional<z.ZodLiteral<"ACCEPTED" | "DRAFT" | "MODERATION" | "REJECTED">>;
6
+ types: z.ZodOptional<z.ZodArray<z.ZodLiteral<"CPM_BANNER_CAMPAIGN" | "DYNAMIC_TEXT_CAMPAIGN" | "MOBILE_APP_CAMPAIGN" | "SMART_CAMPAIGN" | "TEXT_CAMPAIGN" | "UNIFIED_CAMPAIGN">>>;
7
+ }, z.core.$strip>;
8
+ export declare const getCampaignSchema: z.ZodObject<{
9
+ campaign_id: z.ZodString;
10
+ }, z.core.$strip>;
11
+ export declare const createCampaignSchema: z.ZodObject<{
12
+ name: z.ZodString;
13
+ type: z.ZodDefault<z.ZodLiteral<"DYNAMIC_TEXT_CAMPAIGN" | "TEXT_CAMPAIGN">>;
14
+ start_date: z.ZodString;
15
+ daily_budget: z.ZodOptional<z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>>;
16
+ search_strategy: z.ZodDefault<z.ZodLiteral<"AVERAGE_CPA" | "AVERAGE_CPA_MULTIPLE_GOALS" | "AVERAGE_CPC" | "AVERAGE_CRR" | "AVERAGE_ROI" | "HIGHEST_POSITION" | "IMPRESSIONS_BELOW_SEARCH" | "MAX_PROFIT" | "PAY_FOR_CONVERSION" | "PAY_FOR_CONVERSION_CRR" | "PAY_FOR_CONVERSION_MULTIPLE_GOALS" | "SERVING_OFF" | "WB_MAXIMUM_CLICKS" | "WB_MAXIMUM_CONVERSION_RATE" | "WEEKLY_CLICK_PACKAGE">>;
17
+ network_strategy: z.ZodDefault<z.ZodLiteral<"AVERAGE_CPA" | "AVERAGE_CPA_MULTIPLE_GOALS" | "AVERAGE_CPC" | "AVERAGE_CRR" | "AVERAGE_ROI" | "MAXIMUM_COVERAGE" | "MAX_PROFIT" | "NETWORK_DEFAULT" | "PAY_FOR_CONVERSION" | "PAY_FOR_CONVERSION_CRR" | "PAY_FOR_CONVERSION_MULTIPLE_GOALS" | "SERVING_OFF" | "WB_MAXIMUM_CLICKS" | "WB_MAXIMUM_CONVERSION_RATE" | "WEEKLY_CLICK_PACKAGE">>;
18
+ time_zone: z.ZodOptional<z.ZodString>;
19
+ tracking_params: z.ZodOptional<z.ZodNullable<z.ZodString>>;
20
+ }, z.core.$strip>;
21
+ export declare const updateCampaignSchema: z.ZodObject<{
22
+ campaign_id: z.ZodString;
23
+ name: z.ZodOptional<z.ZodString>;
24
+ daily_budget: z.ZodOptional<z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>>;
25
+ status: z.ZodOptional<z.ZodLiteral<"ARCHIVE" | "RESUME" | "SUSPEND" | "UNARCHIVE">>;
26
+ tracking_params: z.ZodOptional<z.ZodNullable<z.ZodString>>;
27
+ }, z.core.$strip>;
28
+ export declare const manageCampaignsSchema: z.ZodObject<{
29
+ campaign_ids: z.ZodArray<z.ZodString>;
30
+ action: z.ZodLiteral<"archive" | "resume" | "suspend" | "unarchive">;
31
+ }, z.core.$strip>;
32
+ export declare const getStrategySchema: z.ZodObject<{
33
+ campaign_id: z.ZodString;
34
+ }, z.core.$strip>;
35
+ export declare const setStrategySchema: z.ZodObject<{
36
+ campaign_id: z.ZodString;
37
+ search_type: z.ZodLiteral<"AVERAGE_CPA" | "AVERAGE_CPC" | "HIGHEST_POSITION" | "PAY_FOR_CONVERSION" | "SERVING_OFF" | "WB_MAXIMUM_CLICKS">;
38
+ network_type: z.ZodLiteral<"AVERAGE_CPA" | "AVERAGE_CPC" | "MAXIMUM_COVERAGE" | "NETWORK_DEFAULT" | "PAY_FOR_CONVERSION" | "SERVING_OFF" | "WB_MAXIMUM_CLICKS">;
39
+ weekly_spend_limit: z.ZodOptional<z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>>;
40
+ bid_ceiling: z.ZodOptional<z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>>;
41
+ average_cpc: z.ZodOptional<z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>>;
42
+ average_cpa: z.ZodOptional<z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>>;
43
+ conversion_price: z.ZodOptional<z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>>;
44
+ goal_id: z.ZodOptional<z.ZodString>;
45
+ network_limit_percent: z.ZodOptional<z.ZodInt>;
46
+ }, z.core.$strip>;