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

# Быстрый старт

> Первый запрос к Exode API за несколько минут

За пять шагов вы сделаете первый запрос: получите токен, настроите заголовки, найдёте или создадите
пользователя и разберёте ответ.

<Steps>
  <Step title="Получите доступы">
    Владелец школы может создать API-ключ самостоятельно: раздел **Управление → Школа → Для разработчиков → API-ключи**
    (`/manage/school/api-keys`) — там создаётся сервисный пользователь (API-клиент) и выпускается токен.
    Если удобнее, напишите в [поддержку](https://t.me/exode_support_biz) — поможем с настройкой.

    Для запросов понадобятся три значения:

    * `Authorization` — API-токен (используется как `Bearer <TOKEN>`; показывается целиком только в момент
      создания или ротации — сохраните сразу);
    * `Seller-Id` — числовой ID продавца (аккаунта, которому принадлежит школа);
    * `School-Id` — числовой ID школы.

    Оба ID есть на той же странице **API-ключи** в карточке «Данные для интеграции → Идентификаторы» — по клику
    копируется строка вида `Seller-Id: 123; School-Id: 456`.

    Сохраните значения в переменные окружения — их используют примеры ниже:

    ```bash theme={null}
    export EXODE_TOKEN='...'   # API token
    export SELLER_ID=123       # Seller-Id
    export SCHOOL_ID=456       # School-Id
    ```

    <Warning>Храните токен в переменных окружения, не в коде и не в репозитории.</Warning>
  </Step>

  <Step title="Подготовьте заголовки">
    Все запросы выполняются с тремя обязательными заголовками:

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

    <ParamField header="Authorization" type="string" required>
      API-токен сервисного пользователя в формате `Bearer YOUR_TOKEN`. Токен выпускает владелец школы в кабинете:
      **Управление → Школа → Для разработчиков → API-ключи** — подробнее в разделе [«Аутентификация»](/ru/exode-api/setup#аутентификация).
    </ParamField>

    <ParamField header="Seller-Id" type="integer" required>
      Числовой ID продавца — аккаунта, которому принадлежит школа. Скопируйте его на странице **API-ключи** в
      карточке «Данные для интеграции → Идентификаторы». По этому ID проверяются права токена.
    </ParamField>

    <ParamField header="School-Id" type="integer" required>
      Числовой ID школы, берётся там же, где `Seller-Id`. Значение должно совпадать со школой продавца — иначе
      вернётся ошибка `400` с `cause: "ForbiddenSchoolMismatch"`.
    </ParamField>
  </Step>

  <Step title="Сделайте первый запрос — найдите пользователя">
    Проверьте доступ безопасным методом чтения — [`user/find`](/ru/exode-api/school/user/find):

    <CodeGroup>
      ```bash cURL theme={null}
      curl --location 'https://api.exode.biz/saas/v2/user/find?extId=crm_12345' \
        --header "Authorization: Bearer $EXODE_TOKEN" \
        --header "Seller-Id: $SELLER_ID" \
        --header "School-Id: $SCHOOL_ID"
      ```

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

      const client = axios.create({
        baseURL: 'https://api.exode.biz/saas/v2',
        headers: {
          Authorization: `Bearer ${process.env.EXODE_TOKEN}`,
          'Seller-Id': process.env.SELLER_ID,
          'School-Id': process.env.SCHOOL_ID,
        },
      });

      const { data } = await client.get('/user/find', { params: { extId: 'crm_12345' } });
      console.log(data.payload.user);
      ```

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

      session = requests.Session()
      session.headers.update({
        'Authorization': f"Bearer {os.environ['EXODE_TOKEN']}",
        'Seller-Id': os.environ['SELLER_ID'],
        'School-Id': os.environ['SCHOOL_ID'],
      })

      r = session.get('https://api.exode.biz/saas/v2/user/find', params={'extId': 'crm_12345'})
      print(r.json()['payload']['user'])
      ```
    </CodeGroup>

    `extId` — ваш собственный идентификатор пользователя (например, ID из CRM): строка до 50 символов без `/` и
    пробелов, уникальная в пределах школы. Если пользователь не найден, метод вернёт `200` и `payload.user: null` —
    это не ошибка.

    <Tip>
      На страницах методов в примерах cURL заголовки записаны как `{{ sellerId }}` и `{{ schoolId }}` — это
      переменные Postman-коллекции. В терминале подставьте вместо них числовые ID или `$SELLER_ID` и `$SCHOOL_ID`.
    </Tip>
  </Step>

  <Step title="Создайте пользователя">
    Если пользователя ещё нет — создайте его методом [`user/create`](/ru/exode-api/school/user/create).
    Логин и пароль будут отправлены пользователю автоматически, если есть канал доставки: `email`, `phone` (при
    подключённом SMS-провайдере) или `tgId` — подробности на странице метода. Чтобы не отправлять их, передайте
    `skipSendCredentials: true`.

    ```bash cURL theme={null}
    curl --location 'https://api.exode.biz/saas/v2/user/create' \
      --header "Authorization: Bearer $EXODE_TOKEN" \
      --header "Seller-Id: $SELLER_ID" \
      --header "School-Id: $SCHOOL_ID" \
      --header 'Content-Type: application/json' \
      --data-raw '{
        "email": "user@example.com",
        "extId": "crm_12345",
        "profile": { "firstName": "John", "lastName": "Doe" }
      }'
    ```
  </Step>

  <Step title="Разберите ответ">
    Любой ответ обёрнут в `{ success, code, payload }`. Проверяйте `success`/`code`, а при ошибке —
    поле `cause`:

    ```json Успех theme={null}
    { "success": true, "code": 200, "payload": { "user": { "id": 123, "extId": "crm_12345" } } }
    ```

    ```json Ошибка theme={null}
    { "success": false, "code": 400, "cause": "EmailIsBusy", "message": "Email is busy", "error": "Email is busy" }
    ```

    Здесь `EmailIsBusy` означает, что email уже занят другим пользователем школы. Обычно в этом случае ищут
    существующего пользователя через `user/find?login=<email>` или используют
    [`user/upsert`](/ru/exode-api/school/user/upsert), который создаёт или обновляет пользователя за один вызов.

    Подробно о заголовках, формате ответа, ошибках, rate-limit и пагинации — на странице
    [«Работа с API»](/ru/exode-api/setup).
  </Step>
</Steps>

## Что дальше

<CardGroup cols={2}>
  <Card title="Ключевые понятия" icon="diagram-project" href="/ru/exode-api/concepts">
    Как связаны продавец, школа, курсы, продукты и доступы.
  </Card>

  <Card title="Работа с API" icon="gear" href="/ru/exode-api/setup">
    Заголовки, формат ответа и ошибок, rate-limit, пагинация.
  </Card>

  <Card title="Вебхуки" icon="bell" href="/ru/exode-api/webhooks/about">
    Получайте события платформы в свои сервисы.
  </Card>

  <Card title="Объекты API" icon="cube" href="/ru/exode-api/objects/entities/index">
    Полные структуры сущностей по zod-схемам.
  </Card>
</CardGroup>

***

*Обновлено: 2026-10-05 12:43 UTC*


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