Happy Scribe Transcriptions API

List, retrieve, update, and delete transcriptions, and fetch an AI-generated summary of a transcription. Each transcription carries its language, processing state, audio length, and cost. Creating transcriptions directly is deprecated in favor of the Orders API. Core audio-to-text / speech-to-text surface.

OpenAPI Specification

happyscribe-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Happy Scribe API
  description: >-
    The Happy Scribe API turns audio and video into text and subtitles
    programmatically. Submit work through the Orders API (automatic/machine or
    professional/human service), manage the resulting transcriptions, export
    finished transcripts into 15+ formats (SRT, VTT, STL, DOCX, PDF, TXT, JSON,
    CSV, XLSX, and editing-suite formats), and administer organizations and their
    members. Files are ingested by public URL or via a signed upload. All requests
    are REST over HTTPS and authenticated with a Bearer API token from your Happy
    Scribe account settings. Base URL https://www.happyscribe.com/api/v1. Endpoint
    paths and fields are grounded in the public developer documentation
    (dev.happyscribe.com); request/response schemas below are honestly modeled
    from that documentation and may not enumerate every field.
  version: '1.0'
  contact:
    name: Happy Scribe
    url: https://dev.happyscribe.com
servers:
  - url: https://www.happyscribe.com/api/v1
    description: Happy Scribe API v1
security:
  - bearerAuth: []
tags:
  - name: Transcriptions
    description: List, retrieve, update, and delete transcriptions.
  - name: Orders
    description: Create and track transcription, subtitling, and translation orders.
  - name: Exports
    description: Render finished transcripts into downloadable files.
  - name: Organizations
    description: Organizations (workspaces) the authenticated user belongs to.
  - name: Organization Memberships
    description: Manage members and roles within an organization.
  - name: Uploads
    description: Signed upload URLs for local media files.
  - name: Glossaries and Style Guides
    description: Reusable glossaries and style guides attachable to orders.
