Loading...
Loading...
Send and receive SMS/MMS, handle opt-outs and delivery webhooks. Use for notifications, 2FA, or messaging apps.
npx skill4agent add team-telnyx/skills telnyx-messaging-pythonpip install telnyximport os
from telnyx import Telnyx
client = Telnyx(
api_key=os.environ.get("TELNYX_API_KEY"), # This is the default and can be omitted
)clientimport telnyx
try:
response = client.messages.send(
to="+18445550001",
from_="+18005550101",
text="Hello from Telnyx!",
)
except telnyx.APIConnectionError:
print("Network error — check connectivity and retry")
except telnyx.RateLimitError:
import time
time.sleep(1) # Check Retry-After header for actual delay
except telnyx.APIStatusError as e:
print(f"API error {e.status_code}: {e.message}")
if e.status_code == 422:
print("Validation error — check required fields and formats")401403404422429+13125550001+for item in page_result:## Additional Operationsclient.messages.send()POST /messages| Parameter | Type | Required | Description |
|---|---|---|---|
| string (E.164) | Yes | Receiving address (+E.164 formatted phone number or short co... |
| string (E.164) | Yes | Sending address (+E.164 formatted phone number, alphanumeric... |
| string | Yes | Message body (i.e., content) as a non-empty string. |
| string (UUID) | No | Unique identifier for a messaging profile. |
| array[string] | No | A list of media URLs. |
| string (URL) | No | The URL where webhooks related to this message will be sent. |
| ... | +7 optional params in references/api-details.md |
response = client.messages.send(
to="+18445550001",
from_="+18005550101",
text="Hello from Telnyx!",
)
print(response.data)response.data.idresponse.data.toresponse.data.fromresponse.data.textresponse.data.sent_atresponse.data.errorsclient.messages.send_with_alphanumeric_sender()POST /messages/alphanumeric_sender_id| Parameter | Type | Required | Description |
|---|---|---|---|
| string (E.164) | Yes | A valid alphanumeric sender ID on the user's account. |
| string (E.164) | Yes | Receiving address (+E.164 formatted phone number or short co... |
| string | Yes | The message body. |
| string (UUID) | Yes | The messaging profile ID to use. |
| string (URL) | No | Callback URL for delivery status updates. |
| string (URL) | No | Failover callback URL for delivery status updates. |
| boolean | No | If true, use the messaging profile's webhook settings. |
response = client.messages.send_with_alphanumeric_sender(
from_="MyCompany",
messaging_profile_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
text="Hello from Telnyx!",
to="+13125550001",
)
print(response.data)response.data.idresponse.data.toresponse.data.fromresponse.data.textresponse.data.sent_atresponse.data.errorstelnyx-signature-ed25519telnyx-timestamp# In your webhook handler (e.g., Flask — use raw body, not parsed JSON):
@app.route("/webhooks", methods=["POST"])
def handle_webhook():
payload = request.get_data(as_text=True) # raw body as string
headers = dict(request.headers)
try:
event = client.webhooks.unwrap(payload, headers=headers)
except Exception as e:
print(f"Webhook verification failed: {e}")
return "Invalid signature", 400
# Signature valid — event is the parsed webhook payload
print(f"Received event: {event.data.event_type}")
return "OK", 200| Field | Type | Description |
|---|---|---|
| enum: message.sent, message.finalized | The type of event being delivered. |
| uuid | Identifies the type of resource. |
| array[object] | |
| string | Message body (i.e., content) as a non-empty string. |
| date-time | ISO 8601 formatted date indicating when the message was sent. |
| date-time | ISO 8601 formatted date indicating when the message was finalized. |
| object | null | |
| array[object] | These errors may point at addressees when referring to unsuccessful/unconfirm... |
| Field | Type | Description |
|---|---|---|
| enum: message.received | The type of event being delivered. |
| uuid | Identifies the type of resource. |
| enum: inbound | The direction of the message. |
| array[object] | |
| string | Message body (i.e., content) as a non-empty string. |
| enum: SMS, MMS | The type of message. |
| array[object] | |
| enum: event | Identifies the type of the resource. |
client.messages.send_group_mms()POST /messages/group_mms| Parameter | Type | Required | Description |
|---|---|---|---|
| string (E.164) | Yes | Phone number, in +E.164 format, used to send the message. |
| array[object] | Yes | A list of destinations. |
| array[string] | No | A list of media URLs. |
| string (URL) | No | The URL where webhooks related to this message will be sent. |
| string (URL) | No | The failover URL where webhooks related to this message will... |
| ... | +3 optional params in references/api-details.md |
response = client.messages.send_group_mms(
from_="+13125551234",
to=["+18655551234", "+14155551234"],
text="Hello from Telnyx!",
)
print(response.data)response.data.idresponse.data.toresponse.data.fromresponse.data.typeresponse.data.directionresponse.data.textclient.messages.send_long_code()POST /messages/long_code| Parameter | Type | Required | Description |
|---|---|---|---|
| string (E.164) | Yes | Phone number, in +E.164 format, used to send the message. |
| string (E.164) | Yes | Receiving address (+E.164 formatted phone number or short co... |
| array[string] | No | A list of media URLs. |
| string (URL) | No | The URL where webhooks related to this message will be sent. |
| string (URL) | No | The failover URL where webhooks related to this message will... |
| ... | +6 optional params in references/api-details.md |
response = client.messages.send_long_code(
from_="+18445550001",
to="+13125550002",
text="Hello from Telnyx!",
)
print(response.data)response.data.idresponse.data.toresponse.data.fromresponse.data.typeresponse.data.directionresponse.data.textclient.messages.send_number_pool()POST /messages/number_pool| Parameter | Type | Required | Description |
|---|---|---|---|
| string (UUID) | Yes | Unique identifier for a messaging profile. |
| string (E.164) | Yes | Receiving address (+E.164 formatted phone number or short co... |
| array[string] | No | A list of media URLs. |
| string (URL) | No | The URL where webhooks related to this message will be sent. |
| string (URL) | No | The failover URL where webhooks related to this message will... |
| ... | +6 optional params in references/api-details.md |
response = client.messages.send_number_pool(
messaging_profile_id="abc85f64-5717-4562-b3fc-2c9600000000",
to="+13125550002",
text="Hello from Telnyx!",
)
print(response.data)response.data.idresponse.data.toresponse.data.fromresponse.data.typeresponse.data.directionresponse.data.textclient.messages.send_short_code()POST /messages/short_code| Parameter | Type | Required | Description |
|---|---|---|---|
| string (E.164) | Yes | Phone number, in +E.164 format, used to send the message. |
| string (E.164) | Yes | Receiving address (+E.164 formatted phone number or short co... |
| array[string] | No | A list of media URLs. |
| string (URL) | No | The URL where webhooks related to this message will be sent. |
| string (URL) | No | The failover URL where webhooks related to this message will... |
| ... | +6 optional params in references/api-details.md |
response = client.messages.send_short_code(
from_="+18445550001",
to="+18445550001",
text="Hello from Telnyx!",
)
print(response.data)response.data.idresponse.data.toresponse.data.fromresponse.data.typeresponse.data.directionresponse.data.textclient.messages.schedule()POST /messages/schedule| Parameter | Type | Required | Description |
|---|---|---|---|
| string (E.164) | Yes | Receiving address (+E.164 formatted phone number or short co... |
| string (UUID) | No | Unique identifier for a messaging profile. |
| array[string] | No | A list of media URLs. |
| string (URL) | No | The URL where webhooks related to this message will be sent. |
| ... | +8 optional params in references/api-details.md |
response = client.messages.schedule(
to="+18445550001",
from_="+18005550101",
text="Appointment reminder",
send_at="2025-07-01T15:00:00Z",
)
print(response.data)response.data.idresponse.data.toresponse.data.fromresponse.data.typeresponse.data.directionresponse.data.textclient.messages.send_whatsapp()POST /messages/whatsapp| Parameter | Type | Required | Description |
|---|---|---|---|
| string (E.164) | Yes | Phone number in +E.164 format associated with Whatsapp accou... |
| string (E.164) | Yes | Phone number in +E.164 format |
| object | Yes | |
| enum (WHATSAPP) | No | Message type - must be set to "WHATSAPP" |
| string (URL) | No | The URL where webhooks related to this message will be sent. |
response = client.messages.send_whatsapp(
from_="+13125551234",
to="+13125551234",
whatsapp_message={},
)
print(response.data)response.data.idresponse.data.toresponse.data.fromresponse.data.typeresponse.data.directionresponse.data.body| Operation | SDK method | Endpoint | Use when | Required params |
|---|---|---|---|---|
| Retrieve a message | | | Fetch the current state before updating, deleting, or making control-flow decisions. | |
| Cancel a scheduled message | | | Remove, detach, or clean up an existing resource. | |
| List alphanumeric sender IDs | | | Inspect available resources or choose an existing resource before mutating it. | None |
| Create an alphanumeric sender ID | | | Create or provision an additional resource when the core tasks do not cover this flow. | |
| Retrieve an alphanumeric sender ID | | | Fetch the current state before updating, deleting, or making control-flow decisions. | |
| Delete an alphanumeric sender ID | | | Remove, detach, or clean up an existing resource. | |
| Retrieve group MMS messages | | | Fetch the current state before updating, deleting, or making control-flow decisions. | |
| List messaging hosted numbers | | | Inspect available resources or choose an existing resource before mutating it. | None |
| Retrieve a messaging hosted number | | | Fetch the current state before updating, deleting, or making control-flow decisions. | |
| Update a messaging hosted number | | | Modify an existing resource without recreating it. | |
| List opt-outs | | | Inspect available resources or choose an existing resource before mutating it. | None |
| List high-level messaging profile metrics | | | Inspect available resources or choose an existing resource before mutating it. | None |
| Regenerate messaging profile secret | | | Trigger a follow-up action in an existing workflow rather than creating a new top-level resource. | |
| List alphanumeric sender IDs for a messaging profile | | | Fetch the current state before updating, deleting, or making control-flow decisions. | |
| Get detailed messaging profile metrics | | | Fetch the current state before updating, deleting, or making control-flow decisions. | |
| List Auto-Response Settings | | | Fetch the current state before updating, deleting, or making control-flow decisions. | |
| Create auto-response setting | | | Create or provision an additional resource when the core tasks do not cover this flow. | |
| Get Auto-Response Setting | | | Fetch the current state before updating, deleting, or making control-flow decisions. | |
| Update Auto-Response Setting | | | Modify an existing resource without recreating it. | |
| Delete Auto-Response Setting | | | Remove, detach, or clean up an existing resource. | |
| Event | | Description |
|---|---|---|
| | Replaced Link Click |