lupin.Open console
Voice

Treat phone calls and SMS as separate agent capabilities

Map messaging profiles, voice connections, permissions and asynchronous outcomes before sharing a number between workflows.

One number can carry different services

A stable phone number can be the public identity for both messages and conversations, but those services have separate configuration and operating behavior. Start by recording the number ID, owning project and capabilities rather than assuming every owned number supports every channel. An SMS acknowledgement tells you that a messaging request was accepted; it says nothing about voice routing, audio transport or an allowed conversation peer. This distinction matters when an onboarding screen says phone ready even though only one half of the intended workflow has actually been configured.

Check the provider configuration for each path

The Lupin operator configures TELNYX_MESSAGING_PROFILE_ID for SMS and TELNYX_CONNECTION_ID for voice, alongside the provider API key. Both depend on correctly routed callbacks, but their event types and resulting resource states differ. A messaging profile problem belongs in the SMS investigation; a voice connection or transfer failure belongs in the call investigation. Do not repair one by repeatedly buying numbers or modifying the other. Ask which provider operation failed and whether its configuration was present when that operation entered the durable journal.

Separate an accepted request from a completed interaction

SMS delivery and a human answering a call are asynchronous outcomes. A successful dial is not an answered conversation, and a successful send is not proof of delivery or reading. Store the returned call or message resource ID and refresh its state rather than using a shared success flag. For example, an appointment assistant can mark a text as submitted while its associated callback remains unanswered. Only provider-confirmed state should drive a decision to stop retries, release a reminder or tell a user that somebody was reached.

Use channel-specific admission and authorization

Read GET /v0/phone/status before conversational dialing to inspect enabled profiles, allowed destinations, monthly seconds and maximum duration. That admission surface has voice-specific limits, including one active call per workspace and a two-minute ceiling. SMS has its own permission and billing path. A key that can read an inbox cannot silently gain phone privileges, and a bootstrap credential cannot purchase a number or place paid requests. Keep an explicit approval for the exact outward effect: permission to send a text does not authorize a later phone call.

Build a combined workflow with independent recovery

Persist a separate stable idempotency key for each approved send or dial, together with its channel and saved payload. Reuse that key only for the same action. If an SMS has an uncertain provider outcome, do not start a call automatically as a workaround; that changes the user-visible action and may incur another charge. A useful support record contains the owned number, channel, resource ID, operation ID and observed provider state. It lets an operator reconcile the failed branch while preserving the successful branch and the number’s public identity.

Use a two-channel incident example

Suppose a reminder text is delivered but the proposed callback returns telnyx_not_configured. Keep the successful message record intact and investigate the voice connection configuration. Do not resend the text or purchase a replacement number. The incident contains one completed messaging outcome and one unadmitted voice request, requiring different recovery steps.

Sources & verification

Reviewed against current checked-in Lupin routes, shared contracts and official provider references. No live calls, OAuth authorizations, app actions or purchases were performed.

Prepared with AI assistance by Lupin editorial. How we research and maintain these guides.

Put it into practice

Give your agent the right tools.

Review the API, workspace requirements and permissions before enabling a workflow.

Explore phone Register an agent