REST V1 APP — API для мобильных приложений

RestV1APP — это REST API специально для мобильных приложений и фронтенда. Возвращает агрегированные данные, готовые к отображению на экране.

V1 APP — бизнес-ориентированные endpoints (getHome, postCart, placeOrder).

14.07.2026

REST V1 APP - API для мобильных приложений

RestV1APP — это REST API специально для мобильных приложений и фронтенда. Возвращает агрегированные данные, готовые к отображению на экране.

Сравнение подходов APP и M2M RestV1M2M:

  • V1 APP — бизнес-ориентированные endpoints (getHome, postCart, placeOrder)
  • V1 M2M — универсальный CRUD для любых таблиц

Общая архитектура REST: REST Architecture (авторизация, конфиг, валидация).

Endpoints RestV1APP

Endpoint Метод Описание Требует Auth
/rest/v1/home GET Главный экран (слайды, категории, новости, товары, избранное, заказы) Опционально
/rest/v1/goods GET Каталог товаров с фильтрами и поиском Нет
/rest/v1/goods.item GET Один товар (название, цена, описание, изображения) Нет
/rest/v1/goods.categories GET Категории товаров Нет
/rest/v1/goods.filters GET Доступные свойства-фильтры для списка товаров Нет
/rest/v1/goods.favorites GET Избранные товары текущего пользователя Да
/rest/v1/orders GET Заказы пользователя по статусам Да
/rest/v1/orders.item GET Один заказ Да
/rest/v1/orders.messages GET Сообщения по заказу Да
/rest/v1/news GET Новости с пагинацией Нет
/rest/v1/news.item GET Одна новость Нет
/rest/v1/slides GET Активные слайды Нет
/rest/v1/cart GET Корзина пользователя с позициями и итогами Да
/rest/v1/cart.metrics GET Счётчики: количество позиций, их id Опционально
/rest/v1/cart.checkout GET Полные данные оформления (города, доставки, платежи) Да
/rest/v1/cart.city GET Поиск городов по строке ?q= (мин. 2 символа) Да
/rest/v1/cart.delivery GET Способы доставки для города ?citiesId= Да
/rest/v1/profile GET Профиль пользователя Да
/rest/v1/profile.settings GET Настройки приложения пользователя Да
/rest/v1/auth.login POST Аутентификация (access + refresh токены) Нет
/rest/v1/auth.refresh POST Обновление access-токена Нет
/rest/v1/auth.confirm POST Подтверждение входа по коду (режим CONFIRM_AUTH) Нет
/rest/v1/auth.logout POST Завершение сессии Да
/rest/v1/register POST Инициация регистрации (письмо с подтверждением) Нет
/rest/v1/register.confirm POST Завершение регистрации по токену Нет
/rest/v1/profile.password-reset POST Запрос восстановления пароля Нет
/rest/v1/cart POST Добавить товар в корзину Да
/rest/v1/cart.placeOrder POST Создать заказ Да
/rest/v1/orders.messages POST Добавить сообщение к заказу Да
/rest/v1/goods POST Создать товар(ы) (batch, роль 1-2) Да (роль)
/rest/v1/cart PUT Обновить количество / активность товара Да
/rest/v1/cart.city PUT Выбрать город доставки (шаг 1) Да
/rest/v1/cart.delivery PUT Выбрать способ доставки (шаг 2) Да
/rest/v1/cart.deliveryOperations PUT Сохранить параметры доставки (ПВЗ, адрес) Да
/rest/v1/cart.payment PUT Выбрать способ оплаты Да
/rest/v1/profile PUT Обновить ФИО и адрес Да
/rest/v1/profile.email PUT Смена email (2 шага) Да
/rest/v1/profile.phone PUT Смена телефона (2 шага) Да
/rest/v1/profile.settings PUT Обновить настройки приложения Да
/rest/v1/profile.password PUT Смена пароля (2 шага) Да
/rest/v1/orders.status PUT Обновить статус заказа (роль 1-2) Да (роль)
/rest/v1/goods PUT Обновить товар (роль 1-2) Да (роль)
/rest/v1/cart DELETE Удалить позицию(и) из корзины (?id= или {"ids": [...]}) Да
/rest/v1/goods DELETE Удалить товар (?id= или {"ids": [...]}, роль 1-2) Да (роль)
/rest/v1/orders DELETE Отменить заказ(ы) (?id= или {"ids": [...]}) Да
/rest/v1/profile DELETE Удалить аккаунт (2 шага: «УДАЛИТЬ» → код) Да

