Skip to main content
🤖 LLM Friendly: This page is available in raw Markdown format for LLM consumption:messages.md|Get full documentation:llms.txt/llms-full.txt

Messages (SMS/MMS)

Send outbound SMS and MMS messages, retrieve message logs, and inspect delivery statuses using your workspace phone numbers.

Firetell handles carrier dispatch, delivery receipts (DLR), and real-time event updates via Webhooks and Server-Sent Events (SSE).


Endpoints​

MethodEndpointDescription
POST/messages/sendSend an outbound SMS or MMS message
GET/messagesList message history with filters and pagination
GET/messages/:idRetrieve detailed information for a single message

The Message Object​

FieldTypeDescription
idstringUnique message identifier prefixed with msg_ (e.g. msg_05f18045cba1452204774f)
workspace_idstringWorkspace identifier (e.g. yourcompany)
phone_number_idstringIdentifier of the workspace phone number used (pn_...)
fromstringSender phone number in E.164 format (e.g. +13074295456)
tostringRecipient phone number in E.164 format (e.g. +18647123123)
bodystringText content of the message (up to 1,600 characters)
directionstringDirection of the message: outbound or inbound
statusstringCurrent delivery status (see Message Statuses)
costnumberTotal cost charged in USD including platform markup (or null if inbound or pending)
media_urlsstring[]Array of media attachment URLs for MMS messages
error_codestringError code returned by carrier if sending/delivery failed (e.g. 40001, or null)
error_messagestringHuman-readable error message explaining failure reason (or null)
created_atstringISO 8601 creation timestamp
updated_atstringISO 8601 last update timestamp

Message Statuses​

StatusDirectionDescription
queuedoutboundMessage has been accepted by Firetell and queued for carrier delivery.
sendingoutboundMessage is currently being processed by the carrier adapter.
sentoutboundCarrier has accepted and dispatched the message to the destination network.
deliveredoutboundDelivery Receipt (DLR) received confirming delivery to the recipient's handset.
failedoutboundMessage could not be sent or delivered (see error_code and error_message).
undeliveredoutboundCarrier could not confirm delivery within the standard timeout window.
receivedinboundIncoming SMS/MMS received on your workspace phone number.

Send Message​

POST /messages/send

Queue an outbound SMS or MMS message for delivery.

Authentication​

Requires ApiKey with owner or editor role.

Request Headers​

HeaderTypeDescription
AuthorizationstringApiKey sk-YOUR_API_KEY
Content-Typestringapplication/json

Request Body​

FieldTypeRequiredDescription
fromstringYesSender phone number in E.164 format. Must belong to the workspace and have sms capability.
tostringYesDestination phone number in E.164 format.
bodystringYesText content of the message (maximum 1,600 characters).
media_urlsstring[]NoArray of publicly accessible media URLs (JPEG, PNG, GIF, audio) to send as an MMS message.

Requirements & Validations​

  1. Phone Number Capability: The sender number specified in from must belong to your workspace and have sms listed in its capabilities.
  2. Account Credit Balance: Your workspace must maintain an available credit balance of at least $0.01 to initiate outbound SMS sends.
  3. Format: Phone numbers must adhere to the standard international E.164 format (e.g. +13074295456).

Rate Limiting​

The POST /messages/send endpoint operates on a dedicated SMS rate limit tier:

TierWindowLimitScope
sms60 seconds (1 min)30 req/minPer API Key (ApiKey) or agent/user account

This dedicated quota prevents outbound SMS sending from exhausting your workspace's general REST API rate limit (100 req/min).

note

Need higher limits?

Enterprise customers can request custom rate limits. Contact us at enterprise@firetell.com with your workspace ID and use case.

Example Request​

curl -X POST "https://{workspace_id}.firetell.app/api/v1/messages/send" \
-H "Authorization: ApiKey sk-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "+13074295456",
"to": "+18647123123",
"body": "Your appointment is confirmed for tomorrow at 10:00 AM."
}'

Example Request with MMS Media​

curl -X POST "https://{workspace_id}.firetell.app/api/v1/messages/send" \
-H "Authorization: ApiKey sk-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "+13074295456",
"to": "+18647123123",
"body": "Here is your digital receipt.",
"media_urls": [
"https://storage.yourcompany.com/receipts/inv_9981.png"
]
}'

Response (201 Created)​

{
"id": "msg_05f18045cba1452204774f",
"workspace_id": "yourcompany",
"phone_number_id": "pn_e71c8caddbe5603f1d0522",
"from": "+13074295456",
"to": "+18647123123",
"body": "Your appointment is confirmed for tomorrow at 10:00 AM.",
"direction": "outbound",
"status": "queued",
"media_urls": [],
"cost": null,
"error_code": null,
"error_message": null,
"created_at": "2026-09-26T00:00:00.000Z",
"updated_at": "2026-09-26T00:00:00.000Z"
}
tip

