curl --request POST \
--url http://localhost:8080/api/bots/add \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"token": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
"name": "My Bot",
"manage_enabled": true,
"proxy_enabled": false
}
'import requests
url = "http://localhost:8080/api/bots/add"
payload = {
"token": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
"name": "My Bot",
"manage_enabled": True,
"proxy_enabled": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
token: '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11',
name: 'My Bot',
manage_enabled: true,
proxy_enabled: false
})
};
fetch('http://localhost:8080/api/bots/add', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://localhost:8080/api/bots/add",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'token' => '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11',
'name' => 'My Bot',
'manage_enabled' => true,
'proxy_enabled' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:8080/api/bots/add"
payload := strings.NewReader("{\n \"token\": \"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\",\n \"name\": \"My Bot\",\n \"manage_enabled\": true,\n \"proxy_enabled\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:8080/api/bots/add")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"token\": \"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\",\n \"name\": \"My Bot\",\n \"manage_enabled\": true,\n \"proxy_enabled\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/api/bots/add")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"token\": \"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\",\n \"name\": \"My Bot\",\n \"manage_enabled\": true,\n \"proxy_enabled\": false\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"token": "<string>",
"name": "<string>",
"source": "cli",
"manage_enabled": true,
"proxy_enabled": true,
"backend_url": "<string>",
"secret_token": "<string>",
"long_poll_enabled": true,
"description": "<string>",
"running": true,
"webhook_mode": true,
"disabled": true
}{
"error": "bot not found"
}{
"error": "bot not found"
}{
"error": "bot not found"
}Add Bot
Registers a new Telegram bot. The token is validated with Telegram before saving. Admin only.
curl --request POST \
--url http://localhost:8080/api/bots/add \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"token": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
"name": "My Bot",
"manage_enabled": true,
"proxy_enabled": false
}
'import requests
url = "http://localhost:8080/api/bots/add"
payload = {
"token": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
"name": "My Bot",
"manage_enabled": True,
"proxy_enabled": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
token: '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11',
name: 'My Bot',
manage_enabled: true,
proxy_enabled: false
})
};
fetch('http://localhost:8080/api/bots/add', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://localhost:8080/api/bots/add",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'token' => '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11',
'name' => 'My Bot',
'manage_enabled' => true,
'proxy_enabled' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:8080/api/bots/add"
payload := strings.NewReader("{\n \"token\": \"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\",\n \"name\": \"My Bot\",\n \"manage_enabled\": true,\n \"proxy_enabled\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:8080/api/bots/add")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"token\": \"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\",\n \"name\": \"My Bot\",\n \"manage_enabled\": true,\n \"proxy_enabled\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/api/bots/add")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"token\": \"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\",\n \"name\": \"My Bot\",\n \"manage_enabled\": true,\n \"proxy_enabled\": false\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"token": "<string>",
"name": "<string>",
"source": "cli",
"manage_enabled": true,
"proxy_enabled": true,
"backend_url": "<string>",
"secret_token": "<string>",
"long_poll_enabled": true,
"description": "<string>",
"running": true,
"webhook_mode": true,
"disabled": true
}{
"error": "bot not found"
}{
"error": "bot not found"
}{
"error": "bot not found"
}Authorizations
API key with bmx_ prefix. Obtain via /api/auth/api-keys.
Body
Telegram bot token
Display name for the bot
Enable chat management features
Enable proxy forwarding to backend_url
Backend URL to receive forwarded updates
Secret token for webhook validation
Response
Bot created successfully
Unique bot ID
Telegram bot token
Display name
Registration source (informational only — both types are functionally identical)
cli, web Whether chat management features are active for this bot
Whether this bot forwards updates to a backend URL
Backend URL to forward updates to (when proxy_enabled)
Secret token for validating backend webhook requests
Whether the long-poll endpoint buffers updates for this bot
Natural-language description used by the LLM router
Whether the bot is currently active (polling or webhook-registered)
Whether the bot is in webhook mode (not polled by BotMux)
Whether the bot is disabled. Disabled bots are stopped and do not poll or receive webhook updates.
Was this page helpful?