enВойти в Senler

API SDK

Кратко

Для интеграций можно использовать fetch SDK @aisenler/sdk-fetch. Пакет генерируется из публичной OpenAPI-спецификации и дает клиент AiSenlerClient с группами API как свойствами объекта.

Установка

Устанавливайте фиксированную версию, чтобы сборки были воспроизводимыми:

npm install github:SenlerBot/Senler-io-sdk#v0.1.6

Для последнего коммита из main можно использовать:

npm install github:SenlerBot/Senler-io-sdk

SDK требует Node.js 18+ или другое окружение с глобальным fetch.

Базовый вызов

import { AiSenlerClient } from "@aisenler/sdk-fetch";

const client = new AiSenlerClient({
  accessToken: "access_token",
});

const project = await client.projects.getMe();

Методы принимают параметры одним объектом в camelCase. Например:

const agents = await client.agents.list({
  projectId: "project_id",
  xSessionId: "session_id",
  limit: 20,
});

В версии 0.1.6 группы для работы с сегментами называются client.segments и client.segmentsPublic. Прежние названия client.leadGroups и client.leadGroupsPublic больше не используются. В правилах назначения агента поле также называется segmentId в параметрах SDK и segment_id в JSON API.

const segments = await client.segments.getSegments({ projectId });

Оператор проекта

Если сотрудник пишет через внешний аккаунт, чат или канал, который система видит как обычного отправителя, интеграция может отметить соответствующего лида или пространство как «Оператор проекта»:

PATCH /api/leads/{leadId}/project-operator
Content-Type: application/json

{"is_project_operator": true}
PATCH /api/spaces/{spaceId}/project-operator
Content-Type: application/json

{"is_project_operator": true}

Для лида нужны права на управление лидами, для пространства - права на управление пространствами. Значение false снимает отметку. Она не выдаёт доступ к проекту: её единственная задача - сообщить автоматизации, что новые сообщения и нажатия кнопок этого отправителя относятся к стороне проекта и не должны запускать агента.

При создании или обновлении агента параметр cancel_pending_response_on_project_operator_message управляет уже начатым ответом. По умолчанию он равен true: если оператор проекта ответил первым, ожидающий AI-ответ отменяется. При значении false ответ может прийти после сообщения оператора. Для изменения опубликованного агента обновите его черновик и опубликуйте новую версию.

Пользовательский сценарий, выбор нужной сущности и безопасная проверка разобраны в статье Оператор проекта и ответы агента.

Актуальная сборка мобильного приложения

Публичный запрос без токена возвращает текущую сборку iPhone, доступную внешним тестировщикам в TestFlight:

GET /api/mobile-app-releases/ios

Пример ответа с доступной сборкой:

{
  "platform": "ios",
  "version_name": "1.8",
  "build_number": "9",
  "source_uploaded_at": "2026-07-15T12:00:00.000Z",
  "expires_at": "2026-10-13T12:00:00.000Z",
  "synced_at": "2026-07-16T00:00:00.000Z"
}

В ответе есть платформа, версия, номер сборки, дата загрузки, дата окончания доступности и время последнего обновления данных. Пока актуальная сборка недоступна, поля версии и дат могут быть null; это нормальный ответ, а не причина подставлять устаревшее значение вручную. Запрос возвращает сведения о сборке, но не ссылку установки: пользователь открывает TestFlight из окна загрузки мобильного приложения в кабинете.

OAuth token refresh

Если интеграция использует OAuth и хранит refresh token, передайте refreshToken, clientId и обработчик сохранения новых токенов:

const client = new AiSenlerClient({
  accessToken: "access_token",
  refreshToken: "refresh_token",
  clientId: "client_id",
  onTokenRefreshed: (newAccess, newRefresh) => {
    saveTokens(newAccess, newRefresh);
  },
});

Автообновление включается только когда переданы и refreshToken, и clientId.

График техподдержки

В версии 0.1.6 в клиенте есть группа client.supportSchedules. Через нее разработчик может работать с API графика техподдержки: читать график, менять настройки, создавать и обновлять смены и назначения операторов.

Доступные методы:

  • getSupportSchedule - получить настройки, смены, назначения и операторов;
  • updateSupportScheduleSettings - включить или выключить учет графика;
  • supportScheduleShifts, updateSupportScheduleShifts, deleteSupportScheduleShifts - создать, изменить или удалить смену;
  • supportScheduleAssignments, updateSupportScheduleAssignments, deleteSupportScheduleAssignments - создать, изменить или удалить назначение.
await client.supportSchedules.updateSupportScheduleSettings({
  projectId,
  updateSupportScheduleSettingsDto: {
    enabled: true,
    timezone: "Europe/Moscow",
  },
});

await client.supportSchedules.supportScheduleAssignments({
  projectId,
  createSupportScheduleAssignmentDto: {
    projectMemberId,
    startsAt: new Date("2026-07-13T09:00:00+03:00"),
    endsAt: new Date("2026-07-13T18:00:00+03:00"),
  },
});

Поле enabled обязательно при обновлении настроек. Необязательное поле timezone принимает название часового пояса IANA, например Europe/Moscow; в нём график создаётся и показывается в кабинете. У смены задаются название, начало и конец в минутах от начала дня и признак окончания на следующий день; отдельного цвета у смены нет. Для выборки по периоду передавайте from и to вместе. В назначении начало и конец должны содержать смещение часового пояса, а участник должен быть активным оператором техподдержки.

Для операций управления нужны права на управление графиком. Если назначение пересекается с уже существующим интервалом этого же оператора, API вернет понятную ошибку: у оператора уже есть назначение, которое пересекается с выбранным интервалом. В таком случае выберите другой интервал, другого оператора или измените существующее назначение. Отключить признак оператора или удалить участника с текущими либо будущими назначениями нельзя, пока эти назначения не удалены или не перенесены.

Ошибки

Неуспешные HTTP-ответы выбрасывают ResponseError с исходным response.

import { ResponseError } from "@aisenler/sdk-fetch";

try {
  await client.projects.getMe();
} catch (error) {
  if (error instanceof ResponseError) {
    console.log(error.response.status);
  }
}

Для диагностики проверьте статус ответа, тело ошибки, права API-ключа или OAuth-токена, выбранный проект и наличие нужного projectId.