@besales/mcp 0.37.1 → 0.39.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.
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "title": "besales-mcp Tool Definitions",
4
4
  "version": "1.2.0-draft",
5
- "lastUpdated": "2026-07-28",
5
+ "lastUpdated": "2026-08-14",
6
6
  "description": "MCP tool schemas для besales-mcp npm package. Active v1.5 set содержит PromptHub/ICP/Sandbox/Knowledge external-execution operations и stateless Platform Setup Bridge direct tools. Setup Pipeline session tools сохранены как Phase 4+ future design, но не входят в active toolset.",
7
7
  "executionModes": {
8
8
  "summary": "Каждая active LLM-операция имеет 2 MCP tools: get_instructions + submit. Claude локально между tools выполняет LLM-вызовы своими моделями. Auto-detection через JWT scope mcp:* → external default.",
@@ -3061,7 +3061,8 @@
3061
3061
  "format": "uuid"
3062
3062
  },
3063
3063
  "explicit_confirmation": {
3064
- "const": true
3064
+ "const": true,
3065
+ "type": "boolean"
3065
3066
  },
3066
3067
  "confirmation_reason": {
3067
3068
  "type": "string"
@@ -3517,7 +3518,7 @@
3517
3518
  }
3518
3519
  }
3519
3520
  },
3520
- "description": "Условия принадлежности контакта цепочке, соединяются через И. Применяются при ЛЮБОМ filterMode (при variable обязателен и непуст, иначе цепочка не выберет никого). Для ветвления по варианту рассылки: переменная WAVE_MAILING_VARIANT, значение — UUID варианта из каталога воркспейса, а НЕ его имя (first-ver будет отвергнут). Отдельные цепочки НЕ взаимоисключающи: прогресс изолирован по sequenceId, поэтому безусловная ловящая цепочка рядом с eq A и eq B не подстрахует, а удвоит отправку. Набор обязан быть строгим разбиением: eq A, eq B и fallback neq A AND neq B (у контакта без переменной eq/in ложно, neq истинно)."
3521
+ "description": "Условия принадлежности контакта цепочке, соединяются через И. Применяются при ЛЮБОМ filterMode (при variable обязателен и непуст, иначе цепочка не выберет никого). Ветвление по измерениям рассылки GetCourse: WAVE_MAILING_VARIANT — UUID варианта из каталога воркспейса, а НЕ его имя (first-ver будет отвергнут); WAVE_PRODUCT — код продукта строчными без пробелов (dbo); WAVE_FUNNEL — КЛЮЧ воронки (f-код f11, иначе вся строка строчными), а НЕ метка запуска (f11 — ВК NR ДБО будет отвергнут); WAVE_SEGMENT — имя сегмента. Значения проставляет запуск рассылки, у контакта без рассылки их нет. Отдельные цепочки НЕ взаимоисключающи: прогресс изолирован по sequenceId, поэтому безусловная ловящая цепочка рядом с eq A и eq B не подстрахует, а удвоит отправку. Набор обязан быть строгим разбиением: eq A, eq B и fallback neq A AND neq B (у контакта без переменной eq/in ложно, neq истинно)."
3521
3522
  },
3522
3523
  "steps": {
3523
3524
  "type": "array",
@@ -3767,7 +3768,8 @@
3767
3768
  "type": "object",
3768
3769
  "properties": {
3769
3770
  "is_active": {
3770
- "type": "boolean"
3771
+ "type": "boolean",
3772
+ "description": "У Instagram это НАМЕРЕНИЕ держать канал включённым, а не факт работы. Эффективная активность = намерение И подтверждённая подписка на вебхуки, поэтому besales_platform_context_get может вернуть is_active=false сразу после успешного сохранения is_active=true — это не отказ операции, а неподтверждённая подписка (лечится повтором подписки в настройках канала). У остальных 12 каналов значение совпадает с фактом работы."
3771
3773
  },
3772
3774
  "is_ai_enabled": {
3773
3775
  "type": "boolean"
@@ -3956,7 +3958,8 @@
3956
3958
  "type": "string"
3957
3959
  },
3958
3960
  "is_active": {
3959
- "type": "boolean"
3961
+ "type": "boolean",
3962
+ "description": "У Instagram это НАМЕРЕНИЕ держать канал включённым, а не факт работы. Эффективная активность = намерение И подтверждённая подписка на вебхуки, поэтому besales_platform_context_get может вернуть is_active=false сразу после успешного сохранения is_active=true — это не отказ операции, а неподтверждённая подписка (лечится повтором подписки в настройках канала). У остальных 12 каналов значение совпадает с фактом работы."
3960
3963
  }
3961
3964
  }
3962
3965
  },
@@ -4326,6 +4329,13 @@
4326
4329
  "null"
4327
4330
  ],
4328
4331
  "description": "OPTIONAL GetCourse stage id inside the funnel above. Must be set together with create_missing_deal_funnel_id."
4332
+ },
4333
+ "revenue_offer_ids": {
4334
+ "type": "array",
4335
+ "items": {
4336
+ "type": "integer"
4337
+ },
4338
+ "description": "GetCourse offer ids whose paid orders are credited to us regardless of who created the order — the agent via GETCOURSE_CREATE_DEAL or a manager by hand in the GetCourse admin. Empty array turns the rule off. The set applies to the whole school (every platform sharing the GetCourse domain), not to a single platform. Changes money attribution retroactively — dangerous, requires explicit_confirmation."
4329
4339
  }
4330
4340
  }
4331
4341
  },
@@ -6367,7 +6377,8 @@
6367
6377
  "description": "Required when scope=CHANNEL"
6368
6378
  },
6369
6379
  "explicit_confirmation": {
6370
- "const": true
6380
+ "const": true,
6381
+ "type": "boolean"
6371
6382
  }
6372
6383
  }
6373
6384
  }
@@ -6462,7 +6473,8 @@
6462
6473
  "description": "Required для GetCourse (manual funnel_id); ignored для AmoCRM/Bitrix24"
6463
6474
  },
6464
6475
  "acknowledge_external_side_effect": {
6465
- "const": true
6476
+ "const": true,
6477
+ "type": "boolean"
6466
6478
  }
6467
6479
  }
6468
6480
  }
@@ -6506,7 +6518,8 @@
6506
6518
  "type": "boolean"
6507
6519
  },
6508
6520
  "acknowledge_external_side_effect": {
6509
- "const": true
6521
+ "const": true,
6522
+ "type": "boolean"
6510
6523
  }
