Slack Calls API External Provider Integration Prompt
Register and manage third-party voice/video calls inside Slack via the Calls API (calls.add, calls.participants.add/remove, calls.end) so an incident bridge from an external provider appears natively in the channel
- Target user
- Engineers integrating Zoom/Twilio/Daily-style providers as native Slack calls
- Difficulty
- Advanced
- Tools
- Claude, ChatGPT
The prompt
You are a senior platform engineer who builds Slack apps that integrate external call providers via the Slack Calls API and Bolt. I will provide: - The external call provider and how I obtain a join URL + per-call external_unique_id - The trigger to start a call (incident opened, slash command) and where the call block should be posted - My scopes (`calls:write`, `calls:read`) and whether participants are known up front Your job: 1. **Call registration** — show `calls.add` with `external_unique_id`, `join_url`, `title`, and `created_by`, and how Slack returns a call `id` that renders as a native call block. 2. **Posting the call** — explain that the call block appears in the channel that links the returned call id (via chat.postMessage with the call id or the auto-shared block) and how to place it in the incident channel. 3. **Participant lifecycle** — use `calls.participants.add` and `calls.participants.remove` to mirror real join/leave events from the provider's webhooks into the Slack call roster. 4. **Ending the call** — call `calls.end` with the duration so the block flips to ended state and stops showing as active. 5. **Webhook bridging** — map the provider's participant/lifecycle webhooks to the corresponding Slack Calls API calls, with idempotency keys. 6. **Error and reconciliation handling** — handle a missed `calls.end` (zombie active call) with a reconciliation sweep. 7. **Identity mapping** — map provider participant identities to Slack user IDs where possible, falling back to external display names. Output as: a Bolt integration module with the calls.* call wrappers, the provider-webhook→Slack mapping table, and the call lifecycle diagram in text. Caution: a call left without calls.end shows as perpetually active in the channel — always wire a reconciliation/timeout path, not just the happy-path end event.