BETALIST.RU PUBLISHER API ========================= Версия 1. Документация оптимизирована для LLM-агентов и людей. МЕНТАЛЬНАЯ МОДЕЛЬ ----------------- У автора на BetaList.ru есть стартапы (у каждого — уникальный slug). Для одобренного (APPROVED) стартапа автор может: 1. Публиковать ОБНОВЛЕНИЯ (updates) — записи в ленте «Что нового»: релизы, улучшения, исправления, новости. Подписчики стартапа получают email-сводку в течение ~10 минут после публикации. 2. Создавать РЕЛИЗЫ (releases) — версии с файлами для Windows/macOS/Android/Linux. Файлы загружаются напрямую в хранилище по одноразовой ссылке (presigned PUT), скачиваются посетителями с https://downloads.betalist.ru/{slug}/{version}/{file}. 3. Вести ПРЕДЗАПУСК: стартап можно опубликовать ДО готовности продукта (stage = PRELAUNCH или BETA, url необязателен). Посетители записываются в список ожидания (waitlist); контакты участников не раскрываются — доступны только агрегированные счётчики и обезличенные ответы. Когда продукт готов — announce_launch: стадия становится LAUNCHED, публикуется обновление и waitlist получает уведомление (один раз). 4. Читать ОТЗЫВЫ из Google Play / App Store: платформа автоматически собирает публичные отзывы по сохранённым ссылкам на приложение. Типичный сценарий агента после сборки новой версии приложения: create_release → request_asset_upload (для каждого файла) → PUT файла → complete_asset_upload Типичный сценарий предзапуска: create_startup (stage=PRELAUNCH, без url) → publish_update (прогресс) → get_waitlist (следить за аудиторией) → announce_launch (когда готово) АУТЕНТИФИКАЦИЯ -------------- API-токен создаётся на странице https://betalist.ru/profile (раздел «API-токены»). Формат: blt_<48 hex-символов>. Передаётся в заголовке: Authorization: Bearer blt_... Все ответы — JSON: {"ok": true, "result": ...} или {"ok": false, "error": "..."}. Базовый URL: https://betalist.ru ДВА СПОСОБА ИНТЕГРАЦИИ ---------------------- A) MCP (рекомендуется для Claude и других LLM-агентов): Endpoint: https://betalist.ru/api/mcp (Streamable HTTP, stateless) Claude Code: claude mcp add betalist https://betalist.ru/api/mcp --transport http \ --header "Authorization: Bearer blt_ВАШ_ТОКЕН" Тулы: create_startup, update_startup, upload_image, list_categories, list_my_startups, publish_update, create_release, request_asset_upload, complete_asset_upload, get_releases, change_startup_stage, announce_launch, get_waitlist, get_store_reviews. B) REST API — методы ниже. МЕТОДЫ REST ----------- GET /api/v1/me Проверка токена. Возвращает id, name, email владельца. GET /api/v1/startups Список ваших стартапов с текущими ссылками на сторы. result: [{slug, name, status, tagline, url, appStoreUrl, testflightUrl, googlePlayUrl, rustoreUrl}] Публикация возможна только при status = "APPROVED". GET /api/v1/categories Публичный список категорий (без токена). result: [{slug, name}]. Используйте slug в create_startup (categorySlug). Можно передать и название — матчинг регистронезависимый; если категория не найдена, стартап создаётся без категории (в ответе будет warning). POST /api/v1/images Загрузить картинку (логотип/скриншот). Тело = сырые байты файла, заголовок Content-Type = тип картинки. Макс. 2 МБ; JPEG/PNG/WebP/GIF. curl -X POST "https://betalist.ru/api/v1/images" -H "$AUTH" \ -H "Content-Type: image/png" --data-binary @icon.png result: {path, url} — используйте url в create_startup. POST /api/v1/startups Создать новый стартап (отправляется на модерацию). | Параметр | Тип | Обяз. | Описание | |--------------|----------|-------|---------------------------------------| | name | string | да | Название | | tagline | string | да | Краткое описание, до 160 символов | | description | string | да | Полное описание, от 50 символов | | url | string | * | URL сайта (обязателен для LAUNCHED) | | stage | string | нет | PRELAUNCH / BETA / LAUNCHED (default) | | targetLaunchDate | string | нет | Ориентировочная дата (YYYY-MM-DD) | | prelaunchAudience| string | нет | Для кого продукт (до 1000 символов) | | prelaunchReady | string | нет | Что уже готово (до 1000 символов) | | prelaunchPromise | string | нет | Что получит записавшийся (до 1000) | | categorySlug | string | нет | Slug категории (см. https://betalist.ru/categories)| | tags | string[] | нет | Теги, до 6 | | logo | string | нет | url логотипа из POST /api/v1/images | | screenshots | string[] | нет | url скриншотов (до 5) из /api/v1/images| | appStoreUrl, testflightUrl, googlePlayUrl, rustoreUrl | string | нет | Ссылки на приложение в сторах (iOS/Android) | result: {slug, url, status}. Картинки принимаются только как url, полученные из POST /api/v1/images (загрузите файлы заранее). Для stage=PRELAUNCH/BETA url необязателен — на странице будет waitlist. PATCH /api/v1/startups/{slug} Обновить свой стартап (в т.ч. добавить ссылки на сторы после публикации приложения). Передавайте только изменяемые поля; пустая строка очищает ссылку. Статус модерации не меняется. | Параметр | Тип | Обяз. | Описание | |--------------|----------|-------|---------------------------------------| | url | string | нет | URL сайта продукта | | tagline | string | нет | Краткое описание, до 160 символов | | description | string | нет | Полное описание, от 50 символов | | categorySlug | string | нет | Slug категории | | tags | string[] | нет | Теги, до 6 | | targetLaunchDate / prelaunchAudience / prelaunchReady / prelaunchPromise — как в POST | | appStoreUrl, testflightUrl, googlePlayUrl, rustoreUrl | string | нет | Ссылки на приложение в сторах (iOS/Android) | result: {slug, url, status, updated: [изменённые поля]}. Стадия через PATCH не меняется — используйте /stage и /launch (ниже). Пример — добавить ссылку на App Store и RuStore: curl -X PATCH "https://betalist.ru/api/v1/startups/my-app" -H "$AUTH" \ -H "Content-Type: application/json" \ -d '{"appStoreUrl":"https://apps.apple.com/app/id000","rustoreUrl":"https://www.rustore.ru/catalog/app/my.app"}' POST /api/v1/startups/{slug}/stage Сменить продуктовую стадию (кроме LAUNCHED — для него /launch). | Параметр | Тип | Обяз. | Описание | |-------------|--------|-------|------------------------------------------| | stage | string | да | PRELAUNCH / BETA / PAUSED | | public_note | string | * | Публичное пояснение (обяз. для PAUSED) | Допустимые переходы: PRELAUNCH→BETA/PAUSED, BETA→PAUSED, PAUSED→PRELAUNCH/BETA. result: {slug, stage}. POST /api/v1/startups/{slug}/launch Объявить официальный запуск: стадия LAUNCHED, публикуется обновление типа LAUNCH, список ожидания получает уведомление (только при первом запуске). Требуется минимум одна рабочая ссылка на продукт. | Параметр | Тип | Обяз. | Описание | |-----------------|---------|-------|-------------------------------------| | url | string | * | Ссылка на продукт (если не задана) | | title | string | да | Заголовок запуска, 3–200 символов | | body | string | да | Описание версии, Markdown | | notify_waitlist | boolean | нет | Уведомить waitlist (default true) | result: {slug, stage, firstLaunch}. GET /api/v1/startups/{slug}/waitlist Сводка списка ожидания вашего стартапа: агрегированные счётчики (active, newPerWeek, newPerMonth, wantsBeta, invited, accepted), активный вопрос с распределением ответов, последние обезличенные ответы и кампании с агрегированной статистикой. Контактные данные участников НЕ возвращаются ни в каком виде. GET /api/v1/startups/{slug}/reviews?page=1 Публичные отзывы Google Play / App Store о вашем стартапе: состояние мониторинга по магазинам (status, lastSuccessAt, publicRating) и отзывы по 20 на страницу (rating, title, body, authorName, territory, reviewCreatedAt, developerResponse). GET /api/v1/startups/{slug}/updates Публичный список обновлений стартапа (без токена). POST /api/v1/startups/{slug}/updates Опубликовать обновление. | Параметр | Тип | Обяз. | Описание | |----------|--------|-------|--------------------------------------------| | title | string | да | Заголовок, 3–200 символов | | body | string | да | Текст в Markdown, 10–20000 символов | | type | string | нет | RELEASE / UPDATE / FIX / NEWS (по умолч.) | | version | string | нет | Версия, например "1.4.0" | GET /api/v1/startups/{slug}/releases Публичный список релизов с файлами и ссылками на скачивание (без токена). POST /api/v1/startups/{slug}/releases Создать релиз. | Параметр | Тип | Обяз. | Описание | |----------|---------|-------|-------------------------------------------------| | version | string | да | Уникальная версия в рамках стартапа | | notes | string | нет | Release notes в Markdown | | announce | boolean | нет | Публиковать ли обновление в ленте (default true)| result: {id, version, ...} — id понадобится для загрузки файлов. POST /api/v1/releases/{release_id}/assets Запросить ссылку для загрузки файла. | Параметр | Тип | Обяз. | Описание | |----------|--------|-------|-------------------------------------------| | platform | string | да | WINDOWS / MACOS / ANDROID / LINUX | | filename | string | да | Имя файла, например "MyApp-1.4.0.dmg" | | size | number | да | Точный размер файла в байтах | | sha256 | string | нет | SHA-256 файла (hex) | result: {assetId, uploadUrl, downloadUrl} Максимальный размер файла: 1 ГБ. uploadUrl действует 1 час. Затем загрузите файл HTTP PUT-запросом (тело = файл): curl -T MyApp-1.4.0.dmg "UPLOAD_URL" POST /api/v1/assets/{asset_id}/complete Подтвердить загрузку. Сервер проверит наличие и размер файла в хранилище. После этого файл появится на странице стартапа и станет доступен по downloadUrl (https://downloads.betalist.ru/...). ПРИМЕР: ПОЛНЫЙ ЦИКЛ РЕЛИЗА (bash) --------------------------------- TOKEN="blt_ВАШ_ТОКЕН" BASE="https://betalist.ru/api/v1" AUTH="Authorization: Bearer $TOKEN" # 1. Создать релиз с анонсом RELEASE_ID=$(curl -s -X POST "$BASE/startups/my-app/releases" \ -H "$AUTH" -H "Content-Type: application/json" \ -d '{"version":"1.4.0","notes":"- Тёмная тема\n- Исправлен крэш при старте"}' \ | jq -r '.result.id') # 2. Запросить загрузку файла FILE="MyApp-1.4.0.dmg" SIZE=$(stat -f%z "$FILE" 2>/dev/null || stat -c%s "$FILE") RESP=$(curl -s -X POST "$BASE/releases/$RELEASE_ID/assets" \ -H "$AUTH" -H "Content-Type: application/json" \ -d "{\"platform\":\"MACOS\",\"filename\":\"$FILE\",\"size\":$SIZE}") UPLOAD_URL=$(echo "$RESP" | jq -r '.result.uploadUrl') ASSET_ID=$(echo "$RESP" | jq -r '.result.assetId') # 3. Загрузить файл напрямую в хранилище curl -T "$FILE" "$UPLOAD_URL" # 4. Подтвердить curl -s -X POST "$BASE/assets/$ASSET_ID/complete" -H "$AUTH" ПРИМЕР: ОПУБЛИКОВАТЬ НОВОСТЬ (python) ------------------------------------- import requests resp = requests.post( "https://betalist.ru/api/v1/startups/my-app/updates", headers={"Authorization": "Bearer blt_ВАШ_ТОКЕН"}, json={ "type": "FIX", "title": "Исправлена синхронизация", "body": "Починили редкую потерю данных при офлайн-синхронизации.", }, ) print(resp.json()) ОГРАНИЧЕНИЯ И ПРАВИЛА --------------------- - Публикация только для собственных стартапов со статусом APPROVED. - Версия релиза уникальна в рамках стартапа (409 при повторе). - Будьте умеренны: лента обновлений видна всем посетителям BetaList.ru, спам ведёт к удалению обновлений и блокировке. - Ошибки: 401 (нет/неверный токен), 403 (не ваш стартап), 404 (не найдено), 409 (конфликт), 422 (неверные параметры). Вопросы: admin@betalist.ru