6511
6524
  }
6512
6525
  }
@@ -6536,10 +6549,12 @@
6536
6549
  "type": "integer"
6537
6550
  },
6538
6551
  "explicit_confirmation": {
6539
- "const": true
6552
+ "const": true,
6553
+ "type": "boolean"
6540
6554
  },
6541
6555
  "acknowledge_external_side_effect": {
6542
- "const": true
6556
+ "const": true,
6557
+ "type": "boolean"
6543
6558
  }
6544
6559
  }
6545
6560
  }
@@ -6629,7 +6644,8 @@
6629
6644
  "description": "Required для GetCourse (manual funnel_stage_id)"
6630
6645
  },
6631
6646
  "acknowledge_external_side_effect": {
6632
- "const": true
6647
+ "const": true,
6648
+ "type": "boolean"
6633
6649
  }
6634
6650
  }
6635
6651
  }
@@ -6696,7 +6712,8 @@
6696
6712
  ]
6697
6713
  },
6698
6714
  "acknowledge_external_side_effect": {
6699
- "const": true
6715
+ "const": true,
6716
+ "type": "boolean"
6700
6717
  }
6701
6718
  }
6702
6719
  }
@@ -6730,10 +6747,12 @@
6730
6747
  "type": "integer"
6731
6748
  },
6732
6749
  "explicit_confirmation": {
6733
- "const": true
6750
+ "const": true,
6751
+ "type": "boolean"
6734
6752
  },
6735
6753
  "acknowledge_external_side_effect": {
6736
- "const": true
6754
+ "const": true,
6755
+ "type": "boolean"
6737
6756
  }
6738
6757
  }
6739
6758
  }
@@ -6797,7 +6816,8 @@
6797
6816
  "format": "uuid"
6798
6817
  },
6799
6818
  "explicit_confirmation": {
6800
- "const": true
6819
+ "const": true,
6820
+ "type": "boolean"
6801
6821
  }
6802
6822
  }
6803
6823
  }
@@ -6907,10 +6927,12 @@
6907
6927
  "format": "uuid"
6908
6928
  },
6909
6929
  "explicit_confirmation": {
6910
- "const": true
6930
+ "const": true,
6931
+ "type": "boolean"
6911
6932
  },
6912
6933
  "acknowledge_destructive_overwrite": {
6913
- "const": true
6934
+ "const": true,
6935
+ "type": "boolean"
6914
6936
  },
6915
6937
  "idempotency_key": {
6916
6938
  "type": "string",
@@ -7306,7 +7328,8 @@
7306
7328
  "format": "uuid"
7307
7329
  },
7308
7330
  "replace_all_existing": {
7309
- "const": true
7331
+ "const": true,
7332
+ "type": "boolean"
7310
7333
  },
7311
7334
  "enabled": {
7312
7335
  "type": "boolean"
@@ -8068,7 +8091,7 @@
8068
8091
  },
8069
8092
  {
8070
8093
  "name": "besales_broadcast_analytics_get",
8071
- "description": "Read-only все данные страницы /broadcast-analytics: отчёты, drill-down, справочники сегментов и продуктов, качество данных и подтверждения оплат. Выбери report; общие фильтры совпадают с UI. Scope: read:analytics.",
8094
+ "description": "Read-only все данные страницы /broadcast-analytics: отчёты, drill-down, справочники сегментов и продуктов, качество данных и подтверждения оплат. Выбери report; общие фильтры совпадают с UI. Scope: read:analytics для агрегатов; отчёты со строками про конкретных людей (recipients, deals, action_failures, indirect_payments, potential_payments, recent_leads, payment_candidates) требуют дополнительно read:conversations — композитный mcp:* покрывает оба.",
8072
8095
  "inputSchema": {
8073
8096
  "type": "object",
8074
8097
  "required": [],
@@ -8190,6 +8213,30 @@
8190
8213
  ],
8191
8214
  "description": "Один или несколько ID именованных вариантов рассылки."
8192
8215
  },
8216
+ "mechanism": {
8217
+ "oneOf": [
8218
+ {
8219
+ "type": "string",
8220
+ "enum": [
8221
+ "wave",
8222
+ "cold_welcome"
8223
+ ]
8224
+ },
8225
+ {
8226
+ "type": "array",
8227
+ "minItems": 1,
8228
+ "maxItems": 2,
8229
+ "items": {
8230
+ "type": "string",
8231
+ "enum": [
8232
+ "wave",
8233
+ "cold_welcome"
8234
+ ]
8235
+ }
8236
+ }
8237
+ ],
8238
+ "description": "Механизм запуска: wave — доставляет процесс школы (мы штампуем поля сделки), cold_welcome — пишем первыми сами. Оба значения = фильтра нет."
8239
+ },
8193
8240
  "product": {
8194
8241
  "oneOf": [
8195
8242
  {
@@ -8506,6 +8553,30 @@
8506
8553
  }
8507
8554
  ]
8508
8555
  },
