node-telegram-bot-api vs telegraf
Building Telegram Bots in Node.js
node-telegram-bot-apitelegrafSimilar Packages:

Building Telegram Bots in Node.js

node-telegram-bot-api and telegraf are both Node.js libraries designed to interact with the Telegram Bot API. They allow developers to receive updates from Telegram servers and send messages, photos, and other content back to users. While node-telegram-bot-api relies on an event emitter pattern similar to core Node.js modules, telegraf adopts a middleware-based architecture that resembles modern web frameworks like Express. Both libraries handle the low-level HTTP requests required to communicate with Telegram, but they differ significantly in how they structure bot logic and manage state.

Npm Package Weekly Downloads Trend

3 Years

Github Stars Ranking

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
node-telegram-bot-api09,123621 kB1053 months agoMIT
telegraf09,125689 kB742 years agoMIT

node-telegram-bot-api vs telegraf: Architecture, Maintenance, and DX Compared

Both node-telegram-bot-api and telegraf enable Node.js developers to build bots for the Telegram messaging platform, but they approach bot logic from different angles. One uses a classic event emitter style, while the other uses a middleware pipeline. Let's compare how they handle common engineering tasks.

πŸ—οΈ Architecture: Event Emitters vs Middleware

node-telegram-bot-api uses an event emitter pattern.

  • You listen for specific events like message or callback_query.
  • Logic is often nested inside callback functions or event handlers.
  • Simple to understand for developers familiar with core Node.js events.
// node-telegram-bot-api: Event-based
const TelegramBot = require('node-telegram-bot-api');
const bot = new TelegramBot(token, { polling: true });

bot.on('message', (msg) => {
  if (msg.text === '/start') {
    bot.sendMessage(msg.chat.id, 'Welcome!');
  }
});

telegraf uses a middleware framework.

  • You chain functions that process the update context.
  • Each middleware can modify the context or pass control to the next one.
  • Makes it easier to separate concerns like logging, authentication, and command handling.
// telegraf: Middleware-based
const { Telegraf } = require('telegraf');
const bot = new Telegraf(token);

bot.use((ctx, next) => {
  console.log('Update received');
  return next();
});

bot.start((ctx) => ctx.reply('Welcome!'));

πŸ“‘ Handling Updates: Polling and Webhooks

node-telegram-bot-api supports polling out of the box.

  • You enable it in the constructor options.
  • Webhooks require manual setup with an external server.
  • Good for local development without exposing a public URL.
// node-telegram-bot-api: Built-in polling
const bot = new TelegramBot(token, { polling: true });

// Webhooks require manual express integration
// bot.setWebHook('https://your-domain.com/bot');

telegraf supports both polling and webhooks easily.

  • You can switch between them by changing one method call.
  • Built-in helpers for Express and Koa webhook handling.
  • More flexible for production deployments behind load balancers.
// telegraf: Flexible launch modes
const bot = new Telegraf(token);

// For polling
bot.launch();

// For webhooks
// bot.launch({ webhook: { domain: 'https://your-domain.com' } });

πŸ’Ύ State Management: Manual vs Session Middleware

node-telegram-bot-api does not include session management.

  • You must store state in your own database or memory.
  • Requires manual mapping of chat IDs to user data.
  • More work but gives full control over storage logic.
// node-telegram-bot-api: Manual state
const userStates = {};

bot.on('message', (msg) => {
  const chatId = msg.chat.id;
  if (!userStates[chatId]) userStates[chatId] = { step: 0 };
  // Handle logic based on userStates[chatId].step
});

telegraf includes a session middleware.

  • Automatically attaches state to the context object.
  • Supports custom storage adapters like Redis or MongoDB.
  • Reduces boilerplate for multi-step conversations.
// telegraf: Session middleware
const { session } = require('telegraf/session');

bot.use(session());

bot.on('message', (ctx) => {
  if (!ctx.session.step) ctx.session.step = 0;
  // Access state directly via ctx.session
});

πŸ› οΈ Maintenance and API Coverage

node-telegram-bot-api has slower update cycles.

  • New Telegram API features may take time to be supported.
  • Community has raised concerns about long-term maintenance.
  • Suitable for stable projects that do not need cutting-edge features.
// node-telegram-bot-api: Basic method call
bot.sendMessage(chatId, 'Hello', {
  parse_mode: 'HTML'
});

telegraf is actively maintained.

  • Quickly adopts new Telegram Bot API versions.
  • Large ecosystem of plugins for payments, games, and more.
  • Recommended for projects requiring long-term support.
// telegraf: Context helper method
ctx.reply('Hello', {
  parse_mode: 'HTML'
});

🀝 Similarities: Shared Ground Between Libraries

While the architectures differ, both libraries share core capabilities for interacting with Telegram.

1. πŸ”‘ Authentication and Setup

  • Both require a Bot Token from @BotFather.
  • Both handle HTTPS requests to Telegram servers automatically.
// Both: Token initialization
// node-telegram-bot-api
const bot1 = new TelegramBot('TOKEN');

// telegraf
const bot2 = new Telegraf('TOKEN');

2. πŸ“€ Sending Content

  • Both support text, photos, documents, and stickers.
  • Both allow custom reply keyboards and inline buttons.
// node-telegram-bot-api: Send photo
bot.sendPhoto(chatId, 'path/to/image.jpg');

// telegraf: Send photo
ctx.replyWithPhoto({ source: 'path/to/image.jpg' });

3. πŸ”’ Error Handling

  • Both emit errors that developers must catch to prevent crashes.
  • Both support promise-based method calls for async flows.