Примеры использования REST API

Checkout Flow (полный цикл оформления заказа)

Типичный сценарий: пользователь добавляет товары в корзину и оформляет заказ с доставкой ПВЗ CDEK.

Шаг 1️⃣: Добавить товары в корзину

POST /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "id": "325",
    "quantity": 2
  }
}

Response (200 OK):
{
  "status": 200,
  "message": "Cart updated",
  "data": {
    "items": [
      { "id": "325", "qu": 2, "ac": 1 }
    ],
    "sum": 5000,
    "quantityActive": 2
  }
}

Response (404 Not Found - товар не существует):
{
  "status": 404,
  "message": "Product not found",
  "data": null
}

Что делать если 404?

  • Товар был удалён из каталога
  • Ошибка в ID товара
  • Предложить пользователю выбрать другой товар

💡 Формат id: "325" — обычный товар, "325-555" — товар с вариацией (товар-вариация). quantity по умолчанию 1. Повторный POST с тем же id увеличивает количество в существующей позиции.

Шаг 2️⃣: Получить список городов доставки

GET /rest/v1/cart.checkout HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response (200 OK):
{
  "status": 200,
  "message": "OK",
  "data": {
    "items": [{ "id": "325", "qu": 2, "ac": 1 }],
    "sum": 5000,
    "city": { "id": 8, "title": "Москва" },
    "delivery": [
      { "id": 1, "name": "CDEK", "price": 299, "days": 3 },
      { "id": 2, "name": "Яндекс Доставка", "price": 199, "days": 1 }
    ],
    "deliveryActive": "0",
    "deliveryOperations": [],
    "payments": [],
    "paymentsActive": "0"
  }
}

Из ответа видно:

  • city — текущий город (если установлен)
  • delivery — доступные методы доставки
  • deliveryActive: "0" — доставка не выбрана

💡 Важно: список доставок (delivery) появляется только после выбора города через PUT /rest/v1/cart.city (шаг 1b ниже). Если город не задан — delivery будет пустым.

Шаг 3️⃣: Выбрать способ доставки (например, CDEK)

PUT /rest/v1/cart.delivery HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "deliveryId": "1"
  }
}

Response (200 OK):
{
  "status": 200,
  "message": "OK",
  "data": {
    "delivery": [
      { "id": 1, "name": "CDEK", "price": 299 }
    ],
    "deliveryActive": "1",
    "deliveryOperations": [
      {
        "id": "136",
        "tariff": "ПВЗ",
        "allowOrderBtn": false,
        "list": [
          { "id": "12345", "title": "ПВЗ №12345 на ул. Примерная, 1" },
          { "id": "12346", "title": "ПВЗ №12346 на пр. Ленина, 5" }
        ]
      }
    ],
    "payments": [
      { "id": 1, "name": "Карта", "description": "Банковская карта" }
    ],
    "paymentsActive": "0"
  }
}

Из ответа видно:

  • deliveryActive: "1" — доставка выбрана
  • deliveryOperations[0].allowOrderBtn = falseнельзя оформить заказ пока не выберешь ПВЗ
  • list — доступные ПВЗ для выбранной доставки

Шаг 4️⃣: Выбрать ПВЗ (сохранить параметры доставки)

PUT /rest/v1/cart.deliveryOperations HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "operations-id": "12345",
    "operations-title": "ПВЗ №12345",
    "operations-city": "Москва",
    "operations-address-short": "ул. Примерная, 1",
    "operations-postal-code": "109012"
  }
}

Response (200 OK):
{
  "status": 200,
  "message": "OK",
  "data": null
}

Response (400 Validation Error):
{
  "status": 400,
  "message": "Validation errors",
  "data": {
    "operations-id": "Не заполнено",
    "operations-address-short": "Не заполнено"
  }
}