8556
+ "mechanism": {
8557
+ "oneOf": [
8558
+ {
8559
+ "type": "string",
8560
+ "enum": [
8561
+ "wave",
8562
+ "cold_welcome"
8563
+ ]
8564
+ },
8565
+ {
8566
+ "type": "array",
8567
+ "minItems": 1,
8568
+ "maxItems": 2,
8569
+ "items": {
8570
+ "type": "string",
8571
+ "enum": [
8572
+ "wave",
8573
+ "cold_welcome"
8574
+ ]
8575
+ }
8576
+ }
8577
+ ],
8578
+ "description": "Механизм запуска: wave — доставляет процесс школы (мы штампуем поля сделки), cold_welcome — пишем первыми сами. Оба значения = фильтра нет."
8579
+ },
8509
8580
  "product": {
8510
8581
  "oneOf": [
8511
8582
  {
@@ -9012,13 +9083,108 @@
9012
9083
  "description": {
9013
9084
  "type": "string",
9014
9085
  "maxLength": 4000
9086
+ },
9087
+ "message_text": {
9088
+ "type": [
9089
+ "string",
9090
+ "null"
9091
+ ],
9092
+ "maxLength": 4000,
9093
+ "description": "Текст рассылки для механизма «Первое сообщение»: {firstName}, переменные платформы/воркспейса и {{link:slug}} позволены. null = очистить."
9094
+ },
9095
+ "message_text_by_segment": {
9096
+ "type": [
9097
+ "object",
9098
+ "null"
9099
+ ],
9100
+ "description": "Тексты по сегментам: ключ — имя сегмента из справочника воркспейса, значение — текст для него. Запуск с меткой такого сегмента отправит его текст вместо message_text. Работает только при аудитории по файлу: когорта по дате сегментом не отбирается. null или {} — убрать посегментные тексты.",
9101
+ "propertyNames": {
9102
+ "type": "string",
9103
+ "minLength": 1,
9104
+ "maxLength": 200
9105
+ },
9106
+ "additionalProperties": {
9107
+ "type": "string",
9108
+ "minLength": 1,
9109
+ "maxLength": 4000
9110
+ },
9111
+ "maxProperties": 50
9112
+ },
9113
+ "default_segment": {
9114
+ "type": [
9115
+ "string",
9116
+ "null"
9117
+ ],
9118
+ "maxLength": 200,
9119
+ "description": "Метка аналитики по умолчанию; аудиторию НЕ фильтрует."
9120
+ },
9121
+ "default_product_code": {
9122
+ "type": [
9123
+ "string",
9124
+ "null"
9125
+ ],
9126
+ "maxLength": 200,
9127
+ "description": "Метка аналитики по умолчанию."
9128
+ },
9129
+ "default_funnel": {
9130
+ "type": [
9131
+ "string",
9132
+ "null"
9133
+ ],
9134
+ "maxLength": 200,
9135
+ "description": "Метка аналитики по умолчанию."
9136
+ },
9137
+ "default_channels": {
9138
+ "type": "array",
9139
+ "items": {
9140
+ "type": "string",
9141
+ "enum": [
9142
+ "Site",
9143
+ "Email",
9144
+ "SMS",
9145
+ "Telegram",
9146
+ "Facebook",
9147
+ "VK",
9148
+ "Chatium",
9149
+ "WhatsApp",
9150
+ "Viber",
9151
+ "MAX"
9152
+ ]
9153
+ },
9154
+ "description": "Каналы Шага 2 волны по файлу по умолчанию; подставляются в запуск волны."
9155
+ },
9156
+ "default_deal_fields": {
9157
+ "type": [
9158
+ "object",
9159
+ "null"
9160
+ ],
9161
+ "additionalProperties": {
9162
+ "type": [
9163
+ "string",
9164
+ "number",
9165
+ "boolean",
9166
+ "null"
9167
+ ]
9168
+ },
9169
+ "description": "Поля сделки Шага 2 по умолчанию: ключ — числовой fieldId GetCourse. null = очистить.",
9170
+ "propertyNames": {
9171
+ "pattern": "^\\d+$"
9172
+ }
9173
+ },
9174
+ "default_platform_id": {
9175
+ "type": [
9176
+ "string",
9177
+ "null"
9178
+ ],
9179
+ "format": "uuid",
9180
+ "description": "Платформа запуска по умолчанию; подставляется, если на запуске не передана."
9015
9181
  }
9016
9182
  }
9017
9183
  }
9018
9184
  },
9019
9185
  {
9020
9186
  "name": "besales_broadcast_mailing_variant_update",
9021
- "description": "Изменить название, описание или архивный статус «Варианта рассылки».",
9187
+ "description": "Изменить название, описание или архивный статус «Варианта рассылки». Теперь вариант несёт и ТЕКСТ рассылки с дефолтами запуска.",
9022
9188
  "inputSchema": {
9023
9189
  "type": "object",
9024
9190
  "required": [
@@ -9054,6 +9220,101 @@
9054
9220
  "type": "boolean",
9055
9221
  "const": true,
9056
9222
  "description": "Обязательно true при archived=true после явного подтверждения пользователя."
9223
+ },
9224
+ "message_text": {
9225
+ "type": [
9226
+ "string",
9227
+ "null"
9228
+ ],
9229
+ "maxLength": 4000,
9230
+ "description": "Текст рассылки для механизма «Первое сообщение»: {firstName}, переменные платформы/воркспейса и {{link:slug}} позволены. null = очистить."
9231
+ },
9232
+ "message_text_by_segment": {
9233
+ "type": [
9234
+ "object",
9235
+ "null"
9236
+ ],
9237
+ "description": "Тексты по сегментам: ключ — имя сегмента из справочника воркспейса, значение — текст для него. Запуск с меткой такого сегмента отправит его текст вместо message_text. Работает только при аудитории по файлу: когорта по дате сегментом не отбирается. null или {} — убрать посегментные тексты.",
9238
+ "propertyNames": {
9239
+ "type": "string",
9240
+ "minLength": 1,
9241
+ "maxLength": 200
9242
+ },
9243
+ "additionalProperties": {
9244
+ "type": "string",
9245
+ "minLength": 1,
9246
+ "maxLength": 4000
9247
+ },
9248
+ "maxProperties": 50
9249
+ },
9250
+ "default_segment": {
9251
+ "type": [
9252
+ "string",
9253
+ "null"
9254
+ ],
9255
+ "maxLength": 200,
9256
+ "description": "Метка аналитики по умолчанию; аудиторию НЕ фильтрует."
9257
+ },
9258
+ "default_product_code": {
9259
+ "type": [
9260
+ "string",
9261
+ "null"
9262
+ ],
9263
+ "maxLength": 200,
9264
+ "description": "Метка аналитики по умолчанию."
9265
+ },
9266
+ "default_funnel": {
9267
+ "type": [
9268
+ "string",
9269
+ "null"
9270
+ ],
9271
+ "maxLength": 200,
9272
+ "description": "Метка аналитики по умолчанию."
9273
+ },
9274
+ "default_channels": {
9275
+ "type": "array",
9276
+ "items": {
9277
+ "type": "string",
9278
+ "enum": [
9279
+ "Site",
9280
+ "Email",
9281
+ "SMS",
9282
+ "Telegram",
9283
+ "Facebook",
9284
+ "VK",
9285
+ "Chatium",
9286
+ "WhatsApp",
9287
+ "Viber",
9288
+ "MAX"
9289
+ ]
9290
+ },
9291
+ "description": "Каналы Шага 2 волны по файлу по умолчанию; подставляются в запуск волны."
9292
+ },
9293
+ "default_deal_fields": {
9294
+ "type": [
9295
+ "object",
9296
+ "null"
9297
+ ],
9298
+ "additionalProperties": {
9299
+ "type": [
9300
+ "string",
9301
+ "number",
9302
+ "boolean",
9303
+ "null"
9304
+ ]
9305
+ },
9306
+ "description": "Поля сделки Шага 2 по умолчанию: ключ — числовой fieldId GetCourse. null = очистить.",
9307
+ "propertyNames": {
9308
+ "pattern": "^\\d+$"
9309
+ }
9310
+ },
9311
+ "default_platform_id": {
9312
+ "type": [
9313
+ "string",
9314
+ "null"
9315
+ ],
9316
+ "format": "uuid",
9317
+ "description": "Платформа запуска по умолчанию; подставляется, если на запуске не передана."
9057
9318
  }
9058
9319
  },
9059
9320
  "if": {
@@ -9102,8 +9363,8 @@
9102
9363
  }
9103
9364
  },
