Integrations
What is the "Integration" block?
The "Integration" block allows your bot to interact with third-party services—such as OpenAI, Google Sheets, and others—directly within the scenario flow. The bot sends a request, receives a response, and saves the result into variables.
Connecting a service
Before using the integration block, you need to create a connection to the service:
- Click the "Integrations" button in the builder's header.
- Select the desired service from the list.
- Enter the authorization details:
- API Key — for OpenAI and other services requiring a key.
- OAuth2 — for Google (authorization via Google account).
- Service Account — for Google (service account JSON file).
- Click "Test" — the system will verify the connection.
- Save the connection.
A single connection can be used in multiple blocks across the same bot or different bots.
Configuring the integration block
- Add the "Integration" block to the desired node.
- Select the service (e.g., OpenAI).
- Select a connection from the list of created connections.
- Select an operation (e.g., "Send message").
- Fill in the operation parameters.
- Specify the result variable prefix (default is result).
After the block executes, the result will be available as {{result.field}}.
Transition on integration error
At the bottom of every integration block, there is an "Error transition" section.
If the integration fails (e.g., service unavailable, quota exceeded, invalid response), the bot will:
- Notify the bot owner about the issue (if notifications are enabled).
- Halt the execution of any remaining blocks in the current node. 3. Proceeds to the error node specified in the "Integration error" field.
If the "Integration error" field is left blank, the bot continues executing the scenario as usual (following the standard path after the node), which may lead to incorrect behavior.
Recommendations
- Always specify an error node for integrations that are critical to the scenario (AI responses, TTS, database queries, etc.).
- In the error node, you can send a user-friendly message such as: "Service temporarily unavailable; please try again later."
- The "+ Create" button next to the field automatically creates a new node and links it to the integration block.
- The connection to the error node is displayed on the diagram as a yellow arrow labeled "Integration error".
Important: If a single node contains multiple integration blocks, and the first one fails, the remaining blocks will not execute—the bot immediately proceeds to the error node.
Testing the block
The block editor features a "Test" button; it executes the operation using the current parameters and displays which variables will be set. This is useful for verifying requests before publishing.
OpenAI
Send Message (Chat)
Sends a request to ChatGPT and receives a text response.
| Parameter | Description |
|---|---|
| Model | GPT-4o, GPT-4o mini, etc. — selected from your account |
| User message | Request text; supports {{variables}} |
| System prompt | Instructions for the model — role, style, constraints. Supports Markdown formatting and {{variables}}. The ⤢ button opens the editor in full-screen mode |
| Temperature | Degree of response randomness (0–2) |
| Max tokens | Limit on response length |
| Variable | Value |
|---|---|
| {{result.text}} | Model response text |
| {{result.model}} | Model used |
| {{result.tokens_used}} | Tokens consumed |
Remember dialogue
Allows saving the conversation history and passing it to each subsequent request to the model, creating a "memory" effect. The history is stored in the database.
| Parameter | Description |
|---|---|
| Memory duration (hours) | Number of hours of inactivity after which the history is reset. 0 — no time limit |
| Max messages in history | Number of recent messages to pass to the model with each request. Default: 100 |
| Default dialogue name | Name of a new dialogue before an automatic one is generated. Default: Main |
| Generate dialogue names | If enabled, upon creating a new dialogue, the bot sends a separate background request to the AI to formulate a short title (up to 5 words) based on the user's first message. The title is saved automatically without delaying the response |
| Encrypt data | If enabled, user messages and AI responses are stored in the database in encrypted form (AES-256-CBC). Data is automatically decrypted upon each interaction with the AI. Existing unencrypted dialogues remain readable |
| Dialogue ID | Load a specific dialogue by its ID. Supports {{variables}} (e.g., "{{dialog_id}}"). If not specified, the last active dialogue is used, or a new one is created |
| Dialogue ID variable | Name of the variable where the current dialogue ID will be stored. Use it in other blocks to explicitly reference the required dialog |
| Display preliminary message | AI can take a long time to generate a response. When enabled, the bot immediately sends a short placeholder message to the user and edits it once the response is ready. This ensures the user feels the bot is responding without delay. |
When "Display preliminary message" is enabled, two additional fields appear:
| Parameter | Description |
|---|---|
| Preliminary message | Text or emoji for an instant user response (e.g., "⏳ Generating response...") |
| Variable name for message ID | The name of the variable where the "message_id" of the sent preliminary message is stored. Defaults to message_id. Use this in a "Text" block with "Edit message" enabled. |
Typical scenario using a preliminary message:
- "Integration" block → enable "Show preliminary message" → variable "message_id".
- AI response is saved to "{{result.text}}".
- Next "Text" block with "{{result.text}}" → in "Advanced" settings, enable "Edit message" → specify variable "{{message_id}}".
- The bot edits the preliminary message, replacing the placeholder with the AI response.
Generate image
Creates an image based on a text description (DALL·E 3, GPT-image-1, etc.).
| Parameter | Description |
|---|---|
| Model | dall-e-3, dall-e-2, gpt-image-1, etc. |
| Description | Prompt text; supports {{variables}} |
| References | Up to 5 links to source images. If at least one is specified, the model will automatically switch to gpt-image-1 if DALL·E was selected. Each field supports {{variables}} |
| Size | Image resolution |
| File format | PNG / JPEG / WebP — output file format (only for gpt-image-* models) |
| Image quality | Auto / Low / Medium / High (only for gpt-image-* models) |
| Transparent background | Generate an image with a transparent background (PNG/WebP only; for gpt-image-* models) |
| Quantity | 1–10 images |
Result variables:
| Variable | Value |
|---|---|
| {{result.url}} | Image URL |
| {{result.revised_prompt}} | Refined prompt (returned by models that support prompt reformulation) |
Analyze image (Vision)
Ask a question about an image — the model answers based on the image content.
| Parameter | Description |
|---|---|
| Model | GPT-4o, GPT-4 Turbo, and others with Vision support |
| Image URL | Link to the image; supports {{variables}} |
| Question | What exactly needs to be identified or described |
Result: {{result.text}} — the model's text response.
Transcribe audio (Whisper)
Converts a voice message or audio file into text.
| Parameter | Description |
|---|---|
| file_id | Telegram file_id of the audio/voice message; supports {{variables}} |
| Model | whisper-1, gpt-4o-transcribe, etc. |
| Language | ISO language code (leave blank for auto-detection) |
Result: {{result.text}} — the transcribed text.
Typical scenario: the user sends a voice message → the "Data Input" block saves the file_id → the Whisper integration block transcribes it → the variable {{result.text}} becomes available in subsequent blocks.
Get Model List (OpenAI)
Queries the OpenAI API and saves the array of models available in your account to the specified variable.
No parameters are required—simply specify the variable where the result will be stored.
Result: {{result}} — an array of objects. Available properties for each element (where N is the index starting at 0):
| Property | Description |
|---|---|
| {{result.N.id}} | Model identifier (e.g., gpt-4o) |
| {{result.N.object}} | Object type (always "model") |
| {{result.N.created}} | Creation date (Unix timestamp) |
| {{result.N.owned_by}} | Model owner (e.g., openai) |
Click Test in the editor to verify functionality and view the list of models. The data will be accessible via {{result.0.id}}, {{result.1.id}}, etc.
React to Message (OpenAI)
The AI analyzes the user's message text and selects one emoji from an allowed list; the bot then applies this reaction to the specified message via the Telegram API.
| Parameter | Description |
|---|---|
| Message ID | The ID of the message to react to. Default: {{USER_MESSAGE_ID}} (the incoming user message) |
| Reaction List | A grid of the 73 available Telegram emoji reactions—select the ones the AI can choose from |
| User Message | Text to analyze; supports {{variables}}. Default: {{USER_MESSAGE}} |
| Instruction | System prompt for the AI. A list of allowed emojis is automatically appended to the end of the instruction |
| Model | OpenAI model (default: "gpt-4o-mini"). Located in advanced settings |
Result variables (using the result prefix):
| Variable | Value |
|---|---|
| {{result.selected_emoji}} | The selected reaction (empty if the AI could not find a suitable one or returned null) |
Behavior when no reaction is returned: If the AI returns "null", an empty string, or an emoji not on the allowed list, no reaction is set, the "selected_emoji" variable remains an empty string, and scenario execution continues.
Anthropic Claude
Send Message
Sends a request to Claude and receives a text response. Supports the same conversation memory and pre-message capabilities as OpenAI Chat.
| Parameter | Description |
|---|---|
| Model | Claude 4.6 Opus, Claude 4.6 Sonnet, Claude 4.5 Sonnet, and others — selected from your account |
| User message | Request text; supports {{variables}} |
| System prompt | Instructions for the model — role, style, constraints. Supports Markdown formatting and {{variables}}. The ⤢ button opens the full-screen editor |
| Max tokens | Response length limit |
Result variables (using the result prefix):
| Variable | Value |
|---|---|
| {{result.text}} | Model's response text |
| {{result.model}} | Model used |
| {{result.tokens_used}} | Tokens consumed |
Remember Dialogue
Similar to the OpenAI → Remember Dialogue section, all settings (memory duration, maximum messages, dialogue name, title generation, dialogue ID, ID variable, initial message) function the same way for Claude.
Get Model List (Anthropic)
Queries the Anthropic API and saves the array of available Claude models to the specified variable.
No parameters are required—simply specify the variable where the result will be stored.
Result: {{result}} — an array of objects (sorted by created_at descending). Available properties for each element (where N is the index starting at 0):
| Property | Description |
|---|---|
| {{result.N.id}} | Model identifier (e.g., claude-sonnet-4-6) |
| {{result.N.display_name}} | Model display name |
| {{result.N.created_at}} | Creation date (ISO 8601) |
| {{result.N.type}} | Object type (always "model") |
| {{result.N.max_input_tokens}} | Maximum context tokens |
| {{result.N.max_tokens}} | Maximum response tokens |
Click Test in the editor to verify functionality. After testing, autocomplete options such as {{result.0.id}}, {{result.1.id}}, etc., will become available in the editor.
React to Message (Claude)
Identical to the OpenAI → React to Message operation: The Claude AI analyzes the message text and selects a reaction from an allowed list, after which the bot applies it via the Telegram API.
| Parameter | Description |
|---|---|
| Message ID | The ID of the message to react to. Default: {{USER_MESSAGE_ID}} |
| Reaction list | Grid of 73 Telegram emoji reactions — select those allowed for the AI |
| User message | Text to analyze; supports {{variables}} |
| Instruction | System prompt; the list of allowed emojis is added automatically |
| Model | Claude model (default: "claude-sonnet-4-6"). Found in advanced settings |
Result variable: {{result.selected_emoji}} — the selected emoji (empty if the AI could not make a selection).
Google Sheets
Connection
Two authorization methods are supported:
- OAuth2 — authorization via Google account. Create an OAuth2 client in the Google Cloud Console (type: Web application), enable the Google Sheets API and Google Drive API, and add the redirect URI.
- Service account — service account JSON key. After creating the account, open the relevant spreadsheets and grant the service account email access (Editor role).
The connection type is selected upon creation and cannot be changed later. To switch authorization methods, create a new connection.
Get Row
Searches for a row in a Google Sheet based on a value in a specified column.
| Parameter | Description |
|---|---|
| Spreadsheet ID or URL | Google Sheets identifier |
| Sheet Name | Tab name |
| Search Column | Column header to search by |
| Search Value | Value to search for; supports {{variables}} |
Result variable names correspond to the spreadsheet's column headers:
{{result.Email}} → value of the "Email" column in the found row {{result.Имя}} → value of the "Имя" (Name) column {{result.Телефон}} → value of the "Телефон" (Phone) column
If the row is not found, the variables will be empty.
Add Row
Adds a new row to the end of the sheet.
| Parameter | Description |
|---|---|
| Spreadsheet ID or URL | Google Sheets identifier |
| Sheet Name | Tab name |
| Columns and Values | List of "Column → Value" pairs; supports {{variables}} |
Does not return variables. Use this to save submissions, user responses, or logs.
Add or Update Record
Searches for a row based on a value in a specified column. If the row is found, it updates it. If not, it adds a new row to the end of the sheet.
| Parameter | Description |
|---|---|
| Spreadsheet ID or URL | Google Sheets identifier |
| Sheet Name | Tab name |
| Match Column | Column header used to determine uniqueness |
| Search Value | Supports {{variables}} |
| Data (Mapping) | List of "Column → Value" pairs; supports {{variables}} |
Does not return variables.
Update Record
Finds a row based on a value in a specified column and updates its data.
| Parameter | Description |
|---|---|
| Spreadsheet ID or URL | Google Sheets identifier |
| Sheet Name | Tab name |
| Search Column | Column header used to find the row |
| Search Value | Supports {{variables}} |
| Update Data | List of "Column → New Value" pairs; supports {{variables}} |
If the row is not found, no update is performed. Returns no variables.
Get Records
Returns all rows in the sheet that match the specified filters.
| Parameter | Description |
|---|---|
| Spreadsheet ID or URL | Google Sheets identifier |
| Sheet Name | Tab name |
| Filters | List of "Column = Value" conditions; returns all rows if no filters are set |
| Filter Combination | AND — all conditions; OR — at least one |
| Return first matching row (optional) | If enabled, returns only the first row found |
Result when "Return first row" is enabled (same as "Get Row"):
""" {{result.ColumnName}} → column value in the found row """
Result when "Return first row" is disabled:
| Variable | Value |
|---|---|
| {{result}} | JSON array of all found rows |
| {{result.count}} | Number of found rows |
Clear Sheet
Clears cell contents without deleting the sheet itself.
| Parameter | Description |
|---|---|
| Spreadsheet ID or URL | Google Sheets identifier |
| Sheet Name | Tab name |
| What to clear | Entire sheet / Specific rows / Specific columns / Specific range |
| Start row (optional) | For "Specific rows" mode |
| Number of rows (optional) | For "Specific rows" mode |
| Start column (optional) | For "Specific columns" mode (e.g., A) |
| Number of columns (optional) | For "Specific columns" mode |
| Range (optional) | For "Specific range" mode (e.g., A2:C10) |
Does not return any variables.
Delete Rows or Columns
Deletes the specified rows or columns and shifts the remaining ones.
| Parameter | Description |
|---|---|
| Spreadsheet ID or URL | Google Sheets identifier |
| Sheet Name | Tab name |
| What to delete | Rows or Columns |
| Start Number | Number of the first row/column (1-based index); supports {{variables}} |
| Count | Number of rows/columns to delete; supports {{variables}} |
Does not return any variables.
Create Sheet
Adds a new tab to an existing spreadsheet.
| Parameter | Description |
|---|---|
| Spreadsheet ID or URL | Google Sheets identifier |
| New Sheet Name | Tab name; supports {{variables}} |
Does not return any variables.
Delete Sheet
Deletes a tab from the spreadsheet along with all its data.
| Parameter | Description |
|---|---|
| Spreadsheet ID or URL | Google Sheets identifier |
| Sheet Name | Name of the tab to delete |
Does not return any variables.
Google Drive
Manage Google Drive files, folders, and shared drives directly from the bot.
Connection
Two authorization methods are supported:
- OAuth2 — Authorization via a Google account. Create an OAuth2 client in the Google Cloud Console (type: Web application), enable the Google Drive API, and add the redirect URI shown when creating the connection.
- Service Account — Service account JSON key. After creating the account, grant its email address access to the required Google Drive folders or files.
The connection type is selected upon creation and cannot be changed later. To change the authentication method, create a new connection.
File Actions
Copy File
| Parameter | Description |
|---|---|
| File | Select from the list or specify the ID |
| New Name | Name of the copy; leave blank to keep the original name. Supports {{variables}} |
| Destination Folder (optional) | Folder for the copy; if not specified, the copy is created in the same folder |
Result variables (using the result prefix):
| Variable | Value |
|---|---|
| {{result.file_id}} | ID of the created copy |
| {{result.name}} | Name of the copy |
| {{result.webViewLink}} | Link to the file in Google Drive |
Create File from Text
Creates a text file from the content of a variable.
| Parameter | Description |
|---|---|
| File Name | Supports {{variables}} |
| Content | File content; supports {{variables}} |
| File Type | Text (.txt), CSV, HTML, JSON |
| Folder (optional) | Folder where the file will be saved |
Result variables are the same as for "Copy File" (file_id, name, webViewLink).
Delete File
| Parameter | Description |
|---|---|
| File | Select from the list or specify the ID |
Returns no variables.
Download File
Downloads a file from Google Drive and saves it for further use.
| Parameter | Description |
|---|---|
| File | Select from the list or specify the ID |
| Export format (optional) | For Google Docs/Sheets: PDF, DOCX, XLSX, TXT, CSV. Leave as "Auto" for standard files |
Result variables:
| Variable | Value |
|---|---|
| {{result.file_url}} | URL of the downloaded file |
| {{result.name}} | File name |
| {{result.mime_type}} | MIME type |
| {{result.size}} | Size in bytes |
Move File
| Parameter | Description |
|---|---|
| File | File to move |
| Destination folder | Folder to move the file to |
Result variables: {{result.file_id}}, {{result.name}}.
Share File
Grants access to the file to a user, group, domain, or everyone.
| Parameter | Description |
|---|---|
| File | File to share |
| Role | Viewer / Commenter / Editor |
| Type | User / Group / Domain / Anyone |
| Email address | For "User" and "Group" types. Supports {{variables}} |
| Send notification | Send an email notification to the recipient |
Result variables: {{result.permission_id}}, {{result.role}}, {{result.type}}.
Update File
| Parameter | Description |
|---|---|
| File | File to update |
| New name | Supports {{variables}} |
Upload File
Uploads a file from the specified URL to Google Drive.
| Parameter | Description |
|---|---|
| File URL | Link to the file; supports {{variables}}. For Telegram files, use the file_url from the "Data Input" block variables |
| File Name | Automatically determined from the URL if not specified. Supports {{variables}} |
| Folder (optional) | Destination folder |
| Shared Drive ID (optional) | Upload to a Shared Drive. Supports {{variables}} |
If the URL starts with a local Telegram Bot API address, the file is read directly from the server without an HTTP download.
Result variables: {{result.file_id}}, {{result.name}}, {{result.webViewLink}}, {{result.mimeType}}.
Search Files and Folders
Find Files and Folders
Searches Google Drive using Drive Query Language syntax.
| Parameter | Description |
|---|---|
| Search Query | Example: "name contains 'report'" or "mimeType = 'application/pdf'". Supports {{variables}} |
| Max Results (optional) | Up to 1000; default is 50 |
| Shared Drive ID (optional) | Limit search to a specific Shared Drive. Supports {{variables}} |
Result variables:
| Variable | Value |
|---|---|
| {{result.files}} | Array of files (id, name, mimeType, size, webViewLink) |
| {{result.count}} | Number of items found |
Folder Actions
Create Folder
| Parameter | Description |
|---|---|
| Folder Name | Supports {{variables}} |
| Shared drive ID (optional) | Create in a shared drive |
Result variables: {{result.folder_id}}, {{result.name}}, {{result.webViewLink}}.
Cloudflare R2
Cloudflare R2 is S3-compatible object storage. It is suitable for storing files accessible via direct URLs.
Connection
- Open the Cloudflare Dashboard → R2 Object Storage → your bucket → Settings tab.
- Locate the S3 API field—it looks like "https://<account_id>.r2.cloudflarestorage.com/
". The "<account_id>" part is your Account ID. - Go to R2 → Manage R2 API Tokens → Create API Token.
- Select Object Read & Write permissions (or restrict access to a specific bucket) and save.
- Copy the Access Key ID and Secret Access Key.
Paste the JSON into the connection field:
"""json { "account_id": "abc123...", "access_key_id": "...", "secret_access_key": "...", "bucket_name": "my-bucket", "public_url": "https://pub-xxx.r2.dev" } """
"public_url" — an optional field. Required to obtain direct links to files after uploading. Where to get it:
- Public Development URL (for testing): Bucket Settings → Public Development URL section → click Enable. Once enabled, copy the generated URL (e.g., "https://pub-xxx.r2.dev").
- Custom domain (for production): Settings → Custom Domains → Add.
If neither is configured, leave the field blank; "{{result.public_url}}" will be an empty string.
Upload file
Uploads a file to R2 via URL or from the bot's internal storage.
| Parameter | Description |
|---|---|
| File URL | Direct link to the file. Supports {{variables}}, including "{{result.file_url}}" from previous blocks |
| Object key | Path and filename within the bucket, e.g., "uploads/{{user.id}}/photo.jpg". Supports {{variables}} |
| MIME type (optional) | If not specified, it is determined automatically based on the file content |
Result variables:
| Variable | Value |
|---|---|
| {{result.key}} | Key of the saved object in the bucket |
| {{result.public_url}} | Direct download link (if "public_url" is set in the connection) |
| {{result.size}} | File size in bytes |
Delete file
| Parameter | Description |
|---|---|
| Object key | Path to the file in the bucket. Supports {{variables}} |
The operation does not return a result.
List files
Returns a list of objects in the bucket.
| Parameter | Description |
|---|---|
| Prefix (folder) | Filters files by the beginning of the key, e.g., "uploads/photos/". Optional |
| Max files | From 1 to 1000. Default is 100 |
Result variables:
| Variable | Value |
|---|---|
| {{result.files}} | Array of objects: "key", "size", "last_modified", "public_url" |
| {{result.count}} | Number of files found |
Copy file
Copies an object within the bucket without re-uploading it.
| Parameter | Description |
|---|---|
| Source key | Key of the source file in the bucket |
| Destination key | Key of the new copy file |
Result variables: {{result.key}}, {{result.public_url}}.
File information
Returns object metadata (without downloading the content).
| Parameter | Description |
|---|---|
| Object key | Path to the file in the bucket |
Result variables:
| Variable | Value |
|---|---|
| {{result.exists}} | "1" — file exists, "0" — not found |
| {{result.size}} | Size in bytes |
| {{result.content_type}} | File MIME type |
| {{result.last_modified}} | Last modification date |
Delete folder
| Parameter | Description |
|---|---|
| Folder | Folder to delete (deleted along with all its contents) |
Returns no variables.
Share folder
Similar to "Share file" — same parameters and result, but for a folder.
Shared drive actions
Create shared drive
| Parameter | Description |
|---|---|
| Drive name | Supports {{variables}} |
Result variables: {{result.drive_id}}, {{result.name}}.
Delete shared drive
| Parameter | Description |
|---|---|
| Shared drive ID | Supports {{variables}} |
Returns no variables.
Get shared drive
| Parameter | Description |
|---|---|
| Shared drive ID | Supports {{variables}} |
Result variables: {{result.drive_id}}, {{result.name}}, {{result.created_time}}.
List Shared Drives
| Parameter | Description |
|---|---|
| Max results (optional) | Up to 100; default is 50 |
Result variables: {{result.drives}} — array of drives · {{result.count}} — count.
Update Shared Drive
| Parameter | Description |
|---|---|
| Shared drive ID | Supports {{variables}} |
| New name | Supports {{variables}} |
Result variables: {{result.drive_id}}, {{result.name}}.
Google Calendar
Manage Google Calendar events: create, retrieve, update, delete, and check availability.
Connection
Two authorization methods are supported:
- OAuth2 — authorization via a Google account. You must create an OAuth2 client in the Google Cloud Console (type: Web application), enable the Google Calendar API, and add a redirect URI.
- Service Account — service account JSON key. After creating the account, share the required calendars with the service account's email address in the Calendar settings.
Create Event
| Parameter | Description |
|---|---|
| Calendar | Select from the list or specify the ID (primary — main calendar) |
| Event title | Title text; supports {{variables}} |
| All-day event | Yes — all-day event (date format YYYY-MM-DD); No — with time (RFC3339) |
| Start | Start date and time |
| End | End date and time |
Additional parameters ("Advanced" section):
| Parameter | Description |
|---|---|
| Description | Event description text |
| Location | Address or venue name |
| Participants | Comma-separated email addresses |
| Event color | One of the 11 Google Calendar colors |
| Visibility | Default / Public / Private / Confidential |
| Event status | Confirmed / Tentative / Cancelled |
| Guests can invite others | Yes / No |
| Guests can modify the event | Yes / No |
| Guests can see other participants | Yes / No |
| Send notifications | To all / External only / To no one |
| Use default reminders | Yes / No |
| Event ID | Custom identifier (auto-generated if not specified) |
Result variables (using the result prefix):
| Variable | Value |
|---|---|
| {{result.id}} | ID of the created event |
| {{result.summary}} | Event title |
| {{result.status}} | Status (confirmed, tentative) |
| {{result.htmlLink}} | Link to the event in Google Calendar |
| {{result.start}} | Start time |
| {{result.end}} | End time |
Delete event
| Parameter | Description |
|---|---|
| Calendar | Calendar ID |
| Event ID | Event identifier ({{result.id}} from the previous operation) |
| Send notifications | (advanced) All / External only / None |
Returns no variables.
Get event
| Parameter | Description |
|---|---|
| Calendar | Calendar ID |
| Event ID | Event identifier |
| Time zone | (advanced) IANA time zone, e.g., Europe/Moscow |
| Max. attendees | (advanced) Limit on the number of attendees in the response |
Result variables (with the result prefix):
| Variable | Value |
|---|---|
| {{result.id}} | Event ID |
| {{result.summary}} | Title |
| {{result.status}} | Status |
| {{result.description}} | Description |
| {{result.location}} | Location |
| {{result.start}} | Start |
| {{result.end}} | End |
| {{result.htmlLink}} | Link |
| {{result.creator}} | Creator's email |
| {{result.organizer}} | Organizer's email |
Get events
| Parameter | Description |
|---|---|
| Calendar | Calendar ID |
| Range start | (advanced) timeMin — RFC3339 |
| Range end | (advanced) timeMax — RFC3339 |
| Text search | (advanced) Search by title and description |
| Max. results | (advanced) Default 250, maximum 2500 |
| Sorting | (advanced) By start time / By modification date |
| Expand recurring events | (advanced) Required for sorting by startTime |
| Show deleted events | (advanced) |
Result variables:
| Variable | Value |
|---|---|
| {{result.events}} | Array of events (each is an object with id, summary, start, end, etc.) |
| {{result.count}} | Number of events found |
Use {{result.count}} in the "Condition" block to check for the presence of events.
Update Event
Required parameters: Calendar and Event ID. All other fields (title, time, description, etc.) are optional—only the specified fields are updated.
Use the "Advanced" parameters—all the same fields available when creating an event are accessible there.
Result variables — the same as for "Create Event" (id, summary, status, htmlLink, start, end).
Calendar Availability
Checks if the specified time range is free in the calendar (uses the Google Calendar FreeBusy API).
| Parameter | Description |
|---|---|
| Calendar | Calendar ID |
| Range start | RFC3339 date-time for the start of the period to check |
| Range end | RFC3339 date-time for the end of the period to check |
| Time zone | (advanced) IANA timezone |
Result variables:
| Variable | Value |
|---|---|
| {{result.is_available}} | true if the period is free, false if there are busy slots |
| {{result.busy_periods}} | Array of busy intervals [{ "start": "...", "end": "..." }] |
Editing a message in the "Text" block
The "Edit message" option is available in the "Text" block under the "Advanced" section.
When enabled, instead of sending a new message, the bot edits an existing one—replacing its text with the content of the block.
| Parameter | Description |
|---|---|
| Edit message | Enable edit mode instead of sending |
| Message ID | ID of the message to edit. Specify a number or insert a variable, e.g., "{{message_id}}" |
- "Integration" block (OpenAI / Claude) → enable "Output preliminary message" → set an ID variable, e.g., "message_id".
- While the AI generates the response, the user sees a placeholder.
- Next, a "Text" block containing the response text "{{result.text}}" → "Advanced" → "Edit message" → "{{message_id}}".
- The bot edits the preliminary message: the placeholder is replaced by the final response.
If the variable is empty or the specified ID does not exist, the block will send the message as standard text.
ElevenLabs
ElevenLabs is an AI-powered voice platform offering high-quality text-to-speech, speech recognition, voice changing, voice cloning, and sound effect generation.
Connection
- Sign up at elevenlabs.io.
- Go to Settings → API Keys → click Create API Key.
- Copy the generated key and paste it into the connection field.
- Click "Check" — the system will verify API access.
The ElevenLabs free plan has a monthly character limit. Voice cloning requires a paid "Creator" plan or higher.
Text-to-Speech
Converts text into an audio file using the selected voice.
| Parameter | Description |
|---|---|
| Voice | Select a voice from your account list or specify a voice_id manually |
| Text | Text to be spoken; supports {{variables}} |
Additional parameters:
| Parameter | Description |
|---|---|
| Model | Multilingual v2 (recommended for Russian), Flash v2.5, Turbo v2.5, v3 |
| Audio format | MP3 128 kbps (recommended), MP3 64 kbps, PCM, μ-law |
| Stability (0–1) | Lower — more emotional and dynamic; higher — more monotonous but stable |
| Similarity boost (0–1) | How closely the AI mimics the original voice |
| Style exaggeration (0–1) | Intensifies the speaking style; recommended to keep at 0 for natural sound |
| Speech rate | 1.0 — normal; lower — slower, higher — faster |
| Speaker boost | Makes the voice richer (requires slightly more resources) |
| Seed | Fixes the generation process for reproducible results |
Result variables (using the result prefix):
| Variable | Value |
|---|---|
| {{result.url}} | Audio file URL — pass this to the "Audio" block |
| {{result.character_count}} | Number of characters used |
| {{result.request_id}} | Request ID |
Important: The audio file link is available for 24 hours, after which it is automatically deleted. Typical scenario — announcer bot:
- "Integration" block → ElevenLabs → Text-to-Speech → select voice → text "{{news_text}}".
- Next block "Audio" → specify "{{result.url}}" in the "file_id or URL" field.
- The bot sends the synthesized news as an audio message.
Speech Recognition (Speech-to-Text)
Converts a voice message or audio file into text (Scribe series models).
| Parameter | Description |
|---|---|
| Audio file_id | Telegram file_id of the voice/audio message; supports {{variables}} |
| Model | Scribe v2 (recommended), Scribe v1 |
| Language (ISO 639-1) | E.g., ru, en, de. Leave blank for auto-detection |
Additional parameters:
| Parameter | Description |
|---|---|
| Split by speaker | Diarization: labels utterances as "Speaker 1", "Speaker 2" |
| Clean filler words | Removes "um", "uh", "well", repetitions, and false starts |
Result variables:
| Variable | Value |
|---|---|
| {{result.text}} | Recognized text |
| {{result.language_code}} | Detected language |
| {{result.transcription_id}} | Transcription ID |
Typical scenario — voice assistant:
- "Data Input" block → saves the voice message to the "voice_input" variable. 2. Integration block → Recognize speech → "file_id: {{voice_input}}" → "{{result.text}}".
- Integration block → OpenAI / ChatGPT → "{{result.text}}" → response "{{ai.text}}".
- Text block → "{{ai.text}}".
Voice Conversion (Speech-to-Speech)
Replaces the voice in an audio recording while preserving the original's intonation and emotions.
| Parameter | Description |
|---|---|
| Target voice | The voice used to replace the original |
| Audio file_id | Telegram file_id of the voice/audio message; supports {{variables}} |
Additional parameters: Model, Audio format, Stability, Similarity boost.
Result variables: {{result.url}} — Audio file URL · {{result.request_id}}.
Important: The audio file link is available for 24 hours, after which it is automatically deleted.
Generate Sound Effect
Generates audio based on a text description: natural sounds, noise, technical sounds.
| Parameter | Description |
|---|---|
| Sound description | Description text; supports {{variables}} |
| Duration (sec.) | Desired sound duration (optional) |
Additional parameters: Prompt influence (0–1), Audio format.
Result variables: {{result.url}} — Audio file URL.
Important: The audio file link is available for 24 hours, after which it is automatically deleted.
Music for Video (Video-to-Music)
Generates a musical soundtrack for a video file—automatically matching the tempo, mood, and instrumentation.
| Parameter | Description |
|---|---|
| Video file_id | Telegram file_id of the video message; supports {{variables}} |
| Music description | Optional text-based style direction; supports {{variables}} |
Additional parameters: Audio format. Result variables: {{result.url}} — URL of the audio file containing the music.
Important: The link to the audio file is available for 24 hours, after which it is automatically deleted.
Clone Voice (Instant Voice Cloning)
Creates a digital copy of a voice based on a short audio recording (ranging from a few seconds to a minute). The cloned voice is saved to your ElevenLabs account and can be used in the "Text-to-Speech" operation.
| Parameter | Description |
|---|---|
| Voice name | Name of the new voice in the ElevenLabs account; supports {{variables}} |
| Audio file_id | Telegram file_id of the recording containing the target voice; supports {{variables}} |
Additional parameters: Voice description, Remove background noise.
Result variables:
| Variable | Value |
|---|---|
| {{result.voice_id}} | Cloned voice ID — use this in the "Text-to-Speech" operation |
| {{result.voice_name}} | Voice name |
Typical scenario — a bot's personal voice:
- "Input Data" block → user sends a voice message → "voice_sample".
- "Integration" block → Clone Voice → "name: My Voice", "file_id: {{voice_sample}}" → "{{result.voice_id}}".
- Save "{{result.voice_id}}" to the database.
- In subsequent scenarios: "Integration" block → Text-to-Speech → "voice_id: {{saved_voice_id}}".
Voice cloning requires a paid ElevenLabs Creator plan or higher.
Tips for working with integrations
- Save integration results into variables with clear names, such as ai_answer or sheet_row.
- Use a "Condition" block after the integration to verify whether the operation successfully retrieved the required data.
- Test the block directly within the editor using the "Test" button; this saves time during development.
- When using AI conversation memory, enable "Generate conversation titles"; this makes it easier to navigate the chat history in future versions of the dashboard.
- For complex scenarios involving multiple AI blocks, use the "Conversation ID variable" so that each block explicitly interacts with the correct conversation, rather than defaulting to the "last" one.
- If the bot handles sensitive user data, enable "Encrypt data" in the conversation memory settings; messages will be stored in the database in encrypted form.
Supabase
Supabase is an open-source alternative to Firebase built on PostgreSQL. The integration allows you to perform CRUD operations on tables via the Supabase REST API (PostgREST) directly from the bot scenario.
Connection
- Open your project settings: supabase.com/dashboard → your project → Settings → API.
- Copy the Project URL from the Project URL section.
- Copy the service_role key (secret) from the Project API keys section.
- Fill in the two fields in the connection dialog:
| Field | Value |
|---|---|
| Project URL | "https://xxxx.supabase.co" |
| Service Role Key | "eyJ..." (secret key) |
- Click "Check connection"; the system will send an API request to verify the data.
- Save the connection.
Important: Use the "service_role" key (secret), not the "anon" key. This allows bypassing Row Level Security and interacting with data while ignoring access policies. Keep the key secure.
Create Record
Inserts a new row into the table.
| Parameter | Description |
|---|---|
| Table | Database table name; supports {{variables}} |
| Data | List of "Column → Value" pairs; supports {{variables}} |
Result variables (using the result prefix):
| Variable | Value |
|---|---|
| {{result.id}} | ID of the created record (and other fields returned by the database) |
| {{result.ColumnName}} | Value of any returned column |
Delete Record
Deletes rows that match the specified conditions.
| Parameter | Description |
|---|---|
| Table | Table name; supports {{variables}} |
| Select Conditions | Row selection conditions (field, operator, value); supports {{variables}} |
| Must Match (optional) | All — all conditions (AND); Any — at least one (OR) |
Result variables:
| Variable | Value |
|---|---|
| {{result}} | Array of deleted records |
| {{result.count}} | Number of deleted records |
Get Record
Retrieves the first row that meets the specified conditions.
| Parameter | Description |
|---|---|
| Table | Table name; supports {{variables}} |
| Select Conditions | Search conditions; if no conditions are provided, the first row is returned |
Result variables:
| Variable | Value |
|---|---|
| {{result.id}} | ID of the found record |
| {{result.ColumnName}} | Value of any column in the found row |
If no record is found, the variables are not set.
Get List of Records
Returns an array of rows matching the filters.
| Parameter | Description |
|---|---|
| Table | Table name; supports {{variables}} |
| Return All | If enabled, returns all rows (ignores Limit) |
| Limit (optional) | Maximum number of records. Default is 50; supports {{variables}} |
| Filters | Selection conditions (field, operator, value); supports {{variables}} |
| Must Match (optional) | All — AND; Any — OR |
Result variables:
| Variable | Value |
|---|---|
| {{result}} | Array of records |
| {{result.count}} | Number of records |
| {{result.0.ColumnName}} | Column value in the first record |
Use {{result}} with dynamic buttons (type "Dynamic Buttons") or the "Condition" block to check "{{result.count}}".
Update Record
Updates rows that meet the specified conditions.
| Parameter | Description |
|---|---|
| Table | Table name; supports {{variables}} |
| Select Conditions | Conditions for selecting rows to update; supports {{variables}} |
| Must Match | All — AND; Any — OR |
| Fields to Send | List of "Column → New Value" pairs; supports {{variables}} |
Result variables:
| Variable | Value |
|---|---|
| {{result}} | Array of updated records |
| {{result.count}} | Number of updated records |
Condition operators
The following operators are supported in blocks with conditions (Select Conditions / Filters):
| Operator | Description |
|---|---|
| "=" | Equal to |
| "!=" | Not equal to |
| "<" | Less than |
| "<=" | Less than or equal to |
| ">" | Greater than |
| ">=" | Greater than or equal to |
| "like" | Pattern match ("%text%") |
| "ilike" | Same as above, case-insensitive |
Example: Saving a user lead
- "Data Input" block — name → "user_name", phone → "user_phone".
- "Integration" block → Supabase → Create Record:
- Table: "leads"
- Data: "name" → "{{user_name}}", "phone" → "{{user_phone}}", "chat_id" → "{{USER_ID}}"
- Variable "{{result.id}}" — ID of the created lead in Supabase.
Grok (xAI)
Grok is a powerful language model from xAI that offers capabilities for AI chat, image analysis, media generation, and audio processing.
API Base URL: "https://api.x.ai/v1" API Key: Starts with "xai-". Can be obtained at console.x.ai.
Connection Setup
In the integration settings, enter the API key in the format "xai-...". The "Check Connection" button sends a request to "/models" to verify the key's validity.
Operations
Send Message ("send_message")
Sends a text request to the Grok language model and returns the response.
Parameters:
| Parameter | Description |
|---|---|
| Model | Model ID (default: "grok-3") |
| System Prompt | Context/instructions for the model |
| User Message | Request to the model |
| Temperature | Response randomness (0–2) |
| Max Tokens | Response length limit |
| Chat History | Variable containing history to maintain context |
| JSON Mode | Force response in JSON format |
- "{prefix}.text" — model response text
- "{prefix}.model" — model used
- "{prefix}.tokens_used" — number of tokens consumed
- "{prefix}.
" — JSON fields (if JSON mode with schema is enabled)
Analyze image ("analyze_image")
Sends an image to the model for visual analysis (Vision API).
Parameters:
| Parameter | Description |
|---|---|
| Model | ID of a Vision-capable model (e.g., "grok-4.20-reasoning") |
| Image URL or file_id | Telegram "file_id" or direct link |
| Question | What to find out about the image |
| Detail level | "auto", "low", or "high" |
| Max tokens | Response length limit |
Result variables:
- "{prefix}.text" — model response
- "{prefix}.model" — model used
- "{prefix}.tokens_used" — number of tokens consumed
Generate Image ("generate_image")
Generates an image based on a text description using the "grok-imagine-image" model.
Parameters:
| Parameter | Description |
|---|---|
| Prompt | Image description |
| Aspect ratio | "auto", "1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3", "2:1", "1:2" |
| Resolution | "1k" (standard) or "2k" (high) |
| Count | Number of images (1–10) |
Result variables:
- "{prefix}.url" — URL of the generated image (temporary)
- "{prefix}.file_id" — Telegram "file_id" of the first image (stable)
- "{prefix}.file_ids" — Array of Telegram "file_ids" for all images
- "{prefix}.count" — Number of generated images
- "{prefix}.{i}.file_id" — "file_id" of each image by index
Note: Image URLs returned by xAI are temporary. The block automatically uploads the images to Telegram and saves a stable "file_id".
React to Message ("react_to_message")
Analyzes a user message using AI and applies an appropriate emoji reaction in Telegram.
Parameters:
| Parameter | Description |
|---|---|
| Message ID | Telegram "message_id" to react to |
| Allowed reactions | List of emojis for the AI to choose from |
| User message | Text to analyze |
| Model | Model ID (default: "grok-3-mini") |
| System prompt | Additional instructions for selecting the reaction |
- "{prefix}.selected_emoji" — the selected emoji (or an empty string if the AI decided not to react)
Generate video ("generate_video")
Generates a video clip based on a text description using the "grok-imagine-video" model.
⚠️ Important: Video generation takes 1–5 minutes (sometimes up to 10 minutes). The block performs asynchronous API polling every 5 seconds. Ensure your task queue supports long-running tasks.
Parameters:
| Parameter | Description |
|---|---|
| Prompt | Video description |
| Duration | Duration in seconds (1–15) |
| Aspect ratio | "16:9", "9:16", "1:1" |
| Resolution | "480p" or "720p" |
Result variables:
- "{prefix}.url" — URL of the finished video (temporary)
- "{prefix}.file_id" — Telegram "file_id" of the video (stable)
- "{prefix}.duration" — video duration in seconds
- "{prefix}.model" — model used
Transcribe audio ("transcribe_audio")
Converts a voice message or audio file from Telegram into text (Speech-to-Text).
Parameters:
| Parameter | Description |
|---|---|
| Audio File ID | Telegram "file_id" of the audio or voice message |
| Language | ISO language code (optional — for improved accuracy) |
| Normalization | Convert numbers and abbreviations into text format |
Result variables:
- "{prefix}.text" — transcribed text
- "{prefix}.language" — detected language
- "{prefix}.duration" — audio duration in seconds
Text-to-Speech ("text_to_speech")
Synthesizes speech from text and returns a temporary URL for the audio file.
Parameters:
| Parameter | Description |
|---|---|
| Text | Text to be spoken |
| Voice | One of: "eve" (energetic), "ara" (warm), "rex" (professional), "sal" (smooth), "leo" (authoritative) |
| Language | ISO language code (or "auto" for auto-detection) |
| Format | Audio format: "mp3", "wav", "pcm", "mulaw" |
Result variables:
- "{prefix}.url" — temporary URL of the audio file (valid for 24 hours)
The file is automatically deleted 24 hours after generation.
Get Model List ("list_models")
Retrieves the current list of available Grok models.
Result variables:
- "{prefix}" — array of objects with "id" and "created" fields
Model Examples
| Model | Purpose |
|---|---|
| "grok-3" | Flagship language model — text, chat |
| "grok-3-mini" | Lightweight and fast — short tasks, reactions |
| "grok-4.20-reasoning" | Vision + reasoning — image analysis |
| "grok-imagine-image" | Image generation |
| "grok-imagine-video" | Video generation |
The current list is available via the "Get Model List" operation.
