{"id":"4efd60b4-070a-48aa-bba9-213d524a82e0","shortId":"j7rqZn","kind":"skill","title":"telnyx-webrtc-client-js","tagline":">-","description":"# Telnyx WebRTC - JavaScript SDK\n\nBuild real-time voice communication into browser applications.\n\n> **Prerequisites**: Create WebRTC credentials and generate a login token using the Telnyx server-side SDK. See the `telnyx-webrtc-*` skill in your server language plugin (e.g., `telnyx-python`, `telnyx-javascript`).\n\n## Installation\n\n```bash\nnpm install @telnyx/webrtc --save\n```\n\nImport the client:\n\n```js\nimport { TelnyxRTC } from '@telnyx/webrtc';\n```\n\n---\n\n## Authentication\n\n### Option 1: Token-Based (Recommended)\n\n```js\nconst client = new TelnyxRTC({\n  login_token: 'your_jwt_token',\n});\n\nclient.connect();\n```\n\n### Option 2: Credential-Based\n\n```js\nconst client = new TelnyxRTC({\n  login: 'sip_username',\n  password: 'sip_password',\n});\n\nclient.connect();\n```\n\n> **Important**: Never hardcode credentials in frontend code. Use environment variables or prompt users.\n\n### Disconnect\n\n```js\n// When done, disconnect and remove listeners\nclient.disconnect();\nclient.off('telnyx.ready');\nclient.off('telnyx.notification');\n```\n\n---\n\n## Media Elements\n\nSpecify an HTML element to play remote audio:\n\n```js\nclient.remoteElement = 'remoteMedia';\n```\n\nHTML:\n\n```html\n<audio id=\"remoteMedia\" autoplay=\"true\" />\n```\n\n---\n\n## Events\n\n```js\nlet activeCall;\n\nclient\n  .on('telnyx.ready', () => {\n    console.log('Ready to make calls');\n  })\n  .on('telnyx.error', (error) => {\n    console.error('Error:', error);\n  })\n  .on('telnyx.notification', (notification) => {\n    if (notification.type === 'callUpdate') {\n      activeCall = notification.call;\n      \n      // Handle incoming call\n      if (activeCall.state === 'ringing') {\n        // Show incoming call UI\n        // Call activeCall.answer() to accept\n      }\n    }\n  });\n```\n\n### Event Types\n\n| Event | Description |\n|-------|-------------|\n| `telnyx.ready` | Client connected and ready |\n| `telnyx.error` | Error occurred |\n| `telnyx.notification` | Call updates, incoming calls |\n| `telnyx.stats.frame` | In-call quality metrics (when debug enabled) |\n\n---\n\n## Making Calls\n\n```js\nconst call = client.newCall({\n  destinationNumber: '+18004377950',\n  callerNumber: '+15551234567',\n});\n```\n\n---\n\n## Receiving Calls\n\n```js\nclient.on('telnyx.notification', (notification) => {\n  const call = notification.call;\n  \n  if (notification.type === 'callUpdate' && call.state === 'ringing') {\n    // Incoming call - show UI and answer\n    call.answer();\n  }\n});\n```\n\n---\n\n## Call Controls\n\n```js\n// End call\ncall.hangup();\n\n// Send DTMF tones\ncall.dtmf('1234');\n\n// Mute audio\ncall.muteAudio();\ncall.unmuteAudio();\n\n// Hold\ncall.hold();\ncall.unhold();\n```\n\n---\n\n## Debugging & Call Quality\n\n### Enable Debug Logging\n\n```js\nconst call = client.newCall({\n  destinationNumber: '+18004377950',\n  debug: true,\n  debugOutput: 'socket',  // 'socket' (send to Telnyx) or 'file' (save locally)\n});\n```\n\n### In-Call Quality Metrics\n\n```js\nconst call = client.newCall({\n  destinationNumber: '+18004377950',\n  debug: true,  // Required for metrics\n});\n\nclient.on('telnyx.stats.frame', (stats) => {\n  console.log('Quality stats:', stats);\n  // Contains jitter, RTT, packet loss, etc.\n});\n```\n\n---\n\n## Pre-Call Diagnosis\n\nTest connectivity before making calls:\n\n```js\nimport { PreCallDiagnosis } from '@telnyx/webrtc';\n\nPreCallDiagnosis.run({\n  credentials: {\n    login: 'sip_username',\n    password: 'sip_password',\n    // or: loginToken: 'jwt_token'\n  },\n  texMLApplicationNumber: '+12407758982',\n})\n  .then((report) => {\n    console.log('Diagnosis report:', report);\n  })\n  .catch((error) => {\n    console.error('Diagnosis failed:', error);\n  });\n```\n\n---\n\n## Preferred Codecs\n\nSet codec preference for calls:\n\n```js\nconst allCodecs = RTCRtpReceiver.getCapabilities('audio').codecs;\n\n// Prefer Opus for AI/high quality\nconst opusCodec = allCodecs.find(c => \n  c.mimeType.toLowerCase().includes('opus')\n);\n\n// Or PCMA for telephony compatibility\nconst pcmaCodec = allCodecs.find(c => \n  c.mimeType.toLowerCase().includes('pcma')\n);\n\nclient.newCall({\n  destinationNumber: '+18004377950',\n  preferred_codecs: [opusCodec],\n});\n```\n\n---\n\n## Registration State\n\nCheck if client is registered:\n\n```js\nconst isRegistered = await client.getIsRegistered();\nconsole.log('Registered:', isRegistered);\n```\n\n---\n\n## AI Agent Integration\n\n### Anonymous Login\n\nConnect to an AI assistant without SIP credentials:\n\n```js\nconst client = new TelnyxRTC({\n  anonymous_login: {\n    target_id: 'your-ai-assistant-id',\n    target_type: 'ai_assistant',\n  },\n});\n\nclient.connect();\n```\n\n> **Note**: The AI assistant must have `telephony_settings.supports_unauthenticated_web_calls` set to `true`.\n\n### Make Call to AI Assistant\n\n```js\n// After anonymous login, destinationNumber is ignored\nconst call = client.newCall({\n  destinationNumber: '',  // Can be empty\n  remoteElement: 'remoteMedia',\n});\n```\n\n### Recommended Codec for AI\n\n```js\nconst allCodecs = RTCRtpReceiver.getCapabilities('audio').codecs;\nconst opusCodec = allCodecs.find(c => \n  c.mimeType.toLowerCase().includes('opus')\n);\n\nclient.newCall({\n  destinationNumber: '',\n  preferred_codecs: [opusCodec],  // Opus recommended for AI\n});\n```\n\n---\n\n## Browser Support\n\n| Platform | Chrome | Firefox | Safari | Edge |\n|----------|--------|---------|--------|------|\n| Android | ✓ | ✓ | - | - |\n| iOS | - | - | ✓ | - |\n| Linux | ✓ | ✓ | - | - |\n| macOS | ✓ | ✓ | ✓ | ✓ |\n| Windows | ✓ | ✓ | - | ✓ |\n\n### Check Browser Support\n\n```js\nconst webRTCInfo = TelnyxRTC.webRTCInfo;\nconsole.log('WebRTC supported:', webRTCInfo.supportWebRTC);\n```\n\n---\n\n## Troubleshooting\n\n| Issue | Solution |\n|-------|----------|\n| No audio | Check microphone permissions in browser |\n| Echo/feedback | Use headphones or enable echo cancellation |\n| Connection fails | Check network, firewall, or use TURN relay |\n| Quality issues | Enable `debug: true` and check `telnyx.stats.frame` events |\n\n---\n\n<!-- BEGIN AUTO-GENERATED API REFERENCE -- do not edit below this line -->\n\n**[references/webrtc-server-api.md](references/webrtc-server-api.md) has the server-side WebRTC API — credential creation, token generation, and push notification setup. You MUST read it when setting up authentication or push notifications.**\n\n## API Reference\n\n\n### TelnyxRTC\n\nThe `TelnyxRTC` client connects your application to the Telnyx backend,\nenabling you to make outgoing calls and handle incoming calls.\n\n```js\n// Initialize the client\nconst client = new TelnyxRTC({\n  // Use a JWT to authenticate (recommended)\n  login_token: login_token,\n  // or use your Connection credentials\n  //  login: username,\n  //  password: password,\n});\n\n// Attach event listeners\nclient\n  .on('telnyx.ready', () => console.log('ready to call'))\n  .on('telnyx.notification', (notification) => {\n    console.log('notification:', notification);\n  });\n\n// Connect and login\nclient.connect();\n\n// You can call client.disconnect() when you're done.\n// Note: When you call `client.disconnect()` you need to remove all ON event methods you've had attached before.\n\n// Disconnecting and Removing listeners.\nclient.disconnect();\nclient.off('telnyx.ready');\nclient.off('telnyx.notification');\n```\n\n### Methods\n\n### checkPermissions\n\n▸ **checkPermissions**(`audio?`, `video?`): `Promise`\\<`boolean`\\>\n\nParams: `audio` (boolean), `video` (boolean)\n\nReturns: `Promise`\n\n```js\nconst client = new TelnyxRTC(options);\n\nclient.checkPermissions();\n```\n### disableMicrophone\n\n▸ **disableMicrophone**(): `void`\n\nReturns: `void`\n\n```js\nconst client = new TelnyxRTC(options);\n\nclient.disableMicrophone();\n```\n### enableMicrophone\n\n▸ **enableMicrophone**(): `void`\n\nReturns: `void`\n\n```js\nconst client = new TelnyxRTC(options);\n\nclient.enableMicrophone();\n```\n### getAudioInDevices\n\n▸ **getAudioInDevices**(): `Promise`\\<`MediaDeviceInfo`[]\\>\n\nReturns: `Promise`\n### getAudioOutDevices\n\n▸ **getAudioOutDevices**(): `Promise`\\<`MediaDeviceInfo`[]\\>\n\nReturns: `Promise`\n### getDeviceResolutions\n\n▸ **getDeviceResolutions**(`deviceId`): `Promise`\\<`any`[]\\>\n\nParams: `deviceId` (string)\n\nReturns: `Promise`\n\n```js\nasync function() {\n  const client = new TelnyxRTC(options);\n  let result = await client.getDeviceResolutions();\n  console.log(result);\n}\n```\n### getDevices\n\n▸ **getDevices**(): `Promise`\\<`MediaDeviceInfo`[]\\>\n\nReturns: `Promise`\n\n```js\nasync function() {\n  const client = new TelnyxRTC(options);\n  let result = await client.getDevices();\n  console.log(result);\n}\n```\n### getVideoDevices\n\n▸ **getVideoDevices**(): `Promise`\\<`MediaDeviceInfo`[]\\>\n\nReturns: `Promise`\n\n```js\nasync function() {\n  const client = new TelnyxRTC(options);\n  let result = await client.getVideoDevices();\n  console.log(result);\n}\n```\n### handleLoginError\n\n▸ **handleLoginError**(`error`): `void`\n\nParams: `error` (any)\n\nReturns: `void`\n### Error handling\n\nAn error will be thrown if `destinationNumber` is not specified.\n\n```js\nconst call = client.newCall().catch(console.error);\n// => `destinationNumber is required`\n```\n### Setting Custom Headers\n\nclient.newCall({\n### Setting Preferred Codec\n\nYou can pass `preferred_codecs` to the `newCall` method to set codec preference during the call.\n### ICE Candidate Prefetching\n\nICE candidate prefetching is enabled by default. This pre-gathers ICE candidates when the\n\n```js\nclient.newCall({\n  destinationNumber: 'xxx',\n  prefetchIceCandidates: false,\n});\n```\n### Trickle ICE\n\nTrickle ICE can be enabled by passing `trickleIce` to the `newCall` method.\n\n```js\nclient.newCall({\n  destinationNumber: 'xxx',\n  trickleIce: true,\n});\n```\n### Call Recovery and `recoveredCallId`\n\nWhen a call is recovered after a network reconnection (reattach), the SDK\n### Voice Isolation\n\nVoice isolation options can be set by passing an `audio` object to the `newCall` method. This property controls the settings of a MediaStreamTrack object. For reference on available audio constraints, see [MediaTrackConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints).\n### Events\n\n[`TelnyxRTC`](https://developers.telnyx.com/development/webrtc/js-sdk/classes/telnyxrtc)\n\nParams: `eventName` (string), `callback` (Function)\n### setAudioSettings\n\n▸ **setAudioSettings**(`settings`): `Promise`\\<`MediaTrackConstraints`\\>\n\nParams: `settings` (IAudioSettings)\n\nReturns: `Promise`\n\n```js\n// within an async function\nconst constraints = await client.setAudioSettings({\n  micId: '772e94959e12e589b1cc71133d32edf543d3315cfd1d0a4076a60601d4ff4df8',\n  micLabel: 'Internal Microphone (Built-in)',\n  echoCancellation: false,\n});\n```\n### webRTCInfo\n\n▸ `Static` **webRTCInfo**(): `string` \\| `IWebRTCInfo`\n\nReturns: `string`\n\n```js\nconst info = TelnyxRTC.webRTCInfo();\nconst isWebRTCSupported = info.supportWebRTC;\nconsole.log(isWebRTCSupported); // => true\n```\n### webRTCSupportedBrowserList\n\n▸ `Static` **webRTCSupportedBrowserList**(): `IWebRTCSupportedBrowser`[]\n\nReturns: `IWebRTCSupportedBrowser`\n\n```js\nconst browserList = TelnyxRTC.webRTCSupportedBrowserList();\nconsole.log(browserList); // => [{\"operationSystem\": \"Android\", \"supported\": [{\"browserName\": \"Chrome\", \"features\": [\"video\", \"audio\"], \"supported\": \"full\"},{...}]\n```\n\n\n### Call\n\nA `Call` is the representation of an audio or video call between\ntwo browsers, SIP clients or phone numbers. The `call` object is\ncreated whenever a new call is initiated, either by you or the\nremote caller. You can access and act upon calls initiated by\na remote caller in a `telnyx.notification` event handler.\n\nTo create a new call, i.e. dial:\n\n```js\nconst call = client.newCall({\n  // Destination is required and can be a phone number or SIP URI\n  destinationNumber: '18004377950',\n  callerNumber: '‬155531234567',\n});\n```\n\nTo answer an incoming call:\n\n```js\nclient.on('telnyx.notification', (notification) => {\n  const call = notification.call;\n\n  if (notification.type === 'callUpdate' && call.state === 'ringing') {\n    call.answer();\n  }\n});\n```\n\nBoth the outgoing and incoming call has methods that can be hooked up to your UI.\n\n```js\n// Hangup or reject an incoming call\ncall.hangup();\n\n// Send digits and keypresses\ncall.dtmf('1234');\n\n// Call states that can be toggled\ncall.hold();\ncall.muteAudio();\n```\n\n### Properties\n### Accessors\n### Methods\n\n### getStats\n\n▸ **getStats**(`callback`, `constraints`): `void`\n\nParams: `callback` (Function), `constraints` (any)\n\nReturns: `void`\n### setAudioInDevice\n\n▸ **setAudioInDevice**(`deviceId`, `muted?`): `Promise`\\<`void`\\>\n\nParams: `deviceId` (string), `muted` (boolean)\n\nReturns: `Promise`\n\n```js\nawait call.setAudioInDevice('abc123');\n```\n### setAudioOutDevice\n\n▸ **setAudioOutDevice**(`deviceId`): `Promise`\\<`boolean`\\>\n\nParams: `deviceId` (string)\n\nReturns: `Promise`\n\n```js\nawait call.setAudioOutDevice('abc123');\n```\n### setVideoDevice\n\n▸ **setVideoDevice**(`deviceId`): `Promise`\\<`void`\\>\n\nParams: `deviceId` (string)\n\nReturns: `Promise`\n\n```js\nawait call.setVideoDevice('abc123');\n```\n\n\n### ICallOptions\n\nICallOptions\nICallOptions\n\n### Properties\n\n\n### IClientOptions\n\nIClientOptions\nIClientOptions\n\n### Properties\n\n<!-- END AUTO-GENERATED API REFERENCE -->","tags":["telnyx","webrtc","client","team-telnyx","agent-skills","ai-coding-agent","claude-code","cpaas","cursor","iot","llm","sdk"],"capabilities":["skill","source-team-telnyx","skill-telnyx-webrtc-client-js","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-webrtc-client-js","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 (12,977 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:55.557Z","embedding":null,"createdAt":"2026-04-18T22:08:44.725Z","updatedAt":"2026-04-22T00:54:55.557Z","lastSeenAt":"2026-04-22T00:54:55.557Z","tsv":"'+12407758982':338 '+15551234567':218 '+18004377950':216,269,292,390 '/development/webrtc/js-sdk/classes/telnyxrtc)':967 '/en-us/docs/web/api/mediatrackconstraints).':962 '1':69 '1234':250,1171 '155531234567':1123 '18004377950':1121 '2':86 '772e94959':993 'abc123':1211,1225,1239 'accept':182 'access':1082 'accessor':1181 'act':1084 'activecal':146,167 'activecall.answer':180 'activecall.state':173 'agent':410 'ai':409,417,433,438,443,457,478,500 'ai/high':367 'allcodec':360,481 'allcodecs.find':371,383,487 'android':508,1033 'anonym':412,427,461 'answer':238,1125 'api':567,587 'applic':18,595 'assist':418,434,439,444,458 'async':760,780,800,986 'attach':637,681 'audio':137,252,362,483,528,695,700,937,956,1039,1050 'authent':67,583,622 'avail':955 'await':404,769,789,809,990,1209,1223,1237 'backend':599 'base':72,89 'bash':54 'boolean':698,701,703,1205,1216 'browser':17,501,514,533,1056 'browserlist':1028,1031 'browsernam':1035 'build':10 'built':999 'built-in':998 'c':372,384,488 'c.mimetype.tolowercase':373,385,489 'call':154,171,177,179,196,199,203,210,213,220,226,234,240,244,259,266,284,289,313,319,357,450,455,467,605,609,646,659,668,836,865,910,916,1042,1044,1053,1063,1070,1086,1101,1106,1128,1134,1147,1164,1172 'call.answer':239,1141 'call.dtmf':249,1170 'call.hangup':245,1165 'call.hold':256,1178 'call.muteaudio':253,1179 'call.setaudioindevice':1210 'call.setaudiooutdevice':1224 'call.setvideodevice':1238 'call.state':231,1139 'call.unhold':257 'call.unmuteaudio':254 'callback':971,1185,1189 'caller':1079,1091 'callernumb':217,1122 'callupd':166,230,1138 'cancel':540 'candid':867,870,881 'catch':345,838 'check':396,513,529,543,556 'checkpermiss':693,694 'chrome':504,1036 'client':4,61,76,92,147,188,398,424,592,613,615,640,708,720,732,763,783,803,1058 'client.checkpermissions':712 'client.connect':84,101,440,656 'client.disablemicrophone':724 'client.disconnect':123,660,669,687 'client.enablemicrophone':736 'client.getdeviceresolutions':770 'client.getdevices':790 'client.getisregistered':405 'client.getvideodevices':810 'client.newcall':214,267,290,388,468,492,837,846,885,905,1107 'client.off':124,126,688,690 'client.on':222,298,1130 'client.remoteelement':139 'client.setaudiosettings':991 'code':108 'codec':352,354,363,392,476,484,495,849,854,861 'communic':15 'compat':380 'connect':189,316,414,541,593,631,653 'console.error':158,347,839 'console.log':150,301,341,406,520,643,650,771,791,811,1017,1030 'const':75,91,212,225,265,288,359,369,381,402,423,466,480,485,517,614,707,719,731,762,782,802,835,988,1011,1014,1027,1105,1133 'constraint':957,989,1186,1191 'contain':305 'control':241,945 'creat':20,1066,1098 'creation':569 'credenti':22,88,105,326,421,568,632 'credential-bas':87 'custom':844 'debug':207,258,262,270,293,553 'debugoutput':272 'default':875 'descript':186 'destin':1108 'destinationnumb':215,268,291,389,463,469,493,830,840,886,906,1120 'developer.mozilla.org':961 'developer.mozilla.org/en-us/docs/web/api/mediatrackconstraints).':960 'developers.telnyx.com':966 'developers.telnyx.com/development/webrtc/js-sdk/classes/telnyxrtc)':965 'deviceid':751,755,1197,1202,1214,1218,1228,1232 'diagnosi':314,342,348 'dial':1103 'digit':1167 'disablemicrophon':713,714 'disconnect':115,119,683 'done':118,664 'dtmf':247 'e.g':46 'e12e589b1cc71133d32edf543d3315cfd1d0a4076a60601d4ff4df8':994 'echo':539 'echo/feedback':534 'echocancel':1001 'edg':507 'either':1073 'element':129,133 'empti':472 'enabl':208,261,538,552,600,873,896 'enablemicrophon':725,726 'end':243 'environ':110 'error':157,159,160,193,346,350,815,818,822,825 'etc':310 'event':143,183,185,558,638,676,963,1095 'eventnam':969 'fail':349,542 'fals':889,1002 'featur':1037 'file':279 'firefox':505 'firewal':545 'frontend':107 'full':1041 'function':761,781,801,972,987,1190 'gather':879 'generat':24,571 'getaudioindevic':737,738 'getaudiooutdevic':743,744 'getdevic':773,774 'getdeviceresolut':749,750 'getstat':1183,1184 'getvideodevic':793,794 'handl':169,607,823 'handleloginerror':813,814 'handler':1096 'hangup':1159 'hardcod':104 'header':845 'headphon':536 'hold':255 'hook':1153 'html':132,141,142 'i.e':1102 'iaudioset':980 'icallopt':1240,1241,1242 'ice':866,869,880,891,893 'iclientopt':1244,1245,1246 'id':430,435 'ignor':465 'import':59,63,102,321 'in-cal':201,282 'includ':374,386,490 'incom':170,176,198,233,608,1127,1146,1163 'info':1012 'info.supportwebrtc':1016 'initi':611,1072,1087 'instal':53,56 'integr':411 'intern':996 'io':509 'isol':927,929 'isregist':403,408 'issu':525,551 'iswebrtcsupport':1015,1018 'iwebrtcinfo':1007 'iwebrtcsupportedbrows':1023,1025 'javascript':8,52 'jitter':306 'js':5,62,74,90,116,138,144,211,221,242,264,287,320,358,401,422,459,479,516,610,706,718,730,759,779,799,834,884,904,983,1010,1026,1104,1129,1158,1208,1222,1236 'jwt':82,335,620 'keypress':1169 'languag':44 'let':145,767,787,807 'linux':510 'listen':122,639,686 'local':281 'log':263 'login':26,79,95,327,413,428,462,624,626,633,655 'logintoken':334 'loss':309 'maco':511 'make':153,209,318,454,603 'media':128 'mediadeviceinfo':740,746,776,796 'mediastreamtrack':950 'mediatrackconstraint':959,977 'method':677,692,858,903,942,1149,1182 'metric':205,286,297 'micid':992 'miclabel':995 'microphon':530,997 'must':445,577 'mute':251,1198,1204 'need':671 'network':544,921 'never':103 'new':77,93,425,616,709,721,733,764,784,804,1069,1100 'newcal':857,902,941 'note':441,665 'notif':163,224,574,586,649,651,652,1132 'notification.call':168,227,1135 'notification.type':165,229,1137 'npm':55 'number':1061,1116 'object':938,951,1064 'occur':194 'operationsystem':1032 'option':68,85,711,723,735,766,786,806,930 'opus':365,375,491,497 'opuscodec':370,393,486,496 'outgo':604,1144 'packet':308 'param':699,754,817,968,978,1188,1201,1217,1231 'pass':852,898,935 'password':98,100,330,332,635,636 'pcma':377,387 'pcmacodec':382 'permiss':531 'phone':1060,1115 'platform':503 'play':135 'plugin':45 'pre':312,878 'pre-cal':311 'pre-gath':877 'precalldiagnosi':322 'precalldiagnosis.run':325 'prefer':351,355,364,391,494,848,853,862 'prefetch':868,871 'prefetchicecandid':888 'prerequisit':19 'promis':697,705,739,742,745,748,752,758,775,778,795,798,976,982,1199,1207,1215,1221,1229,1235 'prompt':113 'properti':944,1180,1243,1247 'push':573,585 'python':49 'qualiti':204,260,285,302,368,550 're':663 'read':578 'readi':151,191,644 'real':12 'real-tim':11 'reattach':923 'receiv':219 'recommend':73,475,498,623 'reconnect':922 'recov':918 'recoveredcallid':913 'recoveri':911 'refer':588,953 'references/webrtc-server-api.md':559,560 'regist':400,407 'registr':394 'reject':1161 'relay':549 'remot':136,1078,1090 'remoteel':473 'remotemedia':140,474 'remov':121,673,685 'report':340,343,344 'represent':1047 'requir':295,842,1110 'result':768,772,788,792,808,812 'return':704,716,728,741,747,757,777,797,820,981,1008,1024,1193,1206,1220,1234 'ring':174,232,1140 'rtcrtpreceiver.getcapabilities':361,482 'rtt':307 'safari':506 'save':58,280 'sdk':9,34,925 'see':35,958 'send':246,275,1166 'server':32,43,564 'server-sid':31,563 'set':353,451,581,843,847,860,933,947,975,979 'setaudioindevic':1195,1196 'setaudiooutdevic':1212,1213 'setaudioset':973,974 'setup':575 'setvideodevic':1226,1227 'show':175,235 'side':33,565 'sip':96,99,328,331,420,1057,1118 'skill':40 'skill-telnyx-webrtc-client-js' 'socket':273,274 'solut':526 'source-team-telnyx' 'specifi':130,833 'stat':300,303,304 'state':395,1173 'static':1004,1021 'string':756,970,1006,1009,1203,1219,1233 'support':502,515,522,1034,1040 'target':429,436 'telephoni':379 'telephony_settings.supports':447 'telnyx':2,6,30,38,48,51,277,598 'telnyx-javascript':50 'telnyx-python':47 'telnyx-webrtc':37 'telnyx-webrtc-client-j':1 'telnyx.error':156,192 'telnyx.notification':127,162,195,223,648,691,1094,1131 'telnyx.ready':125,149,187,642,689 'telnyx.stats.frame':200,299,557 'telnyx/webrtc':57,66,324 'telnyxrtc':64,78,94,426,589,591,617,710,722,734,765,785,805,964 'telnyxrtc.webrtcinfo':519,1013 'telnyxrtc.webrtcsupportedbrowserlist':1029 'test':315 'texmlapplicationnumb':337 'thrown':828 'time':13 'toggl':1177 'token':27,71,80,83,336,570,625,627 'token-bas':70 'tone':248 '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' 'trickl':890,892 'trickleic':899,908 'troubleshoot':524 'true':271,294,453,554,909,1019 'turn':548 'two':1055 'type':184,437 'ui':178,236,1157 'unauthent':448 'updat':197 'upon':1085 'uri':1119 'use':28,109,535,547,618,629 'user':114 'usernam':97,329,634 'variabl':111 've':679 'video':696,702,1038,1052 'voic':14,926,928 'void':715,717,727,729,816,821,1187,1194,1200,1230 'web':449 'webrtc':3,7,21,39,521,566 'webrtcinfo':518,1003,1005 'webrtcinfo.supportwebrtc':523 'webrtcsupportedbrowserlist':1020,1022 'whenev':1067 'window':512 'within':984 'without':419 'xxx':887,907 'your-ai-assistant-id':431","prices":[{"id":"c4227188-02d0-4204-b8ad-c12a0afc9b11","listingId":"4efd60b4-070a-48aa-bba9-213d524a82e0","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:44.725Z"}],"sources":[{"listingId":"4efd60b4-070a-48aa-bba9-213d524a82e0","source":"github","sourceId":"team-telnyx/ai/telnyx-webrtc-client-js","sourceUrl":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-webrtc-client-js","isPrimary":false,"firstSeenAt":"2026-04-18T22:08:44.725Z","lastSeenAt":"2026-04-22T00:54:55.557Z"}],"details":{"listingId":"4efd60b4-070a-48aa-bba9-213d524a82e0","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"team-telnyx","slug":"telnyx-webrtc-client-js","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":"ddc2f64755564914d534f5538b125cb64b83deb3","skill_md_path":"skills/telnyx-webrtc-client-js/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-webrtc-client-js"},"layout":"multi","source":"github","category":"ai","frontmatter":{"name":"telnyx-webrtc-client-js","description":">-"},"skills_sh_url":"https://skills.sh/team-telnyx/ai/telnyx-webrtc-client-js"},"updatedAt":"2026-04-22T00:54:55.557Z"}}