A trigger is the whole of a channel deployment. It binds an inbound event on a channel integration to a published text agent, and says what to do with the answer:
That is the entire model. A channel integration is never named in an agent’s config — nothing goes under mcps, nothing is frozen at publish, and the agent does not know it is deployed. Point the trigger somewhere else and the next message is answered by a different agent, with no republish.
There is exactly one trigger type, telegram.message.inbound, on exactly one provider. Telegram is the only channel Talqing has. The end-to-end walkthrough — BotFather, the bot token, the first message — is on Telegram; this page is the model behind it.

Creating one

Triggers live under an integration: POST /v1/integrations/{integration_id}/triggers.
enabled defaults to false, which is the useful default: a disabled trigger is a draft you can create while the agent is still being written, and it does not subscribe to anything.

Fields

string
required
telegram.message.inbound — the only value. Anything else is a schema error.
uuid
The agent that answers. Required to enable; a trigger created without one is valid and lands at needs_setup.
boolean
default:"false"
The switch. Turning it on runs every check below and performs the channel subscription.
string
default:"public_reply"
What happens with the agent’s answer. See reply modes.
object
Yours. Stored and returned untouched.
provider_subscription_ref is on the response too. It is written by the platform when the subscription is made — for Telegram, the callback URL registered with the Bot API — and there is no reason to send one.

What enabling checks

Every one of these runs on create with enabled: true, and again on any PATCH that leaves the trigger enabled. Two of them are worth dwelling on. Published, not draft. The check reads the agent’s published version and its channel comes from that frozen snapshot. Editing the draft afterwards changes nothing until you publish; publishing reaches the channel on the next message. One enabled trigger per integration and type. Not one trigger — one enabled one. You can keep several rows around and switch which is live, but two agents cannot both answer the same bot, because there would be no rule for which of them speaks.

What enabling does

For a provider with a managed subscription — Telegram — enabling the trigger registers the webhook with the provider for you. Nothing is pasted anywhere by hand. On success the trigger’s provider_subscription_ref holds the callback URL and its status is active. If the registration fails, the trigger row is kept and moved to error rather than deleted, and the call returns the provider’s own message:
Fix the cause and PATCH it enabled again; the registration is attempted afresh each time. Disabling or deleting a trigger tears the subscription down again, best effort, so the provider stops delivering. Deleting the integration takes its triggers with it and does the same.

Statuses

status is derived, not set. It is recomputed from enabled and the agent on every write; the one value you can write yourself is error, for marking a binding you know is broken.
Nothing re-validates a live trigger in the background. If you unpublish or delete the agent an active trigger points at, the trigger keeps saying active and the bot stops answering — inbound messages arrive and no reply is produced. Repoint the trigger before you retire an agent, not after.

Reply modes

internal_note is not usable on Telegram. The Bot API has no private-note surface for a chat, so the reply is never sent and the item settles skipped with provider telegram does not support reply_mode:internal_note. The API accepts the value — the refusal happens at delivery — so choosing it produces a bot that appears configured and says nothing. On Telegram the two real choices are public_reply and none. none is genuinely useful: it lets a new agent shadow a channel, generating answers into the conversation record that you can read on the Conversations page without anybody outside seeing them.

Changing and removing one

PATCH /v1/integrations/{integration_id}/triggers/{trigger_id} takes the same fields; omitted ones are left alone. Repointing at another agent, changing the reply mode and switching it off are all this one call.
Repointing an enabled trigger re-runs every check against the new agent, so an unpublished replacement is refused rather than quietly taking the channel down. DELETE /v1/integrations/{integration_id}/triggers/{trigger_id} removes it permanently and unsubscribes. There is nothing to undo — create it again. GET /v1/integrations/{integration_id}/triggers lists them, newest activity first:

What a fired trigger produces

Each firing is one session on the conversation for that person, recorded like any other: which agent version ran, its usage, its cost, how it ended. The messages are items on the thread. Nothing about reading it back is channel-specific — see conversations. Triggers are workspace resources like everything else, so they are regional: a trigger created against api.in.talqing.com exists only there.

Next

Telegram

The end-to-end walkthrough, and everything Telegram itself constrains.

Connecting

Creating the integration a trigger hangs off, and what each status means.

Text conversations

The thread model every trigger writes into.