CommunicationDocumentedScanned

telegram-create-bot

Build and manage Telegram bots via the Telegram Bot API.

Share:

Installation

npx clawhub@latest install telegram-create-bot

View the full skill documentation and source below.

Documentation

Telegram Create Bot

Build and manage Telegram bots directly from OpenClaw.

Setup

  • Open Telegram and message [@BotFather]()

  • Send /newbot and follow the prompts to create your bot

  • Copy the bot token (looks like 123456789:ABCdefGHIjklMNOpqrsTUVwxyz)

  • Set environment variable:

  • export TELEGRAM_BOT_TOKEN="your-bot-token"

    API Base URL

    All requests go to:

    Usage

    Bot Information

    Get bot info

    curl -s "" | jq

    Get bot commands

    curl -s "" | jq

    Set bot commands

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "commands": [
          {"command": "start", "description": "Start the bot"},
          {"command": "help", "description": "Show help message"},
          {"command": "settings", "description": "Bot settings"}
        ]
      }' | jq

    Sending Messages

    Send text message

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "CHAT_ID",
        "text": "Hello from Clawdbot!",
        "parse_mode": "HTML"
      }' | jq

    Send message with inline keyboard

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "CHAT_ID",
        "text": "Choose an option:",
        "reply_markup": {
          "inline_keyboard": [
            [{"text": "Option 1", "callback_data": "opt1"}, {"text": "Option 2", "callback_data": "opt2"}],
            [{"text": "Visit Website", "url": ""}]
          ]
        }
      }' | jq

    Send message with reply keyboard

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "CHAT_ID",
        "text": "Choose from keyboard:",
        "reply_markup": {
          "keyboard": [
            [{"text": "Button 1"}, {"text": "Button 2"}],
            [{"text": "Send Location", "request_location": true}]
          ],
          "resize_keyboard": true,
          "one_time_keyboard": true
        }
      }' | jq

    Send photo

    curl -s -X POST "" \
      -F "chat_id=CHAT_ID" \
      -F "photo=@/path/to/image.jpg" \
      -F "caption=Photo caption here" | jq

    Send photo by URL

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "CHAT_ID",
        "photo": "",
        "caption": "Image from URL"
      }' | jq

    Send document

    curl -s -X POST "" \
      -F "chat_id=CHAT_ID" \
      -F "document=@/path/to/file.pdf" \
      -F "caption=Here is your document" | jq

    Send location

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "CHAT_ID",
        "latitude": 40.7128,
        "longitude": -74.0060
      }' | jq

    Getting Updates

    Get updates (polling)

    curl -s "" | jq

    Get updates with offset (mark as read)

    curl -s "" | jq

    Get updates with timeout (long polling)

    curl -s "" | jq

    Webhooks

    Set webhook

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "url": "",
        "allowed_updates": ["message", "callback_query"]
      }' | jq

    Get webhook info

    curl -s "" | jq

    Delete webhook

    curl -s -X POST "" | jq

    Chat Management

    Get chat info

    curl -s "" | jq

    Get chat member count

    curl -s "" | jq

    Get chat administrators

    curl -s "" | jq

    Ban user from chat

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "CHAT_ID",
        "user_id": USER_ID
      }' | jq

    Unban user

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "CHAT_ID",
        "user_id": USER_ID,
        "only_if_banned": true
      }' | jq

    Message Management

    Edit message text

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "CHAT_ID",
        "message_id": MESSAGE_ID,
        "text": "Updated message text"
      }' | jq

    Delete message

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "CHAT_ID",
        "message_id": MESSAGE_ID
      }' | jq

    Pin message

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "CHAT_ID",
        "message_id": MESSAGE_ID
      }' | jq

    Forward message

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "TARGET_CHAT_ID",
        "from_chat_id": "SOURCE_CHAT_ID",
        "message_id": MESSAGE_ID
      }' | jq

    Callback Queries

    Answer callback query

    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "callback_query_id": "CALLBACK_QUERY_ID",
        "text": "Button clicked!",
        "show_alert": false
      }' | jq

    Notes

    • Chat ID: Can be positive (user) or negative (group/channel). Get it from updates or use @userinfobot
    • Parse modes: HTML, Markdown, MarkdownV2
    • Rate limits: ~30 messages/second to different chats, 1 message/second to same chat
    • File limits: Photos up to 10MB, documents up to 50MB
    • Bot permissions: Bots can't message users first - user must /start the bot

    HTML Formatting

    <b>bold</b>
    <i>italic</i>
    <u>underline</u>
    <s>strikethrough</s>
    <code>inline code</code>
    <pre>code block</pre>
    <a href="">link</a>
    <tg-spoiler>spoiler</tg-spoiler>

    Examples

    Simple echo bot (bash script)

    #!/bin/bash
    OFFSET=0
    while true; do
      UPDATES=$(curl -s "")
      
      for UPDATE in $(echo "$UPDATES" | jq -c '.result[]'); do
        UPDATE_ID=$(echo "$UPDATE" | jq '.update_id')
        CHAT_ID=$(echo "$UPDATE" | jq '.message.chat.id')
        TEXT=$(echo "$UPDATE" | jq -r '.message.text')
        
        if [ "$TEXT" != "null" ]; then
          curl -s -X POST "" \
            -H "Content-Type: application/json" \
            -d "{\"chat_id\": $CHAT_ID, \"text\": \"You said: $TEXT\"}"
        fi
        
        OFFSET=$((UPDATE_ID + 1))
      done
    done

    Get your chat ID

    # 1. Send a message to your bot
    # 2. Run this to see your chat ID:
    curl -s "" | jq '.result[-1].message.chat.id'

    Send to channel

    # Use @channelname or channel ID (starts with -100)
    curl -s -X POST "" \
      -H "Content-Type: application/json" \
      -d '{
        "chat_id": "@your_channel_name",
        "text": "Channel announcement!"
      }' | jq

    Useful Resources

    • [Bot API Documentation]()
    • [BotFather Commands]()
    • [Bot API Changelog]()