#Поиск узлов
POST /v1/humanresources/nodes/search
Возвращает узлы организационной структуры по фильтру с сортировкой, выбором полей и ограничением выдачи. Тип узлов задаётся внутри filter и обязателен: DEPARTMENT или TEAM.
В отличие от списка узлов, поиск принимает в теле запроса сортировку order, проекцию полей select и ограничение limit. Список перечисляет узлы простой выборкой по type через параметры строки запроса, поиск задаёт условия отбора телом запроса.
#Поля запроса (body)
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
filter |
object | да | Условия отбора. Поле filter.type обязательно: DEPARTMENT или TEAM |
filter.type |
string | да | Тип узлов в выдаче: DEPARTMENT (отдел) или TEAM (команда) |
order |
object | нет | Сортировка по полям узла, например { "id": "desc" }. Направления: asc, desc |
limit |
number | нет | Максимальное число узлов в ответе |
select |
array | нет | Список возвращаемых полей, например ["id", "name"]. Без параметра возвращаются все поля узла |
#Примеры
#curl — личный ключ
curl -X POST "https://vibecode.bitrix24.tech/v1/humanresources/nodes/search" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"filter": { "type": "DEPARTMENT" },
"order": { "id": "desc" },
"limit": 50
}'
#curl — OAuth-приложение
curl -X POST "https://vibecode.bitrix24.tech/v1/humanresources/nodes/search" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"filter": { "type": "DEPARTMENT" },
"order": { "id": "desc" },
"limit": 50
}'
#JavaScript — личный ключ
const res = await fetch('https://vibecode.bitrix24.tech/v1/humanresources/nodes/search', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
filter: { type: 'DEPARTMENT' },
order: { id: 'desc' },
limit: 50,
}),
})
const { success, data, meta } = await res.json()
console.log(`Найдено ${meta.total} отделов`)
#JavaScript — OAuth-приложение
const res = await fetch('https://vibecode.bitrix24.tech/v1/humanresources/nodes/search', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
filter: { type: 'DEPARTMENT' },
order: { id: 'desc' },
limit: 50,
}),
})
const { success, data, meta } = await res.json()
#Поля ответа
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | Всегда true при успехе |
data |
array | Массив найденных узлов |
data[].id |
number | Идентификатор узла |
data[].name |
string | Название узла |
data[].type |
string | Тип узла: DEPARTMENT или TEAM |
data[].structureId |
number | Идентификатор структуры, к которой относится узел |
data[].parentId |
number | Идентификатор родительского узла. У корневого узла равен 0 |
data[].description |
string | null | Описание узла. null, если описание не задано |
data[].accessCode |
string | Код доступа узла (например, D185 для отдела, SN23 для команды) |
data[].userCount |
number | Число сотрудников в узле |
data[].colorName |
string | null | Название цвета узла. null, если цвет не задан |
data[].xmlId |
string | null | Внешний идентификатор узла. null, если не задан |
data[].createdAt |
string | null | Дата создания (ISO 8601). null для узлов, созданных без отметки времени |
data[].updatedAt |
string | null | Дата последнего изменения (ISO 8601). null, если изменений не было |
meta.total |
number | Общее количество узлов, соответствующих фильтру |
meta.hasMore |
boolean | Есть ли ещё записи за пределами limit |
meta.durationMs |
number | Длительность обработки запроса в миллисекундах |
При наличии select в ответе остаются только перечисленные поля узла.
#Пример ответа
{
"success": true,
"data": [
{
"id": 17,
"name": "Головной офис",
"type": "DEPARTMENT",
"structureId": 1,
"parentId": 0,
"description": null,
"accessCode": "D185",
"userCount": 0,
"colorName": null,
"xmlId": null,
"createdAt": null,
"updatedAt": null
},
{
"id": 23,
"name": "Отдел продаж",
"type": "DEPARTMENT",
"structureId": 1,
"parentId": 17,
"description": "Прямые продажи",
"accessCode": "SN23",
"userCount": 2,
"colorName": null,
"xmlId": null,
"createdAt": null,
"updatedAt": null
}
],
"meta": {
"total": 2,
"hasMore": false,
"durationMs": 1609
}
}
#Пример ответа при ошибке
400 — поле type передано вне filter или отсутствует:
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "Ошибка при валидации объекта запроса",
"validation": [
{
"field": "MISSING_TYPE",
"message": "Parameter \"type\" is required."
}
]
}
}
#Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 400 | INVALID_PARAMS |
Поле type отсутствует или передано вне объекта filter — в error.validation приходит запись MISSING_TYPE |
| 403 | SCOPE_DENIED |
Ключу не хватает скоупа humanresources |
| 401 | TOKEN_MISSING |
У API-ключа не настроены токены Битрикс24 |
Полный список общих ошибок API — Ошибки.
#Известные особенности
Тип задаётся внутри filter. Поле type обязательно и принимается только внутри объекта filter. Если передать type на верхнем уровне тела запроса или опустить его, ответ — 400 INVALID_PARAMS, а в error.validation приходит запись с полем MISSING_TYPE. Это отличается от списка узлов, где type передаётся параметром строки запроса.