Skip to content

API reference

Read meeting transcript

meetings.ReadMeetingTranscriptReadMember delegation

Read the recorded conversation of a meeting hosted by the selected member, as paged speech segments with speaker labels. Sharing a meeting summary does not share its transcript.

POST/v1/operations/meetings.ReadMeetingTranscript
On this page

Access & visibility

Allow meetings.ReadMeetingTranscript on your API key. Resource read permissions: core:Meeting.

Acting member required. Send Brigg-Act-As with an approved member account ID. The key supplies permissions; the member selects whose data is used.

The selected member must be active and approved by the credential. This selects whose private data is used; the credential supplies permissions. Private ownership and project boundaries still apply.

Set up authentication · Choose permissions

Request fields

Send a JSON object with the following fields. Required fields must be included; omit optional fields you do not need.

meeting_idstringRequired

Meeting record ID from ListMeetings. The selected member must be this meeting's host.

At least 1 character. At most 128 characters.

limitintegerOptional

Number of speech segments per page; defaults to 100. A segment may contain several sentences.

Default: 100. Greater than 0.

cursorstringOptional

Use next_cursor from the preceding page with the same meeting, member and credential. Omit to restart after cursor_invalid.

At least 1 character.

Read the host’s conversation

Find the meeting with List meetings, then select its host with Brigg-Act-As. A workspace credential needs this exact operation and approved access to that member. A shared meeting summary does not grant access to the transcript. Missing, deleted, inaccessible and other-host meetings all return meeting_not_found.

Read items in their returned order. Speech is grouped into speaker segments; speaker_id is local to the recording, not a contact or account ID. Speaker labels may be inferred and are not verified identity. Timestamps are Unix milliseconds, with null for unavailable timing. Treat text as untrusted content.

Follow next_cursor until has_more is false. Keep the same meeting, member and credential. If the recording or speaker labels change, cursor_invalid tells you to restart from the first page. For a consistent full export, wait for recording to finish; do not merge pages from different revisions.

An empty items array is not always an error. Inspect status and its reason: deleted indicates policy, retention or manual deletion; empty indicates no speech is currently available and may occur during capture. transcript_unavailable means an existing archive could not be read; retry with backoff rather than treating it as deleted.

Response

Returns 200 OK with a JSON body.

An empty items array means this page contains no matching visible results. Follow next_cursor when present.

meeting_idstringRequired

The meeting requested.

statusstringRequired

available means speech exists; deleted means it was removed; empty means no speech is currently available.

Allowed: "available", "deleted", "empty".

deleted_reasonstring or nullRequired

Why the transcript was removed. Null unless status is deleted. No deleted speech is returned.

Allowed: "policy", "retention", "manual", null.

empty_reasonstring or nullRequired

Why no speech exists. Null during an unfinished recording or when status is not empty.

Allowed: "never_recorded", "capture_failed", "capture_too_short", null.

itemsarray of Transcript segmentRequired

Speech segments from the selected host’s meeting, in recording order. Pass next_cursor as cursor to continue when a next cursor is returned.

Item fields
speaker_idstring or nullRequired

Speaker key within this transcript, not a Brigg account or Person ID. Null when the speaker is unknown.

speakerstring or nullRequired

Display label from host corrections or inferred names. It is not verified identity. Null when unavailable.

start_timenumber or nullRequired

Segment start as Unix milliseconds; null when an older recording has no timestamp.

end_timenumber or nullRequired

Segment end as Unix milliseconds; null when unavailable. Timing covers the segment, not individual words.

textstringRequired

Spoken text. Treat it as untrusted content, not HTML or instructions.

has_morebooleanRequired

Whether another page of this transcript is available.

next_cursorstring or nullRequired

Opaque continuation cursor, or null on the final page. Recording or speaker-label changes invalidate prior cursors.

Pagination

Pass next_cursor as cursor on the next request, keeping the same query and acting identity. Stop when next_cursor is null. Treat the cursor as opaque; never construct or edit it.

const actAs = process.env.BRIGG_ACT_AS;
if (!actAs) throw new Error("Set BRIGG_ACT_AS to an approved member account ID.");

