Retrieving meeting transcripts
Read a meeting's recordings and transcripts through the Lightfield API, play their audio or video, and download transcript files.
A meeting can have several recordings, from Lightfield’s recorder, Gong, Granola and uploads. Each has a transcript and, when there is one, audio or video. One of them is the meeting’s canonical transcript, the one its summary uses.
| You want | Use |
|---|---|
| Every recording on a meeting, with its source | GET /v1/meetings/{id}/recordings |
| A recording’s audio or video | GET /v1/meetings/{id}/recordings/{recordingId} |
| The canonical transcript, or all transcript files on a meeting | The meeting’s $transcript and $transcripts relationships |
Either way, you download transcript text with a signed file URL. To upload a recording, see Uploading meeting recordings.
Before you begin
Section titled “Before you begin”You will need:
- A valid API key
- The
meetings:readscope to list and retrieve meetings and their recordings - The
files:readscope to download transcript files
All requests use these headers:
Authorization: Bearer $LIGHTFIELD_API_KEYLightfield-Version: 2026-03-01List meetings
Section titled “List meetings”Use GET /v1/meetings to fetch a paginated list of meetings. See List methods for shared pagination and filtering parameters.
curl https://api.lightfield.app/v1/meetings \ -H "Authorization: Bearer $LIGHTFIELD_API_KEY" \ -H "Lightfield-Version: 2026-03-01"Each listed meeting is privacy-filtered for the caller and includes a read-only accessLevel. A meeting is listed only when it’s internal-only or linked to an account or an active contact. That rule applies to every caller, including admins and workspace API keys. This guide reads transcripts from a single meeting, retrieved by ID.
Retrieve a meeting by ID
Section titled “Retrieve a meeting by ID”Use GET /v1/meetings/{id} to fetch a single meeting with its fields and relationships. When the caller has FULL access, the response includes the $transcript relationship pointing at the transcript file.
curl https://api.lightfield.app/v1/meetings/$MEETING_ID \ -H "Authorization: Bearer $LIGHTFIELD_API_KEY" \ -H "Lightfield-Version: 2026-03-01"This response excerpt shows the canonical transcript for a caller with FULL access:
{ "id": "mtg_abc123", "objectType": "meeting", "createdAt": "2026-04-07T21:00:00.000Z", "updatedAt": "2026-04-07T21:50:00.000Z", "fields": { "$title": { "valueType": "TEXT", "value": "Customer Call" }, "$startDate": { "valueType": "DATETIME", "value": "2026-04-07T21:00:00.000Z" }, "$endDate": { "valueType": "DATETIME", "value": "2026-04-07T21:45:00.000Z" }, "$organizerEmail": { "valueType": "EMAIL", "value": "alex@acme.com" }, "$attendeeEmails": { "valueType": "EMAIL", "value": ["alex@acme.com", "jamie@example.com"] }, "$privacySetting": { "valueType": "TEXT", "value": "FULL" } }, "relationships": { "$transcript": { "cardinality": "HAS_ONE", "objectType": "file", "values": ["fil_abc123"] } }, "accessLevel": "FULL"}Read the canonical file ID from relationships.$transcript.values. To download another source, use a file ID from relationships.$transcripts.values. Pass that ID to the File API.
Download the transcript
Section titled “Download the transcript”Read the file ID from relationships.$transcript.values, then request a temporary signed download URL with GET /v1/files/{id}/url:
curl https://api.lightfield.app/v1/files/$FILE_ID/url \ -H "Authorization: Bearer $LIGHTFIELD_API_KEY" \ -H "Lightfield-Version: 2026-03-01"A successful response returns a signed URL and its expiry:
{ "url": "https://...", "expiresAt": "2026-04-07T22:00:00.000Z"}Set DOWNLOAD_URL to the returned url, then fetch the bytes before expiresAt without Lightfield authentication headers:
curl "$DOWNLOAD_URL" -o transcript.txtRequest a fresh URL if it expires.
List a meeting’s recordings
Section titled “List a meeting’s recordings”List the recordings to see every source a meeting has a transcript from. The list doesn’t include audio or video links.
curl https://api.lightfield.app/v1/meetings/$MEETING_ID/recordings \ -H "Authorization: Bearer $LIGHTFIELD_API_KEY" \ -H "Lightfield-Version: 2026-03-01"{ "object": "list", "data": [ { "id": "rec_abc123", "provider": "RECALL", "recordedAt": "2026-04-07T21:01:12.000Z", "recordedBy": null, "isCanonical": true, "transcript": { "fileId": "fil_abc123" } }, { "id": "rec_def456", "provider": "UPLOAD", "recordedAt": null, "recordedBy": "Alex Rivera", "isCanonical": false, "transcript": { "fileId": "fil_def456" } } ]}provider is the source: RECALL for Lightfield’s recorder, GONG, GRANOLA or UPLOAD. isCanonical marks the canonical transcript. Download a recording’s transcript by passing transcript.fileId to GET /v1/files/{id}/url; it’s null on some older recordings from Lightfield’s recorder.
Play or download audio or video
Section titled “Play or download audio or video”Retrieve a recording to get a short-lived link to its audio or video in media.url:
curl https://api.lightfield.app/v1/meetings/$MEETING_ID/recordings/$RECORDING_ID \ -H "Authorization: Bearer $LIGHTFIELD_API_KEY" \ -H "Lightfield-Version: 2026-03-01"{ "id": "rec_def456", "provider": "UPLOAD", "recordedAt": null, "recordedBy": "Alex Rivera", "isCanonical": false, "transcript": { "fileId": "fil_def456" }, "media": { "url": "https://...", "mimeType": "video/mp4" }}media is always that recording’s own audio or video, never another recording’s on the same meeting. It’s null when the recording has none, such as a Granola note, a private Gong call, a recording from Lightfield’s recorder that failed, or an upload without audio or video.
Meeting privacy and transcript visibility
Section titled “Meeting privacy and transcript visibility”fields.$privacySetting is the visibility set on the meeting itself: FULL, METADATA, or null when nobody has set one. When it’s null, Lightfield resolves visibility from the connected accounts of the meeting’s calendar events and attendees. accessLevel is the visibility resolved for the caller. A workspace owner or a meeting participant receives accessLevel: "FULL" even when $privacySetting is METADATA. See meeting visibility in Help for the product rules.
To decide whether the caller is a workspace owner, Lightfield checks the role behind the API key. A workspace API key uses the role its creator had when the key was created. A user API key, or an older workspace key without a recorded role, uses the member’s current role.
With FULL access, the caller can read the meeting content, its transcript relationships and its recordings. With METADATA access, sensitive content is redacted, relationships.$transcript, relationships.$transcripts, relationships.$note, relationships.$account and relationships.$opportunity are omitted, and the recordings endpoints return a 403. The title is replaced with a metadata-safe title; description, meeting URL, meeting prep and summary are null.
Check accessLevel before interpreting a missing transcript. An omitted relationship in a metadata-only response does not show that an upload failed. When you have full access, check whether the transcript relationship has a file ID before requesting a download URL.
Read access does not grant permission to change a meeting. For attachment and update requirements, follow Uploading meeting recordings.
Next steps
Section titled “Next steps”- Uploading meeting recordings: upload a transcript, with its audio or video, to a meeting.
- File uploads: reference for the file lifecycle and signed download URLs.
- Fields and relationships: how relationships like
$transcriptare represented. - API Reference: full endpoint reference for the meeting resource.
Related documentation
Section titled “Related documentation”- In the app: meetings and transcript sources.
- Endpoint contracts: list recordings, retrieve a recording, retrieve a meeting and get a file URL.