Python SDK

KarboAI Bot API

Build bots that interact with users in KarboAI chats via a simple REST API and WebSocket events.

Bots are created through the Developer Panel in the KarboAI app settings. Each bot gets a unique token for authentication. Official bots (paid status) can be added to any chat by its creator; non-official bots can only interact in their owner's chats.

This documentation covers every API endpoint and WebSocket event. You can use any language or HTTP library to build a bot — or use our official Python SDK.

KarboAI Bot API

Создавайте ботов, которые взаимодействуют с пользователями в чатах KarboAI через REST API и WebSocket.

Боты создаются в панели разработчика в настройках приложения KarboAI. Каждый бот получает уникальный токен для аутентификации. Официальные боты (платный статус) могут быть добавлены в любой чат его создателем; неофициальные боты работают только в чатах владельца.

Документация описывает все API-эндпоинты и WebSocket-события. Вы можете использовать любой язык программирования — или наш официальный Python SDK.

Authentication

All API requests must include the Bot-Token header with your bot's token.

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

Все API-запросы должны содержать заголовок Bot-Token с токеном вашего бота.

// Every request must include this header
Bot-Token: your_bot_token_here
Keep your token secret. If compromised, regenerate it in the Developer Panel. Never commit tokens to public repositories.
Храните токен в секрете. Если он скомпрометирован, перегенерируйте его в панели разработчика. Никогда не публикуйте токены.

Base URL

All REST API endpoints use the following base URL:

Базовый URL

Все REST API эндпоинты используют следующий базовый URL:

https://api.karboai.com

WebSocket connections use:

WebSocket-подключения используют:

wss://api.karboai.com/bot/ws

Rate Limits

Rate limits depend on your bot's status:

Лимиты запросов

Лимиты зависят от статуса вашего бота:

50 / min
Not Official
Неофициальный
45 / sec
Official
Официальный

When rate limited, the server returns 429 Too Many Requests with a Retry-After header (seconds).

При превышении лимита сервер вернёт 429 Too Many Requests с заголовком Retry-After (секунды).

Errors

All errors return a JSON object with an error field:

Ошибки

Все ошибки возвращают JSON-объект с полем error:

{
  "error": "not_in_chat"
}
CodeMeaningЗначениеCommon errorsЧастые ошибки
400Bad requestНеверный запросempty_message, content_too_long, too_many_images
401UnauthorizedНе авторизованbot_token_required, invalid_bot_token
403ForbiddenЗапрещеноbot_banned, not_in_chat, not_helper
404Not foundНе найденоuser_not_found, message_not_found
413File too largeФайл слишком большойfile_too_large
429Rate limitedЛимит превышен

Endpoints

Эндпоинты

GET /bot/me Get bot info Информация о боте

Returns information about the authenticated bot.

Возвращает информацию об аутентифицированном боте.

ResponseОтвет
{
  "bot_id": "uuid",
  "name": "My Bot",
  "status": "official"  // "not_official" | "official" | "banned"
}
cURL
curl -H "Bot-Token: YOUR_TOKEN" \
  https://api.karboai.com/bot/me
POST /bot/send-message Send a message Отправить сообщение

Send a text message and/or images to a chat. The bot must be a member of the chat.

Отправить текстовое сообщение и/или изображения в чат. Бот должен быть участником чата.

Request bodyТело запроса JSON
FieldПолеTypeТипDescriptionОписание
chat_idstringrequiredобяз. Target chat IDID целевого чата
contentstringoptionalопц. Message text (max 5000 chars). Required if no images.Текст сообщения (макс. 5000 символов). Обязательно, если нет изображений.
reply_message_idstring | nulloptionalопц. Message ID to reply toID сообщения для ответа
imagesstring[] | nulloptionalопц. Array of image URLs (max 10). Get URLs from /bot/upload/imageМассив URL изображений (макс. 10). Получите URL через /bot/upload/image
ResponseОтвет
{
  "message_id": "uuid",
  "created_time": 1712070000
}
cURL
curl -X POST https://api.karboai.com/bot/send-message \
  -H "Bot-Token: YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "chat_id": "chat-uuid",
    "content": "Hello from bot!",
    "images": ["https://assets.karboai.com/images/abc123.jpg"]
  }'