Если 400:

  • Не все обязательные поля заполнены
  • Исправить ошибки и отправить заново

Шаг 5️⃣: Проверить что allowOrderBtn = true

GET /rest/v1/cart.checkout HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response (200 OK):
{
  "status": 200,
  "message": "OK",
  "data": {
    ...
    "deliveryOperations": [
      {
        "id": "136",
        "tariff": "ПВЗ",
        "allowOrderBtn": true,  // ✅ ТЕПЕРЬ МОЖНО ОФОРМИТЬ ЗАКАЗ
        "list": [...]
      }
    ],
    "paymentsActive": "1"
  }
}

Важно:

  • allowOrderBtn: true — все параметры доставки заполнены, можно оформлять заказ
  • paymentsActive: "1" — способ оплаты выбран

Шаг 6️⃣: Оформить заказ

POST /rest/v1/cart.placeOrder HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {}
}

Response (200 OK):
{
  "status": 200,
  "message": "Order created",
  "data": {
    "id": 5001,
    "sum": 2999,
    "status": 1,
    "odate": "2026-05-03 15:30:00"
  }
}

Response (400 Missing Delivery):
{
  "status": 400,
  "message": "Delivery method not selected",
  "data": null
}

Response (400 Validation Error):
{
  "status": 400,
  "message": "Validation error",
  "data": {
    "operations-id": "Не заполнено"
  }
}

Если ошибка:

  • Вернуться на шаги 3-5 и заполнить недостающие данные
  • Попробовать оформить заказ заново

Дополнительные сценарии

Сценарий: Изменить количество товара

PUT /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "id": "325",
    "quantity": 5,
    "active": 1
  }
}

Response:
{
  "status": 200,
  "message": "Cart updated",
  "data": {
    "items": [
      { "id": "325", "qu": 5, "ac": 1 }
    ],
    "sum": 12500
  }
}

Сценарий: Временно отключить товар (не удалять)

PUT /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "id": "325",
    "quantity": 5,
    "active": 0
  }
}

Response:
{
  "status": 200,
  "message": "Cart updated",
  "data": {
    "items": [
      { "id": "325", "qu": 5, "ac": 0 }
    ],
    "sum": 0,
    "quantityActive": 0
  }
}

Результат:

  • Товар остаётся в корзине (ac: 0 = отключен)
  • sum: 0 — товар не учитывается в сумме
  • Пользователь может включить обратно (active: 1)

Сценарий: Удалить товар из корзины

DELETE /rest/v1/cart?id=325 HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response:
{
  "status": 200,
  "message": "Item removed",
  "data": {
    "items": [],
    "sum": 0,
    "quantityActive": 0
  }
}

Сценарий: Удалить несколько позиций (batch)

DELETE /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "ids": ["325", "325-555"]
}

Сценарий: Добавить товар с вариацией

POST /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "id": "325-555",
    "quantity": 1
  }
}

Response (200 OK):
{
  "status": 200,
  "message": "Cart updated",
  "data": {
    "items": [
      { "id": "325-555", "qu": 1, "ac": 1 }
    ],
    "sum": 2500
  }
}

Response (404 Variation Not Found):
{
  "status": 404,
  "message": "Variation not found",
  "data": null
}

Сценарий: Получить метрики корзины (простая версия)

GET /rest/v1/cart.metrics HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response:
{
  "status": 200,
  "message": "OK",
  "data": {
    "count": 3,
    "quantityActive": 3,
    "sum": 5000,
    "items": [
      { "id": "325", "qu": 2, "ac": 1 },
      { "id": "200", "qu": 1, "ac": 1 }
    ]
  }
}

💡 cart.metrics работает как для авторизованных, так и для анонимных пользователей (auth_optional). Если токен не передан — возвращаются метрики пустой корзины.

1. Получить главный экран приложения

GET /rest/v1/home HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response:
{
  "status": 200,
  "message": "OK",
  "data": {
    "slides": [...],
    "categories": [...],
    "news": [...],
    "goods": [...],
    "goods_favorites": [...],
    "active_orders": [...],
    "cart_metrics": { "count": 3, "sum": 5000 }
  }
}

