> ## Documentation Index
> Fetch the complete documentation index at: https://docs.myustadia.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Course Assistant Transcript

> The full transcript, as a flat, time-ordered timeline of every turn ever
recorded for this session, WITH PAGING. GET /{session_id} also returns a
`turns` list, but unpaged and alongside the whole resume surface (current
question, coverage, draft); this endpoint is the read-only reader for a
conversation that issue #237 keeps alive for days.

Each stored turn ROW becomes EXACTLY TWO entries in `turns`, the user's
message and the assistant's reply, in that order:
`{turn_no, role: "user"|"assistant", modality: "text"|"voice", content,
created_at}` -- the same entry shape GET /{session_id} uses, `content`
included, plus `modality`. `content` is `""` when that side genuinely said
nothing (a `confirm` turn carries no user message) and `null` on both
entries of a turn the retention sweep has redacted or one whose reply has
not been written yet. `modality` is server-owned and describes the TURN,
not the entry -- a voice turn's user entry holds what was heard (the
speech-to-text transcript, never audio) and its assistant entry holds the
reply text that was spoken back.

`?limit` (default 200, max 500, clamped rather than rejected) and `?offset`
page over TURN ROWS, NOT over the entries: `limit=1` returns the two entries
of exactly one turn. Page with `next_offset` (the row cursor for the next
call, already in row units) and stop when it reaches `count`, the total
number of turn rows in the session. Advancing `offset` by `len(turns)`
instead would skip every second turn.



## OpenAPI

````yaml /openapi.yaml get /api/v1/courses/{course_id}/assistant/{session_id}/transcript
openapi: 3.1.0
info:
  title: Mahara Platform
  description: >
    AI Sales Training Course Generator, a Coursera-style platform.


    ## Authentication


    Every request must carry your API key as a Bearer token:


    `Authorization: Bearer sk_live_your_key_here`


    ## Getting an API key


    API keys are provisioned by our team. They are not self-service, so there is
    no signup page to apply on. To request access, email **sales@myustadia.com**
    and we will issue a key for your account.
  version: 1.0.0
servers: []
security: []
paths:
  /api/v1/courses/{course_id}/assistant/{session_id}/transcript:
    get:
      tags:
        - B2B Assistant
      summary: Course Assistant Transcript
      description: >-
        The full transcript, as a flat, time-ordered timeline of every turn ever

        recorded for this session, WITH PAGING. GET /{session_id} also returns a

        `turns` list, but unpaged and alongside the whole resume surface
        (current

        question, coverage, draft); this endpoint is the read-only reader for a

        conversation that issue #237 keeps alive for days.


        Each stored turn ROW becomes EXACTLY TWO entries in `turns`, the user's

        message and the assistant's reply, in that order:

        `{turn_no, role: "user"|"assistant", modality: "text"|"voice", content,

        created_at}` -- the same entry shape GET /{session_id} uses, `content`

        included, plus `modality`. `content` is `""` when that side genuinely
        said

        nothing (a `confirm` turn carries no user message) and `null` on both

        entries of a turn the retention sweep has redacted or one whose reply
        has

        not been written yet. `modality` is server-owned and describes the TURN,

        not the entry -- a voice turn's user entry holds what was heard (the

        speech-to-text transcript, never audio) and its assistant entry holds
        the

        reply text that was spoken back.


        `?limit` (default 200, max 500, clamped rather than rejected) and
        `?offset`

        page over TURN ROWS, NOT over the entries: `limit=1` returns the two
        entries

        of exactly one turn. Page with `next_offset` (the row cursor for the
        next

        call, already in row units) and stop when it reaches `count`, the total

        number of turn rows in the session. Advancing `offset` by `len(turns)`

        instead would skip every second turn.
      operationId: >-
        course_assistant_transcript_api_v1_courses__course_id__assistant__session_id__transcript_get
      parameters:
        - name: course_id
          in: path
          required: true
          schema:
            type: string
            title: Course Id
        - name: session_id
          in: path
          required: true
          schema:
            type: string
            title: Session Id
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            default: 200
            title: Limit
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            default: 0
            title: Offset
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.