Documentation | Guava
SMS Messaging
The guava.Client can send SMS messages from your Guava numbers and wait for inbound replies. This is useful for sending confirmations and reminders, or for collecting a response between calls.
SMS messaging is available in the Python and TypeScript SDKs. For other languages, call the equivalent Messages REST API directly.
Example Code
Python Code
import guava
import os
client = guava.Client(api_key=os.environ["GUAVA_API_KEY"])
agent_number = os.environ["GUAVA_AGENT_NUMBER"] # one of your Guava numbers
customer = "+15551234567"
# Send an SMS from your Guava number to the customer.
client.send_sms(
from_number=agent_number,
to_number=customer,
message="Hi! Reply YES to confirm your appointment, or STOP to opt out.",
)
# Block until the customer replies, giving up after 5 minutes.
reply = client.next_sms(from_number=customer, to_number=agent_number, timeout=300)
if reply is None:
print("No reply within 5 minutes.")
else:
print("Customer replied:", reply["content"])
send_sms / sendSms
Send a single SMS message. The from_number must be one of your Guava numbers with SMS configured, and the message is delivered to to_number.
Signature
client.send_sms(
from_number: str,
to_number: str,
message: str,
) -> None
| Parameter | Type | Default | Description |
|---|---|---|---|
| from_number | str | — | One of your Guava numbers, in E.164 format (e.g. "+15551230001"). Must have SMS enabled. |
| to_number | str | — | The recipient's number, in E.164 format. |
| message | str | — | The message body to send. |
Returns nothing (Python None; TypeScript resolves void). Raises (Python) / rejects (TypeScript) if the from_number isn't owned by your organization or doesn't have SMS configured.
Sending SMS requires your organization to complete SMS brand and campaign registration. See Outbound & SMS Permissions.
next_sms / nextSms
Wait for the next inbound SMS sent to one of your Guava numbers from a given number, and return it. next_sms polls your inbox and only returns messages received after the call begins, so a reply to an earlier message won't be returned twice.
Signature
client.next_sms(
from_number: str,
to_number: str,
*,
timeout: float = 60.0,
poll_interval: float = 2.0,
) -> dict | None
| Parameter | Type | Default | Description |
|---|---|---|---|
| from_number | str | — | The external number you're waiting to hear from, in E.164 format. |
| to_number | str | — | Your Guava number that will receive the reply, in E.164 format. |
| timeout | float | 60.0 | Maximum seconds to wait before giving up. |
| poll_interval | float | 2.0 | Seconds to wait between inbox checks. |
Returns the message (Python dict / TypeScript SmsMessage), or None / null if the timeout elapses with no new message. A message has the following fields:
| Parameter | Type | Default | Description |
|---|---|---|---|
| id | str | — | Unique ID of the message. |
| from_number | str | — | The number that sent the message. |
| to_number | str | — | Your Guava number that received the message. |
| content | str | — | The message body. |
| received_at | str | — | When the message was received, in ISO 8601 format. |
| modality | str | — | The channel the message arrived on. Currently always "sms". |
| direction | str | — | Always "inbound" for received messages. |