💡 home использует auth_optional — для анонима блоки goods_favorites, active_orders, cart_metrics будут пустыми.

1b. Каталог товаров (с фильтрами и поиском)

GET /rest/v1/goods?page=1&limit=24&category=8&f_1=red|blue&sort=priceasc&search=футбол HTTP/1.1

Response (200 OK):
{
  "status": 200,
  "message": "OK",
  "data": [ ... ],
  "pagination": { "page": 1, "limit": 24, "count": 120 }
}

Параметры GET (все необязательные):

  • page, limit — пагинация (по умолчанию page=1, limit=20)
  • categoryNavigatorId категории
  • f_{PropertyId} — фильтр по свойству, несколько значений через | (например f_1=red|blue)
  • sortpriceasc | pricedesc | nameasc (пусто = по приоритету)
  • search — поиск по началу названия

Список доступных свойств-фильтров: GET /rest/v1/goods.filters?category=8&search=... — вернёт значения с количеством товаров для построения UI-фильтров.

2. Добавить товар в корзину

POST /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "id": "325",
    "quantity": 2
  }
}

Response (200 OK):
{
  "status": 200,
  "message": "Cart updated",
  "data": {
    "items": [
      { "id": "325", "qu": 2, "ac": 1 },
      { "id": "200", "qu": 1, "ac": 1 }
    ],
    "sum": 5000,
    "quantityActive": 3
  }
}

Response (404 Not Found):
{
  "status": 404,
  "message": "Product not found",
  "data": null
}

3. Добавить товар с вариацией

POST /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "id": "325-555",
    "quantity": 1
  }
}

Response (200 OK):
{
  "status": 200,
  "message": "Cart updated",
  "data": { ... }
}

Response (404 Not Found - если вариация не существует):
{
  "status": 404,
  "message": "Variation not found",
  "data": null
}

4. Обновить товар в корзине

PUT /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "id": "325",
    "quantity": 3,
    "active": 1
  }
}

Response:
{
  "status": 200,
  "message": "Cart updated",
  "data": { ... }
}

5. Отключить товар в корзине (без удаления)

PUT /rest/v1/cart HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "id": "325",
    "quantity": 3,
    "active": 0
  }
}

Response:
{
  "status": 200,
  "message": "Cart updated",
  "data": {
    "items": [
      { "id": "325", "qu": 3, "ac": 0 }
    ]
  }
}

6. Удалить товар из корзины

DELETE /rest/v1/cart?id=325 HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response:
{
  "status": 200,
  "message": "Item removed",
  "data": { ... }
}

7. Выбрать город доставки

PUT /rest/v1/cart.city HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "citiesId": 8
  }
}

Response:
{
  "status": 200,
  "message": "OK",
  "data": {
    "city": { "id": 8, "title": "Москва" },
    "delivery": [...],
    "deliveryActive": "0",
    "deliveryOperations": [],
    "payments": [],
    "paymentsActive": "0"
  }
}

7b. Поиск городов (GET)

GET /rest/v1/cart.city?q=Мос HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response:
{
  "status": 200,
  "message": "OK",
  "data": [
    { "id": 8, "title": "Москва" },
    { "id": 12, "title": "Мосальск" }
  ]
}

💡 Поиск городов работает по ?q=... (минимум 2 символа).

7c. Способы доставки для города (GET)

GET /rest/v1/cart.delivery?citiesId=8 HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response:
{
  "status": 200,
  "message": "OK",
  "data": [
    { "id": 1, "name": "CDEK", "price": 299, "days": 3 },
    { "id": 2, "name": "Яндекс Доставка", "price": 199, "days": 1 }
  ]
}

8. Выбрать способ доставки

PUT /rest/v1/cart.delivery HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "deliveryId": "1"
  }
}

Response:
{
  "status": 200,
  "message": "OK",
  "data": {
    "delivery": [...],
    "deliveryActive": "1",
    "deliveryOperations": [
      {
        "id": "136",
        "tariff": "ПВЗ",
        "allowOrderBtn": false,
        "list": [...]
      }
    ],
    "payments": [...]
  }
}

