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

# Translate an interview transcript

> Machine-translate the transcript's message bubbles into a language, for
reviewers who do not read the interview's language. Translations are cached
per language and reused; the call is idempotent: only messages not yet cached
in that language are translated (so re-posting on an in-progress interview
fills in the new turns) and a run already in flight is joined rather than
duplicated. Returns 202 while the translation is running and 200 once it is
complete; poll the `translations` endpoint for progress. Interview types
(`interview`, `guided-interview`, `imported-interview`) only. The translation
never appears in the interview payload itself — only the language codes of
complete translations do (`available_translations`).




## OpenAPI

````yaml /api-reference/openapi-public.yaml post /projects/{project_id}/interviews/{interview_id}/translate/
openapi: 3.0.3
info:
  title: Clarifeye Platform API — Public API
  description: >
    Forward-facing, supported REST API for new integrators of the Clarifeye
    Platform.


    Covers the curated public surface: authentication, knowledge management

    (documents), users & teams, signals, and tool execution. New integrations

    should target these endpoints.


    ## Authentication

    All endpoints require authentication. Include the Authorization header in
    every request using either format:

    - `Authorization: Token <token_key>`

    - `Authorization: Bearer <token_key>`
  version: 1.0.0
  contact:
    name: Clarifeye Support
servers:
  - url: https://eu.app.clarifeye.ai/api/v1
    description: EU
  - url: https://us.app.clarifeye.ai/api/v1
    description: US
security:
  - BearerAuth: []
  - TokenAuth: []
tags:
  - name: Users
    description: Manage users within a project
  - name: Invitations
    description: Manage project invitations
  - name: Documents
    description: Manage documents within a project
  - name: Signals
    description: Submit signals about the project's content for domain experts to review
  - name: Tools
    description: Execute configured AI tools with custom parameters
  - name: Interviews
    description: >-
      Assign, run and review structured interview conversations, and manage
      interview drafts and campaigns
  - name: Artifacts
    description: >
      Knowledge-store artifact catalog: list artifacts, create and edit custom
      artifacts,

      manage scope membership, read and publish versions, and configure the
      cohesion guide.
  - name: Knowledge Changelog
    description: Chronological log of changes to the knowledge store's artifacts.
paths:
  /projects/{project_id}/interviews/{interview_id}/translate/:
    post:
      tags:
        - Interviews
      summary: Translate an interview transcript
      description: >
        Machine-translate the transcript's message bubbles into a language, for

        reviewers who do not read the interview's language. Translations are
        cached

        per language and reused; the call is idempotent: only messages not yet
        cached

        in that language are translated (so re-posting on an in-progress
        interview

        fills in the new turns) and a run already in flight is joined rather
        than

        duplicated. Returns 202 while the translation is running and 200 once it
        is

        complete; poll the `translations` endpoint for progress. Interview types

        (`interview`, `guided-interview`, `imported-interview`) only. The
        translation

        never appears in the interview payload itself — only the language codes
        of

        complete translations do (`available_translations`).
      operationId: translateInterviewTranscript
      parameters:
        - $ref: '#/components/parameters/ProjectId'
        - name: interview_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - language
              properties:
                language:
                  type: string
                  description: >-
                    ISO language code to translate into (e.g. `fr`, `pt-br`).
                    Unknown codes are rejected (400).
      responses:
        '200':
          description: Translation complete
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InterviewTranscriptTranslation'
        '202':
          description: Translation running (newly started or already in flight)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InterviewTranscriptTranslation'
        '400':
          description: Unknown language code, or the conversation is not an interview
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    ProjectId:
      name: project_id
      in: path
      required: true
      description: UUID of the project
      schema:
        type: string
        format: uuid
  schemas:
    InterviewTranscriptTranslation:
      type: object
      description: >
        Cached machine translation of an interview transcript into one language.

        `translations` maps a message key to the translated text of that
        transcript

        bubble.


        The key is a 16-hex-character (zero-padded, lower-case) FNV-1a 64 hash
        over the

        UTF-8 bytes of `role + US + speaker + US + content`, where `US` is the
        ASCII

        unit separator (code point 31) and `speaker` is the empty string when
        absent.

        Keys are computed from `chat_history` entries of type `message` with
        role

        `user` or `assistant`, excluding panel-bound entries (`to: "panel"`) and
        blank

        content, so identical bubbles share one key and a cache survives an
        in-progress

        interview growing. Bubbles without an entry are not translated yet.
      properties:
        language:
          type: string
          description: ISO language code of the translation.
        status:
          type: string
          enum:
            - running
            - ready
            - failed
        translations:
          type: object
          additionalProperties:
            type: string
          description: Message key → translated text.
        translated_count:
          type: integer
          description: Current transcript messages that have a translation.
        total_count:
          type: integer
          description: Current transcript messages eligible for translation.
        error:
          type: string
          nullable: true
          description: >-
            Stable failure message when `status` is `failed`; retry by calling
            `translate` again (already translated messages are kept).
        updated_at:
          type: string
          format: date-time
    Error:
      type: object
      properties:
        error:
          type: string
          description: Error message
      example:
        error: User not found
  responses:
    Unauthorized:
      description: Unauthorized - missing or invalid authentication
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Authentication credentials were not provided.
    Forbidden:
      description: Forbidden - insufficient permissions
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: You do not have permission to perform this action.
    NotFound:
      description: Not found - resource does not exist
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Not found.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: 'Use Authorization: Bearer <token>'
    TokenAuth:
      type: apiKey
      in: header
      name: Authorization
      description: 'Use Authorization: Token <token>'

````