Перейти к основному содержанию

REST API

Около 10 мин

REST API

Система предоставляет REST API для автоматизации основных задач - получения и изменения диаграмм, управления элементами архитектуры. API работает по протоколу HTTP с сериализацией JSON.

Ограничения облачной версии

В облачной версии действуют ограничения на использование API по скорости и размеру запросов.


Авторизация

Получение ключа API

Для получения ключа API выполните следующие шаги:

  1. Перейдите в раздел "Команда"
  2. Откройте вкладку "Настройки команды"
  3. Нажмите "Сгенерировать ключ"

Генерация API ключа

Использование ключа

ПараметрЗначениеОписание
ЗаголовокX-Api-KeyДобавляйте ко всем API запросам
ПраваАдминистратор командыДействия выполняются от имени администратора
БезопасностьКонфиденциальноНе передавайте ключ третьим лицам

Ограничения облачной версии

Лимиты по умолчанию

ПараметрЗначениеОписание
Скорость запросов5 запросов/минутуПроверяйте заголовок X-Rate-Limit-Remaining
Размер запроса10 МБМаксимальный размер одного запроса
Диаграмм за запрос20 штукДля методов загрузки диаграмм

Превышение лимитов

При достижении квоты:

{
    "timestamp": "2022-06-28T12:03:03.438+00:00",
    "status": 429,
    "error": "Too Many Requests",
    "message": "You have exhausted your API Request Quota",
    "path": "/public-api/v1/upload-diagrams"
}

Заголовки ответа:

  • X-Rate-Limit-Remaining - оставшиеся запросы
  • X-Rate-Limit-Retry-After-Seconds - время ожидания до следующей попытки

Блокировка аккаунта

При превышении лимита более 3 раз за 24 часа учетная запись будет заблокирована. Обратитесь в поддержку для разблокировки.


Загрузка диаграмм

Основной метод

Путь: POST /public-api/v1/upload-diagrams

Структура запроса

[
    {
        "id": "Meeting Scheduling:1:1123",
        "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>...",
        "name": "Meetings",
        "source": "CamundaMeetingsBackend"
    }
]

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

ПолеТипОбязательноеОписание
idstringВнешний идентификатор процесса
xmlstringXML тело диаграммы (экранированное)
namestringИмя процесса (важно для обновлений)
sourcestringИсточник версии для истории

Структура ответа

{
    "errors": {
        "emptyName": [],
        "emptyDefinition": [],
        "notXml": []
    },
    "createdDiagrams": [],
    "updatedDiagrams": [
        {
            "stormDiagramId": "94d2e63f-f84a-40d4-b4a3-592b0cc7c7d9",
            "sourceDiagramId": "rhsrthsrth"
        }
    ]
}

Важные особенности

  • Максимум 20 диаграмм в одном запросе
  • Поле name критично - не изменяйте в Storm для обновлений
  • Версионность - диаграммы с одинаковым ID обновляются по порядку
  • История версий - можно загружать разные версии в одном запросе

Пример shell-скрипта для Camunda

Автоматизация для Camunda

Используйте этот скрипт для автоматического обновления диаграмм после деплоя:

