Skip to main content
The concierge lets a member hold a conversation - a support thread, a booking chat, a notification feed. You list a member’s conversations, read message history, and send new messages, all from the app with the member token.
Conversations are member-mode: every call here uses the short-lived member token your backend mints, not the Org-API-Key. See Authentication for the two-token model and refresh contract.
For live incoming messages, do not poll. Each SDK exposes a streaming subscription over Server-Sent Events that delivers new messages as they arrive.

Stream live messages

Subscribe to new concierge messages over SSE, consumed as an AsyncIterable, AsyncStream, or Flow. The right way to receive incoming messages.

The flow

List the member’s conversations, read a thread’s history, then send a reply:

Operations

List conversations

GET /v1/conversations returns the member’s conversations.
string
Names the member when a machine token calls on their behalf.
The response is a ListConversationsResponse:
Conversation[]
required
The member’s conversations.

List messages

GET /v1/conversations/{id}/messages returns one page of a conversation’s messages with cursor pagination.
string
required
The conversation id.
integer
Page size. Defaults to the server’s default if omitted.
string
The nextCursor from the previous page. Omit for the first page.
string
Names the member when a machine token calls on their behalf.
The response is a ListMessagesResponse:
Message[]
required
The page of messages.
string | null
required
Pass this back as cursor to fetch the next page. null marks the end of the history.

Send a message

POST /v1/conversations/{id}/messages posts a message to the conversation.
string
required
The conversation id.
string
required
The message text to send.
The response is a SendMessageResponse:
boolean
required
true when the message was accepted.
Idempotency on sendMessage is supported via the Idempotency-Key header
  • a retried send replays rather than double-posting. The API reference omits the header on the {id} route because of an emitter limitation, not because it is unsupported, so set the header yourself when retrying. The SDKs send one automatically on every write. See Retries and idempotency.

Schemas

Conversation

Message

Messages paginate by cursor, newest history reachable page by page. To follow a thread live instead of re-fetching, print the recent backlog with listMessages, then stream everything that follows.

Testing in the sandbox

In the sandbox, the concierge is fully self-contained: a message you send is never forwarded to our Ops team, and a sandbox concierge bot replies automatically. The bot’s reply streams back to you over GET /v1/conversations/{id}/stream exactly like a real concierge message, so you can build and test the whole send -> stream -> reply loop end to end without paging a human. In LIVE, messages reach a real concierge as usual.

Streaming messages

Receive live incoming messages over SSE.

Errors

The error taxonomy and stable codes for failed calls.