EscapeLifeDocs
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 message

Send 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 messages

Return 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 message

Path / 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.sent

Message was accepted by the delivery provider.

message.delivered

Delivery confirmed by the channel provider.

message.failed

Delivery failed. Check the metadata.error field for reason.

message.read

Guest opened or read the message (email/in_app).