Skip to content

Conversation

A Conversation is a Thread with one or more Contacts that a Worker must answer, such as a support request.

Properties

PropertyTypeRequiredDescription
answeredAtdatetimeWhen a Worker last answered.
firstAnsweredAtdatetimeWhen a Worker first answered; set once, never overwritten. answeredAt keeps the last answer.
respondBydatetimeWhen the first answer is due: Setting support.firstResponseWithin per Offer, default 4 business hours.
statusstringOpen, waiting on the Customer, or resolved; computed from its answers, closes and reopens.
resolvedAtdatetimeWhen it was resolved; empty again when the resolution reverses.
resolutionstringHow it was resolved: the Customer said so, or 72 hours passed after an answer with no reply.
Inherited from Thread: 1 property
PropertyTypeRequiredDescription
subjectstringWhat the Thread is about.

Object

JSON
{
  "$id": "https://api.sb/shiftnote.app/conversations/conversation_1",
  "$type": "Conversation",
  "subject": "Example subject",
  "answeredAt": "2026-10-22T12:00:00Z",
  "firstAnsweredAt": "2026-10-22T12:00:00Z",
  "respondBy": "2026-10-22T12:00:00Z",
  "status": "open",
  "resolvedAt": "2026-10-22T12:00:00Z",
  "resolution": "confirmed"
}

Relationships

  • A Conversation awaits one Worker: one Worker owes each Conversation its next answer. awaits, inverse conversations.
  • A Conversation has one Customer: the Customer a Conversation serves, so every answer reads that Customer’s records. customer, inverse opens.
  • A Conversation raises many Threads: the intake Threads a support Conversation opens, each deadline counted from the Conversation’s first Message. raises, inverse raisedIn.
  • A Conversation reports one Issue: the Issue or Incident a Conversation reports; resolving it answers every linked Conversation. reports, inverse conversations.

Lifecycle

Conversation lifecycle: open, waiting, resolvedopen → waiting: on Conversation.answeredopen → waiting: on Action.askedopen → resolved: on Conversation.closedwaiting → open: on Message.createdwaiting → resolved: on Conversation.closedresolved → open: on Conversation.reopenedopenwaitingresolved
StateMeaningMoves to
open (first)A Contact wrote, and a Worker owes the answer by respondBy.waiting on Conversation.answered; waiting on Action.asked when the Question goes to this Conversation’s Contact; resolved on Conversation.closed
waitingA Worker answered, and the Customer owes the reply.open on Message.created when a Contact’s Message arrives in this Conversation; resolved on Conversation.closed
resolvedResolved, confirmed by the Customer or assumed after 72 hours with no reply.open on Conversation.reopened

Verbs

  1. createCreates a Conversation.
    POST /{namespace}/conversationsdoConversation.created
  2. getReturns one Conversation by id.
    GET /{namespace}/conversations/{id}readNo Event
  3. listReturns Conversations, newest first, one page at a time.
    GET /{namespace}/conversationsreadNo Event
  4. updateChanges the given properties of a Conversation.
    PATCH /{namespace}/conversations/{id}doConversation.updated
  5. deleteDeletes a Conversation; its history is kept.
    DELETE /{namespace}/conversations/{id}doConversation.deleted
  6. answerAnswer replies in a Conversation through the Channel it arrived on and closes the reply Task it opened.
    POST /{namespace}/conversations/{conversation}/answerdoConversation.answered
  7. assignAssign routes a Conversation to the Worker holding the right Role, by topic, Customer tier and language.
    POST /{namespace}/conversations/{conversation}/assigndoConversation.assigned
  8. closeClose marks a Conversation resolved, confirmed by the Customer or assumed after 72 hours with no reply.
    POST /{namespace}/conversations/{conversation}/closedoConversation.closed
  9. escalateEscalate hands a Conversation and its summary to the Worker in the Role above, a Human only where one holds it.
    POST /{namespace}/conversations/{conversation}/escalatedoConversation.escalated
  10. reopenReopen reverses a Conversation’s resolution when a reversal signal arrives within 7 days, and grades the resolution a failure.
    POST /{namespace}/conversations/{conversation}/reopendoConversation.reopened

Permissions

Which Access level may call each Verb. One-way Verbs wait their delay window.

Operationowneradminmemberviewer
Conversation.createYesYesYesNo
Conversation.getYesYesYesYes
Conversation.listYesYesYesYes
Conversation.updateYesYesYesNo
Conversation.deleteYesYesYesNo
Conversation.answerYesYesYesNo
Conversation.assignYesYesYesNo
Conversation.closeYesYesYesNo
Conversation.escalateYesYesYesNo
Conversation.reopenYesYesYesNo

Call it

Text
Answer the latest conversation.

Example

A Customer emails "my API key stopped working." The Conversation stays open until the support Agent answers and the Customer confirms the fix.