Meetings · Timeglass API

Meetings, participants, and per-minute transcripts. Import meetings from other tools, with their reports, transcripts, and audio or video.

List Meetings

GET /v1/meetings

Query parameters

  • limit · integer
  • cursor · string
  • start · string
  • end · string
  • member_id · string
  • team_id · string · uuid

Response 200

  • data · array of object · required
    • meeting_id · string · uuid · required
    • title · string · required
    • source · string · required · recorded: captured by Timeglass. imported: created with the import endpoint. · One of: recorded, imported
    • platform · string · nullable · required
    • team_id · string · uuid · nullable · required
    • started_at · string · required
    • ended_at · string · nullable · required
    • duration_minutes · number · nullable · required
    • topics · string · nullable · required
  • next_cursor · string · nullable · required
curl "https://api.timeglass.ai/v1/meetings" \
  -H "Authorization: Bearer $TIMEGLASS_API_KEY"

Get a Meeting with Participants

GET /v1/meetings/{meetingId}

Path parameters

  • meetingId · string · uuid · required

Response 200

  • meeting_id · string · uuid · required
  • title · string · required
  • source · string · required · recorded: captured by Timeglass. imported: created with the import endpoint. · One of: recorded, imported
  • platform · string · nullable · required
  • team_id · string · uuid · nullable · required
  • started_at · string · required
  • ended_at · string · nullable · required
  • duration_minutes · number · nullable · required
  • topics · string · nullable · required
  • participants · array of object · required
    • member_id · string · required
    • joined_at · string · nullable · required
    • left_at · string · nullable · required
    • duration_minutes · number · nullable · required
curl "https://api.timeglass.ai/v1/meetings/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10" \
  -H "Authorization: Bearer $TIMEGLASS_API_KEY"

Get a Meeting Transcript

GET /v1/meetings/{meetingId}/transcript

Transcript segments, one per minute of the meeting. Paginate with limit/cursor.

Path parameters

  • meetingId · string · uuid · required

Query parameters

  • limit · integer
  • cursor · string

Response 200

  • data · array of object · required
    • clock_minute · string · required
    • transcript · string · nullable · required
  • next_cursor · string · nullable · required
curl "https://api.timeglass.ai/v1/meetings/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10/transcript" \
  -H "Authorization: Bearer $TIMEGLASS_API_KEY"

Import a Meeting

POST /v1/meetings/imports

Requires a key with the read_write scope.

Creates a meeting from another tool. Only the title and times are required; add a report, a transcript and attendees as you have them. Send the transcript as segments (with or without word timings), or send the transcript file the tool exported (WebVTT, SRT or text) as transcript.file and Timeglass reads the speaker turns from it; a file it can't read fails with invalid_transcript_file. To attach an audio or video file, request an upload URL with the media endpoint. You can also send multipart/form-data, to upload files as exported: a `meeting` part with the JSON body (without transcript or report; required), a `transcript` file (.vtt, .srt, .txt, .md or .docx), a `notes` file (.md, .txt or .docx) that becomes the report, and an optional `transcript_options` JSON part ({ format, offset_seconds, speaker_emails }, as in transcript.file). Files can be up to 5 MB (413 when larger). Other parts, or other file types, are refused with 400 (unknown_form_part, unsupported_file_type); a transcript that can't be read with 400 invalid_transcript_file, and a form without a meeting part with 400 missing_meeting_part. Audio and video are not sent this way (requests are capped at 32 MB): upload them with the media endpoint. ```sh curl https://api.timeglass.ai/v1/meetings/imports \ -H "Authorization: Bearer tg_live_…" \ -F meeting='{"title":"Globex QBR","started_at":"2026-10-20T14:00:00Z","ended_at":"2026-10-20T14:45:00Z"}' \ -F transcript=@"Globex QBR.vtt" \ -F notes=@"Globex QBR summary.docx" ```

