PlatformXeDocs
Get API Key

Threads

Create and manage entity-scoped conversation threads with participants.

A thread is a conversation tied to a single business entity. Create a thread when the entity is created (e.g., booking confirmed), and the thread follows the entity's lifecycle.

Create a Thread

POST /api/v1/threads
{
  "channelSlug": "booking",
  "entityId": "BK-2026-00451",
  "subject": "Booking BK-2026-00451 — Ocean View Suite",
  "metadata": {
    "propertyId": "prop-001",
    "checkInDate": "2026-05-01"
  },
  "participants": [
    { "role": "GUEST", "externalId": "usr-abc", "displayName": "Ade Bakare" },
    { "role": "HOST", "externalId": "ptn-xyz", "displayName": "Bimpe Adeyemi" },
    { "role": "PLATFORM", "externalId": "system", "displayName": "Support" }
  ]
}

The entityId is your application's identifier for the entity. Combined with the channel, it forms a unique key -- one thread per entity per channel.

List Threads

GET /api/v1/threads?channelSlug=booking&status=OPEN

Filter by channelSlug, entityId, status, participantExternalId, or participantRole.

Get Thread Detail

GET /api/v1/threads/:id

Returns the thread with all participants and channel info.

Close a Thread

POST /api/v1/threads/:id/close
{ "reason": "CHECKED_OUT" }

Pass X-Participant-Role and X-Participant-External-Id headers to record who closed it.

Reopen a Thread

POST /api/v1/threads/:id/reopen

Entity Event (Lifecycle)

Forward entity status changes to trigger lifecycle rules:

POST /api/v1/threads/entity-event
{
  "channelSlug": "booking",
  "entityId": "BK-2026-00451",
  "event": "STATUS_CHANGED",
  "newStatus": "CHECKED_OUT"
}

If the channel's autoClose.onEntityStatus includes CHECKED_OUT, the thread closes automatically with a system message.

Participants

Add a participant

POST /api/v1/threads/:id/participants
{ "role": "AGENT", "externalId": "agt-001", "displayName": "Travel Agent" }

Remove a participant

DELETE /api/v1/threads/:id/participants/:participantId

Update a participant

PATCH /api/v1/threads/:id/participants/:participantId
{ "displayName": "Updated Name", "isMuted": true }