{"id":"95b8725a-079a-4d5c-93f6-28c0e6032929","shortId":"aArm9L","kind":"skill","title":"telnyx-voice-ruby","tagline":">-","description":"<!-- Auto-generated from Telnyx OpenAPI specs. Do not edit. -->\n\n# Telnyx Voice - 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\nresponse = client.calls.dial(\n  connection_id: \"7267xxxxxxxxxxxxxx\",\n  from: \"+18005550101\",\n  to: \"+18005550100\"\n)\nputs(response)\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## Important Notes\n\n- **Phone numbers** must be in E.164 format (e.g., `+13125550001`). Include the `+` prefix and country code. No spaces, dashes, or parentheses.\n- **Pagination:** Use `.auto_paging_each` for automatic iteration: `page.auto_paging_each { |item| puts item.id }`.\n\n## Operational Caveats\n\n- Call Control is event-driven. After `dial()` or an inbound webhook, issue follow-up commands from webhook handlers using the `call_control_id` in the event payload.\n- Outbound and inbound flows are different: outbound calls start with `dial()`, while inbound calls must be answered from the incoming webhook before other commands run.\n- A publicly reachable webhook endpoint is required for real call control. Without it, calls may connect but your application cannot drive the live call state.\n\n## Reference Use Rules\n\nDo not invent Telnyx parameters, enums, response fields, or webhook fields.\n\n- If the parameter, enum, or response field you need is not shown inline in this skill, read [references/api-details.md](references/api-details.md) before writing code.\n- Before using any operation in `## Additional Operations`, read [the optional-parameters section](references/api-details.md#optional-parameters) and [the response-schemas section](references/api-details.md#response-schemas).\n- Before reading or matching webhook fields beyond the inline examples, read [the webhook payload reference](references/api-details.md#webhook-payload-fields).\n\n## Core Tasks\n\n### Dial an outbound call\n\nPrimary voice entrypoint. Agents need the async call-control identifiers returned here.\n\n`client.calls.dial()` — `POST /calls`\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `to` | string (E.164) | Yes | The DID or SIP URI to dial out to. |\n| `from` | string (E.164) | Yes | The `from` number to be used as the caller id presented to t... |\n| `connection_id` | string (UUID) | Yes | The ID of the Call Control App (formerly ID of the connectio... |\n| `timeout_secs` | integer | No | The number of seconds that Telnyx will wait for the call to ... |\n| `billing_group_id` | string (UUID) | No | Use this field to set the Billing Group ID for the call. |\n| `client_state` | string | No | Use this field to add state to every subsequent webhook. |\n| ... | | | +48 optional params in [references/api-details.md](references/api-details.md) |\n\n```ruby\nresponse = client.calls.dial(\n  connection_id: \"7267xxxxxxxxxxxxxx\",\n  from: \"+18005550101\",\n  to: \"+18005550100\"\n)\n\nputs(response)\n```\n\nPrimary response fields:\n- `response.data.call_control_id`\n- `response.data.call_leg_id`\n- `response.data.call_session_id`\n- `response.data.is_alive`\n- `response.data.recording_id`\n- `response.data.call_duration`\n\n### Answer an inbound call\n\nPrimary inbound call-control command.\n\n`client.calls.actions.answer()` — `POST /calls/{call_control_id}/actions/answer`\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `call_control_id` | string (UUID) | Yes | Unique identifier and token for controlling the call |\n| `billing_group_id` | string (UUID) | No | Use this field to set the Billing Group ID for the call. |\n| `client_state` | string | No | Use this field to add state to every subsequent webhook. |\n| `webhook_url` | string (URL) | No | Use this field to override the URL for which Telnyx will sen... |\n| ... | | | +26 optional params in [references/api-details.md](references/api-details.md) |\n\n```ruby\nresponse = client.calls.actions.answer(\"v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ\")\n\nputs(response)\n```\n\nPrimary response fields:\n- `response.data.result`\n- `response.data.recording_id`\n\n### Transfer a live call\n\nCommon post-answer control path with downstream webhook implications.\n\n`client.calls.actions.transfer()` — `POST /calls/{call_control_id}/actions/transfer`\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `to` | string (E.164) | Yes | The DID or SIP URI to dial out to. |\n| `call_control_id` | string (UUID) | Yes | Unique identifier and token for controlling the call |\n| `timeout_secs` | integer | No | The number of seconds that Telnyx will wait for the call to ... |\n| `client_state` | string | No | Use this field to add state to every subsequent webhook. |\n| `webhook_url` | string (URL) | No | Use this field to override the URL for which Telnyx will sen... |\n| ... | | | +33 optional params in [references/api-details.md](references/api-details.md) |\n\n```ruby\nresponse = client.calls.actions.transfer(\"call_control_id\", to: \"+18005550100\")\n\nputs(response)\n```\n\nPrimary response fields:\n- `response.data.result`\n\n---\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\n## Webhooks\n\nThese webhook payload fields are inline because they are part of the primary integration path.\n\n### Call Answered\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `data.record_type` | enum: event | Identifies the type of the resource. |\n| `data.event_type` | enum: call.answered | 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 ev... |\n\n### Call Hangup\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `data.record_type` | enum: event | Identifies the type of the resource. |\n| `data.event_type` | enum: call.hangup | 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 ev... |\n\n### Call Initiated\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `data.record_type` | enum: event | Identifies the type of the resource. |\n| `data.event_type` | enum: call.initiated | 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.connection_codecs` | string | The list of comma-separated codecs enabled for the connection. |\n| `data.payload.offered_codecs` | string | The list of comma-separated codecs offered by caller. |\n\nIf you need webhook fields that are not listed inline here, read [the webhook payload reference](references/api-details.md#webhook-payload-fields) before writing the handler.\n\n---\n\n## Important Supporting Operations\n\nUse these when the core tasks above are close to your flow, but you need a common variation or follow-up step.\n\n### Hangup call\n\nEnd a live call from your webhook-driven control flow.\n\n`client.calls.actions.hangup()` — `POST /calls/{call_control_id}/actions/hangup`\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `call_control_id` | string (UUID) | Yes | Unique identifier and token for controlling the call |\n| `client_state` | string | No | Use this field to add state to every subsequent webhook. |\n| `command_id` | string (UUID) | No | Use this field to avoid duplicate commands. |\n| `custom_headers` | array[object] | No | Custom headers to be added to the SIP BYE message. |\n\n```ruby\nresponse = client.calls.actions.hangup(\"v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ\")\n\nputs(response)\n```\n\nPrimary response fields:\n- `response.data.result`\n\n### Bridge calls\n\nTrigger a follow-up action in an existing workflow rather than creating a new top-level resource.\n\n`client.calls.actions.bridge()` — `POST /calls/{call_control_id}/actions/bridge`\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `call_control_id` | string (UUID) | Yes | The Call Control ID of the call you want to bridge with, can... |\n| `call_control_id` | string (UUID) | Yes | Unique identifier and token for controlling the call |\n| `client_state` | string | No | Use this field to add state to every subsequent webhook. |\n| `command_id` | string (UUID) | No | Use this field to avoid duplicate commands. |\n| `video_room_id` | string (UUID) | No | The ID of the video room you want to bridge with, can't be u... |\n| ... | | | +16 optional params in [references/api-details.md](references/api-details.md) |\n\n```ruby\nresponse = client.calls.actions.bridge(\n  \"call_control_id\",\n  call_control_id_to_bridge_with: \"v3:MdI91X4lWFEs7IgbBEOT9M4AigoY08M0WWZFISt1Yw2axZ_IiE4pqg\"\n)\n\nputs(response)\n```\n\nPrimary response fields:\n- `response.data.result`\n\n### Reject a call\n\nTrigger a follow-up action in an existing workflow rather than creating a new top-level resource.\n\n`client.calls.actions.reject()` — `POST /calls/{call_control_id}/actions/reject`\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `cause` | enum (CALL_REJECTED, USER_BUSY) | Yes | Cause for call rejection. |\n| `call_control_id` | string (UUID) | Yes | Unique identifier and token for controlling the call |\n| `client_state` | string | No | Use this field to add state to every subsequent webhook. |\n| `command_id` | string (UUID) | No | Use this field to avoid duplicate commands. |\n\n```ruby\nresponse = client.calls.actions.reject(\"call_control_id\", cause: :USER_BUSY)\n\nputs(response)\n```\n\nPrimary response fields:\n- `response.data.result`\n\n### Retrieve a call status\n\nFetch the current state before updating, deleting, or making control-flow decisions.\n\n`client.calls.retrieve_status()` — `GET /calls/{call_control_id}`\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `call_control_id` | string (UUID) | Yes | Unique identifier and token for controlling the call |\n\n```ruby\nresponse = client.calls.retrieve_status(\"v3:550e8400-e29b-41d4-a716-446655440000_gRU1OGRkYQ\")\n\nputs(response)\n```\n\nPrimary response fields:\n- `response.data.call_control_id`\n- `response.data.call_duration`\n- `response.data.call_leg_id`\n- `response.data.call_session_id`\n- `response.data.client_state`\n- `response.data.end_time`\n\n### List all active calls for given connection\n\nFetch the current state before updating, deleting, or making control-flow decisions.\n\n`client.connections.list_active_calls()` — `GET /connections/{connection_id}/active_calls`\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `connection_id` | string (UUID) | Yes | Telnyx connection id |\n| `page` | object | No | Consolidated page parameter (deepObject style). |\n\n```ruby\npage = client.connections.list_active_calls(\"1293384261075731461\")\n\nputs(page)\n```\n\nResponse wrapper:\n- items: `page.data`\n- pagination: `page.meta`\n\nPrimary item fields:\n- `call_control_id`\n- `call_duration`\n- `call_leg_id`\n- `call_session_id`\n- `client_state`\n- `record_type`\n\n### List call control applications\n\nInspect available resources or choose an existing resource before mutating it.\n\n`client.call_control_applications.list()` — `GET /call_control_applications`\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `sort` | enum (created_at, connection_name, active) | No | Specifies the sort order for results. |\n| `filter` | object | No | Consolidated filter parameter (deepObject style). |\n| `page` | object | No | Consolidated page parameter (deepObject style). |\n\n```ruby\npage = client.call_control_applications.list\n\nputs(page)\n```\n\nResponse wrapper:\n- items: `page.data`\n- pagination: `page.meta`\n\nPrimary item fields:\n- `id`\n- `created_at`\n- `updated_at`\n- `active`\n- `anchorsite_override`\n- `application_name`\n\n---\n\n## Additional Operations\n\nUse the core tasks above first. The operations below are indexed here with exact SDK methods and required params; use [references/api-details.md](references/api-details.md) for full optional params, response schemas, and lower-frequency webhook payloads.\nBefore using any operation below, read [the optional-parameters section](references/api-details.md#optional-parameters) and [the response-schemas section](references/api-details.md#response-schemas) so you do not guess missing fields.\n\n| Operation | SDK method | Endpoint | Use when | Required params |\n|-----------|------------|----------|----------|-----------------|\n| Create a call control application | `client.call_control_applications.create()` | `POST /call_control_applications` | Create or provision an additional resource when the core tasks do not cover this flow. | `application_name`, `webhook_event_url` |\n| Retrieve a call control application | `client.call_control_applications.retrieve()` | `GET /call_control_applications/{id}` | Fetch the current state before updating, deleting, or making control-flow decisions. | `id` |\n| Update a call control application | `client.call_control_applications.update()` | `PATCH /call_control_applications/{id}` | Modify an existing resource without recreating it. | `application_name`, `webhook_event_url`, `id` |\n| Delete a call control application | `client.call_control_applications.delete()` | `DELETE /call_control_applications/{id}` | Remove, detach, or clean up an existing resource. | `id` |\n| SIP Refer a call | `client.calls.actions.refer()` | `POST /calls/{call_control_id}/actions/refer` | Trigger a follow-up action in an existing workflow rather than creating a new top-level resource. | `sip_address`, `call_control_id` |\n| Send SIP info | `client.calls.actions.send_sip_info()` | `POST /calls/{call_control_id}/actions/send_sip_info` | Trigger a follow-up action in an existing workflow rather than creating a new top-level resource. | `content_type`, `body`, `call_control_id` |\n\n### Other Webhook Events\n\n| Event | `data.event_type` | Description |\n|-------|-------------------|-------------|\n| `callBridged` | `call.bridged` | Call Bridged |\n\n---\n\nFor exhaustive optional parameters, full response schemas, and complete webhook payloads, see [references/api-details.md](references/api-details.md).","tags":["telnyx","voice","ruby","team-telnyx","agent-skills","ai-coding-agent","claude-code","cpaas","cursor","iot","llm","sdk"],"capabilities":["skill","source-team-telnyx","skill-telnyx-voice-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-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 (16,508 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:54.058Z","embedding":null,"createdAt":"2026-04-18T22:08:36.966Z","updatedAt":"2026-04-22T00:54:54.058Z","lastSeenAt":"2026-04-22T00:54:54.058Z","tsv":"'+13125550001':120 '+16':1382 '+18005550100':80,446,688 '+18005550101':78,444 '+26':551 '+33':675 '+48':431 '/actions/answer':483 '/actions/bridge':1297 '/actions/hangup':1193 '/actions/refer':1915 '/actions/reject':1437 '/actions/send_sip_info':1951 '/actions/transfer':596 '/active_calls':1609 '/call_control_applications':1679,1821,1849,1872,1894 '/calls':331,479,592,1189,1293,1433,1528,1911,1947 '/connections':1606 '/webhooks':730 '1293384261075731461':1635 '200':778 '400':759 '401':64,86 '403':90 '404':93 '41d4':564,1260,1558 '422':60,97 '429':57,103 '446655440000':566,1262,1560 '550e8400':561,1257,1555 '7267xxxxxxxxxxxxxx':76,442 '8601':834,947,1060 'a716':565,1261,1559 'action':1277,1417,1921,1957 'activ':1584,1603,1633,1690,1733 'ad':1247 'add':425,528,652,1220,1343,1475 'addit':268,1738,1826 'address':1936 'agent':319 'aliv':462 'alreadi':40 'alway':65,714 'anchorsit':1734 'answer':193,467,583,797 'api':20,24,48,88,854,967,1080 'app':377,860,973,1086 'applic':220,1665,1736,1818,1837,1846,1869,1881,1891 'array':1240 'assum':37 'async':322 'authent':62 'auto':134 'automat':138 'avail':1667 'avoid':1235,1358,1490 'backoff':109 'bash':9 'begin':751 'beyond':296 'bill':399,411,502,514 'bodi':728,1973 'bridg':1270,1318,1376,1398,1987 'busi':1447,1501 'bye':1251 'call':49,148,170,184,190,211,215,225,315,324,375,397,416,470,474,480,488,501,519,579,593,614,627,642,684,796,845,852,858,869,880,899,909,958,965,971,982,993,1012,1022,1071,1078,1084,1095,1175,1179,1190,1198,1211,1271,1294,1302,1309,1314,1321,1334,1391,1394,1411,1434,1444,1451,1453,1466,1496,1510,1529,1536,1549,1585,1604,1634,1647,1650,1652,1655,1663,1816,1844,1867,1889,1908,1912,1937,1948,1974,1986 'call-control':323,473 'call.answered':814 'call.bridged':1985 'call.hangup':927 'call.initiated':1040 'callbridg':1984 'caller':361,1122 'cannot':221 'caus':1442,1449,1499 'caveat':147 'check':100 'choos':1670 'clean':1899 'client':17,38,417,520,644,1212,1335,1467,1658 'client.call_control_applications.create':1819 'client.call_control_applications.delete':1892 'client.call_control_applications.list':1677,1716 'client.call_control_applications.retrieve':1847 'client.call_control_applications.update':1870 'client.calls.actions.answer':477,559 'client.calls.actions.bridge':1291,1390 'client.calls.actions.hangup':1187,1255 'client.calls.actions.refer':1909 'client.calls.actions.reject':1431,1495 'client.calls.actions.send':1943 'client.calls.actions.transfer':590,683 'client.calls.dial':73,329,439 'client.calls.retrieve':1525,1552 'client.connections.list':1602,1632 'client.new':19 'client.webhooks.unwrap':753 'close':1159 'code':70,85,126,262 'codec':1097,1105,1111,1119 'comma':1103,1117 'comma-separ':1102,1116 'command':164,200,476,850,963,1076,1226,1237,1349,1360,1481,1492 'common':83,580,1167 'complet':1996 'connect':74,217,366,440,864,977,1090,1109,1588,1607,1614,1620,1688 'connectio':382 'consolid':1625,1701,1709 'content':1971 'control':149,171,212,325,376,453,475,481,489,499,584,594,615,625,685,842,853,859,955,966,972,1068,1079,1085,1185,1191,1199,1209,1295,1303,1310,1322,1332,1392,1395,1435,1454,1464,1497,1522,1530,1537,1547,1568,1599,1648,1664,1817,1845,1861,1868,1890,1913,1938,1949,1975 'control-flow':1521,1598,1860 'core':310,1155,1742,1830 'correl':886,906,999,1019 'countri':125 'cover':1834 'creat':1284,1424,1686,1729,1814,1822,1928,1964 'current':1514,1591,1853 'custom':1238,1243 'dash':129 'data.event':811,924,1037,1981 'data.id':821,934,1047 'data.occurred':828,941,1054 'data.payload.call':841,870,889,954,983,1002,1067 'data.payload.connection':855,968,1081,1096 'data.payload.offered':1110 'data.record':801,914,1027 'date':831,944,1057 'date-tim':830,943,1056 'datetim':835,948,1061 'decis':1524,1601,1863 'deepobject':1628,1704,1712 'default':29 'delet':1518,1595,1857,1887,1893 'deliv':820,933,1046 'descript':335,487,600,800,913,1026,1197,1301,1441,1535,1613,1683,1983 'detach':1897 'dial':155,187,312,346,611 'differ':182 'downstream':587 'drive':222 'driven':153,1184 'duplic':1236,1359,1491 'durat':466,1571,1651 'e':757 'e.164':117,338,351,603 'e.g':119,724 'e.message':762 'e29b':563,1259,1557 'e29b-41d4-a716':562,1258,1556 'ed25519':701,708,738,743 'enabl':1106 'end':763,779,1176 'endpoint':206,1809 'entrypoint':318 'enum':235,244,803,813,916,926,1029,1039,1443,1685 'env':22 'error':45,54,59,63,67,84,99 'ev':908,1021 'event':152,175,752,766,774,804,818,839,888,917,931,952,1001,1030,1044,1065,1840,1884,1979,1980 'event-driven':151 'event.data.event':775 'everi':428,531,655,1223,1346,1478 'exact':1753 'exampl':35,299 'exhaust':1989 'exist':1280,1420,1672,1876,1902,1924,1960 'exponenti':108 'fail':51 'fetch':1512,1589,1851 'field':101,237,240,247,295,309,407,423,451,510,526,541,572,650,665,693,784,798,911,1024,1127,1143,1218,1233,1268,1341,1356,1407,1473,1488,1506,1566,1646,1727,1805 'filter':1698,1702 'first':1745 'flow':180,1162,1186,1523,1600,1836,1862 'follow':162,1171,1275,1415,1919,1955 'follow-up':161,1170,1274,1414,1918,1954 'format':102,118 'former':378,862,975,1088 'found':96 'frequenc':1771 'full':1763,1992 'gem':10 'get':1527,1605,1678,1848 'given':1587 'group':400,412,503,515 'gru1ogrkyq':567,1263,1561 'guess':1803 'halt':758 'handl':46,66 'handler':167,723,1147 'hangup':910,1174 'header':713,734,755,1239,1244 'http':740,748 'id':75,172,362,367,372,379,401,413,441,454,457,460,464,482,490,504,516,575,595,616,686,843,846,856,861,865,872,874,891,893,956,959,969,974,978,985,987,1004,1006,1069,1072,1082,1087,1091,1192,1200,1227,1296,1304,1311,1323,1350,1363,1368,1393,1396,1436,1455,1482,1498,1531,1538,1569,1574,1577,1608,1615,1621,1649,1654,1657,1728,1850,1864,1873,1886,1895,1904,1914,1939,1950,1976 'identifi':326,495,621,805,823,918,936,1031,1049,1205,1328,1460,1543 'iie4pqg':1402 'implic':589 'import':110,1148 'inbound':158,179,189,469,472 'includ':121,704 'incom':196 'index':1750 'info':1942,1945 'initi':41,1023 'inlin':253,298,786,1132 'inspect':1666 'instal':8,11 'insuffici':91 'integ':385,630 'integr':794 'invalid':87,760 'invent':232 'iso':833,946,1059 'issu':160,849,962,1075 'item':143,1640,1645,1721,1726 'item.id':145 'iter':139 'key':21,25,89 'leg':456,871,984,1573,1653 'level':1289,1429,1933,1969 'limit':56,105 'list':1100,1114,1131,1582,1662 'live':224,578,1178 'lower':1770 'lower-frequ':1769 'make':1520,1597,1859 'match':293 'may':216 'mdi91x4lwfes7igbbeot9m4aigoy08m0wwzfist1yw2axz':1401 'messag':1252 'method':1755,1808 'miss':1804 'modifi':1874 'must':114,191 'mutat':1675 'name':1689,1737,1838,1882 'need':249,320,1125,1165 'network':53 'new':1286,1426,1930,1966 'note':111 'number':113,355,388,633 'object':1241,1623,1699,1707 'occur':840,953,1066 'offer':1120 'omit':33 'oper':146,266,269,1150,1739,1747,1777,1806 'option':273,278,432,552,676,1383,1764,1782,1787,1990 'optional-paramet':272,277,1781,1786 'order':1695 'outbound':177,183,314 'overrid':543,667,1735 'page':135,141,1622,1626,1631,1637,1706,1710,1715,1718 'page.auto':140 'page.data':1641,1722 'page.meta':1643,1724 'pagin':132,1642,1723 'param':433,553,677,1384,1758,1765,1813 'paramet':234,243,274,279,332,484,597,1194,1298,1438,1532,1610,1627,1680,1703,1711,1783,1788,1991 'parenthes':131 'pars':769 'part':790 'patch':1871 'path':585,795 'payload':176,303,308,732,754,771,783,1137,1142,1773,1998 'permiss':92 'phone':112 'post':330,478,582,591,729,1188,1292,1432,1820,1910,1946 'post-answ':581 'prefix':123 'present':363 'primari':316,449,471,570,691,793,1266,1405,1504,1564,1644,1725 'product':69,718 'provis':1824 'public':203 'put':81,144,447,568,689,772,1264,1403,1502,1562,1636,1717 'rate':55,104 'rather':1282,1422,1926,1962 'raw':727 'reachabl':204 'read':257,270,291,300,1134,1779 'real':210 'receiv':773 'record':1660 'recreat':1879 'refer':227,304,1138,1906 'references/api-details.md':258,259,276,286,305,435,436,555,556,679,680,1139,1386,1387,1760,1761,1785,1795,2000,2001 'reject':1409,1445,1452 'remov':1896 'request':703 'request.body.read':733 'request.env':739,747 'requir':15,208,334,486,599,1196,1300,1440,1534,1612,1682,1757,1812 'rescu':756 'resourc':94,810,827,923,940,1036,1053,1290,1430,1668,1673,1827,1877,1903,1934,1970 'respons':72,82,236,246,283,288,438,448,450,558,569,571,682,690,692,1254,1265,1267,1389,1404,1406,1494,1503,1505,1551,1563,1565,1638,1719,1766,1792,1797,1993 'response-schema':282,287,1791,1796 'response.data.call':452,455,458,465,1567,1570,1572,1575 'response.data.client':1578 'response.data.end':1580 'response.data.is':461 'response.data.recording':463,574 'response.data.result':573,694,1269,1408,1507 'result':1697 'retri':106 'retriev':1508,1842 'return':327 'room':1362,1372 'rubi':4,7,14,71,437,557,681,719,1253,1388,1493,1550,1630,1714 'rule':229 'run':201 'schema':284,289,1767,1793,1798,1994 'sdk':1754,1807 'sec':384,629 'second':390,635 'section':275,285,1784,1794 'see':1999 'sen':550,674 'send':1940 'separ':1104,1118 'session':459,890,900,1003,1013,1576,1656 'set':409,512 'setup':13 'shown':43,252 'sign':698 'signatur':707,716,737,742,761,764 'sinatra':725 'sip':343,608,1250,1905,1935,1941,1944 'skill':256 'skill-telnyx-voice-ruby' 'sort':1684,1694 'source-team-telnyx' 'space':128 'specifi':1692 'start':185 'state':226,418,426,521,529,645,653,1213,1221,1336,1344,1468,1476,1515,1579,1592,1659,1854 'status':777,1511,1526,1553 'step':1173 'string':337,350,368,402,419,491,505,522,536,602,617,646,660,844,857,873,892,957,970,986,1005,1070,1083,1098,1112,1201,1214,1228,1305,1324,1337,1351,1364,1456,1469,1483,1539,1616 'style':1629,1705,1713 'subsequ':429,532,656,1224,1347,1479 'support':1149 'task':311,1156,1743,1831 'telnyx':2,5,12,16,18,23,233,392,548,637,672,697,706,711,736,741,745,749,863,976,1089,1619 'telnyx-signature-ed25519':705,735 'telnyx-timestamp':710,744 'telnyx-voice-rubi':1 'time':832,945,1058,1581 'timeout':383,628 'timestamp':712,746,750 'token':497,623,1207,1330,1462,1545 'top':1288,1428,1932,1968 'top-level':1287,1427,1931,1967 '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' 'transfer':576 'trigger':1272,1412,1916,1952 'type':333,485,598,776,799,802,807,812,816,825,912,915,920,925,929,938,1025,1028,1033,1038,1042,1051,1195,1299,1439,1533,1611,1661,1681,1972,1982 'u':1381 'uniqu':494,620,877,896,990,1009,1204,1327,1459,1542 'updat':1517,1594,1731,1856,1865 'uri':344,609 'url':535,537,545,659,661,669,1841,1885 'use':133,168,228,264,358,405,421,508,524,539,648,663,726,847,866,884,904,960,979,997,1017,1073,1092,1151,1216,1231,1339,1354,1471,1486,1740,1759,1775,1810 'user':1446,1500 'uuid':369,403,492,506,618,822,935,1048,1202,1229,1306,1325,1352,1365,1457,1484,1540,1617 'v3':560,1256,1400,1554 'valid':58,98,765 'variat':1168 'verif':696 'verifi':715 'via':851,964,1077 'video':1361,1371 'voic':3,6,317 'wait':394,639 'want':1316,1374 'webhook':159,166,197,205,239,294,302,307,430,533,534,588,657,658,695,699,722,770,780,782,887,907,1000,1020,1126,1136,1141,1183,1225,1348,1480,1772,1839,1883,1978,1997 'webhook-driven':1182 'webhook-payload-field':306,1140 'without':213,1878 'workflow':1281,1421,1925,1961 'wrapper':1639,1720 'write':261,1145 'yes':339,352,370,493,604,619,1203,1307,1326,1448,1458,1541,1618","prices":[{"id":"740701b2-f29e-403f-9ea4-07052aa4c746","listingId":"95b8725a-079a-4d5c-93f6-28c0e6032929","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:36.966Z"}],"sources":[{"listingId":"95b8725a-079a-4d5c-93f6-28c0e6032929","source":"github","sourceId":"team-telnyx/ai/telnyx-voice-ruby","sourceUrl":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-voice-ruby","isPrimary":false,"firstSeenAt":"2026-04-18T22:08:36.966Z","lastSeenAt":"2026-04-22T00:54:54.058Z"}],"details":{"listingId":"95b8725a-079a-4d5c-93f6-28c0e6032929","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"team-telnyx","slug":"telnyx-voice-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":"44fb19f7fe18b0b1e19a24f434b27a89909d168f","skill_md_path":"skills/telnyx-voice-ruby/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-voice-ruby"},"layout":"multi","source":"github","category":"ai","frontmatter":{"name":"telnyx-voice-ruby","description":">-"},"skills_sh_url":"https://skills.sh/team-telnyx/ai/telnyx-voice-ruby"},"updatedAt":"2026-04-22T00:54:54.058Z"}}