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

# Get Subtitle

> Retrieve the structured subtitle segments of a recording's language track in JSON form (with word-level timings). The response shape mirrors the PUT request body — use this before `PUT` to fetch the current segments, edit the `words` array of the segment(s) you want to change (word-level text and timings are the source of truth; editing `text` alone has no effect), and send the full array back. The `source` and `dubbing` query flags pick which track to read: source transcription, target translation, or dubbing.

## Language scoping

The `language` value must match the requested task type for the recording:
* When `source=true` and `dubbing=false` (transcription), `language` must equal the recording source language.
* When `source=false` and `dubbing=false` (translation), `language` must be one of the recording translation languages.
* When `source=false` and `dubbing=true` (dubbing), `language` must be one of the recording translation languages.
* `source=true` and `dubbing=true` together is invalid.

Mismatched combinations return `400` with a descriptive message rather than reaching the underlying file lookup.



## OpenAPI

````yaml /openapi/phrase-studio.json get /v1/projects/{projectId}/recordings/{recordingId}/subtitles
openapi: 3.0.3
info:
  title: Studio API
  description: >-
    API for creating projects and reading transcription, translation, and
    dubbing results.
  version: 1.0.0
servers:
  - url: https://api.studio.us.phrase.com
    description: Production US Environment
  - url: https://api.studio.eu.phrase.com
    description: Production EU Environment
security: []
tags:
  - name: Projects
    description: Manage transcription, translation, and dubbing projects
  - name: Recordings
    description: Access recording status and output data
  - name: Subtitle Profiles
    description: Manage subtitle formatting profiles
  - name: Pronunciations
    description: Manage custom pronunciation rules
  - name: Glossaries
    description: Manage translation glossaries
  - name: Insights
    description: Manage AI-powered insight prompts
  - name: Safe Communications
    description: Access safe communication evaluation templates
  - name: Subtitles
    description: Write subtitle segments for a recording
paths:
  /v1/projects/{projectId}/recordings/{recordingId}/subtitles:
    get:
      tags:
        - Subtitles
      summary: Get Subtitle
      description: >-
        Retrieve the structured subtitle segments of a recording's language
        track in JSON form (with word-level timings). The response shape mirrors
        the PUT request body — use this before `PUT` to fetch the current
        segments, edit the `words` array of the segment(s) you want to change
        (word-level text and timings are the source of truth; editing `text`
        alone has no effect), and send the full array back. The `source` and
        `dubbing` query flags pick which track to read: source transcription,
        target translation, or dubbing.


        ## Language scoping


        The `language` value must match the requested task type for the
        recording:

        * When `source=true` and `dubbing=false` (transcription), `language`
        must equal the recording source language.

        * When `source=false` and `dubbing=false` (translation), `language` must
        be one of the recording translation languages.

        * When `source=false` and `dubbing=true` (dubbing), `language` must be
        one of the recording translation languages.

        * `source=true` and `dubbing=true` together is invalid.


        Mismatched combinations return `400` with a descriptive message rather
        than reaching the underlying file lookup.
      operationId: getSubtitles
      parameters:
        - name: projectId
          in: path
          required: true
          description: Project ID
          schema:
            type: string
            format: uuid
        - name: recordingId
          in: path
          required: true
          description: Recording ID
          schema:
            type: string
            format: uuid
        - name: language
          in: query
          required: true
          description: BCP-47 language code of the track to read
          schema:
            type: string
        - name: source
          in: query
          required: false
          description: Set to true to read the source (transcription) track
          schema:
            type: boolean
            default: false
        - name: dubbing
          in: query
          required: false
          description: Set to true to read the dubbing track
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: Subtitle track returned
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubtitleSegmentResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                bad_request:
                  summary: Bad Request
                  value:
                    success: false
                    statusCode: 400
                    message: Bad Request
                    timestamp: '2025-01-01T00:00:00.000Z'
                language_not_available:
                  summary: Language not available for the requested task
                  value:
                    success: false
                    statusCode: 400
                    message: >-
                      Language 'fr' is not available for translation on this
                      recording. Available languages: tr, es
                    timestamp: '2025-01-01T00:00:00.000Z'
                source_dubbing_conflict:
                  summary: source and dubbing both true
                  value:
                    success: false
                    statusCode: 400
                    message: source and dubbing cannot both be true
                    timestamp: '2025-01-01T00:00:00.000Z'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                unauthorized:
                  summary: Unauthorized
                  value:
                    success: false
                    statusCode: 401
                    message: Unauthorized
                    timestamp: '2025-01-01T00:00:00.000Z'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                forbidden:
                  summary: Forbidden
                  value:
                    success: false
                    statusCode: 403
                    message: Access denied
                    timestamp: '2025-01-01T00:00:00.000Z'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                not_found:
                  summary: Not Found
                  value:
                    success: false
                    statusCode: 404
                    message: Subtitles not found
                    timestamp: '2025-01-01T00:00:00.000Z'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                internal_server_error:
                  summary: Internal server error
                  value:
                    success: false
                    statusCode: 500
                    message: Internal server error
                    timestamp: '2025-01-01T00:00:00.000Z'
      security:
        - apiKeyAuth: []
components:
  schemas:
    SubtitleSegmentResponse:
      type: object
      required:
        - subtitles
        - participantNames
      properties:
        participantNames:
          type: array
          items:
            type: string
        bgVolume:
          type: number
        speakerVolumes:
          type: object
          additionalProperties:
            type: number
        speakerVoiceSettings:
          type: object
          additionalProperties:
            type: object
            additionalProperties: true
        subtitles:
          type: array
          items:
            $ref: '#/components/schemas/SubtitleSegmentResponseItem'
    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        statusCode:
          type: integer
          example: 400
        message:
          type: string
          example: Bad Request
        timestamp:
          type: string
          format: date-time
          example: '2025-01-01T00:00:00.000Z'
      required:
        - success
        - statusCode
        - message
        - timestamp
    SubtitleSegmentResponseItem:
      type: object
      required:
        - id
        - time_begin
        - time_end
        - words
        - speaker
        - language
      properties:
        id:
          type: string
        speaker:
          type: string
        time_begin:
          type: number
          minimum: 0
        time_end:
          type: number
          minimum: 0
        words:
          type: array
          items:
            $ref: '#/components/schemas/SubtitleWord'
        language:
          type: string
        text:
          type: string
        metadata:
          type: object
          additionalProperties: true
        cue_settings:
          type: object
          additionalProperties: true
    SubtitleWord:
      type: object
      required:
        - word
        - time_begin
        - time_end
      properties:
        word:
          type: string
          description: Word text
        time_begin:
          type: number
          minimum: 0
          description: Start time in seconds
        time_end:
          type: number
          minimum: 0
          description: End time in seconds
        is_eos:
          type: boolean
          description: Whether this word ends a sentence
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key

````