POST /bot/upload/image Upload an image Загрузить изображение

Upload an image file. Returns a URL you can use in send-message. Maximum file size: 20 MB. Supported formats: .jpg, .png, .webp, .gif.

Загрузите файл изображения. Возвращает URL для использования в send-message. Максимальный размер: 20 МБ. Форматы: .jpg, .png, .webp, .gif.

RequestЗапрос multipart/form-data
FieldПолеTypeТипDescriptionОписание
filefilerequiredобяз. Image fileФайл изображения
ResponseОтвет
{
  "url": "https://assets.karboai.com/images/abc123def.jpg"
}
cURL
curl -X POST https://api.karboai.com/bot/upload/image \
  -H "Bot-Token: YOUR_TOKEN" \
  -F "file=@photo.jpg"
GET /bot/chat/{chat_id}/message/{message_id} Get a message Получить сообщение

Retrieve a specific message from a chat the bot is in.

Получить конкретное сообщение из чата, в котором бот состоит.

ResponseОтвет
{
  "message_id": "uuid",
  "chat_id": "uuid",
  "user_id": "uuid",
  "content": "Hello!",
  "created_time": 1712070000,
  "type": 0,
  "reply_message_id": null,
  "audio": null,
   "audio_duration_ms": null,
   "waveform": null,
   "video_note": null,
   "video_note_duration_ms": null,
   "sticker": null,
   "images": ["https://assets.karboai.com/images/..."],
   "transparent": false,
   "bubble_id": "bubble-uuid",
   "bubble_version": 1,
   "reactions": [
    {
      "reaction": "🔥",
      "is_sticker": false,
      "count": 3,
      "me": false
    }
  ],
  "author": {
    "user_id": "uuid",
    "nickname": "Username",
    "avatar_url": "https://...",
    "avatar_frame": {
      "frame_id": "frame-uuid",
      "file": "https://assets.karboai.com/frames/..."
    },
    "role": 0,
    "app_role": 0,
    "panel_color": "#1f2937",
    "level": 12,
    "nickname_color": "#ff7a00",
    "nickname_emoji": "",
    "is_api_bot": false
  }
}
GET /bot/chat/{chat_id}/members Get chat members Список участников чата

List members of a chat. Supports pagination.

Список участников чата. Поддерживает пагинацию.

Query parametersПараметры запроса
ParamПараметрTypeТипDescriptionОписание
limitintoptionalопц. Max results (default 100, max 200)Макс. результатов (по умолчанию 100, макс. 200)
offsetintoptionalопц. Offset for pagination (default 0)Смещение для пагинации (по умолчанию 0)
community_idintoptionalопц. Community ID to resolve member profiles from (nickname, avatar, role, level). If omitted, the chat's own community is used automatically.ID сообщества для получения профилей участников (ник, аватар, роль, уровень). Если не указан, используется сообщество чата автоматически.
ResponseОтвет
{
  "items": [
    {
      "user_id": "uuid",
      "nickname": "Username",
      "avatar_url": "https://...",
      "role": 0,
      "app_role": 0,
      "panel_color": "#1f2937",
      "member_status": "joined",
      "avatar_frame": {
        "frame_id": "frame-uuid",
        "file": "https://assets.karboai.com/frames/..."
      },
      "level": 12,
      "nickname_color": "#ff7a00",
      "nickname_emoji": "",
      "is_api_bot": false
    }
  ]
}
GET /bot/user/{user_id} Get user profile Профиль пользователя

Get the public profile of any user.

Получить публичный профиль любого пользователя.