Request body

  • title · string · required
  • started_at · string · timestamp · required
  • ended_at · string · timestamp · required
  • external_id · string · Your own id for this meeting, such as its id in the source tool. Unique in the workspace.
  • imported_from · string · The tool the meeting comes from, e.g. "zoom", "gong" or "fireflies".
  • platform · string · Where the meeting took place. · One of: zoom, google_meet, teams, webex, slack, in_person, phone, unknown
  • team_id · string · uuid · Defaults to the home team of the first attendee who is a workspace member.
  • attendees · array of object · Attendees whose email matches a workspace member are added as participants: the meeting shows on their timeline and they can open it. Others are listed as outside attendees, and become participants automatically if they join the workspace later.
    • name · string
    • email · string
  • report · object · The meeting report, as written by the source tool. Timeglass does not generate one for imports.
    • markdown · string · required
    • action_items · array of object
      • text · string · required
      • owner · string
      • due · string
      • at_seconds · number · Where it came up, in seconds after started_at.
    • chapters · array of object
      • title · string · required
      • start_seconds · number · required · Seconds after started_at.
      • summary · string
  • transcript · object · Speaker turns in order. Times are optional, but either every segment has them (start_seconds and end_seconds, or words) or none does.
    • segments · array of object · required
      • speaker · string · Speaker name as the source tool shows it.
      • speaker_email · string · Links the speaker to the workspace member with this email, who is then a participant. A speaker who is not a member is listed as an outside attendee, and linked automatically if they join the workspace later.
      • start_seconds · number · Seconds after started_at.
      • end_seconds · number · Seconds after started_at.
      • text · string · Required unless words are given; with words, the text is built from them.
      • words · array of object · Word-level timings, in seconds after started_at.
        • text · string · required
        • start_seconds · number · required
        • end_seconds · number · required

Response 201

  • meeting · object · required
    • meeting_id · string · uuid · required
    • external_id · string · nullable · required
    • imported_from · string · nullable · required
    • title · string · required
    • platform · string · required
    • team_id · string · uuid · nullable · required
    • started_at · string · required
    • ended_at · string · required
    • duration_minutes · number · required
    • attendees · array of object · required
      • name · string · nullable · required
      • email · string · nullable · required
      • member_id · string · nullable · required · Set when the attendee is a workspace member.
    • has_report · boolean · required
    • transcript · object · nullable · required
      • timing · string · required · One of: untimed, timed, word_timed
      • segment_count · number · required
      • speaker_count · number · required
    • media · array of object · required
      • media_id · string · uuid · required
      • kind · string · required · One of: audio, video
      • status · string · required · ready once the upload is confirmed with the complete endpoint. · One of: awaiting_upload, ready
      • content_type · string · required
      • file_name · string · nullable · required
      • byte_size · number · nullable · required
      • duration_ms · number · nullable · required
      • offset_ms · number · required · Where the file starts, in ms after started_at.
curl -X POST "https://api.timeglass.ai/v1/meetings/imports" \
  -H "Authorization: Bearer $TIMEGLASS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Aviation account expansion",
    "started_at": "string",
    "ended_at": "string"
  }'

Get an Imported Meeting

GET /v1/meetings/imports/{meetingId}

What an imported meeting has: attendees, report, transcript and media.

Path parameters

  • meetingId · string · uuid · required

Response 200

  • meeting · object · required
    • meeting_id · string · uuid · required
    • external_id · string · nullable · required
    • imported_from · string · nullable · required
    • title · string · required
    • platform · string · required
    • team_id · string · uuid · nullable · required
    • started_at · string · required
    • ended_at · string · required
    • duration_minutes · number · required
    • attendees · array of object · required
      • name · string · nullable · required
      • email · string · nullable · required
      • member_id · string · nullable · required · Set when the attendee is a workspace member.
    • has_report · boolean · required
    • transcript · object · nullable · required
      • timing · string · required · One of: untimed, timed, word_timed
      • segment_count · number · required
      • speaker_count · number · required
    • media · array of object · required
      • media_id · string · uuid · required
      • kind · string · required · One of: audio, video
      • status · string · required · ready once the upload is confirmed with the complete endpoint. · One of: awaiting_upload, ready
      • content_type · string · required
      • file_name · string · nullable · required
      • byte_size · number · nullable · required
      • duration_ms · number · nullable · required
      • offset_ms · number · required · Where the file starts, in ms after started_at.
curl "https://api.timeglass.ai/v1/meetings/imports/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10" \
  -H "Authorization: Bearer $TIMEGLASS_API_KEY"

