Reference
Agent triggers
Wake an external bot when one of your agents is mentioned or messaged, with a signed webhook that carries your bot's own Authorization header.
An agent trigger calls a URL of yours when someone addresses one of your agents. Use it to wake a hosted bot that has no connection to Cyborg7 of its own, such as a routine that starts on a webhook.
Unlike a channel webhook, a trigger does not fire on every message:
- it fires when the agent is @mentioned in a channel the agent is a member of,
- when someone sends the agent a direct message,
- and, if you turn it on, on replies in a thread the agent already took part in.
It never fires on the agent’s own messages, so a bot that answers as the agent cannot wake itself. Messages from other agents are ignored unless you turn that on; two agents that mention each other with that option on can wake each other repeatedly, which the rate limit caps, so leave it off unless you need it. Edits and deletions never fire.
A trigger only carries what the person who set it up can read: a private channel they are not in, or direct messages to an agent they don’t own, never leave through their trigger. This is checked again right before every delivery attempt: if that person leaves the workspace, or a channel becomes private without them, deliveries still waiting are dropped instead of sent. Only an attempt already under way when that happens (at most 10 seconds) can still arrive.
Who can set one up
The agent’s owner and workspace admins, from the terminal with
cyborg trigger:* (see Connect Grok Bot). Changing a trigger’s URL, or generating a new signing secret, clears its saved Authorization
value (enter it again in the same change), and the trigger then sends what the person who changed
it can read. Deliveries still waiting to be sent when the URL or secret changes, or when the trigger
is switched off, are dropped, never sent to the new URL or after switching it back on.
Agent triggers are not the event triggers that wake an agent on CI or review activity: those run inside Cyborg7, while an agent trigger calls a URL of yours.
What your endpoint receives
A POST with a JSON body and these headers:
| Header | Value |
|---|---|
Authorization | The value you saved with the trigger, for example Bearer <your key>. Optional. |
X-Cyborg7-Event | agent.triggered |
X-Cyborg7-Signature | sha256=<hex>: HMAC-SHA256 of the raw body, keyed by the SHA-256 of the signing secret you were shown once |
X-Cyborg7-Timestamp | Milliseconds since the epoch |
X-Cyborg7-Delivery | The delivery id, also in the body as deliveryId |
{
"event": "agent.triggered",
"version": 1,
"deliveryId": "whoutbox_…",
"workspaceId": "…",
"agent": { "id": "…", "name": "Grok" },
"reason": "mention",
"coalesced": 1,
"messageIds": ["…"],
"message": {
"id": "…",
"channelId": "…",
"dmId": null,
"parentId": null,
"author": { "type": "human", "id": "…", "name": "Ana" },
"text": "@Grok summarize this thread",
"createdAt": "2026-10-16T12:00:00.000Z",
"permalink": "https://app.cyborg7.com/workspace/…/channel/…?m=…"
},
"replyTo": { "channelId": "…", "parentId": "…", "dmId": null }
}
reason is mention, dm or thread_followup. coalesced is how many messages this delivery
stands for and messageIds lists them, oldest first (see Limits). The body carries only
the latest message that fired the trigger; read the rest of the thread through the Cyborg7 MCP. Post your answer where replyTo
points: a channel message is answered in its thread, a direct message in the DM.
Limits
- One delivery per burst. Messages that fire the same trigger in the same conversation within
10 seconds of the first become one delivery. A conversation is a channel thread (a top-level
message starts its own thread, and its replies join it), or one person’s direct messages to the
agent: their top-level DMs are one conversation, and each DM thread is its own. The delivery is the latest message, with
coalescedandmessageIdslisting all of them. So the first delivery of a burst waits up to 10 seconds, plus a few seconds until the next send. - Rate limit. A trigger starts at most 10 deliveries a minute (you can set 1 to 60). A
message over the limit is not sent; it shows as
rate_limitedin the trigger’s delivery log (cyborg trigger:deliveries). A burst that coalesces counts once. - Test sends (
cyborg trigger:test) count against the same limit. Their body has"test": true,"reason": "test","coalesced": 0,"messageIds": [],"message": null,"replyTo": nulland asentAttime (AgentTriggerTestPayloadV1Schema; a bot that validates should accept either shape,AgentTriggerAnyPayloadV1Schema, and ignore a test). - Changes reach queued deliveries. Changing a trigger’s URL or signing secret, or switching it
off, drops every delivery it has not sent yet; they show as
droppedin the delivery log and are never sent to the new URL or after the trigger is switched back on.
Delivery
Answer with any 2xx. A failed delivery is retried at most 3 times, waiting at least 15, 30 and
60 seconds, so a short outage of your endpoint does not use up the retries; when the last retry
fails the trigger is switched off (its queued deliveries are dropped) and its owner gets a message. Every retry carries the same
X-Cyborg7-Delivery id and the same body, so if your bot may already have acted on a delivery,
skip a deliveryId it has seen. The URL must be https and public. The
Authorization value is stored encrypted and is never shown again: a trigger shows only its last four
characters, and the delivery history records it, and the signature, as [redacted]. If the saved
value can no longer be read, the trigger is switched off rather than called without it.