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

Пять минут от нуля до первого ответа. Понадобится право на настройки школы
и терминал.

## Шаг 1. Ключ

Настройки школы → API → создать ключ.

- **Название** — по интеграции, а не «тест»: через полгода это единственное,
  по чему ключ опознают.
- **Права** — для начала только чтение. Права на запись добавите, когда они
  понадобятся, а не «на всякий случай».
- **Значение показывается один раз.** Скопируйте сразу; в базе хранится только
  хеш, и второго показа не будет.

На том же экране — адрес API вашей установки и готовый пример запроса **с вашим
доменом и вашим ключом**: его можно проверить копированием в терминал, ничего
не подставляя руками.

## Шаг 2. Первый запрос

Список курсов — самый безопасный первый запрос: только чтение, есть в любой школе.

```bash
curl -X GET 'https://school.example.com/api/v1/courses' \
  -H 'Authorization: Bearer lms_live_a8f3c1e9d2b74a5f8e0c1d3b5a7f9e2c' \
  -H 'Accept: application/json'
```

Ответ — список в конверте:

```json
{
  "data": [
    {
      "id": "crs_01HQZX41B7RC9S",
      "title": "Основы фотографии",
      "created_at": "2026-08-01T10:15:00+03:00"
    }
  ],
  "has_more": false,
  "next_cursor": null
}
```

Три вещи, на которые стоит посмотреть в первом же ответе:

- **`id` начинается с `crs_`** — идентификаторы типизированы. Ошибка «передал
  не тот id» видна по префиксу мгновенно, а не через три часа отладки.
- **`has_more` и `next_cursor`** — так устроены все списки. Пагинация курсором,
  не смещением: [почему](/api/pagination/).
- **Дата с таймзоной.** Всегда.

И заголовки ответа:

```
X-Request-Id: req_01HQZXA7M3PK9E
X-RateLimit-Remaining: 599
```

`X-Request-Id` логируйте у себя с первого дня — по нему разбирается любой спорный
случай. Лимиты — [здесь](/api/limits/).

## Шаг 3. Один объект

```bash
curl -X GET 'https://school.example.com/api/v1/courses/crs_01HQZX41B7RC9S' \
  -H 'Authorization: Bearer lms_live_a8f3c1e9d2b74a5f8e0c1d3b5a7f9e2c' \
  -H 'Accept: application/json'
```

Объект отдаётся напрямую, без обёртки. `404` может значить и «нет такого»,
и «вне видимости вашего ключа» — это намеренно неразличимо, см.
[Ошибки](/api/errors/).

## Шаг 4. События вместо опроса

Не опрашивайте «не появилось ли чего» по расписанию — подпишитесь:

```bash
curl -X POST 'https://school.example.com/api/v1/webhooks' \
  -H 'Authorization: Bearer lms_live_a8f3c1e9d2b74a5f8e0c1d3b5a7f9e2c' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 6f1e2a34-9c8b-4d7e-a1f0-3b5c7d9e1f2a' \
  -H 'Accept: application/json' \
  --data '{
    "url": "https://my-integration.example.com/hooks/lms",
    "events": ["lesson.completed", "submission.created"],
    "secret": "whsec_16d8f4a2c9b7e3510d6a8f2c4b9e7d13"
  }'
```

Дальше события приходят сами, с подписью и повторами. Как проверять подпись
и почему обработчик обязан быть идемпотентным — [Вебхуки](/api/webhooks/).

## Шаг 5. Куда дальше

- Что-то не работает — [Ошибки первого дня](/api/first-day/): там собраны
  все грабли первых суток, от лишнего пробела в ключе до незакодированного
  плюса в дате.
- Формат целиком — [Формат](/api/format/).
- Что вообще есть в API — [Состав среза](/api/scope/).
