Transcript API
Pull-based API reference for ConvaiTranscripts — query, filter, and subscribe to the live in-memory transcript timeline from C# scripts.
ConvaiTranscripts gives you pull-based, snapshot access to the room's full transcript timeline. Unlike event relay components, which push individual updates as they arrive, the ConvaiTranscripts facade maintains a live in-memory timeline that you query on demand. This makes it the right tool for transcript history replay, custom chat UI construction, post-session export, and any feature that needs to read multiple turns at once. Access the facade via ConvaiManager.ActiveManager.Transcripts.
Push vs. pull
Event Relays / ConvaiEvents
ConvaiTranscripts
Delivery
Push — your callback is invoked per update
Pull — you read the timeline whenever you need it
History
Only the most recent update per callback
Full history: active turns + committed turns
Use cases
Subtitle rendering, real-time animation triggers
Post-session export, custom chat logs, assessment review
Access
ConvaiSessionEventRelay, ConvaiEvents
ConvaiManager.ActiveManager.Transcripts
ConvaiTranscripts facade
ConvaiTranscripts facadeProperties
CurrentTimeline
TranscriptTimelineSnapshot
Snapshot of the entire transcript timeline at the moment of access
Methods
GetTurns(TranscriptQuery?)
IReadOnlyList<TranscriptTurnSnapshot>
Returns all turns matching the optional query. Pass null for all turns.
GetTurn(string turnId)
TranscriptTurnSnapshot
Retrieves a specific turn by its ID. Returns null if not found.
GetLatestTurn(TranscriptParticipantRef)
TranscriptTurnSnapshot
Returns the most recent turn for the given participant. Returns null if none.
Dispose()
void
Unsubscribes from internal change events. Call when your component is destroyed if you subscribed to Changed.
Events
Changed
TranscriptUpdateBatch
The timeline changes — a turn is added, updated, completed, interrupted, or removed
TranscriptQuery — filtering turns
TranscriptQuery — filtering turnsParticipantKind
TranscriptParticipantKind?
null (all)
Filter to Player or Character turns only
PlayerOrCharacterId
string
null (all)
Filter to a specific player or character ID
ParticipantId
string
null (all)
Filter to a specific room participant ID
IncludeActiveTurns
bool
true
Include turns that are still streaming
IncludeCommittedTurns
bool
true
Include turns that have been finalized and committed
TranscriptTurnSnapshot
TranscriptTurnSnapshotTurnId
string
Unique identifier for this turn (same as MessageId)
MessageId
string
Alias for TurnId
RoomSequence
long
Monotonically increasing sequence number within the room
Participant
TranscriptParticipantRef
Who produced this turn
StartedAtUtc
DateTime
UTC time the turn began
LastUpdatedAtUtc
DateTime
UTC time of the most recent update
CompletedAtUtc
DateTime?
UTC time the turn was committed; null while active
Lifecycle
TranscriptLifecycle
Current lifecycle stage of this turn
CommittedText
string
Finalized text that will not change
InterimText
string
In-progress text from the current streaming segment
DisplayText
string
CommittedText + InterimText — use this for live display
WasInterrupted
bool
True when the turn ended due to interruption
HasText
bool
True when DisplayText is non-empty
Segments
IReadOnlyList<TranscriptSegmentSnapshot>
Individual transcript segments within this turn
ConversationTargetCharacterId
string
Character this player turn was directed at, if known
Use DisplayText for real-time subtitle or chat rendering. It combines CommittedText and InterimText so you always show the most complete text available, regardless of lifecycle stage.
TranscriptLifecycle enum
TranscriptLifecycle enumStreaming (0)
Turn is actively receiving text; InterimText is updating
Stable (1)
Streaming has paused; text is stable but turn is not yet committed
Completed (2)
Turn is fully committed; CommittedText is final and InterimText is empty
TranscriptTimelineSnapshot
TranscriptTimelineSnapshotCursor
long
Monotonically increasing value; changes with every update to the timeline
ActiveTurns
IReadOnlyList<TranscriptTurnSnapshot>
Turns currently streaming or stable — not yet committed
CommittedTurns
IReadOnlyList<TranscriptTurnSnapshot>
Turns that are fully finalized
TurnsById
IReadOnlyDictionary<string, TranscriptTurnSnapshot>
All turns indexed by TurnId for O(1) lookup
LatestTurnByParticipant
IReadOnlyDictionary<string, TranscriptTurnSnapshot>
Most recent turn per participant, indexed by ParticipantId
TranscriptTimelineSnapshot.Empty is a safe default when no session is active.
TranscriptUpdateBatch
TranscriptUpdateBatchTimeline
TranscriptTimelineSnapshot
Full snapshot of the timeline after this batch of changes
Cursor
long
Convenience accessor for Timeline.Cursor
ChangedTurns
IReadOnlyList<TranscriptTurnSnapshot>
All turns that changed in this batch
AddedTurnIds
IReadOnlyList<string>
IDs of turns added for the first time in this batch
UpdatedTurnIds
IReadOnlyList<string>
IDs of turns that received new text or state
CompletedTurnIds
IReadOnlyList<string>
IDs of turns that transitioned to Completed in this batch
InterruptedTurnIds
IReadOnlyList<string>
IDs of turns that ended due to interruption
RemovedTurnIds
IReadOnlyList<string>
IDs of turns removed from the timeline
TranscriptParticipantRef struct
TranscriptParticipantRef structKind
TranscriptParticipantKind
Whether this participant is a Player or Character
PlayerOrCharacterId
string
The character ID or player ID associated with this participant
DisplayName
string
Human-readable name
ParticipantId
string
Room-level participant identifier
IsEmpty
bool
True when PlayerOrCharacterId is null or whitespace
Equality comparison and ==/!= operators are supported.
TranscriptParticipantKind enum
TranscriptParticipantKind enumPlayer (0)
A human player participant
Character (1)
An AI character participant
Usage examples
Example 1 — Post-session transcript export
A medical training simulation exports the full session transcript to JSON after the session ends, for supervisor review.
Example 2 — Reactive chat log that appends on completion
A corporate onboarding simulation builds a scrollable chat history that appends messages only when turns are committed — avoiding flicker from interim updates.
Example 3 — Custom live chat UI with history replay
An industrial safety drill builds a full chat UI that replays all committed transcript history on enable — so late-joining viewers see the full conversation — then listens for live changes.
Troubleshooting
GetTurns() returns empty list
No turns exist yet, or IncludeActiveTurns = false and all current turns are still streaming
Omit the TranscriptQuery to get all turns, or set IncludeActiveTurns = true to include in-progress turns
Changed fires but batch.CompletedTurnIds is empty
Turns are still active — the batch reflects an update to a streaming turn, not a completion
Check batch.ChangedTurns for active-turn updates; CompletedTurnIds only populates when a turn finishes
TranscriptTurnSnapshot.CommittedText is empty
Turn is still Streaming — text is not committed until the turn completes
Use DisplayText for in-progress text, or wait for the turn to appear in batch.CompletedTurnIds
Changed never fires after connect
Subscribed too late or Dispose() called before connect
Subscribe to Changed before or immediately after ConnectAsync; do not call Dispose() until the component is destroyed
Next steps
For event-driven transcript reactions without querying the timeline, use ConvaiCharacterEventRelay or ConvaiTranscriptEventRelay — see Character Events. For full character scripting API, see Character & Player API.
Last updated
Was this helpful?