9. Сохранить параметры доставки (ПВЗ)

PUT /rest/v1/cart.deliveryOperations HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "operations-id": "12345",
    "operations-title": "ПВЗ №12345",
    "operations-city": "Москва",
    "operations-address-short": "ул. Примерная, 1",
    "operations-postal-code": "109012"
  }
}

Response (200 OK):
{
  "status": 200,
  "message": "OK",
  "data": null
}

Response (400 Validation Error):
{
  "status": 400,
  "message": "Validation errors",
  "data": {
    "operations-city": "Не заполнено",
    "operations-address-short": "Не заполнено"
  }
}

💡 Валидация параметров доставки выполняется через класс расширения Delivery (метод getErrors).

10. Выбрать способ оплаты

PUT /rest/v1/cart.payment HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {
    "paymentsId": "1"
  }
}

Response:
{
  "status": 200,
  "message": "OK",
  "data": { ... }
}

11. Оформить заказ

POST /rest/v1/cart.placeOrder HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json

{
  "data": {}
}

Response (200 OK):
{
  "status": 200,
  "message": "Order created",
  "data": {
    "id": 5001,
    "sum": 2999,
    "status": 1,
    "odate": "2026-05-03 15:30:00"
  }
}

Response (400 Validation Error):
{
  "status": 400,
  "message": "Validation error",
  "data": {
    "operations-id": "Не заполнено"
  }
}

Response (400 Empty Cart):
{
  "status": 400,
  "message": "Cart is empty",
  "data": null
}

Response (400 Delivery Not Selected):
{
  "status": 400,
  "message": "Delivery method not selected",
  "data": null
}

Response (400 Payment Not Selected):
{
  "status": 400,
  "message": "Payment method not selected",
  "data": null
}

12. Получить профиль пользователя

GET /rest/v1/profile HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response:
{
  "status": 200,
  "message": "OK",
  "data": {
    "id": 123,
    "login": "user@example.com",
    "email": "user@example.com",
    "name": "Иванов Иван Иванович",
    "nameSurname": "Иванов",
    "nameFirst": "Иван",
    "namePatronymic": "Иванович",
    "phone": "9123456789",
    "city": "Москва",
    "address": "ул. Примерная, 1"
  }
}

💡 Профиль возвращается в camelCase. Смена email/телефона/пароля — 2 шага: сначала отправка кода подтверждения, затем подтверждение кодом.

13. Получить метрики корзины

GET /rest/v1/cart.metrics HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response:
{
  "status": 200,
  "message": "OK",
  "data": {
    "count": 3,
    "quantityActive": 3,
    "sum": 5000,
    "items": [
      { "id": "325", "qu": 2, "ac": 1 },
      { "id": "200", "qu": 1, "ac": 1 }
    ]
  }
}

14. Получить данные для оформления заказа

GET /rest/v1/cart.checkout HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response:
{
  "status": 200,
  "message": "OK",
  "data": {
    "items": [
      { "id": "325", "qu": 2, "ac": 1 }
    ],
    "sum": 5000,
    "city": { "id": 8, "title": "Москва" },
    "delivery": [
      { "id": 1, "name": "CDEK", "price": 299 },
      { "id": 2, "name": "Яндекс", "price": 199 }
    ],
    "deliveryActive": "0",
    "deliveryOperations": [],
    "payments": [
      { "id": 1, "name": "Карта", "description": "Банковская карта" },
      { "id": 2, "name": "Наличные", "description": "При доставке" }
    ],
    "paymentsActive": "0"
  }
}

15. Заказы пользователя

GET /rest/v1/orders?page=1&limit=20 HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Response:
{
  "status": 200,
  "message": "OK",
  "data": [
    {
      "id": 5001,
      "status": "processing",
      "sum": 2999,
      "odate": "2026-04-01 10:00:00",
      "delivery": "cdek",
      "payment": "card"
    },
    {
      "id": 5002,
      "status": "shipped",
      "sum": 1499,
      "odate": "2026-03-28 12:30:00",
      "delivery": "yandex",
      "payment": "card"
    }
  ],
  "pagination": {
    "count": 2,
    "limit": 20,
    "page": 1
  }
}