Update an Imported Meeting

PATCH /v1/meetings/imports/{meetingId}

Requires a key with the read_write scope.

Changes the fields you send. Attendees, report and transcript are replaced whole; the transcript can be sent as segments or as a transcript file (WebVTT, SRT or text). started_at cannot change, since transcript and report times count from it: delete the meeting and import it again instead. You can also send multipart/form-data, to upload files as exported: a `meeting` part with the JSON body (without transcript or report; optional), a `transcript` file (.vtt, .srt, .txt, .md or .docx), a `notes` file (.md, .txt or .docx) that becomes the report, and an optional `transcript_options` JSON part ({ format, offset_seconds, speaker_emails }, as in transcript.file). Files can be up to 5 MB (413 when larger). Other parts, or other file types, are refused with 400 (unknown_form_part, unsupported_file_type); a transcript that can't be read with 400 invalid_transcript_file. Audio and video are not sent this way (requests are capped at 32 MB): upload them with the media endpoint. ```sh curl https://api.timeglass.ai/v1/meetings/imports/{meetingId} -X PATCH \ -H "Authorization: Bearer tg_live_…" \ -F transcript=@"Globex QBR.vtt" \ -F notes=@"Globex QBR summary.docx" ```

Path parameters

  • meetingId · string · uuid · required

Request body

  • started_at · any · Cannot change: delete the meeting and import it again.
  • title · string
  • ended_at · string · timestamp
  • external_id · string · nullable · Your own id for this meeting, such as its id in the source tool. Unique in the workspace.
  • imported_from · string · nullable · The tool the meeting comes from, e.g. "zoom", "gong" or "fireflies".
  • platform · string · One of: zoom, google_meet, teams, webex, slack, in_person, phone, unknown
  • team_id · string · uuid · nullable
  • attendees · array of object · Replaces the attendee list. Speakers who are members stay participants, and other speakers with an email stay outside attendees.
    • name · string
    • email · string
  • report · object · nullable · Replaces the report; null removes it.
    • markdown · string · required
    • action_items · array of object
      • text · string · required
      • owner · string
      • due · string
      • at_seconds · number · Where it came up, in seconds after started_at.
    • chapters · array of object
      • title · string · required
      • start_seconds · number · required · Seconds after started_at.
      • summary · string
  • transcript · object · nullable · Speaker turns in order. Times are optional, but either every segment has them (start_seconds and end_seconds, or words) or none does.
    • segments · array of object · required
      • speaker · string · Speaker name as the source tool shows it.
      • speaker_email · string · Links the speaker to the workspace member with this email, who is then a participant. A speaker who is not a member is listed as an outside attendee, and linked automatically if they join the workspace later.
      • start_seconds · number · Seconds after started_at.
      • end_seconds · number · Seconds after started_at.
      • text · string · Required unless words are given; with words, the text is built from them.
      • words · array of object · Word-level timings, in seconds after started_at.
        • text · string · required
        • start_seconds · number · required
        • end_seconds · number · required

Response 200

  • meeting · object · required
    • meeting_id · string · uuid · required
    • external_id · string · nullable · required
    • imported_from · string · nullable · required
    • title · string · required
    • platform · string · required
    • team_id · string · uuid · nullable · required
    • started_at · string · required
    • ended_at · string · required
    • duration_minutes · number · required
    • attendees · array of object · required
      • name · string · nullable · required
      • email · string · nullable · required
      • member_id · string · nullable · required · Set when the attendee is a workspace member.
    • has_report · boolean · required
    • transcript · object · nullable · required
      • timing · string · required · One of: untimed, timed, word_timed
      • segment_count · number · required
      • speaker_count · number · required
    • media · array of object · required
      • media_id · string · uuid · required
      • kind · string · required · One of: audio, video
      • status · string · required · ready once the upload is confirmed with the complete endpoint. · One of: awaiting_upload, ready
      • content_type · string · required
      • file_name · string · nullable · required
      • byte_size · number · nullable · required
      • duration_ms · number · nullable · required
      • offset_ms · number · required · Where the file starts, in ms after started_at.
curl -X PATCH "https://api.timeglass.ai/v1/meetings/imports/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10" \
  -H "Authorization: Bearer $TIMEGLASS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Delete an Imported Meeting

