Перейти к содержанию

API🔗

Основные возможности:

  • Управление пользователями: Эндпоинты для авторизации, выхода из системы.
  • Чаты: Получение чатов и сообщений внутри чатов.
  • Виджеты: Создание виджетов в базе данных, внесение и отображение настроек.

Базовый URL: https://api.yamarkiza.ru

Аутентификация:

  • Используется сессионная авторизация с cookies.
  • Cookies:

  • sessionid — идентификатор текущей сессии.

  • csrftoken — токен защиты от CSRF.
  • Для POST, PUT, DELETE запросов требуется заголовок X-CSRFToken, значение которого берётся из cookies.

Аутентификация🔗

Логин пользователя🔗

Описание: Этот эндпоинт используется для аутентификации пользователя с использованием имени пользователя и пароля. При успешном входе возвращается сообщение об успешной авторизации и устанавливаются куки с сессией.

Метод: POST

Путь: /auth/login/

Заголовки:

{
  "Content-Type": "application/json"
}

Тело запроса:

{
  "username": "user123",
  "password": "password123"
}

Ответ при успешном запросе (200 OK):

{
    "message": "Удачная авторизация.",
    "user_data": {
        "id": 1,
        "username": "dev",
        "email": "1@mail.ru",
        "first_name": "",
        "last_name": "",
        "date_joined": "2025-02-05 10:10:54",
        "last_login": "2025-02-27 09:43:38",
        "is_staff": true,
        "is_superuser": true
    }
}

Возможные ошибки:

  • 400 Bad Request:
{
  "error": "Неверный логин или пароль."
}

Взять CSRF🔗

Описание: Этот эндпоинт используется для получения CSRF-токена, который необходим для защиты от межсайтовых подделок запросов (CSRF).

Метод: GET

Путь: /api/v1/csrf/

Заголовки: Не требуется

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

{
  "csrftoken": "a1b2c3d4e5f6g7h8i9j0"
}

Логаут пользователя🔗

Описание: Этот эндпоинт используется для выхода пользователя из системы. При успешном выходе сессионные куки удаляются.

Метод: POST

Путь: /auth/logout/

Заголовки:

