{"id":"6484f7ce-e7d3-4a3d-9d72-c88974bf646c","shortId":"pXNAUD","kind":"skill","title":"telnyx-whatsapp-ruby","tagline":">-","description":"# Telnyx WhatsApp Business API - Ruby\n\n## Installation\n\n```bash\ngem install telnyx\n```\n\n## Setup\n\n```ruby\nrequire \"telnyx\"\n\nclient = Telnyx::Client.new(api_key: ENV[\"TELNYX_API_KEY\"])\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  response = client.messages.send_whatsapp(\n    from: \"+19452940762\",\n    to: \"+18005551234\",\n    type: \"WHATSAPP\",\n    whatsapp_message: {\n      type: \"text\",\n      text: { body: \"Hello from Telnyx!\" }\n    }\n  )\nrescue Telnyx::APIError => e\n  puts \"API error: #{e.http_status} - #{e.message}\"\nrescue Telnyx::AuthenticationError\n  puts \"Invalid API key\"\nrescue Telnyx::RateLimitError\n  puts \"Rate limited - retry with backoff\"\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### WhatsApp-Specific Errors\n\n- **40008** — Meta catch-all error. Check template parameters, phone number formatting, and 24-hour window rules.\n- **131047** — Message failed to send during the 24-hour window. The customer hasn't messaged you first (for non-template messages).\n- **131026** — Recipient phone number is not a WhatsApp user.\n- **132000** — Template parameter count mismatch. Ensure the number of parameters matches the template definition.\n- **132015** — Template paused or disabled by Meta due to quality issues.\n\n## Important Notes\n\n- **Phone numbers** must be in E.164 format (e.g., `+13125550001`). Include the `+` prefix and country code.\n- **Template messages** can be sent anytime. Free-form (session) messages can only be sent within a 24-hour window after the customer last messaged you.\n- **Template IDs**: You can reference templates by Telnyx UUID (`template_id`) instead of `name` + `language`. When `template_id` is provided, name and language are resolved automatically.\n- **Pagination:** List endpoints return paginated results. Use the auto-paging pattern: `response.auto_paging_each { |item| }`.\n\n## Operational Caveats\n\n- The sending phone number must be registered with a WhatsApp Business Account (WABA) and associated with a messaging profile.\n- Templates must be in `APPROVED` status before they can be used for sending.\n- Template names must be lowercase with underscores only (e.g., `order_confirmation`). No spaces, hyphens, or uppercase.\n- When creating templates, provide realistic sample values for body parameters — Meta reviewers check these during approval.\n- Category selection matters for billing: `AUTHENTICATION` templates get special pricing but must contain an OTP. `UTILITY` is for transactional messages. `MARKETING` for promotional content.\n- Meta may reclassify your template category (e.g., UTILITY to MARKETING) which affects billing.\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### Send a WhatsApp template message\n\nSend a pre-approved template message. Templates can be sent anytime — no 24-hour window restriction.\n\n`client.messages.send_whatsapp()` — `POST /messages/whatsapp`\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `from` | string (E.164) | Yes | WhatsApp-enabled phone number in +E.164 format |\n| `to` | string (E.164) | Yes | Recipient phone number in +E.164 format |\n| `type` | string | No | Must be `WHATSAPP` |\n| `whatsapp_message` | object | Yes | WhatsApp message object |\n| `messaging_profile_id` | string (UUID) | No | Messaging profile to use |\n| `webhook_url` | string (URL) | No | Callback URL for delivery status updates |\n\n```ruby\n# Send by template name + language\nresponse = client.messages.send_whatsapp(\n  from: \"+19452940762\",\n  to: \"+18005551234\",\n  type: \"WHATSAPP\",\n  whatsapp_message: {\n    type: \"template\",\n    template: {\n      name: \"order_confirmation\",\n      language: { code: \"en_US\" },\n      components: [\n        {\n          type: \"body\",\n          parameters: [\n            { type: \"text\", text: \"ORD-12345\" },\n            { type: \"text\", text: \"March 15, 2026\" }\n          ]\n        }\n      ]\n    }\n  }\n)\nputs response.data.id\n```\n\n```ruby\n# Send by Telnyx template_id (no name/language needed)\nresponse = client.messages.send_whatsapp(\n  from: \"+19452940762\",\n  to: \"+18005551234\",\n  type: \"WHATSAPP\",\n  whatsapp_message: {\n    type: \"template\",\n    template: {\n      template_id: \"019cd44b-3a1c-781b-956e-bd33e9fd2ac6\",\n      components: [\n        {\n          type: \"body\",\n          parameters: [\n            { type: \"text\", text: \"483291\" }\n          ]\n        }\n      ]\n    }\n  }\n)\n```\n\nPrimary response fields:\n- `response.data.id` — Message UUID\n- `response.data.to[0].status` — `queued`, `sent`, `delivered`, `failed`\n- `response.data.from.phone_number`\n- `response.data.type` — `WHATSAPP`\n\n### Send a free-form WhatsApp text message\n\nSend a text message within the 24-hour customer service window.\n\n`client.messages.send_whatsapp()` — `POST /messages/whatsapp`\n\n```ruby\nresponse = client.messages.send_whatsapp(\n  from: \"+19452940762\",\n  to: \"+18005551234\",\n  type: \"WHATSAPP\",\n  whatsapp_message: {\n    type: \"text\",\n    text: { body: \"Your order has shipped!\" }\n  }\n)\n```\n\n### List WhatsApp Business Accounts\n\n`client.whatsapp.business_accounts.list()` — `GET /v2/whatsapp/business_accounts`\n\n```ruby\nresponse = client.whatsapp.business_accounts.list\nresponse.data.each do |waba|\n  puts \"#{waba.id}: #{waba.name} (#{waba.status})\"\nend\n```\n\nPrimary response fields:\n- `waba.id` — Telnyx WABA UUID\n- `waba.waba_id` — Meta WABA ID\n- `waba.name` — Business name\n- `waba.status` — Account status\n- `waba.country` — WABA country\n\n### List templates for a WABA\n\n`client.whatsapp.templates.list()` — `GET /v2/whatsapp/message_templates`\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `waba_id` | string (UUID) | Yes | Telnyx WABA UUID |\n| `category` | string | No | Filter: `AUTHENTICATION`, `MARKETING`, `UTILITY` |\n| `status` | string | No | Filter: `APPROVED`, `PENDING`, `REJECTED`, `DISABLED` |\n\n```ruby\nresponse = client.whatsapp.templates.list(\n  waba_id: \"019c1ff0-5c30-7f36-8436-730b1d0b0e56\",\n  status: \"APPROVED\"\n)\nresponse.data.each do |tmpl|\n  puts \"#{tmpl.id}: #{tmpl.name} (#{tmpl.category}) - #{tmpl.status}\"\nend\n```\n\nPrimary response fields:\n- `tmpl.id` — Telnyx template UUID (use as `template_id` when sending)\n- `tmpl.name` — Template name\n- `tmpl.category` — `AUTHENTICATION`, `MARKETING`, or `UTILITY`\n- `tmpl.language` — Language code\n- `tmpl.status` — `APPROVED`, `PENDING`, `REJECTED`, `DISABLED`\n- `tmpl.components` — Template components\n\n### Create a message template\n\n`client.whatsapp.templates.create()` — `POST /v2/whatsapp/message_templates`\n\n```ruby\nresponse = client.whatsapp.templates.create(\n  waba_id: \"019c1ff0-5c30-7f36-8436-730b1d0b0e56\",\n  name: \"order_shipped\",\n  category: \"UTILITY\",\n  language: \"en_US\",\n  components: [\n    {\n      type: \"BODY\",\n      text: \"Your order {{1}} has been shipped and will arrive by {{2}}.\",\n      example: {\n        body_text: [[\"ORD-12345\", \"March 20, 2026\"]]\n      }\n    }\n  ]\n)\nputs \"Template created: #{response.data.id} (status: #{response.data.status})\"\n```\n\n### List phone numbers for a WABA\n\n`client.whatsapp.phone_numbers.list()` — `GET /v2/whatsapp/phone_numbers`\n\n```ruby\nresponse = client.whatsapp.phone_numbers.list(\n  waba_id: \"019c1ff0-5c30-7f36-8436-730b1d0b0e56\"\n)\nresponse.data.each do |pn|\n  puts \"#{pn.phone_number} - quality: #{pn.quality_rating}\"\nend\n```\n\n---\n\n### Webhook Verification\n\nTelnyx signs webhooks with Ed25519. Always verify signatures in production:\n\n```ruby\nevent = Telnyx::Webhook.construct_event(\n  payload: request.body.read,\n  sig_header: request.env[\"HTTP_TELNYX_SIGNATURE_ED25519\"],\n  timestamp: request.env[\"HTTP_TELNYX_TIMESTAMP\"],\n  public_key: TELNYX_PUBLIC_KEY\n)\n```\n\n## Webhooks\n\nThese webhook payload fields are inline because they are part of the primary integration path.\n\n### Message Delivery Update\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `data.event_type` | enum: message.sent, message.finalized | Delivery status event |\n| `data.payload.id` | uuid | Message ID |\n| `data.payload.to[0].status` | string | `queued`, `sent`, `delivered`, `read`, `failed` |\n| `data.payload.template_id` | string | Telnyx template UUID (if template message) |\n| `data.payload.template_name` | string | Template name (if template message) |\n\n### Template Status Change\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `event_type` | string | `whatsapp.template.approved`, `whatsapp.template.rejected`, `whatsapp.template.disabled` |\n| `payload.template_id` | string | Telnyx template UUID |\n| `payload.template_name` | string | Template name |\n| `payload.status` | string | New template status |\n| `payload.reason` | string | Rejection/disable reason |\n\n## Template Best Practices\n\n- **Naming**: Use lowercase with underscores. Be descriptive (e.g., `appointment_reminder`, not `msg1`).\n- **Sample values**: Provide realistic examples in the `example` field — Meta reviewers check these.\n- **Category selection**:\n  - `AUTHENTICATION` — OTP/verification codes only. Gets special pricing.\n  - `UTILITY` — Transactional (order updates, shipping, account alerts).\n  - `MARKETING` — Promotional content, offers, newsletters.\n- **Keep it concise**: Meta prefers shorter templates. Avoid unnecessary formatting.\n- **Parameters**: Use `{{1}}`, `{{2}}`, etc. for variable content. Always provide the correct number of parameters when sending.\n\n## Important Supporting Operations\n\n| Operation | SDK Method | Use Case |\n|-----------|-----------|----------|\n| Get template details | `client.whatsapp_message_templates.retrieve()` | Check template status |\n| Get business profile | `client.whatsapp.phone_numbers.profile.retrieve()` | View business profile |\n| Configure webhooks | `client.whatsapp.business_accounts.settings.update()` | Subscribe to events |\n\n## Additional Operations\n\n| Operation | SDK Method | Endpoint | Required Params |\n|-----------|-----------|----------|-----------------|\n| Send WhatsApp message | `client.messages.send_whatsapp()` | `POST /messages/whatsapp` | `from`, `to`, `whatsapp_message` |\n| List WABAs | `client.whatsapp.business_accounts.list()` | `GET /v2/whatsapp/business_accounts` | — |\n| Get WABA | `client.whatsapp.business_accounts.retrieve()` | `GET /v2/whatsapp/business_accounts/:id` | `waba_id` |\n| List templates | `client.whatsapp.templates.list()` | `GET /v2/whatsapp/message_templates` | `waba_id` |\n| Get template | `client.whatsapp_message_templates.retrieve()` | `GET /v2/whatsapp_message_templates/:id` | `template_id` |\n| Create template | `client.whatsapp.templates.create()` | `POST /v2/whatsapp/message_templates` | `waba_id`, `name`, `category`, `language`, `components` |\n| List phone numbers | `client.whatsapp.phone_numbers.list()` | `GET /v2/whatsapp/phone_numbers` | `waba_id` |\n| Configure webhooks | `client.whatsapp.business_accounts.settings.update()` | `PATCH /v2/whatsapp/business_accounts/:id/settings` | `waba_id` |","tags":["telnyx","whatsapp","ruby","team-telnyx","agent-skills","ai-coding-agent","claude-code","cpaas","cursor","iot","llm","sdk"],"capabilities":["skill","source-team-telnyx","skill-telnyx-whatsapp-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-whatsapp-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 (11,851 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:57.034Z","embedding":null,"createdAt":"2026-04-18T22:08:55.056Z","updatedAt":"2026-04-22T00:54:57.034Z","lastSeenAt":"2026-04-22T00:54:57.034Z","tsv":"'+13125550001':226 '+18005551234':73,587,634,705 '+19452940762':71,585,632,703 '-12345':610,893 '-730':802,864,922 '/messages/whatsapp':514,697,1180 '/v2/whatsapp/business_accounts':724,1189,1194,1236 '/v2/whatsapp/message_templates':764,853,1202,1217 '/v2/whatsapp/phone_numbers':911,1229 '/v2/whatsapp_message_templates':1209 '0':665,1005 '019c1ff0':798,860,918 '019c1ff0-5c30-7f36':797,859,917 '019cd44b':645 '019cd44b-3a1c-781b-956e-bd33e9fd2ac6':644 '1':880,1123 '131026':182 '131047':160 '132000':191 '132015':205 '15':615 '2':888,1124 '20':895 '2026':616,896 '24':156,167,250,507,689 '3a1c':646 '40008':143 '401':58,115 '403':119 '404':122 '422':54,126 '429':51,132 '483291':657 '5c30':799,861,919 '781b':647 '7f36':800,862,920 '8436':801,863,921 '956e':648 'account':314,721,752,1104 'addit':445,1166 'affect':402 'alert':1105 'alreadi':34 'alway':59,941,1129 'anytim':238,505 'api':8,22,26,42,90,100,117 'apierror':87 'appoint':1073 'approv':326,366,498,788,805,840 'arriv':886 'associ':317 'assum':31 'authent':56,372,781,832,1092 'authenticationerror':97 'auto':294 'auto-pag':293 'automat':284 'avoid':1118 'b1d0b0e56':803,865,923 'backoff':110,138 'bash':11 'bd33e9fd2ac6':649 'begin':66 'best':1063 'beyond':473 'bill':371,403 'bodi':81,359,604,652,713,876,890 'busi':7,313,720,749,1154,1158 'call':43 'callback':569 'case':1145 'catch':146 'catch-al':145 'categori':367,396,777,869,1090,1221 'caveat':302 'chang':1032 'check':129,149,363,1088,1150 'client':19,32 'client.messages.send':68,511,582,629,694,700,1177 'client.new':21 'client.whatsapp.business_accounts.list':722,727,1187 'client.whatsapp.business_accounts.retrieve':1192 'client.whatsapp.business_accounts.settings.update':1162,1234 'client.whatsapp.phone_numbers.list':909,914,1227 'client.whatsapp.phone_numbers.profile.retrieve':1156 'client.whatsapp.templates.create':851,856,1215 'client.whatsapp.templates.list':762,794,1200 'client.whatsapp_message_templates.retrieve':1149,1207 'code':64,114,232,439,599,838,1094 'common':112 'compon':602,650,846,874,1223 'concis':1113 'configur':1160,1232 'confirm':345,597 'contain':379 'content':390,1108,1128 'core':487 'correct':1132 'count':194 'countri':231,756 'creat':352,847,899,1213 'custom':171,255,691 'data.event':992 'data.payload.id':1000 'data.payload.template':1013,1022 'data.payload.to':1004 'definit':204 'deliv':669,1010 'deliveri':572,987,997 'descript':518,768,991,1035,1071 'detail':1148 'disabl':209,791,843 'due':212 'e':88 'e.164':223,521,529,533,539 'e.g':225,343,397,1072 'e.http':92 'e.message':94 'ed25519':940,959 'en':600,872 'enabl':525 'end':111,735,814,933 'endpoint':287,1171 'ensur':196 'enum':412,421,994 'env':24 'error':39,48,53,57,61,91,113,128,142,148 'etc':1125 'event':947,950,999,1036,1165 'exampl':29,476,889,1081,1084 'exponenti':137 'fail':45,162,670,1012 'field':130,414,417,424,472,486,660,738,817,974,989,1033,1085 'filter':780,787 'first':176 'form':241,679 'format':131,154,224,530,540,1120 'found':125 'free':240,678 'free-form':239,677 'gem':12 'get':374,723,763,910,1096,1146,1153,1188,1190,1193,1201,1205,1208,1228 'handl':40,60 'hasn':172 'header':954 'hello':82 'hour':157,168,251,508,690 'http':956,962 'hyphen':348 'id':260,269,276,556,624,643,744,747,770,796,825,858,916,1003,1014,1043,1195,1197,1204,1210,1212,1219,1231,1239 'id/settings':1237 'import':216,1138 'includ':227 'initi':35 'inlin':430,475,976 'instal':10,13 'instead':270 'insuffici':120 'integr':984 'invalid':99,116 'invent':409 'issu':215 'item':300 'keep':1111 'key':23,27,101,118,966,969 'languag':273,281,580,598,837,871,1222 'last':256 'limit':50,107,134 'list':286,718,757,903,1185,1198,1224 'lowercas':339,1067 'march':614,894 'market':387,400,782,833,1106 'match':201,470 'matter':369 'may':392 'messag':77,161,174,181,234,243,257,320,386,493,500,548,552,554,560,591,638,662,682,686,709,849,986,1002,1021,1029,1176,1184 'message.finalized':996 'message.sent':995 'meta':144,211,361,391,745,1086,1114 'method':1143,1170 'mismatch':195 'msg1':1076 'must':220,307,323,337,378,544 'name':272,279,336,579,595,750,830,866,1023,1026,1049,1052,1065,1220 'name/language':626 'need':426,627 'network':47 'new':1055 'newslett':1110 'non':179 'non-templ':178 'note':217 'number':153,185,198,219,306,527,537,672,905,929,1133,1226 'object':549,553 'offer':1109 'oper':301,443,446,1140,1141,1167,1168 'option':450,455 'optional-paramet':449,454 'ord':609,892 'order':344,596,715,867,879,1101 'otp':381 'otp/verification':1093 'page':295,298 'pagin':285,289 'param':1173 'paramet':151,193,200,360,411,420,451,456,515,605,653,765,1121,1135 'part':980 'patch':1235 'path':985 'pattern':296 'paus':207 'payload':480,485,951,973 'payload.reason':1058 'payload.status':1053 'payload.template':1042,1048 'pend':789,841 'permiss':121 'phone':152,184,218,305,526,536,904,1225 'pn':926 'pn.phone':928 'pn.quality':931 'post':513,696,852,1179,1216 'practic':1064 'pre':497 'pre-approv':496 'prefer':1115 'prefix':229 'price':376,1098 'primari':658,736,815,983 'product':63,945 'profil':321,555,561,1155,1159 'promot':389,1107 'provid':278,354,1079,1130 'public':965,968 'put':89,98,105,617,731,809,897,927 'qualiti':214,930 'queu':667,1008 'rate':49,106,133,932 'ratelimiterror':104 'read':434,447,468,477,1011 'realist':355,1080 'reason':1061 'recipi':183,535 'reclassifi':393 'refer':263,404,481 'references/api-details.md':435,436,453,463,482 'regist':309 'reject':790,842 'rejection/disable':1060 'remind':1074 'request.body.read':952 'request.env':955,961 'requir':17,517,767,1172 'rescu':85,95,102 'resolv':283 'resourc':123 'respons':67,413,423,460,465,581,628,659,699,726,737,793,816,855,913 'response-schema':459,464 'response.auto':297 'response.data.each':728,806,924 'response.data.from.phone':671 'response.data.id':618,661,900 'response.data.status':902 'response.data.to':664 'response.data.type':673 'restrict':510 'result':290 'retri':108,135 'return':288 'review':362,1087 'rubi':4,9,16,65,575,619,698,725,792,854,912,946 'rule':159,406 'sampl':356,1077 'schema':461,466 'sdk':1142,1169 'section':452,462 'select':368,1091 'send':164,304,334,489,494,576,620,675,683,827,1137,1174 'sent':237,247,504,668,1009 'servic':692 'session':242 'setup':15 'ship':717,868,883,1103 'shorter':1116 'shown':37,429 'sig':953 'sign':937 'signatur':943,958 'skill':433 'skill-telnyx-whatsapp-ruby' 'source-team-telnyx' 'space':347 'special':375,1097 'specif':141 'status':93,327,573,666,753,784,804,901,998,1006,1031,1057,1152 'string':520,532,542,557,566,771,778,785,1007,1015,1024,1038,1044,1050,1054,1059 'subscrib':1163 'support':1139 'task':488 'telnyx':2,5,14,18,20,25,84,86,96,103,266,410,622,740,774,819,936,948,957,963,967,1016,1045 'telnyx-whatsapp-rubi':1 'templat':150,180,192,203,206,233,259,264,268,275,322,335,353,373,395,492,499,501,578,593,594,623,640,641,642,758,820,824,829,845,850,898,1017,1020,1025,1028,1030,1046,1051,1056,1062,1117,1147,1151,1199,1206,1211,1214 'text':79,80,607,608,612,613,655,656,681,685,711,712,877,891 'timestamp':960,964 'tmpl':808 'tmpl.category':812,831 'tmpl.components':844 'tmpl.id':810,818 'tmpl.language':836 'tmpl.name':811,828 'tmpl.status':813,839 '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' 'transact':385,1100 'type':74,78,516,541,588,592,603,606,611,635,639,651,654,706,710,766,875,990,993,1034,1037 'underscor':341,1069 'unnecessari':1119 'updat':574,988,1102 'uppercas':350 'url':565,567,570 'us':601,873 'use':291,332,405,441,563,822,1066,1122,1144 'user':190 'util':382,398,783,835,870,1099 'uuid':267,558,663,742,772,776,821,1001,1018,1047 'valid':52,127 'valu':357,1078 'variabl':1127 'verif':935 'verifi':942 'view':1157 'waba':315,730,741,746,755,761,769,775,795,857,908,915,1186,1191,1196,1203,1218,1230,1238 'waba.country':754 'waba.id':732,739 'waba.name':733,748 'waba.status':734,751 'waba.waba':743 'webhook':416,471,479,484,564,934,938,970,972,1161,1233 'webhook-payload-field':483 'webhook.construct':949 'whatsapp':3,6,69,75,76,140,189,312,491,512,524,546,547,551,583,589,590,630,636,637,674,680,695,701,707,708,719,1175,1178,1183 'whatsapp-en':523 'whatsapp-specif':139 'whatsapp.template.approved':1039 'whatsapp.template.disabled':1041 'whatsapp.template.rejected':1040 'window':158,169,252,509,693 'within':248,687 'write':438 'yes':522,534,550,773","prices":[{"id":"38f80088-8bbf-4a4a-808c-8b9e3e737630","listingId":"6484f7ce-e7d3-4a3d-9d72-c88974bf646c","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:55.056Z"}],"sources":[{"listingId":"6484f7ce-e7d3-4a3d-9d72-c88974bf646c","source":"github","sourceId":"team-telnyx/ai/telnyx-whatsapp-ruby","sourceUrl":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-whatsapp-ruby","isPrimary":false,"firstSeenAt":"2026-04-18T22:08:55.056Z","lastSeenAt":"2026-04-22T00:54:57.034Z"}],"details":{"listingId":"6484f7ce-e7d3-4a3d-9d72-c88974bf646c","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"team-telnyx","slug":"telnyx-whatsapp-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":"162297e7f58981c1c47c57e6ddb337b6a421bed1","skill_md_path":"skills/telnyx-whatsapp-ruby/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-whatsapp-ruby"},"layout":"multi","source":"github","category":"ai","frontmatter":{"name":"telnyx-whatsapp-ruby","description":">-"},"skills_sh_url":"https://skills.sh/team-telnyx/ai/telnyx-whatsapp-ruby"},"updatedAt":"2026-04-22T00:54:57.034Z"}}