{"id":"7ac7045a-cff0-41fb-9196-0f131681b89f","shortId":"yhA45a","kind":"skill","title":"telnyx-voice-media-ruby","tagline":">-","description":"<!-- Auto-generated from Telnyx OpenAPI specs. Do not edit. -->\n\n# Telnyx Voice Media - Ruby\n\n## Installation\n\n```bash\ngem install telnyx\n```\n\n## Setup\n\n```ruby\nrequire \"telnyx\"\n\nclient = Telnyx::Client.new(\n  api_key: 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```ruby\nbegin\n  result = client.messages.send_(to: \"+13125550001\", from: \"+13125550002\", text: \"Hello\")\nrescue Telnyx::Errors::APIConnectionError\n  puts \"Network error — check connectivity and retry\"\nrescue Telnyx::Errors::RateLimitError\n  # 429: rate limited — wait and retry with exponential backoff\n  sleep(1) # Check Retry-After header for actual delay\nrescue Telnyx::Errors::APIStatusError => e\n  puts \"API error #{e.status}: #{e.message}\"\n  if e.status == 422\n    puts \"Validation error — check required fields and formats\"\n  end\nend\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```ruby\nresponse = client.calls.actions.start_playback(\"v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ\")\n\nputs(response)\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```ruby\nresponse = client.calls.actions.stop_playback(\"v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ\")\n\nputs(response)\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```ruby\nresponse = client.calls.actions.pause_recording(\"v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ\")\n\nputs(response)\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```ruby\nresponse = client.calls.actions.resume_recording(\"v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ\")\n\nputs(response)\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```ruby\nresponse = client.calls.actions.start_recording(\"call_control_id\", channels: :single, format_: :wav)\n\nputs(response)\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```ruby\nresponse = client.calls.actions.stop_recording(\"v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ\")\n\nputs(response)\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```ruby\nresponse = client.calls.actions.speak(\"call_control_id\", payload: \"Say this on the call\", voice: \"female\", language: \"en-US\")\nputs(response)\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```ruby\n# In your webhook handler (e.g., Sinatra — use raw body):\npost \"/webhooks\" do\n  payload = request.body.read\n  headers = {\n    \"telnyx-signature-ed25519\" => request.env[\"HTTP_TELNYX_SIGNATURE_ED25519\"],\n    \"telnyx-timestamp\" => request.env[\"HTTP_TELNYX_TIMESTAMP\"],\n  }\n  begin\n    event = client.webhooks.unwrap(payload, headers)\n  rescue => e\n    halt 400, \"Invalid signature: #{e.message}\"\n  end\n  # Signature valid — event is the parsed webhook payload\n  puts \"Received event: #{event.data.event_type}\"\n  status 200\nend\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","ruby","team-telnyx","agent-skills","ai-coding-agent","claude-code","cpaas","cursor","iot","llm"],"capabilities":["skill","source-team-telnyx","skill-telnyx-voice-media-ruby","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-ruby","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,020 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.875Z","embedding":null,"createdAt":"2026-04-18T22:08:35.304Z","updatedAt":"2026-04-22T00:54:53.875Z","lastSeenAt":"2026-04-22T00:54:53.875Z","tsv":"'+13125550001':78 '+13125550002':80 '-419':656 '/actions/playback_start':212 '/actions/playback_stop':283 '/actions/record_pause':341 '/actions/record_resume':390 '/actions/record_start':451 '/actions/record_stop':1084 '/actions/speak':1153 '/calls':208,279,337,386,447,1080,1149 '/webhooks':1334 '1':108 '200':1382 '400':1363 '401':66,143 '403':147 '404':150 '41d4':254,303,360,409,1103 '422':62,129,154 '429':59,98,160 '446655440000':256,305,362,411,1105 '550e8400':251,300,357,406,1100 '8601':1486,1682,1855,2002,2078,2091,2147,2330,2462 'a716':255,304,361,410,1104 'actual':115 'ae':503 'af':492,494 'af-za':493 'al':930 'alreadi':42 'alway':67,1318 'am-et':497 'amd':1629,2419 'api':22,26,50,123,145,1506,1702,1875,2167,2350,2482 'apiconnectionerror':86 'apistatuserror':120 'app':1512,1708,1881,2053,2173,2356,2488 'ar':500,502,505,508,511,514,517,520,523,526,529,532,535,538,541,544,547,550,659 'ar-a':501 'ar-bh':504 'ar-dz':507 'ar-eg':510 'ar-il':513 'ar-iq':516 'ar-jo':519 'ar-kw':522 'ar-lb':525 'ar-ma':528 'ar-mr':531 'ar-om':534 'ar-p':537 'ar-qa':540 'ar-sa':543 'ar-tn':546 'ar-y':549 'arb':1166 'associ':332,381 'assum':39 'au':608,1181 'audio':168,172,180,186,214,219,223,264,267,1134,1573,1579,1593,1612,1769,1775,1789,1807 'authent':64 'author':1942 'auto':553 'await':194,1142 'az':555,557,558 'az-az':556 'b':487 'ba':559,577 'back':1121,1577,1598,1773,1794 'backend':1952 'backoff':106,166 'bash':11 'basic':1262 'bd':568 'beep':470 'begin':74,1355 'bg':561,563,564 'bg-bg':562 'bh':506 'bn':565,567,570 'bn-bd':566 'bn-in':569 'bo':572,662 'bodi':1332 'boolean':224,237,292,471,482,1044,1048,1608,1804 'br':573,896,1236 'bs':574,576 'bs-ba':575 'ca':578,580,611,743,1206 'ca-e':579 'cach':222 'call':51,176,209,272,280,317,338,374,387,423,428,448,1058,1075,1081,1124,1150,1278,1286,1418,1422,1426,1430,1434,1439,1443,1497,1504,1510,1521,1532,1551,1624,1693,1700,1706,1717,1728,1747,1866,1873,1879,1890,1901,1920,1964,2019,2038,2051,2062,2158,2165,2171,2182,2193,2212,2239,2341,2348,2354,2365,2376,2395,2416,2473,2480,2486,2497,2508,2527 'call.playback.ended':275,1466 'call.playback.started':1662 'call.recording.error':445,1835 'call.recording.saved':443,1078,1982 'call.recording.transcription.saved':444,2127 'call.speak.ended':277,1147,2310 'call.speak.started':1146,2442 'callplaybackend':1417,1449 'callplaybackstart':1421,1645 'callrecordingerror':1425,1818 'callrecordingsav':1429,1965 'callrecordingtranscriptionsav':1433,2110 'callspeakend':1438,2293 'callspeakstart':1442,2425 'cancel':1627,1628,2418 'case':1642 'ch':597,746,789 'channel':454,1061,2109 'check':90,109,133,157 'cl':665 'client':19,40,225,285,343,392,456,1086,1158 'client.calls.actions.pause':354 'client.calls.actions.resume':403 'client.calls.actions.speak':1277 'client.calls.actions.start':248,1056 'client.calls.actions.stop':297,1097 'client.messages.send':76 'client.new':21 'client.webhooks.unwrap':1357,1412 'cmn':1168 'cmn-cn':1167 'cn':1169 'co':668 'code':72,142 'command':181,228,288,325,335,346,384,395,440,459,1089,1129,1161,1502,1568,1634,1698,1764,1871,1937,2070,2163,2229,2346,2412,2423,2478,2544 'common':140 'complet':1630,2283,2415 'configur':1392 'connect':91,1516,1712,1885,2057,2177,2241,2360,2492 'consecut':184,1132 'content':239 'control':210,281,339,388,449,1059,1082,1151,1279,1494,1505,1511,1690,1701,1707,1863,1874,1880,2052,2155,2166,2172,2338,2349,2355,2470,2481,2487 'convert':1114 'correl':1538,1558,1734,1754,1907,1927,2025,2045,2199,2219,2258,2278,2382,2402,2514,2534 'count':1034,1039 'cr':671 'credenti':1947,1949 'cs':582,584 'cs-cz':583 'custom':462,1946 'cy':586,1171 'cy-gb':1170 'cz':585 'da':587,589,1174 'da-dk':588,1173 'data.event':1463,1659,1832,1979,2124,2307,2439 'data.id':1473,1669,1842,1989,2134,2317,2449 'data.occurred':1480,1676,1849,1996,2141,2324,2456 'data.payload.call':1493,1522,1541,1689,1718,1737,1862,1891,1910,2009,2028,2154,2183,2202,2337,2366,2385,2469,2498,2517 'data.payload.calling':2230 'data.payload.channels':2097 'data.payload.client':1561,1757,1930,2063,2222,2405,2537 'data.payload.connection':1507,1703,1876,2048,2168,2351,2483 'data.payload.media':1569,1586,1765,1782 'data.payload.overlay':1607,1803 'data.payload.reason':1938 'data.payload.recording':2071,2084,2242,2261 'data.payload.status':1619,1636,2281,2413 'data.payload.transcription':2287 'data.record':1453,1649,1822,1969,2114,2297,2429 'date':1483,1679,1852,1999,2075,2088,2144,2327,2459 'date-tim':1482,1678,1851,1998,2074,2087,2143,2326,2458 'datetim':1487,1683,1856,2003,2079,2092,2148,2331,2463 'de':591,593,596,599,600,1177,1178 'de-at':592 'de-ch':595 'de-d':598,1176 'deepgram/nova-3':488 'default':31 'delay':116 'deliv':1472,1668,1841,1988,2133,2316,2448 'descript':1416,1452,1648,1821,1968,2113,2296,2428 'detail':1637,1640 'detect':554 'diariz':1047 'dk':590,1175 'dual':2100,2108 'dz':509 'e':121,1361 'e.g':1328 'e.message':126,1366 'e.status':125,128 'e29b':253,302,359,408,1102 'e29b-41d4-a716':252,301,358,407,1101 'ec':677 'ed25519':1305,1312,1342,1347,1405,1408 'ee':720 'eg':512 'el':601,603 'el-gr':602 'en':605,607,610,613,616,619,622,625,628,631,634,637,640,643,646,649,652,1180,1183,1186,1190,1193,1291 'en-au':606,1179 'en-ca':609 'en-gb':612,1182 'en-gb-wl':1185 'en-gh':615 'en-hk':618 'en-i':621 'en-in':624,1189 'en-k':627 'en-ng':630 'en-nz':633 'en-ph':636 'en-pk':639 'en-sg':642 'en-tz':645 'en-us':648,1192,1290 'en-za':651 'enabl':200 'end':138,139,1367,1383,1420,1441,1635,2085,2096,2424 'engin':484 'enum':216,474,485,491,1050,1165,1256,1261,1268,1455,1465,1620,1651,1661,1824,1834,1939,1971,1981,2098,2116,2126,2233,2282,2299,2309,2414,2431,2441 'env':24 'error':47,56,61,65,69,85,89,96,119,124,132,141,156,1428,1955 'es':581,654,655,658,661,664,667,670,673,676,679,680,682,685,688,691,694,697,700,703,706,709,712,715,724,753,1196,1197,1199,1202 'es-':678,1195 'es-ar':657 'es-bo':660 'es-cl':663 'es-co':666 'es-cr':669 'es-do':672 'es-ec':675 'es-gt':681 'es-hn':684 'es-mx':687,1198 'es-ni':690 'es-p':696 'es-pa':693 'es-pi':702 'es-pr':699 'es-sv':705 'es-us':708,1201 'es-uy':711 'es-v':714 'et':499,717,719 'et-e':718 'eu':721,723 'eu-':722 'event':1356,1370,1378,1387,1415,1456,1470,1491,1540,1560,1652,1666,1687,1736,1756,1825,1839,1860,1909,1929,1972,1986,2007,2027,2047,2117,2131,2152,2201,2221,2260,2280,2300,2314,2335,2384,2404,2432,2446,2467,2516,2536 'event.data.event':1379 'exampl':37 'expect':273,326,375,441,1076,1144 'exponenti':105,165 'fa':725,727 'fa-ir':726 'fail':53,1631,1940 'failur':1644 'femal':1288 'fi':729,731,732 'fi-fi':730 'field':135,158,1448,1450,1646,1819,1966,2111,2294,2426 'fil':734 'fil-ph':733 'file':173,187,463,1135,1595,1621,1791 'filter':1043 'fo':736 'follow':1385 'format':137,159,453,1063 'former':1514,1710,1883,2055,2175,2358,2490 'found':153,1623 'fr':737,739,742,745,748,749,1205,1208,1209 'fr-be':738 'fr-ca':741,1204 'fr-ch':744 'fr-fr':747,1207 'gb':614,1172,1184,1187 'ge':807 'gem':12 'gh':617 'gl':750,752 'gl-es':751 'go':1809 'gr':604 'gru1ogrkyq':257,306,363,412,1106 'gt':683 'gu':754,756 'gu-in':755 'guru':886 'ha':758 'halt':1362 'handl':48,68 'handler':1327 'hang':430 'hang-up':429 'hangup':1625,2417 'hant':1022 'haw':759 'header':113,1317,1338,1359,1406 'hello':82 'hi':761,763,1211 'hi-in':762,1210 'hk':620,1023 'hn':686 'hr':765,767,768 'hr-hr':766 'ht':769 'http':1344,1352 'hu':770,772,773 'hu-hu':771 'hy':774,776 'hy-am':775 'id':211,229,282,289,340,347,350,389,396,399,450,460,778,780,781,802,945,1060,1083,1090,1093,1152,1162,1280,1495,1498,1508,1513,1517,1524,1526,1543,1545,1691,1694,1704,1709,1713,1720,1722,1739,1741,1864,1867,1877,1882,1886,1893,1895,1912,1914,2011,2013,2030,2032,2049,2054,2058,2156,2159,2169,2174,2178,2185,2187,2204,2206,2243,2245,2263,2265,2339,2342,2352,2357,2361,2368,2370,2387,2389,2471,2474,2484,2489,2493,2500,2502,2519,2521 'id-id':779 'identifi':1457,1475,1653,1671,1826,1844,1973,1991,2118,2136,2301,2319,2433,2451 'ie':623 'il':515,795 'inbound':476 'includ':1308,1397 'indic':1956 'initi':43,435 'instal':10,13 'insuffici':148 'int32':468,480,1035,1040 'intern':1953 'invalid':144,1364,1948 'iq':518 'ir':728 'is-i':783,1213 'iso':1485,1681,1854,2001,2077,2090,2146,2329,2461 'issu':183,1131,1501,1697,1870,2162,2345,2477 'it-ch':787 'it-it':790,1216 'iw':794 'iw-il':793 'ja':796,798,1220 'ja-jp':797,1219 'jo':521 'jp':799,1221 'json':1950 'jv':801 'jv-id':800 'jw':803 'ka':804,806 'ka-g':805 'ke':629,953 'key':23,27,146 'kh':815 'kk':808,810 'kk-kz':809 'km':812,814 'km-kh':813 'kn':816,818 'kn-in':817 'ko':820,822,1223 'ko-kr':821,1222 'kr':823,1224 'kw':524 'kz':811 'la':824,830 'languag':490,1164,1289 'latn':937,983 'lb':527,825 'leg':202,244,1267,1523,1719,1892,2010,2184,2367,2499 'length':467 'level':1260 'limit':58,100,162,204 'lk':916,963 'ln':826 'lo':827,829 'lo-la':828 'loop':231,1252 'lt':831,833,834 'lt-lt':832 'lv':835,837,838 'lv-lv':836 'ma':530 'max':466,1032 'media':4,8,233,1594,1600,1790,1796 'mg':839 'mi':840 'min':1037 'mk':841,843,844 'mk-mk':842 'ml':845,847 'ml-in':846 'mm':865 'mn':849,851,852 'mn-mn':850 'mode':1616,1815 'mp3':217 'mr':533,853,855 'mr-in':854 'ms':857,859 'ms-mi':858 'mt':861 'multipl':178,1126 'mx':689,1200 'my-mm':863 'name':234,464,1587,1590,1601,1783,1786,1797 'nb':1226 'nb-no':1225 'ne':866,868 'ne-np':867 'network':55,88 'ng':632 'ni':692 'nl':870,872,875,876,1229,1230 'nl-be':871 'nl-nl':874,1228 'nn':877 'no-no':879 'note':196 'np':869 'nz':635 'object':1274 'oc':882 'occur':1492,1688,1861,2008,2153,2336,2468 'om':536 'omit':35 'opposit':1270 'option':213,284,342,391,455,1085,1157 'outbound':477 'overlay':198,236,291,1615,1814 'pa':695,883,885 'pa-guru-in':884 'pars':1373 'parti':2231,2240 'paus':313,314 'payload':1155,1254,1281,1336,1358,1375,1447 'pe':698 'permiss':149 'ph':638,735 'pk':641,1003 'pl':888,890,891,1232,1233 'pl-pl':889,1231 'place':190,1138 'play':167,170,179,269,469,1119,1576,1597,1772,1793,1812 'playback':195,238,249,265,298,1143,1419,1423 'post':207,278,336,385,446,1079,1148,1333 'pr':701 'premium':1263 'problem':1961 'process':2272 'product':71,1322 'profan':1042 'provid':1639 'ps':539,892 'pstn':2234 'pt':893,895,898,899,1235,1238,1239 'pt-br':894,1234 'pt-pt':897,1237 'put':87,122,130,258,307,364,413,1065,1107,1293,1376 'py':704 'qa':542 'queue':193,1141 'rate':57,99,161 'ratelimiterror':97 'raw':1331 'receiv':1377,1565,1761,1934,2067,2226,2409,2541 'record':312,315,318,324,349,355,369,372,398,404,418,421,424,439,472,1057,1070,1073,1092,1098,1427,1431,1435,1962,2082,2095,2102,2104,2251 'reflect':1632,2420 'request':1307 'request.body.read':1337 'request.env':1343,1351 'requir':17,134,452,1154 'rescu':83,94,117,1360 'resourc':151,1462,1479,1658,1675,1831,1848,1978,1995,2123,2140,2306,2323,2438,2455 'respons':247,259,296,308,353,365,402,414,1055,1066,1096,1108,1276,1294 'result':75,261,310,367,416,1068,1110,1296 'resum':321,323,370,371 'retri':93,103,111,163 'retry-aft':110 'return':260,309,366,415,1067,1109,1295 'ro':900,902,903,1241,1242 'ro-ro':901,1240 'rs':934 'ru':904,906,907,1244,1245 'ru-ru':905,1243 'rubi':5,9,16,73,246,295,352,401,1054,1095,1275,1323 'rw':909,910 'rw-rw':908 'sa':545,911 'save':1432,1437 'say':1282 'sd':912 'se':949,1248 'sec':479 'self':206,1269 'sent':1389 'server':1954 'servic':1259 'session':1542,1552,1738,1748,1911,1921,2029,2039,2203,2213,2252,2386,2396,2518,2528 'set':1273 'setup':15 'sg':644,969 'shown':45 'si':913,915,924 'si-lk':914 'sign':1302 'signatur':1311,1320,1341,1346,1365,1368,1404,1409 'silenc':1053 'sinatra':1329 'singl':1062,2099,2106 'sip':2235 'sk':917,919,920 'sk-sk':918 'skill' 'skill-telnyx-voice-media-ruby' 'sl':921,923 'sl-si':922 'sleep':107 'sn':925 'source-team-telnyx' 'speak':1112,1127,1440,1444 'speaker':1033,1038,1046 'speech':1117 'sq':927,929 'sq-al':928 'sr':931,933 'sr-rs':932 'ss':936 'ss-latn-za':935 'ssml':1258 'st':940 'st-za':939 'start':419,420,1424,1445,1585,1606,1781,1802,2072,2083 'state':226,286,344,393,457,1087,1159,1562,1564,1758,1760,1931,1933,2064,2066,2223,2225,2406,2408,2538,2540 'status':1381,2286 'stop':241,263,266,293,426,438,1071,1072,1264,1611 'storag':1944 'string':221,227,230,232,235,240,242,245,262,287,290,294,311,345,348,368,394,397,417,458,461,465,1069,1088,1091,1111,1160,1163,1253,1265,1297,1496,1509,1525,1544,1563,1571,1588,1638,1692,1705,1721,1740,1759,1767,1784,1865,1878,1894,1913,1932,2012,2031,2050,2065,2157,2170,2186,2205,2224,2244,2264,2289,2340,2353,2369,2388,2407,2472,2485,2501,2520,2539 'su':942,944 'su-id':943 'sv':707,946,948,1247 'sv-se':947,1246 'sw':950,952,955 'sw-ke':951 'sw-tz':954 'ta':957,959,962,965,968 'ta-in':958 'ta-lk':961 'ta-mi':964 'ta-sg':967 'target':201,243,1266 'te':970,972 'te-in':971 'telnyx':2,6,14,18,20,25,84,95,118,1301,1310,1315,1340,1345,1349,1353,1399,1403,1515,1711,1884,2056,2176,2359,2491 'telnyx-signature-ed25519':1309,1339,1402 'telnyx-timestamp':1314,1348,1398 'telnyx-voice-media-rubi':1 'text':81,1113,1115,1128,1257,2288,2292 'tg':974 'th':975,977,978 'th-th':976 'time':1484,1680,1853,2000,2076,2089,2145,2328,2460 'timeout':478 'timestamp':1316,1350,1354,1400 'tk':979 'tl':980 'tn':548,982 'tn-latn-za':981 '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':985,987,988,1250,1251 'tr-tr':986,1249 'track':473 'transcrib':2291 'transcript':481,483,489,1031,1036,1041,1045,1436,2262,2271,2285 'trim':1049,1052 'trim-sil':1051 'ts':990 'ts-za':989 'tt':992 'tw':1027 'type':215,1255,1380,1451,1454,1459,1464,1468,1477,1647,1650,1655,1660,1664,1673,1820,1823,1828,1833,1837,1846,1967,1970,1975,1980,1984,1993,2112,2115,2120,2125,2129,2138,2232,2237,2295,2298,2303,2308,2312,2321,2427,2430,2435,2440,2444,2453 'tz':647,956 'ua':996 'uk':993,995 'uk-ua':994 'uniqu':1529,1548,1725,1744,1898,1917,2016,2035,2190,2209,2248,2268,2373,2392,2505,2524 'unknown':1626 'unsupport':1951 'ur':997,999,1002 'ur-in':998 'ur-pk':1001 'url':169,220,1394,1570,1574,1580,1766,1770,1776 'us':650,710,1194,1203,1292 'use':1330,1411,1499,1518,1536,1556,1583,1604,1695,1714,1732,1752,1779,1800,1868,1887,1905,1925,1945,2023,2043,2059,2160,2179,2197,2217,2256,2276,2343,2362,2380,2400,2475,2494,2512,2532 'uuid':351,400,1094,1474,1670,1843,1990,2135,2318,2450 'uy':713 'uz':1004,1006,1007 'uz-uz':1005 'v3':250,299,356,405,1099 'valid':60,131,155,1369 've':716,1009 've-za':1008 'verif':1300,1410 'verifi':1319,1414 'vi':1011,1013 'vi-vn':1012 'via':322,436,1503,1699,1872,2164,2347,2479 'vn':1014 'voic':3,7,1156,1272,1287 'wait':101 'wav':218,1064 'webhook':274,327,331,376,380,442,1077,1145,1298,1299,1303,1326,1374,1386,1393,1396,1446,1539,1559,1735,1755,1908,1928,2026,2046,2200,2220,2259,2279,2383,2403,2515,2535 'whether':1609,1805,2101 'wls':1188 'xh':1016 'xh-za':1015 'ye':551 'yi':1018 'yo':1019 'yue':1021 'yue-hant-hk':1020 'za':495,653,938,941,984,991,1010,1017,1030 'zh':1024,1026 'zh-tw':1025 'zu':1029 'zu-za':1028","prices":[{"id":"0715c480-0bee-4dea-a4a9-dd827d3ad1aa","listingId":"7ac7045a-cff0-41fb-9196-0f131681b89f","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:35.304Z"}],"sources":[{"listingId":"7ac7045a-cff0-41fb-9196-0f131681b89f","source":"github","sourceId":"team-telnyx/ai/telnyx-voice-media-ruby","sourceUrl":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-voice-media-ruby","isPrimary":false,"firstSeenAt":"2026-04-18T22:08:35.304Z","lastSeenAt":"2026-04-22T00:54:53.875Z"}],"details":{"listingId":"7ac7045a-cff0-41fb-9196-0f131681b89f","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"team-telnyx","slug":"telnyx-voice-media-ruby","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":"c20bb93177ead93f9bdfd7a281065ed98e4d5037","skill_md_path":"skills/telnyx-voice-media-ruby/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-voice-media-ruby"},"layout":"multi","source":"github","category":"ai","frontmatter":{"name":"telnyx-voice-media-ruby","description":">-"},"skills_sh_url":"https://skills.sh/team-telnyx/ai/telnyx-voice-media-ruby"},"updatedAt":"2026-04-22T00:54:53.875Z"}}