Skip to content

Read Guest message

GET
/v1/object-types/hospitality.guest_message/objects/{id}
curl --request GET \
--url https://api.aerandil.com/v1/object-types/hospitality.guest_message/objects/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \
--header 'Authorization: Bearer <token>'

Read an existing instance.

Typed shadow of a single inbound or outbound message. The full payload lives in the external messaging system (Twilio, WhatsApp Business, Mews Conversations, HiJiffy / Canary inbox, OTA Messaging API, voice-IVR transcript store); Aerandil holds the audit-grade decision-time fields plus an optional external_record_reference pointer to the full content. PCI-DSS 4.0 hard-validator-enforced: no Luhn-matching digit sequence may appear in redacted_excerpt. The content_hash is the tamper-evidence anchor.

id
required
string format: uuid

Object id (UUID v7, server-generated at create time).

branch
string format: uuid

Read through an open branch’s copy-on-first-write overlay view instead of the canonical (main) plane. Does not compose with as_of (422). The branch must exist under the caller’s tenant.

Object found.

Media typeapplication/json
object
created_at
required
string format: date-time
id
required
string format: uuid
object_type
required
Allowed value: hospitality.guest_message
properties
required
object
author_kind
Who composed the message (guest / staff_human / staff_agent / system)
string
Allowed values: guest staff_human staff_agent system
author_principal
`principal.stable_id()` of the author when not the guest
string
channel
required
Communication channel
string
Allowed values: sms whatsapp email web_chat app_chat voice_ivr ota_inbox social_dm in_room_device other
channel_thread_id
External system thread identifier (Booking.com conversation_id, Twilio MessageSid, WhatsApp wamid, etc.)
string
content_hash
SHA-256 of the original message bytes (tamper-evidence)
string
conversation_ref
required
The conversation container
string format: uuid
delivery_address
The phone number or email address the message goes to, resolved when it was recorded
string
delivery_attempted_at
When the adapter last tried to send it
string format: date-time
delivery_attempts
How many times the adapter has tried to send it
integer
delivery_error
Why the last send failed, in words the desk can act on
string
delivery_state
Where the kernel's own send stands: queued, sending (claimed by the worker), sent, or failed
string
Allowed values: queued sending sent failed
detected_language
BCP-47 — may differ from `conversation.language` (mid-thread switches)
string
direction
required
Inbound (from guest) or outbound (to guest)
string
Allowed values: inbound outbound
id
required
Message id
string
ingress_principal
`principal.stable_id()` of the service or human that recorded the message
string
purpose
Why the house wrote: a reply, a service message, marketing, or a waitlist offer
string
Allowed values: reply service marketing waitlist_offer payment_request card_refused
received_at
required
When the message arrived (inbound) or was sent (outbound)
string format: date-time
redacted_excerpt
PII-stripped excerpt for the audit trail (default cap 280 chars)
string
redactions_applied
required
Per-message redaction kinds
Array<string>
Allowed values: pan cvv government_id health_disclosure child_safeguarding other_pii
template_id
WhatsApp Business template id (required outside the 24-hour service window)
string
vendor_message_id
The delivery vendor's id for the send (Twilio MessageSid, SMTP Message-ID)
string
waitlist_entry_ref
The waitlist entry whose offer this message carries; its claim token is minted when the message is sent
string format: uuid
word_count
Optional word count (triage-cost analytics)
integer
provenance

Per-property source attribution and pins. An entry under properties means the property’s current value came from that source (on the source’s own clock, source_updated_at); an entry under pins is a human override protecting the property from sourced writes.

object
pins
object
key
additional properties
object
pinned_at
string format: date-time
pinned_by
object
reason
required
string
properties
object
key
additional properties
object
external_id
string
recorded_at
required
string format: date-time
source
required
string
source_updated_at
string format: date-time
stream
string
scope
required
One of: discriminator: level
object
level
required
string
Allowed value: tenant
Allowed values: tenant
tenant_id
required
string format: uuid
updated_at
required
string format: date-time
version
required
integer
>= 1
Example
{
"object_type": "hospitality.guest_message",
"properties": {
"author_kind": "guest",
"channel": "sms",
"delivery_state": "queued",
"direction": "inbound",
"purpose": "reply",
"redactions_applied": [
"pan"
]
},
"scope": {
"level": "tenant"
}
}
ETag
string
/^"\d+"$/

Quoted strong validator (RFC 7232 §2.3) carrying the object’s monotonic version. Informational on the read path — object mutation goes through typed actions on /v1/actions/{action}/apply, not raw CRUD.

No object with that id (or soft-deleted).