Delivery Tracking

When you submit a message, it is returned immediately with status: "queued". You do not need to poll for updates — register a Webhook for message.sent and message.delivered to receive real-time carrier delivery confirmations.


List Messages​

GET /messages

Retrieve a paginated history of all inbound and outbound messages with rich search and filtering options.

Authentication​

Requires ApiKey with any scope.

Query Parameters​

ParameterTypeDefaultDescription
pagenumber1Page number (minimum: 1).
limitnumber20Number of records per page (maximum: 100).
searchstring—Case-insensitive search matching sender (from), recipient (to), or text content (body).
directionstring—Filter by direction: outbound or inbound.
statusstring—Filter by status: queued, sending, sent, delivered, failed, undelivered, or received.
phone_number_idstring—Filter messages associated with a specific workspace phone number ID (pn_...).
fromstring—Filter messages created on or after this ISO 8601 date (e.g. 2026-09-01T00:00:00Z).
to_datestring—Filter messages created on or before this ISO 8601 date (e.g. 2026-09-30T23:59:59Z).
sort_fieldstringcreated_atSort field. Allowed values: created_at, updated_at, status.
sort_orderstringdescSort order: asc (oldest first) or desc (newest first).

Example Request​

Filter for all delivered outbound messages sent in September 2026:

curl -X GET "https://{workspace_id}.firetell.app/api/v1/messages?direction=outbound&status=delivered&from=2026-09-01T00:00:00Z&page=1&limit=20" \
-H "Authorization: ApiKey sk-YOUR_API_KEY"

Search Example​

Search messages containing a specific customer phone number or keyword:

curl -X GET "https://{workspace_id}.firetell.app/api/v1/messages?search=appointment&limit=10" \
-H "Authorization: ApiKey sk-YOUR_API_KEY"

Response (200 OK)​

{
"data": [
{
"id": "msg_05f18045cba1452204774f",
"workspace_id": "yourcompany",
"phone_number_id": "pn_e71c8caddbe5603f1d0522",
"from": "+13074295456",
"to": "+18647123123",
"body": "Your appointment is confirmed for tomorrow at 10:00 AM.",
"direction": "outbound",
"status": "delivered",
"cost": 0.0048,
"media_urls": [],
"error_code": null,
"error_message": null,
"created_at": "2026-09-26T00:00:00.000Z",
"updated_at": "2026-09-26T00:00:05.000Z"
},
{
"id": "msg_be52701819fa34a72ae414",
"workspace_id": "yourcompany",
"phone_number_id": "pn_99bf875464f1c096f46aff",
"from": "+18647123123",
"to": "+13074295456",
"body": "Thank you! Can I reschedule for 11:00 AM instead?",
"direction": "inbound",
"status": "received",
"cost": null,
"media_urls": [],
"error_code": null,
"error_message": null,
"created_at": "2026-09-26T00:01:10.000Z",
"updated_at": "2026-09-26T00:01:10.000Z"
}
],
"meta": {
"total": 2,
"page": 1,
"limit": 20,
"total_pages": 1
}
}

Get Message​

GET /messages/:id

Retrieve details and delivery status for a specific message by its unique ID.

Authentication​

Requires ApiKey with any scope.

Path Parameters​

ParameterTypeRequiredDescription
idstringYesMessage identifier (e.g. msg_05f18045cba1452204774f).

Example Request​

curl -X GET "https://{workspace_id}.firetell.app/api/v1/messages/msg_05f18045cba1452204774f" \
-H "Authorization: ApiKey sk-YOUR_API_KEY"

Response (200 OK)​

{
"id": "msg_05f18045cba1452204774f",
"workspace_id": "yourcompany",
"phone_number_id": "pn_e71c8caddbe5603f1d0522",
"from": "+13074295456",
"to": "+18647123123",
"body": "Your appointment is confirmed for tomorrow at 10:00 AM.",
"direction": "outbound",
"status": "delivered",
"cost": 0.0048,
"media_urls": [],
"error_code": null,
"error_message": null,
"created_at": "2026-09-26T00:00:00.000Z",
"updated_at": "2026-09-26T00:00:05.000Z"
}

Error Responses​

404 Not Found​

Returned when the message ID does not exist in the requested workspace:

{
"statusCode": 404,
"message": "Message msg_invalid_id not found",
"error": "Not Found"
}

Webhook Notifications​

Configure your system to receive real-time HTTP callbacks whenever messaging events occur. See the Webhook Event Catalog for sample event payloads:

EventTrigger
message.receivedAn inbound SMS/MMS is received on your workspace phone number.
message.sentAn outbound message was accepted and sent to the carrier network.
message.deliveredA delivery receipt (DLR) confirmed successful delivery to the recipient.
message.failedAn outbound message failed to send or deliver (includes carrier error codes).
message.undeliveredDelivery could not be confirmed by the carrier within the receipt window.