ResponseОтвет
{
  "user_id": "uuid",
  "nickname": "Username",
  "avatar": "https://...",
  "short_info": "Bio text",
  "role": 0,
  "app_role": 0,
  "panel_color": "#1f2937",
  "level": 12,
  "nickname_color": "#ff7a00",
  "nickname_emoji": "",
  "avatar_frame": {
    "frame_id": "frame-uuid",
    "file": "https://assets.karboai.com/frames/..."
  },
  "bubble_id": "bubble-uuid"
}
GET /bot/user/{user_id}/community/{community_id} Get user profile in community Профиль пользователя в сообществе

Get a user's profile within a specific community. Returns community-specific data such as nickname, avatar, role, and level. Falls back to the global profile if the user has no community-specific data. No sensitive data (email, token) is returned.

Получить профиль пользователя в конкретном сообществе. Возвращает данные, специфичные для сообщества: никнейм, аватар, роль, уровень. Если у пользователя нет данных в этом сообществе, возвращается глобальный профиль. Конфиденциальные данные (email, токен) не возвращаются.

Path parametersПараметры пути
ParameterПараметрTypeТипDescriptionОписание
user_idstringTarget user UUIDUUID пользователя
community_idintegerCommunity IDID сообщества
ResponseОтвет
{
  "user_id": "uuid",
  "community_id": 42,
  "nickname": "CommunityNick",
  "avatar": "https://...",
  "short_info": "Bio text",
  "role": 1,
  "app_role": 0,
  "panel_color": "#1f2937",
  "level": 5,
  "nickname_color": "#ff7a00",
  "nickname_emoji": "",
  "avatar_frame": {
    "frame_id": "frame-uuid",
    "file": "https://assets.karboai.com/frames/..."
  },
  "bubble_id": "bubble-uuid"
}
POST /bot/leave-chat/{chat_id} Leave a chat Покинуть чат

Remove the bot from a chat.

Удалить бота из чата.

ResponseОтвет
{ "ok": true }
POST /bot/chat/{chat_id}/kick Kick a user Кикнуть пользователя

Kick a user from a chat. The bot must have the helper role or be the chat organizer.

Кикнуть пользователя из чата. Бот должен иметь роль помощника или быть организатором чата.

Request bodyТело запроса JSON
FieldПолеTypeТипDescriptionОписание
user_idstringrequiredобяз. User ID to kickID пользователя для кика
ResponseОтвет
{ "ok": true }

WebSocket — Real-time Events

Bots connect to a dedicated Socket.IO WebSocket server to receive real-time messages from chats they are in.

WebSocket — События в реальном времени

Боты подключаются к отдельному Socket.IO WebSocket-серверу для получения сообщений из чатов, в которых они состоят.

Connection

Подключение

Use a Socket.IO client in any language. Protocol: WebSocket transport only (no polling).

Используйте клиент Socket.IO на любом языке. Протокол: только WebSocket транспорт (без polling).

ParameterПараметрValueЗначение
URLhttps://api.karboai.com
path/bot/ws
transports["websocket"]
auth{"bot_token": "YOUR_TOKEN"}
JavaScript
import { io } from "socket.io-client";

const socket = io("https://api.karboai.com", {
  path: "/bot/ws",
  transports: ["websocket"],
  auth: { bot_token: "YOUR_TOKEN" }
});

socket.on("connect", () => console.log("Connected!"));

socket.on("new_message", (data) => {
  console.log(`[${data.chat_id}] ${data.content}`);
});
Python
import socketio

sio = socketio.AsyncClient()

@sio.on("new_message")
async def on_message(data):
    print(f"[{data['chat_id']}] {data['content']}")

await sio.connect(
    "https://api.karboai.com",
    socketio_path="/bot/ws",
    auth={"bot_token": "YOUR_TOKEN"},
    transports=["websocket"],
)

Events

События

EVENT new_message Incoming chat message Входящее сообщение

Emitted when a message is sent to any chat the bot is in (including messages from the bot itself).

