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

# Import a Meeting Transcript

> Attaches a transcript to an existing calendar meeting. Never creates meetings, and never stores audio or video.

Prefer `meeting_id` from `list_meetings` or `get_meeting`. Otherwise send `calendar_event_id` (Google Calendar `events.id`) or `ical_uid`, plus `started_at` when the id belongs to a recurring meeting. Unmatched rows return `unmatched_meeting`: skip them, do not invent a meeting.

The transcript is only stored when Monaco has not covered the meeting itself. Check `transcript_source` on `get_meeting` before posting. Rejections carry a machine-readable `error.code` and write nothing:

- `monaco_recorder_configured` (409): Monaco's recorder handles this call.
- `transcript_exists` (409): the meeting already has a transcript, or this `external_id` is stored with different content. A meeting holds at most one imported transcript.
- `do_not_ingest` (409): the meeting or its series is marked do-not-ingest.
- `ambiguous_meeting` (422): several occurrences match; resend with `started_at`.
- `meeting_not_ended` (422): the meeting has not finished yet; retry after it ends.
- `unmatched_meeting` (422): no meeting matched the identifiers sent.
- `privacy_blocked` (403): org privacy settings block this meeting's content.
- `meeting_deleted` (410): the meeting was deleted.

Retries with the same `external_id` and the same transcript return `created: false`.



## OpenAPI

````yaml https://api.monaco.com/openapi.json post /v1/meetings/transcripts
openapi: 3.1.0
info:
  title: Monaco Public API
  description: Public API for Monaco
  version: 1.0.0
servers:
  - url: https://api.monaco.com
security: []
paths:
  /v1/meetings/transcripts:
    post:
      tags:
        - Meetings
      summary: Import a Meeting Transcript
      description: >-
        Attaches a transcript to an existing calendar meeting. Never creates
        meetings, and never stores audio or video.


        Prefer `meeting_id` from `list_meetings` or `get_meeting`. Otherwise
        send `calendar_event_id` (Google Calendar `events.id`) or `ical_uid`,
        plus `started_at` when the id belongs to a recurring meeting. Unmatched
        rows return `unmatched_meeting`: skip them, do not invent a meeting.


        The transcript is only stored when Monaco has not covered the meeting
        itself. Check `transcript_source` on `get_meeting` before posting.
        Rejections carry a machine-readable `error.code` and write nothing:


        - `monaco_recorder_configured` (409): Monaco's recorder handles this
        call.

        - `transcript_exists` (409): the meeting already has a transcript, or
        this `external_id` is stored with different content. A meeting holds at
        most one imported transcript.

        - `do_not_ingest` (409): the meeting or its series is marked
        do-not-ingest.

        - `ambiguous_meeting` (422): several occurrences match; resend with
        `started_at`.

        - `meeting_not_ended` (422): the meeting has not finished yet; retry
        after it ends.

        - `unmatched_meeting` (422): no meeting matched the identifiers sent.

        - `privacy_blocked` (403): org privacy settings block this meeting's
        content.

        - `meeting_deleted` (410): the meeting was deleted.


        Retries with the same `external_id` and the same transcript return
        `created: false`.
      operationId: import_meeting_transcript
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MeetingTranscriptImportRequest'
            examples:
              known_meeting:
                summary: Attach to a known Monaco meeting
                value:
                  external_id: call-abc123
                  meeting_id: 550e8400-e29b-41d4-a716-446655440000
                  transcript:
                    - speaker: Jane Smith
                      text: Thanks everyone for joining.
                      start: 0
                      end: 1.5
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/PublicItemResponse_MeetingTranscriptImportResponse_
              example:
                data:
                  transcript_id: 550e8400-e29b-41d4-a716-446655440001
                  meeting_id: 550e8400-e29b-41d4-a716-446655440000
                  external_id: call-abc123
                  created: true
                meta:
                  timestamp: '2026-04-21T12:00:00Z'
        '403':
          description: '`privacy_blocked`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorResponse'
        '409':
          description: >-
            `monaco_recorder_configured`, `transcript_exists`, or
            `do_not_ingest`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorResponse'
        '410':
          description: '`meeting_deleted`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorResponse'
        '422':
          description: '`unmatched_meeting`, `ambiguous_meeting`, or `meeting_not_ended`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorResponse'
        4XX:
          description: Client error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorResponse'
