--- title: Retrieving meeting transcripts | Lightfield description: List and retrieve meetings, read the transcript relationship, and download the transcript file via the Lightfield API. --- Meetings are first-class objects in the Lightfield API. You can list and retrieve them like any other CRM record, and a retrieved meeting exposes its related data — including the transcript — through the `$transcript` relationship. This guide covers reading meetings and downloading their transcripts. To attach or replace a transcript, see [Uploading meeting transcripts](/using-the-api/uploading-meeting-transcripts/index.md). ## Before you begin You will need: - A valid [API key](/using-the-api/api-keys/index.md) - The `meetings:read` scope to list and retrieve meetings - The `files:read` scope to download the transcript file All requests use these headers: ``` Authorization: Bearer YOUR_API_KEY Lightfield-Version: 2026-03-01 ``` ## List meetings Use [`GET /v1/meetings`](/api/resources/meeting/methods/list/index.md) to fetch a paginated list of meetings. See [List methods](/using-the-api/list-endpoints/index.md) for shared pagination and filtering parameters. Terminal window ``` curl https://api.lightfield.app/v1/meetings \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Lightfield-Version: 2026-03-01" ``` List responses are privacy-filtered per caller. To read the full content of a meeting — including the `$transcript` relationship — retrieve it by ID. ## Retrieve a meeting by ID Use [`GET /v1/meetings/{id}`](/api/resources/meeting/methods/retrieve/index.md) 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 YOUR_API_KEY" \ -H "Lightfield-Version: 2026-03-01" ``` A successful response for a caller with `FULL` access looks like: ``` { "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" } ``` The transcript is a completed File API upload (`fil_...`) exposed through `relationships.$transcript`. Read the file ID from `relationships.$transcript.values`, then download it. `$transcript` is a `HAS_ONE` relationship, so `values` contains at most one file ID. When the caller only has `METADATA` access, `relationships.$transcript` is omitted from the response. See [Transcript visibility](#transcript-visibility) below. ## Download the transcript Read the file ID from `relationships.$transcript.values`, then request a temporary signed download URL with [`GET /v1/files/{id}/url`](/using-the-api/file-uploads/index.md): Terminal window ``` curl https://api.lightfield.app/v1/files/$FILE_ID/url \ -H "Authorization: Bearer YOUR_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" } ``` Fetch the transcript bytes from `url` before `expiresAt`. Request a fresh URL if it expires. ## Transcript visibility Meeting retrieval is privacy-filtered, so whether you see the `$transcript` relationship depends on the caller’s resolved access level: | Access level | What the caller can see | | ------------ | ------------------------------------------------------------------------------------------------------------------------------- | | `FULL` | Full meeting content, including the real title, description, organizer and attendee emails, and the `$transcript` relationship. | | `METADATA` | A metadata-safe view; sensitive fields are redacted and `relationships.$transcript` is omitted. | Admins and meeting participants always get `FULL` access. Other callers receive the meeting’s resolved privacy setting. A transcript can be attached to a meeting even if a particular caller’s `GET /v1/meetings/{id}` response does not show the `$transcript` relationship. For the full access model — including who counts as a participant and how `$privacySetting` differs from `accessLevel` — see [Meeting privacy and transcript visibility](/using-the-api/uploading-meeting-transcripts#meeting-privacy-and-transcript-visibility/index.md). ## End-to-end flow 1. `GET /v1/meetings` to find the meeting, or skip ahead if you already have its ID. 2. `GET /v1/meetings/{id}` and read `relationships.$transcript.values` for the transcript file ID. 3. `GET /v1/files/{id}/url` to get a signed download URL. 4. Fetch the transcript bytes from the returned `url` before it expires. ## Next steps - **[Uploading meeting transcripts](/using-the-api/uploading-meeting-transcripts/index.md)** — Attach or replace a transcript on a meeting. - **[File uploads](/using-the-api/file-uploads/index.md)** — Reference for the file lifecycle and signed download URLs. - **[Fields and relationships](/using-the-api/fields-and-relationships/index.md)** — How relationships like `$transcript` are represented. - **[API Reference](/api/resources/meeting/index.md)** — Full endpoint reference for the meeting resource.