9104
9365
  {
9105
- "name": "besales_dialogue_audit_config_get",
9106
- "description": "Read-only настройки «Ревизора диалогов» на канале: включён ли плановый разбор, модель, час запуска, инструкции. isConfigured=false — строки конфига ещё нет, значения дефолтные. Запись настроек через MCP не выведена. Scope: read:analytics.",
9366
+ "name": "besales_getcourse_cold_welcome_preview",
9367
+ "description": "Охват рассылки «Первое сообщение» БЕЗ отправки: totalContacts (ещё могут получить), alreadyWelcomed (уже получали — первое сообщение одноразово на контакт), foundContacts.",
9107
9368
  "inputSchema": {
9108
9369
  "type": "object",
9109
9370
  "required": [
@@ -9111,66 +9372,426 @@
9111
9372
  ],
9112
9373
  "additionalProperties": false,
9113
9374
  "properties": {
9114
- "platform_id": {
9375
+ "workspace_id": {
9115
9376
  "type": "string",
9116
9377
  "format": "uuid",
9117
- "description": "Канал, для которого настроен ревизор."
9118
- }
9119
- }
9120
- }
9121
- },
9122
- {
9123
- "name": "besales_dialogue_audit_runs_list",
9124
- "description": "История прогонов ревизора на канале, курсорная пагинация (offset показал бы один прогон дважды). Scope: read:analytics.",
9125
- "inputSchema": {
9126
- "type": "object",
9127
- "required": [
9128
- "platform_id"
9129
- ],
9130
- "additionalProperties": false,
9131
- "properties": {
9378
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9379
+ },
9132
9380
  "platform_id": {
9133
9381
  "type": "string",
9134
- "format": "uuid",
9135
- "description": "Канал."
9382
+ "format": "uuid"
9136
9383
  },
9137
- "cursor": {
9384
+ "created_after": {
9138
9385
  "type": "string",
9139
- "description": "nextCursor предыдущей страницы."
9386
+ "format": "date-time",
9387
+ "description": "Аудитория «по дате»: нижняя граница по дате создания контакта. Ровно одна аудитория — created_after ЛИБО contacts."
9140
9388
  },
9141
- "limit": {
9142
- "type": "integer",
9143
- "minimum": 1,
9144
- "maximum": 100,
9145
- "description": "Размер страницы."
9389
+ "contacts": {
9390
+ "type": "array",
9391
+ "minItems": 1,
9392
+ "maxItems": 5000,
9393
+ "description": "Аудитория «по файлу»: контакты предсписка. Ровно одна аудитория на запуск — created_after ЛИБО contacts.",
9394
+ "items": {
9395
+ "type": "object",
9396
+ "required": [
9397
+ "contact_id"
9398
+ ],
9399
+ "additionalProperties": false,
9400
+ "properties": {
9401
+ "contact_id": {
9402
+ "type": "string",
9403
+ "pattern": "^\\d+$",
9404
+ "description": "getcourseUserId контакта (число в строковом виде)"
9405
+ },
9406
+ "deal_id": {
9407
+ "type": "string",
9408
+ "pattern": "^\\d+$",
9409
+ "description": "Пин сделки для штампа полей (число в строковом виде)"
9410
+ }
9411
+ }
9412
+ }
9146
9413
  }
9147
9414
  }
9148
9415
  }
9149
9416
  },
9150
9417
  {
9151
- "name": "besales_dialogue_audit_run_get",
9152
- "description": "Отчёт прогона: статус, счётчики охвата (candidate/audited/failed segments), сводка, причина обрыва. Счётчики зафиксированы и не пересчитываются. Scope: read:analytics.",
9418
+ "name": "besales_getcourse_cold_welcome_start",
9419
+ "description": "Запустить рассылку «Первое сообщение» (мы пишем первыми контактам без диалога). НЕОБРАТИМО: у GetCourse нет идемпотентности, отправку нельзя отозвать. Всегда сначала preview и подтверждение пользователя. Аудитория: по дате (created_after) или по файлу (contacts). Поля сделки штампуются после отправки. Если у рассылки заданы тексты по сегментам, значение segment ВЫБИРАЕТ текст: назови пользователю выбранный текст ДО подтверждения и не запускай посегментный текст по created_after.",
9153
9420
  "inputSchema": {
9154
9421
  "type": "object",
9155
9422
  "required": [
9156
- "run_id"
9423
+ "explicit_confirmation"
9157
9424
  ],
9158
9425
  "additionalProperties": false,
9159
9426
  "properties": {
9160
- "run_id": {
9427
+ "workspace_id": {
9161
9428
  "type": "string",
9162
9429
  "format": "uuid",
9163
- "description": "Прогон ревизора."
9164
- }
9165
- }
9166
- }
9167
- },
9168
- {
9169
- "name": "besales_dialogue_audit_findings",
9170
- "description": "Находки прогона — материал для правки промпта. Фильтры: агент, категория, важность, статус разметки человеком (NEW/LIKED/DISLIKED). truncated=true означает обрезанный список. Разметка находок через MCP НЕ выведена: это человеческая оценка работы ревизора. Scope: read:analytics.",
9171
- "inputSchema": {
9172
- "type": "object",
9173
- "required": [
9430
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9431
+ },
9432
+ "platform_id": {
9433
+ "type": "string",
9434
+ "format": "uuid",
9435
+ "description": "Можно опустить, если у рассылки задана «Платформа по умолчанию»."
9436
+ },
9437
+ "created_after": {
9438
+ "type": "string",
9439
+ "format": "date-time"
9440
+ },
9441
+ "message": {
9442
+ "type": "string",
9443
+ "minLength": 1,
9444
+ "maxLength": 4000,
9445
+ "description": "Разовый текст. Ровно один источник: message ЛИБО mailing_variant_id."
9446
+ },
9447
+ "mailing_variant_id": {
9448
+ "type": "string",
9449
+ "format": "uuid",
9450
+ "description": "Сохранённая рассылка: текст берётся из неё, метки — из её дефолтов."
9451
+ },
9452
+ "segment": {
9453
+ "type": "string",
9454
+ "maxLength": 200,
9455
+ "description": "Сегмент запуска. ⚠️ Аудиторию НЕ отбирает: когорту задают платформа и граница даты. ⚠️⚠️ Если у рассылки есть текст ИМЕННО для этого сегмента (message_text_by_segment), он выбирает текст запуска — и тогда аудитория обязана быть файловой (contacts): с created_after такой запуск отвергается 400, потому что текст ушёл бы всей базе после границы."
9456
+ },
9457
+ "product_code": {
9458
+ "type": "string",
9459
+ "maxLength": 200
9460
+ },
9461
+ "funnel": {
9462
+ "type": "string",
9463
+ "maxLength": 200
9464
+ },
9465
+ "explicit_confirmation": {
9466
+ "type": "boolean",
9467
+ "const": true,
9468
+ "description": "Подтверждение пользователя, полученное ПОСЛЕ показа охвата из preview."
9469
+ },
9470
+ "contacts": {
9471
+ "type": "array",
9472
+ "minItems": 1,
9473
+ "maxItems": 5000,
9474
+ "description": "Аудитория «по файлу»: контакты предсписка. Ровно одна аудитория на запуск — created_after ЛИБО contacts.",
9475
+ "items": {
9476
+ "type": "object",
9477
+ "required": [
9478
+ "contact_id"
9479
+ ],
9480
+ "additionalProperties": false,
9481
+ "properties": {
9482
+ "contact_id": {
9483
+ "type": "string",
9484
+ "pattern": "^\\d+$",
9485
+ "description": "getcourseUserId контакта (число в строковом виде)"
9486
+ },
9487
+ "deal_id": {
9488
+ "type": "string",
9489
+ "pattern": "^\\d+$",
9490
+ "description": "Пин сделки для штампа полей (число в строковом виде)"
9491
+ }
9492
+ }
9493
+ }
9494
+ },
9495
+ "deal_fields": {
9496
+ "type": "object",
9497
+ "propertyNames": {
9498
+ "pattern": "^\\d+$"
9499
+ },
9500
+ "additionalProperties": {
9501
+ "type": [
9502
+ "string",
9503
+ "number",
9504
+ "boolean",
9505
+ "null"
9506
+ ]
9507
+ },
9508
+ "description": "Поля сделки, проставляемые ПОСЛЕ успешной отправки (ключ — числовой fieldId). Ключ не передан — берутся дефолты рассылки; передан ПУСТОЙ объект — явное «на этом запуске без полей»."
9509
+ }
9510
+ }
9511
+ }
9512
+ },
9513
+ {
9514
+ "name": "besales_getcourse_cold_welcome_batch_start",
9515
+ "description": "Запустить ПАКЕТ сегментов «Первого сообщения»: несколько сегментов одним вызовом, у каждого свой список контактов, свои метки и свои поля сделки. НЕОБРАТИМО. Сегменты идут ПО ОЧЕРЕДИ — задачи импорта не могут выполняться параллельно. Весь пакет проверяется ДО первой отправки: сегмент без текста отменяет пакет целиком. Если у рассылки заданы посегментные тексты, каждый сегмент отправит СВОЙ текст.",
9516
+ "inputSchema": {
9517
+ "type": "object",
9518
+ "required": [
9519
+ "segments",
9520
+ "explicit_confirmation"
9521
+ ],
9522
+ "additionalProperties": false,
9523
+ "properties": {
9524
+ "workspace_id": {
9525
+ "type": "string",
9526
+ "format": "uuid",
9527
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9528
+ },
9529
+ "platform_id": {
9530
+ "type": "string",
9531
+ "format": "uuid"
9532
+ },
9533
+ "message": {
9534
+ "type": "string",
9535
+ "minLength": 1,
9536
+ "maxLength": 4000
9537
+ },
9538
+ "mailing_variant_id": {
9539
+ "type": "string",
9540
+ "format": "uuid"
9541
+ },
9542
+ "segments": {
9543
+ "type": "array",
9544
+ "minItems": 1,
9545
+ "maxItems": 10,
9546
+ "items": {
9547
+ "type": "object",
9548
+ "additionalProperties": false,
9549
+ "required": [
9550
+ "contacts"
9551
+ ],
9552
+ "properties": {
9553
+ "segment": {
9554
+ "type": "string",
9555
+ "maxLength": 200,
9556
+ "description": "Сегмент блока. Он же выбирает текст рассылки, если у неё есть посегментные тексты."
9557
+ },
9558
+ "product_code": {
9559
+ "type": "string",
9560
+ "maxLength": 200
9561
+ },
9562
+ "funnel": {
9563
+ "type": "string",
9564
+ "maxLength": 200
9565
+ },
9566
+ "deal_fields": {
9567
+ "type": "object",
9568
+ "propertyNames": {
9569
+ "type": "string",
9570
+ "pattern": "^\\d+$"
9571
+ }
9572
+ },
9573
+ "contacts": {
9574
+ "type": "array",
9575
+ "minItems": 1,
9576
+ "maxItems": 5000,
9577
+ "items": {
9578
+ "type": "object",
9579
+ "additionalProperties": false,
9580
+ "required": [
9581
+ "contact_id"
9582
+ ],
9583
+ "properties": {
9584
+ "contact_id": {
9585
+ "type": "string",
9586
+ "pattern": "^\\d+$"
9587
+ },
9588
+ "deal_id": {
9589
+ "type": "string",
9590
+ "pattern": "^\\d+$"
9591
+ }
9592
+ }
9593
+ }
9594
+ }
9595
+ }
9596
+ }
9597
+ },
9598
+ "explicit_confirmation": {
9599
+ "type": "boolean",
9600
+ "const": true,
9601
+ "description": "Подтверждение пользователя. Обязательно: отправку нельзя отозвать."
9602
+ }
9603
+ }
9604
+ }
9605
+ },
9606
+ {
9607
+ "name": "besales_getcourse_cold_welcome_batch_status",
9608
+ "description": "Состояние пакета: агрегат state и разбивка segments[] со своим статусом, importJobId и причиной отказа у каждого. stalled=true — драйвер оборвался, остаток пакета надо запустить заново.",
9609
+ "inputSchema": {
9610
+ "type": "object",
9611
+ "required": [
9612
+ "batch_id"
9613
+ ],
9614
+ "additionalProperties": false,
9615
+ "properties": {
9616
+ "workspace_id": {
9617
+ "type": "string",
9618
+ "format": "uuid",
9619
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9620
+ },
9621
+ "batch_id": {
9622
+ "type": "string",
9623
+ "format": "uuid"
9624
+ }
9625
+ }
9626
+ }
9627
+ },
9628
+ {
9629
+ "name": "besales_getcourse_cold_welcome_batch_resume",
9630
+ "description": "Возобновить остаток пакета «Первого сообщения» после обрыва драйвера (stalled). Источник текста хранится в плане — пересобирать списки контактов не нужно. Повтора отправки не будет: приветствие одноразово НА КОНТАКТ.",
9631
+ "inputSchema": {
9632
+ "type": "object",
9633
+ "required": [
9634
+ "batch_id"
9635
+ ],
9636
+ "additionalProperties": false,
9637
+ "properties": {
9638
+ "workspace_id": {
9639
+ "type": "string",
9640
+ "format": "uuid",
9641
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9642
+ },
9643
+ "batch_id": {
9644
+ "type": "string",
9645
+ "format": "uuid"
9646
+ }
9647
+ }
9648
+ }
9649
+ },
9650
+ {
9651
+ "name": "besales_getcourse_cold_welcome_batch_cancel",
9652
+ "description": "Отменить ОСТАТОК пакета: не начатые сегменты и идущую задачу. Уже отправленное не отзывается.",
9653
+ "inputSchema": {
9654
+ "type": "object",
9655
+ "required": [
9656
+ "batch_id",
9657
+ "explicit_confirmation"
9658
+ ],
9659
+ "additionalProperties": false,
9660
+ "properties": {
9661
+ "workspace_id": {
9662
+ "type": "string",
9663
+ "format": "uuid",
9664
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9665
+ },
9666
+ "batch_id": {
9667
+ "type": "string",
9668
+ "format": "uuid"
9669
+ },
9670
+ "explicit_confirmation": {
9671
+ "type": "boolean",
9672
+ "const": true,
9673
+ "description": "Подтверждение пользователя. Обязательно: отправку нельзя отозвать."
9674
+ }
9675
+ }
9676
+ }
9677
+ },
9678
+ {
9679
+ "name": "besales_getcourse_cold_welcome_cancel",
9680
+ "description": "Остановить идущую рассылку «Первое сообщение»: действует на остаток когорты (~10 секунд), уже отправленное не отзывается.",
9681
+ "inputSchema": {
9682
+ "type": "object",
9683
+ "required": [
9684
+ "job_id"
9685
+ ],
9686
+ "additionalProperties": false,
9687
+ "properties": {
9688
+ "workspace_id": {
9689
+ "type": "string",
9690
+ "format": "uuid",
9691
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9692
+ },
9693
+ "job_id": {
9694
+ "type": "string",
9695
+ "format": "uuid"
9696
+ }
9697
+ }
9698
+ }
9699
+ },
9700
+ {
9701
+ "name": "besales_broadcast_launches_list",
9702
+ "description": "История запусков рассылок одним списком: наша отправка (cold_welcome, со снимком текста и разбивкой исходов) и волны по файлу (wave).",
9703
+ "inputSchema": {
9704
+ "type": "object",
9705
+ "required": [],
9706
+ "additionalProperties": false,
9707
+ "properties": {
9708
+ "workspace_id": {
9709
+ "type": "string",
9710
+ "format": "uuid",
9711
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9712
+ },
9713
+ "mailing_variant_id": {
9714
+ "type": "string",
9715
+ "format": "uuid"
9716
+ },
9717
+ "limit": {
9718
+ "type": "integer",
9719
+ "minimum": 1,
9720
+ "maximum": 50
9721
+ }
9722
+ }
9723
+ }
9724
+ },
9725
+ {
9726
+ "name": "besales_dialogue_audit_config_get",
9727
+ "description": "Read-only настройки «Ревизора диалогов» на канале: включён ли плановый разбор, модель, час запуска, инструкции. isConfigured=false — строки конфига ещё нет, значения дефолтные. Запись настроек через MCP не выведена. Scope: read:analytics.",
9728
+ "inputSchema": {
9729
+ "type": "object",
9730
+ "required": [
9731
+ "platform_id"
9732
+ ],
9733
+ "additionalProperties": false,
9734
+ "properties": {
9735
+ "platform_id": {
9736
+ "type": "string",
9737
+ "format": "uuid",
9738
+ "description": "Канал, для которого настроен ревизор."
9739
+ }
9740
+ }
9741
+ }
9742
+ },
9743
+ {
9744
+ "name": "besales_dialogue_audit_runs_list",
9745
+ "description": "История прогонов ревизора на канале, курсорная пагинация (offset показал бы один прогон дважды). Scope: read:analytics.",
9746
+ "inputSchema": {
9747
+ "type": "object",
9748
+ "required": [
9749
+ "platform_id"
9750
+ ],
9751
+ "additionalProperties": false,
9752
+ "properties": {
9753
+ "platform_id": {
9754
+ "type": "string",
9755
+ "format": "uuid",
9756
+ "description": "Канал."
9757
+ },
9758
+ "cursor": {
9759
+ "type": "string",
9760
+ "description": "nextCursor предыдущей страницы."
9761
+ },
9762
+ "limit": {
9763
+ "type": "integer",
9764
+ "minimum": 1,
9765
+ "maximum": 100,
9766
+ "description": "Размер страницы."
9767
+ }
9768
+ }
9769
+ }
9770
+ },
9771
+ {
9772
+ "name": "besales_dialogue_audit_run_get",
9773
+ "description": "Отчёт прогона: статус, счётчики охвата (candidate/audited/failed segments), сводка, причина обрыва. Счётчики зафиксированы и не пересчитываются. Scope: read:analytics.",
9774
+ "inputSchema": {
9775
+ "type": "object",
9776
+ "required": [
9777
+ "run_id"
9778
+ ],
9779
+ "additionalProperties": false,
9780
+ "properties": {
9781
+ "run_id": {
9782
+ "type": "string",
9783
+ "format": "uuid",
9784
+ "description": "Прогон ревизора."
9785
+ }
9786
+ }
9787
+ }
9788
+ },
9789
+ {
9790
+ "name": "besales_dialogue_audit_findings",
9791
+ "description": "Находки прогона — материал для правки промпта. Фильтры: агент, категория, важность, статус разметки человеком (NEW/LIKED/DISLIKED). truncated=true означает обрезанный список. Разметка находок через MCP НЕ выведена: это человеческая оценка работы ревизора. Scope: read:analytics + read:conversations — находка несёт цитату реплики конкретного человека, а не агрегат (композитный mcp:* покрывает оба).",
9792
+ "inputSchema": {
9793
+ "type": "object",
9794
+ "required": [
9174
9795
  "run_id"
9175
9796
  ],
9176
9797
  "additionalProperties": false,
@@ -9258,6 +9879,224 @@
9258
9879
  }
9259
9880
  }
9260
9881
  }
9882
+ },
9883
+ {
9884
+ "name": "besales_tracked_link_list",
9885
+ "description": "Каталог коротких трекинговых ссылок workspace со сводкой «выдано → клики → ответы → заявки → оплаты». Поле placeholder — готовый токен {{link:slug}} для текстов дожимов, рассылок и шаблонов: вставляется ИМЕННО он, сырой URL мимо трекинга не считается. staticUrl — анонимный короткий адрес для мест без персональной выдачи (промпт агента, письмо школы). Ответ постраничный; hasMore=true означает, что каталог не дочитан. Scope: read:analytics. ⚠️ Токен берётся ТОЛЬКО копированием поля placeholder: собранный вручную токен с неточным слагом вырезается вместе с маркером, и клиент получает фразу без ссылки. В промпт агента токен не кладут — там staticUrl.",
9886
+ "inputSchema": {
9887
+ "type": "object",
9888
+ "required": [],
9889
+ "additionalProperties": false,
9890
+ "properties": {
9891
+ "workspace_id": {
9892
+ "type": "string",
9893
+ "format": "uuid",
9894
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9895
+ },
9896
+ "include_archived": {
9897
+ "type": "boolean",
9898
+ "description": "Показать и архивные ссылки. Их слаги ЗАНЯТЫ: создание с тем же слагом даст 409. Архивные идут первыми."
9899
+ },
9900
+ "days": {
9901
+ "type": "integer",
9902
+ "minimum": 1,
9903
+ "maximum": 366,
9904
+ "description": "Глубина сводки в днях (по умолчанию 60)."
9905
+ },
9906
+ "limit": {
9907
+ "type": "integer",
9908
+ "minimum": 1,
9909
+ "maximum": 200,
9910
+ "description": "Размер страницы (по умолчанию 50)."
9911
+ },
9912
+ "offset": {
9913
+ "type": "integer",
9914
+ "minimum": 0,
9915
+ "description": "Смещение страницы."
9916
+ }
9917
+ }
9918
+ }
9919
+ },
9920
+ {
9921
+ "name": "besales_tracked_link_create",
9922
+ "description": "Завести трекинговую ссылку: имя, слаг и целевой http(s)-адрес. В ответе приходит placeholder {{link:slug}} — вставляй его в тексты вместо сырого URL, иначе переход не попадёт в аналитику. Слаг НЕИЗМЕНЯЕМ (он уходит в отправленные сообщения) и уникален в workspace; 409 значит, что слаг занят живой ИЛИ архивной ссылкой — архивную восстанавливают besales_tracked_link_update(restore=true), а не заводят новую. Scope: mcp:platform-setup. ⚠️ В тексты вставляется поле placeholder из ответа ДОСЛОВНО, а не собранный вручную токен: неточный слаг вырежется и клиент получит фразу без ссылки.",
9923
+ "inputSchema": {
9924
+ "type": "object",
9925
+ "required": [
9926
+ "name",
9927
+ "slug",
9928
+ "target_url"
9929
+ ],
9930
+ "additionalProperties": false,
9931
+ "properties": {
9932
+ "workspace_id": {
9933
+ "type": "string",
9934
+ "format": "uuid",
9935
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9936
+ },
9937
+ "name": {
9938
+ "type": "string",
9939
+ "minLength": 1,
9940
+ "maxLength": 200,
9941
+ "description": "Название для аналитики, например «Эфир 1, 15:00»."
9942
+ },
9943
+ "slug": {
9944
+ "type": "string",
9945
+ "pattern": "^[a-zA-Z0-9_-]{1,64}$",
9946
+ "description": "Часть плейсхолдера {{link:slug}}: латиница, цифры, дефис, подчёркивание, до 64 символов. Изменить потом нельзя."
9947
+ },
9948
+ "target_url": {
9949
+ "type": "string",
9950
+ "maxLength": 2048,
9951
+ "description": "Абсолютный http(s)-адрес, куда ведёт ссылка. Только http/https.",
9952
+ "pattern": "^https?://"
9953
+ },
9954
+ "product_code": {
9955
+ "type": "string",
9956
+ "maxLength": 64,
9957
+ "description": "Код продукта для сводки каталога."
9958
+ }
9959
+ }
9960
+ }
9961
+ },
9962
+ {
9963
+ "name": "besales_tracked_link_update",
9964
+ "description": "Изменить название, целевой адрес или код продукта ссылки либо снять её из архива (restore=true). Требуется хотя бы одно изменяемое поле. ⚠️ Правка target_url действует ТОЛЬКО ВПЕРЁД: персональные коды, уже ушедшие людям, остаются на СТАРОМ адресе (каждая выдача хранит снимок адреса на момент отправки, резолвер читает его), новые выдачи получат новый адрес, анонимный staticUrl переключится сразу. Перенаправить тех, кому ссылка уже отправлена, правкой НЕЛЬЗЯ — нужна новая ссылка в новом тексте. Поля ответа сюда не копируются: slug неизменяем, archivedAt не поле записи (архивация — besales_tracked_link_archive), счётчики и placeholder только читаются. Scope: mcp:platform-setup.",
9965
+ "inputSchema": {
9966
+ "type": "object",
9967
+ "required": [
9968
+ "link_id"
9969
+ ],
9970
+ "additionalProperties": false,
9971
+ "properties": {
9972
+ "workspace_id": {
9973
+ "type": "string",
9974
+ "format": "uuid",
9975
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9976
+ },
9977
+ "link_id": {
9978
+ "type": "string",
9979
+ "format": "uuid",
9980
+ "description": "UUID ссылки из каталога."
9981
+ },
9982
+ "name": {
9983
+ "type": "string",
9984
+ "minLength": 1,
9985
+ "maxLength": 200
9986
+ },
9987
+ "target_url": {
9988
+ "type": "string",
9989
+ "maxLength": 2048,
9990
+ "description": "Новый абсолютный http(s)-адрес. Действует только вперёд: уже отправленные персональные коды остаются на прежней цели (там снимок адреса).",
9991
+ "pattern": "^https?://"
9992
+ },
9993
+ "product_code": {
9994
+ "type": "string",
9995
+ "maxLength": 64
9996
+ },
9997
+ "restore": {
9998
+ "const": true,
9999
+ "type": "boolean",
10000
+ "description": "Снять ссылку из архива. Архивирует besales_tracked_link_archive."
10001
+ }
10002
+ }
10003
+ }
10004
+ },
10005
+ {
10006
+ "name": "besales_tracked_link_archive",
10007
+ "description": "Архивировать ссылку. Удаления у трекинговых ссылок НЕТ и не будет: код уже лежит в отправленных людям сообщениях, и hard-delete превратил бы живую ссылку в 404. Архивная ссылка перестаёт подставляться в новые тексты, но её код продолжает резолвиться, клики считаются, а слаг остаётся занятым. Восстановление — besales_tracked_link_update(restore=true). Требует explicit_confirmation=true после явного подтверждения пользователя. Scope: mcp:platform-setup.",
10008
+ "inputSchema": {
10009
+ "type": "object",
10010
+ "required": [
10011
+ "link_id",
10012
+ "explicit_confirmation"
10013
+ ],
10014
+ "additionalProperties": false,
10015
+ "properties": {
10016
+ "workspace_id": {
10017
+ "type": "string",
10018
+ "format": "uuid",
10019
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
10020
+ },
10021
+ "link_id": {
10022
+ "type": "string",
10023
+ "format": "uuid",
10024
+ "description": "UUID ссылки из каталога."
10025
+ },
10026
+ "explicit_confirmation": {
10027
+ "const": true,
10028
+ "type": "boolean",
10029
+ "description": "Подтверждение пользователя на архивацию ссылки."
10030
+ }
10031
+ }
10032
+ }
10033
+ },
10034
+ {
10035
+ "name": "besales_tracked_link_breakdown",
10036
+ "description": "Разрез одной ссылки по источникам выдачи: WAVE (волна), FOLLOWUP (дожим), CAMPAIGN (кампания), GREETING (приветствие), AGENT (обычный ответ агента) — с воронкой по каждому. Отвечает на вопрос «после чего по ссылке ходят», а не «каким сообщением она ушла». Оплата атрибутируется last-touch по ближайшему клику. Scope: read:analytics.",
10037
+ "inputSchema": {
10038
+ "type": "object",
10039
+ "required": [
10040
+ "link_id"
10041
+ ],
10042
+ "additionalProperties": false,
10043
+ "properties": {
10044
+ "workspace_id": {
10045
+ "type": "string",
10046
+ "format": "uuid",
10047
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
10048
+ },
10049
+ "link_id": {
10050
+ "type": "string",
10051
+ "format": "uuid",
10052
+ "description": "UUID ссылки из каталога."
10053
+ },
10054
+ "days": {
10055
+ "type": "integer",
10056
+ "minimum": 1,
10057
+ "maximum": 366,
10058
+ "description": "Глубина сводки в днях (по умолчанию 60)."
10059
+ }
10060
+ }
10061
+ }
10062
+ },
10063
+ {
10064
+ "name": "besales_tracked_link_clicks",
10065
+ "description": "Лента переходов по ссылке: контакт, сообщение, источник выдачи и время. Клики-предпросмотры мессенджеров отсеяны. ⚠️ Анонимные переходы по staticUrl В ЛЕНТЕ ЕСТЬ — строками с null в chatUserId/contactName/messageId/issuedAt/sourceKind (у анонимного кода человека нет по построению); не считай их людьми, их суммарное число лежит в каталоге полем anonymousClicks. ⚠️ total — число КЛИКОВ (включая повторные и анонимные), а clicked в каталоге — число ВЫДАЧ с первым живым кликом: величины разные и сходиться не обязаны. Постранично: page + page_size (максимум 200). Scope: read:analytics + read:conversations (лента несёт имя контакта и id сообщения; композитный mcp:* покрывает оба).",
10066
+ "inputSchema": {
10067
+ "type": "object",
10068
+ "required": [
10069
+ "link_id"
10070
+ ],
10071
+ "additionalProperties": false,
10072
+ "properties": {
10073
+ "workspace_id": {
10074
+ "type": "string",
10075
+ "format": "uuid",
10076
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
10077
+ },
10078
+ "link_id": {
10079
+ "type": "string",
10080
+ "format": "uuid",
10081
+ "description": "UUID ссылки из каталога."
10082
+ },
10083
+ "days": {
10084
+ "type": "integer",
10085
+ "minimum": 1,
10086
+ "maximum": 366,
10087
+ "description": "Глубина сводки в днях (по умолчанию 60)."
10088
+ },
10089
+ "page": {
10090
+ "type": "integer",
10091
+ "minimum": 1
10092
+ },
10093
+ "page_size": {
10094
+ "type": "integer",
10095
+ "minimum": 1,
10096
+ "maximum": 200
10097
+ }
10098
+ }
10099
+ }
9261
10100
  }