#!/bin/bash
# Сбор BPMN файлов и отправка в StormBPMN
files=($(ls ./src/main/resources/bpmn/*.bpmn))
size=${#files[@]}
echo '[' > temp.json
counter=1

echo "Начинаем обработку файлов..."
for file in ${files[*]}; do
  id="$(grep -Po '(?<=<bpmn:process\sid=")[^"]+' $file)"
  content="$(cat $file | sed 's/"/\\"/g;')"
  name="$(basename $file .bpmn)"
  echo '{"id":"'$id'","xml":"'$content'", "name": "'$name'", "source": "app"}' >> temp.json

  # Запятые между объектами (не в конце списка)
  if ((counter % 20)) && ((size != counter)) ; then
    echo ',' >> temp.json
  fi

  # Отправка пакета по 20 диаграмм
  if ! ((counter % 20)); then
    echo ']' >> temp.json
    curl -X POST -H "X-Api-Key: API-KEY" -H "Content-Type: application/json" \
         -d @temp.json stormbpmn.com/public-api/v1/upload-diagrams -i
    rm temp.json
    echo '[' > temp.json
  fi

  ((counter=counter+1))

  # Соблюдение лимита скорости
  if ((counter > 100)); then
    sleep 60
  fi
done

# Отправка оставшихся диаграмм
echo ']' >> temp.json
curl -X POST -H "X-Api-Key: API_KEY" -H "Content-Type: application/json" \
     -d @temp.json stormbpmn.com/public-api/v1/upload-diagrams -i
rm temp.json

Управление элементами архитектуры

Загрузка и обновление

Путь: POST /public-api/v1/assets

Структура запроса

[
    {
        "id": null,
        "externalId": null,
        "name": "B2C USER",
        "description": "",
        "externalUrl": null,
        "type": "CLIENT",
        "status": "NEW"
    }
]

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

ПолеТипОбязательноеОписание
idnumber📎ID элемента в системе
externalIdstring📎ID элемента во внешней системе
namestringНазвание элемента
descriptionstring📄HTML описание (unescaped)
externalUrlstring📄Ссылка с плейсхолдерами
typeenum📄Тип элемента архитектуры
statusenum📄Статус элемента

Типы элементов архитектуры

ЗначениеОписание
UNSPECIFIEDНе определено (по умолчанию)
DOCUMENTДокумент
SYSTEMСистема
COMMUNICATIONКоммуникация
CLIENTКлиент
ENTITYСущность
ACTIONДействие
OTHERПрочее

Статусы элементов

ЗначениеОписание
NEWНовый
TRIALТестирование
PRODUCTIONПродакшн
DECOMMISSIONINGВывод из эксплуатации
ARCHIVEАрхив

Логика обновления

УсловиеДействие
Только externalIdОбновление по внешнему ID
Только idОбновление по внутреннему ID
И id, и externalIdОбновление по внутреннему ID
Ни id, ни externalIdСоздание нового элемента

Получение списка диаграмм

Основной метод

Путь: GET /public-api/v1/get-diagram-list

Query-параметры

ПараметрТипОбязательныйОписание
pagenumberНомер страницы (с 0)

Структура ответа

{
    "totalElements": 223,
    "page": 0,
    "size": 20,
    "returnDiagrams": [
        {
            "id": "6b547a8f-a78f-4375-b39e-59c4afd9388e",
            "name": "Draft",
            "status": "NEW",
            "versionNumber": 3,
            "updatedBy": "kotov@bpmn2.ru",
            "teamName": "Мои кредиты",
            "type": "BCM",
            "public": true,
            "createdOn": "2024-05-02T17:19:41.459888",
            "updatedOn": "2024-05-02T17:28:07.695362"
        }
    ]
}

Права доступа

Список диаграмм зависит от прав администратора команды на диаграммы.


Получение диаграммы по ID

Основной метод

Путь: GET /public-api/v1/get-diagram-by-id

Query-параметры

ПараметрТипОбязательныйОписание
diagramIdUUIDУникальный идентификатор диаграммы

Ключевые поля ответа

ПолеТипОписание
idUUIDИдентификатор диаграммы
namestringНазвание диаграммы
bodystringXML содержимое диаграммы
versionNumbernumberНомер версии
statusstringСтатус диаграммы
typestringТип диаграммы

Изменения контракта

Контракт API может измениться. Используйте tolerant reader для получения нужных полей (обычно это поле body).


Обновление описания элемента

Основной метод

Путь: POST /public-api/v1/element-description/{diagramId}/{elementId}

Параметры пути

ПараметрТипОписание
diagramIdUUIDИдентификатор диаграммы
elementIdstringИдентификатор элемента

Структура запроса

{
    "description": "Подробное описание элемента",
    "duration": 3600,
    "externalLink": "https://wiki.company.com/process"
}

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

ПолеТипОписание
descriptionstringHTML описание (экранированное)
durationnumberДлительность в секундах
externalLinkstringВнешняя ссылка

Получение согласований

Основной метод

Путь: GET /public-api/v1/approvals

Query-параметры

ПараметрТипОбязательныйОписание
userEmailstringEmail участника команды
statusenum📄Статус согласования
isApproverboolean📄Признак согласующего

Статусы согласований

ЗначениеОписание
PENDINGОжидает согласования
ACCEPTEDПринято
DECLINEDОтклонено
COMPLETEDЗавершено

Структура ответа

{
    "content": [
        {
            "id": "867bc39c-9145-4eb5-b59f-00545a6a9a3f",
            "approverEmail": "user@company.com",
            "diagramId": "fbeb4c64-e172-4e09-9fa1-6e509a11ffde",
            "diagramName": "Работа с подрядчиком",
            "status": "PENDING",
            "createdOn": "2025-01-23T17:44:27.323817",
            "diagramVersion": "11"
        }
    ],
    "totalElements": 1,
    "totalPages": 1,
    "size": 20,
    "number": 0
}

Работа с организационной структурой

Организационная структура состоит из нескольких ключевых сущностей:

Основные сущности

OrgItem - элемент организационной структуры. Бывает двух типов:

  • Должность - например "Генеральный директор"
  • Группа - например "Служба финансового контроля"

Связь с Ролями

Роли - это внутренняя абстракция Stormbpmn. OrgItem могут быть назначены на роли. В этом случае удалить их из API не получится, надо выполнить перепривязку через UI.

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

  • Например: "Служба финансового контроля" подчиняется "Генеральному директору"
  • У каждого OrgItem может быть только одна родительская связь (двойное подчинение недопустимо)

Person - сотрудник организации

OrgItemPersonEdge - назначение сотрудника на элемент организационной структуры

  • Например: "Котов Д.Г." назначен на должность "Генеральный директор"
  • Person может быть назначен на несколько OrgItem
  • Person может быть назначен ТОЛЬКО на OrgItem с типом "Должность"

Важно

Работа с сущностями разделена на отдельные методы. Целостность с точки зрения бизнес-логики поддерживает вызывающая система. Целостность с точки зрения валидации и связей между существующими сущностями обеспечивает система.


Атрибутивный состав сущностей

OrgItem

АтрибутТипОписание
idUUIDВнутренний идентификатор
externalIdstringИдентификатор во внешней системе (уникальный)
typeENUMPOSITION (должность) или OU (группа)
namestringНазвание
descriptionstringОписание в HTML формате
colorstringЦвет в HEX формате

OrgItemEdge

АтрибутТипОписание
idUUIDВнутренний идентификатор
sourceIdUUIDИдентификатор родительского элемента
targetIdUUIDИдентификатор дочернего элемента
externalSourceIdstringВнешний идентификатор родителя
externalTargetIdstringВнешний идентификатор дочернего элемента

Person

АтрибутТипОписание
idUUIDВнутренний идентификатор
externalIdstringИдентификатор во внешней системе (уникальный)
emailstringЭлектронная почта
phonestringТелефон
firstNamestringИмя
lastNamestringФамилия
patronymicstringОтчество
photoUrlstringСсылка на фотографию (через API загрузки файлов)

OrgItemPersonEdge

АтрибутТипОписание
idUUIDВнутренний идентификатор
sourceIdUUIDИдентификатор OrgItem
personIdUUIDИдентификатор Person
externalSourceIdstringВнешний идентификатор OrgItem
externalPersonIdstringВнешний идентификатор Person

Методы API

Создание OrgItem

Путь: POST /public-api/v1/org-items

Структура запроса:

[
    {
        "externalId": "CEO_POSITION_001",
        "type": "POSITION",
        "name": "Генеральный директор",
        "description": "<p>Руководитель организации</p>",
        "color": "#FF6B6B"
    }
]

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

ПолеТипОбязательноеОписание
externalIdstringУникальный идентификатор во внешней системе
typeenumPOSITION (должность) или OU (группа)
namestringНазвание элемента
descriptionstring📄Описание в HTML формате
colorstring📄Цвет в HEX формате

Структура ответа:

{
    "created": [
        {
            "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "externalId": "CEO_POSITION_001",
            "type": "POSITION",
            "name": "Генеральный директор",
            "description": "<p>Руководитель организации</p>",
            "color": "#FF6B6B"
        }
    ],
    "errors": []
}

Чтение OrgItem

Путь: GET /public-api/v1/org-items

Query-параметры:

ПараметрТипОбязательныйОписание
pagenumber📄Номер страницы (по умолчанию 0)
sizenumber📄Размер страницы (по умолчанию 20)

Получение по ID:

Путь: GET /public-api/v1/org-items/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Получение по внешнему ID:

Путь: GET /public-api/v1/org-items/by-external-id/{externalId}

Параметры пути:

ПараметрТипОписание
externalIdstringВнешний идентификатор элемента

Структура ответа:

{
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "externalId": "CEO_POSITION_001",
    "type": "POSITION",
    "name": "Генеральный директор",
    "description": "<p>Руководитель организации</p>",
    "color": "#FF6B6B",
    "parentItems": {},
    "childItems": [
        {
            "id": "b2c3d4e5-f6g7-8901-bcde-f23456789012",
            "externalId": "b2c3d4e5-f6g7-8901-bcde-f23456789012",
            "name": "Заместитель генерального директора"
        }
    ],
    "assignedPersons": [
        {
            "externalId": "CEO_POSITION_001",
            "id": "c3d4e5f6-g7h8-9012-cdef-345678901234",
            "firstName": "Дмитрий",
            "lastName": "Котов",
            "email": "kotov@company.com"
        }
    ]
}

Обновление OrgItem

Путь: PUT /public-api/v1/org-items/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Обновление по внешнему ID:

Путь: PUT /public-api/v1/org-items/by-external-id/{externalId}

Структура запроса:

{
    "name": "Генеральный директор (обновлено)",
    "description": "<p>Главное лицо организации</p>",
    "color": "#4ECDC4"
}

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

ПолеТипОбязательноеОписание
namestring📄Новое название
descriptionstring📄Новое описание в HTML
colorstring📄Новый цвет в HEX

Важно

Тип элемента (type) изменить нельзя после создания. Для смены типа необходимо удалить и создать новый элемент.

Удаление OrgItem

Путь: DELETE /public-api/v1/org-items/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Удаление по внешнему ID:

Путь: DELETE /public-api/v1/org-items/by-external-id/{externalId}

Структура ответа:

{
    "deleted": true,
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "message": "OrgItem успешно удален"
}

Условия удаления:

  • ✅ Элемент без связей можно удалить сразу
  • ⚠️ Элемент с дочерними связями удаляется только после удаления всех связей
  • ⚠️ Элемент с назначенными сотрудниками удаляется только после отзыва всех назначений

Каскадное удаление

Каскадное удаление не поддерживается.

Создание Person

Путь: POST /public-api/v1/persons

Структура запроса:

[
    {
        "externalId": "KOTOV_DG_001",
        "email": "kotov@company.com",
        "phone": "+7 (495) 123-45-67",
        "firstName": "Дмитрий",
        "lastName": "Котов",
        "patronymic": "Георгиевич",
        "photoUrl": "/userFiles/1.png"
    }
]

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

ПолеТипОбязательноеОписание
externalIdstring📄Уникальный идентификатор во внешней системе
emailstring📄Электронная почта сотрудника
phonestring📄Телефон сотрудника
firstNamestringИмя сотрудника
lastNamestring📄Фамилия сотрудника
patronymicstring📄Отчество сотрудника
photoUrlstring📄Ссылка на фотографию (через API загрузки файлов)

Структура ответа:

{
    "created": [
        {
            "id": "c3d4e5f6-g7h8-9012-cdef-345678901234",
            "externalId": "KOTOV_DG_001",
            "email": "kotov@company.com",
            "phone": "+7 (495) 123-45-67",
            "firstName": "Дмитрий",
            "lastName": "Котов",
            "patronymic": "Георгиевич",
            "photoUrl": "https://company.com/photos/kotov.jpg"
        }
    ],
    "errors": []
}

Чтение Person

Путь: GET /public-api/v1/persons

Query-параметры:

ПараметрТипОбязательныйОписание
pagenumber📄Номер страницы (по умолчанию 0)
sizenumber📄Размер страницы (по умолчанию 20)
emailstring📄Фильтр по электронной почте

Получение по ID:

Путь: GET /public-api/v1/persons/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Получение по внешнему ID:

Путь: GET /public-api/v1/persons/by-external-id/{externalId}

Параметры пути:

ПараметрТипОписание
externalIdstringВнешний идентификатор элемента

Структура ответа:

{
    "id": "c3d4e5f6-g7h8-9012-cdef-345678901234",
    "externalId": "KOTOV_DG_001",
    "email": "kotov@company.com",
    "phone": "+7 (495) 123-45-67",
    "firstName": "Дмитрий",
    "lastName": "Котов",
    "patronymic": "Георгиевич",
    "photoUrl": "https://company.com/photos/kotov.jpg",
    "assignedPositions": [
        {
            "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "externalId": "CEO_POSITION_001",
            "name": "Генеральный директор",
            "type": "POSITION"
        }
    ]
}

Обновление Person

Путь: PUT /public-api/v1/persons/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Обновление по внешнему ID:

Путь: PUT /public-api/v1/persons/by-external-id/{externalId}

Структура запроса:

{
    "email": "d.kotov@company.com",
    "phone": "+7 (495) 987-65-43",
    "firstName": "Дмитрий",
    "lastName": "Котов",
    "patronymic": "Георгиевич",
    "photoUrl": "/photos/kotov_new.jpg"
}

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

ПолеТипОбязательноеОписание
emailstring📄Новая электронная почта
phonestring📄Новый телефон
firstNamestring📄Новое имя
lastNamestring📄Новая фамилия
patronymicstring📄Новое отчество
photoUrlstring📄Новая ссылка на фотографию

Удаление Person

Путь: DELETE /public-api/v1/persons/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Удаление по внешнему ID:

Путь: DELETE /public-api/v1/persons/by-external-id/{externalId}

Структура ответа:

{
    "deleted": true,
    "id": "c3d4e5f6-g7h8-9012-cdef-345678901234",
    "message": "Person успешно удален"
}

Условия удаления:

  • ✅ Сотрудника без назначений можно удалить сразу
  • ⚠️ Сотрудника с активными назначениями удаляется только после отзыва всех назначений

Важно

При удалении сотрудника не происходит автоматического удаления связанных OrgItemPersonEdge. Необходимо сначала удалить все назначения.

Создание OrgItemEdge

Путь: POST /public-api/v1/org-item-edges

Структура запроса:

[
    {
        "sourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "targetId": "b2c3d4e5-f6g7-8901-bcde-f23456789012",
        "externalSourceId": "CEO_POSITION_001",
        "externalTargetId": "DEPUTY_CEO_001"
    }
]

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

ПолеТипОбязательноеОписание
sourceIdUUID📎Внутренний ID родительского элемента
targetIdUUID📎Внутренний ID дочернего элемента
externalSourceIdstring📎Внешний ID родительского элемента
externalTargetIdstring📎Внешний ID дочернего элемента

Логика создания

Можно использовать либо внутренние ID (sourceId, targetId), либо внешние ID (externalSourceId, externalTargetId). При указании и внутренних, и внешних ID приоритет отдается внутренним.

Структура ответа:

{
    "created": [
        {
            "id": "d4e5f6g7-h8i9-0123-defg-456789012345",
            "sourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "targetId": "b2c3d4e5-f6g7-8901-bcde-f23456789012",
            "externalSourceId": "CEO_POSITION_001",
            "externalTargetId": "DEPUTY_CEO_001",
            "sourceItem": {
                "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
                "name": "Генеральный директор"
            },
            "targetItem": {
                "id": "b2c3d4e5-f6g7-8901-bcde-f23456789012",
                "name": "Заместитель генерального директора"
            }
        }
    ],
    "errors": []
}

Чтение OrgItemEdge

Путь: GET /public-api/v1/org-item-edges

Query-параметры:

ПараметрТипОбязательныйОписание
pagenumber📄Номер страницы (по умолчанию 0)
sizenumber📄Размер страницы (по умолчанию 20)
sourceIdUUID📄Фильтр по родительскому элементу
targetIdUUID📄Фильтр по дочернему элементу
externalSourceIdstring📄Фильтр по внешнему ID родителя

Получение по ID:

Путь: GET /public-api/v1/org-item-edges/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Структура ответа:

{
    "id": "d4e5f6g7-h8i9-0123-defg-456789012345",
    "sourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "targetId": "b2c3d4e5-f6g7-8901-bcde-f23456789012",
    "externalSourceId": "CEO_POSITION_001",
    "externalTargetId": "DEPUTY_CEO_001",
    "sourceItem": {
        "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "externalId": "CEO_POSITION_001",
        "name": "Генеральный директор",
        "type": "POSITION"
    },
    "targetItem": {
        "id": "b2c3d4e5-f6g7-8901-bcde-f23456789012",
        "externalId": "DEPUTY_CEO_001",
        "name": "Заместитель генерального директора",
        "type": "POSITION"
    }
}

Обновление OrgItemEdge

Путь: PUT /public-api/v1/org-item-edges/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Структура запроса:

{
    "sourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "targetId": "c3d4e5f6-g7h8-9012-cdef-345678901234",
    "externalSourceId": "CEO_POSITION_001",
    "externalTargetId": "HR_MANAGER_001"
}

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

ПолеТипОбязательноеОписание
sourceIdUUID📎Новый ID родительского элемента
targetIdUUID📎Новый ID дочернего элемента
externalSourceIdstring📎Новый внешний ID родителя
externalTargetIdstring📎Новый внешний ID дочернего

Удаление OrgItemEdge

Путь: DELETE /public-api/v1/org-item-edges/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Удаление по связи:

Путь: DELETE /public-api/v1/org-item-edges/by-relation

Query-параметры:

ПараметрТипОбязательныйОписание
sourceIdUUID📎ID родительского элемента
targetIdUUID📎ID дочернего элемента
externalSourceIdstring📎Внешний ID родительского
externalTargetIdstring📎Внешний ID дочернего

Структура ответа:

{
    "deleted": true,
    "id": "d4e5f6g7-h8i9-0123-defg-456789012345",
    "message": "OrgItemEdge успешно удален"
}

Условия удаления:

  • ✅ Связь можно удалить в любой момент
  • ⚠️ При удалении связи дочерний элемент становится корневым (без родителя)

Важно

Удаление связи не удаляет сами элементы OrgItem. Удаляется только отношение подчиненности между ними.

Создание OrgItemPersonEdge

Путь: POST /public-api/v1/org-item-person-edges

Структура запроса:

[
    {
        "sourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "personId": "c3d4e5f6-g7h8-9012-cdef-345678901234",
        "externalSourceId": "CEO_POSITION_001",
        "externalPersonId": "KOTOV_DG_001"
    }
]

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

ПолеТипОбязательноеОписание
sourceIdUUID📎Внутренний ID элемента оргструктуры
personIdUUID📎Внутренний ID сотрудника
externalSourceIdstring📎Внешний ID элемента оргструктуры
externalPersonIdstring📎Внешний ID сотрудника

Логика создания

Можно использовать либо внутренние ID (sourceId, personId), либо внешние ID (externalSourceId, externalPersonId). При указании и внутренних, и внешних ID приоритет отдается внутренним.

Ограничения

Сотрудника можно назначить ТОЛЬКО на элемент с типом POSITION (должность). Назначение на группы (OU) не поддерживается.

Структура ответа:

{
    "created": [
        {
            "id": "e5f6g7h8-i9j0-1234-efgh-567890123456",
            "sourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "personId": "c3d4e5f6-g7h8-9012-cdef-345678901234",
            "externalSourceId": "CEO_POSITION_001",
            "externalPersonId": "KOTOV_DG_001",
            "orgItem": {
                "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
                "name": "Генеральный директор",
                "type": "POSITION"
            },
            "person": {
                "id": "c3d4e5f6-g7h8-9012-cdef-345678901234",
                "firstName": "Дмитрий",
                "lastName": "Котов",
                "email": "kotov@company.com"
            }
        }
    ],
    "errors": []
}

Чтение OrgItemPersonEdge

Путь: GET /public-api/v1/org-item-person-edges

Query-параметры:

ПараметрТипОбязательныйОписание
pagenumber📄Номер страницы (по умолчанию 0)
sizenumber📄Размер страницы (по умолчанию 20)
sourceIdUUID📄Фильтр по элементу оргструктуры
personIdUUID📄Фильтр по сотруднику
externalSourceIdstring📄Фильтр по внешнему ID должности
emailstring📄Фильтр по email сотрудника

Получение по ID:

Путь: GET /public-api/v1/org-item-person-edges/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Структура ответа:

{
    "id": "e5f6g7h8-i9j0-1234-efgh-567890123456",
    "sourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "personId": "c3d4e5f6-g7h8-9012-cdef-345678901234",
    "externalSourceId": "CEO_POSITION_001",
    "externalPersonId": "KOTOV_DG_001",
    "orgItem": {
        "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "externalId": "CEO_POSITION_001",
        "name": "Генеральный директор",
        "type": "POSITION",
        "description": "<p>Руководитель организации</p>",
        "color": "#FF6B6B"
    },
    "person": {
        "id": "c3d4e5f6-g7h8-9012-cdef-345678901234",
        "externalId": "KOTOV_DG_001",
        "firstName": "Дмитрий",
        "lastName": "Котов",
        "patronymic": "Георгиевич",
        "email": "kotov@company.com",
        "phone": "+7 (495) 123-45-67"
    }
}

Обновление OrgItemPersonEdge

Путь: PUT /public-api/v1/org-item-person-edges/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Структура запроса:

{
    "sourceId": "b2c3d4e5-f6g7-8901-bcde-f23456789012",
    "personId": "c3d4e5f6-g7h8-9012-cdef-345678901234",
    "externalSourceId": "DEPUTY_CEO_001",
    "externalPersonId": "KOTOV_DG_001"
}

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

ПолеТипОбязательноеОписание
sourceIdUUID📎Новый ID элемента оргструктуры
personIdUUID📎Новый ID сотрудника
externalSourceIdstring📎Новый внешний ID должности
externalPersonIdstring📎Новый внешний ID сотрудника

Удаление OrgItemPersonEdge

Путь: DELETE /public-api/v1/org-item-person-edges/{id}

Параметры пути:

ПараметрТипОписание
idUUIDВнутренний идентификатор

Удаление по назначению:

Путь: DELETE /public-api/v1/org-item-person-edges/by-assignment

Query-параметры:

ПараметрТипОбязательныйОписание
sourceIdUUID📎ID элемента оргструктуры
personIdUUID📎ID сотрудника
externalSourceIdstring📎Внешний ID должности
externalPersonIdstring📎Внешний ID сотрудника

Удаление всех назначений сотрудника:

Путь: DELETE /public-api/v1/org-item-person-edges/by-person

Query-параметры:

ПараметрТипОбязательныйОписание
personIdUUID📎ID сотрудника
externalPersonIdstring📎Внешний ID сотрудника

Структура ответа:

{
    "deleted": true,
    "id": "e5f6g7h8-i9j0-1234-efgh-567890123456",
    "message": "OrgItemPersonEdge успешно удален"
}

Условия удаления:

  • ✅ Назначение можно отозвать в любой момент
  • ✅ При удалении всех назначений сотрудника он становится неназначенным
  • ✅ При удалении назначения должность остается свободной

Важно

Удаление назначения не удаляет ни сотрудника, ни должность. Удаляется только связь между ними.


Рекомендуемые сценарии работы

Первичное создание организационной структуры

  1. Создать OrgItems (должности и группы)
  2. Создать OrgItemEdges (связи подчиненности)
  3. Создать Person (сотрудников)
  4. Создать OrgItemPersonEdge (назначения на должности)

Обновление атрибутов (без изменения связей)

  • OrgItem/Person: обновление через соответствующий метод с externalId

Обновление связей (OrgItemEdges, OrgItemPersonEdge)

  1. Убедиться, что необходимые sourceId, targetId, personId созданы и актуальны
  2. Обновить соответствующие связи

Удаление элементов структуры (OrgItem, Person)

  1. Удалить все связанные привязки
  2. Удалить OrgItem/Person

Удаление связей (OrgItemEdges, OrgItemPersonEdge)

  1. Удалить/изменить все зависимые привязки через sourceId, targetId, personId
  2. Удалить OrgItemEdges/OrgItemPersonEdge

Лучшие практики

Оптимизация запросов

РекомендацияОписание
Пакетная обработкаОтправляйте до 20 диаграмм за раз
Соблюдение лимитовМониторьте заголовки rate limit
Retry логикаРеализуйте повторные попытки с backoff
ЛогированиеСохраняйте ID запросов для отладки

Безопасность

АспектРекомендация
API ключиХраните в переменных окружения
HTTPSИспользуйте только защищенные соединения
Права доступаОграничивайте права API ключей
РотацияРегулярно обновляйте ключи

Мониторинг

  • Отслеживайте лимиты через заголовки ответов
  • Логируйте ошибки для анализа проблем
  • Мониторьте время ответа API
  • Анализируйте использование квот

Интеграция с CI/CD

Интегрируйте API в пайплайны развертывания для автоматического обновления диаграмм после изменений в коде.


Связанные разделы