Событие при отправке сообщения в чат, где состоит бот (включая сообщения самого бота).

{
  "chat_id": "uuid",
  "message_id": "uuid",
  "user_id": "uuid",
  "content": "Hello!",
  "created_time": 1712070000,
  "type": 0,
  "community_id": 42,
  "reply_message_id": null,
  "audio": null,
  "audio_duration_ms": null,
  "waveform": null,
  "video_note": null,
  "video_note_duration_ms": null,
  "sticker": null,
  "images": [],
  "transparent": false,
  "bubble_id": "bubble-uuid",
  "bubble_version": 1,
  "reactions": [],
  "author": {
    "user_id": "uuid",
    "nickname": "Username",
    "avatar_url": "https://...",
    "avatar_frame": {
      "frame_id": "frame-uuid",
      "file": "https://assets.karboai.com/frames/..."
    },
    "role": 0,
    "app_role": 0,
    "panel_color": "#1f2937",
    "level": 12,
    "nickname_color": "#ff7a00",
    "nickname_emoji": "",
    "is_api_bot": false
  }
}
💡
Filter out your own messages by comparing user_id with your bot's bot_id (from /bot/me).
💡
Фильтруйте свои сообщения, сравнивая user_id с bot_id вашего бота (из /bot/me).

Models

Message

A chat message object.

Модели

Message

Объект сообщения в чате.

FieldПолеTypeТипDescriptionОписание
message_idstringUnique message IDУникальный ID сообщения
chat_idstringChat this message belongs toЧат, которому принадлежит сообщение
user_idstringSender's user IDID отправителя
contentstringMessage textТекст сообщения
created_timeintUnix timestampUnix-время
typeint0 = normal text, other = system0 = обычный текст, иначе = системное
community_idintCommunity ID of the chat (0 = global / no community). Only present in WebSocket events.ID сообщества чата (0 = глобальный / без сообщества). Присутствует только в WebSocket-событиях.
reply_message_idstring?ID of the replied messageID сообщения, на которое ответили
audiostring?Voice message URLURL голосового сообщения
audio_duration_msint?Voice message duration in msДлительность голосового в мс
waveformfloat[]?Audio waveform dataДанные формы волны аудио
video_notestring?Video note URLURL видеозаметки
video_note_duration_msint?Video note duration in msДлительность видеозаметки в мс
stickerstring?Sticker identifierИдентификатор стикера
imagesstring[]Array of image URLsМассив URL изображений
transparentboolWhether message has transparent backgroundПрозрачный ли фон сообщения
bubble_idstring?Sender bubble style IDID пузыря отправителя
bubble_versionintBubble asset versionВерсия ассета пузыря
reactionsMessageReaction[]Aggregated reactions for the messageАгрегированные реакции на сообщение
authorAuthorSender infoИнформация об отправителе

User

FieldПолеTypeТипDescriptionОписание
user_idstringUnique user IDУникальный ID
nicknamestringDisplay nameОтображаемое имя
avatarstringAvatar URLURL аватара
short_infostringBio textОписание профиля
roleintUser role (0 = regular)Роль пользователя (0 = обычный)
app_roleintGlobal app roleГлобальная роль в приложении
panel_colorstring?Profile panel colorЦвет панели профиля
levelintCurrent user levelТекущий уровень пользователя
nickname_colorstring?Premium nickname colorПремиум-цвет ника
nickname_emojistring?Premium nickname emojiПремиум-эмодзи ника
avatar_frameAvatarFrame?Selected avatar frameВыбранная рамка аватара
bubble_idstring?Selected bubble IDID выбранного пузыря

Member

Chat member object. Similar to User but includes member_status and is_api_bot.

Объект участника чата. Похож на User, но включает member_status и is_api_bot.

