> ## 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.

# Find by a list of identifiers

> Find multiple school users by lists of logins, Telegram IDs or external extIds

## Request headers

<ParamField header="Authorization" type="string" required>
  The service user's API token in the `Bearer YOUR_TOKEN` format. The school owner issues the token in the admin panel:
  **Manage → School → For developers → API keys** — see the ["Authentication"](/en/exode-api/setup#authentication) section for details.
</ParamField>

<ParamField header="Seller-Id" type="integer" required>
  The numeric ID of the seller — the account the school belongs to. Copy it on the **API keys** page, in
  the **Integration data → Identifiers** card. The token's permissions are checked against this ID.
</ParamField>

<ParamField header="School-Id" type="integer" required>
  The numeric ID of the school, found in the same place as `Seller-Id`. The value must match the seller's school — otherwise
  a `400` error with `cause: "ForbiddenSchoolMismatch"` is returned.
</ParamField>

```
POST /saas/v2/user/find-many
```

Requires authentication and the [**"School User Management"**](/en/exode-api/permissions) permission (`SchoolManageUsers`).

<Tip>
  To find a single user, use
  [Find by identifier](/en/exode-api/school/user/find).
</Tip>

## Request parameters

##### Pass at least one of the identifier lists

<Info>
  The method returns an array of found users. Users that could not be found are not included in the response —
  match the result to the request by `email`/`phone`/`domain`/`tgId`/`extId` on your side. If several lists are
  passed, the conditions are combined with "OR": the response includes every user matching at least one
  value from any list — each user at most once. The order of items in the response does not
  match the order in the request.
</Info>

<ParamField body="logins" type="string[]" required={false}>
  A list of user logins: email, phone in international format, or domain login (`domain`, for example
  `i_ivanov`; a value like `id12345` finds the user with ID `12345`). From 2 to 50 characters each, up to
  250 items.
</ParamField>

<ParamField body="tgIds" type="integer[]" required={false}>
  A list of users' Telegram IDs. Up to 250 items.
</ParamField>

<ParamField body="extIds" type="string[]" required={false}>
  A list of external identifiers from your system. From 1 to 50 characters each, up to 250 items.
</ParamField>

<Warning>
  You must pass **at least one non-empty** list. Each list is limited to 250 items.
</Warning>

<RequestExample>
  ```bash cURL theme={null}
  curl --location 'https://api.exode.biz/saas/v2/user/find-many' \
    --header 'Seller-Id: {{ sellerId }}' \
    --header 'School-Id: {{ schoolId }}' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer YOUR_TOKEN' \
    --data-raw '{
      "logins": ["user@example.com", "+9876543210"]
    }'
  ```

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

  const findManyUsers = async () => {
    try {
      const response = await axios.post('https://api.exode.biz/saas/v2/user/find-many', {
        logins: ['user@example.com', '+9876543210']
      }, {
        headers: {
          'Seller-Id': '{{ sellerId }}',
          'School-Id': '{{ schoolId }}',
          'Content-Type': 'application/json',
          'Authorization': 'Bearer YOUR_TOKEN'
        }
      });

      console.log('Users found:', response.data.payload.users);
    } catch (error) {
      console.error('Error:', error.response?.data || error.message);
    }
  };

  findManyUsers();
  ```

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

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

  data = {
    'logins': ['user@example.com', '+9876543210']
  }

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

  response = requests.post(url, json=data, headers=headers)
  response.raise_for_status()

  result = response.json()
  print(json.dumps(result['payload']['users'], indent=2, ensure_ascii=False))
  ```
</RequestExample>

<ResponseExample>
  ```json Success theme={null}
  {
    "success": true,
    "code": 201,
    "payload": {
      "users": [
        {
          "id": 1683,
          "createdAt": "2026-07-02T11:15:46.896Z",
          "updatedAt": "2026-07-02T11:15:46.940Z",
          "archivedAt": null,
          "uuid": "e-cjTT0CWMCB",
          "active": true,
          "activated": true,
          "banned": false,
          "status": "Active",
          "alive": true,
          "domain": "id1683",
          "email": "user@example.com",
          "phone": null,
          "tgId": null,
          "vkId": null,
          "appleId": null,
          "extId": "crm_12345",
          "schoolId": 198,
          "language": null,
          "timezone": null,
          "lastOnlineAt": null,
          "starsBalance": 0,
          "currentTime": "2026-07-02T11:15:46+00:00",
          "isSleepingNow": false,
          "profile": {
            "id": 1665,
            "createdAt": "2026-07-02T11:15:46.932Z",
            "updatedAt": "2026-07-02T11:15:46.932Z",
            "archivedAt": null,
            "userId": 1683,
            "official": false,
            "firstName": "Firstname",
            "lastName": "Lastname",
            "fullName": "Firstname Lastname",
            "fullNameShort": "Firstname L.",
            "bdate": null,
            "sex": "Ufo",
            "country": null,
            "city": null,
            "role": "Student",
            "status": null,
            "title": "",
            "emojiTitle": "",
            "avatar": {
              "id": 1665,
              "small": "https://storage.exode.biz/production/user/1683/xK2mVwNib9b0/small/avatar.png",
              "medium": "https://storage.exode.biz/production/user/1683/xK2mVwNib9b0/medium/avatar.png",
              "maximum": "https://storage.exode.biz/production/user/1683/xK2mVwNib9b0/avatar.png"
            },
            "titleState": {
              "manualTitle": null,
              "manualEmojiTitle": null,
              "manualNextTitle": null,
              "manualNextEmojiTitle": null,
              "manualExpiredAt": null,
              "locationTitle": null,
              "locationEmojiTitle": null,
              "achievementTitle": null,
              "achievementEmojiTitle": null
            }
          }
        }
      ]
    }
  }
  ```

  ```json Success - No Users Found theme={null}
  {
    "success": true,
    "code": 201,
    "payload": {
      "users": []
    }
  }
  ```

  ```json Error - Empty Request theme={null}
  {
    "cause": "validation",
    "code": 400,
    "success": false,
    "error": "Bad Request",
    "message": [
      "logins should not be empty"
    ]
  }
  ```
</ResponseExample>

## Permission requirements

<Check>
  Finding users requires the **"School User Management"** permission (`SchoolManageUsers`).
</Check>

<Warning>
  The service user must be authenticated with a token and have the appropriate access permissions for the specified
  school.
</Warning>

***

*Updated: 2026-09-25 14:33 UTC*


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.