{"openapi":"3.1.0","info":{"title":"JettonTonGuard","description":"AI-powered safety scanner for TON jetton tokens.","version":"0.1.0"},"paths":{"/auth/nonce":{"post":{"tags":["auth"],"summary":"Post Nonce","description":"Issue a fresh nonce. Bind it into the TON Connect payload.","operationId":"post_nonce_auth_nonce_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NonceResponse"}}}}}}},"/auth/connect":{"post":{"tags":["auth"],"summary":"Post Connect","description":"Verify a ton_proof and issue a session token.","operationId":"post_connect_auth_connect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","description":"Return the current user profile + tier.","operationId":"get_me_auth_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/watchlist":{"get":{"tags":["watchlist"],"summary":"List Watchlist","operationId":"list_watchlist_watchlist_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WatchlistItemOut"},"title":"Response List Watchlist Watchlist Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["watchlist"],"summary":"Add To Watchlist","operationId":"add_to_watchlist_watchlist_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddItemRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistItemOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/watchlist/{address}":{"delete":{"tags":["watchlist"],"summary":"Remove From Watchlist","operationId":"remove_from_watchlist_watchlist__address__delete","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/overview":{"get":{"tags":["admin"],"summary":"Admin Overview","description":"Сводка первой вкладки. Кэш 60с в Redis.\n\nПричина (2026-07-30, жалоба «нажимаю Войти — ничего, потом три минуты\nжду LIVE»): full_overview — это СЕМЬ последовательных агрегатов, среди них\nCOUNT(*) и GROUP BY по всей scan_records (сотни тысяч строк от краулера).\nНа загруженной базе это десятки секунд, и панель всё это время выглядит\nмёртвой. Данные тут не оперативные — минутного кэша достаточно, а кнопка\n«Обновить» ходит с fresh=1 в обход.","operationId":"admin_overview_admin_api_overview_get","parameters":[{"name":"fresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Fresh"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Overview Admin Api Overview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/scammers":{"get":{"tags":["admin"],"summary":"Admin Scammers","operationId":"admin_scammers_admin_api_scammers_get","parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","default":"","title":"Query"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Scammers Admin Api Scammers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/scammer/{address}":{"get":{"tags":["admin"],"summary":"Admin Scammer Detail","operationId":"admin_scammer_detail_admin_api_scammer__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Scammer Detail Admin Api Scammer  Address  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/scammer/{address}/remove":{"post":{"tags":["admin"],"summary":"Admin Scammer Remove","description":"Убрать кошелёк из реестра скамеров (разбор ложного срабатывания).\n\nНужен, потому что ошибочная авто-пометка иначе живёт вечно: 2026-07-21\nжертва airdrop-скама попала в реестр и получала «высокий риск» на своём\nже кошельке. Удаляет ровно одну запись; связанные сканы не трогает.","operationId":"admin_scammer_remove_admin_api_scammer__address__remove_post","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Scammer Remove Admin Api Scammer  Address  Remove Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/funder/{address}":{"get":{"tags":["admin"],"summary":"Admin Funder Detail","description":"The scam-devs/tokens financed by a funder wallet (the «scam farm»).","operationId":"admin_funder_detail_admin_api_funder__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Funder Detail Admin Api Funder  Address  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/funnel":{"get":{"tags":["admin"],"summary":"Admin Funnel","description":"Acquisition funnel by ?start= source: users → scanned → hit limit → paid.","operationId":"admin_funnel_admin_api_funnel_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Funnel Admin Api Funnel Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/trial":{"get":{"tags":["admin"],"summary":"Admin Trial","description":"Когорта Pro-триала: выдано → активны → истекли → купили после триала.","operationId":"admin_trial_admin_api_trial_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Trial Admin Api Trial Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/withdrawals":{"get":{"tags":["admin"],"summary":"Admin Withdrawals","operationId":"admin_withdrawals_admin_api_withdrawals_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Withdrawals Admin Api Withdrawals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/withdrawal/{wid}/sent":{"post":{"tags":["admin"],"summary":"Admin Withdrawal Sent","operationId":"admin_withdrawal_sent_admin_api_withdrawal__wid__sent_post","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"integer","title":"Wid"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_MarkSent"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Withdrawal Sent Admin Api Withdrawal  Wid  Sent Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/withdrawal/{wid}/fail":{"post":{"tags":["admin"],"summary":"Admin Withdrawal Fail","operationId":"admin_withdrawal_fail_admin_api_withdrawal__wid__fail_post","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"integer","title":"Wid"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Withdrawal Fail Admin Api Withdrawal  Wid  Fail Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/account":{"get":{"tags":["admin"],"summary":"Admin Account","description":"Полная карточка аккаунта: не только статус, но и ОТКУДА взялся Pro —\nплатежи, активации промокодов, бонус за канал, рефералка, источник.","operationId":"admin_account_admin_api_account_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","title":"Query"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Account Admin Api Account Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/balance":{"post":{"tags":["admin"],"summary":"Admin Balance","description":"Credit (or debit) a user's referral TON balance. Manual compensation +\ntesting the withdrawal flow without a real referral purchase.","operationId":"admin_balance_admin_api_balance_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_BalanceAdjust"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Balance Admin Api Balance Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/pro":{"post":{"tags":["admin"],"summary":"Admin Pro","operationId":"admin_pro_admin_api_pro_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ProGrant"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Pro Admin Api Pro Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/reports":{"get":{"tags":["admin"],"summary":"Admin Reports","description":"Очередь жалоб, обогащённая (2026-07-30): категории, свежая заметка,\nдата последней жалобы, «в реестре ли уже» — чтобы решение promote/reject\nпринималось из одной таблицы, без ручного копания.","operationId":"admin_reports_admin_api_reports_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Reports Admin Api Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/report/promote":{"post":{"tags":["admin"],"summary":"Admin Report Promote","operationId":"admin_report_promote_admin_api_report_promote_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_Promote"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Report Promote Admin Api Report Promote Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/report/reject":{"post":{"tags":["admin"],"summary":"Admin Report Reject","description":"Отклонить жалобы: ВЕРДИКТ, НЕ УДАЛЕНИЕ (правка Кирилла 2026-07-30).\n\nЖалобы остаются в БД; запоминаем базис «сколько жалобщиков было на момент\nотклонения». Новые жалобщики после отклонения копятся и поднимают адрес\nобратно в очередь с пометкой «+N новых». Реестр не трогаем.","operationId":"admin_report_reject_admin_api_report_reject_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_Promote"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Report Reject Admin Api Report Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/support":{"get":{"tags":["admin"],"summary":"Admin Support","operationId":"admin_support_admin_api_support_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"query","in":"query","required":false,"schema":{"type":"string","default":"","title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Support Admin Api Support Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/support/{tid}/reply":{"post":{"tags":["admin"],"summary":"Admin Support Reply","operationId":"admin_support_reply_admin_api_support__tid__reply_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_SupportReply"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Support Reply Admin Api Support  Tid  Reply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/support/{tid}/close":{"post":{"tags":["admin"],"summary":"Admin Support Close","operationId":"admin_support_close_admin_api_support__tid__close_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Support Close Admin Api Support  Tid  Close Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/pay/ton/create":{"post":{"tags":["billing"],"summary":"Ton Create","description":"Start a TON Pro purchase. The Mini App sends a TON Connect tx to `wallet`\nfor EXACTLY `amount_nano` nanoton. We tag a unique sub-nano amount per payment\nso confirmation can match the incoming tx by exact value — no on-chain comment\nneeded (which would require client-side cell building).","operationId":"ton_create_billing_pay_ton_create_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ton Create Billing Pay Ton Create Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/pay/ton/confirm":{"post":{"tags":["billing"],"summary":"Ton Confirm","description":"Verify the on-chain TON payment by matching memo + amount to the project\nwallet's recent incoming transactions (via TonAPI), then grant Pro.","operationId":"ton_confirm_billing_pay_ton_confirm_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TonConfirm"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ton Confirm Billing Pay Ton Confirm Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/scan/{address}":{"get":{"tags":["billing"],"summary":"Gated Scan","operationId":"gated_scan_billing_scan__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}},{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/guard/chats":{"get":{"tags":["billing"],"summary":"Guard Chats","description":"Чаты юзера под защитой (владелец = кто добавил бота / включил /guard).\nАдмины проекта видят все чаты.","operationId":"guard_chats_billing_guard_chats_get","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Guard Chats Billing Guard Chats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/guard/{chat_id}/toggle":{"post":{"tags":["billing"],"summary":"Guard Toggle","operationId":"guard_toggle_billing_guard__chat_id__toggle_post","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"integer","title":"Chat Id"}},{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardToggle"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Guard Toggle Billing Guard  Chat Id  Toggle Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/guard/upgrade":{"post":{"tags":["billing"],"summary":"Guard Upgrade","description":"v1 Guard+: заявка через поддержку (оплата вручную, лимит ставит админ\n/guardlimit). Self-serve оплата — после подтверждения спроса.","operationId":"guard_upgrade_billing_guard_upgrade_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardUpgrade"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Guard Upgrade Billing Guard Upgrade Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/wallet/{address}/check":{"get":{"tags":["billing"],"summary":"Wallet Check Gated","operationId":"wallet_check_gated_billing_wallet__address__check_get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Wallet Check Gated Billing Wallet  Address  Check Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/pay/stars/link":{"post":{"tags":["billing"],"summary":"Stars Link","description":"Create a Telegram Stars invoice link. The Mini App opens it with\ntg.openInvoice(); the resulting successful_payment is delivered to the BOT,\nwhich grants Pro + credits the referrer (bot/handlers/payments.py).","operationId":"stars_link_billing_pay_stars_link_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Stars Link Billing Pay Stars Link Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/me":{"get":{"tags":["billing"],"summary":"Me","operationId":"me_billing_me_get","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Me Billing Me Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/claim-channel-pro":{"post":{"tags":["billing"],"summary":"Claim Channel Pro","description":"Grant N days of Pro for being subscribed to the project channel — once per\nuser. Verifies REAL membership via Telegram getChatMember (the bot must be an\nadmin of the channel). Stacks on any existing Pro.","operationId":"claim_channel_pro_billing_claim_channel_pro_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Claim Channel Pro Billing Claim Channel Pro Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/referral":{"get":{"tags":["billing"],"summary":"Referral","operationId":"referral_billing_referral_get","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Referral Billing Referral Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/wallet/link":{"post":{"tags":["billing"],"summary":"Wallet Link","operationId":"wallet_link_billing_wallet_link_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletLink"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Wallet Link Billing Wallet Link Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/wallet/unlink":{"post":{"tags":["billing"],"summary":"Wallet Unlink","description":"Clear the linked wallet (user tapped «Отвязать») so /me no longer reports\nit as connected on the next load.","operationId":"wallet_unlink_billing_wallet_unlink_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Wallet Unlink Billing Wallet Unlink Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/report":{"post":{"tags":["billing"],"summary":"Report Token","description":"Принять жалобу. Тот же пайплайн, что у /report в боте: одна жалоба на\n(юзер, токен) — повтор лишь обновляет категорию/заметку, поэтому счётчик\n«разных жалобщиков» не накручивается. Категория обязательна и фолдится в\nфиксированный список — «цена упала» не категория. Никакой автопометки:\nтолько сигнал в очередь админа (порог ≥3 разных жалобщиков).","operationId":"report_token_billing_report_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenReport"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Report Token Billing Report Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/withdraw":{"post":{"tags":["billing"],"summary":"Withdraw","description":"Reserve the available balance and queue a payout. The admin approves it\nwith the inline button in the bot DM → the bot signs + sends from the payout\nwallet (bot/handlers/payouts.py).","operationId":"withdraw_billing_withdraw_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Withdraw Billing Withdraw Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/share/prepare":{"post":{"tags":["billing"],"summary":"Share Prepare","description":"Prepare a shareable PHOTO message (card.png + caption) for the Mini App's\ntg.shareMessage(). Sends the image directly into a chat — no link/OG preview.","operationId":"share_prepare_billing_share_prepare_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharePrepare"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Share Prepare Billing Share Prepare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/share/memeseason":{"post":{"tags":["billing"],"summary":"Share Memeseason","description":"Подготовить ФОТО-сообщение с карточкой индекса для tg.shareMessage().\n\nЗАЧЕМ (2026-07-30, жалоба Кирилла «картинка поделиться не пофикшена»):\nраньше кнопка шарила ССЫЛКУ на /memeseason, а как показать превью, решал\nTelegram — он парсит og:image сам, жёстко кэширует результат по URL и\nвполне мог запомнить страницу ещё до деплоя карточки (или в момент, когда\nиндекс был не готов и card.png честно отдавал 404). Плюс `twitter:card`\nTelegram не читает вовсе — это разметка для Twitter, и ставка на неё была\nошибкой. Здесь мы отправляем САМО изображение, как уже сделано для карточки\nскана: никакого парсера, никакого кэша превью, картинка всегда большая.","operationId":"share_memeseason_billing_share_memeseason_post","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"ru","title":"Lang"}},{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Share Memeseason Billing Share Memeseason Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/promo/redeem":{"post":{"tags":["billing"],"summary":"Promo Redeem","operationId":"promo_redeem_billing_promo_redeem_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoRedeem"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Promo Redeem Billing Promo Redeem Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/admin/promo":{"post":{"tags":["billing"],"summary":"Admin Create Promo","operationId":"admin_create_promo_billing_admin_promo_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Create Promo Billing Admin Promo Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/admin/promo/stats":{"get":{"tags":["billing"],"summary":"Admin Promo Stats","operationId":"admin_promo_stats_billing_admin_promo_stats_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Promo Stats Billing Admin Promo Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/admin/promo/{promo_id}/update":{"post":{"tags":["billing"],"summary":"Admin Update Promo","operationId":"admin_update_promo_billing_admin_promo__promo_id__update_post","parameters":[{"name":"promo_id","in":"path","required":true,"schema":{"type":"integer","title":"Promo Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Update Promo Billing Admin Promo  Promo Id  Update Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/admin/promo/{promo_id}/delete":{"post":{"tags":["billing"],"summary":"Admin Delete Promo","description":"Жёсткое удаление — только если код никто не активировал (FK от\npromo_redemptions). Использованные коды выключай через update(active=false).","operationId":"admin_delete_promo_billing_admin_promo__promo_id__delete_post","parameters":[{"name":"promo_id","in":"path","required":true,"schema":{"type":"integer","title":"Promo Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Delete Promo Billing Admin Promo  Promo Id  Delete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/portfolio":{"get":{"tags":["billing"],"summary":"Portfolio","description":"Read the connected wallet's jettons and score the most valuable ones.","operationId":"portfolio_billing_portfolio_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"type":"string","default":"","title":"Address"}},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}},{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Portfolio Billing Portfolio Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/watchlist":{"get":{"tags":["billing"],"summary":"Watchlist List","operationId":"watchlist_list_billing_watchlist_get","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Watchlist List Billing Watchlist Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["billing"],"summary":"Watchlist Add","operationId":"watchlist_add_billing_watchlist_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Watchlist Add Billing Watchlist Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/watchlist/{address}":{"delete":{"tags":["billing"],"summary":"Watchlist Remove","operationId":"watchlist_remove_billing_watchlist__address__delete","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Watchlist Remove Billing Watchlist  Address  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/watchlist/{address}/alerts":{"post":{"tags":["billing"],"summary":"Watchlist Alerts","operationId":"watchlist_alerts_billing_watchlist__address__alerts_post","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchAlerts"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Watchlist Alerts Billing Watchlist  Address  Alerts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/tasks":{"get":{"tags":["tasks"],"summary":"List Tasks","operationId":"list_tasks_billing_tasks_get","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Tasks Billing Tasks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/tasks/{code}/claim":{"post":{"tags":["tasks"],"summary":"Claim Task","operationId":"claim_task_billing_tasks__code__claim_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Claim Task Billing Tasks  Code  Claim Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/support/ticket":{"post":{"tags":["support"],"summary":"Create Ticket","operationId":"create_ticket_support_ticket_post","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Ticket Support Ticket Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/support/my":{"get":{"tags":["support"],"summary":"My Ticket","operationId":"my_ticket_support_my_get","parameters":[{"name":"X-Telegram-Init-Data","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Init-Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response My Ticket Support My Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/token/{address}":{"get":{"tags":["partner"],"summary":"Partner Token","operationId":"partner_token_v1_token__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Partner Token V1 Token  Address  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/wallet/{address}":{"get":{"tags":["partner"],"summary":"Partner Wallet","operationId":"partner_wallet_v1_wallet__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Partner Wallet V1 Wallet  Address  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Healthz Healthz Get"}}}}}}},"/scan/{address}":{"get":{"summary":"Scan Get","operationId":"scan_get_scan__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"X-Internal-Token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Internal-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scan":{"post":{"summary":"Scan Post","operationId":"scan_post_scan_post","parameters":[{"name":"X-Internal-Token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Internal-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scan/{address}/history":{"get":{"summary":"Scan History","operationId":"scan_history_scan__address__history_get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":30,"title":"Limit"}},{"name":"X-Internal-Token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Internal-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ScanResult"},"title":"Response Scan History Scan  Address  History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wallet/{address}/check":{"get":{"summary":"Wallet Check Internal","description":"Wallet Risk Check (internal rail — bot/tooling). The Mini App uses the\nquota-gated /billing/wallet/{address}/check instead.","operationId":"wallet_check_internal_wallet__address__check_get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"X-Internal-Token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Internal-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Wallet Check Internal Wallet  Address  Check Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/creator/{dev_address}/jettons":{"get":{"summary":"Creator History","description":"v0.8 creator-history view.\n\nReturns every jetton this wallet was top holder of (a proxy for \"deployed\nby this dev\"), plus a rugged-ratio summary. Drives the UI badge \"this dev\ndeployed X tokens, Y of them are flagged scam/rugged\".","operationId":"creator_history_creator__dev_address__jettons_get","parameters":[{"name":"dev_address","in":"path","required":true,"schema":{"type":"string","title":"Dev Address"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-Internal-Token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Internal-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Creator History Creator  Dev Address  Jettons Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AddItemRequest":{"properties":{"address":{"type":"string","maxLength":80,"minLength":48,"title":"Address"},"note":{"type":"string","title":"Note","default":""},"alerts_enabled":{"type":"boolean","title":"Alerts Enabled","default":true}},"type":"object","required":["address"],"title":"AddItemRequest"},"Category":{"type":"string","enum":["contract","liquidity","holders","activity","social"],"title":"Category","description":"The five scoring categories. Weights are defined in scoring.py."},"CategorySubscore":{"properties":{"category":{"$ref":"#/components/schemas/Category"},"subscore":{"type":"integer","title":"Subscore"},"flags":{"items":{"$ref":"#/components/schemas/RiskFlag"},"type":"array","title":"Flags"},"checks_summary":{"type":"string","title":"Checks Summary","default":""}},"type":"object","required":["category","subscore"],"title":"CategorySubscore"},"ConnectRequest":{"properties":{"address":{"type":"string","title":"Address"},"network":{"type":"string","title":"Network","default":"-239"},"public_key":{"type":"string","title":"Public Key","description":"Wallet pubkey (hex)"},"proof":{"additionalProperties":true,"type":"object","title":"Proof"}},"type":"object","required":["address","public_key","proof"],"title":"ConnectRequest"},"ConnectResponse":{"properties":{"token":{"type":"string","title":"Token"},"user":{"$ref":"#/components/schemas/UserInfo"}},"type":"object","required":["token","user"],"title":"ConnectResponse"},"GuardToggle":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"GuardToggle"},"GuardUpgrade":{"properties":{"chat_id":{"type":"integer","title":"Chat Id"}},"type":"object","required":["chat_id"],"title":"GuardUpgrade"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HolderGroup":{"properties":{"label":{"type":"string","title":"Label"},"share":{"type":"number","title":"Share"},"color":{"type":"string","title":"Color"},"sample_addresses":{"items":{"type":"string"},"type":"array","title":"Sample Addresses"}},"type":"object","required":["label","share","color"],"title":"HolderGroup","description":"One slice of the holders donut chart.\n\nHeuristically classifies each holder cluster into a human-readable group\nso the UI doesn't have to render raw wallet addresses."},"IconFallback":{"properties":{"text":{"type":"string","title":"Text"},"bg_color":{"type":"string","title":"Bg Color"},"fg_color":{"type":"string","title":"Fg Color","default":"#FFFFFF"}},"type":"object","required":["text","bg_color"],"title":"IconFallback","description":"Generated avatar for jettons with no image_url.\n\nFrontend uses this as a 1-letter monogram with a deterministic color."},"JettonInfo":{"properties":{"address":{"type":"string","title":"Address"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"},"decimals":{"type":"integer","title":"Decimals","default":9},"total_supply":{"type":"integer","title":"Total Supply","default":0},"mintable":{"type":"boolean","title":"Mintable","default":false},"admin_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Address"},"deploy_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deploy Address"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"code_boc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Boc"},"code_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Hash"},"verification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verification"},"holders_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Holders Count"},"socials":{"items":{"type":"string"},"type":"array","title":"Socials"},"websites":{"items":{"type":"string"},"type":"array","title":"Websites"},"interfaces":{"items":{"type":"string"},"type":"array","title":"Interfaces"}},"type":"object","required":["address"],"title":"JettonInfo","description":"Basic on-chain metadata about a jetton master contract."},"NonceResponse":{"properties":{"nonce":{"type":"string","title":"Nonce"}},"type":"object","required":["nonce"],"title":"NonceResponse"},"PromoCreate":{"properties":{"code":{"type":"string","maxLength":32,"minLength":2,"title":"Code"},"reward_days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Reward Days","default":7},"max_uses":{"type":"integer","maximum":100000.0,"minimum":1.0,"title":"Max Uses","default":20},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"valid_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Valid Days","description":"Days from now until expiry"},"owner_ref_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Ref Code","description":"Partner ref_code to credit"}},"type":"object","required":["code"],"title":"PromoCreate"},"PromoRedeem":{"properties":{"code":{"type":"string","maxLength":32,"minLength":2,"title":"Code"}},"type":"object","required":["code"],"title":"PromoRedeem"},"PromoUpdate":{"properties":{"reward_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Reward Days"},"max_uses":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":1.0},{"type":"null"}],"title":"Max Uses"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"valid_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":0.0},{"type":"null"}],"title":"Valid Days"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}},"type":"object","title":"PromoUpdate","description":"Частичное редактирование: None = поле не трогаем.\n\nvalid_days: 0 = сделать бессрочным, N>0 = действует N дней от «сейчас».\nactive: False = выключить (valid_until ставится в прошлое — redeem отвечает\n«истёк»), True = включить обратно (снимает истёкший срок)."},"RiskFlag":{"properties":{"category":{"$ref":"#/components/schemas/Category"},"code":{"type":"string","title":"Code"},"title":{"type":"string","title":"Title"},"severity":{"$ref":"#/components/schemas/Severity"},"impact":{"type":"integer","title":"Impact"},"explanation":{"type":"string","title":"Explanation"},"evidence":{"additionalProperties":true,"type":"object","title":"Evidence"}},"type":"object","required":["category","code","title","severity","impact","explanation"],"title":"RiskFlag"},"ScanRequest":{"properties":{"address":{"type":"string","title":"Address","description":"Jetton master contract address (EQ...)"},"bypass_cache":{"type":"boolean","title":"Bypass Cache","description":"Force re-scan instead of cached result","default":false}},"type":"object","required":["address"],"title":"ScanRequest"},"ScanResult":{"properties":{"address":{"type":"string","title":"Address"},"jetton":{"$ref":"#/components/schemas/JettonInfo"},"scanned_at":{"type":"string","format":"date-time","title":"Scanned At"},"score":{"type":"integer","title":"Score"},"verdict":{"$ref":"#/components/schemas/Verdict"},"verdict_text":{"type":"string","title":"Verdict Text","default":""},"subscores":{"items":{"$ref":"#/components/schemas/CategorySubscore"},"type":"array","title":"Subscores"},"top_flags":{"items":{"$ref":"#/components/schemas/RiskFlag"},"type":"array","title":"Top Flags"},"summary":{"type":"string","title":"Summary","default":""},"metrics":{"$ref":"#/components/schemas/TokenMetrics"},"holders_breakdown":{"items":{"$ref":"#/components/schemas/HolderGroup"},"type":"array","title":"Holders Breakdown"},"volume_7d":{"items":{"type":"number"},"type":"array","title":"Volume 7D"},"icon_fallback":{"anyOf":[{"$ref":"#/components/schemas/IconFallback"},{"type":"null"}]},"duration_ms":{"type":"integer","title":"Duration Ms","default":0},"risk_points":{"type":"integer","title":"Risk Points","default":0},"rugged":{"type":"boolean","title":"Rugged","default":false},"rugged_reason":{"type":"string","title":"Rugged Reason","default":""},"dev_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dev Address"}},"type":"object","required":["address","jetton","scanned_at","score","verdict","subscores"],"title":"ScanResult","description":"Top-level object returned from /scan.\n\nThis is what the web frontend and Telegram bot render. Keep additions\nbackwards-compatible (add new optional fields, never remove existing)."},"Severity":{"type":"string","enum":["info","positive","low","medium","high","critical"],"title":"Severity","description":"Severity of an individual risk flag. Affects score impact."},"SharePrepare":{"properties":{"address":{"type":"string","title":"Address"},"score":{"type":"integer","title":"Score","default":0},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"}},"type":"object","required":["address"],"title":"SharePrepare"},"TicketIn":{"properties":{"text":{"type":"string","maxLength":1000,"minLength":2,"title":"Text"}},"type":"object","required":["text"],"title":"TicketIn"},"TokenMetrics":{"properties":{"market_cap_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Cap Usd"},"price_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Usd"},"liquidity_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Liquidity Usd"},"holders_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Holders Count"},"age_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Seconds"},"first_tx_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Tx At"},"change_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change 24H"}},"type":"object","title":"TokenMetrics","description":"Top-line numbers shown in the result page header.\n\nAll money values in USD. `None` means we couldn't compute it (e.g. no\nDEX pool gives a reliable price). The frontend should hide null fields\nrather than render \"$0\"."},"TokenReport":{"properties":{"address":{"type":"string","maxLength":80,"minLength":40,"title":"Address"},"category":{"type":"string","maxLength":30,"title":"Category"},"note":{"type":"string","maxLength":300,"title":"Note","default":""}},"type":"object","required":["address","category"],"title":"TokenReport","description":"Жалоба на токен из Mini App (2026-07-30, идея Кирилла: в боте /report\nесть, но никто о нём не знает — нужен видимый вход в приложении)."},"TonConfirm":{"properties":{"payment_id":{"type":"integer","title":"Payment Id"}},"type":"object","required":["payment_id"],"title":"TonConfirm"},"UserInfo":{"properties":{"address":{"type":"string","title":"Address"},"tier":{"type":"string","title":"Tier"},"watchlist_count":{"type":"integer","title":"Watchlist Count"},"is_pro":{"type":"boolean","title":"Is Pro"}},"type":"object","required":["address","tier","watchlist_count","is_pro"],"title":"UserInfo"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"Verdict":{"type":"string","enum":["safe","caution","high_risk","likely_rug"],"title":"Verdict","description":"Final classification shown to the user."},"WalletLink":{"properties":{"wallet_address":{"type":"string","maxLength":80,"minLength":40,"title":"Wallet Address"}},"type":"object","required":["wallet_address"],"title":"WalletLink"},"WatchAdd":{"properties":{"address":{"type":"string","maxLength":80,"minLength":40,"title":"Address"}},"type":"object","required":["address"],"title":"WatchAdd"},"WatchAlerts":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","title":"WatchAlerts"},"WatchlistItemOut":{"properties":{"address":{"type":"string","title":"Address"},"note":{"type":"string","title":"Note"},"alerts_enabled":{"type":"boolean","title":"Alerts Enabled"},"added_at":{"type":"string","format":"date-time","title":"Added At"}},"type":"object","required":["address","note","alerts_enabled","added_at"],"title":"WatchlistItemOut"},"WithdrawReq":{"properties":{"to_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Address"}},"type":"object","title":"WithdrawReq"},"_BalanceAdjust":{"properties":{"query":{"type":"string","title":"Query"},"amount_ton":{"type":"number","title":"Amount Ton"}},"type":"object","required":["query","amount_ton"],"title":"_BalanceAdjust"},"_MarkSent":{"properties":{"tx_hash":{"type":"string","title":"Tx Hash"}},"type":"object","required":["tx_hash"],"title":"_MarkSent"},"_ProGrant":{"properties":{"query":{"type":"string","title":"Query"},"days":{"type":"integer","title":"Days"}},"type":"object","required":["query","days"],"title":"_ProGrant"},"_Promote":{"properties":{"address":{"type":"string","title":"Address"}},"type":"object","required":["address"],"title":"_Promote"},"_SupportReply":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"_SupportReply"}}}}