components:
  schemas:
    MeetingTranscriptImportRequest:
      properties:
        external_id:
          type: string
          maxLength: 512
          minLength: 1
          title: External Id
          description: Idempotency key from the caller's system
          examples:
            - call-abc123
        transcript:
          items:
            $ref: '#/components/schemas/TranscriptImportSegment'
          type: array
          maxItems: 10000
          minItems: 1
          title: Transcript
          description: Ordered speaker turns. Timestamps are seconds from recording start
        meeting_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Meeting Id
          description: Monaco meeting id from list_meetings / get_meeting. Strongest match
          examples:
            - 550e8400-e29b-41d4-a716-446655440000
        calendar_event_id:
          anyOf:
            - type: string
              maxLength: 512
            - type: 'null'
          title: Calendar Event Id
          description: Google Calendar event id (events.id), not iCal UID
          examples:
            - abc123
        ical_uid:
          anyOf:
            - type: string
              maxLength: 512
            - type: 'null'
          title: Ical Uid
          description: iCalendar UID (often looks like event@google.com)
          examples:
            - abc123@google.com
        started_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Started At
          description: >-
            When the recording started (ISO 8601). Picks the occurrence when
            calendar_event_id or ical_uid matches several instances of a
            recurring meeting
          examples:
            - '2026-03-01T10:02:14Z'
      type: object
      required:
        - external_id
        - transcript
      title: MeetingTranscriptImportRequest
    PublicItemResponse_MeetingTranscriptImportResponse_:
      properties:
        data:
          $ref: '#/components/schemas/MeetingTranscriptImportResponse'
        meta:
          $ref: '#/components/schemas/ResponseMeta'
      type: object
      required:
        - data
      title: PublicItemResponse[MeetingTranscriptImportResponse]
    PublicErrorResponse:
      properties:
        error:
          $ref: '#/components/schemas/ErrorDetail'
      type: object
      required:
        - error
      title: PublicErrorResponse
    TranscriptImportSegment:
      properties:
        speaker:
          type: string
          maxLength: 512
          minLength: 1
          title: Speaker
          description: Display name of the speaker
          examples:
            - Jane Smith
        text:
          type: string
          maxLength: 20000
          minLength: 1
          title: Text
          description: Spoken text for this turn
          examples:
            - Thanks everyone for joining.
        start:
          type: number
          minimum: 0
          title: Start
          description: Start offset in seconds from the beginning of the recording
          examples:
            - 0
        end:
          anyOf:
            - type: number
              minimum: 0
            - type: 'null'
          title: End
          description: End offset in seconds; defaults to `start` when omitted
          examples:
            - 1.5
        language:
          type: string
          maxLength: 16
          minLength: 2
          title: Language
          description: BCP-47 language code for this turn
          default: en
          examples:
            - en
      type: object
      required:
        - speaker
        - text
        - start
      title: TranscriptImportSegment
    MeetingTranscriptImportResponse:
      properties:
        transcript_id:
          type: string
          title: Transcript Id
          description: Monaco transcript id
        meeting_id:
          type: string
          title: Meeting Id
          description: Monaco meeting the transcript was attached to
        external_id:
          type: string
          title: External Id
          description: Idempotency key that was stored
        created:
          type: boolean
          title: Created
          description: >-
            True when a new overlay row was written; false on an idempotent
            retry
      type: object
      required:
        - transcript_id
        - meeting_id
        - external_id
        - created
      title: MeetingTranscriptImportResponse
    ResponseMeta:
      properties:
        timestamp:
          type: string
          format: date-time
          title: Timestamp
          description: Server timestamp of the response
      type: object
      title: ResponseMeta
    ErrorDetail:
      properties:
        code:
          type: string
          title: Code
          description: Machine-readable error code
          examples:
            - not_found
        message:
          type: string
          title: Message
          description: Human-readable error message
          examples:
            - Resource not found
      type: object
      required:
        - code
        - message
      title: ErrorDetail

````