---
title: "Add Custom Button"
method: POST
path: "/menu-layout/buttons"
tags: ["menu-layout"]
---

# Add Custom Button

`POST /menu-layout/buttons`

## Request

- The document declares no server URL.
- Auth: API key in header `X-API-Key`
- TypeScript: <https://skmtc.dev/bedolagam/apis/remnawave-bot-admin-api/docs/menu-layout/buttons/post.ts> (a function with typed inputs; its response is checked against the schema)

Добавить кастомную кнопку (URL, MiniApp или callback).

## Request body

- AddCustomButtonRequest: Запрос на добавление кастомной кнопки.
  - `id` string, required: ID кнопки (уникальный)
  - `type` 'builtin' | 'url' | 'mini_app' | 'callback', required: Тип кнопки меню.
  - `text` object, required: Локализованные тексты
  - `icon` string, nullable: Эмодзи/иконка кнопки
  - `action` string, required: URL или callback_data
  - `visibility` 'all' | 'admins' | 'moderators' | 'subscribers': Видимость кнопки.
  - `conditions` ButtonConditions: Условия показа кнопки.
    - `has_active_subscription` boolean, nullable: Требуется активная подписка
    - `subscription_is_active` boolean, nullable: Подписка должна быть активна (не приостановлена)
    - `has_traffic_limit` boolean, nullable: Подписка с лимитом трафика
    - `is_admin` boolean, nullable: Пользователь - админ
    - `is_moderator` boolean, nullable: Пользователь - модератор
    - `referral_enabled` boolean, nullable: Реферальная программа включена
    - `contests_visible` boolean, nullable: Конкурсы видимы
    - `support_enabled` boolean, nullable: Поддержка включена
    - `language_selection_enabled` boolean, nullable: Выбор языка включен
    - `happ_enabled` boolean, nullable: Кнопка Happ включена
    - `simple_subscription_enabled` boolean, nullable: Простая подписка включена
    - `show_trial` boolean, nullable: Показать пробный период
    - `show_buy` boolean, nullable: Показать кнопку покупки
    - `has_saved_cart` boolean, nullable: Есть сохраненная корзина
    - `min_balance_kopeks` integer, nullable: Минимальный баланс в копейках
    - `max_balance_kopeks` integer, nullable: Максимальный баланс в копейках
    - `min_registration_days` integer, nullable: Минимум дней с регистрации
    - `max_registration_days` integer, nullable: Максимум дней с регистрации
    - `min_referrals` integer, nullable: Минимальное количество рефералов
    - `has_referrals` boolean, nullable: Есть рефералы
    - `promo_group_ids` string[], nullable: Список ID промо-групп (пользователь должен быть в одной из них)
    - `exclude_promo_group_ids` string[], nullable: Исключить пользователей из этих промо-групп
    - `has_subscription_days_left` integer, nullable: Минимум дней до окончания подписки
    - `max_subscription_days_left` integer, nullable: Максимум дней до окончания подписки
    - `is_trial_user` boolean, nullable: Пользователь на пробном периоде
    - `has_autopay` boolean, nullable: Автоплатёж включён
  - `dynamic_text` boolean: Текст содержит плейсхолдеры
  - `row_id` string, nullable: ID строки для добавления кнопки
  - `description` string, nullable: Описание кнопки для админ-панели

## Response `201`

Successful Response

- MenuButtonConfig: Конфигурация отдельной кнопки.
  - `type` 'builtin' | 'url' | 'mini_app' | 'callback', required: Тип кнопки меню.
  - `builtin_id` string, nullable: ID встроенной кнопки (для type=builtin)
  - `text` object, required: Локализованные тексты кнопки: {lang_code: text}
  - `icon` string, nullable: Эмодзи/иконка кнопки (отдельно от текста)
  - `action` string, required: callback_data или URL в зависимости от типа
  - `enabled` boolean: Кнопка активна
  - `visibility` 'all' | 'admins' | 'moderators' | 'subscribers': Видимость кнопки.
  - `conditions` ButtonConditions: Условия показа кнопки.
    - `has_active_subscription` boolean, nullable: Требуется активная подписка
    - `subscription_is_active` boolean, nullable: Подписка должна быть активна (не приостановлена)
    - `has_traffic_limit` boolean, nullable: Подписка с лимитом трафика
    - `is_admin` boolean, nullable: Пользователь - админ
    - `is_moderator` boolean, nullable: Пользователь - модератор
    - `referral_enabled` boolean, nullable: Реферальная программа включена
    - `contests_visible` boolean, nullable: Конкурсы видимы
    - `support_enabled` boolean, nullable: Поддержка включена
    - `language_selection_enabled` boolean, nullable: Выбор языка включен
    - `happ_enabled` boolean, nullable: Кнопка Happ включена
    - `simple_subscription_enabled` boolean, nullable: Простая подписка включена
    - `show_trial` boolean, nullable: Показать пробный период
    - `show_buy` boolean, nullable: Показать кнопку покупки
    - `has_saved_cart` boolean, nullable: Есть сохраненная корзина
    - `min_balance_kopeks` integer, nullable: Минимальный баланс в копейках
    - `max_balance_kopeks` integer, nullable: Максимальный баланс в копейках
    - `min_registration_days` integer, nullable: Минимум дней с регистрации
    - `max_registration_days` integer, nullable: Максимум дней с регистрации
    - `min_referrals` integer, nullable: Минимальное количество рефералов
    - `has_referrals` boolean, nullable: Есть рефералы
    - `promo_group_ids` string[], nullable: Список ID промо-групп (пользователь должен быть в одной из них)
    - `exclude_promo_group_ids` string[], nullable: Исключить пользователей из этих промо-групп
    - `has_subscription_days_left` integer, nullable: Минимум дней до окончания подписки
    - `max_subscription_days_left` integer, nullable: Максимум дней до окончания подписки
    - `is_trial_user` boolean, nullable: Пользователь на пробном периоде
    - `has_autopay` boolean, nullable: Автоплатёж включён
  - `dynamic_text` boolean: Текст содержит плейсхолдеры ({balance}, {username} и т.д.)
  - `open_mode` 'callback' | 'direct': Режим открытия кнопки.
  - `webapp_url` string, nullable: URL для Mini App при open_mode=direct
  - `description` string, nullable: Описание кнопки для админ-панели
  - `sort_order` integer, nullable: Порядок сортировки (для отображения в админке)

## Other responses

- `422`: Validation Error

## Changes

- **2026-11-03** `2360876ff9c5`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/bedolagam/apis/remnawave-bot-admin-api/changes/menu-layout/buttons/post.md)

---

[API](https://skmtc.dev/bedolagam/apis/remnawave-bot-admin-api.md) - [All operations](https://skmtc.dev/bedolagam/apis/remnawave-bot-admin-api/llms.txt) - [OpenAPI document](https://skmtc.dev/bedolagam/apis/remnawave-bot-admin-api/revisions/2360876ff9c5?raw)
