Early access — Phase 2
Messaging
The Messaging module lets you send structured outbound communications to guests across SMS, email, in-app, WhatsApp, and push channels. Messages are tracked per guest, with delivery status updates via webhooks.
The OutboundMessage object
idstringUnique message ID. Prefixed omsg_.property_idstringProperty that sent the message.guest_idstring | nullAssociated guest ID if provided.channelstringDelivery channel: sms, email, in_app, whatsapp, push.statusstringCurrent status: queued, sent, delivered, failed, read.recipientstringPhone number, email address, or device token.subjectstring | nullEmail subject line (email channel only).contentstringMessage body.scheduled_atdatetime | nullScheduled delivery time. null = immediate.sent_atdatetime | nullActual send timestamp.created_atdatetimeRecord creation timestamp.Endpoints
POST
/v1/messaging/sendSend an outbound messageSend an immediate or scheduled message to a guest. The channel determines which provider handles delivery.
Request Body
channelstringrequiredsms, email, in_app, whatsapp, or push.recipientstringrequiredPhone number (+13055551234), email, or device token.contentstringrequiredMessage body text. Max 10,000 characters.guest_idstringEscapeLife guest ID to associate this message with.subjectstringSubject line (email channel only).scheduled_atdatetimeUTC datetime to schedule delivery. Omit for immediate send.metadataobjectArbitrary key-value pairs for your own tracking.Send an SMS
curl -X POST https://api.escapelife.ai/v1/messaging/send \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"channel": "sms",
"recipient": "+13055551234",
"content": "Hi Jordan, your ocean view suite is ready. Early check-in is available from 1pm. Reply STOP to opt out.",
"guest_id": "gst_a1b2c3d4e5f6"
}'Send a scheduled pre-arrival email
curl -X POST https://api.escapelife.ai/v1/messaging/send \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"channel": "email",
"recipient": "jordan.mitchell@example.com",
"subject": "Your stay at Grand Sunset Resort starts tomorrow",
"content": "Hi Jordan, we are looking forward to welcoming you tomorrow. Your room is confirmed...",
"guest_id": "gst_a1b2c3d4e5f6",
"scheduled_at": "2026-03-19T09:00:00Z"
}'Response
{
"id": "omsg_z9y8x7w6",
"property_id": "pty_xyz123",
"guest_id": "gst_a1b2c3d4e5f6",
"channel": "sms",
"status": "sent",
"recipient": "+13055551234",
"subject": null,
"content": "Hi Jordan, your ocean view suite is ready...",
"scheduled_at": null,
"sent_at": "2026-03-15T10:00:01Z",
"created_at": "2026-03-15T10:00:00Z"
}GET
/v1/messagingList messagesReturn all outbound messages for this property. Filter by guest or channel.
Path / Query Parameters
guest_idstringFilter by guest ID.channelstringFilter by channel: sms, email, in_app, whatsapp, push.limitintegerMax results. Default 50, max 200.offsetintegerPagination offset.GET
/v1/messaging/{message_id}Get a messagePath / Query Parameters
message_idstringrequiredMessage ID (omsg_...).Channels
smsE.164 phone number140 char soft limit. Multipart supported.emailEmail addressRequires subject. Supports HTML content.in_appGuest IDDelivered to the guest's active session in-app.whatsappE.164 phone numberRequires WhatsApp Business account. Template messages required for first contact.pushDevice tokenAPNs / FCM push notification.Webhooks fired by this module
message.sentMessage was accepted by the delivery provider.
message.deliveredDelivery confirmed by the channel provider.
message.failedDelivery failed. Check the metadata.error field for reason.
message.readGuest opened or read the message (email/in_app).