# Конструктор API

<span style="font-weight: 400;">*«API — это продукт. API — это также то, как вы разрабатываете, продаете и доставляете цифровые и все чаще физические продукты своим клиентам»* — Кин Лейн, главный евангелист Postman</span>

---

<span style="font-weight: 400;">Коммуникационная low-code платформа Metabot </span>обладает встроенным конструктором API для организации взаимодействия с внешними системами по REST в соответствии со стандартом OpenAPI 3.

У любого чат-бота, создаваемого на Metabot, есть внутреннее API — для обращений внешних систем к чат-боту, и внешнее API — для обращений чат-бота к внешним системам.

API состоит из **точек интеграции**, называемых **эндпоинтами (endpoints)** или **конечными точками** (точками доступа, точками связи и т.п.)<span style="font-weight: 400;">. Настройка точек интеграции происходит в разделах **Внутреннее** и **Внешнее API** доступное из меню **Настроек бота**.</span>

[![Снимок экрана 2024-02-05 123004.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/UmhXhPFcg3VxtSl4-snimok-ekrana-2024-02-05-123004.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/UmhXhPFcg3VxtSl4-snimok-ekrana-2024-02-05-123004.png)

**Внутреннее API** представляет из себя конструктор API для вашего чат-бота. Здесь вы можете создать и кастомизировать ваши точки доступа к чат-боту, задать **алиас (alias)** точки и возвращаемый ответ с помощью JavaScript. В JavaScript можно планировать другие задания в очереди работ чат-бота (асинхронные), а также вызывать внешнее API (колбэк/callback).

**Внешнее API** представляет из себя конструктор API для обращения к любым внешним ресурсам. Здесь, в едином списке вы можете описать конечные точки доступа к API внешних ресурсов, описать как отправлять запросы, с каким содержимым, какими заголовками и т.д. и далее вызывать эти внешние точки из любой точки платформы, где доступен вызов JavaScript, например, из диалогового сценария чат-бота.

Кастомное внутреннее API является синхронным, это значит что для возвращения ответа по API не будет планироваться отдельного задания в очереди, поэтому очень важно не делать сложные вычисления в таком API.

Удобство синхронного API в том, что вы моментально получаете ответ на запрос, нет необходимости отдельно опрашивать результат выполнения задания или устанавливать отдельный колбэк. При этом, в JavaScript, являющимся телом API запроса можно также планировать любые другие «вложенные» задания (например триггеры, скрипты конструктора или рассылки), такие задания будут выполнены асинхронно, для них в очереди будут спланированы и выполнены отдельные задания.

Если вы хотите получить ответ от внешнего API позже, в момент выполнения отдельного асинхронного «вложенного» задания, то для этого вам необходимо вызвать внешний API в запущенном скрипте или триггере (с помощью внешнего эндпоинта или JS функции api.callEndpoint). Таким образом, вы можете создать любую цепочку связанных заданий и получить результат идентичный вызову коллбеков в необходимых точках.

Вызвать внешнее API можно с помощью JS функции **api.callEndpoint(...)**, подробности смотрите ниже, в разделе с описанием внешнего API.

### Внутреннее API

[![1.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/doLKsWheI27b3RwT-1.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/doLKsWheI27b3RwT-1.png)

#### Структура конечной точки внутреннего API

Описание полей внутреннего эндпоинта представлена в таблице ниже.

<table border="1" id="bkmrk-%D0%A4%D0%BB%D0%B0%D0%B3-%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%95%D1%81%D0%BB%D0%B8" style="border-collapse: collapse; width: 100%; height: 900.927px;"><tbody><tr style="height: 29.7917px; background-color: #c2e0f4;"><td style="width: 20.7664%; height: 29.7917px;">Поле</td><td style="width: 79.2336%; height: 29.7917px;">Описание</td></tr><tr style="height: 46.5625px;"><td style="width: 20.7664%; height: 46.5625px;">Флаг активности</td><td style="width: 79.2336%; height: 46.5625px;">Если убрать флаг, то при обращению через API к данному endpoint будет возвращена ошибка.</td></tr><tr style="height: 236.958px;"><td style="width: 20.7664%; height: 236.958px;">Алиас</td><td style="width: 79.2336%; height: 236.958px;">Дополнительный уникальный идентификатор. Используется как часть URL-адреса для обращения к конечной точке через API, а также для вызова в JavaScript функциях.

Разрешенные символы: буква, цифра, подчеркивание, дефис, слэш (косая черта)

Шаблон URL-адреса конечной точки:

https://адресплатформы/api/v1/bots/**{bot\_id}**/call/**{alias}**

Для каждого бота создается свое пространство имен для API, что означает Алиас должен быть уникален в пределах бота.

</td></tr><tr style="height: 528.427px;"><td style="width: 20.7664%; height: 528.427px;">JavaScript для вычисления API ответа (Response Body)

</td><td style="width: 79.2336%; height: 528.427px;">JavaScript для вычисления содержимого API ответа. Данный JS код будет выполнен при обращении к внутреннему API (по алиасу), результат выполнения кода будет являться телом ответа на API запрос.

Это значит, что API ответ вычисляется на основе JavaScript. В JavaScript должен присутствовать ключевой оператор return для возврата значения из JS. Выражение которое указывается после return является ответом (Response Body) на API запрос.

Можно возвращать:

- Строку (будет сконвертирована в json, если формат валидный);
- Массив;
- Объект (в том числе JSON-объект).

Пример:

```JavaScript
return {
  "key": "value",
  "lead_name": lead.getData('name'),
  "request_param_name": request.json.name
};
```

В JS можно выполнять любой код, например обращаться к пользователям, или устанавливать переменные в memory, планировать задания бота (триггеры, рассылки, скрипты), а также вызывать внешнее API c помощью api.callEndpoint или другие методов объекта api: post/get/postJson/getJson/request.

</td></tr><tr style="height: 59.1875px;"><td style="width: 20.7664%; height: 59.1875px;">Комментарий</td><td style="width: 79.2336%; height: 59.1875px;">Любой текст. Доступно указание любых HTML-тэгов.

</td></tr></tbody></table>

<p class="callout warning">На данный момент доступен вызов кастомного внутреннего API только с методом POST и в формате JSON. Методы GET, PUT, PATCH, DELETE не поддерживаются.</p>

[![2.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/ftwxa6XXu4o6Fvpg-2.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/ftwxa6XXu4o6Fvpg-2.png)

<p class="callout info">Список всех конечных точек внутреннего API сортируется по следующим полям: наименование, алиас, id. Поэтому вы можете управлять сортировкой записей изменяя наименование или алиас. В будущем будет добавлена произвольная сортировка.</p>

#### Вызов внутреннего API

Узнать структуру запроса и проверить работу внутреннего API можно c помощью Swagger, доступного по адресу платформы. Если платформа устанавливается в контуре вашей сети, то адрес сервера нужно узнать у вашей ИТ службы.

[API публичного сервиса](https://app.metabot24.com/api/docs.) под управлением нашей команды можно посмотреть по ссылке.

<p class="callout info align-left"><span data-key="b1af53ee4a554b10a4e768bf3c26cc52">Чтобы получить доступ к Swagger к публичному серверу, нужно **[зарегистрировать аккаунт](https://app.metabot24.com/register)** на платформе по ссылке</span><span data-key="5b2399e9298141fb981d00067aed258a">, затем подтвердить электронную почту и авторизоваться на платформе.</span></p>

<p class="callout warning"><span data-key="5b2399e9298141fb981d00067aed258a">**Внимание!** При работе в Swagger платформы будут выполняться реальные API запросы, а не эмуляция API.</span></p>

[![3.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/MohapVGZvUKxJZKJ-3.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/MohapVGZvUKxJZKJ-3.png)

Также проверить работу внутреннего API можно c помощью Postman или любого другого софта для тестирования API.

![4.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/MK433vR9RKhjoGfL-4.png)

##### Параметры запроса

В URL запроса нужно указать идентификатор бота **botId** на платформе и **alias** внутреннего эндпоинта в боте.

В теле запроса размещаются данные запроса, например:

```JSON
{
  "lead_id": 135,
  "ticket_id": 7,
  "trigger_id": 1,
  "trigger_code": "trigger_short_code",
  "script_request_params": {
    "first_param": 7,
    "second_param": {
      "any_key": "any_value"
    }
  }
}
```

С параметрами тела запроса к внутреннему эндпоинту можно ознакомиться в таблице ниже.

<table border="1" id="bkmrk-%D0%9F%D0%BE%D0%BB%D0%B5-%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C-" style="border-collapse: collapse; width: 100%;"><tbody><tr style="background-color: #c2e0f4;"><td style="width: 20.7682%;">Поле</td><td style="width: 18.0451%;">Обязательность заполнения</td><td style="width: 61.1867%;">Описание</td></tr><tr><td style="width: 20.7682%;">lead\_id

</td><td style="width: 18.0451%;">-

</td><td style="width: 61.1867%;">В JS будет подготовлен и доступен полноценный объект lead, если у лида есть персона, то также будет доступен объект person.</td></tr><tr><td style="width: 20.7682%;">ticket\_id

</td><td style="width: 18.0451%;">-

</td><td style="width: 61.1867%;">В JS будет подготовлен и доступен полноценный объект ticket.</td></tr><tr><td style="width: 20.7682%;">trigger\_id или trigger\_code

</td><td style="width: 18.0451%;">-

</td><td style="width: 61.1867%;">В JS будут доступны переменные triggerId, triggerName.</td></tr><tr><td style="width: 20.7682%;">script\_request\_params

</td><td style="width: 18.0451%;">-

</td><td style="width: 61.1867%;">В JS будет подготовлены и доступны полноценные объекты request и last\_request.</td></tr></tbody></table>

##### Авторизация запросов API

Для авторизации запросов чат-бота используется **Authorization Bearer Token**.

При каждом вызове API добавьте в заголовок авторизации &lt;Access Token&gt;. Параметры заголовков для всех запросов:

```JavaScript
authorization: Bearer <Access Token>
Host: https://app.metabot24.com
```

##### Генерация токена доступа к API

Чтобы получить API токен, нужно создать API пользователя и сгенерировать токен в в Админ-панели Metabot, для этого:

1\. Cоздайте или привяжите нового пользователя в разделе **Пользователи бизнеса**.

[![16.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/ICbyiQWT4Yey5WSg-16.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/ICbyiQWT4Yey5WSg-16.png)

2\. При создании пользователя включаем опцию **Пользователь API** и указываем имя пользователя. Если необходимо указываем роль пользователя и доступ к какому боту нужно получить по API, или оставляем поля по умолчанию.

[![17.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/Fe1i6PYWwUIL6ouv-17.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/Fe1i6PYWwUIL6ouv-17.png)

3\. Нажмите на ссылку **Сгенерировать API-токен**.

[![18.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/8LR3ajAdETKk4YBg-18.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/8LR3ajAdETKk4YBg-18.png)

4\. Скопируйте полученный API-токен и используйте его в ваших запросах.

[![19.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/r4Omh2BFD1riJbtE-19.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/r4Omh2BFD1riJbtE-19.png)

5\. Можете использовать скопированный API-токен для API на странице Swagger (на странице /api/docs). Токен указывается на форме авторизации, которая открывается нажатием на кнопку **Authorize**.

[![20.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/SR6chGXDBrgDTJfx-20.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/SR6chGXDBrgDTJfx-20.png)

<p class="callout info">Если вдруг не найдете опцию создания API токена в вашем аккаунте, запросите токен в поддержке.</p>

### Внешнее API

[![5.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/iTmbNhJvBOIImY87-5.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/iTmbNhJvBOIImY87-5.png)

При создании новой конечной точки открывается окно создания со следующими параметрами:

[![6.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/WUSUpqPVTdfeTzS4-6.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/WUSUpqPVTdfeTzS4-6.png)

[![7.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/gT3v2Uc0wp2st5Wu-7.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/gT3v2Uc0wp2st5Wu-7.png)

#### Вызов внешнего API из чат-бота

Метод для вызова внешнего API из JavaScript:

```JavaScript
api.callEndpoint(
  string $externalApiEndpointCode, 
  string|null $uri = null,
  string|null $method = null, 
  string|null $format = null, 
  array|object|string|null $body = null, 
  array|object|string|null $headers = [],
  array|object|string|null $requestOptions = [], 
  array|object|string|null $httpClientConfig = [], 
  string|null $proxyUrl = null
): array|string|null
```

##### Пример №1 вызова внешнего API из JavaScript

```JavaScript
response = api.callEndpoint("endpoint_1");
```

Параметры переданные в аргументах функции callEndpoint обладают наивысшим приоритетом, т.е. при подготовке параметров они идут перед теми, которые заданы другим способом, например, в настройках конечной точки или с помощью api сеттеров setHeaders / setRequestOptions / и т.д., или системными атрибутами бота.

При этом, все параметры суммируются в порядке приоритетов, за исключением тела запроса $body. Если аргумент $body указан в функции, то JS код из настроек конечной точки не учитывается, и в API в качестве тела запроса будет передано то, что указано в аргументе $body функции callEndpoint.

Таким образом, $body можно вычислить заранее (или хранить где-то в атрибутах или таблице) и передавать в аргументе функции или вычислять его в скрипте который вызывает api.callEndpoint, а не вычислять во вложенном JS самого эндпоинта. Если перекрываем $body — то JS из эндпоита вызываться не будет для вычисления тела запроса, т.к. тело перекрыто аргументом обладающим наивысшим приоритетом.

##### Пример №2 вызова внешнего API из JavaScript с перекрытием $body и других параметров

```
api.setHeaders({"Token": "my token"});
response = api.callEndpoint("endpoint_2", null, 'POST', 'TEXT', "MY BODY TEXT");
```

URL конечной точки заданный в настройках внешнего API (в интерфейсе) будет задействован, только если не указан $uri в аргументах функции (для второго по счету аргумента функции callEndpoint задан параметр null). Таким образом пустая строка в аргументе для URL перекрывает параметры указанные в настройках точки.

#### Структура конечной точки внешнего API

Описание полей внешнего эндпоинта представлена в таблице ниже.

<table border="1" id="bkmrk-%D0%9F%D0%BE%D0%BB%D0%B5-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D0%A4%D0%BB%D0%B0%D0%B3-%D0%B0" style="border-collapse: collapse; width: 100%; height: 1238.42px;"><tbody><tr style="height: 29.7917px; background-color: #c2e0f4;"><td style="width: 21.8804%; height: 29.7917px;">Поле</td><td style="width: 78.1196%; height: 29.7917px;">Описание</td></tr><tr style="height: 46.5833px;"><td style="width: 21.8804%; height: 46.5833px;">Флаг активности</td><td style="width: 78.1196%; height: 46.5833px;">Если убрать флаг, то вызов данного Endpoint не будет выполняться и метод api.callEndpoint(...) вернет null.</td></tr><tr style="height: 169.771px;"><td style="width: 21.8804%; height: 169.771px;">Код</td><td style="width: 78.1196%; height: 169.771px;">Дополнительный уникальный идентификатор. Используется для указания объекта, например, в JavaScript функциях. В этом случае Код, используется как первый аргумент ($externalApiEndpointCode) метода api.callEndpoint(...).

Для каждого бота создается свое пространство имен для внешнего API, это значит что Код должен быть уникален в пределах бота.

</td></tr><tr style="height: 46.5833px;"><td style="width: 21.8804%; height: 46.5833px;">URL конечной точки (Endpoint URL)</td><td style="width: 78.1196%; height: 46.5833px;">Допустимо использование макропеременных.</td></tr><tr style="height: 700.875px;"><td style="width: 21.8804%; height: 700.875px;">JavaScript для вычисления API запроса (Request Body)</td><td style="width: 78.1196%; height: 700.875px;">JavaScript для вычисления содержимого API запроса. Данный скрипт будет выполнен перед обращением к внешнему API, результат выполнения скрипта будет являться телом запроса к внешнему API.

Это значит, что тело API запроса вычисляется на основе JavaScript. В JavaScript должен присутствовать ключевой оператор return для возврата значения из JS. Выражение которое указывается после return является телом API запроса (Request Body).

Можно возвращать:

- Строку (будет сконвертирована в json, если формат валидный);
- Массив;
- Объект (в том числе JSON-объект);
- Любое другое выражение (если в конечной точке указан формат TEXT), для результата вычисления которого возможна автоматическая конвертация в строку (например число или булево).

Пример (если формат запроса JSON):

```JavaScript
return {
  "key": "value",
  "lead_name": lead.getData('name'),
  "request_param_name": request.json.name
};
```

Другой пример (если формат запроса TEXT):

```
let a = false;
return a;
```

В JS можно выполнять любой код, например обращаться к пользователям, или устанавливать переменные в memory, планировать задания бота (триггеры, рассылки, скрипты), а также вызывать внешнее API c помощью api.callEndpoint или другие методов объекта api: post/get/postJson/getJson/request.

</td></tr><tr style="height: 49.25px;"><td style="width: 21.8804%; height: 49.25px;">Метод(тип) HTTP запроса</td><td style="width: 78.1196%; height: 49.25px;">POST / GET / PATCH / и т.д.

</td></tr><tr style="height: 35.3958px;"><td style="width: 21.8804%; height: 35.3958px;">Формат HTTP запроса</td><td style="width: 78.1196%; height: 35.3958px;">JSON / TEXT

</td></tr><tr style="height: 160.167px;"><td style="width: 21.8804%; height: 160.167px;">Заголовки HTTP запроса (HTTP Headers)</td><td style="width: 78.1196%; height: 160.167px;">Заголовки, которые будут переданы в HTTP запросе. В данном поле указывается JSON объект или массив. Допустимо использование макропеременных.

Также, можно воспользоваться JS методом api.setHeaders(...) или передать заголовки HTTP запроса прямо в аргументах функции api.callEndpoint(...). Также доступна установка заголовков HTTP запроса с помощью атрибута бота **sys\_api\_headers**.

##### Пример 1 для HTTP Headers[![8.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/jwcxMvQOrm5th6xo-8.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/jwcxMvQOrm5th6xo-8.png)

В JavaScript устанавливаем memory атрибут:

```JavaScript
memory.setJsonAttr("my_headers", {"token": "my_token"});
```

Далее используем этот атрибут в поле Headers с помощью макроподстановки:

```JavaScript
{{ &$$my_headers }}
```

Обратите внимание, в данном примере выполняется полное заполнение JSON с помощью макроподстановки.

##### Пример 2 для HTTP Headers

[![11.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/ALPD46LO07CSkQ5A-11.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/ALPD46LO07CSkQ5A-11.png)

JavaScript:

```JavaScript
memory.setAttr('someValue', 'my value');
```

Headers:

```JSON
{
     "some_param": "{{ &$someValue }}",
     "other_param": 11
}
```

Обратите внимание, в данном примере выполняется частичная замена JSON с помощью макроподстановки.

##### Пример 3 для HTTP Headers

[![12.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/ySw5mkyQ1bXW9Uaw-12.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/ySw5mkyQ1bXW9Uaw-12.png)

JavaScript:

```JavaScript
memory.setAttr('anyJsonString', ', "param_3": "my new param"');
```

Headers:

```JSON
{
    "some_param": "lead.getAttr('any_lead_param')",
    "other_param": 11
    {{ &$anyJsonString }}
}
```

Обратите внимание, в данном примере выполняется частичная замена JSON с помощью макроподстановки c атрибутом лида, а также подход похожий на конкатенацию строк, где к JSON клеится строка записанная в атрибут anyJsonString.

</td></tr><tr><td style="width: 21.8804%;">Параметры HTTP запроса (HTTP Request Options)</td><td style="width: 78.1196%;">Параметры HTTP запроса. В данном поле указывается JSON объект или массив.

Допустимо использование макропеременных.

Также, можно воспользоваться v8 методом api.setRequestOptions(...) или передать параметры HTTP запроса в аргументах функции api.callEndpoint(...)

Также доступна установка параметров HTTP запроса помощью переменной бота **sys\_api\_request\_options**.

##### Пример 1 для HTTP Request Options

[![13.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/ntkjaJQBDijTLreV-13.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/ntkjaJQBDijTLreV-13.png)

JavaScript:

```JavaScript
memory.setAttr('leadName', lead.getData('name'));
memory.setAttr('addQueryParams', ', "lead_id":' + lead.getData('id'));
```

HTTP Request Options:

```JSON
{
  "query": {
    "lead_name": "{{ &$leadName }}",
    "new_param": 11
    {{ &$addQueryParams }}
  }
}
```

Пример 2 для HTTP Request Options

[![14.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/GDc5baqwamhQAlWF-14.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/GDc5baqwamhQAlWF-14.png)

 JavaScript:

```JavaScript
memory.setJsonAttr('headers', {
  "token": "aasdsad#$%^&*()"
});

memory.setJsonAttr('request_options', {
  "query": {
    "lead_id": lead.getData('id'),
    "lead_name": lead.getData('name'),
    "new_param": 11,
  }
});
```

HTTP Request Options:

```
{{ &$$request_options }}
```

</td></tr><tr><td style="width: 21.8804%;">Конфиг HTTP клиента (HTTP Client Config)</td><td style="width: 78.1196%;">Параметры HTTP клиента.

В данном поле указывается JSON объект или массив.

Допустимо использование макропеременных.

Также, можно воспользоваться v8 методом api.setHttpConfig(...) или передать конфиг HTTP клиента в аргументах функции api.callEndpoint(...)

Также доступна установка конфига HTTP клиента с помощью переменной бота **sys\_api\_http\_client\_config**.

Пример 1 для HTTP Client Config

[![15.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/YjfZ3BQBsdBeid2M-15.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/YjfZ3BQBsdBeid2M-15.png)

</td></tr><tr><td style="width: 21.8804%;">Настройки прокси (Proxy URL)</td><td style="width: 78.1196%;">Используется для того, чтобы обращаться к определенному ресурсу с помощью прокси сервера.

Шаблон для указания прокси:

```
socks5://login:passwd@www.host.com:port
```

Также, можно воспользоваться v8 методом api.setProxyUrl(...) или передать Proxy URL для HTTP запроса в аргументах функции api.callEndpoint(...). Также доступна установка прокси с помощью переменной бота **sys\_api\_proxy\_url**.

</td></tr><tr><td style="width: 21.8804%;">Комментарий</td><td style="width: 78.1196%;">Любой текст. Доступно указание любых HTML-тэгов.

</td></tr></tbody></table>

[![9.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/FRwWoWWC32DRj5Gw-9.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/FRwWoWWC32DRj5Gw-9.png)

<p class="callout info">Список всех конечных точек внешнего API сортируется по следующим полям: наименование, алиас, id. Поэтому вы можете управлять сортировкой записей изменяя наименование или алиас. В будущем будет добавлена произвольная сортировка.</p>

#### Проверка работы внешнего API

Для тестирования внешнего API можно воспользоваться любым онлайн сервисом для отладки вебхуков (или развернуть аналогичный локально):

- [https://stackoverflow.com/questions/5725430/http-test-server-accepting-get-post-requests](https://stackoverflow.com/questions/5725430/http-test-server-accepting-get-post-requests)
- [https://webhook.site](https://webhook.site/)
- [https://pipedream.com/requestbin](https://pipedream.com/requestbin)
- [http://ptsv2.com](http://ptsv2.com/)

Пример:

[![10.png](https://docs.metabot24.ru/uploads/images/gallery/2022-11/scaled-1680-/JzPDqZ6saUf54EAH-10.png)](https://docs.metabot24.ru/uploads/images/gallery/2022-11/JzPDqZ6saUf54EAH-10.png)

<p class="callout info align-left">С API так же можно работать с помощью JS методов. Все методы и их описание вы можете посмотреть в **[Справочнике по функциям JS](https://docs.metabot24.ru/books/07-spravocnik-po-funkciyam-js/page/spravocnik-vsex-funkcii-Cgt#bkmrk-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-api:~:text=D1%2581%2Dapi-,%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%20%D1%81%20API,-%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20bot "Справочник всех функций")**</p>