---
title: "Import a Meeting Transcript"
method: POST
path: "/v1/meetings/transcripts"
tags: ["Meetings"]
---

# Import a Meeting Transcript

`POST /v1/meetings/transcripts`

## Request

- Base URL: `https://api.monaco.com`
- URL: `https://api.monaco.com/v1/meetings/transcripts`
- Auth: none declared

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`.

## Request body

- MeetingTranscriptImportRequest
  - `external_id` string, required: Idempotency key from the caller's system
  - `transcript` TranscriptImportSegment[], required: Ordered speaker turns. Timestamps are seconds from recording start
    - `speaker` string, required: Display name of the speaker
    - `text` string, required: Spoken text for this turn
    - `start` number, required: Start offset in seconds from the beginning of the recording
    - `end` number, nullable: End offset in seconds; defaults to `start` when omitted
    - `language` string: BCP-47 language code for this turn
  - `meeting_id` string, uuid, nullable: Monaco meeting id from list_meetings / get_meeting. Strongest match
  - `calendar_event_id` string, nullable: Google Calendar event id (events.id), not iCal UID
  - `ical_uid` string, nullable: iCalendar UID (often looks like event@google.com)
  - `started_at` string, date-time, nullable: When the recording started (ISO 8601). Picks the occurrence when calendar_event_id or ical_uid matches several instances of a recurring meeting

## Response `200`

Successful Response

- PublicItemResponseMeetingTranscriptImportResponse
  - `data` MeetingTranscriptImportResponse, required
    - `transcript_id` string, required: Monaco transcript id
    - `meeting_id` string, required: Monaco meeting the transcript was attached to
    - `external_id` string, required: Idempotency key that was stored
    - `created` boolean, required: True when a new overlay row was written; false on an idempotent retry
  - `meta` ResponseMeta
    - `timestamp` string, date-time: Server timestamp of the response

## Other responses

- `403`: `privacy_blocked`
- `409`: `monaco_recorder_configured`, `transcript_exists`, or `do_not_ingest`
- `410`: `meeting_deleted`
- `422`: `unmatched_meeting`, `ambiguous_meeting`, or `meeting_not_ended`
- `4XX`: Client error

## Changes

- **2026-11-03** `fc720ada2a81`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/monaco/apis/monaco-public-api/changes/v1/meetings/transcripts/post.md)

---

[API](https://skmtc.dev/monaco/apis/monaco-public-api.md) - [All operations](https://skmtc.dev/monaco/apis/monaco-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/monaco/apis/monaco-public-api/revisions/fc720ada2a81?raw)
