Antipattern Prevention
doorkeeper-gem/doorkeeper
Avoid common Ruby and Rails antipatterns that degrade maintainability and performance.
Set up hosted SMS numbers, toll-free verification, and RCS messaging.
$ npx skills add team-telnyx/ai --skill telnyx-messaging-hosted-ruby -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install team-telnyx/ai telnyx-messaging-hosted-ruby --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/team-telnyx/ai.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/telnyx-messaging-hosted-ruby .claude/skills/telnyx-messaging-hosted-ruby && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "telnyx-messaging-hosted-ruby" agent skill from https://github.com/team-telnyx/ai/tree/main/skills/telnyx-messaging-hosted-ruby into .claude/skills/telnyx-messaging-hosted-ruby/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "telnyx-messaging-hosted-ruby", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/team-telnyx/ai/tree/main/skills/telnyx-messaging-hosted-rubyType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add team-telnyx/ai --skill telnyx-messaging-hosted-ruby -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install team-telnyx/ai telnyx-messaging-hosted-ruby --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/team-telnyx/ai.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/telnyx-messaging-hosted-ruby .agents/skills/telnyx-messaging-hosted-ruby && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "telnyx-messaging-hosted-ruby" agent skill from https://github.com/team-telnyx/ai/tree/main/skills/telnyx-messaging-hosted-ruby into .agents/skills/telnyx-messaging-hosted-ruby/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "telnyx-messaging-hosted-ruby", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add team-telnyx/ai --skill telnyx-messaging-hosted-ruby -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install team-telnyx/ai telnyx-messaging-hosted-ruby --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/team-telnyx/ai.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/telnyx-messaging-hosted-ruby .cursor/skills/telnyx-messaging-hosted-ruby && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "telnyx-messaging-hosted-ruby" agent skill from https://github.com/team-telnyx/ai/tree/main/skills/telnyx-messaging-hosted-ruby into .cursor/skills/telnyx-messaging-hosted-ruby/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "telnyx-messaging-hosted-ruby", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/team-telnyx/ai.git --path skills/telnyx-messaging-hosted-ruby--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add team-telnyx/ai --skill telnyx-messaging-hosted-ruby -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install team-telnyx/ai telnyx-messaging-hosted-ruby --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/team-telnyx/ai.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/telnyx-messaging-hosted-ruby .gemini/skills/telnyx-messaging-hosted-ruby && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "telnyx-messaging-hosted-ruby" agent skill from https://github.com/team-telnyx/ai/tree/main/skills/telnyx-messaging-hosted-ruby into .gemini/skills/telnyx-messaging-hosted-ruby/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "telnyx-messaging-hosted-ruby", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install team-telnyx/ai telnyx-messaging-hosted-rubyInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add team-telnyx/ai --skill telnyx-messaging-hosted-ruby -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/team-telnyx/ai.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/telnyx-messaging-hosted-ruby .github/skills/telnyx-messaging-hosted-ruby && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "telnyx-messaging-hosted-ruby" agent skill from https://github.com/team-telnyx/ai/tree/main/skills/telnyx-messaging-hosted-ruby into .github/skills/telnyx-messaging-hosted-ruby/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "telnyx-messaging-hosted-ruby", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add team-telnyx/ai --skill telnyx-messaging-hosted-ruby -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install team-telnyx/ai telnyx-messaging-hosted-ruby --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/team-telnyx/ai.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/telnyx-messaging-hosted-ruby .opencode/skills/telnyx-messaging-hosted-ruby && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "telnyx-messaging-hosted-ruby" agent skill from https://github.com/team-telnyx/ai/tree/main/skills/telnyx-messaging-hosted-ruby into .opencode/skills/telnyx-messaging-hosted-ruby/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "telnyx-messaging-hosted-ruby", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
telnyx-messaging-hosted-rubySet up hosted SMS numbers, toll-free verification, and RCS messaging.
Telnyx Messaging Hosted Ruby is an agent skill from team-telnyx/ai. Set up hosted SMS numbers, toll-free verification, and RCS messaging. Use when migrating numbers or enabling rich messaging features. This skill provides Ruby SDK examples.
Its SKILL.md is about 5.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs. It works with Ruby. The repository describes itself as: Official one-stop shop for AI Agents and developers building with Telnyx. The licence is MIT.
Read from SKILL.md and the folder at commit 4d2ace0. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gemFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
client.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
TELNYX_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Telnyx Messaging Hosted Ruby loads about 5.1k tokens when it runs. Until then it costs about 50 tokens; SKILL.md has 1,132 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from team-telnyx/ai at commit 4d2ace0, republished under its MIT licence (© team-telnyx). 1,132 words, ~5,064 tokens.
.claude/skills/telnyx-messaging-hosted-ruby/SKILL.md (or your agent's skills folder).<!-- Auto-generated from Telnyx OpenAPI specs. Do not edit. -->
gem install telnyxrequire "telnyx"
client = Telnyx::Client.new(
api_key: ENV["TELNYX_API_KEY"], # This is the default and can be omitted
)All examples below assume client is already initialized as shown above.
All API calls can fail with network errors, rate limits (429), validation errors (422), or authentication errors (401). Always handle errors in production code:
begin
result = client.messages.send_(to: "+13125550001", from: "+13125550002", text: "Hello")
rescue Telnyx::Errors::APIConnectionError
puts "Network error — check connectivity and retry"
rescue Telnyx::Errors::RateLimitError
# 429: rate limited — wait and retry with exponential backoff
sleep(1) # Check Retry-After header for actual delay
rescue Telnyx::Errors::APIStatusError => e
puts "API error #{e.status}: #{e.message}"
if e.status == 422
puts "Validation error — check required fields and formats"
end
endCommon error codes: 401 invalid API key, 403 insufficient permissions,
404 resource not found, 422 validation error (check field formats),
429 rate limited (retry with exponential backoff).
+13125550001). Include the + prefix and country code. No spaces, dashes, or parentheses..auto_paging_each for automatic iteration: page.auto_paging_each { |item| puts item.id }.POST /messages/rcs — Required: agent_id, to, messaging_profile_id, agent_message
Optional: mms_fallback (object), sms_fallback (object), type (enum: RCS), webhook_url (url)
response = client.messages.rcs.send_(
agent_id: "Agent007",
agent_message: {},
messaging_profile_id: "550e8400-e29b-41d4-a716-446655440000",
to: "+13125551234"
)
puts(response)Returns: body (object), direction (string), encoding (string), from (object), id (string), messaging_profile_id (string), organization_id (string), received_at (date-time), record_type (string), to (array[object]), type (string), wait_seconds (float)
Generate a deeplink URL that can be used to start an RCS conversation with a specific agent.
GET /messages/rcs/deeplinks/{agent_id}
response = client.messages.rcs.generate_deeplink("agent_id")
puts(response)Returns: url (string)
GET /messaging/rcs/agents
page = client.messaging.rcs.agents.list
puts(page)Returns: agent_id (string), agent_name (string), created_at (date-time), enabled (boolean), profile_id (uuid), updated_at (date-time), user_id (string), webhook_failover_url (url), webhook_url (url)
GET /messaging/rcs/agents/{id}
rcs_agent_response = client.messaging.rcs.agents.retrieve("550e8400-e29b-41d4-a716-446655440000")
puts(rcs_agent_response)Returns: agent_id (string), agent_name (string), created_at (date-time), enabled (boolean), profile_id (uuid), updated_at (date-time), user_id (string), webhook_failover_url (url), webhook_url (url)
PATCH /messaging/rcs/agents/{id}
Optional: profile_id (uuid), webhook_failover_url (url), webhook_url (url)
rcs_agent_response = client.messaging.rcs.agents.update("550e8400-e29b-41d4-a716-446655440000")
puts(rcs_agent_response)Returns: agent_id (string), agent_name (string), created_at (date-time), enabled (boolean), profile_id (uuid), updated_at (date-time), user_id (string), webhook_failover_url (url), webhook_url (url)
POST /messaging/rcs/bulk_capabilities — Required: agent_id, phone_numbers
response = client.messaging.rcs.list_bulk_capabilities(agent_id: "TestAgent", phone_numbers: ["+13125551234"])
puts(response)Returns: agent_id (string), agent_name (string), features (array[string]), phone_number (string), record_type (enum: rcs.capabilities)
GET /messaging/rcs/capabilities/{agent_id}/{phone_number}
response = client.messaging.rcs.retrieve_capabilities("phone_number", agent_id: "550e8400-e29b-41d4-a716-446655440000")
puts(response)Returns: agent_id (string), agent_name (string), features (array[string]), phone_number (string), record_type (enum: rcs.capabilities)
Adds a test phone number to an RCS agent for testing purposes.
PUT /messaging/rcs/test_number_invite/{id}/{phone_number}
response = client.messaging.rcs.invite_test_number("phone_number", id: "550e8400-e29b-41d4-a716-446655440000")
puts(response)Returns: agent_id (string), phone_number (string), record_type (enum: rcs.test_number_invite), status (string)
GET /messaging_hosted_number_orders
page = client.messaging_hosted_number_orders.list
puts(page)Returns: id (uuid), messaging_profile_id (string | null), phone_numbers (array[object]), record_type (string), status (enum: carrier_rejected, compliance_review_failed, deleted, failed, incomplete_documentation, incorrect_billing_information, ineligible_carrier, loa_file_invalid, loa_file_successful, pending, provisioning, successful)
POST /messaging_hosted_number_orders
Optional: messaging_profile_id (string), phone_numbers (array[string])
messaging_hosted_number_order = client.messaging_hosted_number_orders.create
puts(messaging_hosted_number_order)Returns: id (uuid), messaging_profile_id (string | null), phone_numbers (array[object]), record_type (string), status (enum: carrier_rejected, compliance_review_failed, deleted, failed, incomplete_documentation, incorrect_billing_information, ineligible_carrier, loa_file_invalid, loa_file_successful, pending, provisioning, successful)
POST /messaging_hosted_number_orders/eligibility_numbers_check — Required: phone_numbers
response = client.messaging_hosted_number_orders.check_eligibility(phone_numbers: ["string"])
puts(response)Returns: phone_numbers (array[object])
GET /messaging_hosted_number_orders/{id}
messaging_hosted_number_order = client.messaging_hosted_number_orders.retrieve("550e8400-e29b-41d4-a716-446655440000")
puts(messaging_hosted_number_order)Returns: id (uuid), messaging_profile_id (string | null), phone_numbers (array[object]), record_type (string), status (enum: carrier_rejected, compliance_review_failed, deleted, failed, incomplete_documentation, incorrect_billing_information, ineligible_carrier, loa_file_invalid, loa_file_successful, pending, provisioning, successful)
Delete a messaging hosted number order and all associated phone numbers.
DELETE /messaging_hosted_number_orders/{id}
messaging_hosted_number_order = client.messaging_hosted_number_orders.delete("550e8400-e29b-41d4-a716-446655440000")
puts(messaging_hosted_number_order)Returns: id (uuid), messaging_profile_id (string | null), phone_numbers (array[object]), record_type (string), status (enum: carrier_rejected, compliance_review_failed, deleted, failed, incomplete_documentation, incorrect_billing_information, ineligible_carrier, loa_file_invalid, loa_file_successful, pending, provisioning, successful)
POST /messaging_hosted_number_orders/{id}/actions/file_upload
response = client.messaging_hosted_number_orders.actions.upload_file("550e8400-e29b-41d4-a716-446655440000")
puts(response)Returns: id (uuid), messaging_profile_id (string | null), phone_numbers (array[object]), record_type (string), status (enum: carrier_rejected, compliance_review_failed, deleted, failed, incomplete_documentation, incorrect_billing_information, ineligible_carrier, loa_file_invalid, loa_file_successful, pending, provisioning, successful)
Validate the verification codes sent to the numbers of the hosted order. The verification codes must be created in the verification codes endpoint.
POST /messaging_hosted_number_orders/{id}/validation_codes — Required: verification_codes
response = client.messaging_hosted_number_orders.validate_codes(
"id",
verification_codes: [{code: "code", phone_number: "+13125550001"}]
)
puts(response)Returns: order_id (uuid), phone_numbers (array[object])
Create verification codes to validate numbers of the hosted order. The verification codes will be sent to the numbers of the hosted order.
POST /messaging_hosted_number_orders/{id}/verification_codes — Required: phone_numbers, verification_method
response = client.messaging_hosted_number_orders.create_verification_codes(
"id",
phone_numbers: ["string"],
verification_method: :sms
)
puts(response)Returns: error (string), phone_number (string), type (enum: sms, call), verification_code_id (uuid)
DELETE /messaging_hosted_numbers/{id}
messaging_hosted_number = client.messaging_hosted_numbers.delete("550e8400-e29b-41d4-a716-446655440000")
puts(messaging_hosted_number)Returns: id (uuid), messaging_profile_id (string | null), phone_numbers (array[object]), record_type (string), status (enum: carrier_rejected, compliance_review_failed, deleted, failed, incomplete_documentation, incorrect_billing_information, ineligible_carrier, loa_file_invalid, loa_file_successful, pending, provisioning, successful)
Get a list of previously-submitted tollfree verification requests
GET /messaging_tollfree/verification/requests
page = client.messaging_tollfree.verification.requests.list(page: 1, page_size: 1)
puts(page)Returns: records (array[object]), total_records (integer)
Submit a new tollfree verification request
POST /messaging_tollfree/verification/requests — Required: businessName, corporateWebsite, businessAddr1, businessCity, businessState, businessZip, businessContactFirstName, businessContactLastName, businessContactEmail, businessContactPhone, messageVolume, phoneNumbers, useCase, useCaseSummary, productionMessageContent, optInWorkflow, optInWorkflowImageURLs, additionalInformation
Optional: ageGatedContent (boolean), businessAddr2 (string), businessRegistrationCountry (string | null), businessRegistrationNumber (string | null), businessRegistrationType (string | null), campaignVerifyAuthorizationToken (string | null), doingBusinessAs (string | null), entityType (object), helpMessageResponse (string | null), isvReseller (string | null), optInConfirmationResponse (string | null), optInKeywords (string | null), privacyPolicyURL (string | null), termsAndConditionURL (string | null), webhookUrl (string)
verification_request_egress = client.messaging_tollfree.verification.requests.create(
additional_information: "additionalInformation",
business_addr1: "600 Congress Avenue",
business_city: "Austin",
business_contact_email: "email@example.com",
business_contact_first_name: "John",
business_contact_last_name: "Doe",
business_contact_phone: "+18005550100",
business_name: "Telnyx LLC",
business_state: "Texas",
business_zip: "78701",
corporate_website: "http://example.com",
message_volume: :"100,000",
opt_in_workflow: "User signs into the Telnyx portal, enters a number and is prompted to select whether they want to use 2FA verification for security purposes. If they've opted in a confirmation message is sent out to the handset",
opt_in_workflow_image_urls: [{url: "https://client.com/sign-up"}, {url: "https://client.com/company/data-privacy"}],
phone_numbers: [{phoneNumber: "+18773554398"}, {phoneNumber: "+18773554399"}],
production_message_content: "Your Telnyx OTP is XXXX",
use_case: :"2FA",
use_case_summary: "This is a use case where Telnyx sends out 2FA codes to portal users to verify their identity in order to sign into the portal"
)
puts(verification_request_egress)Returns: additionalInformation (string), ageGatedContent (boolean), businessAddr1 (string), businessAddr2 (string), businessCity (string), businessContactEmail (string), businessContactFirstName (string), businessContactLastName (string), businessContactPhone (string), businessName (string), businessRegistrationCountry (string), businessRegistrationNumber (string), businessRegistrationType (string), businessState (string), businessZip (string), campaignVerifyAuthorizationToken (string | null), corporateWebsite (string), doingBusinessAs (string), entityType (object), helpMessageResponse (string), id (uuid), isvReseller (string), messageVolume (object), optInConfirmationResponse (string), optInKeywords (string), optInWorkflow (string), optInWorkflowImageURLs (array[object]), phoneNumbers (array[object]), privacyPolicyURL (string), productionMessageContent (string), termsAndConditionURL (string), useCase (object), useCaseSummary (string), verificationRequestId (string), verificationStatus (object), webhookUrl (string)
Get a single verification request by its ID.
GET /messaging_tollfree/verification/requests/{id}
verification_request_status = client.messaging_tollfree.verification.requests.retrieve("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")
puts(verification_request_status)Returns: additionalInformation (string), ageGatedContent (boolean), businessAddr1 (string), businessAddr2 (string), businessCity (string), businessContactEmail (string), businessContactFirstName (string), businessContactLastName (string), businessContactPhone (string), businessName (string), businessRegistrationCountry (string), businessRegistrationNumber (string), businessRegistrationType (string), businessState (string), businessZip (string), campaignVerifyAuthorizationToken (string | null), corporateWebsite (string), createdAt (date-time), doingBusinessAs (string), entityType (object), helpMessageResponse (string), id (uuid), isvReseller (string), messageVolume (object), optInConfirmationResponse (string), optInKeywords (string), optInWorkflow (string), optInWorkflowImageURLs (array[object]), phoneNumbers (array[object]), privacyPolicyURL (string), productionMessageContent (string), reason (string), termsAndConditionURL (string), updatedAt (date-time), useCase (object), useCaseSummary (string), verificationStatus (object), webhookUrl (string)
Update an existing tollfree verification request. This is particularly useful when there are pending customer actions to be taken.
PATCH /messaging_tollfree/verification/requests/{id} — Required: businessName, corporateWebsite, businessAddr1, businessCity, businessState, businessZip, businessContactFirstName, businessContactLastName, businessContactEmail, businessContactPhone, messageVolume, phoneNumbers, useCase, useCaseSummary, productionMessageContent, optInWorkflow, optInWorkflowImageURLs, additionalInformation
Optional: ageGatedContent (boolean), businessAddr2 (string), businessRegistrationCountry (string | null), businessRegistrationNumber (string | null), businessRegistrationType (string | null), campaignVerifyAuthorizationToken (string | null), doingBusinessAs (string | null), entityType (object), helpMessageResponse (string | null), isvReseller (string | null), optInConfirmationResponse (string | null), optInKeywords (string | null), privacyPolicyURL (string | null), termsAndConditionURL (string | null), webhookUrl (string)
verification_request_egress = client.messaging_tollfree.verification.requests.update(
"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
additional_information: "additionalInformation",
business_addr1: "600 Congress Avenue",
business_city: "Austin",
business_contact_email: "email@example.com",
business_contact_first_name: "John",
business_contact_last_name: "Doe",
business_contact_phone: "+18005550100",
business_name: "Telnyx LLC",
business_state: "Texas",
business_zip: "78701",
corporate_website: "http://example.com",
message_volume: :"100,000",
opt_in_workflow: "User signs into the Telnyx portal, enters a number and is prompted to select whether they want to use 2FA verification for security purposes. If they've opted in a confirmation message is sent out to the handset",
opt_in_workflow_image_urls: [{url: "https://client.com/sign-up"}, {url: "https://client.com/company/data-privacy"}],
phone_numbers: [{phoneNumber: "+18773554398"}, {phoneNumber: "+18773554399"}],
production_message_content: "Your Telnyx OTP is XXXX",
use_case: :"2FA",
use_case_summary: "This is a use case where Telnyx sends out 2FA codes to portal users to verify their identity in order to sign into the portal"
)
puts(verification_request_egress)Returns: additionalInformation (string), ageGatedContent (boolean), businessAddr1 (string), businessAddr2 (string), businessCity (string), businessContactEmail (string), businessContactFirstName (string), businessContactLastName (string), businessContactPhone (string), businessName (string), businessRegistrationCountry (string), businessRegistrationNumber (string), businessRegistrationType (string), businessState (string), businessZip (string), campaignVerifyAuthorizationToken (string | null), corporateWebsite (string), doingBusinessAs (string), entityType (object), helpMessageResponse (string), id (uuid), isvReseller (string), messageVolume (object), optInConfirmationResponse (string), optInKeywords (string), optInWorkflow (string), optInWorkflowImageURLs (array[object]), phoneNumbers (array[object]), privacyPolicyURL (string), productionMessageContent (string), termsAndConditionURL (string), useCase (object), useCaseSummary (string), verificationRequestId (string), verificationStatus (object), webhookUrl (string)
Delete a verification request
A request may only be deleted when when the request is in the "rejected" state. * HTTP 200: request successfully deleted
HTTP 400: request exists but can't be deleted (i.e. not rejected)HTTP 404: request unknown or already deletedDELETE /messaging_tollfree/verification/requests/{id}
result = client.messaging_tollfree.verification.requests.delete("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")
puts(result)Get the history of status changes for a verification request. Returns a paginated list of historical status changes including the reason for each change and when it occurred.
GET /messaging_tollfree/verification/requests/{id}/status_history
response = client.messaging_tollfree.verification.requests.retrieve_status_history(
"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
page_number: 1,
page_size: 1
)
puts(response)Returns: records (array[object]), total_records (integer)
GET /messaging_url_domains
page = client.messaging_url_domains.list
puts(page)Returns: id (string), record_type (string), url_domain (string), use_case (string)
© team-telnyx, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/telnyx-messaging-hosted-ruby of team-telnyx/ai.
Open the folder on GitHubat commit 4d2ace0
Telnyx Messaging Hosted Ruby next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Telnyx Messaging Hosted Ruby this skillteam-telnyx/ai | 220 | — | ~5.1k | Automated safety check: Pass | MIT | |
| Antipattern Preventiondoorkeeper-gem/doorkeeper | 5.5k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Dependency Safetydoorkeeper-gem/doorkeeper | 5.5k | — | ~931 | Automated safety check: Pass | MIT | |
| Backfill Event Datarubyevents/rubyevents | 569 | — | ~2.8k | Automated safety check: Pass | None | |
| Temporal Developertemporalio/skill-temporal-developer | 230 | — | ~2.5k | Automated safety check: Pass | MIT | |
| Nxvutensils/nxv | 136 | — | ~7.9k | Automated safety check: Notes | MIT |
doorkeeper-gem/doorkeeper
Avoid common Ruby and Rails antipatterns that degrade maintainability and performance.
doorkeeper-gem/doorkeeper
Ensure gems are safe, necessary, and properly constrained when adding, updating, or reviewing dependencies in Doorkeeper.
rubyevents/rubyevents
Add or backfill RubyEvents conference data for an event from its website — involvements (organizers/MCs), sponsors, venue + hotels, schedule, talk running order, and speaker GitHub/Twitter handles.
temporalio/skill-temporal-developer
Develop, debug, and manage Temporal applications across Python, TypeScript, Go, Java, .NET, Ruby, and Rust.
utensils/nxv
Find any version of any Nix package across nixpkgs git history using the nxv CLI or HTTP API.
bibendi/schked
Guide for working with Schked, a Ruby recurring-job scheduler built on top of rufus-scheduler.
team-telnyx/ai
Test VoIP push notifications for Telnyx WebRTC iOS (APNs) and Android (FCM) apps.
team-telnyx/ai
Manage email suppressions (blocks), import and export suppression lists, and manage unsubscribe groups.
team-telnyx/ai
Send and receive SMS/MMS, handle opt-outs and delivery webhooks.
team-telnyx/ai
Build cross-platform VoIP calling apps with React Native using Telnyx Voice SDK.
team-telnyx/ai
End-to-end setup for making a Telnyx AI assistant call a phone number.
team-telnyx/ai
Send transactional email, batch sends, scheduled delivery, templates, email validation, and track delivery events.
Works with
Categories
Set up hosted SMS numbers, toll-free verification, and RCS messaging. Telnyx Messaging Hosted Ruby is an agent skill from team-telnyx/ai. Set up hosted SMS numbers, toll-free verification, and RCS messaging.
Telnyx Messaging Hosted Ruby fits situations like: migrating numbers; enabling rich messaging features.
Run `npx skills add team-telnyx/ai --skill telnyx-messaging-hosted-ruby -a claude-code`. Or copy the skill folder (skills/telnyx-messaging-hosted-ruby in team-telnyx/ai) into .claude/skills/telnyx-messaging-hosted-ruby in your project. Claude Code loads it when a task matches its description.
Run `npx skills add team-telnyx/ai --skill telnyx-messaging-hosted-ruby -a codex`. Or copy the skill folder (skills/telnyx-messaging-hosted-ruby in team-telnyx/ai) into .agents/skills/telnyx-messaging-hosted-ruby in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add team-telnyx/ai --skill telnyx-messaging-hosted-ruby -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/telnyx-messaging-hosted-ruby, .gemini/skills/telnyx-messaging-hosted-ruby, .github/skills/telnyx-messaging-hosted-ruby and .opencode/skills/telnyx-messaging-hosted-ruby in your project.
Going by SKILL.md and its folder, Telnyx Messaging Hosted Ruby needs the command-line tools its instructions call (gem) and credentials named TELNYX_API_KEY. Our summary lists: A credential in TELNYX_API_KEY.
SKILL.md names 1 domain. In commands or code: client.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Telnyx Messaging Hosted Ruby is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.1k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Telnyx Messaging Hosted Ruby: Antipattern Prevention (doorkeeper-gem/doorkeeper, 5.5k stars), Dependency Safety (doorkeeper-gem/doorkeeper, 5.5k stars), Backfill Event Data (rubyevents/rubyevents, 569 stars) and Temporal Developer (temporalio/skill-temporal-developer, 230 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
team-telnyx (a GitHub organization) maintains it in team-telnyx/ai, which has 220 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on October 8, 2026.
Source: team-telnyx/ai on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.