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

# Transcriptions — Submit Job

> Step 2. Starts STT over the uploaded recording with optional translation. Returns 202 once the job has been submitted for processing; poll GET /v2/transcriptions/{job_id}. Send Idempotency-Key to make retries safe.

Step 2. Starts speech-to-text over an uploaded recording, with an optional translation into `target_language`. Returns `202 Accepted` as soon as the job has been submitted for processing; completion is observed by polling `GET /v2/transcriptions/{job_id}` (the `Location` header points there, `Retry-After` suggests the cadence).

```bash theme={null}
curl --request POST \
  --url 'https://api.linqalpha.com/v2/transcriptions' \
  --header 'X-API-KEY: <api-key>' \
  --header 'Idempotency-Key: 2f1c7e4a-bam-call-001' \
  --header 'Content-Type: application/json' \
  --data '{"upload_id":"<upload_id>","target_language":"en"}'
```

## Language behavior

* Omit `target_language` for transcription only. Every spoken language is preserved and `translated_text` is `null`.
* `target_language` is a 2–3 letter ISO 639 code (`en`, `zh`, `ko`, …), case-insensitive. Other formats, such as `en-US`, are rejected with `400`. Every segment is sent for translation regardless of the language the speech-to-text step labelled it with; the translator is instructed to return text already in the target language unchanged and to translate the other-language parts of a segment that mixes languages, so mixed-language calls are supported. The `language` label on a segment is the speech-to-text provider's per-chunk detection and can differ from the words inside it. A line the translator did not answer is reported with `translated_text: null` and `TRANSLATION_FAILED`, never as original text presented as a translation.
* Translation quality is best effort. Detected translation failures are reported with `TRANSLATION_FAILED`, and the original transcript is retained.

## Idempotency

Send an `Idempotency-Key` header with a value unique to the submission. A retry with the same key, `upload_id` and `target_language` returns the existing job and does not start a second workflow. Reusing a key with a different `upload_id` or `target_language` starts a new job. Each call still counts against your organization's transcription limit, retries included.

If the submission returns `503` (`TRANSCRIPTION_SUBMIT_UNAVAILABLE`), the job may or may not have started. Wait `Retry-After` seconds and submit again with the same `Idempotency-Key`; without a key, a retry can process the same recording twice.

> [!NOTE]
>
> Submitting an `upload_id` whose file was never `PUT`, or that belongs to another organization, returns `404`, as does a new submission for an upload whose audio was deleted (90 days after upload); an empty file or one larger than 2 GB returns `400`. A new submission returns `status``queued`; a retry with the same `Idempotency-Key` returns the job's current status. Neither confirms successful processing.


## OpenAPI

````yaml POST /v2/transcriptions
openapi: 3.0.1
info:
  title: LinqAlpha API
  description: >-
    Linq helps finance professionals make informed decisions using
    Retrieval-Augmented Generation (RAG)-enhanced answers. By leveraging
    cutting-edge Large Language Models (LLM) and supplementary technology, Linq
    provides the most optimized responses based on your queries.
  version: 1.0.0
  license:
    name: MIT
servers:
  - url: https://api.linqalpha.com
security:
  - ApiKeyAuth: []
tags:
  - name: Meeting Agent
    description: Book and manage meeting recording agents
  - name: Search
    description: Search and generate responses
  - name: Data
    description: Data retrieval and mapping
  - name: Feedback
    description: Conversation feedback
  - name: RMS
    description: Research Management System
  - name: Source Management
    description: Source batch and file management
  - name: MCP
    description: >-
      LinqAlpha MCP — Financial data tools for AI assistants via Model Context
      Protocol
  - name: Connectors
    description: Customer Connectors — customer-owned MCP connector management
  - name: Briefing
    description: Briefing Agent — automated market briefings with scheduling and delivery
  - name: Status
    description: Sync status — check organization, document, and container sync progress
