Skip to main content
A sender is what your agent talks from: a Telegram bot or an iMessage line (and a WhatsApp number once WhatsApp is available). Flow hosts every sender, so you never manage channel credentials.
address.link opens a chat with the sender: https://t.me/... for a Telegram bot (and https://wa.me/... for a WhatsApp number, once available). On the Telegram sandbox bot the link carries your join code (https://t.me/<bot>?start=<code>), so opening it and tapping Start joins your app. For an iMessage line it is the line’s opt-in link, which opens Messages with the line and a prefilled text the person sends to start the conversation; it is set only when the line has one configured.

Two kinds of sender

The sandbox and join codes

A shared sender serves many apps at once. A person joins your app by sending its join code, such as join wild-otter-04508705, to the sandbox sender. On Telegram, opening the sender’s address.link and tapping Start does the same; typing join <code> is the fallback when the link can’t be used. From then on their messages reach your app, and your app can message them.
  • A join code is two words and eight digits. Your app’s code is sandbox_join_code in GET /v1/app (the bare code, for example wild-otter-04508705); each shared sender shows what a person sends as join_code (join wild-otter-04508705).
  • A join starts a conversation and sends you conversation.started with via: "sandbox_join".
  • Your test key cannot message anyone who has not joined. That is what keeps the sandbox safe for everyone.

Status and limits

Each sender has its own status and budget for starting conversations: limits.new_contacts_per_day and limits.new_contacts_per_hour are the sender’s current budget for starting conversations; WhatsApp senders (once available) also show quality_rating and limits.whatsapp_tier. Every change arrives as a sender.status_changed event. The rules behind them are on The send gate.