FieldПолеTypeDescriptionОписание
user_idstringUser IDID пользователя
nicknamestringDisplay nameОтображаемое имя
avatar_urlstringAvatar URLURL аватара
roleintCommunity roleРоль в сообществе
app_roleintGlobal app roleГлобальная роль
panel_colorstring?Profile panel colorЦвет панели
levelintUser levelУровень
nickname_colorstring?Premium nickname colorЦвет ника
nickname_emojistring?Premium nickname emojiЭмодзи ника
avatar_frameAvatarFrame?Avatar frameРамка аватара
member_statusstring"joined" or "invited""joined" или "invited"
is_api_botboolWhether this member is an API botЯвляется ли участник API-ботом

Author

Embedded in message objects.

Вложенный объект в сообщениях.

FieldПолеTypeDescriptionОписание
user_idstringSender IDID отправителя
nicknamestringDisplay nameОтображаемое имя
avatar / avatar_urlstringAvatar URLURL аватара
avatar_frameAvatarFrame?Selected avatar frameВыбранная рамка аватара
role / app_roleintCommunity and app rolesРоль в сообществе и глобальная роль
panel_colorstring?Profile panel colorЦвет панели профиля
levelintCurrent levelТекущий уровень
nickname_colorstring?Premium nickname colorПремиум-цвет ника
nickname_emojistring?Premium nickname emojiПремиум-эмодзи ника
is_api_botboolWhether the author is an API botЯвляется ли автор API-ботом

AvatarFrame

Compact avatar frame object used by users, members, and message authors.

Компактный объект рамки аватара, используется у пользователей, участников и авторов сообщений.

FieldПолеTypeDescriptionОписание
frame_idstring?Avatar frame IDID рамки аватара
filestring?Frame image URLURL изображения рамки

MessageReaction

Aggregated reaction entry attached to a message.

Агрегированная реакция, прикреплённая к сообщению.

FieldПолеTypeDescriptionОписание
reactionstringEmoji or sticker reaction keyЭмодзи или ключ стикер-реакции
is_stickerboolWhether this reaction is a stickerЯвляется ли реакция стикером
countintTotal number of this reactionОбщее количество этой реакции
meboolWhether the current bot reacted with itРеагировал ли этим текущий бот

Official Python SDK

We provide an official Python library karbo that wraps the entire Bot API. Install it from PyPI:

Официальный Python SDK

Мы предоставляем официальную Python-библиотеку karbo, которая покрывает весь Bot API. Установите из PyPI:

pip install karbo
Quick exampleБыстрый пример
import asyncio
import karbo

async def main():
    async with karbo.KarboBot("YOUR_TOKEN") as bot:
        ws = karbo.KarboBotWS("YOUR_TOKEN")

        me = await bot.get_me()
        print(f"Bot: {me.name}")

        @ws.on_message
        async def on_message(msg: karbo.Message):
            if msg.user_id == me.bot_id:
                return
            # Echo text
            await bot.send_message(msg.chat_id, f"Echo: {msg.content}")
            # Send an image
            url = await bot.upload_image("photo.jpg")
            await bot.send_message(msg.chat_id, images=[url])

        await ws.run_forever()

asyncio.run(main())
📚
Building your own SDK in another language? This documentation describes every endpoint and data structure you need. Use the raw HTTP API and Socket.IO protocol described above. We welcome community libraries!
📚
Хотите сделать SDK на другом языке? Эта документация описывает все эндпоинты и структуры данных. Используйте HTTP API и протокол Socket.IO. Мы приветствуем библиотеки от сообщества!

Known Libraries

If you prefer another language, here are known community packages for the KarboAI Bot API.

Известные библиотеки

Если вам нужен другой язык, вот известные пакеты сообщества для KarboAI Bot API.

NODE karboai Node.js package on npm Пакет Node.js на npm

Package: npmjs.com/package/karboai

Install:

Пакет: npmjs.com/package/karboai

Установка:

npm install karboai

Language/runtime: Node.js

Язык/рантайм: Node.js

KarboAI KarboAI Bot API Documentation Документация KarboAI Bot API