Skip to content
Files, email and meetings

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 wantUse
Every recording on a meeting, with its sourceGET /v1/meetings/{id}/recordings
A recording’s audio or videoGET /v1/meetings/{id}/recordings/{recordingId}
The canonical transcript, or all transcript files on a meetingThe 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.

You will need:

  • A valid API key
  • The meetings:read scope to list and retrieve meetings and their recordings
  • The files:read scope to download transcript files

All requests use these headers:

Authorization: Bearer $LIGHTFIELD_API_KEY
Lightfield-Version: 2026-03-01

Use GET /v1/meetings to fetch a paginated list of meetings. See List methods for shared pagination and filtering parameters.

Terminal window
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.

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.

Terminal window
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.

Read the file ID from relationships.$transcript.values, then request a temporary signed download URL with GET /v1/files/{id}/url:

Terminal window
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:

Terminal window
curl "$DOWNLOAD_URL" -o transcript.txt

Request a fresh URL if it expires.

List the recordings to see every source a meeting has a transcript from. The list doesn’t include audio or video links.

Terminal window
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.

Retrieve a recording to get a short-lived link to its audio or video in media.url:

Terminal window
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.

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.