> ## Documentation Index
> Fetch the complete documentation index at: https://docs.squarecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# How to Host a Telegram Bot 24/7

> Host your Telegram bot 24/7 on Square Cloud: get a token from BotFather, write a grammY or pyTelegramBotAPI bot, deploy it and test it.

export const RecommendedPlan = ({lang, plan, tier, cpu, appType, min}) => {
  const t = {
    'en': {
      q: <>Which plan should you choose for {appType}?</>,
      rec: p => <>We recommend the {p} plan: its <b>{tier} GB</b> of RAM and <b>{cpu} vCPU</b> handle most projects of this kind, with headroom for traffic spikes.</>,
      min: m => <> Lighter projects also run on the {m} plan.</>,
      pro: p => <> For larger projects, the {p} plan adds more RAM and CPU.</>
    },
    'pt-br': {
      q: <>Qual plano escolher para {appType}?</>,
      rec: p => <>Recomendamos o plano {p}: seus <b>{tier} GB</b> de RAM e <b>{cpu} vCPU</b> atendem a maioria dos projetos desse tipo, com folga para picos de tráfego.</>,
      min: m => <> Projetos mais leves também rodam no plano {m}.</>,
      pro: p => <> Para projetos maiores, o plano {p} oferece mais RAM e CPU.</>
    },
    'es': {
      q: <>¿Qué plan elegir para {appType}?</>,
      rec: p => <>Te recomendamos el plan {p}: sus <b>{tier} GB</b> de RAM y <b>{cpu} vCPU</b> cubren la mayoría de los proyectos de este tipo, con margen para picos de tráfico.</>,
      min: m => <> Los proyectos más ligeros también funcionan en el plan {m}.</>,
      pro: p => <> Para proyectos más grandes, el plan {p} ofrece más RAM y CPU.</>
    },
    'fr': {
      q: <>Quel plan choisir pour héberger {appType} ?</>,
      rec: p => <>Nous recommandons le plan {p} : ses <b>{tier} Go</b> de RAM et <b>{cpu} vCPU</b> suffisent pour la plupart des projets de ce type, avec une marge pour les pics de trafic.</>,
      min: m => <> Les projets plus légers fonctionnent aussi avec le plan {m}.</>,
      pro: p => <> Pour les projets plus importants, le plan {p} offre davantage de RAM et de CPU.</>
    },
    'de': {
      q: <>Welcher Plan eignet sich für {appType}?</>,
      rec: p => <>Wir empfehlen den {p}-Plan: <b>{tier} GB</b> RAM und <b>{cpu} vCPU</b> reichen für die meisten Projekte dieser Art, mit Reserven für Lastspitzen.</>,
      min: m => <> Kleinere Projekte laufen auch mit dem {m}-Plan.</>,
      pro: p => <> Für größere Projekte bietet der {p}-Plan mehr RAM und CPU.</>
    },
    'it': {
      q: <>Quale piano scegliere per {appType}?</>,
      rec: p => <>Ti consigliamo il piano {p}: i suoi <b>{tier}GB</b> di RAM e <b>{cpu}vCPU</b> bastano per la maggior parte dei progetti di questo tipo, con margine per i picchi di traffico.</>,
      min: m => <> I progetti più leggeri funzionano anche con il piano {m}.</>,
      pro: p => <> Per progetti più grandi, il piano {p} offre più RAM e CPU.</>
    },
    'ja': {
      q: <>{appType}にはどのプランを選べばよいですか？</>,
      rec: p => <>{p}プランをおすすめします。<b>{tier}GB</b>のRAMと<b>{cpu}vCPU</b>があれば、この種のプロジェクトの多くをトラフィックのピークにも余裕を持って動かせます。</>,
      min: m => <>軽量なプロジェクトは{m}プランでも動作します。</>,
      pro: p => <>より大規模なプロジェクトには、RAMとCPUが増える{p}プランをご検討ください。</>
    },
    'zh': {
      q: <>托管{appType}应该选择哪个套餐？</>,
      rec: p => <>我们推荐 {p} 套餐：<b>{tier}GB</b> RAM 和 <b>{cpu}vCPU</b> 足以运行大多数此类项目，并能从容应对流量高峰。</>,
      min: m => <>较轻量的项目也可以在 {m} 套餐上运行。</>,
      pro: p => <>对于更大的项目，{p} 套餐提供更多 RAM 和 CPU。</>
    }
  };
  const siteLang = t[lang] ? lang : 'en';
  const c = t[siteLang];
  const pay = (name, query) => <a href={`https://squarecloud.app/${siteLang}/pay?${query}`}>{name}</a>;
  const isPro = plan.toLowerCase() === 'pro';
  return <Note>
      <b>{c.q}</b><br />
      {c.rec(pay(plan, `plan=${plan.toLowerCase()}&tier=${tier}`))}
      {min ? c.min(pay(min, `plan=${min.toLowerCase()}`)) : null}
      {isPro ? null : c.pro(pay('Pro', 'plan=pro'))}
    </Note>;
};

