{"id":"e88460e2-63b6-4568-a93f-56bc1e09763e","shortId":"NMM5NX","kind":"skill","title":"telnyx-voice-media-javascript","tagline":">-","description":"<!-- Auto-generated from Telnyx OpenAPI specs. Do not edit. -->\n\n# Telnyx Voice Media - JavaScript\n\n## Installation\n\n```bash\nnpm install telnyx\n```\n\n## Setup\n\n```javascript\nimport Telnyx from 'telnyx';\n\nconst client = new Telnyx({\n  apiKey: process.env['TELNYX_API_KEY'], // This is the default and can be omitted\n});\n```\n\nAll examples below assume `client` is already initialized as shown above.\n\n## Error Handling\n\nAll API calls can fail with network errors, rate limits (429), validation errors (422),\nor authentication errors (401). Always handle errors in production code:\n\n```javascript\ntry {\n  const result = await client.messages.send({ to: '+13125550001', from: '+13125550002', text: 'Hello' });\n} catch (err) {\n  if (err instanceof Telnyx.APIConnectionError) {\n    console.error('Network error — check connectivity and retry');\n  } else if (err instanceof Telnyx.RateLimitError) {\n    // 429: rate limited — wait and retry with exponential backoff\n    const retryAfter = err.headers?.['retry-after'] || 1;\n    await new Promise(r => setTimeout(r, retryAfter * 1000));\n  } else if (err instanceof Telnyx.APIError) {\n    console.error(`API error ${err.status}: ${err.message}`);\n    if (err.status === 422) {\n      console.error('Validation error — check required fields and formats');\n    }\n  }\n}\n```\n\nCommon error codes: `401` invalid API key, `403` insufficient permissions,\n`404` resource not found, `422` validation error (check field formats),\n`429` rate limited (retry with exponential backoff).\n\n## Play audio URL\n\nPlay an audio file on the call. If multiple play audio commands are issued consecutively,\nthe audio files will be placed in a queue awaiting playback. *Notes:*\n\n- When `overlay` is enabled, `target_legs` is limited to `self`.\n\n`POST /calls/{call_control_id}/actions/playback_start`\n\nOptional: `audio_type` (enum: mp3, wav), `audio_url` (string), `cache_audio` (boolean), `client_state` (string), `command_id` (string), `loop` (string), `media_name` (string), `overlay` (boolean), `playback_content` (string), `stop` (string), `target_legs` (string)\n\n```javascript\nconst response = await client.calls.actions.startPlayback('v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ');\n\nconsole.log(response.data);\n```\n\nReturns: `result` (string)\n\n## Stop audio playback\n\nStop audio being played on the call. **Expected Webhooks:**\n\n- `call.playback.ended` or `call.speak.ended`\n\n`POST /calls/{call_control_id}/actions/playback_stop`\n\nOptional: `client_state` (string), `command_id` (string), `overlay` (boolean), `stop` (string)\n\n```javascript\nconst response = await client.calls.actions.stopPlayback('v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ');\n\nconsole.log(response.data);\n```\n\nReturns: `result` (string)\n\n## Record pause\n\nPause recording the call. Recording can be resumed via Resume recording command. **Expected Webhooks:**\n\nThere are no webhooks associated with this command.\n\n`POST /calls/{call_control_id}/actions/record_pause`\n\nOptional: `client_state` (string), `command_id` (string), `recording_id` (uuid)\n\n```javascript\nconst response = await client.calls.actions.pauseRecording('v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ');\n\nconsole.log(response.data);\n```\n\nReturns: `result` (string)\n\n## Record resume\n\nResume recording the call. **Expected Webhooks:**\n\nThere are no webhooks associated with this command.\n\n`POST /calls/{call_control_id}/actions/record_resume`\n\nOptional: `client_state` (string), `command_id` (string), `recording_id` (uuid)\n\n```javascript\nconst response = await client.calls.actions.resumeRecording('v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ');\n\nconsole.log(response.data);\n```\n\nReturns: `result` (string)\n\n## Recording start\n\nStart recording the call. Recording will stop on call hang-up, or can be initiated via the Stop Recording command. **Expected Webhooks:**\n\n- `call.recording.saved`\n- `call.recording.transcription.saved`\n- `call.recording.error`\n\n`POST /calls/{call_control_id}/actions/record_start` — Required: `format`, `channels`\n\nOptional: `client_state` (string), `command_id` (string), `custom_file_name` (string), `max_length` (int32), `play_beep` (boolean), `recording_track` (enum: both, inbound, outbound), `timeout_secs` (int32), `transcription` (boolean), `transcription_engine` (enum: A, B, deepgram/nova-3), `transcription_language` (enum: af, af-ZA, am, am-ET, ar, ar-AE, ar-BH, ar-DZ, ar-EG, ar-IL, ar-IQ, ar-JO, ar-KW, ar-LB, ar-MA, ar-MR, ar-OM, ar-PS, ar-QA, ar-SA, ar-TN, ar-YE, as, auto_detect, az, az-AZ, ba, be, bg, bg-BG, bn, bn-BD, bn-IN, bo, br, bs, bs-BA, ca, ca-ES, cs, cs-CZ, cy, da, da-DK, de, de-AT, de-CH, de-DE, el, el-GR, en, en-AU, en-CA, en-GB, en-GH, en-HK, en-IE, en-IN, en-KE, en-NG, en-NZ, en-PH, en-PK, en-SG, en-TZ, en-US, en-ZA, es, es-419, es-AR, es-BO, es-CL, es-CO, es-CR, es-DO, es-EC, es-ES, es-GT, es-HN, es-MX, es-NI, es-PA, es-PE, es-PR, es-PY, es-SV, es-US, es-UY, es-VE, et, et-EE, eu, eu-ES, fa, fa-IR, fi, fi-FI, fil-PH, fo, fr, fr-BE, fr-CA, fr-CH, fr-FR, gl, gl-ES, gu, gu-IN, ha, haw, he, hi, hi-IN, hr, hr-HR, ht, hu, hu-HU, hy, hy-AM, id, id-ID, is, is-IS, it, it-CH, it-IT, iw-IL, ja, ja-JP, jv-ID, jw, ka, ka-GE, kk, kk-KZ, km, km-KH, kn, kn-IN, ko, ko-KR, la, lb, ln, lo, lo-LA, lt, lt-LT, lv, lv-LV, mg, mi, mk, mk-MK, ml, ml-IN, mn, mn-MN, mr, mr-IN, ms, ms-MY, mt, my, my-MM, ne, ne-NP, nl, nl-BE, nl-NL, nn, no, no-NO, oc, pa, pa-Guru-IN, pl, pl-PL, ps, pt, pt-BR, pt-PT, ro, ro-RO, ru, ru-RU, rw-RW, sa, sd, si, si-LK, sk, sk-SK, sl, sl-SI, sn, so, sq, sq-AL, sr, sr-RS, ss-latn-za, st-ZA, su, su-ID, sv, sv-SE, sw, sw-KE, sw-TZ, ta, ta-IN, ta-LK, ta-MY, ta-SG, te, te-IN, tg, th, th-TH, tk, tl, tn-latn-za, tr, tr-TR, ts-ZA, tt, uk, uk-UA, ur, ur-IN, ur-PK, uz, uz-UZ, ve-ZA, vi, vi-VN, xh-ZA, yi, yo, yue-Hant-HK, zh, zh-TW, zu-ZA), `transcription_max_speaker_count` (int32), `transcription_min_speaker_count` (int32), `transcription_profanity_filter` (boolean), `transcription_speaker_diarization` (boolean), `trim` (enum: trim-silence)\n\n```javascript\nconst response = await client.calls.actions.startRecording('call_control_id', {\n  channels: 'single',\n  format: 'wav',\n});\n\nconsole.log(response.data);\n```\n\nReturns: `result` (string)\n\n## Recording stop\n\nStop recording the call. **Expected Webhooks:**\n\n- `call.recording.saved`\n\n`POST /calls/{call_control_id}/actions/record_stop`\n\nOptional: `client_state` (string), `command_id` (string), `recording_id` (uuid)\n\n```javascript\nconst response = await client.calls.actions.stopRecording('v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ');\n\nconsole.log(response.data);\n```\n\nReturns: `result` (string)\n\n## Speak text\n\nConvert text to speech and play it back on the call. If multiple speak text commands are issued consecutively, the audio files will be placed in a queue awaiting playback. **Expected Webhooks:**\n\n- `call.speak.started`\n- `call.speak.ended`\n\n`POST /calls/{call_control_id}/actions/speak` — Required: `payload`, `voice`\n\nOptional: `client_state` (string), `command_id` (string), `language` (enum: arb, cmn-CN, cy-GB, da-DK, de-DE, en-AU, en-GB, en-GB-WLS, en-IN, en-US, es-ES, es-MX, es-US, fr-CA, fr-FR, hi-IN, is-IS, it-IT, ja-JP, ko-KR, nb-NO, nl-NL, pl-PL, pt-BR, pt-PT, ro-RO, ru-RU, sv-SE, tr-TR), `loop` (string), `payload_type` (enum: text, ssml), `service_level` (enum: basic, premium), `stop` (string), `target_legs` (enum: self, opposite, both), `voice_settings` (object)\n\n```javascript\nconst response = await client.calls.actions.speak('call_control_id', {\n  payload: 'Say this on the call',\n  voice: 'female',\n    language: 'en-US',\n});\n\nconsole.log(response.data);\n```\n\nReturns: `result` (string)\n\n---\n\n## Webhooks\n\n### Webhook Verification\n\nTelnyx signs webhooks with Ed25519. Each request includes `telnyx-signature-ed25519`\nand `telnyx-timestamp` headers. Always verify signatures in production:\n\n```javascript\n// In your webhook handler (e.g., Express — use raw body, not parsed JSON):\napp.post('/webhooks', express.raw({ type: 'application/json' }), async (req, res) => {\n  try {\n    const event = await client.webhooks.unwrap(req.body.toString(), {\n      headers: req.headers,\n    });\n    // Signature valid — event is the parsed webhook payload\n    console.log('Received event:', event.data.event_type);\n    res.status(200).send('OK');\n  } catch (err) {\n    console.error('Webhook verification failed:', err.message);\n    res.status(400).send('Invalid signature');\n  }\n});\n```\n\nThe following webhook events are sent to your configured webhook URL.\nAll webhooks include `telnyx-timestamp` and `telnyx-signature-ed25519` headers for Ed25519 signature verification. Use `client.webhooks.unwrap()` to verify.\n\n| Event | Description |\n|-------|-------------|\n| `callPlaybackEnded` | Call Playback Ended |\n| `callPlaybackStarted` | Call Playback Started |\n| `callRecordingError` | Call Recording Error |\n| `callRecordingSaved` | Call Recording Saved |\n| `callRecordingTranscriptionSaved` | Call Recording Transcription Saved |\n| `callSpeakEnded` | Call Speak Ended |\n| `callSpeakStarted` | Call Speak Started |\n\n### Webhook payload fields\n\n**`callPlaybackEnded`**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `data.record_type` | enum: event | Identifies the type of the resource. |\n| `data.event_type` | enum: call.playback.ended | The type of event being delivered. |\n| `data.id` | uuid | Identifies the type of resource. |\n| `data.occurred_at` | date-time | ISO 8601 datetime of when the event occurred. |\n| `data.payload.call_control_id` | string | Call ID used to issue commands via Call Control API. |\n| `data.payload.connection_id` | string | Call Control App ID (formerly Telnyx connection ID) used in the call. |\n| `data.payload.call_leg_id` | string | ID that is unique to the call and can be used to correlate webhook events. |\n| `data.payload.call_session_id` | string | ID that is unique to the call session and can be used to correlate webhook events. |\n| `data.payload.client_state` | string | State received from a command. |\n| `data.payload.media_url` | string | The audio URL being played back, if audio_url has been used to start. |\n| `data.payload.media_name` | string | The name of the audio media file being played back, if media_name has been used to start. |\n| `data.payload.overlay` | boolean | Whether the stopped audio was in overlay mode or not. |\n| `data.payload.status` | enum: file_not_found, call_hangup, unknown, cancelled, cancelled_amd, completed, failed | Reflects how command ended. |\n| `data.payload.status_detail` | string | Provides details in case of failure. |\n\n**`callPlaybackStarted`**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `data.record_type` | enum: event | Identifies the type of the resource. |\n| `data.event_type` | enum: call.playback.started | The type of event being delivered. |\n| `data.id` | uuid | Identifies the type of resource. |\n| `data.occurred_at` | date-time | ISO 8601 datetime of when the event occurred. |\n| `data.payload.call_control_id` | string | Call ID used to issue commands via Call Control API. |\n| `data.payload.connection_id` | string | Call Control App ID (formerly Telnyx connection ID) used in the call. |\n| `data.payload.call_leg_id` | string | ID that is unique to the call and can be used to correlate webhook events. |\n| `data.payload.call_session_id` | string | ID that is unique to the call session and can be used to correlate webhook events. |\n| `data.payload.client_state` | string | State received from a command. |\n| `data.payload.media_url` | string | The audio URL being played back, if audio_url has been used to start. |\n| `data.payload.media_name` | string | The name of the audio media file being played back, if media_name has been used to start. |\n| `data.payload.overlay` | boolean | Whether the audio is going to be played in overlay mode or not. |\n\n**`callRecordingError`**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `data.record_type` | enum: event | Identifies the type of the resource. |\n| `data.event_type` | enum: call.recording.error | The type of event being delivered. |\n| `data.id` | uuid | Identifies the type of resource. |\n| `data.occurred_at` | date-time | ISO 8601 datetime of when the event occurred. |\n| `data.payload.call_control_id` | string | Call ID used to issue commands via Call Control API. |\n| `data.payload.connection_id` | string | Call Control App ID (formerly Telnyx connection ID) used in the call. |\n| `data.payload.call_leg_id` | string | ID that is unique to the call and can be used to correlate webhook events. |\n| `data.payload.call_session_id` | string | ID that is unique to the call session and can be used to correlate webhook events. |\n| `data.payload.client_state` | string | State received from a command. |\n| `data.payload.reason` | enum: Failed to authorize with storage using custom credentials, Invalid credentials json, Unsupported backend, Internal server error | Indication that there was a problem recording the call. |\n\n**`callRecordingSaved`**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `data.record_type` | enum: event | Identifies the type of the resource. |\n| `data.event_type` | enum: call.recording.saved | The type of event being delivered. |\n| `data.id` | uuid | Identifies the type of resource. |\n| `data.occurred_at` | date-time | ISO 8601 datetime of when the event occurred. |\n| `data.payload.call_leg_id` | string | ID that is unique to the call and can be used to correlate webhook events. |\n| `data.payload.call_session_id` | string | ID that is unique to the call session and can be used to correlate webhook events. |\n| `data.payload.connection_id` | string | Call Control App ID (formerly Telnyx connection ID) used in the call. |\n| `data.payload.client_state` | string | State received from a command. |\n| `data.payload.recording_started_at` | date-time | ISO 8601 datetime of when recording started. |\n| `data.payload.recording_ended_at` | date-time | ISO 8601 datetime of when recording ended. |\n| `data.payload.channels` | enum: single, dual | Whether recording was recorded in `single` or `dual` channel. |\n\n**`callRecordingTranscriptionSaved`**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `data.record_type` | enum: event | Identifies the type of the resource. |\n| `data.event_type` | enum: call.recording.transcription.saved | The type of event being delivered. |\n| `data.id` | uuid | Identifies the type of resource. |\n| `data.occurred_at` | date-time | ISO 8601 datetime of when the event occurred. |\n| `data.payload.call_control_id` | string | Call ID used to issue commands via Call Control API. |\n| `data.payload.connection_id` | string | Call Control App ID (formerly Telnyx connection ID) used in the call. |\n| `data.payload.call_leg_id` | string | ID that is unique to the call and can be used to correlate webhook events. |\n| `data.payload.call_session_id` | string | ID that is unique to the call session and can be used to correlate webhook events. |\n| `data.payload.client_state` | string | State received from a command. |\n| `data.payload.calling_party_type` | enum: pstn, sip | The type of calling party connection. |\n| `data.payload.recording_id` | string | ID that is unique to the recording session and can be used to correlate webhook events. |\n| `data.payload.recording_transcription_id` | string | ID that is unique to the transcription process and can be used to correlate webhook events. |\n| `data.payload.status` | enum: completed | The transcription status. |\n| `data.payload.transcription_text` | string | The transcribed text |\n\n**`callSpeakEnded`**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `data.record_type` | enum: event | Identifies the type of the resource. |\n| `data.event_type` | enum: call.speak.ended | The type of event being delivered. |\n| `data.id` | uuid | Identifies the type of resource. |\n| `data.occurred_at` | date-time | ISO 8601 datetime of when the event occurred. |\n| `data.payload.call_control_id` | string | Call ID used to issue commands via Call Control API. |\n| `data.payload.connection_id` | string | Call Control App ID (formerly Telnyx connection ID) used in the call. |\n| `data.payload.call_leg_id` | string | ID that is unique to the call and can be used to correlate webhook events. |\n| `data.payload.call_session_id` | string | ID that is unique to the call session and can be used to correlate webhook events. |\n| `data.payload.client_state` | string | State received from a command. |\n| `data.payload.status` | enum: completed, call_hangup, cancelled_amd | Reflects how the command ended. |\n\n**`callSpeakStarted`**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `data.record_type` | enum: event | Identifies the type of the resource. |\n| `data.event_type` | enum: call.speak.started | The type of event being delivered. |\n| `data.id` | uuid | Identifies the type of resource. |\n| `data.occurred_at` | date-time | ISO 8601 datetime of when the event occurred. |\n| `data.payload.call_control_id` | string | Call ID used to issue commands via Call Control API. |\n| `data.payload.connection_id` | string | Call Control App ID (formerly Telnyx connection ID) used in the call. |\n| `data.payload.call_leg_id` | string | ID that is unique to the call and can be used to correlate webhook events. |\n| `data.payload.call_session_id` | string | ID that is unique to the call session and can be used to correlate webhook events. |\n| `data.payload.client_state` | string | State received from a command. |","tags":["telnyx","voice","media","javascript","team-telnyx","agent-skills","ai-coding-agent","claude-code","cpaas","cursor","iot","llm"],"capabilities":["skill","source-team-telnyx","skill-telnyx-voice-media-javascript","topic-agent-skills","topic-ai-coding-agent","topic-claude-code","topic-cpaas","topic-cursor","topic-iot","topic-llm","topic-sdk","topic-sip","topic-sms","topic-speech-to-text","topic-telephony"],"categories":["ai"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/team-telnyx/ai/telnyx-voice-media-javascript","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add team-telnyx/ai","source_repo":"https://github.com/team-telnyx/ai","install_from":"skills.sh"}},"qualityScore":"0.533","qualityRationale":"deterministic score 0.53 from registry signals: · indexed on github topic:agent-skills · 167 github stars · SKILL.md body (17,530 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T00:54:53.630Z","embedding":null,"createdAt":"2026-04-18T22:08:33.644Z","updatedAt":"2026-04-22T00:54:53.630Z","lastSeenAt":"2026-04-22T00:54:53.630Z","tsv":"'+13125550001':82 '+13125550002':84 '-419':670 '/actions/playback_start':222 '/actions/playback_stop':294 '/actions/record_pause':353 '/actions/record_resume':403 '/actions/record_start':465 '/actions/record_stop':1099 '/actions/speak':1169 '/calls':218,290,349,399,461,1095,1165 '/webhooks':1355 '1':120 '1000':128 '200':1384 '400':1395 '401':68,153 '403':157 '404':160 '41d4':265,315,373,423,1119 '422':64,141,164 '429':61,105,170 '446655440000':267,317,375,425,1121 '550e8400':262,312,370,420,1116 '8601':1501,1697,1870,2017,2093,2106,2162,2345,2477 'a716':266,316,374,424,1120 'ae':517 'af':506,508 'af-za':507 'al':944 'alreadi':44 'alway':69,1336 'am-et':511 'amd':1644,2434 'api':28,52,135,155,1521,1717,1890,2182,2365,2497 'apikey':25 'app':1527,1723,1896,2068,2188,2371,2503 'app.post':1354 'application/json':1358 'ar':514,516,519,522,525,528,531,534,537,540,543,546,549,552,555,558,561,564,673 'ar-a':515 'ar-bh':518 'ar-dz':521 'ar-eg':524 'ar-il':527 'ar-iq':530 'ar-jo':533 'ar-kw':536 'ar-lb':539 'ar-ma':542 'ar-mr':545 'ar-om':548 'ar-p':551 'ar-qa':554 'ar-sa':557 'ar-tn':560 'ar-y':563 'arb':1182 'associ':344,394 'assum':41 'async':1359 'au':622,1197 'audio':178,182,190,196,224,229,233,275,278,1150,1588,1594,1608,1627,1784,1790,1804,1822 'authent':66 'author':1957 'auto':567 'await':79,121,204,259,309,367,417,1071,1113,1158,1294,1365 'az':569,571,572 'az-az':570 'b':501 'ba':573,591 'back':1137,1592,1613,1788,1809 'backend':1967 'backoff':113,176 'bash':11 'basic':1278 'bd':582 'beep':484 'bg':575,577,578 'bg-bg':576 'bh':520 'bn':579,581,584 'bn-bd':580 'bn-in':583 'bo':586,676 'bodi':1350 'boolean':234,247,303,485,496,1058,1062,1623,1819 'br':587,910,1252 'bs':588,590 'bs-ba':589 'ca':592,594,625,757,1222 'ca-e':593 'cach':232 'call':53,186,219,283,291,329,350,387,400,437,442,462,1073,1090,1096,1140,1166,1296,1304,1433,1437,1441,1445,1449,1454,1458,1512,1519,1525,1536,1547,1566,1639,1708,1715,1721,1732,1743,1762,1881,1888,1894,1905,1916,1935,1979,2034,2053,2066,2077,2173,2180,2186,2197,2208,2227,2254,2356,2363,2369,2380,2391,2410,2431,2488,2495,2501,2512,2523,2542 'call.playback.ended':286,1481 'call.playback.started':1677 'call.recording.error':459,1850 'call.recording.saved':457,1093,1997 'call.recording.transcription.saved':458,2142 'call.speak.ended':288,1163,2325 'call.speak.started':1162,2457 'callplaybackend':1432,1464 'callplaybackstart':1436,1660 'callrecordingerror':1440,1833 'callrecordingsav':1444,1980 'callrecordingtranscriptionsav':1448,2125 'callspeakend':1453,2308 'callspeakstart':1457,2440 'cancel':1642,1643,2433 'case':1657 'catch':87,1387 'ch':611,760,803 'channel':468,1076,2124 'check':96,145,167 'cl':679 'client':22,42,235,296,355,405,470,1101,1174 'client.calls.actions.pauserecording':368 'client.calls.actions.resumerecording':418 'client.calls.actions.speak':1295 'client.calls.actions.startplayback':260 'client.calls.actions.startrecording':1072 'client.calls.actions.stopplayback':310 'client.calls.actions.stoprecording':1114 'client.messages.send':80 'client.webhooks.unwrap':1366,1427 'cmn':1184 'cmn-cn':1183 'cn':1185 'co':682 'code':74,152 'command':191,238,299,337,347,358,397,408,454,473,1104,1145,1177,1517,1583,1649,1713,1779,1886,1952,2085,2178,2244,2361,2427,2438,2493,2559 'common':150 'complet':1645,2298,2430 'configur':1407 'connect':97,1531,1727,1900,2072,2192,2256,2375,2507 'consecut':194,1148 'console.error':93,134,142,1389 'console.log':269,319,377,427,1080,1123,1311,1378 'const':21,77,114,257,307,365,415,1069,1111,1292,1363 'content':249 'control':220,292,351,401,463,1074,1097,1167,1297,1509,1520,1526,1705,1716,1722,1878,1889,1895,2067,2170,2181,2187,2353,2364,2370,2485,2496,2502 'convert':1130 'correl':1553,1573,1749,1769,1922,1942,2040,2060,2214,2234,2273,2293,2397,2417,2529,2549 'count':1048,1053 'cr':685 'credenti':1962,1964 'cs':596,598 'cs-cz':597 'custom':476,1961 'cy':600,1187 'cy-gb':1186 'cz':599 'da':601,603,1190 'da-dk':602,1189 'data.event':1478,1674,1847,1994,2139,2322,2454 'data.id':1488,1684,1857,2004,2149,2332,2464 'data.occurred':1495,1691,1864,2011,2156,2339,2471 'data.payload.call':1508,1537,1556,1704,1733,1752,1877,1906,1925,2024,2043,2169,2198,2217,2352,2381,2400,2484,2513,2532 'data.payload.calling':2245 'data.payload.channels':2112 'data.payload.client':1576,1772,1945,2078,2237,2420,2552 'data.payload.connection':1522,1718,1891,2063,2183,2366,2498 'data.payload.media':1584,1601,1780,1797 'data.payload.overlay':1622,1818 'data.payload.reason':1953 'data.payload.recording':2086,2099,2257,2276 'data.payload.status':1634,1651,2296,2428 'data.payload.transcription':2302 'data.record':1468,1664,1837,1984,2129,2312,2444 'date':1498,1694,1867,2014,2090,2103,2159,2342,2474 'date-tim':1497,1693,1866,2013,2089,2102,2158,2341,2473 'datetim':1502,1698,1871,2018,2094,2107,2163,2346,2478 'de':605,607,610,613,614,1193,1194 'de-at':606 'de-ch':609 'de-d':612,1192 'deepgram/nova-3':502 'default':33 'deliv':1487,1683,1856,2003,2148,2331,2463 'descript':1431,1467,1663,1836,1983,2128,2311,2443 'detail':1652,1655 'detect':568 'diariz':1061 'dk':604,1191 'dual':2115,2123 'dz':523 'e.g':1346 'e29b':264,314,372,422,1118 'e29b-41d4-a716':263,313,371,421,1117 'ec':691 'ed25519':1323,1330,1420,1423 'ee':734 'eg':526 'el':615,617 'el-gr':616 'els':100,129 'en':619,621,624,627,630,633,636,639,642,645,648,651,654,657,660,663,666,1196,1199,1202,1206,1209,1309 'en-au':620,1195 'en-ca':623 'en-gb':626,1198 'en-gb-wl':1201 'en-gh':629 'en-hk':632 'en-i':635 'en-in':638,1205 'en-k':641 'en-ng':644 'en-nz':647 'en-ph':650 'en-pk':653 'en-sg':656 'en-tz':659 'en-us':662,1208,1308 'en-za':665 'enabl':210 'end':1435,1456,1650,2100,2111,2439 'engin':498 'enum':226,488,499,505,1064,1181,1272,1277,1284,1470,1480,1635,1666,1676,1839,1849,1954,1986,1996,2113,2131,2141,2248,2297,2314,2324,2429,2446,2456 'err':88,90,102,131,1388 'err.headers':116 'err.message':138,1393 'err.status':137,140 'error':49,58,63,67,71,95,136,144,151,166,1443,1970 'es':595,668,669,672,675,678,681,684,687,690,693,694,696,699,702,705,708,711,714,717,720,723,726,729,738,767,1212,1213,1215,1218 'es-':692,1211 'es-ar':671 'es-bo':674 'es-cl':677 'es-co':680 'es-cr':683 'es-do':686 'es-ec':689 'es-gt':695 'es-hn':698 'es-mx':701,1214 'es-ni':704 'es-p':710 'es-pa':707 'es-pi':716 'es-pr':713 'es-sv':719 'es-us':722,1217 'es-uy':725 'es-v':728 'et':513,731,733 'et-e':732 'eu':735,737 'eu-':736 'event':1364,1372,1380,1402,1430,1471,1485,1506,1555,1575,1667,1681,1702,1751,1771,1840,1854,1875,1924,1944,1987,2001,2022,2042,2062,2132,2146,2167,2216,2236,2275,2295,2315,2329,2350,2399,2419,2447,2461,2482,2531,2551 'event.data.event':1381 'exampl':39 'expect':284,338,388,455,1091,1160 'exponenti':112,175 'express':1347 'express.raw':1356 'fa':739,741 'fa-ir':740 'fail':55,1392,1646,1955 'failur':1659 'femal':1306 'fi':743,745,746 'fi-fi':744 'field':147,168,1463,1465,1661,1834,1981,2126,2309,2441 'fil':748 'fil-ph':747 'file':183,197,477,1151,1610,1636,1806 'filter':1057 'fo':750 'follow':1400 'format':149,169,467,1078 'former':1529,1725,1898,2070,2190,2373,2505 'found':163,1638 'fr':751,753,756,759,762,763,1221,1224,1225 'fr-be':752 'fr-ca':755,1220 'fr-ch':758 'fr-fr':761,1223 'gb':628,1188,1200,1203 'ge':821 'gh':631 'gl':764,766 'gl-es':765 'go':1824 'gr':618 'gru1ogrkyq':268,318,376,426,1122 'gt':697 'gu':768,770 'gu-in':769 'guru':900 'ha':772 'handl':50,70 'handler':1345 'hang':444 'hang-up':443 'hangup':1640,2432 'hant':1036 'haw':773 'header':1335,1368,1421 'hello':86 'hi':775,777,1227 'hi-in':776,1226 'hk':634,1037 'hn':700 'hr':779,781,782 'hr-hr':780 'ht':783 'hu':784,786,787 'hu-hu':785 'hy':788,790 'hy-am':789 'id':221,239,293,300,352,359,362,402,409,412,464,474,792,794,795,816,959,1075,1098,1105,1108,1168,1178,1298,1510,1513,1523,1528,1532,1539,1541,1558,1560,1706,1709,1719,1724,1728,1735,1737,1754,1756,1879,1882,1892,1897,1901,1908,1910,1927,1929,2026,2028,2045,2047,2064,2069,2073,2171,2174,2184,2189,2193,2200,2202,2219,2221,2258,2260,2278,2280,2354,2357,2367,2372,2376,2383,2385,2402,2404,2486,2489,2499,2504,2508,2515,2517,2534,2536 'id-id':793 'identifi':1472,1490,1668,1686,1841,1859,1988,2006,2133,2151,2316,2334,2448,2466 'ie':637 'il':529,809 'import':17 'inbound':490 'includ':1326,1412 'indic':1971 'initi':45,449 'instal':10,13 'instanceof':91,103,132 'insuffici':158 'int32':482,494,1049,1054 'intern':1968 'invalid':154,1397,1963 'iq':532 'ir':742 'is-i':797,1229 'iso':1500,1696,1869,2016,2092,2105,2161,2344,2476 'issu':193,1147,1516,1712,1885,2177,2360,2492 'it-ch':801 'it-it':804,1232 'iw':808 'iw-il':807 'ja':810,812,1236 'ja-jp':811,1235 'javascript':5,9,16,75,256,306,364,414,1068,1110,1291,1341 'jo':535 'jp':813,1237 'json':1353,1965 'jv':815 'jv-id':814 'jw':817 'ka':818,820 'ka-g':819 'ke':643,967 'key':29,156 'kh':829 'kk':822,824 'kk-kz':823 'km':826,828 'km-kh':827 'kn':830,832 'kn-in':831 'ko':834,836,1239 'ko-kr':835,1238 'kr':837,1240 'kw':538 'kz':825 'la':838,844 'languag':504,1180,1307 'latn':951,997 'lb':541,839 'leg':212,254,1283,1538,1734,1907,2025,2199,2382,2514 'length':481 'level':1276 'limit':60,107,172,214 'lk':930,977 'ln':840 'lo':841,843 'lo-la':842 'loop':241,1268 'lt':845,847,848 'lt-lt':846 'lv':849,851,852 'lv-lv':850 'ma':544 'max':480,1046 'media':4,8,243,1609,1615,1805,1811 'mg':853 'mi':854 'min':1051 'mk':855,857,858 'mk-mk':856 'ml':859,861 'ml-in':860 'mm':879 'mn':863,865,866 'mn-mn':864 'mode':1631,1830 'mp3':227 'mr':547,867,869 'mr-in':868 'ms':871,873 'ms-mi':872 'mt':875 'multipl':188,1142 'mx':703,1216 'my-mm':877 'name':244,478,1602,1605,1616,1798,1801,1812 'nb':1242 'nb-no':1241 'ne':880,882 'ne-np':881 'network':57,94 'new':23,122 'ng':646 'ni':706 'nl':884,886,889,890,1245,1246 'nl-be':885 'nl-nl':888,1244 'nn':891 'no-no':893 'note':206 'np':883 'npm':12 'nz':649 'object':1290 'oc':896 'occur':1507,1703,1876,2023,2168,2351,2483 'ok':1386 'om':550 'omit':37 'opposit':1286 'option':223,295,354,404,469,1100,1173 'outbound':491 'overlay':208,246,302,1630,1829 'pa':709,897,899 'pa-guru-in':898 'pars':1352,1375 'parti':2246,2255 'paus':325,326 'payload':1171,1270,1299,1377,1462 'pe':712 'permiss':159 'ph':652,749 'pk':655,1017 'pl':902,904,905,1248,1249 'pl-pl':903,1247 'place':200,1154 'play':177,180,189,280,483,1135,1591,1612,1787,1808,1827 'playback':205,248,276,1159,1434,1438 'post':217,289,348,398,460,1094,1164 'pr':715 'premium':1279 'problem':1976 'process':2287 'process.env':26 'product':73,1340 'profan':1056 'promis':123 'provid':1654 'ps':553,906 'pstn':2249 'pt':907,909,912,913,1251,1254,1255 'pt-br':908,1250 'pt-pt':911,1253 'py':718 'qa':556 'queue':203,1157 'r':124,126 'rate':59,106,171 'raw':1349 'receiv':1379,1580,1776,1949,2082,2241,2424,2556 'record':324,327,330,336,361,382,385,411,432,435,438,453,486,1085,1088,1107,1442,1446,1450,1977,2097,2110,2117,2119,2266 'reflect':1647,2435 'req':1360 'req.body.tostring':1367 'req.headers':1369 'request':1325 'requir':146,466,1170 'res':1361 'res.status':1383,1394 'resourc':161,1477,1494,1673,1690,1846,1863,1993,2010,2138,2155,2321,2338,2453,2470 'respons':258,308,366,416,1070,1112,1293 'response.data':270,320,378,428,1081,1124,1312 'result':78,272,322,380,430,1083,1126,1314 'resum':333,335,383,384 'retri':99,110,118,173 'retry-aft':117 'retryaft':115,127 'return':271,321,379,429,1082,1125,1313 'ro':914,916,917,1257,1258 'ro-ro':915,1256 'rs':948 'ru':918,920,921,1260,1261 'ru-ru':919,1259 'rw':923,924 'rw-rw':922 'sa':559,925 'save':1447,1452 'say':1300 'sd':926 'se':963,1264 'sec':493 'self':216,1285 'send':1385,1396 'sent':1404 'server':1969 'servic':1275 'session':1557,1567,1753,1763,1926,1936,2044,2054,2218,2228,2267,2401,2411,2533,2543 'set':1289 'settimeout':125 'setup':15 'sg':658,983 'shown':47 'si':927,929,938 'si-lk':928 'sign':1320 'signatur':1329,1338,1370,1398,1419,1424 'silenc':1067 'singl':1077,2114,2121 'sip':2250 'sk':931,933,934 'sk-sk':932 'skill' 'skill-telnyx-voice-media-javascript' 'sl':935,937 'sl-si':936 'sn':939 'source-team-telnyx' 'speak':1128,1143,1455,1459 'speaker':1047,1052,1060 'speech':1133 'sq':941,943 'sq-al':942 'sr':945,947 'sr-rs':946 'ss':950 'ss-latn-za':949 'ssml':1274 'st':954 'st-za':953 'start':433,434,1439,1460,1600,1621,1796,1817,2087,2098 'state':236,297,356,406,471,1102,1175,1577,1579,1773,1775,1946,1948,2079,2081,2238,2240,2421,2423,2553,2555 'status':2301 'stop':251,274,277,304,440,452,1086,1087,1280,1626 'storag':1959 'string':231,237,240,242,245,250,252,255,273,298,301,305,323,357,360,381,407,410,431,472,475,479,1084,1103,1106,1127,1176,1179,1269,1281,1315,1511,1524,1540,1559,1578,1586,1603,1653,1707,1720,1736,1755,1774,1782,1799,1880,1893,1909,1928,1947,2027,2046,2065,2080,2172,2185,2201,2220,2239,2259,2279,2304,2355,2368,2384,2403,2422,2487,2500,2516,2535,2554 'su':956,958 'su-id':957 'sv':721,960,962,1263 'sv-se':961,1262 'sw':964,966,969 'sw-ke':965 'sw-tz':968 'ta':971,973,976,979,982 'ta-in':972 'ta-lk':975 'ta-mi':978 'ta-sg':981 'target':211,253,1282 'te':984,986 'te-in':985 'telnyx':2,6,14,18,20,24,27,1319,1328,1333,1414,1418,1530,1726,1899,2071,2191,2374,2506 'telnyx-signature-ed25519':1327,1417 'telnyx-timestamp':1332,1413 'telnyx-voice-media-javascript':1 'telnyx.apiconnectionerror':92 'telnyx.apierror':133 'telnyx.ratelimiterror':104 'text':85,1129,1131,1144,1273,2303,2307 'tg':988 'th':989,991,992 'th-th':990 'time':1499,1695,1868,2015,2091,2104,2160,2343,2475 'timeout':492 'timestamp':1334,1415 'tk':993 'tl':994 'tn':562,996 'tn-latn-za':995 'topic-agent-skills' 'topic-ai-coding-agent' 'topic-claude-code' 'topic-cpaas' 'topic-cursor' 'topic-iot' 'topic-llm' 'topic-sdk' 'topic-sip' 'topic-sms' 'topic-speech-to-text' 'topic-telephony' 'tr':999,1001,1002,1266,1267 'tr-tr':1000,1265 'track':487 'transcrib':2306 'transcript':495,497,503,1045,1050,1055,1059,1451,2277,2286,2300 'tri':76,1362 'trim':1063,1066 'trim-sil':1065 'ts':1004 'ts-za':1003 'tt':1006 'tw':1041 'type':225,1271,1357,1382,1466,1469,1474,1479,1483,1492,1662,1665,1670,1675,1679,1688,1835,1838,1843,1848,1852,1861,1982,1985,1990,1995,1999,2008,2127,2130,2135,2140,2144,2153,2247,2252,2310,2313,2318,2323,2327,2336,2442,2445,2450,2455,2459,2468 'tz':661,970 'ua':1010 'uk':1007,1009 'uk-ua':1008 'uniqu':1544,1563,1740,1759,1913,1932,2031,2050,2205,2224,2263,2283,2388,2407,2520,2539 'unknown':1641 'unsupport':1966 'ur':1011,1013,1016 'ur-in':1012 'ur-pk':1015 'url':179,230,1409,1585,1589,1595,1781,1785,1791 'us':664,724,1210,1219,1310 'use':1348,1426,1514,1533,1551,1571,1598,1619,1710,1729,1747,1767,1794,1815,1883,1902,1920,1940,1960,2038,2058,2074,2175,2194,2212,2232,2271,2291,2358,2377,2395,2415,2490,2509,2527,2547 'uuid':363,413,1109,1489,1685,1858,2005,2150,2333,2465 'uy':727 'uz':1018,1020,1021 'uz-uz':1019 'v3':261,311,369,419,1115 'valid':62,143,165,1371 've':730,1023 've-za':1022 'verif':1318,1391,1425 'verifi':1337,1429 'vi':1025,1027 'vi-vn':1026 'via':334,450,1518,1714,1887,2179,2362,2494 'vn':1028 'voic':3,7,1172,1288,1305 'wait':108 'wav':228,1079 'webhook':285,339,343,389,393,456,1092,1161,1316,1317,1321,1344,1376,1390,1401,1408,1411,1461,1554,1574,1750,1770,1923,1943,2041,2061,2215,2235,2274,2294,2398,2418,2530,2550 'whether':1624,1820,2116 'wls':1204 'xh':1030 'xh-za':1029 'ye':565 'yi':1032 'yo':1033 'yue':1035 'yue-hant-hk':1034 'za':509,667,952,955,998,1005,1024,1031,1044 'zh':1038,1040 'zh-tw':1039 'zu':1043 'zu-za':1042","prices":[{"id":"fb028acd-898a-4316-8ac3-40dae99719a5","listingId":"e88460e2-63b6-4568-a93f-56bc1e09763e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"team-telnyx","category":"ai","install_from":"skills.sh"},"createdAt":"2026-04-18T22:08:33.644Z"}],"sources":[{"listingId":"e88460e2-63b6-4568-a93f-56bc1e09763e","source":"github","sourceId":"team-telnyx/ai/telnyx-voice-media-javascript","sourceUrl":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-voice-media-javascript","isPrimary":false,"firstSeenAt":"2026-04-18T22:08:33.644Z","lastSeenAt":"2026-04-22T00:54:53.630Z"}],"details":{"listingId":"e88460e2-63b6-4568-a93f-56bc1e09763e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"team-telnyx","slug":"telnyx-voice-media-javascript","github":{"repo":"team-telnyx/ai","stars":167,"topics":["agent-skills","ai","ai-coding-agent","claude-code","cpaas","cursor","iot","llm","sdk","sip","sms","speech-to-text","telephony","telnyx","tts","twilio-migration","voice-agents","voice-ai","webrtc","windsurf"],"license":"mit","html_url":"https://github.com/team-telnyx/ai","pushed_at":"2026-04-21T22:09:49Z","description":"Official one-stop shop for AI Agents and developers building with Telnyx.","skill_md_sha":"7198da3b202100fc34f50927aa40ea26db4a1785","skill_md_path":"skills/telnyx-voice-media-javascript/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-voice-media-javascript"},"layout":"multi","source":"github","category":"ai","frontmatter":{"name":"telnyx-voice-media-javascript","description":">-"},"skills_sh_url":"https://skills.sh/team-telnyx/ai/telnyx-voice-media-javascript"},"updatedAt":"2026-04-22T00:54:53.630Z"}}