---
title: "Validate Menu Layout"
method: POST
path: "/menu-layout/validate"
tags: ["menu-layout"]
---

# Validate Menu Layout

`POST /menu-layout/validate`

## 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/validate/post.ts> (a function with typed inputs; its response is checked against the schema)

Валидировать конфигурацию меню без сохранения.

## Request body

- MenuLayoutValidateRequest: Запрос на валидацию конфигурации.
  - `rows` MenuRowConfig[], nullable
    - `id` string, required: Уникальный ID строки
    - `buttons` string[], required: Список ID кнопок в строке
    - `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: Автоплатёж включён
    - `max_per_row` integer: Максимум кнопок в строке
  - `buttons` object, nullable

## Response `200`

Successful Response

- MenuLayoutValidateResponse: Результат валидации.
  - `is_valid` boolean, required
  - `errors` ValidationError[]
    - `loc` union[], required
      - union
        - string
        - integer
    - `msg` string, required
    - `type` string, required
    - `input` unknown
    - `ctx` object
  - `warnings` ValidationError[]
    - `loc` union[], required
      - union
        - string
        - integer
    - `msg` string, required
    - `type` string, required
    - `input` unknown
    - `ctx` object

## 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/validate/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)
