Skip to content
Calab

Bots

A bot is a member like everyone else

Create a bot in the workspace settings and give it a role — it uses the same API as the app: chats, tasks, the calendar, members and voice.

Rights come from roles, as for people: a bot sees only the rooms it was let into.

Bots

  • Chat

    Reads and writes messages in every room and DM it can access, replies, reacts, sends files and stickers. Events arrive in real time over WebSocket.

  • Tasks

    Creates and edits tasks on boards, assigns people, comments and searches. A board is visible to a bot the way it is to a person with the same role.

  • Voice

    Joins a voice room through LiveKit: hears the participants and speaks — text to speech, echo, music, recording. On Node, Python or Go.

  • Calendar

    Schedules and moves meetings, checks free/busy and finds a time for several people. The bot is the organiser; emails go out “on behalf of the bot”.

  • Members

    Opens a member’s profile with their open tasks, renames, invites by link and email, awards badges — within the role’s permissions.

  • Meeting recording

    Starts and stops recording of a voice room — the transcript and summary arrive as a card in the chat. Needs the “Recordings” permission.

  • Commands and buttons

    Registers /commands that the composer suggests on “/”, and attaches buttons under messages — a press reaches the bot as an event.

  • Webhook

    No permanent connection: events arrive as a POST with an HMAC signature and retries on failures. Convenient for serverless.

@calaba/bot-sdk

A stand-up bot in TypeScript

import { Bot } from '@calaba/bot-sdk';const bot = new Bot(process.env.BOT_TOKEN, {  server: 'https://app.calab.io',});await bot.commands([{ name: 'standup', description: 'Start' }]);// "/standup" → a message with a buttonbot.on('command', (c) =>  bot.send(c.message.roomId, {    text: 'Stand-up time. Record it?',    inlineKeyboard: { rows: [{ buttons: [      { id: 'rec', label: 'Record', data: 'standup' },    ] }] },  }),);// pressed → start the meeting recordingbot.on('callback', (cb) => {  if (cb.buttonId === 'rec') bot.recording.start(cb.roomId);});await bot.start();
The echo bot, the voice examples and a Python listener are in examples/bots. The full reference of endpoints and events is in the docs.

Bots

Your first bot in 5 minutes

Token, REST, events, webhook, buttons, voice, limits and error codes — in the docs.