← Back to Settings

External Bot Bridge

Connect any external bot (Telegram, Discord, Slack, custom) to your NavOrb brain. Your orb's personality, memory, skills, and preferred model are applied — the user's bot becomes a client of your orb.

Trial accounts can connect 1 bot at 10 requests/min. Core can connect 5 bots. Elite can connect 10 bots. Master can connect 25 bots. Requests use the user's selected NavOrb model and deduct NavOrb credits. Every bridge reply includes anai_disclosurefield — bots must not present replies as coming from a human.
1

Mint a bridge token

Go to Settings → External Bot Bridge, give it a name (e.g. "My Telegram Bot"), and click Mint Token. Copy the token — it's only shown once.
2

Paste it into your bot code

Treat it like a password. Store it in your environment as NAVORB_TOKEN.
3

Send messages to the bridge

POST to https://navorb.ai/api/bridge/chat with the token as a Bearer auth header.

Code Examples

cURLbash
curl https://navorb.ai/api/bridge/chat \
  -H "Authorization: Bearer nvorb_live_xxx..." \
  -H "Content-Type: application/json" \
  -d '{
    "message": "What should I do today?",
    "stream": false
  }'
Node.jsjs
const res = await fetch('https://navorb.ai/api/bridge/chat', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.NAVORB_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    message: "What should I do today?",
    stream: false,
  }),
});

const { reply, model } = await res.json();
console.log(reply);
Python (Telegram bot)python
import os
import requests
from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, filters

async def handle(update: Update, ctx):
    r = requests.post(
        "https://navorb.ai/api/bridge/chat",
        headers={
            "Authorization": f"Bearer {os.environ['NAVORB_TOKEN']}",
            "Content-Type": "application/json",
        },
        json={"message": update.message.text, "stream": False},
        timeout=60,
    )
    reply = r.json().get("reply", "…")
    await update.message.reply_text(reply)

app = ApplicationBuilder().token(os.environ["TG_BOT_TOKEN"]).build()
app.add_handler(MessageHandler(filters.TEXT, handle))
app.run_polling()
Discord.jsjs
import { Client, GatewayIntentBits } from 'discord.js';

const client = new Client({ intents: [
  GatewayIntentBits.Guilds,
  GatewayIntentBits.GuildMessages,
  GatewayIntentBits.MessageContent,
]});

client.on('messageCreate', async (msg) => {
  if (msg.author.bot) return;
  const res = await fetch('https://navorb.ai/api/bridge/chat', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.NAVORB_TOKEN}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ message: msg.content }),
  });
  const { reply } = await res.json();
  msg.reply(reply);
});

client.login(process.env.DISCORD_TOKEN);

Response Reference

# 200 OK
{
  "reply": "Here's what I think...",
  "model": "qwen/qwen3.7-plus",
  "conversation_id": null
}
401
Missing or invalid bridge token
402
Insufficient credits or plan token limit reached
403
Token revoked or lacks chat scope
429
Rate limit exceeded (default 30/min per token)
400
Content flagged by AUP — see categories field
500
Generation failed — check model availability

Streaming

Set "stream": true in the request body to receive a text/plain SSE stream instead of JSON. Useful when driving real-time chat UIs.

Best Practices