export const appType_0 = "a Telegram bot"

## Introduction

To develop and host {appType_0} on Square Cloud, it's essential to follow a structured sequence of configurations and prerequisites. This technical guide will cover the entire process, from initial setup to production deployment.

### Prerequisites

* **Square Cloud Account**: Register through the [signup page](https://squarecloud.app/en/signup) using your email.
* **Active plan**: Ensures dedicated resources and optimized performance for your application. Check our [available plans](https://squarecloud.app/en/pricing) and choose the most suitable for your needs.

<RecommendedPlan appType="Telegram bots" plan="Standard" tier="4" cpu="4" min="Hobby" lang="en" />

This guide runs on the [Node.js runtime](/en/articles/getting-started-with-nodejs) or the [Python runtime](/en/articles/getting-started-with-python).

## Create the project

A Telegram account is essential for testing and interacting with your bot. If you don't have one, visit the [official Telegram website](https://telegram.org/) to create your account.

### Bot application on Telegram

<Steps>
  <Step title="Find BotFather" icon="rocket">
    Access [Telegram Web](https://web.telegram.org/a/) and search for the official **BotFather** bot, responsible for creating and managing bots on the platform.

    <Frame>
      <img src="https://cdn.squarecloud.app/docs/articles/telegram/getting-started.webp" alt="Finding BotFather on Telegram" style={{ borderRadius: "0.2rem" }} />
    </Frame>
  </Step>

  <Step title="Get the token" icon="key">
    Start a conversation with BotFather and type `/start`. Then, select the `/newbot` option to create a new bot. The system will ask for a name for your bot and, after confirmation, will automatically generate the necessary authentication token.

    <Frame>
      <img src="https://cdn.squarecloud.app/docs/articles/telegram/generating-token.webp" alt="Generating Telegram bot token with BotFather" style={{ borderRadius: "0.2rem" }} />
    </Frame>
  </Step>
</Steps>

<Warning>**Keep your token secret**: this token grants full control over the bot. Never write it in your code or put it in your ZIP: the examples below read it from the `TELEGRAM_BOT_TOKEN` environment variable.</Warning>

## Develop the bot

Write the bot with grammY (Node.js) or pyTelegramBotAPI (Python). Both examples echo every text message:

<Tabs>
  <Tab title="Node.js - grammY">
    1. Verify that Node.js is installed on your system. Otherwise, download it from the [official Node.js website](https://nodejs.org/).

    2. Initialize a new Node.js project:

    ```bash Terminal theme={"system"}
    npm init -y
    ```

    3. Install the grammY library:

    ```bash Terminal theme={"system"}
    npm install grammy
    ```

    4. Create the main file (`index.js`) with the following structure:

    ```javascript index.js theme={"system"}
    const { Bot } = require("grammy");

    // The token comes from the TELEGRAM_BOT_TOKEN environment variable
    const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN);

    // Reply to every text message with an echo
    bot.on("message:text", async (ctx) => {
      await ctx.reply(`${ctx.me.username} responds: ${ctx.message.text}`);
    });

    // Long polling: the bot asks Telegram for new messages, so no public URL is needed
    bot.start({
      onStart: (botInfo) => console.log(`Bot ${botInfo.username} started successfully!`),
    });
    ```
  </Tab>

  <Tab title="Python - telebot">
    1. Verify that Python and pip are installed. Otherwise, download them from the [official Python website](https://www.python.org/).

    2. Install the pyTelegramBotAPI library:

    ```bash Terminal theme={"system"}
    pip install pyTelegramBotAPI
    ```

    3. Create the main file (`main.py`):

    ```python main.py theme={"system"}
    import os

    import telebot

    # The token comes from the TELEGRAM_BOT_TOKEN environment variable
    bot = telebot.TeleBot(os.environ["TELEGRAM_BOT_TOKEN"])
    bot_name = bot.get_me().username


    # Echo every message that isn't a command
    @bot.message_handler(func=lambda message: not message.text.startswith("/"))
    def echo_handler(message):
        bot.reply_to(message, f"{bot_name} responds: {message.text}")


    if __name__ == "__main__":
        print(f"Bot {bot_name} started successfully!")
        # Long polling: no public URL is needed
        bot.infinity_polling()
    ```

    4. Create the `requirements.txt` file to manage dependencies:

    ```txt requirements.txt theme={"system"}
    pyTelegramBotAPI
    ```
  </Tab>
</Tabs>

## Configure Square Cloud

Create a `squarecloud.app` file at the root of your project, next to your main file. It tells Square Cloud how to run your bot:

<CodeGroup>
  ```systemd grammY theme={"system"}
  DISPLAY_NAME=My Telegram Bot
  MAIN=index.js
  MEMORY=512
  VERSION=recommended
  AUTORESTART=true
  ```

  ```systemd telebot theme={"system"}
  DISPLAY_NAME=My Telegram Bot
  MAIN=main.py
  MEMORY=512
  VERSION=recommended
  AUTORESTART=true
  ```
</CodeGroup>

* `MAIN` is the file Square Cloud runs, and `MEMORY` is the bot's RAM in MB. Bots need at least 256 MB; 512 MB leaves room to grow.
* `AUTORESTART=true` starts the bot again if it crashes. See [how auto restart works](https://help.squarecloud.app/en-us/article/how-to-use-auto-restart-on-square-cloud-nmhvh0/).
* There is no `SUBDOMAIN`: with long polling, the bot needs no public URL.

See the [configuration file reference](/en/getting-started/config-file) for every field.

## Set the bot token

Your code reads the token from the `TELEGRAM_BOT_TOKEN` environment variable, so the token never goes into your files. Set it in one of these ways:

* **Dashboard**: on the upload page, open **Advanced configuration** and add a variable named `TELEGRAM_BOT_TOKEN` with your token as the value. For a bot that is already deployed, add it on the application's **Environment Variables** page and restart the bot.
* **CLI**: right after you upload the bot (see [Deploy and verify](#deploy-and-verify)), set it with [`squarecloud app env set`](/en/cli-reference/environment-variables#squarecloud-app-env-set) and restart the bot:

```bash theme={"system"}
squarecloud app env set TELEGRAM_BOT_TOKEN=your_token_here
squarecloud app restart
```

The bot reads its environment variables when it starts, so restart it after every change. See [Environment variables](/en/platform/environment-variables) for the other ways to manage them.

<Tip>To run the bot on your computer first, set the variable in your terminal: `export TELEGRAM_BOT_TOKEN=your_token_here` on macOS and Linux, or `$env:TELEGRAM_BOT_TOKEN="your_token_here"` in PowerShell.</Tip>

## What goes in the ZIP

* Your main file (`index.js` or `main.py`) and your other source files.
* `package.json` or `requirements.txt`.
* `squarecloud.app`.

Leave out `node_modules`, `.venv` and `__pycache__`: Square Cloud installs your dependencies when the bot starts.

## Deploy and verify

Create the ZIP described above, then upload it:

### Via dashboard

<Steps>
  <Step title="Access the Upload Page">
    Access the [upload page](https://squarecloud.app/en/dashboard/new) and upload your project zip file.
  </Step>

  <Step title="Configure Your Environment">
    After uploading your zip, you will need to configure the name, main file or runtime environment and other settings for your project.\
    If you are uploading a web project, make sure to select "Web Publication" and set a subdomain to your project.
  </Step>

  <Step title="Deploy Your Project">
    Finally, click on the "Deploy" button to host your project on Square Cloud.\
    After deployment, you can monitor your project's status and logs from the dashboard.

    <Frame>
      <img src="https://cdn.squarecloud.app/docs/articles/dashboard/uploading.gif" alt="Uploading application to Square Cloud" style={{ borderRadius: "0.2rem" }} />
    </Frame>
  </Step>

  <Step title="Confirm Your App Is Live">
    Your first deploy usually takes less than a minute. In the [dashboard](https://squarecloud.app/en/dashboard), wait for your application status to show as running and check the logs for any startup errors.\
    If you deployed a website or API, open `https://<your-subdomain>.squareweb.app` in your browser: you should see your application responding. If you deployed a bot, send it a command to confirm it is online.
    <Tip>App not starting? See the [Troubleshooting guide](/en/platform/troubleshooting/app-wont-start) for the most common causes and fixes.</Tip>
  </Step>
</Steps>

### Via CLI

To use this method, your project needs a configuration file named `squarecloud.app` at its root. It tells Square Cloud how to run your application.

<Card title="Configuration file guide" icon="link" href="/en/getting-started/config-file">
  Learn how to create the `squarecloud.app` configuration file that defines your application's environment.
</Card>

<Steps>
  <Step title="Install the CLI">
    Install the [Square Cloud CLI](/en/cli-reference/installation). If you already have it, run the same command to update it:

    <CodeGroup>
      ```bash macOS, Linux, and WSL theme={"system"}
      curl -fsSL https://cli.squarecloud.app/install | bash
      ```

      ```bash Windows with npm theme={"system"}
      npm install -g @squarecloud/cli@latest
      ```
    </CodeGroup>
  </Step>

  <Step title="Log In">
    Run the command below. It opens your browser: approve the login there and the CLI is ready. There is no API key to copy. For scripts and CI, see [CLI authentication](/en/cli-reference/authentication).

    ```bash theme={"system"}
    squarecloud auth login
    ```
  </Step>

  <Step title="Upload Your Project">
    From your project folder, run the command below. The CLI zips the current folder, leaving out what [`squarecloud.ignore`](/en/getting-started/squarecloud-ignore) lists, and uploads it:

    ```bash theme={"system"}
    squarecloud upload
    ```

    To upload a zip you created yourself, pass it with `--file`:

    ```bash theme={"system"}
    squarecloud upload --file <path/to/zip>
    ```
  </Step>

  <Step title="Confirm Your App Is Live">
    Your first deploy usually takes less than a minute. Check your application status and logs directly from the terminal:

    ```bash theme={"system"}
    squarecloud app status
    squarecloud app logs
    ```

    If you deployed a website or API, open `https://<your-subdomain>.squareweb.app` in your browser: you should see your application responding. If you deployed a bot, send it a command to confirm it is online.
    <Tip>App not starting? See the [Troubleshooting guide](/en/platform/troubleshooting/app-wont-start) for the most common causes and fixes.</Tip>
  </Step>
</Steps>

### Test the bot

After the deploy, find your bot on Telegram and send it a message. The bot replies with the same text, which confirms it is running.

<Frame>
  <img src="https://cdn.squarecloud.app/docs/articles/telegram/testing-bot.webp" alt="Testing the Telegram bot after deployment" style={{ borderRadius: "0.2rem" }} />
</Frame>

## Common errors

### Error 409: Conflict: terminated by other getUpdates request

Another copy of the bot is reading updates with the same token, for example the one you started on your computer. Telegram delivers updates to only one long polling connection per bot. Stop the other copy, or revoke the token in BotFather if you don't know where it runs, then set the new token and restart the bot.

### Error 401: Unauthorized

The token is wrong or was revoked. Copy the current token from BotFather, set it again and restart the bot.

### Empty token or `KeyError: 'TELEGRAM_BOT_TOKEN'`

The `TELEGRAM_BOT_TOKEN` variable is not set: grammY stops with `Empty token!`, and the Python example stops with a `KeyError`. Set the variable, as in [Set the bot token](#set-the-bot-token), and restart the bot.

## Next steps

<CardGroup cols={3}>
  <Card title="App won't start" icon="triangle-exclamation" href="/en/platform/troubleshooting/app-wont-start">
    Fix missing modules, memory errors and other startup failures.
  </Card>

  <Card title="Environment variables" icon="key" href="/en/platform/environment-variables">
    Manage your bot's token and other secrets.
  </Card>

  <Card title="python-telegram-bot with aiohttp" icon="telegram" href="/en/tutorials/python/how-to-change-ptb-connection">
    Using python-telegram-bot? Fix frequent NetworkError exceptions.
  </Card>
</CardGroup>

For more about these libraries, see the [official grammY documentation](https://grammy.dev/) and the [pyTelegramBotAPI page on PyPI](https://pypi.org/project/pyTelegramBotAPI/).

## Contact us

If you continue facing **technical difficulties**, our **specialized support team** is available to assist you. [**Contact us**](https://squarecloud.app/en/support) and we'll be happy to help you resolve any issue: support quality is a big part of why developers rate Square Cloud [**4.9/5 across 402 reviews**](https://www.trustpilot.com/review/squarecloud.app) on Google and Trustpilot.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.