9262
10101
  ],
9263
10102
  "resources": [
@@ -9449,7 +10288,7 @@
9449
10288
  }
9450
10289
  ],
9451
10290
  "summary": {
9452
- "total_tools": 177,
10291
+ "total_tools": 191,
9453
10292
  "tools_by_category": {
9454
10293
  "getcourse_wave": 10,
9455
10294
  "files_upload": 3,
@@ -9488,7 +10327,8 @@
9488
10327
  "broadcast_analytics": 2,
9489
10328
  "scheduled_tasks": 2,
9490
10329
  "follow_up_read": 3,
9491
- "dialogue_audit": 6
10330
+ "dialogue_audit": 6,
10331
+ "link_tracking": 6
9492
10332
  },
9493
10333
  "external_execution_pairs": [
9494
10334
  "besales_icp_analysis_get_instructions / submit",
@@ -9680,6 +10520,14 @@
9680
10520
  ],
9681
10521
  "newly_added_in_followup_reactions": [
9682
10522
  "besales_followup_reactions"
10523
+ ],
10524
+ "newly_added_in_link_tracking": [
10525
+ "besales_tracked_link_list",
10526
+ "besales_tracked_link_create",
10527
+ "besales_tracked_link_update",
10528
+ "besales_tracked_link_archive",
10529
+ "besales_tracked_link_breakdown",
10530
+ "besales_tracked_link_clicks"
9683
10531
  ]
9684
10532
  }
9685
10533
  }