Документация API Квазара
Открытый REST API · JSON · первый запрос за 5 минут
Быстрый старт
Базовый адрес API совпадает с адресом сайта. Все ответы — JSON. Публичные данные (профили, публичные репозитории) доступны без токена. Попробуйте прямо сейчас:
curl https://ваш-домен/api/v1/users/quasarУ каждого ресурса есть и веб-адрес, и API-адрес: страница репозитория /автор/репозиторий, его API — /api/v1/repos/автор/репозиторий.
Токены доступа
Токен заменяет пароль в запросах к API. Создайте его в Настройках → Токены доступа и выберите области доступаобласти доступа — права токена: какие действия разрешено делать от вашего имени:
repo:read— читать ваши репозитории и файлыrepo:write— создавать репозитории и записывать файлыstars— дарить звёзды от вашего имениprofile— видеть ваш профиль
Токен показывается один раз при создании — сохраните его сразу. Отозвать можно в любой момент.
Аутентификация
Передавайте токен в заголовке:
curl -H "Authorization: Bearer qsr_ваш_токен" https://ваш-домен/api/v1/userВеб-сессии (после входа на сайт) тоже работают — то же API доступно из браузера с cookie сессии.
Пользователи
GET /api/v1/users/{username} — публичный профиль и список публичных репозиториев. Без токена.
curl https://ваш-домен/api/v1/users/quasarGET /api/v1/user — ваш профиль (по токену). Scope: profile.
Репозитории
GET /api/v1/repos/{owner}/{repo} — метаданные и список файлов. Публичные — без токена, приватные — с токеном владельца (scope repo:read).
GET /api/v1/repos — список ваших репозиториев. Scope: repo:read.
POST /api/v1/repos — создать репозиторий, можно сразу с файлами (scope repo:write):
curl -X POST https://ваш-домен/api/v1/repos \
-H "Authorization: Bearer qsr_ваш_токен" \
-H "Content-Type: application/json" \
-d '{
"name": "Мой проект",
"description": "Создан через API",
"language": "Python",
"topics": ["api", "пример"],
"files": {
"README.md": "# Привет!\nСоздано через API Квазара.",
"src/main.py": "print('Привет, Квазар!')"
}
}'Файлы
GET /api/v1/repos/{owner}/{repo}/files/{путь} — содержимое файла. Текстовые приходят в поле content, файлы из внешних облаков — в поле externalUrl.
curl https://ваш-домен/api/v1/repos/quasar/welcome/files/README.mdПрямая ссылка на файл (для скачивания и встраивания): /f/{owner}/{repo}/{путь}, добавьте ?dl=1 для принудительного скачивания. Архив всего репозитория: /api/download/{owner}/{repo}.
Звёзды (валюта)
Через веб-интерфейс звёзды дарятся кнопками на страницах репозиториев и профилей. Пользователям начисляются: +100 за регистрацию, +10 за дневной бонус (раз в 20 часов), награды за задания новичка, +5 автору за каждый форк его проекта.
Программная передача звёзд доступна с scope stars через веб-API POST /api/stars/gift (подарок автору) — формат: { username, amount, note? }.
Ошибки и лимиты
400— некорректные данные (в полеerror— человекочитаемое пояснение на русском)401— нет/просрочен токен или сессия403— у токена нет нужной области доступа404— ресурс не найден или приватный429— слишком часто: логин и OTP ограничены по времени
Как устроено хранение
Квазар спроектирован так, чтобы рост не съедал сервер: метаданные (пользователи, репозитории, структура файлов, транзакции звёзд) живут в базе SQLite, а «тяжёлое» — во внешних облаках.
- Текстовые файлы кода до 64 КБ — прямо в базе: просмотр мгновенный.
- Файлы больше 64 КБ и бинарники — цепочка внешних хранилищ без регистрации: catbox.moe (200 МБ, бессрочно) → vikingfile.com (гигабайты) → 0x0.st → gofile.io. Первый, кто принял файл, становится его домом.
- Если облака недоступны — аварийный фолбэк в базу (до 6 МБ), сайт продолжает работать.
- В продакшене база живёт в облачном KV платформы: на Vercel это Vercel Blob (каждое значение шифруется AES-256-GCM ключом из переменных окружения), на Netlify — Netlify Blobs; локально — настоящий SQLite-файл
data/quasar.db.
Настройка платформы (для владельца)
Все интеграции включаются переменными окружения платформы — в Vercel: Project → Settings → Environment Variables, в Netlify: Site configuration → Environment variables. Код менять не нужно — после сохранения переменных сделайте Redeploy:
| Переменные | Что включает |
|---|---|
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_FROM | Реальная отправка OTP-кодов на почту через любой SMTP-провайдер. Пример для бесплатного Brevo (300 писем/день): зарегистрируйтесь на brevo.com → SMTP & API → создайте SMTP-ключ; затем задайте SMTP_HOST=smtp-relay.brevo.com,SMTP_PORT=587, SMTP_USER (ваша почта Brevo), SMTP_PASS (SMTP-ключ), SMTP_FROM. Работают и Mail.ru (smtp.mail.ru:465), Яндекс (smtp.yandex.ru:465), Gmail (пароль приложения). После добавления переменных письма идут сами. |
DEMO_OTP=1 | Пока почта не подключена: код подтверждения показывается на экране, чтобы можно было тестировать регистрацию. Когда SMTP появится — уберите эту переменную. |
QUASAR_STORAGE | Явный выбор хранилища: vercel-blob (Vercel Blob, значения шифруются ключом QUASAR_DB_KEY), netlify-blobs (Netlify Blobs) или sqlite (локальный файл). На Vercel и Netlify определяется автоматически — задавать не нужно. |
EMAIL_FALLBACK=formsubmit | Резервная отправка OTP через formsubmit.co без регистрации (у получателя может потребоваться однократное подтверждение адреса). |
Важно про безопасность: сайт работает по HTTPS, пароли хранятся как scrypt-хэши, сессии — httpOnly cookie, токены — только sha256-хэш в базе, а база на Vercel дополнительно зашифрована на стороне приложения. Токены платформ (Vercel/Netlify), использованные при деплое, рекомендуем сменить в настройках аккаунтов.