💡 Поля заказов конвертируются в camelCase: OStatusstatus, OSumsum, ODateodate.

16. Авторизация (auth.login)

POST /rest/v1/auth.login HTTP/1.1
Content-Type: application/json

{
  "data": {
    "login": "user@example.com",
    "password": "password123"
  }
}

Response (200 OK):
{
  "status": 200,
  "message": "Login successful",
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIs...",
    "access_exp": 1774567890,
    "refresh_token": "eyJhbGciOiJIUzI1NiIs...",
    "refresh_exp": 1777159890
  }
}

💡 Режим CONFIRM_AUTH: если на сервере включён CONFIRM_AUTH, то auth.login вместо пары токенов вернёт confirm_token и confirm_exp, а на почту придёт код подтверждения. Тогда токены выдаются через POST /rest/v1/auth.confirm:

{
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIs...",  // confirm_token из ответа auth.login
    "code": 154566                        // код из письма (необязателен, для 2FA)
  }
}

17. Регистрация (2 шага)

# Шаг 1: инициация — валидация данных и письмо с токеном подтверждения
POST /rest/v1/register HTTP/1.1
Content-Type: application/json

{
  "data": {
    "login": "user@example.com",
    "phone": "9123456789",
    "nameSurname": "Иванов",
    "nameFirst": "Иван",
    "namePatronymic": "Иванович"
  }
}

# Шаг 2: подтверждение — токен из письма + новый пароль
POST /rest/v1/register.confirm HTTP/1.1
Content-Type: application/json

{
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "password": "password123",
    "password2": "password123"
  }
}

Response (200 OK):
{
  "status": 200,
  "message": "Registration confirmed",
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIs...",
    "access_exp": 1774567890,
    "refresh_token": "eyJhbGciOiJIUzI1NiIs...",
    "refresh_exp": 1777159890
  }
}

Сравнение RestV1APP и RestV1M2M

Аспект RestV1APP RestV1M2M
Назначение APP-Specific API для фронтенда Universal CRUD для любых таблиц
Типичный usecase Мобильное приложение Интеграция с внешними системами
URL /rest/v1/... /rest/m2m/...
Методы Бизнес-функции (getHome, placeOrder) Явные CRUD на таблицу (users, goods, orders)
Логика Сложная, специфичная для приложения Простая, универсальная
Данные Агрегированы из нескольких таблиц Берутся как есть из таблицы
Размер кода Большой (500-1000+ строк) Маленький (180-200 строк)
Авторизация Часто требуется Всегда требуется (auth_required)
Роли Разные (гость, пользователь, админ) Только роль 1
Фильтры Complex (свойства, сортировка) Simple (page, limit, search)
Utils dependency Много (CartUtils, DeliveryUtils и т.д.) Использует стандартный RestV1M2MUtils

Key Features

RestV1APP поддерживает:

  1. Валидация товаров — все операции с товарами (добавить, обновить, удалить) проверяют существование товара перед выполнением
  2. Управление активностью — параметр active позволяет отключать товары из расчёта суммы без удаления
  3. Параметры доставки — сохранение параметров (ПВЗ, адрес) перед оформлением заказа с валидацией
  4. Формат товаров — поддержка простых товаров (ID: "325") и товаров с вариациями (ID: "325-555")
  5. 2-шаговые операции — смена email/телефона/пароля, удаление аккаунта (слово «УДАЛИТЬ» → код подтверждения)
  6. Auth 2-фактор — access + refresh токены, registerregister.confirm, auth.confirm (CONFIRM_AUTH)

Примеры HTTP Request/Response

Когда расширять RestV1APP

Добавляйте новые методы в RestV1APP когда:

  • ✅ Нужен новый endpoint для приложения
  • ✅ Логика специфична для приложения (не generic)
  • ✅ Требуется авторизация и фильтрация данных по пользователю
  • ✅ Нужна агрегация из нескольких таблиц в один запрос

