---
name: avtero_access_gate
description: avtero доступ — АКТУАЛЬНО v0.8.3 (2026-06-25): функционал ТОЛЬКО после авторизации (аноним→401, лендинг открыт) + бета-квота 3 отчёта/день на аккаунт (сброс по дате, /api/quota). Раньше: admin-approved стена (снята v0.9), затем «open trial» (тоже снят). Текущая модель — auth+квота
metadata: 
  node_type: memory
  type: project
  originSessionId: 4eea915e-3b47-4cd5-8a0e-bfa29b78a87c
---

**ОБНОВЛЕНО v0.9.x (2026-06-26, avtero `010fdd0`, web `c0e56d1`+`/admin`):** появились (1) **серверная история** по аккаунту — добавлена колонка `request.account_id` (миграция в `_NEW_REQUEST_COLS`+индекс, `_log_request_row` пишет её во всех 4 путях), `GET /api/history` (кабинет, синхронна между TG/почтой); (2) **реальный кабинет** на фронте (иконка-человечек → кабинет: имя/способы входа/лимит/история/push; футер — `POST /api/feedback`+`web_feedback`); (3) **guarded-админка** `/admin` + `/api/admin/{me,overview,users,users/{id}/history,feedback,feedback/{id}/read}` за `_is_pk_admin` (tg_id ∈ env `BOT_ADMIN_USER_IDS`, сейчас 1005954706) — аноним→403, не-админ→«только для администраторов» (Playwright-проверено). БД локальная `data/app.db` (env SQLITE_PATH), rclone-бэкап. См. [[kodoceh_web_overview]].

**АКТУАЛЬНАЯ МОДЕЛЬ (v0.8.3, 2026-06-25, avtero `ca502d6`/`857e63a`, web `a047594`):** функционал (подбор) ТОЛЬКО после авторизации — `/api/ask` и `/api/ask_async` отдают **401 `auth_required`** анониму (лендинг `/` открыт). Авторизованный получает **бета-квоту BETA_DAILY_LIMIT=3 отчёта/сутки на account_id** (таблица `account_daily_usage(account_id, day, count)`, сброс по календарной дате; `_daily_used`/`_daily_consume`/`_quota_dto`; consume ПОСЛЕ preflight-гейта, чтобы needs_confirmation не жёг квоту; ≥лимита → 429 `daily_exceeded`). `GET /api/quota` → {used,limit,remaining}; `_meta` отчёта несёт счётчик (ключи trial_used/remaining/limit переиспользованы). **Бот (`_bot_authed`) — без лимита.** Trial по IP+cookie (Redis) для анона больше НЕ используется (аноним просто 401). `/api/me/name` пишет имя из онбординга в `account.display_name`. Env `AVTERO_DAILY_LIMIT`. Старые модели (admin-approved стена, потом open-trial) ниже — НЕ актуальны.

**Сайт avtero закрыт: пользоваться может только пользователь, одобренный админом (v0.7.18, коммит eac671e, 2026-06-22).** Белый список — ТОТ ЖЕ, что у бота (`users.access_status` в bot.db; машинерия `has_access`/`approve_user_access`/`_notify_admins_new_user`/`access_decision_keyboard` была построена раньше). Раньше web-login пускал ЛЮБОГО TG-юзера (был намеренно отделён от одобрения бота) + аноним работал по trial — это и закрыли.

**Поток:** web-login (`bot/handlers/start.py:_handle_web_login`) проверяет `has_access()`. Одобрен → `/api/auth/telegram/confirm approved=true` → подписанная cookie-сессия (30 дней). Не одобрен → `confirm approved=false` (`webauth.deny_login` → токен `denied`), бот отвечает «закрытый режим, заявка отправлена администратору», уведомляет админов один раз. Админы = `BOT_ADMIN_USER_IDS` (сейчас только `1005954706`; тест-аккаунт `8688355181` НЕ админ, но в bot.db approved). API: `ask_async`/`ocr_identity`/`resolve_plate` требуют валидную сессию → иначе **401 `auth_required`**. Фронт: форма скрыта за `#authGate` («Доступ по приглашению», `body.locked`) пока не вошёл; poll обрабатывает `denied`.

**ВАЖНО — бот ходит в API через HTTP (`bot/services/avtero_client.py`), НЕ in-process.** Гейт v0.7.18 сломал бота (на каждый VIN `401 auth_required`). Фикс v0.7.20 (коммит a63f82e): бот шлёт доверенный заголовок `X-Bot-Auth` = `webauth.internal_sig()` (HMAC host-only `data/auth_secret`, "bot-internal") на все вызовы; `main._bot_authed(request)` пускает в обход веб-сессии. **Не сломать снова:** любой новый гейт на API-эндпоинтах ДОЛЖЕН пускать `_bot_authed(request)`, иначе бот ляжет. Анонимный веб — по-прежнему 401.

**ОБНОВЛЕНО 2026-06-25 (v0.9, «дать попробовать», коммиты avtero 7f000f7 / kodoceh-web 40be74f):** жалоба юзера — «зашёл и сразу уперся в разрешение». Стена СНЯТА: `/api/auth/telegram/confirm` теперь `confirm_login` для ВСЕХ (и неодобренных), `deny_login` больше не зовётся — вход выдаёт сессию всем (пробный режим). Бот неодобренному отвечает «вход выполнен, пробный режим» + уведомляет админа (вместо «заявка отправлена»). Фронт `apps/avtero/app/app` пускает АНОНИМА сразу в Home → «Новый подбор» (подбор работает анонимно по trial по IP+cookie, `/api/ask` сессию НЕ требует — это не менялось), вход опционален внизу. Шапка витрины: CTA «Попробовать». Полный доступ по-прежнему = одобрение (open для пробы, гейт/тариф «потом»). NB: `TRIAL_LIMIT` фактически снят (999999) — реального «потом гейт» пока нет, при желании выставить лимит для неодобренных. Старое поведение (стена) описано ниже — больше НЕ актуально.

**Граница (историческое, до v0.9):** API-гейт = «есть сессия ИЛИ доверенный бот» (веб-сессии выдаются только одобренным). Отзыв доступа НЕ действует на уже выданную 30-дневную сессию до истечения cookie — для мгновенной отзываемости нужен live re-check `access_status` из bot.db в гейте API (bot.db read-only из API уже есть для уроков). Проверено живым tg-web-e2e (оба пути). См. [[avtero_overview]], [[avtero_public_site]], [[avtero_feedback_learning]].