DELETE /v1/meetings/imports/{meetingId}

Requires a key with the read_write scope.

Deletes the meeting with its transcript, report and media files.

Path parameters

  • meetingId · string · uuid · required
curl -X DELETE "https://api.timeglass.ai/v1/meetings/imports/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10" \
  -H "Authorization: Bearer $TIMEGLASS_API_KEY"

Upload Audio or Video for an Imported Meeting

POST /v1/meetings/imports/{meetingId}/media

Requires a key with the read_write scope.

Returns a URL to PUT the file to, with the headers to send. Then confirm the upload with the complete endpoint. The file is stored and played as uploaded, so use a format browsers play (MP4, M4A, MP3, WebM). A meeting has at most one file of each kind: a new upload replaces the earlier one.

Path parameters

  • meetingId · string · uuid · required

Request body

  • kind · string · required · One of: audio, video
  • content_type · string · required · One of: audio/mpeg, audio/mp3, audio/mp4, audio/x-m4a, audio/m4a, audio/aac, audio/wav, audio/x-wav, audio/wave, audio/webm, video/mp4, video/webm.
  • file_name · string
  • offset_ms · integer · Where the file starts, in ms after started_at (negative if before).
  • duration_ms · integer · The file's length. Optional: the player reads it from the file.

Response 201

  • media · object · required
    • media_id · string · uuid · required
    • kind · string · required · One of: audio, video
    • status · string · required · ready once the upload is confirmed with the complete endpoint. · One of: awaiting_upload, ready
    • content_type · string · required
    • file_name · string · nullable · required
    • byte_size · number · nullable · required
    • duration_ms · number · nullable · required
    • offset_ms · number · required · Where the file starts, in ms after started_at.
  • upload · object · required
    • url · string · required
    • method · string · required · One of: PUT
    • headers · object · required · Send these headers exactly as given; they are part of the signature.
    • expires_at · string · required
    • max_bytes · number · required
curl -X POST "https://api.timeglass.ai/v1/meetings/imports/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10/media" \
  -H "Authorization: Bearer $TIMEGLASS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "audio",
    "content_type": "string"
  }'

Confirm a Media Upload

POST /v1/meetings/imports/{meetingId}/media/{mediaId}/complete

Requires a key with the read_write scope.

Call after the PUT succeeds; send {} if you have nothing to add. The file then plays in the meeting.

Path parameters

  • meetingId · string · uuid · required
  • mediaId · string · uuid · required

Request body

  • duration_ms · integer
  • offset_ms · integer

Response 200

  • media · object · required
    • media_id · string · uuid · required
    • kind · string · required · One of: audio, video
    • status · string · required · ready once the upload is confirmed with the complete endpoint. · One of: awaiting_upload, ready
    • content_type · string · required
    • file_name · string · nullable · required
    • byte_size · number · nullable · required
    • duration_ms · number · nullable · required
    • offset_ms · number · required · Where the file starts, in ms after started_at.
curl -X POST "https://api.timeglass.ai/v1/meetings/imports/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10/media/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10/complete" \
  -H "Authorization: Bearer $TIMEGLASS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Download an Imported Meeting’s Media File

GET /v1/meetings/imports/{meetingId}/media/{mediaId}/download

Returns a link to the file as it was uploaded, valid for 15 minutes, that saves it under the meeting’s title and date.

Path parameters

  • meetingId · string · uuid · required
  • mediaId · string · uuid · required

Response 200

  • url · string · required
  • filename · string · required
  • expires_at · string · required
curl "https://api.timeglass.ai/v1/meetings/imports/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10/media/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10/download" \
  -H "Authorization: Bearer $TIMEGLASS_API_KEY"

Delete an Imported Meeting’s Media File

DELETE /v1/meetings/imports/{meetingId}/media/{mediaId}

Requires a key with the read_write scope.

Path parameters

  • meetingId · string · uuid · required
  • mediaId · string · uuid · required
curl -X DELETE "https://api.timeglass.ai/v1/meetings/imports/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10/media/4bfe4a4b-c86b-4b8e-b3f5-3d1c4a2e9f10" \
  -H "Authorization: Bearer $TIMEGLASS_API_KEY"