Skip to content

Outbound Calls

Outbound lets the agent place a Teams call (a call-back), speak a result or hold a conversation, and hang up. It is optional and off unless configured.

"outbound": {
"enabled": true,
"workerBaseUrl": "https://<your-standin-endpoint>",
"tenantId": "<aad-tenant-id>",
"answerTimeoutMs": 120000,
"defaultMode": "notify"
}
KeyMeaning
outbound.enabledTurn outbound on.
outbound.workerBaseUrlThe StandIn outbound API base URL.
outbound.tenantIdYour AAD tenant id for the callee.
outbound.answerTimeoutMsHow long to wait for an answer before treating it as no-answer (default 120000).
outbound.defaultModenotify (speak the message and hang up) or conversation (stay and talk).

The agent triggers an outbound call through its realtime tools. Under the hood the plugin makes an HMAC-signed request to the StandIn outbound API:

  • Signature headers x-openclawteamsbridge-timestamp / x-openclawteamsbridge-signature, signed over "{timestamp}.{userObjectId}" with your sharedSecret.
  • The request identifies the callee (userObjectId) and tenantId; StandIn returns a callId.
  • Requests are SSRF-guarded.

Once the callee answers, the same per-call WebSocket session begins and the conversation runs exactly like an inbound call.

  • If no one answers within answerTimeoutMs, the attempt is finalized as no-answer / voicemail.
  • The plugin also best-effort cancels the ringing call so a late pickup does not strand the callee in a dead call.
  • A late answer (after the timeout) is declined cleanly.
  • notify - the agent delivers a message and hangs up. Good for reminders and alerts.
  • conversation - the agent stays on the line for a back-and-forth.
  • Outbound needs the same sharedSecret as inbound - it signs the place-call request.
  • Set tenantId to the callee’s tenant.
  • Keep answerTimeoutMs realistic (people take a few rings); too short causes premature voicemail.