---
title: "Receive the signed end-of-call transcript"
method: POST
path: "session.transcript"
---

# Receive the signed end-of-call transcript

`POST session.transcript` (webhook)

The worker POSTs directly to the application's mint-time transcript_webhook.url after releasing session capacity. No transcript is stored by the platform. A session with no committed segments and no tool calls sends nothing. Verify HMAC-SHA256 with transcript_webhook.secret over the timestamp, a literal dot, and the raw request body before parsing; reject stale timestamps. Delivery is best-effort and may repeat; consumers should tolerate duplicate session_id values. No delivery or retry guarantee is made. Input provenance is optional on user segments; missing legacy provenance must not be inferred as text.

## Headers

- `x-rta-signature` string, required
- `x-rta-timestamp` string, required

## Payload

- TranscriptPayload: Signed end-of-call transcript sent directly by the worker to transcript_webhook.url after capacity release. Optional provenance is additive; legacy payloads remain valid.
  - `type` 'session.transcript', required
  - `session_id` string, required
  - `avatar_id` string, required
  - `mode` 'avatar' | 'voice', required
  - `started_at` number, required
  - `ended_at` number, required
  - `seconds` number, required: Session duration in seconds.
  - `truncated` boolean, required: True when the transcript buffer overflowed and segments are partial.
  - `segments` object[], required
    - `role` 'user' | 'assistant', required
    - `text` string, required
    - `ts` number, required
    - `interrupted` boolean: The assistant was interrupted; text contains only what was spoken.
    - `message_id` string: Optional user message identity.
    - `turn_id` string: Optional user turn identity from rta.turn_id.
    - `retry_of_turn_id` string: Original user turn identity from rta.retry_of_turn_id, present only for an explicit retry.
    - `input_source` 'text' | 'client_stt' | 'server_stt' | 'unknown': Resolved user input source. A valid client declaration may resolve room text as client_stt; observed evidence remains in input_provenance. Absent on legacy segments; never defaults to text.
    - `input_provenance` object: Optional per-user-segment input provenance. A signed webhook authenticates delivery; it does not independently verify a client's declaration. Missing legacy provenance must remain absent.
      - `version` 1, required
      - `observed_source` 'text' | 'client_stt' | 'server_stt' | 'unknown', required: Source observed at ingress, kept separate from the client's declaration. SDK sendTurn observes text even when an application declares client_stt.
      - `observed_by` 'sdk' | 'worker' | 'unknown', required
      - `declared_source` 'text' | 'client_stt': Optional client declaration; a client cannot declare server_stt or unknown.
      - `declaration_scope` 'turn' | 'adapter'
      - `ingress` 'room_text' | 'room_audio_stt' | 'unknown', required
  - `tool_calls` object[]: Optional tool call sidecar; absent when no tools ran.
    - `name` string, required
    - `call_id` string, required
    - `arguments` string, required: Raw JSON arguments text; may be truncated, so it need not parse as JSON.
    - `ts` number, required
    - `ok` boolean: Absent when the call produced nothing the model saw.
    - `result` string
    - `error` string
    - `duration_ms` number
  - `tool_calls_truncated` boolean: True when the tool call buffer overflowed and its tail is missing.
  - `client_metadata` object, required: Mint-time client_metadata echoed verbatim; an empty object when none was provided.

## Acknowledgement `2XX`

Receipt acknowledged by the application.

## Other responses

- `default`: Application response; delivery and retries are best-effort.

---

[API](https://skmtc.dev/realtimeavatar/apis/realtime-avatar-api.md) · [All operations](https://skmtc.dev/realtimeavatar/apis/realtime-avatar-api/llms.txt) · [OpenAPI document](https://skmtc.dev/realtimeavatar/apis/realtime-avatar-api/revisions/e9e3e998e673?raw)