Пример: добавить обработчик для рецензий товаров

/**
 * GET /rest/v1/goods.item.reviews?id=100&page=1&limit=10
 * Получить рецензии на товар
 */
public function getGoodsItemReviews(): array
{
    $id = (int) ($this->get['id'] ?? 0);
    $page = max(1, (int) ($this->get['page'] ?? 1));
    $limit = min(50, max(1, (int) ($this->get['limit'] ?? 10)));

    if (!$id) {
        return ['status' => 400, 'message' => 'Product ID required', 'data' => null];
    }

    $data = new Data('Reviews');
    $result = $data->fetch('ProductId = ? AND IsHidden = 0', $limit, $page);
    $result = array_map(fn($r) => [
        'id' => $r['Id'],
        'author' => $r['AuthorName'],
        'rating' => $r['Rating'],
        'text' => $r['Text'],
        'date' => $r['CreateDate'],
        'helpful' => $r['HelpfullCount'] ?? 0,
    ], $result);

    return ['status' => 200, 'message' => 'OK', 'data' => $result];
}

Затем зарегистрировать в RestConfig.php:

'v1' => [
    'get' => [
        'goods.item.reviews' => [
            'class' => RestV1APP::class,
            'method' => 'getGoodsItemReviews',
        ],
    ],
]

Выводы

RestV1APP — это специализированный REST API для приложений:

  1. Бизнес-ориентированность — методы отвечают на вопросы приложения ("Дай мне главный экран", "Оформи заказ")
  2. Агрегация — один запрос может собрать данные из нескольких таблиц
  3. Сложная логика — фильтры по свойствам, расчёт доставки, интеграция с платёжными системами
  4. Авторизация — часто нужна проверка прав пользователя
  5. Масштабируемость — используется множество специализированных Utils классов
  6. Валидация — все операции с товарами и доставкой валидируются перед выполнением
  7. Гибкость — управление активностью товаров, сохранение параметров доставки, минимальные ответы

Ключевые функции:

  • Валидация товаров — ProductsUtils::validateProductId() предотвращает добавление несуществующих товаров
  • Управление активностью — параметр active позволяет отключать товары без удаления
  • Параметры доставки — PUT /rest/v1/cart.deliveryOperations сохраняет параметры выбранной доставки
  • Checkout — город → доставка → параметры → оплата → оформление
  • 2-шаговый auth — access + refresh токены, подтверждение email/телефона/пароля
  • CRUD для админов — POST/PUT/DELETE goods и PUT orders.status (роль 1-2)

Используйте:

  • RestV1APP — для мобильный приложений и фронтенда (бизнес-функции)
  • RestV1M2M — для внешних систем и интеграций (универсальный CRUD)

Как фреймворк: Гибкость разработки

Полный контроль над кодом, архитектурой и расширениями для сложных проектов

wapps framework

Как CMS: Простота управления

Интуитивная админ-панель для редакторов контента без программирования

wapps cms

Как платформа: Готовые решения

Быстрый старт проектов с возможностью глубокой кастомизации под любые задачи

wapps platform
R
REST API - Общая архитектура Wepps Platform

REST API Wepps Platform — это система предоставления данных через HTTP endpoints.

Состоит из версионированных API с разными подходами: M2M для машинных интеграций (1С, CRM), APP для мобильных приложений и фронтенда, wepps для админки, v0 для тестовых endpoints и cli для командной строки.

08.07.2026
A
AI-Ready проект: как сделать код понятным для искусственного интеллекта

AI-Ready — это когда искусственный интеллект может:

- Быстро понять архитектуру проекта
- Генерировать корректный код в стиле проекта
- Находить нужную информацию без долгих поисков
- Предлагать релевантные изменения

02.02.2026
C
Расширение конфигурации таблиц в Wepps Platform: Action-обработчики

Система управления списками данных в Wepps Platform предоставляет мощный механизм расширения стандартного функционала через Action-обработчики. Это специальные классы, которые автоматически выполняются при различных операциях со списками (просмотр, создание, изменение, удаление), позволяя добавить кастомную логику без изменения ядра системы.

31.01.2026