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

# Get a campaign video transcript

> Returns the transcript of a campaign video as JSON, or as a subtitle file with `?format=vtt` or `?format=srt`. Reading never starts a transcription, so this endpoint costs nothing and has no side effects. A campaign whose transcript is not ready returns `404`; use the status endpoint to tell why.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/workspaces/{workspaceId}/campaigns/{campaignId}/transcript
openapi: 3.0.0
info:
  title: Sendspark API
  version: 1.2.0
  description: >-
    Public Sendspark API. DRAFT scaffold generated from the internal API v2 spec
    — endpoint selection and authentication are pending engineering review
    before publishing.
servers:
  - url: https://api-gw.sendspark.com
    description: Production
security:
  - apiKey: []
    apiSecret: []
tags: []
paths:
  /v1/workspaces/{workspaceId}/campaigns/{campaignId}/transcript:
    get:
      tags:
        - Transcription
      summary: Get a campaign video transcript
      description: >-
        Returns the transcript of a campaign video as JSON, or as a subtitle
        file with `?format=vtt` or `?format=srt`. Reading never starts a
        transcription, so this endpoint costs nothing and has no side effects. A
        campaign whose transcript is not ready returns `404`; use the status
        endpoint to tell why.
      operationId: getCampaignTranscript
      parameters:
        - name: workspaceId
          in: path
          required: true
          description: >-
            The workspace the campaign belongs to. Retrieve it from `GET
            /v1/workspaces/identifier`.
          schema:
            type: string
            example: 7voa5y6qjj04kkbfqbgjd7kdvxlf4gqo
        - name: campaignId
          in: path
          required: true
          description: The campaign whose video transcript you want.
          schema:
            type: string
            example: 2qnbb3ki589oioyimq0o7t1dxkb402ux
        - name: format
          in: query
          required: false
          description: >-
            The representation to return. `json` is the default. `vtt` returns a
            WebVTT file and `srt` a SubRip file, both sent as a download with a
            `Content-Disposition` header.
          schema:
            type: string
            enum:
              - json
              - vtt
              - srt
            default: json
      responses:
        '200':
          description: The transcript, in the requested representation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampaignTranscriptResponseSchema'
            text/vtt:
              schema:
                type: string
              example: |
                WEBVTT

                1
                00:00:00.779 --> 00:00:06.259
                Hi there, thanks for taking a look at this.
            application/x-subrip:
              schema:
                type: string
              example: |
                1
                00:00:00,779 --> 00:00:06,259
                Hi there, thanks for taking a look at this.
        '400':
          description: >-
            Bad Request — the `format` query parameter is not one of `json`,
            `vtt` or `srt`, or `workspaceId` or `campaignId` is not a valid
            Sendspark ID.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequest'
        '401':
          description: Unauthorized — the API key or secret is missing, invalid or revoked.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvalidAuthentication'
        '404':
          description: >-
            Not Found — the campaign has no transcript ready, does not exist, or
            belongs to another workspace. A campaign in another workspace is
            deliberately indistinguishable from one that does not exist; call
            the status endpoint to tell a missing transcript from a missing
            campaign.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceNotFoundOrInvalidAccess'
        '503':
          description: Service Unavailable — the transcript exists but could not be read.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceUnavailable'
components:
  schemas:
    CampaignTranscriptResponseSchema:
      type: object
      properties:
        campaignId:
          type: string
          example: 2qnbb3ki589oioyimq0o7t1dxkb402ux
        language:
          type: string
          description: The language the transcript is stored under.
          example: en
        source:
          type: string
          enum:
            - master
            - prospect
          description: >-
            Which recording the transcript describes: `master` is the campaign's
            own video, `prospect` the personalized render made for one
            recipient.
          example: master
        generatedAt:
          type: string
          format: date-time
          nullable: true
          description: >-
            When the transcript was produced. Null for a prospect transcript,
            which is derived from the master.
          example: '2026-09-16T10:00:00.000Z'
        text:
          type: string
          description: The whole transcript as plain text, one line per segment.
          example: Hi there, thanks for taking a look at this.
        segments:
          type: array
          items:
            $ref: '#/components/schemas/CampaignTranscriptSegmentSchema'
    BadRequest:
      type: object
      properties:
        statusCode:
          type: number
          example: 400
        code:
          type: string
          example: S400-AHVE
        error:
          type: string
          example: Bad Request
        message:
          type: string
          example: Invalid request payload input
    InvalidAuthentication:
      type: object
      properties:
        statusCode:
          type: number
          example: 401
        error:
          type: string
          example: Unauthorized
        message:
          type: string
          example: Missing authentication
    ResourceNotFoundOrInvalidAccess:
      type: object
      properties:
        statusCode:
          type: number
          example: 404
        error:
          type: string
          example: Not Found
        message:
          type: string
          example: Resource not found or invalid access
    ServiceUnavailable:
      type: object
      properties:
        statusCode:
          type: number
          example: 503
        error:
          type: string
          example: Service Unavailable
        message:
          type: string
          example: Service Unavailable
    CampaignTranscriptSegmentSchema:
      type: object
      description: A block of speech, as the transcription provider divided it.
      properties:
        speaker:
          type: string
          nullable: true
          description: The speaker the provider attributed the block to.
          example: Speaker1
        start:
          type: number
          description: Seconds from the start of the video.
          example: 0.78
        end:
          type: number
          description: Seconds from the start of the video.
          example: 6.26
        text:
          type: string
          example: Hi there, thanks for taking a look at this.
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
    apiSecret:
      type: apiKey
      in: header
      name: x-api-secret

````