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

# Transcribe speech

> Transcribe Kazakh/Russian audio, including speakers who switch language mid-sentence. Send audio as a raw request body (naming the container with an `x-filename` header), as a multipart `file`, or pass `?url=` and let the server fetch it. Billed on audio duration at 2.5 credits per second, from the same credit balance as text-to-speech.



## OpenAPI

````yaml /openapi.json post /v1/transcribe
openapi: 3.0.3
info:
  title: geko API
  version: 1.0.0
  description: >-
    Text-to-speech for Kazakh and beyond. Send text and a voice name; get back
    WAV audio (24 kHz, 16-bit PCM, mono). A thin, familiar HTTP API — call it
    from any language, or use the typed SDK and CLI.


    The catalog endpoints (`/v1/models`, `/v1/voices`, `/health`) are open.
    Synthesis endpoints require a bearer key — create one in the
    [console](https://app.geko.sh).
servers:
  - url: https://geko--tokay-serve-web.modal.run
security:
  - bearerAuth: []
paths:
  /v1/transcribe:
    servers:
      - url: https://geko--seta-serve-transcriber-api.modal.run
    post:
      tags:
        - Speech-to-text
      summary: Transcribe speech
      description: >-
        Transcribe Kazakh/Russian audio, including speakers who switch language
        mid-sentence. Send audio as a raw request body (naming the container
        with an `x-filename` header), as a multipart `file`, or pass `?url=` and
        let the server fetch it. Billed on audio duration at 2.5 credits per
        second, from the same credit balance as text-to-speech.
      operationId: createTranscription
      parameters:
        - name: url
          in: query
          required: false
          description: Public URL of the audio. Use instead of sending a body.
          schema:
            type: string
            format: uri
        - name: x-filename
          in: header
          required: false
          description: >-
            Filename hint; only the extension matters, so the server knows the
            container. Defaults to `audio.wav`.
          schema:
            type: string
            example: call.wav
      requestBody:
        required: false
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
      responses:
        '200':
          description: The transcript, with timing and the credits charged.
          headers:
            X-Seta-Audio-Seconds:
              description: Duration of the submitted audio — what you were billed for.
              schema:
                type: number
            X-Seta-Credits:
              description: Credits charged for this request.
              schema:
                type: integer
            X-Seta-Model:
              description: Model that produced the transcript.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transcription'
        '400':
          description: No audio supplied.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: Audio longer than 2 hours. Split it and send the parts.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Out of credits — top up in the console.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    Transcription:
      type: object
      required:
        - text
        - model
        - audio_seconds
        - credits_charged
      properties:
        text:
          type: string
          description: >-
            The transcript. Lowercase and unpunctuated — the model's vocabulary
            contains neither, so nothing is being stripped.
          example: сәлеметсіз бе бүгін ауа райы өте жақсы
        model:
          type: string
          example: seta-kk-ru-v2
        audio_seconds:
          type: number
          description: Duration of the submitted audio. This is the billed quantity.
          example: 2.84
        processing_seconds:
          type: number
          example: 0.153
        rtf:
          type: number
          nullable: true
          description: >-
            Real-time factor: processing_seconds / audio_seconds. Lower is
            faster.
          example: 0.0539
        x_realtime:
          type: number
          nullable: true
          description: How many times faster than real time this ran.
          example: 18.5
        chunks:
          type: integer
          description: How many pieces the audio was split into at pause boundaries.
          example: 1
        sample_rate_in:
          type: integer
          description: Sample rate of the submitted audio, before resampling to 16 kHz.
          example: 24000
        credits_charged:
          type: integer
          description: 'Credits billed: ceil(audio_seconds × 2.5).'
          example: 8
    Error:
      type: object
      properties:
        detail:
          type: string
          description: Human-readable error message.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your geko API key (`sk-tokay-…`). Create and manage keys in the
        [console](https://app.geko.sh).

````