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· integercursor· stringstart· stringend· stringmember_id· stringteam_id· string · uuid
Response 200
data· array of object · requiredmeeting_id· string · uuid · requiredtitle· string · requiredsource· string · required · recorded: captured by Timeglass. imported: created with the import endpoint. · One of:recorded,importedplatform· string · nullable · requiredteam_id· string · uuid · nullable · requiredstarted_at· string · requiredended_at· string · nullable · requiredduration_minutes· number · nullable · requiredtopics· 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 · requiredtitle· string · requiredsource· string · required · recorded: captured by Timeglass. imported: created with the import endpoint. · One of:recorded,importedplatform· string · nullable · requiredteam_id· string · uuid · nullable · requiredstarted_at· string · requiredended_at· string · nullable · requiredduration_minutes· number · nullable · requiredtopics· string · nullable · requiredparticipants· array of object · requiredmember_id· string · requiredjoined_at· string · nullable · requiredleft_at· string · nullable · requiredduration_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· integercursor· string
Response 200
data· array of object · requiredclock_minute· string · requiredtranscript· 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 · requiredstarted_at· string · timestamp · requiredended_at· string · timestamp · requiredexternal_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,unknownteam_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· stringemail· string
report· object · The meeting report, as written by the source tool. Timeglass does not generate one for imports.markdown· string · requiredaction_items· array of objecttext· string · requiredowner· stringdue· stringat_seconds· number · Where it came up, in seconds after started_at.
chapters· array of objecttitle· string · requiredstart_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 · requiredspeaker· 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 · requiredstart_seconds· number · requiredend_seconds· number · required
Response 201
meeting· object · requiredmeeting_id· string · uuid · requiredexternal_id· string · nullable · requiredimported_from· string · nullable · requiredtitle· string · requiredplatform· string · requiredteam_id· string · uuid · nullable · requiredstarted_at· string · requiredended_at· string · requiredduration_minutes· number · requiredattendees· array of object · requiredname· string · nullable · requiredemail· string · nullable · requiredmember_id· string · nullable · required · Set when the attendee is a workspace member.
has_report· boolean · requiredtranscript· object · nullable · requiredtiming· string · required · One of:untimed,timed,word_timedsegment_count· number · requiredspeaker_count· number · required
media· array of object · requiredmedia_id· string · uuid · requiredkind· string · required · One of:audio,videostatus· string · required · ready once the upload is confirmed with the complete endpoint. · One of:awaiting_upload,readycontent_type· string · requiredfile_name· string · nullable · requiredbyte_size· number · nullable · requiredduration_ms· number · nullable · requiredoffset_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 · requiredmeeting_id· string · uuid · requiredexternal_id· string · nullable · requiredimported_from· string · nullable · requiredtitle· string · requiredplatform· string · requiredteam_id· string · uuid · nullable · requiredstarted_at· string · requiredended_at· string · requiredduration_minutes· number · requiredattendees· array of object · requiredname· string · nullable · requiredemail· string · nullable · requiredmember_id· string · nullable · required · Set when the attendee is a workspace member.
has_report· boolean · requiredtranscript· object · nullable · requiredtiming· string · required · One of:untimed,timed,word_timedsegment_count· number · requiredspeaker_count· number · required
media· array of object · requiredmedia_id· string · uuid · requiredkind· string · required · One of:audio,videostatus· string · required · ready once the upload is confirmed with the complete endpoint. · One of:awaiting_upload,readycontent_type· string · requiredfile_name· string · nullable · requiredbyte_size· number · nullable · requiredduration_ms· number · nullable · requiredoffset_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· stringended_at· string · timestampexternal_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,unknownteam_id· string · uuid · nullableattendees· array of object · Replaces the attendee list. Speakers who are members stay participants, and other speakers with an email stay outside attendees.name· stringemail· string
report· object · nullable · Replaces the report; null removes it.markdown· string · requiredaction_items· array of objecttext· string · requiredowner· stringdue· stringat_seconds· number · Where it came up, in seconds after started_at.
chapters· array of objecttitle· string · requiredstart_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 · requiredspeaker· 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 · requiredstart_seconds· number · requiredend_seconds· number · required
Response 200
meeting· object · requiredmeeting_id· string · uuid · requiredexternal_id· string · nullable · requiredimported_from· string · nullable · requiredtitle· string · requiredplatform· string · requiredteam_id· string · uuid · nullable · requiredstarted_at· string · requiredended_at· string · requiredduration_minutes· number · requiredattendees· array of object · requiredname· string · nullable · requiredemail· string · nullable · requiredmember_id· string · nullable · required · Set when the attendee is a workspace member.
has_report· boolean · requiredtranscript· object · nullable · requiredtiming· string · required · One of:untimed,timed,word_timedsegment_count· number · requiredspeaker_count· number · required
media· array of object · requiredmedia_id· string · uuid · requiredkind· string · required · One of:audio,videostatus· string · required · ready once the upload is confirmed with the complete endpoint. · One of:awaiting_upload,readycontent_type· string · requiredfile_name· string · nullable · requiredbyte_size· number · nullable · requiredduration_ms· number · nullable · requiredoffset_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,videocontent_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· stringoffset_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 · requiredmedia_id· string · uuid · requiredkind· string · required · One of:audio,videostatus· string · required · ready once the upload is confirmed with the complete endpoint. · One of:awaiting_upload,readycontent_type· string · requiredfile_name· string · nullable · requiredbyte_size· number · nullable · requiredduration_ms· number · nullable · requiredoffset_ms· number · required · Where the file starts, in ms after started_at.
upload· object · requiredurl· string · requiredmethod· string · required · One of:PUTheaders· object · required · Send these headers exactly as given; they are part of the signature.expires_at· string · requiredmax_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 · requiredmediaId· string · uuid · required
Request body
duration_ms· integeroffset_ms· integer
Response 200
media· object · requiredmedia_id· string · uuid · requiredkind· string · required · One of:audio,videostatus· string · required · ready once the upload is confirmed with the complete endpoint. · One of:awaiting_upload,readycontent_type· string · requiredfile_name· string · nullable · requiredbyte_size· number · nullable · requiredduration_ms· number · nullable · requiredoffset_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 · requiredmediaId· string · uuid · required
Response 200
url· string · requiredfilename· string · requiredexpires_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 · requiredmediaId· 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"