paths:
  /transcriptions:
    get:
      operationId: listTranscriptions
      tags:
        - Transcriptions
      summary: List transcriptions
      description: Lists transcriptions in an organization.
      parameters:
        - name: organization_id
          in: query
          required: false
          description: Filter transcriptions by organization.
          schema:
            type: string
        - name: folder_id
          in: query
          required: false
          description: Filter transcriptions by folder.
          schema:
            type: string
      responses:
        '200':
          description: A list of transcriptions.
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/Transcription'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createTranscription
      tags:
        - Transcriptions
      summary: Create a transcription (deprecated)
      description: >-
        Deprecated. Creating a transcription directly is superseded by the Orders
        API; use POST /orders instead. Retained here because it remains documented
        for backward compatibility.
      deprecated: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TranscriptionInput'
      responses:
        '201':
          description: The created transcription.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transcription'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /transcriptions/{id}:
    parameters:
      - $ref: '#/components/parameters/Id'
    get:
      operationId: getTranscription
      tags:
        - Transcriptions
      summary: Retrieve a transcription
      description: Retrieves a single transcription by ID, including its state and metadata.
      responses:
        '200':
          description: The requested transcription.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transcription'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: updateTranscription
      tags:
        - Transcriptions
      summary: Update a transcription
      description: Updates editable details of a transcription, such as its name or folder.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                folder_id:
                  type: string
      responses:
        '200':
          description: The updated transcription.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transcription'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
    delete:
      operationId: deleteTranscription
      tags:
        - Transcriptions
      summary: Delete a transcription
      description: Deletes a transcription.
      responses:
        '204':
          description: The transcription was deleted.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /transcriptions/{id}/summary:
    parameters:
      - $ref: '#/components/parameters/Id'
    get:
      operationId: getTranscriptionSummary
      tags:
        - Transcriptions
      summary: Retrieve a transcription summary
      description: >-
        Retrieves the AI-generated summary for a transcription (for example, a
        meeting summary), when available.
      responses:
        '200':
          description: The transcription summary.
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  summary:
                    type: string
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /orders:
    post:
      operationId: createOrder
      tags:
        - Orders
      summary: Create a transcription or subtitling order
      description: >-
        Creates an order to transcribe or subtitle a media file from a URL, using
        automatic (machine) or professional (human) service. This is the preferred
        way to submit new work.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrderInput'
      responses:
        '201':
          description: The created order.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /orders/translation:
    post:
      operationId: createTranslationOrder
      tags:
        - Orders
      summary: Create a translation order
      description: Creates an order to translate an existing transcription into a target language.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - transcription_id
                - target_language
              properties:
                transcription_id:
                  type: string
                target_language:
                  type: string
                  description: BCP-47 target language code.
                service:
                  type: string
                  enum:
                    - auto
                    - pro
      responses:
        '201':
          description: The created translation order.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /orders/{id}:
    parameters:
      - $ref: '#/components/parameters/Id'
    get:
      operationId: getOrder
      tags:
        - Orders
      summary: Retrieve an order
      description: Retrieves an order by ID, including its state.
      responses:
        '200':
          description: The requested order.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /orders/{id}/confirm:
    parameters:
      - $ref: '#/components/parameters/Id'
    post:
      operationId: confirmOrder
      tags:
        - Orders
      summary: Confirm an incomplete order
      description: >-
        Confirms an order that was created in an incomplete state, submitting it
        for processing.
      responses:
        '200':
          description: The confirmed order.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
  /exports:
    post:
      operationId: createExport
      tags:
        - Exports
      summary: Create an export
      description: >-
        Creates an export that renders one or more transcriptions into a
        downloadable file in the requested format.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExportInput'
      responses:
        '201':
          description: The created export.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Export'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /exports/{id}:
    parameters:
      - $ref: '#/components/parameters/Id'
    get:
      operationId: getExport
      tags:
        - Exports
      summary: Retrieve an export
      description: >-
        Retrieves an export by ID. Poll this endpoint until the state is ready,
        then use the download link.
      responses:
        '200':
          description: The requested export.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Export'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /organizations:
    get:
      operationId: listOrganizations
      tags:
        - Organizations
      summary: List organizations
      description: Lists the organizations the authenticated user belongs to.
      responses:
        '200':
          description: A list of organizations.
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/Organization'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /organization_memberships:
    get:
      operationId: listOrganizationMemberships
      tags:
        - Organization Memberships
      summary: List organization memberships
      description: Lists memberships, optionally filtered by organization.
      parameters:
        - name: organization_id
          in: query
          required: false
          description: Filter memberships by organization.
          schema:
            type: string
      responses:
        '200':
          description: A list of memberships.
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/OrganizationMembership'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createOrganizationMembership
      tags:
        - Organization Memberships
      summary: Add a member to an organization
      description: Adds a user to an organization by email, with a role.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - organization_id
                - email
              properties:
                organization_id:
                  type: string
                email:
                  type: string
                  format: email
                role:
                  type: string
                  enum:
                    - admin
                    - member
      responses:
        '201':
          description: The created membership.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationMembership'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /organization_memberships/{id}:
    parameters:
      - $ref: '#/components/parameters/Id'
    patch:
      operationId: updateOrganizationMembership
      tags:
        - Organization Memberships
      summary: Update a membership
      description: Updates a member's role in an organization.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                role:
                  type: string
                  enum:
                    - admin
                    - member
      responses:
        '200':
          description: The updated membership.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationMembership'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
    delete:
      operationId: deleteOrganizationMembership
      tags:
        - Organization Memberships
      summary: Remove a member
      description: Removes a member from an organization.
      responses:
        '204':
          description: The membership was removed.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /uploads/new:
    get:
      operationId: newUpload
      tags:
        - Uploads
      summary: Request a signed upload URL
      description: >-
        Returns a signed URL to which a local media file can be PUT. The returned
        temporary URL is then passed as tmp_url / url when creating a transcription
        or order.
      parameters:
        - name: filename
          in: query
          required: true
          description: The name of the file to be uploaded.
          schema:
            type: string
      responses:
        '200':
          description: A signed upload URL.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Upload'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /glossaries:
    get:
      operationId: listGlossaries
      tags:
        - Glossaries and Style Guides
      summary: List glossaries
      description: Lists the glossaries available in an organization.
      parameters:
        - name: organization_id
          in: query
          required: true
          description: The organization to list glossaries for.
          schema:
            type: string
      responses:
        '200':
          description: A list of glossaries.
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/Glossary'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /style_guides:
    get:
      operationId: listStyleGuides
      tags:
        - Glossaries and Style Guides
      summary: List style guides
      description: Lists the style guides available in an organization.
      parameters:
        - name: organization_id
          in: query
          required: true
          description: The organization to list style guides for.
          schema:
            type: string
      responses:
        '200':
          description: A list of style guides.
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/StyleGuide'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API token from your Happy Scribe account settings, passed as
        `Authorization: Bearer YOUR_API_TOKEN`.
  parameters:
    Id:
      name: id
      in: path
      required: true
      description: The unique identifier of the resource.
      schema:
        type: string
  responses:
    Unauthorized:
      description: Missing or invalid Bearer token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ValidationError:
      description: The request payload failed validation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      type: object
      properties:
        error:
          type: string
        message:
          type: string
    TranscriptionInput:
      type: object
      required:
        - name
        - language
        - tmp_url
        - organization_id
      properties:
        name:
          type: string
        language:
          type: string
          description: BCP-47 language code of the audio.
        tmp_url:
          type: string
          format: uri
          description: Public or signed URL of the media file to transcribe.
        service:
          type: string
          enum:
            - auto
            - pro
            - alignment
        organization_id:
          type: string
        folder_id:
          type: string
        is_subtitle:
          type: boolean
          default: false
        tags:
          type: array
          items:
            type: string
    Transcription:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        state:
          type: string
          description: Processing state of the transcription.
        language:
          type: string
        audioLengthInSeconds:
          type: number
        costInCents:
          type: integer
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    OrderInput:
      type: object
      required:
        - url
        - language
        - organization_id
      properties:
        url:
          type: string
          format: uri
          description: Public or signed URL of the media file.
        language:
          type: string
          description: BCP-47 language code.
        organization_id:
          type: string
        service:
          type: string
          enum:
            - auto
            - pro
        is_subtitle:
          type: boolean
          default: false
        confirm:
          type: boolean
          description: When true, submit immediately instead of leaving the order incomplete.
        glossary_ids:
          type: array
          items:
            type: string
        style_guide_id:
          type: string
    Order:
      type: object
      properties:
        id:
          type: string
        state:
          type: string
          enum:
            - incomplete
            - waiting_for_payment
            - submitted
            - locked
            - fulfilled
            - failed
            - canceled
            - expired
        service:
          type: string
        language:
          type: string
        transcription_ids:
          type: array
          items:
            type: string
        createdAt:
          type: string
          format: date-time
    ExportInput:
      type: object
      required:
        - format
        - transcription_ids
      properties:
        format:
          type: string
          description: >-
            Output format, e.g. txt, docx, pdf, srt, vtt, stl, json, csv, xlsx,
            mp3, mp4, and editing-suite formats.
        transcription_ids:
          type: array
          items:
            type: string
        show_timestamps:
          type: boolean
        show_speakers:
          type: boolean
        show_comments:
          type: boolean
        show_highlights:
          type: boolean
    Export:
      type: object
      properties:
        id:
          type: string
        state:
          type: string
          enum:
            - pending
            - processing
            - ready
            - expired
            - failed
        format:
          type: string
        download_link:
          type: string
          format: uri
          description: Present when the export state is ready.
    Organization:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        role:
          type: string
          enum:
            - owner
            - admin
            - member
            - guest
        membersCount:
          type: integer
        currency:
          type: string
        isHumanTranscriptionAllowed:
          type: boolean
        isHumanTranslationAllowed:
          type: boolean
    OrganizationMembership:
      type: object
      properties:
        id:
          type: string
        email:
          type: string
          format: email
        name:
          type: string
        role:
          type: string
          enum:
            - admin
            - member
        organizationId:
          type: string
        organizationName:
          type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    Upload:
      type: object
      properties:
        url:
          type: string
          format: uri
          description: Signed URL to PUT the file to.
        tmp_url:
          type: string
          format: uri
          description: Temporary URL to pass when creating a transcription or order.
    Glossary:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        organizationId:
          type: string
    StyleGuide:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        organizationId:
          type: string