{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

{
  "message": "Вы успешно вышли из системы."
}

Возможные ошибки:

  • 403 Forbidden:
{
  "error": "Учетные данные не были предоставлены."
}

Виджет🔗

Чаты🔗

Вот исправленный и адаптированный вариант описания эндпоинта GET /api/v1/chats/ — с учётом того, что используется пагинация LimitOffset, аналогичная WhatsApp-чату:


Получение чатов🔗

Описание: Возвращает список всех чатов виджета, привязанных к текущему пользователю. Используется пагинация с параметрами limit и offset (по умолчанию — 50 чатов на страницу, максимум — 50).

Чаты выдаются в порядке от нового к старым

Метод: GET Путь: /api/v1/chats/

Заголовки:

{
  "Content-Type": "application/json",
  "Cookie": "sessionid=<session_id>"
}

Параметры запроса:

  • limit (int) — Количество объектов на странице (по умолчанию 50)
  • offset (int) — Смещение (например, offset=50 для получения второй страницы)

Пример запроса:

GET /api/v1/chats/?limit=20&offset=40

Ответ при успешном запросе (200 OK):

{
  "count": 101,
  "next": "https://domain.ru/api/v1/chats/?limit=50&offset=100",
  "previous": "https://domain.ru/api/v1/chats/?limit=50",
  "results": [
    {
      "id": 56,
      "chat_type": "widget",
      "user_id": "test_user_56",
      "last_message_date": "2025-07-18T12:21:52.956679+0300",
      "is_favorite": false,
      "note": null,
      "widget_owner_id": 1,
      "creator_id": 1
    }
  ]
}

Описание полей:

Поле Тип Описание
id int Уникальный идентификатор чата
chat_type string Тип чата (например, "widget")
user_id string Идентификатор клиента, написавшего в чат
last_message_date datetime Дата и время последнего сообщения в чате
is_favorite boolean Признак избранного чата
note string/null Заметка, добавленная пользователем
widget_owner_id int ID пользователя, которому принадлежит виджет
creator_id int ID пользователя, который создал этот чат

Возможные ошибки:

  • 403 Forbidden:
{
  "error": "Пользователь не аутентифицирован."
}
  • 500 Internal Server Error:
{
  "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
}

Получить сообщения из чата🔗

Описание: Этот эндпоинт используется для получения списка сообщений определённого чата. Только авторизованные пользователи могут получить доступ к этому ресурсу.

Метод: GET

Путь: /api/v1/messages/{chat_id}/

Параметры пути:

  • chat_id (integer) — ID чата.

Заголовки:

{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

[
    {
        "id": 1,
        "message": "Hello",
        "sender": "user",
        "date": "2025-02-18T18:04:36.531000+03:00",
        "chat": 1
    },
    {
        "id": 2,
        "message": "Hi",
        "sender": "chatgpt",
        "date": "2025-02-18T18:04:50.609000+03:00",
        "chat": 1
    }
]

Возможные ошибки:

  • 403 Forbidden (Пользователь не аутентифицирован):
{
  "error": "Пользователь не аутентифицирован."
}
  • 404 Not Found (Чат не найден или не принадлежит пользователю):
{
  "error": "No Chats matches the given query."
}
  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
}

Профили🔗

Создание🔗

Описание: Этот эндпоинт используется для создания объекта WidgetSettings. Только авторизованные пользователи могут отправлять запросы.

Метод: POST

Путь: /api/v1/widget-settings/create/

Заголовки:

{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (201 Created):

{
  "widget_id": 3,
  "widget_name": "Новый Виджет 3"
}

Возможные ошибки:

  • 400 Bad Request (Ошибка валидации):
{
  "error": "Некорректные данные."
}
  • 403 Forbidden (Пользователь не аутентифицирован):
{
  "error": "Пользователь не аутентифицирован."
}
  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
}

Добавление настроек🔗

Описание: Этот эндпоинт используется для обновления данных существующего объекта WidgetSettings. Доступен только для авторизованных пользователей, которые создали данный виджет.

Метод: PATCH

Путь: /api/v1/widget-settings/{widget_id}/update/

Заголовки:

{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса:

{
  "name": "test",
  "is_active": false,
  "manager_tg_id": [
      "123",
      "222"
  ],
  "welcome_text": "text",
  "start_hints": ["Как купить?", "Какая цена?", "Как связаться?"],
  "widget_left": false,
  "icon": 2,
  "base_icon": 1
}

Ответ при успешном запросе (200 OK):

{
  "name": "test",
  "is_active": false,
  "manager_tg_id": [
      "123",
      "222"
  ],
  "welcome_text": "text",
  "start_hints": ["Как купить?", "Какая цена?", "Как связаться?"],
  "widget_left": true,
  "icon": 2,
  "base_icon": null
}

Возможные ошибки:

  • 400 Bad Request (Ошибка валидации):
{
  "error": "Ошибка валидации",
  "details": {
    "field_name": ["Некорректное значение"]
  }
}
  • 403 Forbidden (Пользователь не аутентифицирован):
{
  "error": "Пользователь не аутентифицирован."
}
  • 500 Internal Server Error (Ошибка сервера, так же если виджет не найден или не пренадлежит пользователю):
{
  "error": "Не удалось обновить объект"
}

Превью🔗

Описание: Этот эндпоинт используется для получения списка всех виджетов, созданных текущим пользователем. Возвращает только основные данные (превью).

Метод: GET

Путь: /api/v1/widget-info/

Заголовки:

{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

[
    {
        "id": 1,
        "name": "Widget 1",
        "domain": "example.com",
        "is_active": true
    },
    {
        "id": 2,
        "name": "Widget 2",
        "domain": "example.org",
        "is_active": false
    }
]

Возможные ошибки:

  • 403 Forbidden (Пользователь не аутентифицирован):
{
  "error": "Пользователь не аутентифицирован."
}
  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
}

Информация о конкретном виджете🔗

Описание: Этот эндпоинт используется для получения полной информации о конкретном виджете, созданном текущим пользователем.

Метод: GET

Путь: /api/v1/widget-info/{widget_id}/

Параметры пути:

  • widget_id (integer) — ID виджета. Заголовки:
{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

{
    "id": 1,
    "name": "Тест",
    "is_active": true,
    "created_by": 1,
    "manager_tg_id": [
        "123",
        "456"
    ],
    "domains": [
        {
            "id": 5,
            "name": "domain1"
        },
        {
            "id": 7,
            "name": "domain3"
        }
    ],
    "icon": {
        "type": "icon",
        "id": 3,
        "name": "name",
        "url": "icons/link.png"
    },
    "widget_left": true,
    "welcome_text": "test",
    "start_hints": [
        "Как купить?",
        "Какая цена?",
        "Как связаться?"
    ]
}

Возможные ошибки:

  • 403 Forbidden (Пользователь не аутентифицирован):
{
  "error": "Пользователь не аутентифицирован."
}
  • 404 Not Found (Виджет не найден или не принадлежит пользователю):
{
  "error": "No WidgetSettings matches the given query.."
}
  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
}

Удаление виджета🔗

Описание: Этот эндпоинт используется для удаления виджета. Удалить можно только виджет, принадлежащий текущему пользователю. В противном случае будет возвращена ошибка 404 Not Found.

Метод: DELETE

Путь: /api/v1/widget-settings/{widget_id}/delete/

Параметры пути:

  • widget_id (integer) — ID виджета.

Заголовки:

{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

{
  "message": "Виджет удалён"
}

Возможные ошибки:

  • 404 Not Found (Виджет не найден или у вас нет прав на его удаление):
{
  "error": "Виджет не найден или у вас нет прав на его удаление"
}
  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Не удалось удалить виджет"
}

Домены🔗

Добавить домен🔗

Описание: Этот эндпоинт используется для добавления нового домена к указанному виджету. Пользователь может добавить домен только в свой виджет, иначе будет возвращена ошибка 403 Forbidden.

Метод: POST

Путь: /api/v1/widget-settings/{widget_id}/domains/create/

Параметры пути:

  • widget_id (integer) — ID виджета.

Заголовки:

{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса:

{
  "name": "example.com"
}

Ответ при успешном запросе (201 Created):

{
  "message": "Домен добавлен",
  "domain_id": 10,
  "name": "example.com"
}

Возможные ошибки:

  • 400 Bad Request (Ошибка валидации):
{
    "error": "Домен с таким названием уже внесён в базу"
}
  • 403 Forbidden (Попытка добавить домен в чужой виджет):
{
  "error": "Нет прав на добавление домена"
}
  • 404 Not Found (Виджет не найден):
{
  "error": "Виджет не найден"
}
  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Не удалось добавить домен"
}

Удалить домен🔗

Описание: Этот эндпоинт используется для удаления домена. Удалить можно только домен, принадлежащий виджету пользователя, иначе будет возвращена ошибка 403 Forbidden.

Метод: DELETE

Путь: /api/v1/domains/{domain_id}/delete/

Параметры пути:

  • domain_id (integer) — ID домена. Заголовки:
{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

{
  "message": "Домен удалён"
}

Возможные ошибки:

  • 403 Forbidden (Попытка удалить чужой домен):
{
  "error": "Нет прав на удаление домена"
}
  • 404 Not Found (Домен не найден):
{
  "error": "Домен не найден"
}
  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Не удалось удалить домен"
}

Иконки🔗

Загрузить иконку🔗

Описание: Этот эндпоинт позволяет загружать иконку для виджета которая будет привязана к юзеру.

Метод: POST

Путь: /api/v1/widget-settings/user-icon/upload/

Заголовки:

{
  "Content-Type": "multipart/form-data",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса:

{
    "file": "binary"
}

Ответ при успешном запросе (201 Created):

{
    "icon_url": "icons/df7e8f9a3b4c.png"
}

Возможные ошибки:

  • 400 Bad Request (Ошибка отправки):
{
    "file": [
        "Ни одного файла не было отправлено."
    ]
}
  • 400 Bad Request (Не корректный файл):
{
    "file": [
        "Загруженный файл не является корректным файлом."
    ]
}
  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Ошибка"
}

Обновление имени🔗

Описание: Этот эндпоинт позволяет обновить имя иконки для виджета которая будет привязана к юзеру.

Метод: PATCH

Путь: /api/v1/widget-settings/user-icons/{icon_id}/update-name/

Параметры пути:

  • icon_id (integer) — ID иконки. Заголовки:
{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса:

{
    "name": "name"
}

Ответ при успешном запросе (200 OK):

{
    "message": "Имя иконки обновлено",
    "id": 2,
    "name": "new_name"
}

Возможные ошибки:

  • 404 Not Found:
{
    "error": "No UserIcon matches the given query.",
    "status_code": 404
}
  • 400 Bad Request (Не корректные данные):
{
    "error": "Поле 'name' обязательно"
}
  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Ошибка"
}

Общие иконки🔗

Описание: Этот эндпоинт возвращает список базовых иконок, доступных всем пользователям.

Метод: GET

Путь: /api/v1/widget-settings/base-icons/

Заголовки:

{
  "X-CSRFToken": "<csrf_token>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

[
    {
        "id": 1,
        "name": "name",
        "url": "icons/base_icon.png"
    },
    {
        "id": 2,
        "name": "name2",
        "url": "icons/base_icon1.png"
    }
]

Возможные ошибки:

  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Ошибка"
}

Иконки юзера🔗

Описание: Этот эндпоинт возвращает список иконок, загруженных текущим пользователем.

Метод: GET

Путь: /api/v1/widget-settings/user-icons/

Заголовки:

{
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

[
    {
        "id": 1,
        "url": "icons/user_icon.png"
    },
    {
        "id": 2,
        "url": "icons/user_icon1.png"
    }
]

Внимание

Тут возможно косяк в документации, проверить что отправляет имя

Возможные ошибки:

  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Ошибка"
}

Удалить иконку🔗

Описание: Этот эндпоинт позволяет удалить иконку для виджета которая привязана к юзеру.

Метод: DELETE

Путь: /api/v1/widget-settings/user-icons/{icon_id}/

Параметры пути:

  • icon_id (integer) — ID иконки. Заголовки:
{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

{
    "icon_url": "icons/df7e8f9a3b4c.png"
}

Внимание

Тут возможно косяк в документации, проверить!!

Возможные ошибки:

  • 404 Not Found (Иконка не найдена):
{
    "error": "No UserIcon matches the given query.",
    "status_code": 404
}
  • 500 Internal Server Error (Ошибка сервера):
{
  "error": "Ошибка"
}

Профиль Юзера🔗

Информация о профиле🔗

Описание: Этот эндпоинт используется для получения информации о текущем авторизованном пользователе. Требует наличия активной сессии (sessionid).

Метод: GET

Путь: /api/v1/profile/

Заголовки:

{
  "Content-Type": "application/json",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

{
    "id": 1,
    "username": "dev",
    "email": "dev@mail.ru",
    "first_name": "Senior",
    "last_name": "Developer",
    "date_joined": "2025-02-05 10:10:54",
    "last_login": "2025-02-27 09:43:38",
    "is_staff": true,
    "is_superuser": true
}

Возможные ошибки:

  • 403 Forbidden (Unauthorized):
{
    "error": "Учетные данные не были предоставлены.",
    "status_code": 403
}

Whatsapp🔗

Префикс🔗

Все запросы к API начинаются с префикса:

/api/v1/whatsapp-panel/

Профили🔗

Получить все профили🔗

Описание: Получить список всех профилей текущего пользователя (в сокращённой форме). Только авторизованные пользователи могут получить доступ к этому ресурсу.

Метод: GET

Путь: /api/v1/whatsapp-panel/settings/info/

Заголовки:

{
  "Content-Type": "application/json",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

[
  {
    "id": 1,
    "name": "Профиль 1",
    "is_active": true
  }
]

Описание полей:

Поле Тип Описание
id int Уникальный идентификатор профиля
name string Название профиля
is_active boolean Флаг активности. Если false — профиль не работает

Возможные ошибки:

  • 403 Forbidden:
    {
      "error": "Пользователь не аутентифицирован."
    }
    
  • 500 Internal Server Error:
    {
      "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
    }
    

Получить профиль🔗

Описание: Получить подробную информацию по конкретному профилю. Получить можно данные только профилей которые создал данный юзер.

Метод: GET

Путь: /api/v1/whatsapp-panel/settings/info/{profile_id}/

Параметры пути:

  • profile_id (int) — ID профиля, который необходимо получить

Заголовки:

{
  "Content-Type": "application/json",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

{
  "name": "Whatsapp",
  "token": "token_123456",
  "profile_id": "profile12_345",
  "phone_number": "79001234567",
  "is_active": false,
  "wait_time": 11,
  "assistant_live_time": "11:11:11",
  "unignore_triggers": [
    "триггер",
    "еще триггер"
  ]
}

Описание полей:

Поле Тип Описание
name string Название профиля
token string API-токен, используемый для интеграции с WAPPI
profile_id string Идентификатор профиля в системе WAPPI
phone_number string Номер WhatsApp, на который привязан профиль
is_active boolean Флаг активности. Если false — сообщения не обрабатываются
wait_time integer Время в течении которого скрипт собирает входящие сообщения (в секундах) перед отправкой в ChatGPT
assistant_live_time string Время, через которое сбросится ассистент и память (формат HH:MM:SS) (Если с последнего сообщения прошло указанное кол-во времени)
unignore_triggers array Ключевые фразы которые уберут юзера из списка игнорирования

Возможные ошибки:

  • 403 Forbidden:
    {
      "error": "Пользователь не аутентифицирован."
    }
    
  • 404 Not Found:
    {
      "error": {
        "detail": "No WhatsappProfile matches the given query."
      },
      "status_code": 404
    }
    
  • 500 Internal Server Error:
    {
      "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
    }
    

Создание профиля🔗

Описание: Создание нового профиля WhatsApp.

Метод: POST

Путь: /api/v1/whatsapp-panel/settings/create/

Заголовки:

{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса:

{
  "token": "abc123",
  "profile_id": "xyz789",
  "phone_number": "79001234567",
  "wait_time": 10,
  "name": "Профиль клиента",
  "assistant_live_time": "00:30:00",
  "unignore_triggers": ["привет", "бот"]
}

Описание полей:

Поле Тип Обязательное Описание
token string да API-токен WAPPI
profile_id string да Идентификатор профиля в WAPPI
phone_number string да Номер WhatsApp
wait_time integer да Время в течении которого скрипт собирает входящие сообщения (в секундах) перед отправкой в ChatGPT
name string нет Название профиля (если не указано — генерируется автоматически)
assistant_live_time string нет Время, через которое сбросится ассистент и память (формат HH:MM:SS) (Если с последнего сообщения прошло указанное кол-во времени)
unignore_triggers array нет Ключевые фразы которые уберут юзера из списка игнорирования

Ответ при успешном запросе (201 Created):

{
  "name": "Профиль клиента",
  "token": "abc123",
  "profile_id": "xyz789",
  "phone_number": "79001234567",
  "is_active": true,
  "wait_time": 10,
  "assistant_live_time": "00:30:00",
  "unignore_triggers": ["привет", "бот"]
}

Возможные ошибки:

  • 400 Bad Request:
    {
      "error": {
        "token": ["Обязательное поле."],
        "phone_number": ["Профиль с таким Номер Whatsapp уже существует."]
      },
      "status_code": 400
    }
    
  • 403 Forbidden:
    {
      "error": "Пользователь не аутентифицирован."
    }
    
  • 500 Internal Server Error:
    {
      "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
    }
    

Удаление профиля🔗

Описание: Удаляет указанный профиль WhatsApp. Пользователь может удалить только свой профиль.

Метод: DELETE

Путь: /api/v1/whatsapp-panel/settings/delete/{profile_id}/

Параметры пути:

  • profile_id (int) — ID профиля, который необходимо удалить

Заголовки:

{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

{
  "message": "Профиль удалён"
}

Возможные ошибки:

  • 403 Forbidden:
    {
      "error": "Пользователь не аутентифицирован."
    }
    
  • 404 Not Found:
    {
      "error": "Профиль не найден или у вас нет прав на его удаление"
    }
    
  • 500 Internal Server Error:
    {
      "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
    }
    

Обновление профиля🔗

Описание: Обновляет существующий профиль WhatsApp (частичное обновление). Можно отправлять только изменяемые поля. Юзер может изменить только свой профиль

Метод: PATCH

Путь: /api/v1/whatsapp-panel/settings/{profile_id}/update/

Параметры пути:

  • profile_id (int) — ID профиля, который требуется обновить

Заголовки:

{
  "Content-Type": "application/json",
  "X-CSRFToken": "<csrf_token>",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса (пример):

{
  "name": "Новое имя",
  "wait_time": 15
}

Поддерживаемые поля:

Поле Тип Обязательное Описание
name string нет Название профиля
token string нет API-токен WAPPI
profile_id string нет Идентификатор в системе WAPPI
phone_number string нет Номер WhatsApp
is_active boolean нет Флаг активности профиля
wait_time integer нет Таймаут между сообщениями пользователя и ChatGPT (в секундах)
assistant_live_time string нет Время, через которое сбросится ассистент и память (формат HH:MM:SS) (Если с последнего сообщения прошло указанное кол-во времени)
unignore_triggers array нет Ключевые фразы которые уберут юзера из списка игнорирования

Ответ при успешном запросе (200 OK):

{
  "name": "Новое имя",
  "token": "abc123",
  "profile_id": "profile42",
  "phone_number": "79001234567",
  "is_active": true,
  "wait_time": 15,
  "assistant_live_time": "00:30:00",
  "unignore_triggers": ["привет", "бот"]
}

Возможные ошибки:

  • 400 Bad Request:
    {
      "error": "Ошибка валидации",
      "details": {
        "error": ["Неизвестные поля: example"]
      }
    }
    
  • 403 Forbidden:
    {
      "error": "Пользователь не аутентифицирован."
    }
    
  • 404 Not Found:
    {
      "error": {
        "detail": "No WhatsappProfile matches the given query."
      },
      "status_code": 404
    }
    
  • 500 Internal Server Error:
    {
      "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
    }
    

Чаты🔗

Получение чатов🔗

Описание: Возвращает список всех чатов текущего пользователя с пагинацией (по умолчанию — 50 чатов на странице, максимум — 50).

Чаты выдаются в порядке от нового к старым

Метод: GET

Путь: /api/v1/whatsapp-panel/chats/

Заголовки:

{
  "Content-Type": "application/json",
  "Cookie": "sessionid=<session_id>"
}

Параметры запроса:

  • limit (int) — Количество объектов на странице (по умолчанию 50)
  • offset (int) — Смещение (например, offset=50 для получения второй страницы)

Пример запроса:

GET /api/v1/whatsapp-panel/chats/?limit=20&offset=40

Ответ при успешном запросе (200 OK):

{
  "count": 101,
  "next": "https://domain.ru/api/v1/whatsapp-panel/chats/?limit=50&offset=100",
  "previous": "https://domain.ru/api/v1/whatsapp-panel/chats/?limit=50",
  "results": [
    {
      "id": 56,
      "user_number": "790200000050",
      "date_last_message": "2025-07-18T12:21:52.956679+0300",
      "is_favorite": false,
      "note": null,
      "user_owner": 1
    }
  ]
}

Описание полей:

Поле Тип Описание
id int Уникальный идентификатор чата
user_number string Номер пользователя WhatsApp, который написал сообщение
date_last_message datetime Дата и время последнего сообщения в чате
is_favorite boolean Отмечен ли чат как избранный
note string/null Примечание пользователя по чату (если есть)
user_owner int ID пользователя системы, которому принадлежит чат

Возможные ошибки:

  • 403 Forbidden:
    {
      "error": "Пользователь не аутентифицирован."
    }
    
  • 500 Internal Server Error:
    {
      "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
    }
    

Получение сообщений чата🔗

Описание: Получить все сообщения, связанные с указанным чатом. Возвращаются в порядке возрастания времени (date). Получить сообщения можно только из чата который принадлежит юзеру.

Метод: GET

Путь: /api/v1/whatsapp-panel/messages/{chat_id}/

Параметры пути:

  • chat_id (int) — ID чата, сообщения которого нужно получить

Заголовки:

{
  "Content-Type": "application/json",
  "Cookie": "sessionid=<session_id>"
}

Тело запроса: (Не требуется)

Ответ при успешном запросе (200 OK):

[
  {
    "id": 17,
    "message": "Привет, вызови тестовую функцию",
    "sender": "user",
    "date": "2025-07-16T14:25:21.164154+0300",
    "chat": 5
  },
  {
    "id": 23,
    "message": "ChatGPT использовал функцию generate_test_function_1 с аргументами {\"param_1_1\":\"Тестовое сообщение от юзера\",\"param_1_2\":25,\"param_1_3\":false}",
    "sender": "system",
    "date": "2025-07-16T14:32:43.947546+0300",
    "chat": 5
  },
  {
    "id": 55,
    "message": "Тестовую функцию получил",
    "sender": "chatgpt",
    "date": "2025-07-16T14:25:26.666842+0300",
    "chat": 5
  }
]

Описание полей:

Поле Тип Описание
id int Уникальный идентификатор сообщения
message string Текст сообщения
sender string Отправитель (user, chatgpt или system)
date datetime Дата и время отправки сообщения (по серверу)
chat int ID чата, к которому относится сообщение

Возможные ошибки:

  • 403 Forbidden:
    {
      "error": "Пользователь не аутентифицирован."
    }
    
  • 404 Not Found:
    {
      "error": {
        "detail": "Чат не найден"
      },
      "status_code": 404
    }
    
  • 500 Internal Server Error:
    {
      "error": "Произошла внутренняя ошибка сервера. Попробуйте позже."
    }
    

Финансы🔗

Префикс🔗

Все запросы начинаются с:

/api/v1/user/

Баланс пользователя🔗

Описание: Получение текущего баланса пользователя. Используется кэшированное значение.

Метод: GET

Путь: balance/

Заголовки:

{
  "Content-Type": "application/json",
  "Cookie": "sessionid=<session_id>"
}

Ответ при успешном запросе (200 OK):

{
  "balance": "123.45"
}

Возможные ошибки:

  • 403 Forbidden: Пользователь не аутентифицирован.

Расходы по периодам (график)🔗

Описание: Возвращает агрегированные расходы пользователя за выбранный период (день, неделя, месяц).

Метод: GET

Путь: /api/v1/user/expenses/chart/

Параметры запроса:

Параметр Тип Обязательный Описание
period string да Один из day, week, month
start_date date да Начальная дата в формате YYYY-MM-DD
end_date date да Конечная дата в формате YYYY-MM-DD

Пример запроса:

GET /api/v1/user/expenses/chart/?period=week&start_date=2025-01-01&end_date=2025-07-01

Ответ при успешном запросе (200 OK):

{
  "aggregation": "week",
  "data": [
    {
      "label": "W05 2025",
      "total_spent": "54.90"
    },
    {
      "label": "W06 2025",
      "total_spent": "32.10"
    }
  ]
}

Возможные ошибки:

  • 400 Bad Request: Неверный period, отсутствие start_date или end_date, превышение допустимого диапазона.
  • 403 Forbidden: Пользователь не аутентифицирован.

Статистика расходов по максимуму🔗

Описание: Возвращает максимальные расходы пользователя по выбранному периоду (год, месяц, неделя) и общие суммы.

Метод: GET

Путь: /api/v1/user/expenses/summary/

Параметры запроса:

Параметр Тип Обязательный Описание
year int да Целевой год
month int нет Месяц (если задан — нельзя указывать week)
week int нет ISO-неделя (если задано — нельзя указывать month)

Пример запроса:

GET /api/v1/user/expenses/summary/?year=2025

Ответы при успешном запросе:

  • По году:
{
  "period": "year",
  "year": 2025,
  "total_spent": "1567.32",
  "max_month": {
    "month": 3,
    "total_spent": "320.40"
  },
  "max_week": {
    "week": 12,
    "total_spent": "134.80"
  }
}
  • По месяцу:
{
  "period": "month",
  "year": 2025,
  "month": 6,
  "total_spent": "198.00",
  "max_week": {
    "week": 24,
    "total_spent": "84.30"
  }
}
  • По неделе:
{
  "period": "week",
  "year": 2025,
  "week": 10,
  "date_from": "2025-03-03",
  "date_to": "2025-03-09",
  "total_spent": "92.50",
  "max_day": {
    "date": "2025-03-04",
    "total_spent": "58.00"
  }
}

Возможные ошибки:

  • 400 Bad Request: Не указаны year, указаны одновременно month и week, либо некорректные значения.
  • 403 Forbidden: Пользователь не аутентифицирован.

Ассистент🔗

Получить список ассистентов🔗

Описание: Возвращает краткий список ассистентов, принадлежащих текущему пользователю.

Метод: GET

Путь: /api/v1/assistant/list/

Пример запроса:

GET /api/v1/assistant/list/

Ответ (200 OK):

[
  {
    "id": 1,
    "assistant_id": "asst_abc123",
    "name": "Мой ассистент"
  }
]

Получить детали ассистента🔗

Описание: Возвращает полную информацию об ассистенте по его id.

Метод: GET

Путь: /api/v1/assistant/detail/{id}/

Параметры пути:

Параметр Тип Обязательный Описание
id string да ID ассистента

Пример запроса:

GET /api/v1/assistant/detail/5/

Ответ (200 OK):

{
  "id": 5,
  "assistant_id": "asst_abc123",
  "name": "Мой ассистент",
  "description": "Ассистент для помощи",
  "instructions": "...",
  "temperature": 1.0,
  "top_p": 1.0
}

Возможные ошибки:

  • 404 Not Found:
{
  "detail": "Ассистент не найден"
}

Создать ассистента🔗

Описание: Создаёт нового ассистента в OpenAI и сохраняет его в базу данных.

Метод: POST

Путь: /api/v1/assistant/create/

Тело запроса:

Поле Тип Обязательный Описание
name string да Название ассистента (до 256 символов)
model string нет Название модели (по умолчанию: "gpt-4o")
description string нет Описание ассистента (до 512 символов)
instructions string да Инструкции для поведения модели
temperature float нет От 0.0 до 2.0, по умолчанию 1.0
top_p float нет От 0.0 до 1.0, по умолчанию 1.0

Изменять можно только температуру или top_p, оба рекомендуется (запрещено за 1 запрос изменять оба)

Пример запроса:

{
  "name": "Помощник",
  "model": "gpt-4o",
  "description": "Мой ассистент",
  "instructions": "Отвечай строго.",
  "temperature": 1.0,
  "top_p": 1.0
}

Ответ (201 Created):

{
  "id": 1,
  "openai_id": "asst_abc123"
}

Возможные ошибки:

  • 400 Bad Request: Ошибки валидации данных

  • 502 Bad Gateway: Ошибка при взаимодействии с OpenAI


Обновить ассистента🔗

Описание: Частично обновляет параметры ассистента как в OpenAI, так и в локальной базе.

Метод: PATCH

Путь: /api/v1/assistant/update/{id}/

Параметры пути:

Параметр Тип Обязательный Описание
id string да ID ассистента

Тело запроса (частичное обновление):

Поле Тип Обязательный Описание
name string нет Новое имя ассистента
description string нет Новое описание
instructions string нет Обновлённые инструкции
temperature float нет Новое значение temperature
top_p float нет Новое значение top_p

Изменять можно только температуру или top_p, оба рекомендуется (запрещено за 1 запрос изменять оба)

Пример запроса:

{
  "name": "Новое имя",
  "instructions": "Новое поведение",
  "temperature": 0.8
}

Ответ (200 OK):

{
  "detail": "Ассистент обновлён."
}

Возможные ошибки:

  • 404 Not Found: Ассистент не найден

  • 502 Bad Gateway: Ошибка при обновлении в OpenAI


Удалить ассистента🔗

Описание: Удаляет ассистента в OpenAI и локальной базе.

Метод: DELETE

Путь: /api/v1/assistant/delete/{id}/

Параметры пути:

Параметр Тип Обязательный Описание
id string да ID ассистента

Пример запроса:

DELETE /api/v1/assistant/delete/5/

Ответ (204 No Content):

{
  "detail": "Ассистент удалён"
}

Возможные ошибки:

  • 404 Not Found: Ассистент не найден
  • 502 Bad Gateway: Ошибка при удалении в OpenAI