// node-telegram-bot-api: Error event
bot.on('polling_error', (error) => console.log(error.code));

// telegraf: Catch middleware
bot.catch((err, ctx) => console.log('Oops', err));

4. 🌐 Community Support

  • Both have extensive documentation and Stack Overflow presence.
  • Both are widely used in production environments globally.
// Both: Common usage pattern
// Listening for specific commands
// Handling user input
// Managing bot state

πŸ“Š Summary: Key Similarities

FeatureShared by Both Libraries
Core ProtocolπŸ”’ Telegram Bot API HTTP
AuthπŸ”‘ Bot Token based
Content TypesπŸ“€ Text, Media, Files
Keyboards⌨️ Reply and Inline
Async Model⚑ Promise-based methods

πŸ†š Summary: Key Differences

Featurenode-telegram-bot-apitelegraf
ArchitectureπŸ“‘ Event Emitter🧩 Middleware Framework
SessionsπŸ—„οΈ Manual Implementation🧠 Built-in Middleware
WebhooksπŸ”Œ Manual SetupπŸš€ Built-in Helpers
Maintenance🐒 Slower UpdatesπŸš€ Active Development
ContextπŸ“¦ Raw Update Object🎯 Enriched Context Object
Recommendation⚠️ Legacy/Simple Scriptsβœ… New Production Projects

πŸ’‘ The Big Picture

node-telegram-bot-api is like a basic utility kit 🧰 β€” it gets the job done for simple tasks with minimal setup. It is best suited for legacy systems or quick scripts where adding a larger framework is unnecessary. However, teams should be aware of the slower maintenance cycle when planning long-term roadmaps.

telegraf is like a modern application framework πŸ—οΈ β€” it provides structure, tools, and patterns for building complex bots. It shines in projects that require sessions, multi-step conversations, or integration with other services. For any new development, it is the stronger architectural choice.

Final Thought: While both libraries can send messages and handle updates, telegraf offers a more sustainable path for growth. Choose based on whether you need a quick script or a scalable bot platform.

How to Choose: node-telegram-bot-api vs telegraf

  • node-telegram-bot-api:

    Choose node-telegram-bot-api if you are maintaining a legacy project that already depends on it or if you need a very simple script with minimal dependencies. It is suitable for straightforward bots that do not require complex state management or middleware chains. However, be aware that active feature development has slowed compared to newer alternatives. It works well for basic notifications or simple command-response bots where architectural flexibility is not a priority.

  • telegraf:

    Choose telegraf for new projects that require a scalable architecture with support for middleware, sessions, and wizard-style conversations. It is the community standard for modern Telegram bot development in Node.js and receives regular updates to support new Telegram API features. The middleware system makes it easier to organize complex logic into reusable components. This package is ideal for production-grade bots that need long-term maintainability and robust error handling.

README for node-telegram-bot-api

Node.js Telegram Bot API

Node.js module to interact with the official Telegram Bot API.

Bot API npm package Coverage Status

https://telegram.me/node_telegram_bot_api https://t.me/+_IC8j_b1wSFlZTVk https://telegram.me/Yago_Perez

πŸ“¦ Install

npm i node-telegram-bot-api

✍️ Note: If you use Typescript you can install this package that contains type definitions for this library

npm install --save-dev @types/node-telegram-bot-api

πŸš€ Usage

const TelegramBot = require('node-telegram-bot-api');

// replace the value below with the Telegram token you receive from @BotFather
const token = 'YOUR_TELEGRAM_BOT_TOKEN';

// Create a bot that uses 'polling' to fetch new updates
const bot = new TelegramBot(token, {polling: true});

// Matches "/echo [whatever]"
bot.onText(/\/echo (.+)/, (msg, match) => {
  // 'msg' is the received Message from Telegram
  // 'match' is the result of executing the regexp above on the text content
  // of the message

  const chatId = msg.chat.id;
  const resp = match[1]; // the captured "whatever"

  // send back the matched "whatever" to the chat
  bot.sendMessage(chatId, resp);
});

// Listen for any kind of message. There are different kinds of
// messages.
bot.on('message', (msg) => {
  const chatId = msg.chat.id;

  // send a message to the chat acknowledging receipt of their message
  bot.sendMessage(chatId, 'Received your message');
});

πŸ“š Documentation

Note: Development is done against the development branch. Code for the latest release resides on the master branch. Experimental features reside on the experimental branch.

πŸ’­ Community

We thank all the developers in the Open-Source community who continuously take their time and effort in advancing this project. See our list of contributors.

We have a Telegram channel where we post updates on the Project. Head over and subscribe!

We also have a Telegram group to discuss issues related to this library.

Some things built using this library that might interest you:

  • tgfancy: A fancy, higher-level wrapper for Telegram Bot API
  • node-telegram-bot-api-middleware: Middleware for node-telegram-bot-api
  • teleirc: A simple Telegram ↔ IRC gateway
  • bot-brother: Node.js library to help you easily create telegram bots
  • redbot: A Node-RED plugin to create telegram bots visually
  • node-telegram-keyboard-wrapper: A wrapper to improve keyboards structures creation through a more easy-to-see way (supports Inline Keyboards, Reply Keyboard, Remove Keyboard and Force Reply)
  • beetube-bot: A telegram bot for music, videos, movies, EDM tracks, torrent downloads, files and more.
  • telegram-inline-calendar: Date and time picker and inline calendar for Node.js telegram bots.
  • telegram-captcha: Telegram bot to protect Telegram groups from automatic bots.

πŸ‘₯ Contributors

License

The MIT License (MIT)

Copyright Β© 2019 Yago