---
title: Быстрый старт
description: Три минуты между браузером и ответом модели: ключ в консоли, base URL в клиенте, первый вызов. Ниже — то же самое подробно.
keywords: быстрый старт, начало, ключ, первый запрос, base url, стриминг
group: get-started
---

## За три минуты {#quick keywords="быстро, три минуты, первый вызов, base url"}

:::steps
- **Создайте ключ** — В консоли, на экране ключей. Секрет показывается один раз; скопируйте его сразу.
- **Пополните кошелёк** — Новый кошелёк создаётся пустым; без пополнения первому вызову нечем платить.
- **Укажите base URL** — Направьте любой OpenAI-совместимый клиент на `https://api.kumorouter.com/v1` и отдайте ему ключ.
- **Сделайте вызов** — Назовите модель и потолок вывода. Ответ придёт в той же форме, которую клиент уже разбирает.
:::

:::note
Новый кошелёк пуст, и вызов, которому нечем платить, отвечает `402` — пополните баланс на [странице оплаты →](/ru/billing).
:::

:::code-group
```bash title=curl
curl https://api.kumorouter.com/v1/chat/completions \
  -H "Authorization: Bearer $KUMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<model>",
    "max_tokens": 128,
    "messages": [{ "role": "user", "content": "Объясни токены одной строкой." }]
  }'
```
```python title=Python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.kumorouter.com/v1",
    api_key=os.environ["KUMO_API_KEY"],
)

answer = client.chat.completions.create(
    model="<model>",
    max_tokens=128,
    messages=[{"role": "user", "content": "Объясни токены одной строкой."}],
)
print(answer.choices[0].message.content)
```
```javascript title=Node
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.kumorouter.com/v1",
  apiKey: process.env.KUMO_API_KEY,
});

const answer = await client.chat.completions.create({
  model: "<model>",
  max_tokens: 128,
  messages: [{ role: "user", content: "Объясни токены одной строкой." }],
});

const reply = answer.choices[0].message.content;
process.stdout.write((reply ?? "") + "\n");
```
:::

:::tip
Выберите модель в списке над примерами — её идентификатор подставится во все примеры на этой странице, и код можно копировать как есть.
:::

> [Каталог моделей →](/ru/models) [Как пишется заголовок →](/ru/authentication)

## Заведите аккаунт {#create-account keywords="аккаунт, регистрация, зарегистрироваться"}

Всё в этом разделе происходит в консоли. Аккаунт — это адрес почты и пароль; ничего ставить не нужно, и карту никто не спрашивает до того, как ключ окажется у вас в руках.

:::steps
- **Откройте консоль** — Это отдельный хост продукта, и там живут все операции с аккаунтом.
- **Создайте аккаунт** — Адрес, пароль не короче **6 символов** (верхняя граница — 256 **байт** UTF-8) и два согласия, которых просит форма. Нижняя граница считает символы, поэтому шесть букв — это шесть букв в любом алфавите.
- **Вы уже внутри** — Тот же ответ, что создаёт аккаунт, выпускает и сессию: консоль сама ставит себе куку и открывает обзор, входить отдельно не нужно и копировать нечего.
:::

Письмо с подтверждением адреса обычно приходит своим чередом. Его ссылка удостоверяет, что адрес ваш, и сегодня этим всё и исчерпывается: ни ключ, ни первый вызов её не ждут, поэтому отсутствие письма — не тупик. Отправка делается по мере возможности: под нагрузкой её могут пропустить, а ошибку доставки — проглотить, и регистрация в любом случае состоится.

## Выпустите ключ {#create-key keywords="ключ, консоль, секрет, показ"}

Ключ создаётся на экране ключей в консоли. Секрет показывается **один раз**, на том экране, который его создаёт, и больше никогда: платформа хранит только его хэш вместе с префиксом и хвостом, которые называют ключ в списке.

- Скопируйте секрет в своё хранилище, не уходя с экрана создания.
- Держите его в переменной окружения, а не в исходниках.
- Потерянный ключ не восстанавливают — вместо него выпускают новый.