paths:
  /v2/transcriptions:
    post:
      tags:
        - Transcriptions
      summary: Transcriptions — Submit Job
      description: >-
        Step 2. Starts STT over the uploaded recording with optional
        translation. Returns 202 once the job has been submitted for processing;
        poll GET /v2/transcriptions/{job_id}. Send Idempotency-Key to make
        retries safe.
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          schema:
            type: string
          description: >-
            Unique per submission; a retry with the same key returns the
            existing job.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TranscriptionCreateRequest'
            example:
              upload_id: 8d2e6c1a-4f0b-4d7e-9a3c-2b1f5e6a7c90
              target_language: en
      responses:
        '202':
          description: 'Accepted. Location: /v2/transcriptions/{job_id}; Retry-After: 60.'
          headers:
            Location:
              schema:
                type: string
            Retry-After:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TranscriptionJobResponse'
              example:
                error: null
                payload:
                  job_id: 5a1d3f6e-9c2b-4e7a-8f10-6b2c3d4e5f60
                  status: queued
        '400':
          description: Empty or oversized (over 2 GB) upload, or invalid target_language
        '401':
          description: Unauthorized — invalid or missing API key
        '404':
          description: >-
            upload_id not found for this organization, its file was never
            uploaded, or, for a new job, its audio was deleted (90 days after
            upload)
        '429':
          description: Organization limit for transcriptions reached (RATE_LIMIT_EXCEEDED)
        '503':
          description: >-
            The service could not confirm the submission right now (error.code
            TRANSCRIPTION_SUBMIT_UNAVAILABLE). The job may or may not have
            started. Wait Retry-After seconds and submit again with the same
            Idempotency-Key, which returns the same job instead of starting a
            second one.
          headers:
            Retry-After:
              schema:
                type: integer
              description: Seconds to wait before submitting again.
      security:
        - ApiKeyAuth: []
components:
  schemas:
    TranscriptionCreateRequest:
      type: object
      required:
        - upload_id
      properties:
        upload_id:
          type: string
          format: uuid
        target_language:
          type: string
          pattern: ^[A-Za-z]{2,3}$
          description: >-
            Language to translate into, as a 2–3 letter ISO 639 code such as en,
            zh or ko (case-insensitive). Other formats, such as en-US, are
            rejected with 400. Omit for transcription only.
          example: en
    TranscriptionJobResponse:
      type: object
      properties:
        error:
          type: object
          nullable: true
          properties:
            code:
              type: string
            msg:
              type: string
            message:
              type: string
        payload:
          $ref: '#/components/schemas/TranscriptionJobPayload'
      required:
        - error
        - payload
    TranscriptionJobPayload:
      type: object
      required:
        - job_id
        - status
      properties:
        job_id:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - queued
            - processing
            - succeeded
            - failed
        result:
          $ref: '#/components/schemas/TranscriptionResult'
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - TRANSCRIPTION_FAILED
                - TRANSLATION_FAILED
            message:
              type: string
    TranscriptionResult:
      type: object
      properties:
        schema_version:
          type: string
          example: '1'
        source_language:
          type: string
          nullable: true
        target_language:
          type: string
          nullable: true
        segments:
          type: array
          items:
            $ref: '#/components/schemas/TranscriptionSegment'
        artifacts:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/TranscriptionArtifact'
    TranscriptionSegment:
      type: object
      properties:
        start_seconds:
          type: number
          nullable: true
        end_seconds:
          type: number
          nullable: true
        speaker:
          type: string
          nullable: true
          example: speaker_1
        language:
          type: string
          nullable: true
          description: Language code of the original speech.
          example: zh
        text:
          type: string
          description: Original transcript, always preserved.
        translated_text:
          type: string
          nullable: true
          description: >-
            Best-effort translation into target_language; null when no target
            was requested or a translation failure was detected for this
            segment. Original text is always preserved.
    TranscriptionArtifact:
      type: object
      properties:
        url:
          type: string
        expires_in:
          type: integer
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY

````

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