Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Telegram Bot API integration with managed authentication. Send messages, manage chats, handle updates, and interact with users through your Telegram bot. Use this skill when users want to send messages, create polls, manage bot commands, or interact with Telegram chats. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Telegram Bot API integration with managed authentication. Send messages, manage chats, handle updates, and interact with users through your Telegram bot. Use this skill when users want to send messages, create polls, manage bot commands, or interact with Telegram chats. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Access the Telegram Bot API with managed authentication. Send messages, photos, polls, locations, and more through your Telegram bot.
# Get bot info python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/telegram/:token/getMe') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
https://gateway.maton.ai/telegram/:token/{method} The :token placeholder is automatically replaced with your bot token from the connection configuration. Replace {method} with the Telegram Bot API method name (e.g., sendMessage, getUpdates).
All requests require the Maton API key in the Authorization header: Authorization: Bearer $MATON_API_KEY Environment Variable: Set your API key as MATON_API_KEY: export MATON_API_KEY="YOUR_API_KEY"
Sign in or create an account at maton.ai Go to maton.ai/settings Copy your API key
Manage your Telegram bot connections at https://ctrl.maton.ai.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections?app=telegram&status=ACTIVE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json data = json.dumps({'app': 'telegram'}).encode() req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF Response: { "connection": { "connection_id": "e8f5078d-e507-4139-aabe-1615181ea8fc", "status": "ACTIVE", "creation_time": "2026-02-07T10:37:21.053942Z", "last_updated_time": "2026-02-07T10:37:59.881901Z", "url": "https://connect.maton.ai/?session_token=...", "app": "telegram", "metadata": {} } } Open the returned url in a browser to complete the bot token configuration.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If you have multiple Telegram connections (multiple bots), specify which one to use with the Maton-Connection header: python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/telegram/:token/getMe') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', 'e8f5078d-e507-4139-aabe-1615181ea8fc') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF If omitted, the gateway uses the default (oldest) active connection.
Get Bot Info GET /telegram/:token/getMe Returns information about the bot. Response: { "ok": true, "result": { "id": 8523474253, "is_bot": true, "first_name": "Maton", "username": "maton_bot", "can_join_groups": true, "can_read_all_group_messages": true, "supports_inline_queries": true } }
Get Updates (Long Polling) POST /telegram/:token/getUpdates Content-Type: application/json { "limit": 100, "timeout": 30, "offset": 625435210 } ParameterTypeRequiredDescriptionoffsetIntegerNoFirst update ID to returnlimitIntegerNoNumber of updates (1-100, default 100)timeoutIntegerNoLong polling timeout in secondsallowed_updatesArrayNoUpdate types to receive Get Webhook Info GET /telegram/:token/getWebhookInfo Set Webhook POST /telegram/:token/setWebhook Content-Type: application/json { "url": "https://example.com/webhook", "allowed_updates": ["message", "callback_query"], "secret_token": "your_secret_token" } Delete Webhook POST /telegram/:token/deleteWebhook Content-Type: application/json { "drop_pending_updates": true }
Send Text Message POST /telegram/:token/sendMessage Content-Type: application/json { "chat_id": 6442870329, "text": "Hello, World!", "parse_mode": "HTML" } ParameterTypeRequiredDescriptionchat_idInteger/StringYesTarget chat ID or @usernametextStringYesMessage text (1-4096 characters)parse_modeStringNoHTML, Markdown, or MarkdownV2reply_markupObjectNoInline keyboard or reply keyboardreply_parametersObjectNoReply to a specific message With HTML Formatting: POST /telegram/:token/sendMessage Content-Type: application/json { "chat_id": 6442870329, "text": "<b>Bold</b> and <i>italic</i> with <a href=\"https://example.com\">link</a>", "parse_mode": "HTML" } With Inline Keyboard: POST /telegram/:token/sendMessage Content-Type: application/json { "chat_id": 6442870329, "text": "Choose an option:", "reply_markup": { "inline_keyboard": [ [ {"text": "Option 1", "callback_data": "opt1"}, {"text": "Option 2", "callback_data": "opt2"} ], [ {"text": "Visit Website", "url": "https://example.com"} ] ] } } Send Photo POST /telegram/:token/sendPhoto Content-Type: application/json { "chat_id": 6442870329, "photo": "https://example.com/image.jpg", "caption": "Image caption" } ParameterTypeRequiredDescriptionchat_idInteger/StringYesTarget chat IDphotoStringYesPhoto URL or file_idcaptionStringNoCaption (0-1024 characters)parse_modeStringNoCaption parse mode Send Document POST /telegram/:token/sendDocument Content-Type: application/json { "chat_id": 6442870329, "document": "https://example.com/file.pdf", "caption": "Document caption" } Send Video POST /telegram/:token/sendVideo Content-Type: application/json { "chat_id": 6442870329, "video": "https://example.com/video.mp4", "caption": "Video caption" } Send Audio POST /telegram/:token/sendAudio Content-Type: application/json { "chat_id": 6442870329, "audio": "https://example.com/audio.mp3", "caption": "Audio caption" } Send Location POST /telegram/:token/sendLocation Content-Type: application/json { "chat_id": 6442870329, "latitude": 37.7749, "longitude": -122.4194 } Send Contact POST /telegram/:token/sendContact Content-Type: application/json { "chat_id": 6442870329, "phone_number": "+1234567890", "first_name": "John", "last_name": "Doe" } Send Poll POST /telegram/:token/sendPoll Content-Type: application/json { "chat_id": 6442870329, "question": "What is your favorite color?", "options": [ {"text": "Red"}, {"text": "Blue"}, {"text": "Green"} ], "is_anonymous": false } ParameterTypeRequiredDescriptionchat_idInteger/StringYesTarget chat IDquestionStringYesPoll question (1-300 characters)optionsArrayYesPoll options (2-10 items)is_anonymousBooleanNoAnonymous poll (default true)typeStringNoregular or quizallows_multiple_answersBooleanNoAllow multiple answerscorrect_option_idIntegerNoCorrect answer for quiz Send Dice POST /telegram/:token/sendDice Content-Type: application/json { "chat_id": 6442870329, "emoji": "๐ฒ" } Supported emoji: ๐ฒ ๐ฏ ๐ณ ๐ โฝ ๐ฐ
Edit Message Text POST /telegram/:token/editMessageText Content-Type: application/json { "chat_id": 6442870329, "message_id": 123, "text": "Updated message text" } Edit Message Caption POST /telegram/:token/editMessageCaption Content-Type: application/json { "chat_id": 6442870329, "message_id": 123, "caption": "Updated caption" } Edit Message Reply Markup POST /telegram/:token/editMessageReplyMarkup Content-Type: application/json { "chat_id": 6442870329, "message_id": 123, "reply_markup": { "inline_keyboard": [ [{"text": "New Button", "callback_data": "new"}] ] } } Delete Message POST /telegram/:token/deleteMessage Content-Type: application/json { "chat_id": 6442870329, "message_id": 123 }
Forward Message POST /telegram/:token/forwardMessage Content-Type: application/json { "chat_id": 6442870329, "from_chat_id": 6442870329, "message_id": 123 } Copy Message POST /telegram/:token/copyMessage Content-Type: application/json { "chat_id": 6442870329, "from_chat_id": 6442870329, "message_id": 123 }
Get Chat POST /telegram/:token/getChat Content-Type: application/json { "chat_id": 6442870329 } Get Chat Administrators POST /telegram/:token/getChatAdministrators Content-Type: application/json { "chat_id": -1001234567890 } Get Chat Member Count POST /telegram/:token/getChatMemberCount Content-Type: application/json { "chat_id": -1001234567890 } Get Chat Member POST /telegram/:token/getChatMember Content-Type: application/json { "chat_id": -1001234567890, "user_id": 6442870329 }
Set My Commands POST /telegram/:token/setMyCommands Content-Type: application/json { "commands": [ {"command": "start", "description": "Start the bot"}, {"command": "help", "description": "Get help"}, {"command": "settings", "description": "Open settings"} ] } Get My Commands GET /telegram/:token/getMyCommands Delete My Commands POST /telegram/:token/deleteMyCommands Content-Type: application/json {}
Get My Description GET /telegram/:token/getMyDescription Set My Description POST /telegram/:token/setMyDescription Content-Type: application/json { "description": "This bot helps you manage tasks." } Set My Name POST /telegram/:token/setMyName Content-Type: application/json { "name": "Task Bot" }
Get File POST /telegram/:token/getFile Content-Type: application/json { "file_id": "AgACAgQAAxkDAAM..." } Response: { "ok": true, "result": { "file_id": "AgACAgQAAxkDAAM...", "file_unique_id": "AQAD27ExGysnfVBy", "file_size": 7551, "file_path": "photos/file_0.jpg" } } Download files from: https://api.telegram.org/file/bot<token>/<file_path>
Answer Callback Query POST /telegram/:token/answerCallbackQuery Content-Type: application/json { "callback_query_id": "12345678901234567", "text": "Button clicked!", "show_alert": false }
// Send a message const response = await fetch( 'https://gateway.maton.ai/telegram/:token/sendMessage', { method: 'POST', headers: { 'Authorization': `Bearer ${process.env.MATON_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ chat_id: 6442870329, text: 'Hello from JavaScript!' }) } ); const data = await response.json(); console.log(data);
import os import requests # Send a message response = requests.post( 'https://gateway.maton.ai/telegram/:token/sendMessage', headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}, json={ 'chat_id': 6442870329, 'text': 'Hello from Python!' } ) print(response.json())
import urllib.request, os, json data = json.dumps({ 'chat_id': 6442870329, 'text': 'Hello from Python!' }).encode() req = urllib.request.Request( 'https://gateway.maton.ai/telegram/:token/sendMessage', data=data, method='POST' ) req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') response = json.load(urllib.request.urlopen(req)) print(json.dumps(response, indent=2))
All Telegram Bot API responses follow this format: Success: { "ok": true, "result": { ... } } Error: { "ok": false, "error_code": 400, "description": "Bad Request: chat not found" }
:token is automatically replaced with your bot token from the connection Chat IDs are integers for private chats and can be negative for groups All methods support both GET and POST, but POST is recommended for methods with parameters Text messages have a 4096 character limit Captions have a 1024 character limit Polls support 2-10 options File uploads require multipart/form-data (use URLs for simplicity) IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments
StatusMeaning400Missing Telegram connection or bad request401Invalid or missing Maton API key429Rate limited (Telegram limits vary by method)4xx/5xxPassthrough error from Telegram Bot API
Check that the MATON_API_KEY environment variable is set: echo $MATON_API_KEY Verify the API key is valid by listing connections: python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Ensure your URL path starts with telegram. For example: Correct: https://gateway.maton.ai/telegram/:token/sendMessage Incorrect: https://gateway.maton.ai/:token/sendMessage
Telegram Bot API Documentation Available Methods Formatting Options Inline Keyboards Bot Commands Maton Community Maton Support
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.