Reference 51 pages
On this page

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:

HeaderValue
AuthorizationThe value you saved with the trigger, for example Bearer <your key>. Optional.
X-Cyborg7-Eventagent.triggered
X-Cyborg7-Signaturesha256=<hex>: HMAC-SHA256 of the raw body, keyed by the SHA-256 of the signing secret you were shown once
X-Cyborg7-TimestampMilliseconds since the epoch
X-Cyborg7-DeliveryThe 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 coalesced and messageIds listing 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_limited in 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": null and a sentAt time (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 dropped in 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.