/numbers/{phone_number_id}/texts/...
Path parameters
Send text
SendIdempotency-Key with Prefer: idempotency-replay to protect retries. Repeating the same
key and input returns the original response, not a second text. SDKs generate a
key for each send call; use an explicit key across separate calls. A queued message
is accepted for delivery; request retries do not guarantee delivery retries. Use message reads or
webhooks for current delivery status. See message send retries.
to as a string for 1:1 SMS/MMS, as a list of 1-8 E.164 numbers for a conversation send, or pass conversation_id to reply into an existing conversation. Lists with 2 or more resolved recipients are sent as beta group MMS.
Beta: Group MMS and conversation sends are beta. Some carriers may reject group chats or MMS from 10DLC numbers even when the sender is ready and recipients have opted in.
The legacy 1:1 request shape still works unchanged:
JSON
JSON
conversation_id instead of to. The server resolves the conversation to its participants and applies the same 1:1 or group routing based on recipient count.
Companion group replies require this canonical conversation_id; raw recipients cannot borrow sponsorship. MMS chats with the same participants and local number share a conversation identity. Readable Companion history does not imply send consent. Inspect reply readiness, preserve every participant, and handle the existing opt-in, opt-out, and sender-readiness errors.
JSON
Preconditions
- Sender warm-up. A newly provisioned local number can take around 10-15 minutes for its 10DLC campaign to register downstream. While
sms_statusis"pending", sends return409 sender_sms_pending. - Recipient opt-in (US). Recipients in the US and US territories (Puerto Rico, US Virgin Islands, Guam, American Samoa, and Northern Mariana Islands) must opt in before you can text them. Sending to one of these recipients without an opt-in returns
403 recipient_not_opted_in. Recipients in other countries, including Canada and other non-US+1countries such as the Bahamas and Jamaica, don’t need a prior opt-in. You’re responsible for having consent to text Canadian recipients under Canada’s Anti-Spam Legislation (CASL). Inkbox treats a number it can’t map to a country as US and requires an opt-in. - Recipient opt-out. A recipient who sent
STOPcan’t be texted from any country. Sending to them returns403 recipient_opted_out. - Contact rules. Rules configured on the sending number still apply. Multi-recipient sends are all-or-nothing: one blocked or non-opted-in recipient rejects the request.
- Group destination region. Group MMS recipients must be US or Canadian E.164 numbers.
- Beta carrier behavior. Group MMS and MMS over 10DLC are still carrier-dependent; some carriers may reject group chats or MMS from 10DLC numbers.
Rate limits
A phone number on Inkbox’s default 10DLC campaign can send to at most 100 recipients per rolling 24-hour window. A 3-recipient group message counts as 3 recipient sends. Registering your own brand and campaign lifts this cap to the carrier-assigned tier; see 10DLC registration. When the cap is reached,429 responses include:
Request body
Response (201)
1:1 responses keep the legacy fields populated and add conversation-aware fields:JSON
remote_phone_number and legacy timestamp/error fields are null; use conversation_id, the message-level delivery_status rollup, and recipients[].
JSON
remote_phone_number is null (no single remote party), top-level delivery_status is the message-level rollup, legacy timestamp/error fields stay null, and recipients carries one entry per addressee:
JSON
text.* webhooks. For group sends, lifecycle events fire once per recipient with data.recipient_phone_number identifying the leg.
Error responses
List texts
Query parameters
Identity-scoped API keys never see contact-rule-blocked texts, regardless of
is_blocked. Admin API keys and human sessions see blocked and non-blocked texts by default; use is_blocked=true for an admin-side blocked listing.
start_datetime, end_datetime, and tz filter on created_at. Both bounds are optional and non-breaking — omit them for unchanged behavior. See Filtering by date.
Response (200)
JSON
Error responses
Get text
Path parameters
Response (200)
Returns aTextMessage object.
MMS messages have type: "mms" and a media array. Each media item includes a content_type, size in bytes, and a URL. URLs returned for stored inbound MMS media are presigned and expire after 1 hour.
Error responses
Update text
Path parameters
Request body
Request example
JSON
Response (200)
Returns the updatedTextMessage object.
Error responses
Search texts
Query parameters
Identity-scoped API keys never see contact-rule-blocked texts in search results. Admin API keys and human sessions see everything by default; pass
is_blocked=false to exclude blocked spam from search results or is_blocked=true to search only blocked rows.
Response (200)
Returns alist[TextMessage] matching the query.
Error responses
List conversations
include_groups=true to include group conversations.
Query parameters
With
is_blocked=false, latest previews, ordering, unread counts, and totals are computed from non-blocked rows only, so blocked-only conversations drop out. Identity-scoped API keys never see blocked rows in conversation summaries.
start_datetime, end_datetime, and tz filter on the conversation’s created_at — when the conversation was created, not its latest-message time. This list is ordered by most recent message, but the date filter is on creation time. Previews, unread counts, totals, and ordering still describe the full conversation — they are not sliced to the window. Both bounds are optional and non-breaking — omit them for unchanged behavior. See Filtering by date.
Response (200)
Each row carries the conversation’sid, the participant list, and an is_group flag. For 1:1 rows, remote_phone_number is the single participant; for group rows it’s null (the participant set is the source of truth). latest_has_media is the reliable signal that the latest message carried media — derived from the message’s media column, since carriers tag many text-only messages as MMS at the wire.
JSON
Error responses
Get conversation
{key} accepts the conversation UUID for any conversation. For 1:1 threads, the key can also be the remote phone number, short code, or sender ID.
Group conversations must be addressed by UUID. Use the id from the conversation summary or conversation_id from any message in the group.
Path parameters
Query parameters
Identity-scoped API keys see only non-blocked rows in the thread. Admin API keys and human sessions see blocked and non-blocked rows merged inline, with each row tagged by
is_blocked.
Response (200)
Returns alist[TextMessage] for the conversation.
Error responses
Update conversation
Path parameters
Request body
Request example
JSON
Response (200)
JSON
remote_phone_number is populated for legacy callers. For group conversations, it is null and conversation_id is the stable key. updated_count: 0 means no messages needed updating.
Error responses
Text message object
Recipient object
recipients[] is only present on outbound text messages.

