Skip to content

Commit 5b788ec

Browse files
github-actions[bot]examples-botclaude
authored
[Example] 460 — Webex Recording Transcription (Node.js) (#177)
## New example: Webex Recording Transcription <!-- metadata type: example number: 460 slug: webex-recording-transcription-node language: Node.js products: stt integrations: webex --> **Integration:** Cisco Webex | **Language:** Node.js | **Products:** STT ### What this shows A Node.js Express server that listens for Webex `meetingRecording.ready` webhooks, downloads the meeting recording audio via the Webex REST API, and transcribes it using Deepgram nova-3 with speaker diarization and smart formatting. Optionally posts the transcript back to a Webex space. ### Research note The original issue (#137) requested a real-time audio streaming bot using webex-node-bot-framework. Research found that: - webex-node-bot-framework is a **messaging bot** framework — it cannot join meetings or access audio streams - Webex does **not** expose real-time meeting audio via public APIs - The feasible approach is **recording-based transcription** using the Recordings API + webhooks This example implements the recording-based approach, which is the practical way to transcribe Webex meetings. ### Required secrets - `DEEPGRAM_API_KEY` - `WEBEX_BOT_TOKEN` — from Webex Developer Portal - `WEBEX_WEBHOOK_SECRET` — user-defined shared secret for webhook verification ### Tests ✅ Tests passed (with test credentials for webhook verification) ⚠️ Full end-to-end test requires real Webex credentials ``` Test 1: createApp() returns a configured Express app... ✓ createApp() returned an Express app Test 2: GET /health returns { status: "ok" }... ✓ GET /health returned { status: "ok" } Test 3: POST /webhook — invalid signature returns 401... ✓ Invalid signature correctly rejected with 401 Test 4: POST /webhook — non-recording event returns ignored... ✓ Non-recording event correctly returned { status: "ignored" } Test 5: POST /webhook — valid recording.ready returns processing... ✓ Valid recording.ready event accepted with { status: "processing" } ✓ All tests passed ``` Closes #137 --- *Built by Engineer on 2026-04-04* Co-authored-by: examples-bot <noreply@deepgram.com> Co-authored-by: Claude <noreply@anthropic.com>
1 parent 6377b7b commit 5b788ec

File tree

7 files changed

+1127
-0
lines changed

7 files changed

+1127
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Deepgram — https://console.deepgram.com/
2+
DEEPGRAM_API_KEY=
3+
4+
# Webex — https://developer.webex.com/my-apps
5+
WEBEX_BOT_TOKEN=
6+
WEBEX_WEBHOOK_SECRET=
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
save-exact=true
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# Webex Recording Transcription with Deepgram
2+
3+
Automatically transcribe Cisco Webex meeting recordings using Deepgram's nova-3 speech-to-text model. When a Webex meeting recording becomes available, this server receives a webhook, downloads the audio, transcribes it with Deepgram, and optionally posts the transcript back to a Webex space.
4+
5+
## What you'll build
6+
7+
A Node.js Express server that listens for Webex `meetingRecording.ready` webhooks, downloads the recording audio via the Webex REST API, sends it to Deepgram for transcription with speaker diarization, and logs the formatted transcript.
8+
9+
## Prerequisites
10+
11+
- Node.js 18+
12+
- pnpm
13+
- Deepgram account — [get a free API key](https://console.deepgram.com/)
14+
- Webex account — [create a bot](https://developer.webex.com/my-apps/new/bot)
15+
16+
## Environment variables
17+
18+
| Variable | Where to find it |
19+
|----------|-----------------|
20+
| `DEEPGRAM_API_KEY` | [Deepgram console](https://console.deepgram.com/) |
21+
| `WEBEX_BOT_TOKEN` | [Webex Developer Portal → My Apps](https://developer.webex.com/my-apps) — copy the Bot Access Token |
22+
| `WEBEX_WEBHOOK_SECRET` | You choose this value when creating the webhook via the Webex API |
23+
24+
## Install and run
25+
26+
```bash
27+
cp .env.example .env
28+
# Fill in your credentials in .env
29+
30+
pnpm install
31+
pnpm start
32+
```
33+
34+
Then register a Webex webhook pointing to your server:
35+
36+
```bash
37+
curl -X POST https://webexapis.com/v1/webhooks \
38+
-H "Authorization: Bearer $WEBEX_BOT_TOKEN" \
39+
-H "Content-Type: application/json" \
40+
-d '{
41+
"name": "Recording Transcription",
42+
"targetUrl": "https://your-server.example.com/webhook",
43+
"resource": "meetingRecordings",
44+
"event": "ready",
45+
"secret": "your-webhook-secret"
46+
}'
47+
```
48+
49+
## Key parameters
50+
51+
| Parameter | Value | Description |
52+
|-----------|-------|-------------|
53+
| `model` | `nova-3` | Deepgram's most accurate general-purpose model |
54+
| `diarize` | `true` | Enables speaker labels for multi-speaker meetings |
55+
| `smart_format` | `true` | Adds punctuation, capitalization, and number formatting |
56+
| `paragraphs` | `true` | Groups transcript into readable paragraphs |
57+
58+
## How it works
59+
60+
1. A Webex meeting ends and the recording is processed by Webex
61+
2. Webex sends a `meetingRecording.ready` webhook to this server
62+
3. The server verifies the webhook signature (HMAC-SHA1)
63+
4. It fetches the recording metadata from the Webex Recordings API
64+
5. It downloads the audio file using the temporary direct download link
65+
6. The audio buffer is sent to Deepgram's pre-recorded transcription API
66+
7. The transcript is logged, with speaker labels and paragraph formatting
67+
8. Optionally, the transcript is posted back to a Webex space
68+
69+
## Starter templates
70+
71+
[deepgram-starters](https://github.com/orgs/deepgram-starters/repositories)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "webex-recording-transcription-node",
3+
"version": "1.0.0",
4+
"description": "Transcribe Webex meeting recordings using Deepgram nova-3",
5+
"main": "src/server.js",
6+
"packageManager": "pnpm@9.6.0",
7+
"scripts": {
8+
"start": "node src/server.js",
9+
"test": "node tests/test.js"
10+
},
11+
"dependencies": {
12+
"@deepgram/sdk": "5.0.0",
13+
"dotenv": "16.4.7",
14+
"express": "4.22.1"
15+
},
16+
"pnpm": {
17+
"overrides": {
18+
"path-to-regexp": "0.1.13"
19+
}
20+
},
21+
"engines": {
22+
"node": ">=18"
23+
}
24+
}

0 commit comments

Comments
 (0)