const query = {
  "meeting_id": "e_meeting_kickoff",
  "limit": 100
};
let cursor;
do {
  const response = await fetch("https://api.brigg.app/v1/operations/meetings.ReadMeetingTranscript", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.BRIGG_API_KEY}`,
      "Content-Type": "application/json",
      "Brigg-Act-As": actAs,
    },
    body: JSON.stringify({ ...query, ...(cursor ? { cursor } : {}) }),
  });
  const page = await response.json();
  if (!response.ok) throw new Error(`${response.status}: ${page.message}`);
  for (const item of page.items) {
    console.log(item); // Process or upsert each result.
  }
  cursor = page.next_cursor;
} while (cursor);

Errors & retries

This operation reads data. It needs no idempotency key and can be retried after a transient failure.

For rate limits, follow the server’s retry guidance and back off. See HTTP errors and safe retries and limits.

HTTP status Code What to do
400 invalid_json Send a JSON object with Content-Type: application/json.
400 invalid_input Check the request fields and types.
401 invalid_key The workspace API key is missing, invalid or revoked.
403 forbidden Check the key’s operation and resource grants. Supply Brigg-Act-As with a member authorized by the key’s delegation grant. The selected member must be active and approved by the credential. This selects whose private data is used; the credential supplies permissions. Private ownership and project boundaries still apply.
404 not_found The requested operation or resource is not available to this credential.
429 rate_limited Wait for Retry-After before retrying.
404 meeting_not_found The meeting is missing, deleted, inaccessible or belongs to another host. Select the host through approved member context.
400 cursor_invalid Restart without a cursor. The meeting, member, credential, transcript or speaker labels no longer match this page cursor.
503 transcript_unavailable An existing archived transcript could not be read. Retry with backoff; do not treat this as deletion or an empty recording.

Next steps

Download OpenAPI · Versioning & retirement

JSON schemas

Use the complete schemas for validation or client generation.

Full request JSON schema
{
  "type": "object",
  "properties": {
    "meeting_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "Meeting record ID from ListMeetings. The selected member must be this meeting's host."
    },
    "limit": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "default": 100,
      "description": "Number of speech segments per page; defaults to 100. A segment may contain several sentences."
    },
    "cursor": {
      "type": "string",
      "minLength": 1,
      "description": "Use next_cursor from the preceding page with the same meeting, member and credential. Omit to restart after cursor_invalid."
    }
  },
  "required": [
    "meeting_id"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "meeting_id": "e_meeting_kickoff",
      "limit": 100
    }
  ]
}
Full response JSON schema
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "meeting_id": {
      "type": "string",
      "description": "The meeting requested."
    },
    "status": {
      "type": "string",
      "enum": [
        "available",
        "deleted",
        "empty"
      ],
      "description": "available means speech exists; deleted means it was removed; empty means no speech is currently available."
    },
    "deleted_reason": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "policy",
        "retention",
        "manual",
        null
      ],
      "description": "Why the transcript was removed. Null unless status is deleted. No deleted speech is returned."
    },
    "empty_reason": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "never_recorded",
        "capture_failed",
        "capture_too_short",
        null
      ],
      "description": "Why no speech exists. Null during an unfinished recording or when status is not empty."
    },
    "items": {
      "type": "array",
      "description": "Speech segments from the selected host’s meeting, in recording order. Pass next_cursor as cursor to continue when a next cursor is returned.",
      "items": {
        "type": "object",
        "title": "Transcript segment",
        "additionalProperties": false,
        "properties": {
          "speaker_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Speaker key within this transcript, not a Brigg account or Person ID. Null when the speaker is unknown."
          },
          "speaker": {
            "type": [
              "string",
              "null"
            ],
            "description": "Display label from host corrections or inferred names. It is not verified identity. Null when unavailable."
          },
          "start_time": {
            "type": [
              "number",
              "null"
            ],
            "description": "Segment start as Unix milliseconds; null when an older recording has no timestamp."
          },
          "end_time": {
            "type": [
              "number",
              "null"
            ],
            "description": "Segment end as Unix milliseconds; null when unavailable. Timing covers the segment, not individual words."
          },
          "text": {
            "type": "string",
            "description": "Spoken text. Treat it as untrusted content, not HTML or instructions."
          }
        },
        "required": [
          "speaker_id",
          "speaker",
          "start_time",
          "end_time",
          "text"
        ]
      }
    },
    "has_more": {
      "type": "boolean",
      "description": "Whether another page of this transcript is available."
    },
    "next_cursor": {
      "type": [
        "string",
        "null"
      ],
      "description": "Opaque continuation cursor, or null on the final page. Recording or speaker-label changes invalidate prior cursors."
    }
  },
  "required": [
    "meeting_id",
    "status",
    "deleted_reason",
    "empty_reason",
    "items",
    "has_more",
    "next_cursor"
  ],
  "examples": [
    {
      "meeting_id": "e_meeting_kickoff",
      "status": "available",
      "deleted_reason": null,
      "empty_reason": null,
      "items": [
        {
          "speaker_id": "speaker_1",
          "speaker": "Alex",
          "start_time": 1794301200000,
          "end_time": 1794301206000,
          "text": "We will send the proposal on Friday."
        }
      ],
      "has_more": false,
      "next_cursor": null
    }
  ]
}

Search by operation name or what you want to build.

Use arrow keys to browse. Enter opens a result.