> ## Documentation Index
> Fetch the complete documentation index at: https://docs.exode.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Удаление пользователей

> Массовое удаление пользователей школы по их идентификаторам

## Заголовки запроса

<ParamField header="Authorization" type="string" required>
  API токен сервисного пользователя в формате Bearer. Получите токен в панели администратора школы. Формат: `Bearer YOUR_TOKEN`.
</ParamField>

<ParamField header="Seller-Id" type="string" required>
  Уникальный идентификатор продавца в системе. Используется для разграничения доступа между разными продавцами.
</ParamField>

<ParamField header="School-Id" type="string" required>
  Уникальный идентификатор школы в системе. Определяет контекст выполнения операции.
</ParamField>

<Warning>
  Операция удаляет пользователей **безвозвратно**. Владельца школы удалить нельзя — такие идентификаторы
  будут пропущены и возвращены в поле `skipped`.
</Warning>

```
DELETE /saas/v2/user/delete-many
```

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

<Tip>
  Максимальное количество пользователей за один запрос — **250**. Для удаления большего количества
  выполняйте несколько запросов.
</Tip>

<ParamField body="userIds" type="integer[]" required>
  Массив идентификаторов пользователей для удаления. Максимум 250 за один запрос.
</ParamField>

<ParamField body="reason" type="string" required>
  Причина удаления. Максимум 256 символов. Сохраняется в системе для аудита.
</ParamField>

## Поля ответа

<ResponseField name="payload" type="object">
  <Expandable title="Свойства payload">
    <ResponseField name="deleted" type="integer[]">
      Идентификаторы пользователей, которые были успешно удалены.
    </ResponseField>

    <ResponseField name="skipped" type="integer[]">
      Идентификаторы, которые были пропущены (например, владелец школы или не найденные пользователи).
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl --location --request DELETE 'https://api.exode.biz/saas/v2/user/delete-many' \
    --header 'Seller-Id: {{ sellerId }}' \
    --header 'School-Id: {{ schoolId }}' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer YOUR_TOKEN' \
    --data-raw '{
      "userIds": [123, 124, 125],
      "reason": "Закрытие доступа по запросу"
    }'
  ```

  ```javascript Node.js theme={null}
  const axios = require('axios');

  const deleteUsers = async () => {
    const { data } = await axios.delete('https://api.exode.biz/saas/v2/user/delete-many', {
      headers: {
        'Seller-Id': '{{ sellerId }}',
        'School-Id': '{{ schoolId }}',
        'Content-Type': 'application/json',
        'Authorization': 'Bearer YOUR_TOKEN',
      },
      data: {
        userIds: [123, 124, 125],
        reason: 'Закрытие доступа по запросу',
      },
    });

    console.log(data.payload);
  };

  deleteUsers();
  ```

  ```php PHP theme={null}
  <?php

  $url = 'https://api.exode.biz/saas/v2/user/delete-many';
  $data = [
    'userIds' => [123, 124, 125],
    'reason'  => 'Закрытие доступа по запросу',
  ];

  $headers = [
    'Seller-Id: {{ sellerId }}',
    'School-Id: {{ schoolId }}',
    'Content-Type: application/json',
    'Authorization: Bearer YOUR_TOKEN'
  ];

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  $response = curl_exec($ch);
  curl_close($ch);

  echo $response;
  ?>
  ```

  ```python Python theme={null}
  import requests

  url = 'https://api.exode.biz/saas/v2/user/delete-many'

  headers = {
    'Seller-Id': '{{ sellerId }}',
    'School-Id': '{{ schoolId }}',
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_TOKEN'
  }

  data = {
    'userIds': [123, 124, 125],
    'reason': 'Закрытие доступа по запросу'
  }

  response = requests.delete(url, json=data, headers=headers)
  print(response.json())
  ```

  ```bsl 1С theme={null}
  ИдентификаторыПользователей = Новый Массив;
  ИдентификаторыПользователей.Добавить(123);
  ИдентификаторыПользователей.Добавить(124);
  ИдентификаторыПользователей.Добавить(125);

  Данные = Новый Структура;
  Данные.Вставить("userIds", ИдентификаторыПользователей);
  Данные.Вставить("reason", "Закрытие доступа по запросу");

  // Serialize body to JSON
  ЗаписьJSON = Новый ЗаписьJSON;
  ЗаписьJSON.УстановитьСтроку();
  ЗаписатьJSON(ЗаписьJSON, Данные);
  ТелоЗапроса = ЗаписьJSON.Закрыть();

  Соединение = Новый HTTPСоединение("api.exode.biz", 443, , , , 30, Новый OpenSSLSecureConnection);

  Запрос = Новый HTTPЗапрос("/saas/v2/user/delete-many");
  Запрос.Заголовки.Вставить("Seller-Id", "{{ sellerId }}");
  Запрос.Заголовки.Вставить("School-Id", "{{ schoolId }}");
  Запрос.Заголовки.Вставить("Content-Type", "application/json");
  Запрос.Заголовки.Вставить("Authorization", "Bearer YOUR_TOKEN");
  Запрос.УстановитьТелоИзСтроки(ТелоЗапроса);

  Ответ = Соединение.ВызватьHTTPМетод("DELETE", Запрос);

  Если Ответ.КодСостояния = 200 Тогда
      ЧтениеJSON = Новый ЧтениеJSON;
      ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
      Результат = ПрочитатьJSON(ЧтениеJSON);
      Сообщить("Пользователи удалены");
  Иначе
      Сообщить("Ошибка: HTTP " + Ответ.КодСостояния);
      Сообщить(Ответ.ПолучитьТелоКакСтроку());
  КонецЕсли;
  ```
</RequestExample>

<ResponseExample>
  ```json Success theme={null}
  {
    "success": true,
    "code": 200,
    "payload": {
      "deleted": [
        123,
        124
      ],
      "skipped": [
        125
      ]
    }
  }
  ```
</ResponseExample>

## Требования к правам доступа

<Check>
  Требуется аутентификация по токену и право управления пользователями школы (`SchoolManageUsers`).
</Check>