> [Открыть консоль →](https://console.kumorouter.com/) [Что помнит платформа о ключе →](/ru/authentication)

## Пополните кошелёк {#top-up keywords="кошелёк, баланс, пополнение, 402"}

Кошелёк создаётся вместе с организацией и на старте пуст. Пополнение делается из консоли — картой, СБП или криптовалютой, в зависимости от того, что предложит платёжная система; минимальной суммы нет.

> [Как пополнить кошелёк →](/ru/billing)

## Сделайте вызов {#first-call keywords="запрос, chat completions, curl, base url, max_tokens"}

Направьте любой OpenAI-совместимый клиент на `https://api.kumorouter.com/v1` и дайте ему ключ. В этом вся миграция: меняются base URL и ключ, а остальной ваш код — нет.

Модель называется каноническим идентификатором или псевдонимом, который несёт опубликованный каталог. `<model>` в примерах стоит вместо такого имени — спросите список у шлюза командой `curl https://api.kumorouter.com/v1/models`, посмотрите его на [странице моделей](/ru/models) или сверьте ставки в [прайс-листе](https://kumorouter.com/ru/pricing).

Потолок вывода обязателен. `max_tokens` (или `max_completion_tokens` — это то же самое) позволяет платформе сделать резерв под вызов до того, как он уйдёт к провайдеру; запрос без него отвергается, а не остаётся неограниченным.

## Что приходит в ответ {#response keywords="ответ, choices, usage, finish_reason"}

Ответ принадлежит самому этому протоколу, а не переведён из другого: choices, причина завершения и счётчики токенов приходят в той форме, которую клиент уже разбирает.

```json title=Ответ
{
  "id": "chatcmpl-8f2b7e10c9",
  "object": "chat.completion",
  "model": "<model>",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Токены — это небольшие куски текста, которые модель читает и пишет."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 18,
    "total_tokens": 30
  }
}
```

> [Все поля операции →](/ru/chat-completions) [Как выглядит отказ →](/ru/errors)

## Включите поток {#stream keywords="стриминг, поток, sse, server-sent events, чанки"}

Добавьте `"stream": true` — и тот же вызов ответит как `text/event-stream`: события `chat.completion.chunk` в порядке прихода, затем завершающий кадр `[DONE]`. Попросите счётчики токенов через `stream_options` — и перед этим кадром придёт чанк с расходом.

Отказ, решённый до первого события, приходит обычной JSON-ошибкой — ровно так же, как в унарном вызове. Сбой после начала потока обрывает его **без** завершающего кадра: именно так клиент отличает законченный ответ от обрезанного, поэтому поток, остановившийся до `[DONE]`, считайте неудачным вызовом, а не коротким.

```bash title=curl
curl -N https://api.kumorouter.com/v1/chat/completions \
  -H "Authorization: Bearer $KUMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<model>",
    "max_tokens": 128,
    "stream": true,
    "stream_options": { "include_usage": true },
    "messages": [{ "role": "user", "content": "Напиши хайку про задержку." }]
  }'
```

> [Поток целиком, событие за событием →](/ru/streaming)

## Убедитесь, что ключ работает {#verify-key keywords="проверка, проверить, личность"}

Прежде чем вшивать ключ куда-либо, спросите у платформы, что она о нём думает. Эхо личности — единственная операция, которая отвечает личностью самого предъявленного ключа: его именем, тем, чем он оплачивается, и сроком. Она говорит «да, ключ живой, и вот что ему разрешено» без единой написанной вами строки.

Отказ в предъявлении всегда один и тот же 401. Отсутствующий заголовок, искажённый ключ, неизвестный, отозванный и истёкший отвечаются одинаково, и ответ не говорит, что именно из этого случилось. Какой из ваших ключей жив, знает консоль, а не шлюз.

> [Проверить ключ →](/ru/key-check)

## Что дальше {#next keywords="дальше, каталог, интеграции, ошибки"}

:::cards
- [Модели](/ru/models) — каталог платформы: что доступно, что умеет и как это назвать в запросе.
- [Интеграции](/ru/integrations) — готовые настройки для агентов, редакторов и SDK.
- [Chat Completions](/ru/chat-completions) — операция первого вызова, поле за полем.
- [Ошибки](/ru/errors) — каждый статус, который отвечает шлюз, и что с ним делать.
:::
