API Reference
Полный справочник endpoint'ов МедАссист API: авторизация, управление ключами, биллинг, обработка текстов и коды ошибок
Base URL: https://partner.medassistai.ru
Формат данных: JSON (Content-Type: application/json)
Авторизация
В API используются две модели авторизации:
| Модель | Заголовок | Где используется |
|---|---|---|
| JWT | Authorization: Bearer <access_token> | Кабинетные API: /v1/api-key/*, /v1/billing/*, /v1/requests |
| API Key | X-API-Key: <full_key> | Обработка текста: /v1/text/process/*, polling: /v1/requests/<id> |
Дополнительно для auth-endpoint’ов (/v1/auth/*) требуется:
- Cookie
csrftoken(получается черезGET /v1/auth/csrf) - Заголовок
X-CSRFToken: <значение csrftoken> - Заголовок
Referer: https://partner.medassistai.ru/
Сводная таблица endpoint’ов
| Раздел | Endpoint | Метод | Авторизация |
|---|---|---|---|
| Auth | /v1/auth/csrf | GET | нет |
| Auth | /v1/auth/register | POST | CSRF |
| Auth | /v1/auth/login | POST | CSRF |
| Auth | /v1/auth/refresh | POST | CSRF + refresh cookie |
| Auth | /v1/auth/logout | POST | CSRF + refresh cookie |
| API Key | /v1/api-key/ | GET | JWT |
| API Key | /v1/api-key/rotate | POST | JWT |
| Billing | /v1/billing/balance | GET | JWT |
| Billing | /v1/billing/ledger | GET | JWT |
| Requests | /v1/requests | GET | JWT |
| Requests | /v1/requests/<request_id> | GET | API Key |
| Text | /v1/text/process/short | POST | API Key + Idempotency-Key |
| Text | /v1/text/process/long | POST | API Key + Idempotency-Key |
Auth: /v1/auth/*
Важно: auth URL’ы объявлены без trailing slash:
/v1/auth/login, а не/v1/auth/login/.
GET /v1/auth/csrf
CSRF bootstrap — выставляет cookie csrftoken.
Авторизация: не требуется
Ответ: 204 No Content
POST /v1/auth/register
Регистрация пользователя. Выставляет refresh cookie (httpOnly), возвращает access token.
Авторизация: CSRF
Тело запроса:
{
"email": "user@example.com",
"password": "pass12345"
}
Ответ 201 Created:
{
"access_token": "<jwt>",
"access_expires_at": "2025-12-13T00:00:00Z"
}
Ошибки:
| Код | error.code | Описание |
|---|---|---|
| 409 | user_exists | Пользователь уже существует |
POST /v1/auth/login
Вход по email/password. Выставляет refresh cookie, возвращает access token.
Авторизация: CSRF
Тело запроса:
{
"email": "user@example.com",
"password": "pass12345"
}
Ответ 200 OK:
{
"access_token": "<jwt>",
"access_expires_at": "2025-12-13T00:00:00Z"
}
Ошибки:
| Код | error.code | Описание |
|---|---|---|
| 401 | invalid_credentials | Неверный email или пароль |
| 401 | inactive_user | Аккаунт деактивирован |
| 429 | rate_limited | Превышен лимит попыток входа |
POST /v1/auth/refresh
Обновление access token. Refresh token ротируется (выдаётся новый refresh cookie).
Авторизация: CSRF
Источник refresh token:
- Cookie
refresh_token(предпочтительно) - Или JSON body:
{"refresh_token": "..."}
Ответ 200 OK:
{
"access_token": "<jwt>",
"access_expires_at": "2025-12-13T00:00:00Z"
}
Ошибки:
| Код | error.code | Описание |
|---|---|---|
| 401 | missing_refresh | Refresh token отсутствует |
| 401 | invalid_refresh | Refresh token невалиден (cookie очищается) |
POST /v1/auth/logout
Отзыв refresh token и очистка cookie.
Авторизация: CSRF + refresh cookie
Ответ: 204 No Content
API Key: /v1/api-key/*
GET /v1/api-key/
Метаданные активного ключа (секрет не возвращается).
Авторизация: JWT
Ответ 200 OK (ключ есть):
{
"api_key": {
"key_id": "abc123",
"prefix": "abc1",
"revoked": false,
"created_at": "2025-12-13T00:00:00Z"
}
}
Ответ 200 OK (ключа нет):
{
"api_key": null
}
POST /v1/api-key/rotate
Выпуск нового ключа (старый деактивируется). Полный ключ возвращается только один раз.
Авторизация: JWT
Ответ 200 OK:
{
"api_key": {
"key": "keyid.secret_part",
"key_id": "keyid"
}
}
Billing: /v1/billing/*
GET /v1/billing/balance
Текущий баланс кредитов.
Авторизация: JWT
Ответ 200 OK:
{
"currency": "CREDITS",
"balance_credits": "12.000000",
"reserved_credits": "0.000000",
"available_credits": "12.000000"
}
Поля:
balance_credits— общий баланс (включая резерв)reserved_credits— зарезервировано под выполняющиеся запросыavailable_credits— доступно для новых запросов
GET /v1/billing/ledger
История операций по балансу (с пагинацией через курсор).
Авторизация: JWT
Query-параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
limit | int | 50 | Количество записей (1–200) |
cursor | string | — | Курсор для следующей страницы |
Ответ 200 OK:
{
"items": [
{
"kind": "topup",
"amount_credits": "100.000000",
"created_at": "2025-12-12T00:00:00Z",
"meta": {"reason": "manual_topup"}
}
],
"next_cursor": "2025-12-11T00:00:00Z|..."
}
Типы операций (kind): topup (пополнение), charge (списание), adjustment (корректировка).
Requests: /v1/requests
GET /v1/requests
История запросов (без текстов — только метаданные).
Авторизация: JWT
Query-параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
limit | int | 50 | Количество записей (1–200) |
cursor | string | — | Курсор для следующей страницы |
Ответ 200 OK:
{
"items": [
{
"id": "uuid",
"status": "succeeded",
"operation": "text_process_short",
"started_at": "2025-12-12T00:00:00Z",
"model": "MedAssistModel1",
"charged_credits": "1.000000",
"has_text_payload": true
}
],
"next_cursor": null
}
GET /v1/requests/<request_id>
Polling-endpoint для получения результата обработки текста.
Авторизация: API Key
Ответ 202 Accepted (запрос ещё обрабатывается):
{
"request_id": "uuid",
"operation": "text_process_short",
"status": "started"
}
Используйте заголовок Retry-After (если есть) как подсказку для интервала polling.
Ответ 200 OK (результат готов):
{
"request_id": "uuid",
"operation": "text_process_short",
"output_text": "Результат обработки...",
"billing": {"charged_credits": "1.000000"},
"model": "MedAssistModel1"
}
Поле output_text возвращается в формате Markdown.
Text Processing: /v1/text/process/*
Обработка текста работает в режиме always-async:
POST /v1/text/process/{short|long}→202 Accepted+request_idGET /v1/requests/<request_id>→ polling до200 OK
POST /v1/text/process/short
Обработка текста в кратком стиле.
POST /v1/text/process/long
Обработка текста в развёрнутом стиле.
Авторизация: API Key + Idempotency-Key
Заголовки:
| Заголовок | Обязательный | Описание |
|---|---|---|
X-API-Key | да | API-ключ |
Idempotency-Key | да | Уникальный ключ для идемпотентности |
Content-Type | да | application/json |
Тело запроса (строго фиксировано):
{
"text": "Текст для обработки"
}
- Допускается только поле
text(string, обязательное) - Любые дополнительные поля будут отклонены с
400 invalid_request - Максимальная длина: 100 000 символов
- Кодировка: UTF-8
Ответ 202 Accepted:
{
"request_id": "uuid",
"operation": "text_process_short",
"status": "started",
"poll_url": "/v1/requests/<request_id>"
}
Формат ошибок
Все ошибки возвращаются в едином формате:
{
"error": {
"code": "error_code",
"message": "Описание ошибки"
}
}
Коды ошибок
| HTTP-код | error.code | Описание |
|---|---|---|
| 400 | invalid_request | Невалидное тело запроса или отсутствует Idempotency-Key |
| 401 | invalid_api_key | Невалидный или отозванный API-ключ |
| 401 | invalid_credentials | Неверный email или пароль |
| 402 | insufficient_funds | Недостаточно кредитов на балансе |
| 404 | not_found | Запрос не найден или не принадлежит вашей организации |
| 409 | conflict | Конфликт Idempotency-Key (повторный запрос или истёк TTL zero-log) |
| 429 | rate_limited | Превышен лимит запросов (в минуту или polling) |
| 429 | quota_exceeded | Превышена дневная квота |
| 500 | server_misconfigured | Ошибка конфигурации на стороне сервиса |
| 503 | provider_error | Временная ошибка провайдера (сервис автоматически делает retry) |
Про 429 на polling: endpoint GET /v1/requests/<request_id> имеет отдельный лимит на частоту опроса (по умолчанию 60 запросов/мин). Рекомендуемый интервал polling: 2 секунды.
Про 503 provider_error: сервис автоматически делает несколько попыток с экспоненциальной задержкой. Чтобы повторить обработку заново, отправьте новый запрос с новым Idempotency-Key.
Смотрите также
- Документация API — обзор и быстрый старт
- Концепции — архитектура, биллинг, безопасность
- Примеры кода — готовые примеры на Python, JavaScript и curl