# Changelog Source: https://docs.fireflies.ai/additional-info/change-log Recent updates to the Fireflies API ## Overview This document maintains a chronologically ordered list of notable changes for each version of the Fireflies API. It's designed to make it easier for you to keep track of new features, improvements, and bug fixes. ### 2.34.0 > [card] > > [createUploadUrl](/graphql-api/mutation/create-upload-url) takes an optional `upload_method` input, of the new [UploadMethod](/schema/upload-url-response#uploadmethod) enum. With `POST` (recommended), it returns a size-limited signed form: upload the file to `upload_url` with an HTTP multipart form `POST`, sending every entry of the new `upload_fields` field (`name` and `value` pairs of the new [UploadFormField](/schema/upload-url-response#uploadformfield) type) as a form field, then the file last, as the field named `file`. The form carries the size limit for the file type (400 MB for audio, 2 GB for video), and storage refuses a larger file. Without `upload_method`, or with `PUT`, nothing changes: `upload_url` is a signed URL for an HTTP `PUT` of the file, as before, and `upload_fields` is empty. The response also has the new `upload_method` field, the method to upload with. The MCP tool `fireflies_create_upload_url` asks for `POST` and returns the form fields and a `curl` command that sends them. See [Uploading the File](/graphql-api/mutation/create-upload-url#uploading-the-file). ### 2.33.0 > [card] > > `deleteTranscript` on a meeting with more than one owner: the mutation now decides whether to > delete it for everyone or only remove it from the caller's account. It deletes for everyone when > the caller is the host or organizer, a team admin acting for the host, or the last remaining > owner. Any other co-owner's call only removes it from their account, and the other owners keep it. > The response is the same `Transcript` either way, so it doesn't say which happened. The > `MEETING_DELETED` [audit event](/graphql-api/query/audit-events) records which one in its > `deleteMode` metadata: `deleted` or `removed`. Deleting a co-owned meeting for everyone requires > team delete permission, unless the caller owns the meeting or is its last remaining owner. ### 2.32.0 > [card] > > The [confirmUpload](/graphql-api/mutation/confirm-upload) mutation now returns `url`, the link to the meeting in Fireflies. It opens right away, and the transcript appears there once processing finishes. The MCP tool `fireflies_confirm_upload` returns it too. ### 2.31.1 > [card] > > [revokeSharedMeetingAccess](/graphql-api/mutation/revoke-shared-meeting-access) now returns `object_not_found` (Transcript) instead of an internal server error when you are not allowed to revoke shared access on the meeting. ### 2.31.0 > [card] > > [Webhooks V2](/graphql-api/webhooks-v2) can resend `meeting.transcribed` and `meeting.summarized` when a meeting that was already delivered gets a new transcript or summary, for example after reprocessing, a language change, regenerating notes or applying a refined summary. Turn on **Resend when a meeting's notes change** on the webhook setup page; it is off by default. Resent payloads include a new `reprocessed_at` field (Unix milliseconds of the change), which stays the same across retries and increases with each later change, so you can replace your stored copy when it is newer. First deliveries are unchanged. See [Resends After a Meeting Changes](/graphql-api/webhooks-v2#resends-after-a-meeting-changes). ### 2.30.0 > [card] > > The [createBite](/graphql-api/mutation/create-bite) mutation now accepts `transcript_id`, the name its documentation has always used. Until now the schema only accepted `transcript_Id` (capital `I`), so a request written from the docs failed with `Unknown argument "transcript_id"`. `transcript_Id` keeps working and is [deprecated](/additional-info/deprecated); sending both with different values is rejected. Documentation corrections: `createBite`'s `privacies` is `[BitePrivacy!]`; the [transcripts](/graphql-api/query/transcripts) `scope` argument is a `String` (one of `title`, `sentences`, `all`) and the example declares `organizers` and `participants` as `[String!]`, the type the schema expects; and [AskFredMessage](/graphql-api/query/askfred-thread) has no `error` field. ### 2.29.0 > [card] > > Added an optional `meeting_date` field (ISO 8601 `String`) to [CreateUploadUrlInput](/schema/input/create-upload-url-input) on the [createUploadUrl](/graphql-api/mutation/create-upload-url) mutation, matching `uploadAudio`. Direct uploads are dated with the actual meeting start time instead of the upload time. It must not be in the future; when omitted, the upload time is used as before. The `attendees` passed to `createUploadUrl` are now also saved on the meeting. ### 2.28.0 > [card] > > Raised the API rate limits and made them observable. **Free** moves from 50 to **500 requests per day** with a **30 requests per minute** burst limit; **Pro** moves from 500 to **5,000 requests per day** with **60 requests per minute**. Daily quotas still reset at midnight UTC. **Business** and **Enterprise** keep 60 requests per minute with no daily cap, now **pooled across the team at 60 requests per minute per paid seat** (up to 1,200 per minute on Business, 2,400 on Enterprise), so one integration can use most of the team's budget while no single user can take more than half of it (rounded up, and never less than their own 60 per minute); the Add to Live limit pools the same way (3 per paid seat per 20 minutes, up to 60). A paid seat is a seat on your subscription (or a billed member, if you have more of those); free seats such as campaign invites and internal accounts do not add to the team's budget. New **Free** API users get **Pro limits for their first 14 days**. Every response checked by the general API limiter now carries standard `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` headers (an allowed `addToLiveMeeting` response, metered by its own window, carries the suffixed `X-RateLimit-*-call_join` headers instead), and a `429` carries `Retry-After` in seconds; the MCP server's `-32429` error carries the same header. The MCP server shares all of these limits. See [Limits](/fundamentals/limits) for details. ### 2.27.1 > [card] > > The `audio_url` and `video_url` fields of [Transcript](/schema/transcript) are available on the **Pro** plan and above; they previously required Business or Enterprise. Shipped in July 2026 and recorded here retroactively. ### 2.27.0 > [card] > > Added an optional `meeting_date` field (ISO 8601 `String`) to [AudioUploadInput](/schema/input/audio-upload-input) on the [uploadAudio](/graphql-api/mutation/upload-audio) mutation. Use it when importing historical recordings so the meeting is dated with the actual meeting start time instead of the upload time. It must not be in the future; when omitted, the upload time is used as before. ### 2.26.2 > [card] > > Marked the `participatingteammates` value of [MeetingPrivacy](/schema/enum/meeting-privacy) as **beta**. It can be set via the [updateMeetingPrivacy](/graphql-api/mutation/update-meeting-privacy) mutation and the MCP `fireflies_update_meeting_privacy` tool, but is not yet available in the Fireflies dashboard. No behavior change. ### 2.26.1 > [card] > > Increased the [shareMeeting](/graphql-api/mutation/share-meeting) mutation rate limit from 10 to 60 requests per hour per user. The general API rate limits and the 50-email-per-request cap are unchanged. See [Limits](/fundamentals/limits) for details. ### 2.26.0 > [card] > > Documented password-protected sharing on the [shareMeeting](/graphql-api/mutation/share-meeting) mutation (**beta**). Set `share_type` to `PASSWORD_LINK` with a `password` to create a link that guests can open without a Fireflies account, and use the returned `share_slug` to build the link. See [ShareMeetingType](/schema/enum/share-meeting-type). ### 2.25.1 > [card] > > The [uploadAudio](/graphql-api/mutation/upload-audio), [createUploadUrl](/graphql-api/mutation/create-upload-url) and [confirmUpload](/graphql-api/mutation/confirm-upload) mutations now return a [`feature_disabled`](/miscellaneous/error-codes#feature_disabled) error when file uploads for transcription have been disabled for your organization by an admin. Behavior is unchanged when uploads are enabled. ### 2.25.0 > [card] > > Added an optional `generate_suggestions` argument to the [Create AskFred Thread](/graphql-api/mutation/create-askfred-thread) and [Continue AskFred Thread](/graphql-api/mutation/continue-askfred-thread) mutations. Set it to `false` to skip suggested follow-up query generation for a faster response — `suggested_queries` is then returned as `null`. When omitted, suggested queries are generated only when your query selects the `suggested_queries` field, so existing integrations are unaffected. ### 2.24.1 > [card] > > Increased API rate limit for Pro plan users from 50 to 500 requests per day. Free plan remains at 50 requests per day. Business and Enterprise plans remain at 60 requests per minute. This also applies to the MCP server, which shares the same rate limits. See [Limits](/fundamentals/limits) for details. ### 2.23.2 > [card] > > Updated [deleteTranscript](/graphql-api/mutation/delete-transcript) mutation to allow users to delete their own meetings. Previously, only team admins could delete meetings via the API. Users can now delete meetings they own, while admin privileges are still required to delete other team members' meetings. ### 2.23.1 > [card] > > Fixed `skip` parameter validation in [Bites](/graphql-api/query/bites) query. Previously, `skip: 0` was incorrectly rejected. The `skip` parameter now accepts values from 0 to 5000. ### 2.23.0 > [card] > > Added `is_live` field to [Transcript](/schema/transcript) schema. Returns a boolean indicating whether the meeting is currently live (active or paused). > [card] > > Added live transcript support to the `sentences` field on [Transcript](/schema/transcript). When querying a live meeting, `sentences` now returns real-time captions from the ongoing meeting instead of processed transcript data. ### 2.22.0 > [card] > > Added [shareMeeting](/graphql-api/mutation/share-meeting) mutation to share meetings with up to 100 email recipients, with optional expiry (7, 14, or 30 days). > [card] > > Added [revokeSharedMeetingAccess](/graphql-api/mutation/revoke-shared-meeting-access) mutation to revoke a user's access to a shared meeting by email. > [card] > > Added `shared_with` field to [Transcript](/schema/transcript) to list all users a meeting is shared with, including email, name, and expiry details. ### 2.21.0 > [card] > > Added `is_calendar_in_sync` field to [User](/schema/user) schema. Returns a boolean indicating whether the user's calendar is currently synced based on OAuth token validity. ### 2.20.0 > [card] > > Added `workspace_users` field to [Transcript](/schema/transcript) schema. Returns an array of email addresses of Fireflies users who participated in the meeting and are also members of the requesting user's team/workspace. ### 2.19.0 > [card] > > Added `channels` query to fetch all channels accessible to the user. Returns public channels and private channels where the user is a member. See [Channels](/graphql-api/query/channels). > [card] > > Added `channel` query to fetch a single channel by ID. See [Channel](/graphql-api/query/channel). > [card] > > Added new [Channel](/schema/channel) schema with `id`, `title`, `is_private`, `created_at`, `updated_at`, `created_by`, and `members` fields. > [card] > > Added new [ChannelMember](/schema/channel-member) schema with `user_id`, `email`, and `name` fields for channel member details. ### 2.18.0 > [card] > > Added `state` field to [ActiveMeeting](/schema/active-meeting) schema to indicate whether a meeting is `active` or `paused`. > [card] > > Added `states` filter to [Active Meetings](/graphql-api/query/active-meetings) query to filter meetings by state. Returns both `active` and `paused` meetings by default when no filter is provided. > [card] > > Added new [MeetingState](/schema/enum/meeting-state) enum with values `active` and `paused`. ### 2.17.0 > [card] > > Added `download_auth` field to [Upload Audio](/graphql-api/mutation/upload-audio) mutation to support authenticated downloads. Allows uploading media files that require bearer token or HTTP basic authentication. See [DownloadAuthInput](/schema/input/download-auth-input) for details. > [card] > > Added new schema types for authenticated downloads: [BearerTokenAuthInput](/schema/input/bearer-token-auth-input), [BasicAuthInput](/schema/input/basic-auth-input), and [DownloadAuthType](/schema/enum/download-auth-type) enum. ### 2.16.0 > [card] > > Introduced **AskFred**, an AI-powered meeting assistant that enables natural language querying of meeting transcripts. Create conversation threads, ask follow-up questions, and analyze single or multiple meetings with intelligent, context-aware responses. See [AskFred Overview](/askfred/overview). > [card] > > Added `askfred_threads` query to list all conversation threads with summary information. See [AskFred Threads](/graphql-api/query/askfred-threads). > [card] > > Added `askfred_thread` query to retrieve a specific thread with full message history. See [AskFred Thread](/graphql-api/query/askfred-thread). > [card] > > Added `createAskFredThread` mutation to start new conversations with questions about meetings. See [Create AskFred Thread](/graphql-api/mutation/create-askfred-thread). > [card] > > Added `continueAskFredThread` mutation to add follow-up questions to existing threads. See [Continue AskFred Thread](/graphql-api/mutation/continue-askfred-thread). > [card] > > Added `deleteAskFredThread` mutation to remove conversation threads. See [Delete AskFred Thread](/graphql-api/mutation/delete-askfred-thread). > [card] > > Added new schemas: [AskFredThread](/schema/askfred-thread), [AskFredMessage](/schema/askfred-message), [AskFredThreadSummary](/schema/askfred-thread-summary), and [AskFredResponse](/schema/askfred-response). ### 2.15.0 > [card] > > Added `updateMeetingChannel` mutation to set the channel for one or more meetings. Supports batch > updates of 1–5 transcripts to a single channel and requires meeting owner or team admin > privileges. See [Update Meeting Channel](/graphql-api/mutation/update-meeting-channel). ### 2.14.0 > [card] > > Added `active_meetings` query to retrieve meetings currently in progress. Allows fetching active > meetings for users in your team with role-based access control. See [Active > Meetings](/graphql-api/query/active-meetings). ### 2.13.0 > [card] > > Added rate limiting to the `deleteTranscript` mutation. It is limited to 10 requests per minute > across all user tiers. When exceeded, the API returns HTTP 429 `too_many_requests`. See [Delete > Transcript](/graphql-api/mutation/delete-transcript). ### 2.12.0 > [card] > > Added `updateMeetingPrivacy` mutation to update meeting privacy settings. Allows meeting owners > and team admins to change privacy levels between link, owner, participants, > teammatesandparticipants, and teammates. See [Update Meeting > Privacy](/graphql-api/mutation/update-meeting-privacy). ### 2.11.0 > [card] > > Added `channels` field to [Transcript](/schema/transcript) schema. Returns an array of > [Channel](/schema/channel) objects containing channel IDs associated with the meeting. ### 2.10.0 > [card] > > Added new `meeting_attendance` field to [Transcript](/schema/transcript) schema providing > participant join and leave times from meeting events data. > [card] > > Added new [MeetingAttendance](/schema/meeting-attendance) schema with `name`, `join_time`, and > `leave_time` fields for tracking participant attendance. ### 2.9.0 > [card] > > Added `channel_id` parameter to [Transcripts](/graphql-api/query/transcripts) query to filter > meetings by specific channel. Accepts a single channel ID string. ### 2.8.0 > [card] > > Added array fields `organizers` and `participants` to > [Transcripts](/graphql-api/query/transcripts) query for filtering by multiple email addresses. > Previous single email fields `organizer_email` and `participant_email` are now deprecated. ### 2.7.1 > [card] > > Added validation for [Add to Live](/graphql-api/mutation/add-to-live) to only allow supported meeting platforms as `meeting_link`. > > Added new error type [UnsupportedPlatform](/miscellaneous/error-codes#unsupported-platform) that is thrown when an unsupported `meeting_link` is provided to `Add to Live`. ### 2.7.0 > [card] > > Added new `user_groups` query to fetch user groups with optional `mine` filter. See [User > Groups](/graphql-api/query/user-groups) > [card] > > Enhanced [UserGroup](/schema/user-groups) schema with `members` field > [card] > > Added new [UserGroupMember](/schema/user-group-member) schema for user group member details ### 2.6.3 > [card] > > Made improvements to the performance and stability of the Fireflies API. ### 2.6.2 > [card] > > Updated `transcripts` query to allow text search within meeting transcript > (/query/transcripts)\[Transcripts] ### 2.6.1 > [card] > > Updated `uploadAudio` mutation to include `bypass_size_check` boolean, allowing processing of > audio files smaller than the standard 50kb minimum size. ### 2.6.0 > [card] > > Added [Realtime API](/realtime-api/overview) support. ### 2.5.1 > [card] > > Added `user_groups` field to [User](/schema/user) query. ### 2.5.0 > [card] > > Added query `analytics` to query team and user analytics for meetings and conversations. See > [Analytics](/graphql-api/analytics) > [card] > > Added query `transcript.analytics` to query analytics per meeting. See > [Transcript](/graphql-api/transcript) or [Transcripts](/graphql-api/transcripts) ### 2.4.6 > [card] > > Fixed bug in `transcripts.title` query not returning correct results ### 2.4.5 > [card] > > Reduced the minimum file size for `uploadAudio` mutation to 50kb. ### 2.4.4 > [card] > > Field `client_reference_id` in [AudioUpload](/graphql-api/mutation/upload-audio) was limited to 32 > characters as part of input validation. It has now been increased to 128 characters. ### 2.4.3 > [card] > > Added length validation for all input fields. ### 2.4.2 > [card] > > Added `updateMeetingTitle` mutation to update meeting titles. For more details, view [Update > Meeting Title](/graphql-api/mutation/update-meeting-title) ### 2.4.1 > [card] > > Made improvements to the performance and stability of the Fireflies API. ### 2.4.0 > [card] > > Added `mine` field to [Transcripts](/graphql-api/query/transcripts) query > [card] > > Added breaking changes to [Transcripts](/graphql-api/query/transcripts) query that allows you to > only use one of the following fields: `organizer_email`, `participant_email`, `user_id`, `mine` at > a time ### 2.3.17 > [card] > > Added `meeting_link` field to [Transcript](/schema/transcript) schema ### 2.3.16 > [card] > > Added `apps` query to fetch AI App Outputs. For more details, view [Apps](/graphql-api/query/apps) ### 2.3.15 > [card] > > Fixed bug in `transcripts` query where it was not returning the correct match. ### 2.3.14 > [card] > > Added support for webhook auth. For more details, view the [Webhooks](/graphql-api/webhooks) page ### 2.3.13 > [card] > > Added new fields to summary to [Summary](/schema/summary) schema ### 2.3.12 > [card] > > Added fields `cal_id` and `calendar_type` to [Transcript](/schema/transcript) schema ### 2.3.11 > [card] > > Fixed bug in `transcript.sentences` query where it was incorrectly returning null > [card] > > Made improvements to the performance and stability of the Fireflies API. ### 2.3.10 > [card] > > Added field `attendees` to [addToLive](/graphql-api/mutation/add-to-live) mutation ### 2.3.9 > [card] > > Added field `meeting_info` for meeting metadata. > [card] > > Updated `uploadAudio` mutation to allow saving video ### 2.3.8 > [card] > > Added field `speakers` in transcript. > [card] > > Updated docs to include error codes and their explanations. View details > [here](/miscellaneous/error-codes) ### 2.3.7 > [card] > > Added new fields for `transcript.summary`. View details on the [Summary](/schema/summary) schema > page ### 2.3.6 > [card] > > Updated docs for webhooks to include webhook schema > [card] > > Added `client_reference_id` field for audio upload ### 2.3.5 > [card] > > Added argument `custom_language` for `uploadAudio`. ### 2.3.4 > [card] > > Added query argument `fromDate` and `toDate` for `transcripts`. View more details > [here](/graphql-api/query/transcripts). Field `date` has been deprecated in favor of these > arguments ### 2.3.3 > [card] > > Added mutation for `addToLiveMeeting`. View more details [here](/graphql-api/mutation/add-to-live) ### 2.3.2 > [card] > > Made improvements to the performance and stability of the Fireflies API. ### 2.3.1 > [card] > > Added field `calendar_id`. This field represents calId for google calendar and iCalUID for outlook > calendar. For more details, view [Transcript](/schema/transcript) ### 2.3.0 > [card] > > Added queries for [Transcript Summary](/schema/summary). For more details, view > [Summary](/schema/summary) schema and [Transcript](/schema/transcript) schema ### 2.2.0 > [card] > > Added queries for [bites](/graphql-api/query/bites) and [bite](/graphql-api/query/bite). For more > details, view [Bites](/schema/bite) schema > [card] > > Added mutation for Create Bite that allows you to progmatically create bites. For more details, > view [CreateBite](/graphql-api/mutation/create-bite) mutation ### 2.1.1 > [card] > > Fixed bugs in [Transcripts](/graphql-api/query/transcripts) query ### 2.1.0 > [card] > > Added `video_url` field for [Transcript](schema/transcript) schema ### 2.0.7 > [card] > > Made improvements to the performance and stability of the Fireflies API. ### 2.0.6 > [card] > > Made improvements to the performance and stability of the Fireflies API. ### 2.0.5 > [card] > > Fixed bug in in [Transcripts](graphql-api/query/transcripts) query for `fireflies_users` field ### 2.0.4 > [card] > > Fixed bug in in [Transcripts](graphql-api/query/transcripts) query for `audio_url` field ### 2.0.3 > [card] > > Made improvements to the performance and stability of the Fireflies API. ### 2.0.2 > [card] > > Fixed bug in [Transcripts](/graphql-api/query/transcripts) query arguments ### 2.0.1 > [card] > > Fixed schema inconsistency in [AudioUpload](/graphql-api/mutation/upload-audio) mutation. > [card] > > Fixed schema inconsistency in [SetUserRole](/graphql-api/mutation/set-user-role) mutation ### 2.0.0 > [card] > > Field `transcript/host_email` has been deprecated. More details in > [Transcript](/schema/transcript) # Deprecated Source: https://docs.fireflies.ai/additional-info/deprecated Fields marked for removal ## Overview This page lists all the fields that have been deprecated. Deprecated fields are fields that are no longer recommended for use and may be removed in future versions. > [!WARNING] > > Please note that using deprecated fields can lead to compatibility issues in future releases. The following fields have been deprecated: ### [Transcript](/schema/transcript) `host_email`: Use `organizer_email` instead. ### [createBite](/graphql-api/mutation/create-bite) `transcript_Id`: Use `transcript_id` instead. The capital-`I` spelling was the schema's only name for this argument until 2.30.0. ### [Transcripts](/graphql-api/query/transcripts) `date`: Use `fromDate` and `toDate` to query a time range. `title`: Use `keyword` and `scope` instead of `title` `organizer_email`: Use the `organizers` array field to filter by one or more organizer email addresses. `participant_email`: Use the `participants` array field to filter by one or more participant email addresses. # Overview Source: https://docs.fireflies.ai/askfred/overview Use AI to intelligently query and analyze your meeting transcripts with natural language ## What is AskFred? AskFred is Fireflies' AI-powered meeting assistant that lets you ask natural language questions about your meeting transcripts. Query individual meetings or search across multiple meetings to get intelligent, context-aware answers. > [!NOTE] > > **AI Credits Required** — Using AskFred through the API (including `createAskFredThread` and `continueAskFredThread`) requires AI credits. If your account does not have AI credits, you will receive a `require_ai_credits` error. Visit [Upgrade](https://app.fireflies.ai/upgrade) to add AI credits to your plan. ### Key Capabilities **Intelligent Q\&A** - Ask questions in natural language and receive comprehensive answers with smart follow-up suggestions **Contextual Threads** - Maintain conversations where follow-up questions preserve context from previous exchanges **Multi-Meeting Analysis** - Query across meetings using filters to identify patterns and aggregate insights ## API Operations AskFred provides a comprehensive set of GraphQL operations: ### Queries * [askfred\_threads](/graphql-api/query/askfred-threads) - List all conversation threads * [askfred\_thread](/graphql-api/query/askfred-thread) - Get specific thread with full history ### Mutations * [createAskFredThread](/graphql-api/mutation/create-askfred-thread) - Start a new conversation * [continueAskFredThread](/graphql-api/mutation/continue-askfred-thread) - Add follow-up questions * [deleteAskFredThread](/graphql-api/mutation/delete-askfred-thread) - Remove threads ## Next Steps > [card] [Quickstart](/askfred/quickstart) > > Create your first thread and start querying meetings > [card] [Use Cases](/askfred/use-cases) > > Example questions and industry-specific scenarios # Quickstart Source: https://docs.fireflies.ai/askfred/quickstart Get started with AskFred in minutes - learn how to create threads and ask questions about your meetings ## Prerequisites Before you begin, make sure you have: 1. **API Key**: Obtain your API key from [app.fireflies.ai/integrations](https://app.fireflies.ai/integrations/custom/fireflies) 2. **AI Credits**: Your account must have AI credits to use AskFred. Visit [Upgrade](https://app.fireflies.ai/upgrade) to add AI credits to your plan. 3. **Transcript ID** (optional): The ID of a meeting transcript you want to query > [!NOTE] > > If you don't have a transcript ID, you can query across all your meetings using filters. See [Step 3](#step-3-query-across-meetings) below. ## Step 1: Create Your First Thread Start by asking a question about a specific meeting: ```graphql GraphQL theme={null} mutation CreateThread { createAskFredThread(input: { query: "What were the main discussion points?", transcript_id: "your_transcript_id", response_language: "en", format_mode: "markdown" }) { message { id thread_id answer suggested_queries } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation CreateThread($input: CreateAskFredThreadInput!) { createAskFredThread(input: $input) { message { id thread_id answer suggested_queries } } }", "variables": { "input": { "query": "What were the main discussion points?", "transcript_id": "your_transcript_id", "response_language": "en", "format_mode": "markdown" } } }' \ https://api.fireflies.ai/graphql ``` ```javascript JavaScript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const mutation = ` mutation CreateThread($input: CreateAskFredThreadInput!) { createAskFredThread(input: $input) { message { id thread_id answer suggested_queries } } } `; const variables = { input: { query: 'What were the main discussion points?', transcript_id: 'your_transcript_id', response_language: 'en', format_mode: 'markdown' } }; axios .post(url, { query: mutation, variables }, { headers }) .then(response => { console.log(response.data.data.createAskFredThread); }) .catch(error => { console.error(error); }); ``` ```python Python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } mutation = """ mutation CreateThread($input: CreateAskFredThreadInput!) { createAskFredThread(input: $input) { message { id thread_id answer suggested_queries } } } """ variables = { 'input': { 'query': 'What were the main discussion points?', 'transcript_id': 'your_transcript_id', 'response_language': 'en', 'format_mode': 'markdown' } } response = requests.post( url, json={'query': mutation, 'variables': variables}, headers=headers ) print(response.json()) ``` ### Response ```json theme={null} { "data": { "createAskFredThread": { "message": { "id": "msg_abc123", "thread_id": "thread_xyz789", "answer": "The main discussion points were:\n\n1. **Q4 Product Roadmap**: The team reviewed upcoming features...\n2. **Budget Allocation**: Discussion on resource allocation...\n3. **Timeline Concerns**: Several concerns about launch dates...", "suggested_queries": [ "Can you elaborate on the timeline concerns?", "What features are prioritized for Q4?", "Who raised concerns about the budget?" ] } } } } ``` ## Step 2: Ask Follow-up Questions Continue the conversation with context-aware follow-ups using the `thread_id` from the previous response: ```graphql GraphQL theme={null} mutation ContinueThread { continueAskFredThread(input: { thread_id: "thread_xyz789", query: "Can you elaborate on the timeline concerns?" }) { message { answer suggested_queries } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation ContinueThread($input: ContinueAskFredThreadInput!) { continueAskFredThread(input: $input) { message { answer suggested_queries } } }", "variables": { "input": { "thread_id": "thread_xyz789", "query": "Can you elaborate on the timeline concerns?" } } }' \ https://api.fireflies.ai/graphql ``` ```javascript JavaScript theme={null} const variables = { input: { thread_id: 'thread_xyz789', query: 'Can you elaborate on the timeline concerns?' } }; const mutation = ` mutation ContinueThread($input: ContinueAskFredThreadInput!) { continueAskFredThread(input: $input) { message { answer suggested_queries } } } `; axios.post(url, { query: mutation, variables }, { headers }) .then(response => console.log(response.data)) .catch(error => console.error(error)); ``` ```python Python theme={null} variables = { 'input': { 'thread_id': 'thread_xyz789', 'query': 'Can you elaborate on the timeline concerns?' } } mutation = """ mutation ContinueThread($input: ContinueAskFredThreadInput!) { continueAskFredThread(input: $input) { message { answer suggested_queries } } } """ response = requests.post( url, json={'query': mutation, 'variables': variables}, headers=headers ) print(response.json()) ``` ## Step 3: Query Across Meetings Analyze patterns across multiple meetings using filters: ```graphql GraphQL theme={null} mutation CrossMeetingAnalysis { createAskFredThread(input: { query: "What customer concerns were raised this month?", filters: { start_time: "2024-03-01T00:00:00Z", end_time: "2024-03-31T23:59:59Z", participants: ["customer@example.com"] } }) { message { answer suggested_queries } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation CrossMeetingAnalysis($input: CreateAskFredThreadInput!) { createAskFredThread(input: $input) { message { answer suggested_queries } } }", "variables": { "input": { "query": "What customer concerns were raised this month?", "filters": { "start_time": "2024-03-01T00:00:00Z", "end_time": "2024-03-31T23:59:59Z", "participants": ["customer@example.com"] } } } }' \ https://api.fireflies.ai/graphql ``` > [!NOTE] > > For more details on available filters and parameters, see the [createAskFredThread](/graphql-api/mutation/create-askfred-thread) documentation. ## Step 4: List Your Threads Retrieve all your conversation threads: ```graphql GraphQL theme={null} query GetThreads { askfred_threads { id title transcript_id created_at } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "query { askfred_threads { id title transcript_id created_at } }" }' \ https://api.fireflies.ai/graphql ``` ## Additional Resources > [card] [Explore Use Cases](/askfred/use-cases) > > Discover common scenarios and example questions > [card] [API Reference](/graphql-api/mutation/create-askfred-thread) > > Explore all available parameters and options # Use Cases Source: https://docs.fireflies.ai/askfred/use-cases Common use cases and example questions for AskFred - meeting summaries, action items, decisions, and more ## Overview AskFred can help you extract insights from your meetings across a wide range of use cases. This page provides practical examples of questions you can ask for different scenarios. ## Common Use Cases > [accordion] Meeting Summaries > > Extract quick overviews and highlights from your meetings. > > **Example Questions:** > > * "Provide a brief summary of this meeting" > * "What were the key takeaways?" > * "Give me the highlights in 3 bullet points" > * "Summarize the discussion about the product launch" > * "What was the meeting about in one sentence?" > > **Best for:** > > * Daily standups > * Client meetings > * Team retrospectives > * Board meetings > [accordion] Action Item Tracking > > Identify tasks, responsibilities, and deliverables. > > **Example Questions:** > > * "What action items were assigned?" > * "What are my action items from this week's meetings?" > * "Who is responsible for the product roadmap?" > * "List all open tasks and their owners" > * "What are the deadlines mentioned in this meeting?" > * "What tasks were assigned to the engineering team?" > > **Best for:** > > * Sprint planning > * Project kickoffs > * Weekly team syncs > * Customer success calls > [accordion] Decision Documentation > > Track important decisions and their rationale. > > **Example Questions:** > > * "What decisions were made about the budget?" > * "What was decided regarding the new feature?" > * "List all decisions with their rationales" > * "What was the outcome of the pricing discussion?" > * "Who made the final decision on the launch date?" > * "What alternatives were considered before the decision?" > > **Best for:** > > * Strategy meetings > * Leadership discussions > * Product planning > * Architecture reviews > [accordion] Participant Insights > > Understand individual contributions and perspectives. > > **Example Questions:** > > * "What did John contribute to the discussion?" > * "What concerns did the customer raise?" > * "Summarize the CEO's main points" > * "What feedback did the design team provide?" > * "What questions did stakeholders ask?" > * "Who disagreed with the proposal and why?" > > **Best for:** > > * Performance reviews > * Client feedback analysis > * Team collaboration assessment > * Stakeholder management > [accordion] Cross-Meeting Analysis > > Identify patterns and trends across multiple meetings. > > **Example Questions:** > > * "How has customer sentiment changed over the last month?" > * "What topics have been discussed most frequently?" > * "Track the progress of Project X across all meetings" > * "What are recurring issues in sprint retrospectives?" > * "How has the team's velocity changed this quarter?" > * "What concerns keep coming up in client calls?" > > **Best for:** > > * Quarterly reviews > * Customer health monitoring > * Team performance tracking > * Product roadmap planning > [accordion] Information Extraction > > Pull specific data points and details from meetings. > > **Example Questions:** > > * "Extract all mentioned dates and deadlines" > * "List all metrics and KPIs discussed" > * "What tools or technologies were mentioned?" > * "Find all budget figures discussed" > * "What email addresses or contact information was shared?" > * "What URLs or resources were mentioned?" > > **Best for:** > > * Meeting notes compilation > * Documentation updates > * Contact management > * Resource tracking ## Industry-Specific Examples > [accordion] Sales Use Cases > > **Discovery Calls:** > > * "What pain points did the prospect mention?" > * "What is their current solution and why are they looking to change?" > * "What is their timeline for making a decision?" > > **Deal Reviews:** > > * "What objections were raised during the demo?" > * "Who are the decision-makers mentioned?" > * "What competitive solutions are they considering?" > > **Pipeline Analysis:** > > * "What deals progressed this week?" > * "What common objections are we seeing across calls?" > * "Which prospects mentioned budget concerns?" > [accordion] Product Use Cases > > **Feature Discussions:** > > * "What user problems are we trying to solve?" > * "What alternatives did we consider?" > * "What were the technical constraints mentioned?" > > **Roadmap Planning:** > > * "What features were prioritized for next quarter?" > * "What customer feedback influenced our decisions?" > * "What dependencies were identified?" > > **User Research:** > > * "What frustrations did users mention?" > * "What features did users request most?" > * "How do users currently solve this problem?" > [accordion] Customer Success Use Cases > > **Onboarding:** > > * "What questions did the customer ask during onboarding?" > * "What features are they most interested in?" > * "What integration requirements did they mention?" > > **Health Monitoring:** > > * "What concerns has the customer raised recently?" > * "How has their sentiment changed over time?" > * "What success metrics are they tracking?" > > **Escalations:** > > * "What issues were reported in the last month?" > * "How quickly were problems resolved?" > * "What patterns exist in customer complaints?" > [accordion] Engineering Use Cases > > **Technical Planning:** > > * "What technical decisions were made?" > * "What are the architectural concerns?" > * "What dependencies block this feature?" > > **Sprint Retrospectives:** > > * "What went well this sprint?" > * "What blockers did the team face?" > * "What process improvements were suggested?" > > **Code Reviews:** > > * "What security concerns were raised?" > * "What performance considerations were discussed?" > * "What refactoring opportunities were identified?" ## Advanced Query Patterns ### Time-Based Analysis ```graphql theme={null} mutation TimeBasedQuery { createAskFredThread(input: { query: "How have customer satisfaction levels changed since last quarter?", filters: { start_time: "2024-01-01T00:00:00Z", end_time: "2024-03-31T23:59:59Z" } }) { message { answer } } } ``` ### Participant-Focused Queries ```graphql theme={null} mutation ParticipantQuery { createAskFredThread(input: { query: "What feedback has the executive team provided on our product strategy?", filters: { participants: ["ceo@company.com", "cto@company.com"], start_time: "2024-03-01T00:00:00Z" } }) { message { answer } } } ``` ### Topic Tracking ```graphql theme={null} mutation TopicTracking { createAskFredThread(input: { query: "Track all discussions about the new pricing model", filters: { start_time: "2024-01-01T00:00:00Z" } }) { message { answer suggested_queries } } } ``` ## Additional Resources > [card] [AskFred Overview](/askfred/overview) > > Learn about AskFred's key capabilities > [card] [API Reference](/graphql-api/mutation/create-askfred-thread) > > Explore all available parameters and options # Advanced Source: https://docs.fireflies.ai/examples/advanced Library of advanced usage examples ## Overview Explore advanced usage examples that build on top of the Fireflies.ai API. This page is regularly updated ### [Find questions from external participants](https://replit.com/@firefliesai/Firefliesai-Find-questions-from-external-participants?v=1) This replit allows you to query questions asked by participants who do not belong to your organization. It can be useful in deriving insights and analysis for client calls, interviews, etc. ### [Fetch meetings from multiple users](https://replit.com/@firefliesai/Firefliesai-Fetch-meetings-for-multiple-users?v=1) This replit allows you to fetch meetings from multiple users by providing it a list of API keys. Please read our privacy policy and terms of usage for more details ### [Verify webhook requests](https://replit.com/@firefliesai/Firefliesai-Verifying-webhook-requests?v=1) This replit allows you to verify webhook requests by checking the signature and the payload. ## Fireflies.ai Replit Explore the complete list of usage examples at [replit.com/@firefliesai](https://replit.com/@firefliesai) ## Additional Resources > [card] [Basic examples](/examples/basic) > > Basic usage examples > [card] [Webhooks](/graphql-api/webhooks-v2) > > Create notifications using webhooks # Basic Source: https://docs.fireflies.ai/examples/basic Library of basic usage examples ## Overview Explore basic usage examples for the Fireflies.ai API to get you started quickly. These basic usage examples simplify interact with the API through Javascript code. ## Basic examples Basic examples that allow you to perform basic operations with the Fireflies.ai API, like fetching transcripts or setting user role. 1. [Create soundbite from meeting](https://replit.com/@firefliesai/Firefliesai-Create-soundbite-from-a-meeting?v=1) 2. [Set user role](https://replit.com/@firefliesai/Firefliesai-Set-user-role?v=1) 3. [Upload audio](https://replit.com/@firefliesai/Firefliesai-Upload-audio?v=1) 4. [Download meeting video](https://replit.com/@firefliesai/Firefliesai-Download-video-from-meeting?v=1) 5. [Get audio/video url](https://replit.com/@firefliesai/Firefliesai-Get-audiovideo-url?v=1) 6. [Get transcript summary](https://replit.com/@firefliesai/Firefliesai-Get-transcript-summary-from-a-meeting?v=1) ## Fireflies.ai Replit Explore the complete list of usage examples at [replit.com/@firefliesai](https://replit.com/@firefliesai) ## Additional Resources > [card] [Advanced examples](/examples/advanced) > > Advanced usage examples > [card] [Quickstart](/getting-started/quickstart) > > Make your first request in under 5 minutes # Overview Source: https://docs.fireflies.ai/examples/overview Library of API usecases ## Overview This part of the documentation is designed to provide developers with practical insights into integrating and maximizing the Fireflies.ai API in various applications. By visiting our Replit page at Fireflies.ai on Replit, you can directly access and interact with these examples, making your learning process interactive and engaging. ## Fireflies.ai Replit Explore a wide array of examples where we have created code snippets that allows you to interact with the Fireflies API. To view, please visit [replit.com/@firefliesai](https://replit.com/@firefliesai) You can also view the list of examples at the links [Basic examples](/examples/basic) and [Advanced examples](/examples/advanced) ## Additional Resources > [card] [Basic examples](/examples/basic) > > Basic usage examples > [card] [Advanced examples](/examples/advanced) > > Advanced usage examples # Authorization Source: https://docs.fireflies.ai/fundamentals/authorization Authenticating your requests with the Fireflies API ## Overview The Fireflies API implements token-based authentication, which ensures that only authorized users can access certain data and functionalities. ### Token-Based Authentication We use a standard bearer token authentication mechanism. This means that to make authorized requests to the API, you must include an `Authorization` header with a valid token. ### Acquiring a Token Follow these steps to obtain your API key for the Fireflies API: 1. Log in to your account at [fireflies.ai](https://app.fireflies.ai) 2. Navigate to the [Integrations](https://app.fireflies.ai/integrations) section 3. Click on [Fireflies API](https://app.fireflies.ai/integrations/custom/fireflies) 4. Copy and store your API key securely ### Making an Authenticated Request To make an authenticated request, add the `Authorization` header followed by the word `Bearer` and your API key. ### Example of an Authenticated Request Header ```plaintext theme={null} Authorization: Bearer your_api_key ``` ### Example request with Authorization header ```curl curl theme={null} curl \ -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "{ user { name integrations } }" }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: '{ user { name integrations } }' }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error('Error:', error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': '{ user { name integrations } }' } response = requests.post(url, json=data, headers=headers) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String url = "https://api.fireflies.ai/graphql"; String json = "{\"query\":\"{ user { name integrations } }\"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(HttpRequest.BodyPublishers.ofString(json, StandardCharsets.UTF_8)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` Ensure to replace `your_api_key` with your actual API key. ## Best Practices for Token Security * **Keep it Secret:** Treat your API key like a password. Never expose it in client-side code or share it publicly. * **Store Securely:** Store the API key securely in your application, ideally in environment variables or secure storage solutions. > [!WARNING] > > Improper handling of API keys can lead to security vulnerabilities. Always ensure API keys are > used and stored securely. ## Troubleshooting * **Invalid key:** If you receive an error regarding an invalid API key, verify that the API key hasn't expired and that it's correctly included in the request header. * **Missing key:** Ensure that the `Authorization` header is present in your requests requiring authentication. > [!NOTE] > > If you encounter issues with authentication or have questions about API key management, please > contact our support team. ## FAQ > [accordion] Why am I getting an 'auth\_failed' error? > > This error can signal an issue in your Authorization header. Please ensure that you are including the `Authorization` header with the word `Bearer` and your API key. ## Additional Resources > [card] [Quickstart](/getting-started/quickstart) > > Make your first request in under 5 minutes > [card] [Errors](/fundamentals/errors) > > Error standards for the Fireflies API # General concepts Source: https://docs.fireflies.ai/fundamentals/concepts Foundational guide to the core aspects of the Fireflies API ## Overview This section serves as a primer on the essential features of the Fireflies API. It covers the requirements to make authenticated requests to the Fireflies API, key GraphQL concepts and a breakdown of core components like queries, mutations, schema and data types. ### Host The Fireflies API is hosted at [https://api.fireflies.ai](https://api.fireflies.ai) ### Authorization The Fireflies API requires a valid API key for all requests. Please see [Authorization](/fundamentals/authorization) for more information ## GraphQL API Concepts Welcome to our GraphQL API! GraphQL is a powerful query language designed for APIs, offering clients the ability to request exactly what they need and nothing more. ### Queries Queries are used to fetch data in GraphQL. They are akin to the `GET` request in REST. A basic query might look like this: > [!NOTE] > > Queries are read-only and won’t modify your data. ```graphql graphql theme={null} query { user(id: "1") { name email } } ``` ### Mutations Mutations allow you to modify data – create, update, or delete. > [!WARNING] > > Mutations should be used with caution as they change server-side data. ```graphql graphql theme={null} mutation { setUserRole(user_id: "1", role: "user") { id name } } ``` ## Schema and Types ### Schema Definition The schema defines the API's capabilities, including types, queries, mutations, and more. > [!TIP] > > ### Understanding GraphQL Schema > > The schema is a contract between client and server, defining how clients can access data. #### Data Types **Standard Types:** Int, Float, String, Boolean, ID. **Custom Types:** Defining complex data structures. Custom types are user-defined and can include combinations of standard types. #### Best Practices 1. Optimize query performance by requesting for only necessary data. 2. Use variables in queries to enhance readability and flexibility ## Additional Resources For more in-depth information, visit [GraphQL Documentation](https://graphql.org/learn/). > [card] [Quickstart](/getting-started/quickstart) > > Make your first request in under 5 minutes > [card] [Introspection](/fundamentals/introspection) > > Query generation and API exploration # Errors Source: https://docs.fireflies.ai/fundamentals/errors Error standards for the Fireflies API ## Overview Understanding how errors are structured and returned by the Fireflies API is key to effectively handling and troubleshooting issues. This page outlines the common error format and details specific error types. ## Error schema Our GraphQL API follows a standard format for returning errors. Errors are encapsulated within an `errors` array in the response body. Please visit [Error codes](/miscellaneous/error-codes) to view explanations for error code types **message** `String` *required* Description of the error **code** `String` *required* Error code. **friendly** `Boolean` *required* `friendly === true` are safe to show to the frontend client. Unfriendly errors may have technical details that may not be useful to the UI layer. **extensions** `Object` Contains useful metadata related to the error. Where relevant, includes field `helpUrls` pointing to relevant API documentation sections that explain the error and provide guidance on how to resolve it ```json Example theme={null} { "data": {}, "errors": [ { "message": "Error description", "friendly": true, "code": "error_code", "extensions": { "helpUrls": [ "https://docs.fireflies.ai/miscellaneous/error-codes#error_code" ], "code": "error_code", "status": http_status_code, "...otherFields": "..." } } ] } ``` ## Additional Resources > [card] [Error Codes](/miscellaneous/error-codes) > > Detailed error code reference > [card] [Authorization](/fundamentals/authorization) > > Authenticating your requests with the Fireflies API # Introspection Source: https://docs.fireflies.ai/fundamentals/introspection Query generation and API exploration. ## Overview Introspection is a feature that allows querying a GraphQL server to discover its schema. This capability is crucial for developers to understand available queries, mutations, and the structure of the data they can work with, facilitating seamless API interaction and exploration. ### Requirements You will need a Fireflies.ai API key to use introspection. For more details, please visit [Authorization](/fundamentals/authorization#acquiring-a-token) ### Introspection using Apollo Sandbox For introspection using our builtin Apollo Sandbox, visit [api.fireflies.ai/graphql](https://api.fireflies.ai/graphql) and enter your `api_key` in the Headers section as a Bearer token ### Introspection using Postman Create a new Graphql Request in Postman with the url [api.fireflies.ai/graphql](https://api.fireflies.ai/graphql) and enter your `api_key` in the Headers section as a Bearer token ## Additional Resources > [card] [Concepts](/fundamentals/concepts) > > Foundational guide to the core aspects of the Fireflies API > [card] [Authorization](/fundamentals/authorization) > > Authenticating your requests with the Fireflies API # Limits Source: https://docs.fireflies.ai/fundamentals/limits File size and API rate limits for the Fireflies API ## Overview Understanding the limitations of our API is crucial for efficient and uninterrupted usage. Below you'll find detailed information about the upload limits for different file types and the rate limits applicable to various subscription plans. ## Upload Limits The Fireflies API accommodates a range of file sizes for different user types. Here's a breakdown of the maximum file sizes for audio and video uploads: | Upload Type | Free User Limit | Pro / Business / Enterprise Limit | | - | - | - | | Audio Files | Up to 200MB | Up to 200MB | | Video Files | Up to 100MB | Up to 1.5GB | ### Understanding Upload Limits * **Audio Files:** All users can upload an audio file no greater than 200MB, ensuring ample capacity for high-quality audio content. * **Video Files for Free Users:** Free users have a maximum upload limit of 100MB for video files, suitable for short clips and previews. * **Video Files for Pro/Business/Enterprise Users:** Higher-tier users can upload larger video files up to 1.5GB, accommodating longer and higher resolution content. ## API Rate Limits To maintain the quality of service and availability for all users, our API enforces rate limits based on the type of subscription plan. Every plan has a per-minute limit; Free and Pro also have a daily quota. | Plan | Per minute | Per day | | - | - | - | | Free | 30 requests | 500 requests | | Pro | 60 requests | 5,000 requests | | Business | 60 requests per paid seat, pooled across the team (up to 1,200) | No daily cap | | Enterprise | 60 requests per paid seat, pooled across the team (up to 2,400) | No daily cap | * The daily quota is a calendar day in UTC: it resets at midnight UTC, not 24 hours after your first request. The `X-RateLimit-Reset` header tells you how many seconds remain. * The per-minute window starts with your first request and resets 60 seconds later; it is not aligned to the clock minute. * **Team pooling (Business and Enterprise):** every member of the team draws from one shared per-minute budget of 60 requests per paid seat (the seats on your subscription; free seats do not add to the budget), so a 10-seat Business team gets 600 requests per minute between all its users and service accounts. A team is never limited to less than 60 requests per minute, and no single user can spend more than half of the team's budget on their own (rounded up, and never less than their own 60 per minute, so a one-seat team can use its whole pool), so one runaway integration is slowed down before it can block the rest of the team. * **Free API trial:** a Free user's first API request starts a 14-day trial at Pro limits (60 per minute, 5,000 per day). The trial is tied to your account, not to an API key, so creating a new key does not restart it. > [!NOTE] > > Team pooling applies to every Business and Enterprise team automatically, and the Free API trial starts with your first request. Neither needs to be enabled on your account. The [MCP server](/getting-started/mcp-configuration) shares these limits: a tool call and a GraphQL request from the same user spend the same budget. ### Rate Limit Headers Every response the general API limiter checks, allowed or rejected, carries the state of your quota (`addToLiveMeeting` is metered by its own window instead; see below): | Header | Meaning | | - | - | | `X-RateLimit-Limit` | Size of the window: the daily quota (Free / Pro) or the per-minute limit (Business / Enterprise) | | `X-RateLimit-Remaining` | Requests left in that window | | `X-RateLimit-Reset` | Seconds until the window resets | | `Retry-After` | On a `429` response only: seconds to wait before retrying | The same values are also sent with a suffix per window (`X-RateLimit-Limit-api`, `X-RateLimit-Limit-api_burst`, ...). On an allowed request the unsuffixed headers describe the primary window named above; on a `429` they describe the window that rejected the request (its limit, `0` remaining, and a reset equal to `Retry-After`), which for Free and Pro may be the per-minute burst window. The error body's `extensions.metadata.retryAfter` is the same moment as an epoch timestamp in milliseconds, not a number of seconds. On the MCP server, a rejected tool call is a JSON-RPC error with code `-32429` whose `data.retryAfter` is that timestamp, with the same `Retry-After` header. If your daily quota is exhausted and you keep sending requests above the per-minute limit, the `429` describes the daily window, so `Retry-After` always names the block you actually have to wait for. When you receive a `429 Too Many Requests` response, wait for the number of seconds in `Retry-After` before retrying. Requests sent during a block are rejected and still count towards the next window, so a client that keeps retrying can stay blocked indefinitely; back off until `Retry-After` has passed. ### Add to Live API Rate Limit The Add to Live API has a rate limit of 3 requests per 20 minutes per user. On Business and Enterprise plans the team automatically shares 3 requests per paid seat per 20 minutes, up to 60, and a single user can use at most half of that pool (rounded up, never less than 3). `addToLiveMeeting` does not count against the per-minute or daily quota above, so an allowed response carries only the suffixed `X-RateLimit-Limit-call_join`, `X-RateLimit-Remaining-call_join` and `X-RateLimit-Reset-call_join` headers. A `429` from this window carries `Retry-After` and the unsuffixed headers describing it, like any other rejection. ### Share Meeting API Rate Limit The Share Meeting API has a rate limit of 60 requests per hour. Each request supports up to 50 email addresses. ### Navigating API Rate Limits * **Free Plan:** Ideal for testing and light usage, with 30 requests per minute and 500 API requests per day. Your first 14 days as an API user run at Pro limits. * **Pro Plan:** Suited for moderate to heavy usage, with 60 requests per minute and 5,000 API requests per day. This provides ample capacity for integrations and automation workflows. * **Business and Enterprise Plans:** Designed for the most demanding use cases, these plans pool 60 requests per minute per paid seat across the whole team (up to 1,200 per minute on Business and 2,400 on Enterprise) with no daily cap, providing high throughput for larger applications and production workloads. **These limits are in place to ensure optimal performance and fair usage across our platform.** ## Additional Resources > [card] [Upload Audio](/graphql-api/mutation/upload-audio) > > Use the API to upload audio to Fireflies.ai > [card] [Authorization](/fundamentals/authorization) > > Authenticating your requests with the Fireflies API # Super Admin Source: https://docs.fireflies.ai/fundamentals/super-admin Fireflies Super Admin with advanced capabilities for querying your data ## Overview The Super Admin API offers advanced features such as team-wide webhooks and privacy setting bypass, providing enhanced control and flexibility for managing your data. This is only available on the enterprise tier for company admins - [learn more](https://guide.fireflies.ai/hc/en-us/articles/30453010621585-Learn-about-the-Super-Admin-role). ## Super Admin Webhooks A Super Admin webhook notifies you of all team meetings owned by your team, allowing you to automate workflows, integrate with other tools, and maintain an overview of your team's meetings with a single webhook. ### How team-wide delivery works Meeting events are delivered to the meeting owner and, in addition, escalated to every **Super Admin** on the owner's team. So a webhook configured by a Super Admin receives events for all meetings owned by anyone on the team, without each teammate configuring anything. > [!NOTE] > > Escalation applies to the Super Admin role specifically. A regular team admin only receives events for meetings they own. ### Setting up Super Admin Webhooks (Webhooks V2) Set up the webhook while signed in as the Super Admin — the account that configures it is the one events are escalated to. **Step 1** Visit the [Webhooks configuration page](https://app.fireflies.ai/integrations/api/webhook) **Step 2** Enter a valid HTTPS URL that accepts POST requests in the **Webhook URL** field **Step 3** Optionally, enter a **Signing Secret** to sign payloads with HMAC-SHA256 **Step 4** Under **Event Subscriptions**, select the events you want to receive **Step 5** Save the configuration, then use **Send Test Event** to confirm your endpoint is reachable Event names, payload format, signature verification and delivery/retry behavior are documented on the [Webhooks V2](/graphql-api/webhooks-v2) page. > [!WARNING] > > It is highly suggested to configure a signing secret and [verify webhook signatures](/graphql-api/webhooks-v2#webhook-authentication) to secure your servers. ### Legacy setup (Webhooks V1 - deprecated) > [!WARNING] > > The webhook field in **Settings → Developer settings** is deprecated. It is read-only: existing webhooks keep receiving `Transcription completed` notifications, but new webhooks must be created on the [Webhooks V2 page](https://app.fireflies.ai/integrations/api/webhook). Previously, a Super Admin webhook was configured with these steps: **Step 1** Visit the [Fireflies.ai dashboard settings](https://app.fireflies.ai/settings) **Step 2** Navigate to the Developer settings tab **Step 3** Enter a valid https URL in the webhooks field and save If you still have a webhook saved there, open it, choose **Disable Webhook**, and recreate it on the Webhooks V2 page to get multiple events and granular event subscriptions. See [Webhooks V1](/graphql-api/webhooks) for the legacy payload and [the migration steps](/graphql-api/webhooks-v2#migrating-from-webhooks-v1). ### Privacy Settings Bypass The Super Admin functionality allows you to bypass your team's privacy settings, allowing you to query all data in your team's account. ### Requirements Super Admin API is only available to teams on the Enterprise plan. [Learn more here](https://guide.fireflies.ai/hc/en-us/articles/30453010621585-Learn-about-the-Super-Admin-role) and reach out to us with questions ## Additional Resources > [card] [Webhooks V2](/graphql-api/webhooks-v2) > > Configure event-driven webhooks > [card] [Authorization](/fundamentals/authorization) > > Authenticating your requests with the Fireflies API # Chat with Fireflies AI Assistant Source: https://docs.fireflies.ai/getting-started/ask-docs Navigate Fireflies.ai Documentation using the AI Assistant ## Overview Welcome to the Fireflies.ai Documentation, your essential guide to unlocking the full potential of our API. We understand that diving into a new API can be daunting, and finding the specific information you need shouldn't add to that challenge. That's why we've designed our documentation to be both comprehensive and user-friendly, ensuring you get the answers you need without the hassle. ## Explore with Fireflies AI Assistant With our AI assistant, navigating the documentation becomes as intuitive as having a conversation. Whether you're looking for detailed API endpoints, integration guides, or troubleshooting tips, our integrated AI assistant is here to assist you every step of the way. ### How to Use Fireflies AI Assistant Getting started is simple: 1. **Access the Search Bar:** Click on the search bar at the top of the page, or use the shortcut `CMD + K` (for Mac users) or `Ctrl + K` (for Windows and Linux users) to jump straight to it. 2. **Ask Your Question:** Type in your question just as you would when talking to ChatGPT. Whether it's a broad query about API capabilities or a specific request for code examples, the AI Assistant is ready to provide you with precise answers. > [card] [Quickstart](/getting-started/quickstart) > > Foundational guide to the core aspects of the Fireflies API > [card] [Developer Program](/getting-started/developer-program) > > Join the Developer Program to build integrations with Fireflies.ai # Join the Developer Program Source: https://docs.fireflies.ai/getting-started/developer-program Join the Developer Program to build integrations with Fireflies.ai ## Overview Welcome to the Fireflies.ai Developer Program! This exclusive program offers developers a chance to explore, test, and integrate with our APIs for a limited period of three months. This program is tailored for developers eager to create seamless integrations and unlock the full capabilities of Fireflies.ai. Participants will gain access to premium features and higher rate limits, ensuring a swift and successful project development. ## Program Benefits As a member of the Fireflies.ai Developer Program, you’ll enjoy: * **Full Business Tier Access**: Complimentary access to all Business Tier features, tools, and resources * **Integration Support**: Get guidance on how to connect the API seamlessly with your application * **Community and Updates**: Be part of our developer community and receive the latest updates, tutorials, and API news ## How to Apply Interested in joining? Follow these simple steps to apply for the program: 1. **Fill Out the Application Form**: [Apply here](https://share-na2.hsforms.com/2lHy18jOSQqy3QsYFhFyARw1sb3o) 2. **Verification**: Once you submit the form, our team will review your application. Please note that this process is manual and may take a few business days 3. **Approval Notification**: If your application is approved, you’ll receive a confirmation email with details about your program access ## Application Requirements To qualify for the Developer Program, please ensure you have: * **A clear project plan**: Briefly describe how Fireflies.ai will integrate with your application * **A company email**: A company email is preferred for verification purposes * **GitHub Repository**: Optionally, include a GitHub link to your code or previous work to help us understand your technical expertise * **Additional Comments**: Any additional information that can help us assess your project’s alignment with our platform goals ## What to Do After You've Built Your Integration Once you've successfully built your integration with Fireflies.ai, you can apply to be listed as an official partner integration. To get your integration listed, please submit the [Partner Submission Form](https://yhw88ruu.paperform.co/) or contact us at [partners@fireflies.ai](mailto:partners@fireflies.ai). ### Requirements for Listing as Partner Integration To be listed as a partner integration, you'll need to provide: 1. **Your SOC2 report**: Security compliance documentation 2. **A public helpdesk article to assist users**: Documentation to help users set up and use your integration 3. **A support email for users to reach out**: Contact information for integration support 4. **A short and long description for the listing**: Marketing copy describing your integration 5. **Your company logo in SVG format**: High-quality logo for display on our integrations page ## Program Terms * **Duration**: The complimentary Business Tier access lasts for three months from the date of approval * **Feedback**: We may reach out for feedback to better understand your experience and how we can enhance our API We look forward to seeing what you’ll build and are excited to support your development journey! ## Additional Resources > [card] [Introduction](/getting-started/introduction) > > Welcome to Fireflies public API documentation > [card] [Authorization](/fundamentals/authorization) > > Authenticating your requests with the Fireflies API # Docs MCP Server Source: https://docs.fireflies.ai/getting-started/docs-mcp-server Connect your AI tools to Fireflies documentation using MCP for instant access to API references, guides, and code examples. ### Overview The Fireflies Documentation MCP Server enables AI tools to search and retrieve information directly from the Fireflies documentation. This allows you to ask questions about the Fireflies API, find code examples, understand features, and get implementation guidance without leaving your development environment. ### What is MCP? Model Context Protocol (MCP) is an open standard that enables AI applications to securely connect to external data sources and tools. With the Fireflies Documentation MCP Server, your AI tools can search across all Fireflies documentation including API references, guides, and code examples. ### Server Details The Fireflies Documentation MCP Server is available at: ``` https://docs.fireflies.ai/mcp ``` This server provides a `SearchFireflies` tool that searches across the Fireflies knowledge base to find relevant information, code examples, API references, and guides. ### Configuration by Platform > [tab] Claude > > Claude supports MCP servers through its Connectors feature. To connect Fireflies documentation: > > 1. Open [Claude Settings](https://claude.ai/settings/connectors) > 2. Click **Add Connector** > 3. Enter the server URL: `https://docs.fireflies.ai/mcp` > 4. Save and start asking questions about Fireflies > > Once connected, Claude can search the Fireflies documentation to answer your questions about the API, implementation patterns, and best practices. > [tab] Claude Desktop > > For Claude Desktop, add the following configuration to your `claude_desktop_config.json` file: > > **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json` > > **Windows:** `%APPDATA%\Claude\claude_desktop_config.json` > > **Linux:** `~/.config/Claude/claude_desktop_config.json` > > ```json theme={null} > { > "mcpServers": { > "fireflies-docs": { > "command": "npx", > "args": [ > "mcp-remote", > "https://docs.fireflies.ai/mcp" > ] > } > } > } > ``` > > After saving the configuration, restart Claude Desktop. You can then ask Claude questions about Fireflies documentation directly. > [tab] VS Code > > VS Code supports MCP servers through GitHub Copilot. Create a `.vscode/mcp.json` file in your project: > > ```json theme={null} > { > "servers": { > "fireflies-docs": { > "type": "http", > "url": "https://docs.fireflies.ai/mcp" > } > } > } > ``` > > After configuration, use Copilot Chat in agent mode to query Fireflies documentation. > [tab] Cursor > > Cursor supports MCP servers through its settings. To configure: > > 1. Open Cursor Settings (Cmd/Ctrl + ,) > 2. Navigate to **Features > MCP Servers** > 3. Click **Add New MCP Server** > 4. Configure with the following details: > * **Name:** `fireflies-docs` > * **Type:** `url` > * **Server URL:** `https://docs.fireflies.ai/mcp` > > Alternatively, add to your `~/.cursor/mcp.json` file: > > ```json theme={null} > { > "mcpServers": { > "fireflies-docs": { > "url": "https://docs.fireflies.ai/mcp" > } > } > } > ``` > > After configuration, you can ask Cursor's AI assistant questions about Fireflies documentation. > [tab] Windsurf > > Windsurf supports MCP servers through its configuration. Add the following to your `~/.codeium/windsurf/mcp_config.json` file: > > ```json theme={null} > { > "mcpServers": { > "fireflies-docs": { > "serverUrl": "https://docs.fireflies.ai/mcp" > } > } > } > ``` > > After saving, restart Windsurf to enable the Fireflies documentation search. ### Available Tool The server provides one tool for searching documentation: **SearchFireflies** `Tool` **Description:** Search across the Fireflies knowledge base to find relevant information, code examples, API references, and guides. **Parameters:** * `query` (string, required) - A query to search the content with **Example:** ```json theme={null} { "query": "how to upload audio files" } ``` **Returns:** Contextual content with titles and direct links to the documentation pages. ### Example Queries Once configured, you can ask your AI tool questions like: * "How do I authenticate with the Fireflies API?" * "Show me an example of uploading audio for transcription" * "What fields are available in the transcript query?" * "How do I set up webhooks for Fireflies?" * "What are the rate limits for the API?" * "How do I search transcripts by date range?" ### Troubleshooting **Server not connecting:** * For Claude Desktop: Ensure you have Node.js installed (required for `npx mcp-remote`) * Check that the URL is exactly `https://docs.fireflies.ai/mcp` * Restart your AI application after configuration changes **No results returned:** * Try rephrasing your query with different keywords * Be specific about what you're looking for (e.g., "GraphQL mutation for uploading audio" instead of just "upload") ### Additional Resources > [card] [MCP Server Configuration](/getting-started/mcp-configuration) > > Connect AI tools to your meeting data with the Fireflies MCP Server > [card] [MCP Tools Reference](/mcp-tools/overview) > > Complete reference for all available MCP tools for meeting data # Introduction Source: https://docs.fireflies.ai/getting-started/introduction Welcome to Fireflies public API documentation. > [!NOTE] > > We are actively working to expose more functionality via our API. If you have specific requests, > please [reach out to us](https://guide.fireflies.ai/). # Introduction ## Overview of the API The Fireflies API is built on top of GraphQL, a powerful interface designed to provide you with efficient and flexible access to your data. This API allows you to retrieve exactly the data you need in a structured format. Whether you are building a web application, a mobile app, or a complex software system, our API caters to a wide range of data requirements. Our API covers various functionalities, including queries for fetching data as well as uploading meeting audio. It is designed to be intuitive and easy to use, ensuring that you can start fetching and manipulating data with minimal setup. ## Advantages of Using GraphQL **1. Precise Data Fetching:** One of the key strengths of GraphQL is its ability to return exactly what you request and nothing more. This precision eliminates the over-fetching of data, common in traditional REST APIs, leading to more efficient network utilization and faster response times. **2. Single Endpoint:** Unlike REST APIs, which often require multiple endpoints for different data needs, GraphQL operates through a single endpoint. This simplification streamlines interactions with the API and makes maintaining and managing the API more straightforward. **3. Flexibility and Scalability:** GraphQL APIs are incredibly flexible, allowing for queries that can evolve with your needs. This flexibility, combined with efficient data retrieval, makes GraphQL an ideal choice for both small projects and large-scale applications. In the following sections, we will guide you through the essential components of our API, provide detailed examples, and offer best practices to help you make the most of our API. Whether you're a new user or an experienced developer, this documentation is designed to assist you in seamlessly integrating the API into your applications. ## Additional Resources > [card] [Quickstart](/getting-started/quickstart) > > Make your first request in under 5 minutes > [card] [Concepts](/fundamentals/concepts) > > Foundational guide to the core aspects of the Fireflies API # LLM-based Development Source: https://docs.fireflies.ai/getting-started/llm-development Enhance your AI coding experience with LLM readable documentation. ### Overview Welcome to the guide on utilizing our specialized `llms.txt` files to enhance your LLM-based coding workflow. Whether you’re using Replit, Cursor, Devin, or any other AI coding tool, this page will assist you in leveraging our resources to debug and refine code generated by Fireflies. Our platform seamlessly integrates with a variety of AI coding tools. While the generated code may not always be perfect, this guide outlines how to effectively use our `llms.txt` files to improve the debugging process, ensuring your development workflow remains smooth and efficient. ### How to Use `llms.txt` Files #### For Tools with Limited Agentic Capabilities If your coding tool does not support web querying or autonomous resource fetching: * **Download the File**\ Access the complete file by visiting [this link](https://docs.fireflies.ai/llms-full.txt) and download it to your local machine. * **Upload and Debug**\ Upload the downloaded file to your AI coding tool. Instruct your tool to analyze and debug the code using the content of this file. This manual intervention guides the tool in identifying and fixing errors in generated code. #### For Advanced, Agentic Coding Tools If your coding tool is sophisticated and capable of querying the web independently: * **Provide the URL Directly**\ Instead of downloading the full file, supply your tool with the URL [https://docs.fireflies.ai/llms-full.txt](https://docs.fireflies.ai/llms-full.txt). * **Let It Decide**\ Your advanced tool will automatically determine which parts of the file to use and where to look, streamlining the debugging process without additional manual steps. ### Additional Tips * **Tool Configuration:** Ensure that your AI coding tool is configured to handle file uploads or URL-based inputs effectively. * **Experiment and Adapt:** Different tools may interact with our resources in unique ways. Experiment with both methods to find the approach that best suits your workflow. * **Support and Documentation:** If you encounter any challenges or need further assistance, please contact our support team. Happy coding! ## Additional Resources > [card] [MCP Configuration](/getting-started/mcp-configuration) > > Connect your AI tools directly to your meeting data > [card] [Concepts](/fundamentals/concepts) > > Foundational guide to the core aspects of the Fireflies API # MCP Server Configuration Source: https://docs.fireflies.ai/getting-started/mcp-configuration Connect your AI tools directly to your meeting data with Fireflies MCP Server. ### Overview The Fireflies MCP Server enables AI tools to connect directly to your meeting data without switching platforms or copying transcript excerpts. This integration allows you to ask questions like "What were the main objections in this week's sales calls?" or "Create a summary of all product feedback from user interviews this month" directly from your AI coding tools. ### What is MCP? Model Context Protocol (MCP) is an open standard that enables AI applications to securely connect to external data sources and tools. With Fireflies MCP Server, your AI tools can access meeting transcripts, summaries, action items, and insights directly from your Fireflies account. ### Getting Started #### Prerequisites * Active Fireflies.ai account * AI tool that supports MCP (such as Claude, OpenAI Connector, Cursor, Devin, or other MCP-compatible applications) #### Installation 1. **Configure your AI tool** Add the Fireflies MCP server to your AI tool's configuration. The remote server URL is [https://api.fireflies.ai/mcp](https://api.fireflies.ai/mcp) which uses OAuth with your Fireflies account. The exact steps depend on your specific AI application. For specific AI tools, you can also configure directly through: * [Claude Settings](https://claude.ai/settings/connectors) * [Devin MCP Marketplace](https://app.devin.ai/settings/mcp-marketplace/setup/fireflies) 2. **Use your Fireflies API key on Claude Desktop** (Optional): 1. Add this config to your `claude_desktop_config.json` file: ```json theme={null} { "mcpServers": { "fireflies": { "command": "npx", "args": [ "mcp-remote", "https://api.fireflies.ai/mcp", "--header", "Authorization: Bearer YOUR_API_KEY_HERE" ] } } } ``` 2. Get your API Key from Fireflies * Go to **Settings > Developer Settings** and **Copy your API key** * [See how to get your API key →](https://guide.fireflies.ai/hc/en-us/articles/360020249198-How-to-access-the-Fireflies-API-key) * Once you have the API key, paste it in your claude\_desktop\_config.json * Replace `YOUR_API_KEY_HERE` with your actual API key 3. Restart Claude Desktop **Transport note.** The Fireflies MCP server speaks Streamable HTTP only, at `POST https://api.fireflies.ai/mcp`, and supports both the current MCP protocol revision (2026-07-28) and the earlier ones your client may still use. The older HTTP+SSE transport (`GET /mcp` stream + `POST /messages`, from MCP revision 2024-11-05) has been retired at Fireflies. The 2026-07-28 revision of the MCP specification marks that transport deprecated — its deprecation window has run out, so a future revision may remove it — and the current SDK keeps it only as a frozen legacy package. If your client reports a 405 or 410 from Fireflies, it is configured for that retired transport: * **mcp-remote**: remove `--transport sse-only` (the default, or `--transport http-only`, works). * **OpenClaw**: add `--transport http` when adding the server (`openclaw mcp add fireflies --transport http --url https://api.fireflies.ai/mcp`), or set `"transportType": "streamable-http"` on an imported server entry. 3. **Start querying your data** Once configured, you can ask your AI tool questions about your meeting data directly. ### Use Cases * **Sales Analysis**: "What were the common objections in this week's sales calls?" * **Product Feedback**: "Summarize all product feedback from user interviews this month" * **Meeting Insights**: "What action items were assigned to John across all meetings?" * **Trend Analysis**: "How has customer sentiment changed over the past quarter?" ### Additional Resources > [card] [MCP Tools](/mcp-tools/overview) > > Complete reference for all available MCP tools and their parameters > [card] [LLM-based Development](/getting-started/llm-development) > > Enhance your AI coding experience with LLM readable documentation > [card] [Authorization](/fundamentals/authorization) > > Authenticating your requests with the Fireflies API # Quickstart Source: https://docs.fireflies.ai/getting-started/quickstart Make your first request in under 5 minutes. This guide provides step-by-step instructions to make your first query with our GraphQL API and demonstrates basic functionality. ## Step 1: Setting Up Before diving into querying the API, it's essential to set up your environment correctly. This includes obtaining authentication credentials and configuring your development environment. ### Obtaining Authentication Credentials To access our API, you will need an API key. Follow these steps to obtain your key: 1. Log in to your account at [app.fireflies.ai](https://app.fireflies.ai) 2. Navigate to the [Integrations](https://app.fireflies.ai/integrations) section 3. Click on [Fireflies API](https://app.fireflies.ai/integrations/custom/fireflies) 4. Copy and store your API key securely > [!NOTE] > > It's crucial to handle your API key with the utmost care to ensure the security of your data. For > more information on Authorization and best practices, visit > [Authorization](/fundamentals/authorization) ## Step 2: Making Your First Request Execute a simple query to retrieve a list of users. Replace `your_api_key` with your API key in the following requests ```bash curl theme={null} curl \ -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "{ users { name user_id } }" }' \ https://api.fireflies.ai/graphql ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': '{ users { name user_id } }' } response = requests.post(url, json=data, headers=headers) print(response.json()) ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: '{ users { name user_id } }' }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error('Error:', error); }); ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpHeaders; import java.nio.charset.StandardCharsets; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String url = "https://api.fireflies.ai/graphql"; String json = "{\"query\":\"{ users { name user_id } }\"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(HttpRequest.BodyPublishers.ofString(json, StandardCharsets.UTF_8)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` > [!NOTE] > > When building GraphQL queries for this API, focus on precision and efficiency. Start with simple > queries and gradually increase complexity. Ensure you only request the data you need to avoid > over-fetching. > > * **Review the Schema Documentation**: For guidance, refer to the [Schema](/schema) section and use tools like GraphQL Playground for testing. Efficient queries lead to better performance and a smoother API experience. More details on building your GraphQL query are available [here](/graphql-api) ## Step 3: Analyzing the Response You will receive a JSON response with the requested data. Example response: ```bash curl theme={null} { "data": { "users": [ { "name":"Justin Fly", "user_id":"example-id" } ] } } ``` Continue to the next sections for more detailed examples and advanced usage instructions. ## Additional Resources > [card] [Users](/graphql-api/query/users) > > Query users using the API > [card] [Authorization](/fundamentals/authorization) > > Authenticating your requests with the Fireflies API # What's New Source: https://docs.fireflies.ai/getting-started/whats-new Latest updates to the Fireflies API Take a look at our latest updates, features, and improvements for the Fireflies API. **2.34.0** Upload recordings through MCP; direct upload on every paid plan ### Upload recordings from your AI assistant AI assistants that can run commands on your computer, such as Claude Code, Cursor, VS Code or Codex, can now upload a local audio or video file to Fireflies through the [Fireflies MCP Server](/mcp-tools/overview#file-upload-tools). Ask your assistant to upload a recording: `fireflies_create_upload_url` returns a signed upload form, the assistant uploads the file straight to Fireflies storage, and `fireflies_confirm_upload` starts transcription and returns the meeting link. The file never passes through the MCP server, and storage refuses a file over the size limit (400 MB for audio, 2 GB for video). The tools need a paid plan and are not listed in chat clients that cannot read your files (Claude's connector on claude.ai and in the Claude apps, and ChatGPT). Direct upload through the API is now available on every paid plan too: [createUploadUrl](/graphql-api/mutation/create-upload-url) and [confirmUpload](/graphql-api/mutation/confirm-upload) no longer need whitelisting. Ask `createUploadUrl` for `upload_method: POST` to get the size-limited signed form (recommended). Without it you get a signed `PUT` URL, exactly as before. See [Uploading the File](/graphql-api/mutation/create-upload-url#uploading-the-file). **2.29.0** createUploadUrl accepts a meeting\_date ### Set the real meeting date on direct uploads The [createUploadUrl](/graphql-api/mutation/create-upload-url) mutation now accepts an optional `meeting_date` (ISO 8601 `String`) on `CreateUploadUrlInput`, the same field `uploadAudio` accepts. Use it when importing historical recordings so the meeting is dated with the actual meeting start time instead of the upload time. It accepts `YYYY-MM-DD` alone (UTC midnight) or `YYYY-MM-DDTHH:MM:SS[.fff]` with `Z` or a `±HH:MM` offset, must be strictly after `1970-01-01T00:00:00Z`, and must not be in the future; when omitted, the upload time is used as before. The `attendees` passed to `createUploadUrl` are now also saved on the meeting — note an attendee is dropped when its email contains the uploader's email as a substring (case-sensitive). **2.28.0** Higher API rate limits ### Higher API rate limits * **Free & Pro:** 10x higher daily limits. Free goes from 50 to 500 requests per day, and Pro from 500 to 5,000 requests per day. * **Business & Enterprise:** rate limits are now pooled across your team, at 60 requests per minute per paid seat (up to 1,200 per minute on Business and 2,400 on Enterprise). See [Limits](/fundamentals/limits) for details. **2.27.0** uploadAudio accepts a meeting\_date for historical imports ### Set the real meeting date on audio uploads The [uploadAudio](/graphql-api/mutation/upload-audio) mutation now accepts an optional `meeting_date` (ISO 8601 `String`) on `AudioUploadInput`. Use it when importing historical recordings so the meeting is dated with the actual meeting start time instead of the upload time. It must not be in the future; when omitted, the upload time is used as before. **2.26.1** Higher rate limit for shareMeeting ### Higher rate limit for shareMeeting Increased the [shareMeeting](/graphql-api/mutation/share-meeting) mutation rate limit from 10 to 60 requests per hour per user. The general API rate limits and the 50-email-per-request cap are unchanged. See [Limits](/fundamentals/limits) for details. **2.26.0** Share meetings with a password-protected link ### Share meetings with a password-protected link (Beta) The [shareMeeting](/graphql-api/mutation/share-meeting) mutation can now create a password-protected link so guests can view a meeting without a Fireflies account. Set `share_type` to `PASSWORD_LINK` with a `password`, and build the guest link from the returned `share_slug`. Recipients in `emails` are notified with the link — the password is never emailed, so share it separately. This is in beta and is being progressively rolled out. Contact support to have it enabled for your organization. **2.25.1** Uploads can be disabled per organization ### File uploads can be disabled for your organization The [uploadAudio](/graphql-api/mutation/upload-audio), [createUploadUrl](/graphql-api/mutation/create-upload-url) and [confirmUpload](/graphql-api/mutation/confirm-upload) mutations now return a [`feature_disabled`](/miscellaneous/error-codes#feature_disabled) error when an admin has disabled file uploads for transcription in your organization. When uploads are enabled, behavior is unchanged. **2.25.0** AskFred: control suggested queries ### Control suggested-query generation in AskFred The [Create AskFred Thread](/graphql-api/mutation/create-askfred-thread) and [Continue AskFred Thread](/graphql-api/mutation/continue-askfred-thread) mutations now accept an optional `generate_suggestions` boolean. Set it to `false` to skip generating suggested follow-up queries for a faster response — `suggested_queries` is returned as `null`. When omitted, suggested queries are generated only when your query selects the `suggested_queries` field, so existing integrations are unaffected. **2.24.0** New MCP Tools ### New MCP Tools The [Fireflies MCP Server](/mcp-tools/overview) has been expanded with 11 new tools, bringing the total to 17 core tools (plus 2 experimental). The MCP Server now supports write operations in addition to read-only queries, enabling AI assistants to take actions on your behalf. **New Meeting Management Tools:** * `fireflies_share_meeting` - Share meeting transcripts with up to 100 email recipients, with optional expiry * `fireflies_revoke_meeting_access` - Revoke previously shared meeting access * `fireflies_update_meeting_title` - Update the title of a meeting transcript * `fireflies_move_meeting` - Move meetings to a channel/folder (up to 5 at a time) **New Channel Tools:** * `fireflies_list_channels` - List all available channels/folders * `fireflies_get_channel` - Get details of a specific channel by ID **New Soundbite Tools:** * `fireflies_get_soundbites` - Fetch soundbites filtered by transcript, ownership, or team * `fireflies_create_soundbite` - Create a soundbite clip from a meeting transcript **New Analytics & Monitoring Tools:** * `fireflies_get_active_meetings` - Retrieve currently active (in-progress) meetings * `fireflies_get_analytics` - Get team and per-user meeting and conversation analytics **New Automation Tools:** * `fireflies_get_rule_executions` - View automation rule execution logs (Enterprise) For the complete tool reference, see [MCP Tools](/mcp-tools/overview). **2.23.0** Live Transcript Support ### Live Transcript Support The [Transcript](/schema/transcript) schema now includes a new `is_live` field that indicates whether a meeting is currently live (active or paused). When querying a live meeting, the `sentences` field automatically returns real-time captions from the ongoing meeting instead of processed transcript data. This enables building features such as: * Displaying live captions during an active meeting * Monitoring meeting progress in real time * Building dashboards that show both live and completed meeting transcripts **New Fields:** * `is_live` on [Transcript](/schema/transcript) - Boolean indicating whether the meeting is currently live **Enhanced Behavior:** * `sentences` on [Transcript](/schema/transcript) - Now returns real-time captions for live meetings, and processed transcript data for completed meetings **2.22.0** Meeting Sharing API ### Meeting Sharing API The Fireflies API now supports programmatic meeting sharing. Share meetings with external or internal users via email, control access duration, view who has access, and revoke access — all through the API. **New Mutations:** * [shareMeeting](/graphql-api/mutation/share-meeting) - Share a meeting with up to 100 email recipients, with optional expiry (7, 14, or 30 days) * [revokeSharedMeetingAccess](/graphql-api/mutation/revoke-shared-meeting-access) - Revoke a user's access to a shared meeting by email **New Query Field:** * `shared_with` on [Transcript](/schema/transcript) - List all users a meeting is shared with, including email, name, and expiry details All operations require meeting ownership or team admin privileges. **2.19.0** Channels API ### Channels API The Fireflies API now includes support for querying channels. The new [Channels](/graphql-api/query/channels) query allows you to fetch all channels accessible to the user, including public channels and private channels where the user is a member. **New Queries:** * [channels](/graphql-api/query/channels) - Fetch all accessible channels * [channel](/graphql-api/query/channel) - Fetch a single channel by ID **New Schemas:** * [Channel](/schema/channel) - Channel details including `id`, `title`, `is_private`, `created_at`, `updated_at`, `created_by`, and `members` * [ChannelMember](/schema/channel-member) - Channel member details with `user_id`, `email`, and `name` Channel access follows privacy rules: users can view all public channels and private channels they are members of. Super admins can view all channels within their team. **2.17.0** Authenticated Audio Downloads ### Authenticated Audio Downloads The [Upload Audio](/graphql-api/mutation/upload-audio) mutation now supports authenticated downloads for media files that require authentication. You can now upload audio/video files from private servers or protected storage using bearer token or HTTP basic authentication. This feature adds a new `download_auth` field to the `AudioUploadInput` type, allowing you to specify authentication credentials that Fireflies will use when downloading your media file. This is particularly useful for: * Files stored in private cloud storage (AWS S3, Google Cloud Storage, Azure Blob Storage) * Media hosted on servers with HTTP Basic Auth protection * API-protected resources requiring bearer tokens * Internal company file servers The implementation includes four new schema types: * [DownloadAuthInput](/schema/input/download-auth-input) - Main authentication configuration * [BearerTokenAuthInput](/schema/input/bearer-token-auth-input) - Bearer token configuration * [BasicAuthInput](/schema/input/basic-auth-input) - Basic auth configuration * [DownloadAuthType](/schema/enum/download-auth-type) - Authentication type enum The feature maintains full backward compatibility - existing uploads without authentication continue to work as before. **2.16.0** AskFred - AI Meeting Assistant ### AskFred - AI Meeting Assistant Introducing **AskFred**, an AI-powered assistant that lets you query your meeting transcripts using natural language. Ask questions about single meetings or analyze patterns across multiple meetings with context-aware, conversational responses. **Key Capabilities:** * Ask questions in plain language and get instant answers * Maintain conversation threads with contextual follow-ups * Query across multiple meetings with flexible filters * Receive AI-generated suggestions for deeper exploration * Multilingual question and response support **Get Started:** * [Overview](/askfred/overview) - Learn about capabilities * [Quickstart](/askfred/quickstart) - Create your first thread * [Use Cases](/askfred/use-cases) - Common scenarios and examples **New API Operations:** [askfred\_threads](/graphql-api/query/askfred-threads), [askfred\_thread](/graphql-api/query/askfred-thread), [createAskFredThread](/graphql-api/mutation/create-askfred-thread), [continueAskFredThread](/graphql-api/mutation/continue-askfred-thread), [deleteAskFredThread](/graphql-api/mutation/delete-askfred-thread) **2.15.0** Set Meeting Channels ### Set Meeting Channels The new [Update Meeting Channel](/graphql-api/mutation/update-meeting-channel) mutation allows meeting owners and team administrators to set the channel for one or more meetings. You can update 1–5 transcripts to a single channel in one API call with all-or-nothing semantics. This mutation requires either meeting ownership or team admin privileges for all specified transcripts. If any transcript fails validation, none of the transcripts will be updated, ensuring data consistency across your channel organization. **2.14.0** Active Meetings Fetching ### Active Meetings Fetching The new [Active Meetings](/graphql-api/query/active-meetings) query allows you to fetch meetings currently in progress. This query returns real-time information about active meetings including meeting details, start time, organizer, and meeting link. **2.14.0** AskFred - AI Meeting Assistant ### AskFred - AI Meeting Assistant Introducing **AskFred**, an AI-powered assistant that lets you query your meeting transcripts using natural language. Ask questions about single meetings or analyze patterns across multiple meetings with context-aware, conversational responses. **Key Capabilities:** * Ask questions in plain language and get instant answers * Maintain conversation threads with contextual follow-ups * Query across multiple meetings with flexible filters * Receive AI-generated suggestions for deeper exploration * Multilingual question and response support **Get Started:** * [Overview](/askfred/overview) - Learn about capabilities * [Quickstart](/askfred/quickstart) - Create your first thread * [Use Cases](/askfred/use-cases) - Common scenarios and examples **New API Operations:** [askfred\_threads](/graphql-api/query/askfred-threads), [askfred\_thread](/graphql-api/query/askfred-thread), [createAskFredThread](/graphql-api/mutation/create-askfred-thread), [continueAskFredThread](/graphql-api/mutation/continue-askfred-thread), [deleteAskFredThread](/graphql-api/mutation/delete-askfred-thread) **2.13.0** Rate Limiting for Delete Transcript ### Rate Limiting for Delete Transcript The [Delete Transcript](/graphql-api/mutation/delete-transcript) mutation now includes rate limiting protection to prevent abuse. The mutation is limited to 10 requests per minute across all user tiers. If you exceed this limit, the API will return a `too_many_requests` error (HTTP 429) with a `retryAfter` timestamp indicating when you can make requests again. **2.12.0** Meeting Privacy Control ### Meeting Privacy Control The new [Update Meeting Privacy](/graphql-api/mutation/update-meeting-privacy) mutation allows meeting owners and team administrators to programmatically update meeting privacy settings. You can now change privacy levels between `link`, `owner`, `participants`, `teammatesandparticipants`, and `teammates` to control who can access meeting transcripts. This mutation follows the same authorization pattern as other meeting management operations, requiring either meeting ownership or team admin privileges. **2.10.0** Meeting Attendance Tracking ### Meeting Attendance Tracking The [Transcript](/schema/transcript) schema now includes a new `meeting_attendance` field that provides detailed participant attendance information. This field returns an array of [MeetingAttendance](/schema/meeting-attendance) records showing when participants joined and left the meeting. Each attendance record includes the participant's name, join time (ISO 8601 format), and leave time (if they left during the meeting). This feature enables better meeting analytics and participation tracking by leveraging meeting events data. The attendance data is available in both [Transcript](/graphql-api/query/transcript) and [Transcripts](/graphql-api/query/transcripts) queries. **2.9.0** Channel Filtering ### Channel Filtering The [Transcripts](/graphql-api/query/transcripts) query now supports filtering by channel using the new `channel_id` parameter. This allows you to retrieve transcripts from specific channels by providing a single channel ID. The `channel_id` parameter accepts a string value and enables more targeted querying of meeting transcripts within your organization's channels. **2.8.0** Array Fields for Organizers and Participants ### Array Fields for Organizers and Participants The [Transcripts](/graphql-api/query/transcripts) query now supports array fields `organizers` and `participants` that allow filtering by multiple email addresses. These new array fields provide more flexible querying capabilities while maintaining backward compatibility. The previous single email fields `organizer_email` and `participant_email` are now deprecated but continue to work. Using both old and new fields simultaneously will result in a validation error. **2.7.0** User Groups ### User Groups The Fireflies API now includes comprehensive support for user groups. The new [User Groups](/graphql-api/query/user-groups) query allows you to fetch all user groups within your team or filter to only show groups you belong to using the `mine` parameter. Additionally, the [User](/schema/user) and [Users](/graphql-api/query/users) queries now include enhanced `user_groups` fields with detailed member information, providing better visibility into team organization and collaboration. **2.6.2** Keyword search ### Keyword Search The [Transcripts](/graphql-api/query/transcripts) query has been enhanced to include keyword search functionality. By utilizing the `keyword` and `scope` parameters, you can now perform advanced searches within both the title and the transcript text, offering more precise retrieval. The `title` parameter has been deprecated in favor of `keyword` **2.6.1** Upload audio ### Enhancements to Audio Upload The [Upload Audio](/graphql-api/mutation/upload-audio) function now includes a `bypass_size_check` flag. This enhancement provides greater control over filtering unwanted uploads, such as voicemails from dialers. **2.6.0** Realtime API ### Realtime API The Fireflies.ai [Realtime API](/realtime-api/overview) allows your application to receive live transcription events over WebSockets. This enables building interactive features such as live captioning, transcription overlays, and real-time analysis as users speak. # Add to Live Source: https://docs.fireflies.ai/graphql-api/mutation/add-to-live Use the API to add the Fireflies.ai bot to an ongoing meeting ## Overview The `addToLiveMeeting` mutation allows you to add the Fireflies.ai bot to an ongoing meeting. It is rate limited to 3 requests per 20 minutes per user; on Business and Enterprise plans the team shares a pool of 3 requests per paid seat per 20 minutes, up to 60, of which a single user can use at most half (rounded up, never less than 3). ## Arguments **meeting\_link** `String!` *required* A valid http URL for the meeting link, i.e. gooogle meet, zoom, etc **title** `String` Title or name of the meeting, this will be used to identify the transcribed file. If title is not provided, a default title will be set automatically Maximum length is 256 characters. **meeting\_password** `String` Password for the meeting, if applicable. Maximum length is 32 characters. **duration** `Int` Meeting duration in minutes. Defaults to 60 minutes if param is not provided Minimum is 15 and maximum is 120. **language** `String` Language of the meeting. Defaults to English if not provided. For a complete list of language codes, please view [Language Codes](/miscellaneous/language-codes) Maximum length is 5 characters. **attendees** `[Attendee]` Array of [Attendees](/schema/input/attendee) for expected meeting participants. ## Usage Example To upload an audio file, provide the necessary input parameters to the mutation. Here's an example of how this mutation could be used: ```graphql theme={null} mutation AddToLiveMeeting($meetingLink: String!) { addToLiveMeeting(meeting_link: $meetingLink) { success } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation AddToLiveMeeting($meetingLink: String!) { addToLiveMeeting(meeting_link: $meetingLink) { success } }", "variables": { "meetingLink": "https://meet.google.com/code-here" } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: ` mutation AddToLiveMeeting($meetingLink: String!) { addToLiveMeeting(meeting_link: $meetingLink) { success } } `, variables: { meetingLink: 'https://meet.google.com/code-here' } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' mutation AddToLiveMeeting($meetingLink: String!) { addToLiveMeeting(meeting_link: $meetingLink) { success } } ''', 'variables': {'meetingLink': 'https://meet.google.com/code-here'} } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()) else: print(response.text) ``` ```java java theme={null} import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; import java.net.http.HttpResponse.BodyHandlers; public class ApiRequest { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"mutation AddToLiveMeeting($meetingLink: String!) { addToLiveMeeting(meeting_link: $meetingLink) { success } }\", \"variables\": {\"meetingLink\": \"https://meet.google.com/code-here\"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "addToLiveMeeting": { "success": true, } } } ``` ## FAQ > [accordion] Why am I getting a 'too\_many\_requests' error? > > The `addToLiveMeeting` mutation has a limit of 3 requests per 20 minutes per user. Business and Enterprise teams share a pool of 3 requests per paid seat per 20 minutes (up to 60), so another team member's calls count against the same pool; a single user can use at most half of it (rounded up, never less than 3). > > You may view API Rate limits [here](/fundamentals/limits). ## Error Codes List of possible error codes that may be returned by the `addToLiveMeeting` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] too\_many\_requests > > You have exceeded the rate limit for the `addToLiveMeeting` mutation: 3 requests per 20 minutes per user, or your team's pooled allowance on Business and Enterprise. Wait for the number of seconds in the `Retry-After` header before retrying; `extensions.metadata.retryAfter` in the error body gives the same moment as an epoch timestamp in milliseconds. > [accordion] invalid\_language\_code > > The language code you provided is invalid. Please refer to the [Language Codes](/miscellaneous/language-codes) page for a list of valid language codes. > [accordion] unsupported\_platform > > The meeting platform URL provided is not supported. Please use a supported meeting platform such as Zoom, Google Meet, Microsoft Teams, etc. ## Audit Trail A successful call records a [`LIVE_MEETING_BOT_REQUESTED`](/graphql-api/query/audit-events) audit event carrying the meeting duration in metadata. ## Additional Resources > [card] [Upload Audio](/graphql-api/mutation/upload-audio) > > Use the API to upload audio to Fireflies.ai > [card] [Webhooks](/graphql-api/webhooks-v2) > > Create notifications using webhooks # Add User to User Group Source: https://docs.fireflies.ai/graphql-api/mutation/add-user-to-user-group Use the API to add users to a user group ## Overview The `addUserToUserGroup` mutation adds a teammate to one of your team's user groups, identified by their email address. The requesting user must be a team admin. ## Arguments **group\_id** `String` *required* The unique identifier of the user group. **user\_email** `String` *required* The email address of the user to add to the group. ## Usage Example To add a user to a user group, provide the group's ID and the user's email as arguments to the mutation. Here's an example of how this mutation could be used: ```graphql theme={null} mutation addUserToUserGroup($groupId: String!, $userEmail: String!) { addUserToUserGroup(group_id: $groupId, user_email: $userEmail) { id name handle members { user_id email } } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation($group_id: String!, $user_email: String!) { addUserToUserGroup(group_id: $group_id, user_email: $user_email) { id name handle members { user_id email } } }", "variables": { "group_id": "your_group_id", "user_email": "user@example.com" } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: `mutation Mutation($groupId: String!, $userEmail: String!) { addUserToUserGroup(group_id: $groupId, user_email: $userEmail) { id name handle members { user_id email } } }`, variables: { groupId: 'your_group_id', userEmail: 'user@example.com' } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' mutation($group_id: String!, $user_email: String!) { addUserToUserGroup(group_id: $group_id, user_email: $user_email) { id name handle members { user_id email } } } ''', 'variables': { 'group_id': "your_group_id", 'user_email': "user@example.com" } } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()['data']) else: print(response.text) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"mutation AddUserToUserGroup($group_id: String!, $user_email: String!) { addUserToUserGroup(group_id: $group_id, user_email: $user_email) { id name handle members { user_id email } } }\", \"variables\": {\"group_id\": \"your_group_id\", \"user_email\": \"user@example.com\"}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "addUserToUserGroup": { "id": "your_group_id", "name": "Sales Team", "handle": "sales-team", "members": [ { "user_id": "user_id", "email": "user@example.com" } ] } } } ``` ## Error Codes List of possible error codes that may be returned by the `addUserToUserGroup` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found > > The user group or teammate could not be found, or no user matches the provided `user_email`. > [accordion] not\_in\_team > > The user you are trying to add is not in your team. > [accordion] invalid\_arguments > > The provided `user_email` is not a valid email address. > [accordion] require\_elevated\_privilege > > The user does not have admin privileges to manage user groups. > [accordion] bad\_request > > The user is already a member of the user group. > [accordion] forbidden > > You do not have access to this user group. > [accordion] paid\_required > > Managing user groups requires a Business plan or higher. ## Audit Trail A successful call records a [`USER_GROUP_MEMBER_ADDED`](/graphql-api/query/audit-events) audit event carrying the `group_id` in its metadata, so membership changes are queryable after the fact. ## Additional Resources > [card] [User Groups](/graphql-api/query/user-groups) > > Querying list of user groups > [card] [Remove User from User Group](/graphql-api/mutation/remove-user-from-user-group) > > Removing a user from a user group # Continue AskFred Thread Source: https://docs.fireflies.ai/graphql-api/mutation/continue-askfred-thread Continue an existing AskFred conversation with follow-up questions ## Overview The `continueAskFredThread` mutation allows you to add follow-up questions to an existing AskFred conversation thread. This maintains the context of previous questions and answers, enabling more sophisticated multi-turn conversations about your meeting data. ## Arguments **input** `ContinueAskFredThreadInput` **thread\_id** `String` *required* The ID of the existing thread to continue **query** `String` *required* Your follow-up question or query. Maximum 2000 characters. **response\_language** `LanguageCode` Language code for the response (e.g., 'en' for English, 'es' for Spanish). See [Language Codes](/miscellaneous/language-codes) for full list. **format\_mode** `FormatMode` Response format: 'markdown' for rich formatting or 'plaintext' for simple text **generate\_suggestions** `Boolean` Whether to generate suggested follow-up queries (`suggested_queries`) for the response. When omitted, this is inferred from whether your query selects the `suggested_queries` field. Set to `false` to skip generation for a faster response — `suggested_queries` is then returned as `null`. Setting `true` always generates them (adding some latency); if you don't also select `suggested_queries`, they're generated but not returned, so only set `true` when you intend to read the field. ## Returns Returns an `AskFredResponse` object containing the generated message with the answer to your follow-up query. ## Usage Example ```graphql theme={null} mutation ContinueThread($input: ContinueAskFredThreadInput!) { continueAskFredThread(input: $input) { message { id thread_id query answer suggested_queries status created_at } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation ContinueThread($input: ContinueAskFredThreadInput!) { continueAskFredThread(input: $input) { message { id thread_id query answer suggested_queries status } } }", "variables": { "input": { "thread_id": "thread_abc123", "query": "Can you provide more details about the budget allocation?", "response_language": "en", "format_mode": "markdown" } } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const input = { thread_id: "thread_abc123", query: "Can you provide more details about the budget allocation?", response_language: "en", format_mode: "markdown" }; const data = { query: ` mutation ContinueAskFredThread($input: ContinueAskFredThreadInput!) { continueAskFredThread(input: $input) { message { id thread_id query answer suggested_queries status created_at } } } `, variables: { input } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.error(e); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } input_data = { "thread_id": "thread_abc123", "query": "Can you provide more details about the budget allocation?", "response_language": "en", "format_mode": "markdown" } query = ''' mutation ContinueAskFredThread($input: ContinueAskFredThreadInput!) { continueAskFredThread(input: $input) { message { id thread_id query answer suggested_queries status created_at } } } ''' data = { 'query': query, 'variables': {'input': input_data} } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()) else: print(response.text) ``` ```json Response theme={null} { "data": { "continueAskFredThread": { "message": { "id": "msg_003", "thread_id": "thread_abc123", "query": "Can you provide more details about the budget allocation?", "answer": "Certainly! Here are the detailed budget allocations discussed in the meeting:\n\n## Q4 Budget Breakdown ($150K Total)\n\n### Engineering (60% - $90K)\n- **Infrastructure Improvements**: $30K\n - Cloud services optimization\n - Database scaling\n - Security enhancements\n- **Feature Development**: $45K\n - Mobile app features: $25K\n - API v2 development: $20K\n- **Technical Debt**: $15K\n - Code refactoring\n - Legacy system migration\n\n### Design & UX (25% - $37.5K)\n- **User Research**: $10K\n- **Design System Updates**: $15K\n- **Prototype Development**: $12.5K\n\n### Marketing & Growth (15% - $22.5K)\n- **Content Creation**: $7.5K\n- **Paid Acquisition Tests**: $10K\n- **Partnership Development**: $5K\n\nThe CFO emphasized maintaining a 10% contingency within each category for unexpected costs.", "suggested_queries": [ "Who is responsible for managing each budget category?", "What are the key milestones for the infrastructure improvements?", "How will the budget be tracked and reported?" ], "status": "completed", "created_at": "2024-03-15T10:35:00Z" } } } } ``` ## Error Codes > [accordion] object\_not\_found > > The specified thread\_id does not exist or you don't have access to it > [accordion] require\_ai\_credits > > You have insufficient AI credits to continue the thread. Please upgrade your plan or purchase additional credits. > [accordion] invalid\_language\_code > > The language code you provided is invalid. Please refer to the [Language Codes](/miscellaneous/language-codes) page for a list of valid language codes. ## Audit Trail A successful call records a [`ASKFRED_THREAD_CONTINUED`](/graphql-api/query/audit-events) audit event for the thread with its meeting ID and message ID in metadata. ## Related > [card] [View Thread](/graphql-api/query/askfred-thread) > > Get complete thread with all messages > [card] [Create New Thread](/graphql-api/mutation/create-askfred-thread) > > Start a new conversation thread # Create AskFred Thread Source: https://docs.fireflies.ai/graphql-api/mutation/create-askfred-thread Create a new AskFred conversation thread with a question about your meetings ## Overview The `createAskFredThread` mutation allows you to start a new AskFred conversation by asking questions about your meeting transcripts. You can ask about a specific meeting or search across multiple meetings using filters. AskFred uses AI to analyze your meeting data and provide intelligent, context-aware answers. ## Arguments **input** `CreateAskFredThreadInput` **query** `String` *required* Your question or query about the meeting(s). Maximum 2000 characters. **transcript\_id** `String` ID of a specific transcript/meeting to query. If provided, the question will be answered based only on this meeting. **filters** `AskFredMeetingFiltersInput` Filters to search across multiple meetings. Only used if transcript\_id is not provided. **start\_time** `String` Filter meetings from this date/time (ISO 8601 format). Cannot be more than 1 year in the past. If not provided, defaults to 30 days before end\_time. **end\_time** `String` Filter meetings until this date/time (ISO 8601 format). If not provided, defaults to today. **channel\_ids** `[String]` Filter by specific channel/integration IDs **organizers** `[String]` Filter by meeting organizer email addresses **participants** `[String]` Filter by participant email addresses **transcript\_ids** `[String]` Filter by specific transcript IDs **response\_language** `LanguageCode` Language code for the response (e.g., 'en' for English, 'es' for Spanish). See [Language Codes](/miscellaneous/language-codes) for full list. **format\_mode** `FormatMode` Response format: 'markdown' for rich formatting or 'plaintext' for simple text **generate\_suggestions** `Boolean` Whether to generate suggested follow-up queries (`suggested_queries`) for the response. When omitted, this is inferred from whether your query selects the `suggested_queries` field. Set to `false` to skip generation for a faster response — `suggested_queries` is then returned as `null`. Setting `true` always generates them (adding some latency); if you don't also select `suggested_queries`, they're generated but not returned, so only set `true` when you intend to read the field. ## Returns Returns an `AskFredResponse` object containing the generated message with the answer to your query. ## Usage Example ### Query a Specific Meeting ```graphql theme={null} mutation CreateThreadForMeeting($input: CreateAskFredThreadInput!) { createAskFredThread(input: $input) { message { id thread_id query answer suggested_queries status created_at } } } ``` ### Query Across Multiple Meetings ```graphql theme={null} mutation CreateThreadWithFilters($input: CreateAskFredThreadInput!) { createAskFredThread(input: $input) { message { id thread_id query answer suggested_queries status } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation CreateThread($input: CreateAskFredThreadInput!) { createAskFredThread(input: $input) { message { id thread_id query answer suggested_queries status } } }", "variables": { "input": { "query": "What were the main decisions made in the product planning meeting?", "transcript_id": "transcript_xyz789", "response_language": "en", "format_mode": "markdown" } } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; // Example 1: Query a specific meeting const inputForSpecificMeeting = { query: "What were the action items discussed?", transcript_id: "transcript_xyz789", response_language: "en", format_mode: "markdown" }; // Example 2: Query across meetings with filters const inputWithFilters = { query: "What customer concerns were raised this week?", filters: { start_time: "2024-03-10T00:00:00Z", end_time: "2024-03-17T00:00:00Z", participants: ["customer@example.com"] }, response_language: "en", format_mode: "markdown" }; const data = { query: ` mutation CreateAskFredThread($input: CreateAskFredThreadInput!) { createAskFredThread(input: $input) { message { id thread_id query answer suggested_queries status created_at } } } `, variables: { input: inputForSpecificMeeting } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.error(e); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } # Example 1: Query a specific meeting input_specific = { "query": "What were the action items discussed?", "transcript_id": "transcript_xyz789", "response_language": "en", "format_mode": "markdown" } # Example 2: Query across meetings with filters input_filtered = { "query": "What customer concerns were raised this week?", "filters": { "start_time": "2024-03-10T00:00:00Z", "end_time": "2024-03-17T00:00:00Z", "participants": ["customer@example.com"] }, "response_language": "en", "format_mode": "markdown" } query = ''' mutation CreateAskFredThread($input: CreateAskFredThreadInput!) { createAskFredThread(input: $input) { message { id thread_id query answer suggested_queries status created_at } } } ''' data = { 'query': query, 'variables': {'input': input_specific} } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()) else: print(response.text) ``` ```json Response theme={null} { "data": { "createAskFredThread": { "message": { "id": "msg_001", "thread_id": "thread_new123", "query": "What were the main decisions made in the product planning meeting?", "answer": "Based on the product planning meeting transcript, here are the main decisions made:\n\n## Product Roadmap\n- **Q4 Focus**: Prioritize mobile app improvements and API v2 development\n- **Feature Freeze**: No new features after November 15th to focus on stability\n\n## Resource Allocation\n- **Team Expansion**: Approved hiring 2 senior engineers and 1 UX designer\n- **Budget**: Allocated $150K for Q4 development initiatives\n\n## Timeline\n- **Beta Release**: Planned for December 1st\n- **Public Launch**: Targeted for January 15th\n\n## Strategic Partnerships\n- **Integration Partners**: Approved partnerships with Slack and Microsoft Teams\n- **API Access**: Will provide early access to 5 strategic partners", "suggested_queries": [ "What specific mobile app improvements were discussed?", "Who will be responsible for the API v2 development?", "What were the concerns raised about the timeline?" ], "status": "completed", "created_at": "2024-03-15T10:30:00Z" } } } } ``` ## Error Codes > [accordion] invalid\_arguments > > Validation error occurred. Common causes: > > > [accordion] object\_not\_found > > The specified transcript\_id does not exist or you don't have access to it > [accordion] require\_ai\_credits > > You don't have access to AI credits. Upgrade your plan to use AskFred. > [accordion] invalid\_language\_code > > The provided response\_language code is not supported. See [Language Codes](/miscellaneous/language-codes) for valid options. ## Audit Trail A successful call records a [`ASKFRED_THREAD_CREATED`](/graphql-api/query/audit-events) audit event for the thread with its meeting ID and message ID in metadata. ## Related > [card] [Continue Thread](/graphql-api/mutation/continue-askfred-thread) > > Add follow-up questions to continue the conversation > [card] [List Threads](/graphql-api/query/askfred-threads) > > View all your AskFred conversation threads # Create bite Source: https://docs.fireflies.ai/graphql-api/mutation/create-bite Use the API to create a bite ## Overview The `createBite` mutation allows you to create a bite through the API. ## Arguments **transcript\_id** `ID` *required* ID of the transcript The schema also accepts the deprecated spelling `transcript_Id` (capital `I`), which earlier versions of the schema required. It will be removed in a future release; send `transcript_id`. **name** `String` Name of the bite Maximum length is 256 characters. **start\_time** `Float` *required* Start time of the bite in seconds **end\_time** `Float` *required* End time of the bite in seconds **media\_type** `String` Type of the bite, either 'video' or 'audio' **privacies** `[BitePrivacy!]` Array specifying the visibility of the Soundbite. Possible values are 'public', 'team', and 'participants'. For example, \["team", "participants"] indicates visibility to both team members and participants, while \["public"] denotes full public access. **summary** `String` Summary for the bite Maximum length is 500 characters. ## Usage Example To create a bite, provide the necessary input parameters to the mutation. Here's an example of how this mutation could be used: ```graphql theme={null} mutation Mutation($transcriptId: ID!, $startTime: Float!, $endTime: Float!) { createBite(transcript_id: $transcriptId, start_time: $startTime, end_time: $endTime) { status name id } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation CreateBite($transcriptId: ID!, $startTime: Float!, $endTime: Float!) { createBite(transcript_id: $transcriptId, start_time: $startTime, end_time: $endTime) { summary status id } }", "variables": { "transcriptId": "your_transcript_id", "startTime": 0, "endTime": 5 } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: `mutation CreateBite($transcriptId: ID!, $startTime: Float!, $endTime: Float!) { createBite(transcript_id: $transcriptId, start_time: $startTime, end_time: $endTime) { summary status id } }`, variables: { transcriptId: 'your_transcript_id', startTime: 0, endTime: 5 } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' mutation CreateBite($transcriptId: ID!, $startTime: Float!, $endTime: Float!) { createBite(transcript_id: $transcriptId, start_time: $startTime, end_time: $endTime) { summary status id } } ''', 'variables': { 'transcriptId': "your_transcript_id", 'startTime': 0, 'endTime': 5 } } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()['data']) else: print(response.text) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"mutation CreateBite($transcriptId: ID!, $startTime: Float!, $endTime: Float!) { createBite(transcript_id: $transcriptId, start_time: $startTime, end_time: $endTime) { summary status id } }\", \"variables\": {\"transcriptId\": \"your_transcript_id\", \"startTime\": 0, \"endTime\": 5}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "createBite": { "name": "bite-name", "status": "pending", } } } ``` ## Additional Resources > [card] [Bites](/graphql-api/query/bites) > > Querying list of bites > [card] [Bite](/graphql-api/query/bite) > > Querying bite details # Create Live Action Item Source: https://docs.fireflies.ai/graphql-api/mutation/create-live-action-item Use the API to create an action item during a live meeting ## Overview The `createLiveActionItem` mutation allows you to create an action item during a live meeting through the API. The action item is created using natural language processing via Fred, Fireflies' AI assistant. This mutation is rate-limited to 10 requests per hour across all user tiers. It also requires AI credits to be available on the user's account. ## Arguments **input** `CreateLiveActionItemInput!` *required* Input object containing the meeting ID and prompt for the action item. See [CreateLiveActionItemInput](/schema/input/create-live-action-item-input) for details. ## Response **success** `Boolean!` Whether the action item was created successfully ## Usage Example To create a live action item, provide the meeting ID and a natural language prompt: ```graphql theme={null} mutation CreateLiveActionItem($input: CreateLiveActionItemInput!) { createLiveActionItem(input: $input) { success } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation CreateLiveActionItem($input: CreateLiveActionItemInput!) { createLiveActionItem(input: $input) { success } }", "variables": { "input": { "meeting_id": "your_meeting_id", "prompt": "Follow up with the client about the proposal" } } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: `mutation CreateLiveActionItem($input: CreateLiveActionItemInput!) { createLiveActionItem(input: $input) { success } }`, variables: { input: { meeting_id: 'your_meeting_id', prompt: 'Follow up with the client about the proposal' } } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' mutation CreateLiveActionItem($input: CreateLiveActionItemInput!) { createLiveActionItem(input: $input) { success } } ''', 'variables': { 'input': { 'meeting_id': 'your_meeting_id', 'prompt': 'Follow up with the client about the proposal' } } } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()['data']) else: print(response.text) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"mutation CreateLiveActionItem($input: CreateLiveActionItemInput!) { createLiveActionItem(input: $input) { success } }\", \"variables\": {\"input\": {\"meeting_id\": \"your_meeting_id\", \"prompt\": \"Follow up with the client about the proposal\"}}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "createLiveActionItem": { "success": true } } } ``` ## Error Codes List of possible error codes that may be returned by the `createLiveActionItem` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found > > The meeting with the specified ID was not found or you do not have access to it. > [accordion] require\_elevated\_privilege > > You do not have permission to create action items for this meeting. Only the meeting organizer or team admin can create live action items. > [accordion] insufficient\_ai\_credits > > Your account does not have sufficient AI credits to perform this operation. Please upgrade your plan or purchase additional credits. > [accordion] too\_many\_requests > > You have exceeded the rate limit for this mutation. The limit is 10 requests per hour. Please wait before making additional requests. ## Audit Trail A successful call records a [`LIVE_ACTION_ITEM_CREATED`](/graphql-api/query/audit-events) audit event for the meeting. ## Additional Resources > [card] [Live Action Items](/graphql-api/query/live-action-items) > > Query live action items for a meeting > [card] [Update Meeting State](/graphql-api/mutation/update-meeting-state) > > Pause or resume recording for a live meeting # Create Live Soundbite Source: https://docs.fireflies.ai/graphql-api/mutation/create-live-soundbite Use the API to create a soundbite during a live meeting ## Overview The `createLiveSoundbite` mutation allows you to create a soundbite during a live meeting through the API. The soundbite is created using natural language processing via Fred, Fireflies' AI assistant. > [!NOTE] > > **Rate Limit:** This mutation is rate-limited to 10 requests per hour across all user tiers. If you exceed this limit, you will receive a `too_many_requests` error with a `retryAfter` timestamp indicating when you can make requests again. > > **AI Credits:** This mutation requires AI credits to be available on the user's account. ## Arguments **input** `CreateLiveSoundbiteInput!` *required* Input object containing the meeting ID and prompt for the soundbite. See [CreateLiveSoundbiteInput](/schema/input/create-live-soundbite-input) for details. ## Response **success** `Boolean!` Whether the soundbite was created successfully ## Usage Example To create a live soundbite, provide the meeting ID and a natural language prompt: ```graphql theme={null} mutation CreateLiveSoundbite($input: CreateLiveSoundbiteInput!) { createLiveSoundbite(input: $input) { success } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation CreateLiveSoundbite($input: CreateLiveSoundbiteInput!) { createLiveSoundbite(input: $input) { success } }", "variables": { "input": { "meeting_id": "your_meeting_id", "prompt": "Create a soundbite from the last 2 minutes" } } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: `mutation CreateLiveSoundbite($input: CreateLiveSoundbiteInput!) { createLiveSoundbite(input: $input) { success } }`, variables: { input: { meeting_id: 'your_meeting_id', prompt: 'Create a soundbite from the last 2 minutes' } } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' mutation CreateLiveSoundbite($input: CreateLiveSoundbiteInput!) { createLiveSoundbite(input: $input) { success } } ''', 'variables': { 'input': { 'meeting_id': 'your_meeting_id', 'prompt': 'Create a soundbite from the last 2 minutes' } } } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()['data']) else: print(response.text) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"mutation CreateLiveSoundbite($input: CreateLiveSoundbiteInput!) { createLiveSoundbite(input: $input) { success } }\", \"variables\": {\"input\": {\"meeting_id\": \"your_meeting_id\", \"prompt\": \"Create a soundbite from the last 2 minutes\"}}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "createLiveSoundbite": { "success": true } } } ``` ## Error Codes List of possible error codes that may be returned by the `createLiveSoundbite` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found > > The meeting with the specified ID was not found or you do not have access to it. > [accordion] require\_elevated\_privilege > > You do not have permission to create soundbites for this meeting. Only the meeting organizer or team admin can create live soundbites. > [accordion] insufficient\_ai\_credits > > Your account does not have sufficient AI credits to perform this operation. Please upgrade your plan or purchase additional credits. > [accordion] too\_many\_requests > > You have exceeded the rate limit of 10 requests per hour. Wait until the time specified in the `retryAfter` field before making additional requests. ## Audit Trail A successful call records a [`LIVE_SOUNDBITE_CREATED`](/graphql-api/query/audit-events) audit event for the meeting. ## Additional Resources > [card] [Create Bite](/graphql-api/mutation/create-bite) > > Create a soundbite for a completed meeting > [card] [Update Meeting State](/graphql-api/mutation/update-meeting-state) > > Pause or resume recording for a live meeting # Delete AskFred Thread Source: https://docs.fireflies.ai/graphql-api/mutation/delete-askfred-thread Delete an AskFred conversation thread and all its messages ## Overview The `deleteAskFredThread` mutation allows you to permanently delete an AskFred conversation thread along with all its associated messages. This action is irreversible. ## Arguments **id** `String` *required* The unique identifier of the AskFred thread to delete ## Returns Returns the deleted `AskFredThread` object if successful, allowing you to confirm the deletion details. ## Usage Example ```graphql theme={null} mutation DeleteThread($id: String!) { deleteAskFredThread(id: $id) { id title transcript_id user_id created_at } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation DeleteThread($id: String!) { deleteAskFredThread(id: $id) { id title transcript_id created_at } }", "variables": { "id": "thread_abc123" } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const threadId = 'thread_abc123'; const data = { query: ` mutation DeleteAskFredThread($id: String!) { deleteAskFredThread(id: $id) { id title transcript_id user_id created_at } } `, variables: { id: threadId } }; axios .post(url, data, { headers: headers }) .then(result => { console.log('Thread deleted:', result.data); }) .catch(e => { console.error('Error deleting thread:', e); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } thread_id = 'thread_abc123' query = ''' mutation DeleteAskFredThread($id: String!) { deleteAskFredThread(id: $id) { id title transcript_id user_id created_at } } ''' variables = { 'id': thread_id } data = { 'query': query, 'variables': variables } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print('Thread deleted:', response.json()) else: print('Error:', response.text) ``` ```json Response theme={null} { "data": { "deleteAskFredThread": { "id": "thread_abc123", "title": "What were the action items from the Q4 planning meeting?", "transcript_id": "transcript_xyz789", "user_id": "user_123", "created_at": "2024-03-15T10:30:00Z" } } } ``` ## Important Notes > [!WARNING] > > Deletion is permanent and cannot be undone ## Error Codes > [accordion] object\_not\_found > > The specified thread ID does not exist or you don't have access to it ## Audit Trail A successful call records a [`ASKFRED_THREAD_DELETED`](/graphql-api/query/audit-events) audit event for the deleted thread. ## Related > [card] [List Threads](/graphql-api/query/askfred-threads) > > View all your threads before deletion > [card] [View Thread Details](/graphql-api/query/askfred-thread) > > Review thread content before deletion # Delete Transcript Source: https://docs.fireflies.ai/graphql-api/mutation/delete-transcript Use the API to manage transcript deletion ## Overview The `deleteTranscript` mutation is designed to delete a specific transcript by its ID. > [!NOTE] > > **Permissions:** Users can delete meetings they own. Deleting another team member's meeting > requires team admin privileges. For a meeting with more than one owner, the mutation decides what > happens. It deletes the meeting for everyone when the caller is the meeting's host or organizer, a > team admin acting for the host, or the last remaining owner. Any other co-owner's call removes the > meeting only from their own account, and the other owners keep it. Deleting a co-owned meeting for > everyone also requires team delete permission, unless the caller owns the meeting or is its last > remaining owner. The response is the same `Transcript` in both cases, so it does not tell you > whether the meeting was deleted for everyone. The `MEETING_DELETED` [audit > event](/graphql-api/query/audit-events) records which one in its `deleteMode` metadata: > `deleted` or `removed`. > [!NOTE] > > **Rate Limit:** This mutation is rate-limited to 10 requests per minute across all user tiers. If you exceed this limit, you will receive a `too_many_requests` error with a `retryAfter` timestamp indicating when you can make requests again. ## Arguments **id** `String` *required* Transcript ID ## Usage Example To delete a transcript, provide the unique id of the transcript as an argument to the mutation. The returned subfields will be from the deleted transcript. Here’s an example of how this mutation could be used: ```graphql theme={null} mutation deleteTranscript($id: String!) { deleteTranscript(id: $id) { id title host_email organizer_email fireflies_users participants date transcript_url audio_url duration } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{"query": "mutation($transcriptId: String!) { deleteTranscript(id: $transcriptId) { title date duration organizer_email } }", "variables": {"transcriptId": "your_transcript_id"}}' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: ` mutation($transcriptId: String!) { deleteTranscript(id: $transcriptId) { title date duration organizer_email } } `, variables: { transcriptId: 'transcript_id' } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' mutation($transcriptId: String!) { deleteTranscript(id: $transcriptId) { title date duration organizer_email } } ''', 'variables': {'transcriptId': 'your_transcript_id'} } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()) else: print(response.text) ``` ```java java theme={null} import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; import java.net.http.HttpResponse.BodyHandlers; public class ApiRequest { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); String json = "{\"query\":\"mutation($transcriptId: String!) { deleteTranscript(id: $transcriptId) { title date duration organizer_email } }\",\"variables\":{\"transcriptId\":\"your_transcript_id\"}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "deleteTranscript": { "duration": "1", "date": 1699570138000, "organizer_email": "justin@fly.ai", "title": "Video title" } } } ``` ## Error Codes List of possible error codes that may be returned by the `deleteTranscript` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] require\_elevated\_privilege > > This error is returned when a user attempts to delete another team member's meeting without team admin privileges, or attempts to delete or remove their access from a shared meeting without the required permissions. Users can delete their own meetings without admin privileges. > [accordion] too\_many\_requests > > You have exceeded the rate limit of 10 requests per minute. Wait until the time specified in the `retryAfter` field before making additional requests. ## Additional Resources > [card] [Transcripts](/graphql-api/query/transcripts) > > Querying list of transcripts > [card] [Update Meeting Privacy](/graphql-api/mutation/update-meeting-privacy) > > Update meeting privacy # Remove User from User Group Source: https://docs.fireflies.ai/graphql-api/mutation/remove-user-from-user-group Use the API to remove users from a user group ## Overview The `removeUserFromUserGroup` mutation removes a member from one of your team's user groups, identified by their email address. The requesting user must be a team admin. ## Arguments **group\_id** `String` *required* The unique identifier of the user group. **user\_email** `String` *required* The email address of the user to remove from the group. ## Usage Example To remove a user from a user group, provide the group's ID and the user's email as arguments to the mutation. Here's an example of how this mutation could be used: ```graphql theme={null} mutation removeUserFromUserGroup($groupId: String!, $userEmail: String!) { removeUserFromUserGroup(group_id: $groupId, user_email: $userEmail) { id name handle members { user_id email } } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation($group_id: String!, $user_email: String!) { removeUserFromUserGroup(group_id: $group_id, user_email: $user_email) { id name handle members { user_id email } } }", "variables": { "group_id": "your_group_id", "user_email": "user@example.com" } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: `mutation Mutation($groupId: String!, $userEmail: String!) { removeUserFromUserGroup(group_id: $groupId, user_email: $userEmail) { id name handle members { user_id email } } }`, variables: { groupId: 'your_group_id', userEmail: 'user@example.com' } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' mutation($group_id: String!, $user_email: String!) { removeUserFromUserGroup(group_id: $group_id, user_email: $user_email) { id name handle members { user_id email } } } ''', 'variables': { 'group_id': "your_group_id", 'user_email': "user@example.com" } } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()['data']) else: print(response.text) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"mutation RemoveUserFromUserGroup($group_id: String!, $user_email: String!) { removeUserFromUserGroup(group_id: $group_id, user_email: $user_email) { id name handle members { user_id email } } }\", \"variables\": {\"group_id\": \"your_group_id\", \"user_email\": \"user@example.com\"}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "removeUserFromUserGroup": { "id": "your_group_id", "name": "Sales Team", "handle": "sales-team", "members": [] } } } ``` ## Error Codes List of possible error codes that may be returned by the `removeUserFromUserGroup` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found > > The user group could not be found, no user matches the provided `user_email`, or the user is not a member of the group. > [accordion] invalid\_arguments > > The provided `user_email` is not a valid email address. > [accordion] require\_elevated\_privilege > > The user does not have admin privileges to manage user groups. > [accordion] forbidden > > You do not have access to this user group. > [accordion] paid\_required > > Managing user groups requires a Business plan or higher. ## Audit Trail A successful call records a [`USER_GROUP_MEMBER_REMOVED`](/graphql-api/query/audit-events) audit event carrying the `group_id` in its metadata, so membership changes are queryable after the fact. ## Additional Resources > [card] [User Groups](/graphql-api/query/user-groups) > > Querying list of user groups > [card] [Add User to User Group](/graphql-api/mutation/add-user-to-user-group) > > Adding a user to a user group # Revoke Shared Meeting Access Source: https://docs.fireflies.ai/graphql-api/mutation/revoke-shared-meeting-access Use the API to revoke shared access to a meeting transcript ## Overview The `revokeSharedMeetingAccess` mutation revokes a previously shared user's access to a meeting transcript. ## Arguments **input** `RevokeSharedMeetingAccessInput` *required* The revocation details. See [RevokeSharedMeetingAccessInput](/schema/input/revoke-shared-meeting-access-input). ## Usage Example To revoke shared access, provide the meeting ID and the email address of the user whose access you want to revoke. ```graphql theme={null} mutation RevokeSharedMeetingAccess($input: RevokeSharedMeetingAccessInput!) { revokeSharedMeetingAccess(input: $input) { success message } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation($input: RevokeSharedMeetingAccessInput!) { revokeSharedMeetingAccess(input: $input) { success message } }", "variables": { "input": { "meeting_id": "your_meeting_id", "email": "user@example.com" } } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' }; const data = { query: ` mutation($input: RevokeSharedMeetingAccessInput!) { revokeSharedMeetingAccess(input: $input) { success message } } `, variables: { input: { meeting_id: 'your_meeting_id', email: 'user@example.com' } } }; const response = await axios.post(url, data, { headers }); console.log(response.data); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' mutation($input: RevokeSharedMeetingAccessInput!) { revokeSharedMeetingAccess(input: $input) { success message } } ''', 'variables': { 'input': { 'meeting_id': 'your_meeting_id', 'email': 'user@example.com' } } } response = requests.post(url, json=data, headers=headers) print(response.json()) ``` ```java java theme={null} import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class RevokeSharedMeetingAccessExample { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); String json = "{" + "\"query\":\"mutation($input: RevokeSharedMeetingAccessInput!) { revokeSharedMeetingAccess(input: $input) { success message } }\"," + "\"variables\":{" + "\"input\":{" + "\"meeting_id\":\"your_meeting_id\"," + "\"email\":\"user@example.com\"" + "}" + "}" + "}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "revokeSharedMeetingAccess": { "success": true, "message": "Revoked meeting access" } } } ``` ## Error Codes List of possible error codes that may be returned by the `revokeSharedMeetingAccess` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found (transcript) > > The specified transcript could not be found, you do not have access to it, or you are not allowed to revoke shared access on it. > [accordion] object\_not\_found (shared meeting access) > > The specified email does not have shared access to this meeting. > [accordion] require\_elevated\_privilege > > The user must be either the meeting owner or a team admin to revoke shared access. ## Additional Resources > [card] [Share Meeting](/graphql-api/mutation/share-meeting) > > Share a meeting with external users > [card] [Transcript](/graphql-api/query/transcript) > > Query transcript details including shared\_with # Set User Role Source: https://docs.fireflies.ai/graphql-api/mutation/set-user-role Use the API to set user roles ## Overview The `setUserRole` mutation allows for the updating of a user's role within a team. ## Arguments **user\_id** `String` *required* The unique identifier of the user. **role** `Role` *required* The [Role](/schema/input/role) to be assigned to the user. Valid types for user are `admin` and `user` ## Usage Example To set a user's role, provide the user's ID and the desired role as arguments to the mutation. Here's an example of how this mutation could be used: ```graphql theme={null} mutation setUserRole($userId: String!, $role: Role!) { setUserRole(user_id: $userId, role: $role) { id name email role } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation($user_id: String!, $role: Role!) { setUserRole(user_id: $user_id, role:$role) { name is_admin } }", "variables": { "user_id": "your_user_id", "role": "admin" } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: `mutation Mutation($userId: String!, $role: Role!) { setUserRole(user_id: $userId, role: $role) { name is_admin } }`, variables: { userId: 'your_user_id', role: 'admin' } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' mutation($user_id: String!, $role: Role!) { setUserRole(user_id: $user_id, role:$role) { name is_admin } } ''', 'variables': { 'user_id': "your_user_id", 'role': "admin" } } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()['data']) else: print(response.text) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"mutation SetUserRole($user_id: String!, $role: Role!) { setUserRole(user_id: $user_id, role: $role) { name is_admin } }\", \"variables\": {\"user_id\": \"your_user_id\", \"role\": \"admin\"}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "setUserRole": { "name": "Justin Fly", "is_admin": "true", } } } ``` ## Error Codes List of possible error codes that may be returned by the `setUserRole` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found (team) > > This may indicate that you are not a part of any team. Please contact support if you encounter this error > [accordion] not\_in\_team > > The user ID you are trying to query is not in your team. > [accordion] require\_elevated\_privilege > > The user does not have admin privileges to set the user role. > [accordion] admin\_must\_exist > > The team must have at least one admin. Please add an admin to the team or contact support if you encounter this error. > [accordion] invalid\_args > > An invalid argument was provided to the mutation for the `role` field. Please check the arguments you are providing and try again. ## Additional Resources > [card] [Users](/graphql-api/query/users) > > Querying list of users > [card] [User](/graphql-api/query/user) > > Querying user details # Share Meeting Source: https://docs.fireflies.ai/graphql-api/mutation/share-meeting Use the API to share meeting transcripts with external users via email or a password-protected link ## Overview The `shareMeeting` mutation shares a meeting transcript with one or more users by email. Shared users receive access to view the transcript without needing to be on the same team. It can also create a password-protected link so people without a Fireflies account can view the meeting. See [Password-protected links](#password-protected-links-beta). ## Arguments **input** `ShareMeetingInput` *required* The sharing configuration. See [ShareMeetingInput](/schema/input/share-meeting-input). ## Response **success** `Boolean` Whether the share was created. **message** `String` Additional detail about the result, when available. **share\_slug** `String` Identifier of the password-protected link. Only returned when `share_type` is `PASSWORD_LINK`. The link is `https://app.fireflies.ai/view/p/{share_slug}`. ## Usage Example To share a meeting, provide the meeting ID and an array of email addresses. You can optionally set an expiry period. ```graphql theme={null} mutation ShareMeeting($input: ShareMeetingInput!) { shareMeeting(input: $input) { success message } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation($input: ShareMeetingInput!) { shareMeeting(input: $input) { success message } }", "variables": { "input": { "meeting_id": "your_meeting_id", "emails": ["user@example.com"], "expiry_days": 7 } } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' }; const data = { query: ` mutation($input: ShareMeetingInput!) { shareMeeting(input: $input) { success message } } `, variables: { input: { meeting_id: 'your_meeting_id', emails: ['user@example.com'], expiry_days: 7 } } }; const response = await axios.post(url, data, { headers }); console.log(response.data); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' mutation($input: ShareMeetingInput!) { shareMeeting(input: $input) { success message } } ''', 'variables': { 'input': { 'meeting_id': 'your_meeting_id', 'emails': ['user@example.com'], 'expiry_days': 7 } } } response = requests.post(url, json=data, headers=headers) print(response.json()) ``` ```java java theme={null} import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ShareMeetingExample { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); String json = "{" + "\"query\":\"mutation($input: ShareMeetingInput!) { shareMeeting(input: $input) { success message } }\"," + "\"variables\":{" + "\"input\":{" + "\"meeting_id\":\"your_meeting_id\"," + "\"emails\":[\"user@example.com\"]," + "\"expiry_days\":7" + "}" + "}" + "}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "shareMeeting": { "success": true, "message": null } } } ``` ## Password-protected links (Beta) > [!NOTE] > > Password-protected sharing is in **beta** and is being progressively rolled out. Contact support to have it enabled for your organization. Set `share_type` to `PASSWORD_LINK` and supply a `password` to create a link that anyone can open without a Fireflies account. The recipients in `emails` are notified with the link; the password is never included in that email, so share it with them separately. ```graphql theme={null} mutation ShareMeeting { shareMeeting( input: { meeting_id: "your_meeting_id" emails: ["guest@example.com"] share_type: PASSWORD_LINK password: "a-strong-password" expiry_days: 7 } ) { success message share_slug } } ``` ```json Response theme={null} { "data": { "shareMeeting": { "success": true, "message": "Invite created successfully", "share_slug": "aB3dE6gH" } } } ``` Use `share_slug` to build the guest link: `https://app.fireflies.ai/view/p/aB3dE6gH`. Things to know: * A meeting has at most one password-protected link per sharer. Calling the mutation again returns the existing link instead of creating a new one. * Passing a different `password` on a later call rotates the password for that link; the previous password stops working. * `password` must be 8–128 characters and cannot contain line breaks. * `expiry_days` applies to password-protected links too. After it elapses, the link no longer opens the meeting. * `password` is only accepted with `share_type: PASSWORD_LINK`, and is required for it. Otherwise the mutation returns an [`invalid_arguments`](/miscellaneous/error-codes#invalid_arguments) error. ## FAQ > [accordion] Who can share a meeting? > > Only the meeting owner or a team admin (in the same team as the owner) can share a meeting. > [accordion] What happens if the user is already invited? > > The mutation returns `success: false` with a message indicating that the invitees are already invited. > [accordion] How many emails can I share with at once? > > You can share with up to 50 email addresses per request. > [accordion] Do recipients of a password-protected link need a Fireflies account? > > No. Anyone with the link and the password can view the meeting. The password is not included in the notification email, so send it to them separately. ## Rate Limits The `shareMeeting` mutation is rate-limited to **60 requests per hour** per user, in addition to the general API rate limits. ## Error Codes List of possible error codes that may be returned by the `shareMeeting` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found > > The specified transcript could not be found or you do not have access to it. > [accordion] require\_elevated\_privilege > > The user must be either the meeting owner or a team admin to share the meeting. > [accordion] invalid\_arguments > > A `password` was supplied without `share_type: PASSWORD_LINK`, or `share_type: PASSWORD_LINK` was used without a valid `password`. ## Additional Resources > [card] [Revoke Shared Meeting Access](/graphql-api/mutation/revoke-shared-meeting-access) > > Revoke shared access to a meeting > [card] [Transcript](/graphql-api/query/transcript) > > Query transcript details including shared\_with > [card] [ShareMeetingType](/schema/enum/share-meeting-type) > > Share types supported by this mutation # Update Meeting Channel Source: https://docs.fireflies.ai/graphql-api/mutation/update-meeting-channel Use the API to update meeting channel assignments ## Overview The `updateMeetingChannel` mutation allows for batch updating the channel assignment of multiple meeting transcripts. This operation requires admin privileges within the team or ownership of the meetings. You can update 1–5 transcripts at once with all-or-nothing semantics—if any transcript fails validation, none are updated. ## Arguments **input** `UpdateMeetingChannelInput` *required* The channel assignment to be applied to the specified transcripts. See [UpdateMeetingChannelInput](/schema/input/update-meeting-channel-input). ## Usage Example To update meeting channels, provide an array of transcript IDs (1–5 items) and a single channel ID as arguments to the mutation. Here's an example of how this mutation could be used: ```graphql theme={null} mutation UpdateMeetingChannel($input: UpdateMeetingChannelInput!) { updateMeetingChannel(input: $input) { id title channels { id } } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation($input: UpdateMeetingChannelInput!) { updateMeetingChannel(input: $input) { id title channels { id } } }", "variables": { "input": { "transcript_ids": ["transcript_id_1", "transcript_id_2"], "channel_id": "channel_id" } } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' }; const data = { query: ` mutation($input: UpdateMeetingChannelInput!) { updateMeetingChannel(input: $input) { id title channels { id } } } `, variables: { input: { transcript_ids: ['transcript_id_1', 'transcript_id_2'], channel_id: 'channel_id' } } }; const response = await axios.post(url, data, { headers }); console.log(response.data); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ` mutation($input: UpdateMeetingChannelInput!) { updateMeetingChannel(input: $input) { id title channels { id } } } `, 'variables': { 'input': { 'transcript_ids': ['transcript_id_1', 'transcript_id_2'], 'channel_id': 'channel_id' } } } response = requests.post(url, json=data, headers=headers) print(response.json()) ``` ```java java theme={null} import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; import java.net.http.HttpResponse.BodyHandlers; public class UpdateMeetingChannelExample { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); String json = "{" + "\"query\":\"mutation($input: UpdateMeetingChannelInput!) { updateMeetingChannel(input: $input) { id title channels { id } } }\"," + "\"variables\":{" + "\"input\":{" + "\"transcript_ids\":[\"transcript_id_1\",\"transcript_id_2\"]," + "\"channel_id\":\"channel_id\"" + "}" + "}" + "}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "updateMeetingChannel": [ { "id": "transcript_id_1", "title": "Weekly Sync", "channels": [ { "id": "channel_id" } ] }, { "id": "transcript_id_2", "title": "Product Review", "channels": [ { "id": "channel_id" } ] } ] } } ``` ## FAQ > [accordion] Who has permission to update meeting channels? > > Only users with admin privileges or meeting owners can update meeting channels. All specified meetings must be owned by users in your team. > [accordion] How many transcripts can I update at once? > > You can update between 1 and 5 transcripts in a single mutation call. If you need to update more transcripts, make multiple mutation calls. > [accordion] What happens if the operation fails for one transcript? > > The mutation uses all-or-nothing semantics. If any transcript fails validation (not found, no access, or permission denied), none of the transcripts will be updated. All transcripts must pass validation for the update to succeed. > [accordion] Can a meeting belong to multiple channels? > > No, a meeting can only belong to one channel at a time. This mutation sets the meeting's channel to the specified value, replacing any previous channel assignment. > [accordion] Is the response order guaranteed to match the input order? > > No, the response order is not guaranteed to match the input order of transcript\_ids. If you need to correlate responses with inputs, use the id field in the response. ## Error Codes List of possible error codes that may be returned by the `updateMeetingChannel` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] require\_elevated\_privilege > > The user must be either the meeting owner or a team admin to update meeting channels. > [accordion] object\_not\_found (transcript) > > One or more specified transcripts could not be found or you do not have access to them. > [accordion] invalid\_arguments > > The input failed validation. Common causes include: empty transcript\_ids array, more than 5 transcript\_ids, or missing/empty channel\_id. ## Additional Resources > [card] [Transcript](/graphql-api/query/transcript) > > Querying transcript details > [card] [Update Meeting Title](/graphql-api/mutation/update-meeting-title) > > Update meeting titles > [card] [Update Meeting Privacy](/graphql-api/mutation/update-meeting-privacy) > > Update meeting privacy > [card] [Transcripts](/graphql-api/query/transcripts) > > Querying list of transcripts # Update Meeting Privacy Source: https://docs.fireflies.ai/graphql-api/mutation/update-meeting-privacy Use the API to update meeting privacy settings ## Overview The `updateMeetingPrivacy` mutation allows for updating the privacy setting of a meeting transcript. This operation requires admin privileges within the team or ownership of the meeting. ## Arguments **input** `UpdateMeetingPrivacyInput` *required* The privacy setting to be assigned to the meeting / transcript. See [UpdateMeetingPrivacyInput](/schema/input/update-meeting-privacy-input). ## Usage Example To update a meeting's privacy setting, provide the transcript ID and the new privacy level as arguments to the mutation. Here's an example of how this mutation could be used: ```graphql theme={null} mutation UpdateMeetingPrivacy($input: UpdateMeetingPrivacyInput!) { updateMeetingPrivacy(input: $input) { id title privacy } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation($input: UpdateMeetingPrivacyInput!) { updateMeetingPrivacy(input: $input) { id title privacy } }", "variables": { "input": { "id": "your_transcript_id", "privacy": "teammates" } } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' }; const data = { query: ` mutation($input: UpdateMeetingPrivacyInput!) { updateMeetingPrivacy(input: $input) { id title privacy } } `, variables: { input: { id: 'your_transcript_id', privacy: 'teammates' } } }; const response = await axios.post(url, data, { headers }); console.log(response.data); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ` mutation($input: UpdateMeetingPrivacyInput!) { updateMeetingPrivacy(input: $input) { id title privacy } } `, 'variables': { 'input': { 'id': 'your_transcript_id', 'privacy': 'teammates' } } } response = requests.post(url, json=data, headers=headers) print(response.json()) ``` ```java java theme={null} import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; import java.net.http.HttpResponse.BodyHandlers; public class UpdateMeetingPrivacyExample { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); String json = "{" + "\"query\":\"mutation($input: UpdateMeetingPrivacyInput!) { updateMeetingPrivacy(input: $input) { id title privacy } }\"," + "\"variables\":{" + "\"input\":{" + "\"id\":\"your_transcript_id\"," + "\"privacy\":\"teammates\"" + "}" + "}" + "}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "updateMeetingPrivacy": { "id": "your_transcript_id", "title": "Meeting Title", "privacy": "teammates" } } } ``` ## FAQ > [accordion] Who has permission to update meeting privacy? > > Only users with admin privileges or meeting owners can update meeting privacy settings. The meeting owner also needs to be in your team. > [accordion] What privacy levels are available? > > Available privacy levels are: link (anyone with link), owner (meeting owner only), participants (meeting participants only), participatingteammates (only participants who are teammates — beta, API/MCP only, not yet available in the dashboard), teammatesandparticipants (teammates and participants), teammates (teammates only). ## Error Codes List of possible error codes that may be returned by the `updateMeetingPrivacy` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] require\_elevated\_privilege > > The user must be either the meeting owner or a team admin to update meeting privacy. > [accordion] object\_not\_found (transcript) > > The specified transcript could not be found or you do not have access to it ## Additional Resources > [card] [Transcript](/graphql-api/query/transcript) > > Querying transcript details > [card] [Update Meeting Title](/graphql-api/mutation/update-meeting-title) > > Use the API to update meeting titles # Update Meeting State Source: https://docs.fireflies.ai/graphql-api/mutation/update-meeting-state Use the API to pause or resume recording for a live meeting ## Overview The `updateMeetingState` mutation allows you to pause or resume recording for a live meeting through the API. This is useful for controlling the Fireflies bot during an active meeting. This mutation is rate-limited to 10 requests per hour across all user tiers. ## Arguments **input** `UpdateMeetingStateInput!` *required* Input object containing the meeting ID and action to perform. See [UpdateMeetingStateInput](/schema/input/update-meeting-state-input) for details. ## Response **success** `Boolean!` Whether the action was executed successfully **action** `MeetingStateAction!` The action that was executed ## Usage Example To update the meeting state, provide the meeting ID and the desired action: ```graphql theme={null} mutation UpdateMeetingState($input: UpdateMeetingStateInput!) { updateMeetingState(input: $input) { success action } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation UpdateMeetingState($input: UpdateMeetingStateInput!) { updateMeetingState(input: $input) { success action } }", "variables": { "input": { "meeting_id": "your_meeting_id", "action": "pause_recording" } } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: `mutation UpdateMeetingState($input: UpdateMeetingStateInput!) { updateMeetingState(input: $input) { success action } }`, variables: { input: { meeting_id: 'your_meeting_id', action: 'pause_recording' } } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' mutation UpdateMeetingState($input: UpdateMeetingStateInput!) { updateMeetingState(input: $input) { success action } } ''', 'variables': { 'input': { 'meeting_id': 'your_meeting_id', 'action': 'pause_recording' } } } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()['data']) else: print(response.text) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"mutation UpdateMeetingState($input: UpdateMeetingStateInput!) { updateMeetingState(input: $input) { success action } }\", \"variables\": {\"input\": {\"meeting_id\": \"your_meeting_id\", \"action\": \"pause_recording\"}}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "updateMeetingState": { "success": true, "action": "pause_recording" } } } ``` ## Error Codes List of possible error codes that may be returned by the `updateMeetingState` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found > > The meeting with the specified ID was not found or you do not have access to it. > [accordion] require\_elevated\_privilege > > You do not have permission to control this meeting. Only the meeting organizer or team admin can update the meeting state. > [accordion] too\_many\_requests > > You have exceeded the rate limit for this mutation. The limit is 10 requests per hour. Please wait before making additional requests. ## Audit Trail A successful call records a [`MEETING_STATE_UPDATED`](/graphql-api/query/audit-events) audit event for the meeting with the recording action in metadata. ## Additional Resources > [card] [Create Live Action Item](/graphql-api/mutation/create-live-action-item) > > Create action items during a live meeting > [card] [Create Live Soundbite](/graphql-api/mutation/create-live-soundbite) > > Create soundbites during a live meeting # Update Meeting Title Source: https://docs.fireflies.ai/graphql-api/mutation/update-meeting-title Use the API to update meeting titles ## Overview The `updateMeetingTitle` mutation allows for updating the title of a meeting transcript. This operation requires admin privileges within the team. ## Arguments **input** `UpdateMeetingTitleInput` *required* The new title to be assigned to the meeting / transcript. ## Usage Example To update a meeting title, provide the transcript ID and the new title as arguments to the mutation. Here's an example of how this mutation could be used: ```graphql theme={null} mutation UpdateMeetingTitle($input: UpdateMeetingTitleInput!) { updateMeetingTitle(input: $input) { title } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation($input: UpdateMeetingTitleInput!) { updateMeetingTitle(input: $input) { title } }", "variables": { "input": { "id": "your_transcript_id", "title": "New Title" } } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' }; const data = { query: ` mutation($input: UpdateMeetingTitleInput!) { updateMeetingTitle(input: $input) { title } } `, variables: { input: { id: 'your_transcript_id', title: 'New Title' } } }; const response = await axios.post(url, data, { headers }); console.log(response.data); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ` mutation($input: UpdateMeetingTitleInput!) { updateMeetingTitle(input: $input) { title } } `, 'variables': { 'input': { 'id': 'your_transcript_id', 'title': 'New Title' } } } response = requests.post(url, json=data, headers=headers) print(response.json()) ``` ```java java theme={null} import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; import java.net.http.HttpResponse.BodyHandlers; public class UpdateMeetingTitleExample { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); String json = "{" + "\"query\":\"mutation($input: UpdateMeetingTitleInput!) { updateMeetingTitle(input: $input) { title } }\"," + "\"variables\":{" + "\"input\":{" + "\"id\":\"your_transcript_id\"," + "\"title\":\"New Title\"" + "}" + "}" + "}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "updateMeetingTitle": { "title": "New Title" } } } ``` ## FAQ > [accordion] Who has permission to update meeting titles? > > Only users with admin privileges can update meeting titles. The meeting owner also needs to be in your team. ## Error Codes List of possible error codes that may be returned by the `updateMeetingTitle` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] require\_elevated\_privilege > > The user does not have admin privileges to update meeting titles. > [accordion] object\_not\_found (transcript) > > The specified transcript could not be found or you do not have access to it ## Additional Resources > [card] [Transcript](/graphql-api/query/transcript) > > Querying transcript details > [card] [Update Meeting Privacy](/graphql-api/mutation/update-meeting-privacy) > > Update meeting privacy # Upload Audio Source: https://docs.fireflies.ai/graphql-api/mutation/upload-audio Use the API to upload audio to Fireflies.ai ## Overview The `uploadAudio` mutation allows you to upload audio files to Fireflies.ai for transcription. ## Arguments **input** `AudioUploadInput` **url** `String` *required* The url of media file to be transcribed. It MUST be a valid https string and publicly accessible to enable us download the audio / video file. Double check to see if the media file is downloadable and that the link is not a preview link before making the request. The media file must be either of these formats - mp3, mp4, wav, m4a, ogg **title** `String` Title or name of the meeting, this will be used to identify the transcribed file **webhook** `String` URL for the webhook that receives notifications when transcription completes **custom\_language** `String` Specify a custom language code for your meeting, e.g. `es` for Spanish or `de` for German. For a complete list of language codes, please view [Language Codes](/miscellaneous/language-codes) **save\_video** `Boolean` Specify whether the video should be saved or not. **attendees** `[Attendees]` An array of objects containing meeting [Attendees](#). This is relevant if you have active integrations like Salesforce, Hubspot etc. Fireflies uses the attendees value to push meeting notes to your active CRM integrations where notes are added to an existing contact or a new contact is created. Each object contains - * displayName * email * phoneNumber **client\_reference\_id** `String` Custom identifier set by the user during upload. You may use this to identify your uploads in your webhook events. **bypass\_size\_check** `Boolean` Bypasses the internal file size validation that normally rejects audio files smaller than 50kb. Set to true if you need to process very short audio clips. **download\_auth** `DownloadAuthInput` Authentication configuration for downloading the media file. Use this when your audio/video file requires authentication (bearer token or basic auth). If not provided, defaults to no authentication (publicly accessible URL). See [DownloadAuthInput](/schema/input/download-auth-input) for details. **meeting\_date** `String` Optional. The date and time the meeting actually took place, in ISO 8601 format (e.g. `2026-03-14T15:00:00Z`; offsets are normalized to UTC). Nonexistent calendar dates are rejected. Use this when importing historical recordings so the meeting is dated correctly instead of using the upload time. Must not be in the future. Defaults to the upload time when omitted. ## Usage Example To upload a file, provide the necessary input parameters to the mutation. Here's an example of how this mutation could be used: ```graphql theme={null} mutation uploadAudio($input: AudioUploadInput) { uploadAudio(input: $input) { success title message } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation($input: AudioUploadInput) { uploadAudio(input: $input) { success title message } }", "variables": { "input": { "url": "https://url-to-the-audio-file", "title": "title of the file", "attendees": [ { "displayName": "Fireflies Notetaker", "email": "notetaker@fireflies.ai", "phoneNumber": "xxxxxxxxxxxxxxxx" }, { "displayName": "Fireflies Notetaker 2", "email": "notetaker2@fireflies.ai", "phoneNumber": "xxxxxxxxxxxxxxxx" } ] } } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const input = { url: 'https://url-to-the-audio-file', title: 'title of the file', attendees: [ { displayName: 'Fireflies Notetaker', email: 'notetaker@fireflies.ai', phoneNumber: 'xxxxxxxxxxxxxxxx' }, { displayName: 'Fireflies Notetaker 2', email: 'notetaker2@fireflies.ai', phoneNumber: 'xxxxxxxxxxxxxxxx' } ] }; const data = { query: ` mutation($input: AudioUploadInput) { uploadAudio(input: $input) { success title message } } `, variables: { input } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } input_data = { "url": "https://url_for_audio_file", "title": "title of the file", "attendees": [ { "displayName": "Fireflies Notetaker", "email": "notetaker@fireflies.ai", "phoneNumber": "xxxxxxxxxxxxxxxx" }, { "displayName": "Fireflies Notetaker 2", "email": "notetaker2@fireflies.ai", "phoneNumber": "xxxxxxxxxxxxxxxx" } ]} data = { 'query': ''' mutation($input: AudioUploadInput) { uploadAudio(input: $input) { success title message } } ''', 'variables': {'input': input_data} } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()) else: print(response.text) ``` ```java java theme={null} import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; import java.net.http.HttpResponse.BodyHandlers; public class ApiRequest { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); String json = "{" + "\"query\":\"mutation($input: AudioUploadInput) { uploadAudio(input: $input) { success title message } }\"," + "\"variables\":{" + "\"input\": {" + "\"url\":\"https://url_for_audio_file.com\"," + "\"title\":\"title of the file\"," + "\"attendees\":[" + "{" + "\"displayName\": \"Fireflies Notetaker\"," + "\"email\": \"notetaker@fireflies.ai\"," + "\"phoneNumber\": \"xxxxxxxxxxxxxxxx\"" + "}," + "{" + "\"displayName\": \"Fireflies Notetaker 2\"," + "\"email\": \"notetaker2@fireflies.ai\"," + "\"phoneNumber\": \"xxxxxxxxxxxxxxxx\"" + "}" + "]" + "}" + "}" + "}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "uploadAudio": { "success": true, "title": "title of the file", "message": "Uploaded audio has been queued for processing." } } } ``` ## Authenticated Downloads The `download_auth` field allows you to upload audio/video files that require authentication. This is useful when your media files are hosted on private servers or behind authentication. ### Bearer Token Authentication Use bearer token authentication when your media URL requires an `Authorization: Bearer ` header: ```graphql theme={null} mutation { uploadAudio(input: { url: "https://example.com/protected-audio.mp3" title: "Protected Meeting Recording" download_auth: { type: bearer_token bearer: { token: "your-bearer-token-here" } } }) { success message } } ``` ### Basic Authentication Use basic authentication when your media URL requires username and password: ```graphql theme={null} mutation { uploadAudio(input: { url: "https://example.com/protected-audio.mp3" title: "Protected Meeting Recording" download_auth: { type: basic_auth basic: { username: "your-username" password: "your-password" } } }) { success message } } ``` **Note:** The username is optional for basic auth. If not provided, only the password will be used. ## FAQ > [accordion] Can I upload a file directly from my machine? > > Audio upload only works with publicly accessible URLs or URLs with supported authentication (bearer token or basic auth). We cannot accept files hosted on your local machine. > [accordion] I don't want to expose my audio files to the public internet. How can I upload them to Fireflies.ai safely? > > You have two options: > >
    >
  1. **Signed URLs:** Use signed URLs with short expiry times (e.g., AWS S3 presigned URLs, Google Cloud Storage signed URLs)
  2. >
  3. **Authenticated Downloads:** Use the `download_auth` field to provide bearer token or basic authentication credentials. Fireflies will use these credentials when downloading your media file.
  4. >
> [accordion] What authentication methods are supported? > > Fireflies supports two authentication methods for downloading media files: > > > > If your media file is publicly accessible, you don't need to provide `download_auth`. ## Error Codes List of possible error codes that may be returned by the `uploadAudio` mutation. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] paid\_required (pro\_or\_higher) > > You may receieve this error when uploading audio files or querying `audio_url` field.Free plan users cannot upload audio files. Please upgrade to a paid plan to upload audio files. > [accordion] paid\_required (pro\_or\_higher) - video\_url > > You may receieve this error when querying `video_url` field.Free plan users cannot query `video_url` field. Please upgrade to a Pro or higher plan to query `video_url` field. > [accordion] payload\_too\_small > > The audio file is too short to be processed. Please ensure the audio file is at least 50kb in size. > [accordion] feature\_disabled > > Your organization admin has disabled file uploads for transcription, so audio cannot be uploaded. Contact your admin to re-enable uploads. See [feature\_disabled](/miscellaneous/error-codes#feature_disabled). > [accordion] invalid\_language\_code > > The language code you provided is invalid. Please refer to the [Language Codes](/miscellaneous/language-codes) page for a list of valid language codes. ## Audit Trail A successful call records a [`MEETING_AUDIO_UPLOADED`](/graphql-api/query/audit-events) audit event carrying the client reference ID in metadata. ## Additional Resources > [card] [Webhooks](/graphql-api/webhooks-v2) > > Create notifications using webhooks > [card] [Add to Live](/graphql-api/mutation/add-to-live) > > Use the API to add the Fireflies.ai bot to an ongoing meeting # Active Meetings Source: https://docs.fireflies.ai/graphql-api/query/active-meetings Query active meetings in progress ## Overview The active\_meetings query is designed to fetch a list of meetings that are currently active (in progress). This endpoint allows you to monitor ongoing meetings for users in your team. ## Arguments **email** `String` Filter active meetings by a specific user's email address. **Permission requirements:** * **Regular users**: Can only query their own active meetings (must pass their own email or omit this field) * **Admins**: Can query active meetings for any user in their team If this field is omitted, the query returns active meetings for the authenticated user. The email must be valid and belong to a user in the same team as the requester. **states** `[MeetingState]` Filter active meetings by their state. Accepts an array of [MeetingState](/schema/enum/meeting-state) values. **Possible values:** * `active`: Meetings that are currently in progress * `paused`: Meetings that have been paused If this field is omitted, the query returns meetings in both `active` and `paused` states by default. ## Schema Fields available to the [ActiveMeeting](/schema/active-meeting) query ## Usage Example ```graphql theme={null} query ActiveMeetings($email: String, $states: [MeetingState!]) { active_meetings(input: { email: $email, states: $states }) { id title organizer_email meeting_link start_time end_time privacy state } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query ActiveMeetings { active_meetings { id title organizer_email meeting_link start_time } }" }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: 'query ActiveMeetings { active_meetings { id title organizer_email meeting_link start_time } }' }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "query ActiveMeetings { active_meetings { id title organizer_email meeting_link start_time } }"}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodyHandlers; public class ApiRequest { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); String json = "{\"query\":\"query ActiveMeetings { active_meetings { id title organizer_email meeting_link start_time } } \"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "active_meetings": [ { "id": "meeting-id-1", "title": "Team Standup", "organizer_email": "user@example.com", "meeting_link": "https://zoom.us/j/123456789", "start_time": "2024-01-15T10:00:00.000Z", "state": "active" }, { "id": "meeting-id-2", "title": "Client Review", "organizer_email": "user@example.com", "meeting_link": "https://meet.google.com/abc-defg-hij", "start_time": "2024-01-15T14:30:00.000Z", "state": "paused" } ] } } ``` ## Error Codes List of possible error codes that may be returned by the `active_meetings` query. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found (user) > > The user email you are trying to query does not exist or is not in the same team as the requesting user. > [accordion] require\_elevated\_privilege > > You do not have permission to query active meetings for other users. Regular users can only query their own active meetings. Admin privileges are required to query other users' active meetings. ## Additional Resources > [card] [Transcripts](/graphql-api/query/transcripts) > > Query completed meetings and transcripts > [card] [Add to Live Meeting](/graphql-api/mutation/add-to-live) > > Join an active meeting with Fireflies.ai bot # Analytics Source: https://docs.fireflies.ai/graphql-api/query/analytics Querying conversation and meeting analytics for teams and users ## Overview The analytics query fetches detailed conversation and meeting metrics for teams and users across a specified date range. ## Arguments **start\_time** `String` The `start_time` parameter filters results starting from a specific datetime (ISO 8601 format). **end\_time** `String` The `end_time` parameter filters results up to a specific datetime (ISO 8601 format). ## Schema Fields available to the [Analytics](/schema/analytics) query. ## Usage Example ```graphql theme={null} query Analytics($startTime: String, $endTime: String) { analytics(start_time: $startTime, end_time: $endTime) { team { conversation { average_filler_words average_filler_words_diff_pct average_monologues_count average_monologues_count_diff_pct average_questions average_questions_diff_pct average_sentiments { negative_pct neutral_pct positive_pct } average_silence_duration average_silence_duration_diff_pct average_talk_listen_ratio average_words_per_minute longest_monologue_duration_sec longest_monologue_duration_diff_pct total_filler_words total_filler_words_diff_pct total_meeting_notes_count total_meetings_count total_monologues_count total_monologues_diff_pct teammates_count total_questions total_questions_diff_pct total_silence_duration total_silence_duration_diff_pct } meeting { count count_diff_pct duration duration_diff_pct average_count average_count_diff_pct average_duration average_duration_diff_pct } } users { user_id user_name user_email conversation { talk_listen_pct talk_listen_ratio total_silence_duration total_silence_duration_compare_to total_silence_pct total_silence_ratio total_speak_duration total_speak_duration_with_user total_word_count user_filler_words user_filler_words_compare_to user_filler_words_diff_pct user_longest_monologue_sec user_longest_monologue_compare_to user_longest_monologue_diff_pct user_monologues_count user_monologues_count_compare_to user_monologues_count_diff_pct user_questions user_questions_compare_to user_questions_diff_pct user_speak_duration user_word_count user_words_per_minute user_words_per_minute_compare_to user_words_per_minute_diff_pct } meeting { count count_diff count_diff_compared_to count_diff_pct duration duration_diff duration_diff_compared_to duration_diff_pct } } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query Analytics($startTime: String, $endTime: String) { analytics(start_time: $startTime, end_time: $endTime) { team { conversation { average_filler_words } } } }", "variables": { "startTime": "2024-01-01T00:00:00Z", "endTime": "2024-01-31T23:59:59Z" } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: 'query Analytics($startTime: String, $endTime: String) { analytics(start_time: $startTime, end_time: $endTime) { team { conversation { average_filler_words } } } }', variables: { startTime: '2024-01-01T00:00:00Z', endTime: '2024-01-31T23:59:59Z' } }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "query Analytics($startTime: String, $endTime: String) { analytics(start_time: $startTime, end_time: $endTime) { team { conversation { average_filler_words } } } }", "variables": {"startTime": "2024-01-01T00:00:00Z", "endTime": "2024-01-31T23:59:59Z"}}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodyHandlers; public class ApiRequest { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); String json = "{\"query\":\"query Analytics($startTime: String, $endTime: String) { analytics(start_time: $startTime, end_time: $endTime) { team { conversation { average_filler_words } } } }\", \"variables\":{\"startTime\":\"2024-01-01T00:00:00Z\", \"endTime\":\"2024-01-31T23:59:59Z\"}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "analytics": { "team": { "conversation": { "average_filler_words": 15 } } } } } ``` ## Error Codes List of possible error codes that may be returned by the `analytics` query. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] paid\_required (business\_or\_higher) > > You need to be on a Business or higher plan to query analytics. > [accordion] require\_elevated\_privilege > > The user does not have admin privileges to view analytics for team. ## Additional Resources > [card] [Transcripts](/graphql-api/query/transcripts) > > Querying list of transcripts > [card] [Users](/graphql-api/query/users) > > Querying list of users # AI Apps Source: https://docs.fireflies.ai/graphql-api/query/apps Querying list of AI App outputs ## Overview The apps query fetches the results of the AI App for all the meetings it ran successfully. ## Arguments **app\_id** `String` The `app_id` parameter retrieves all outputs against a specific AI App. **transcript\_id** `String` The `transcript_id` parameter retrieves all outputs against a specific meeting/transcript. **skip** `Int` Number of records to skip over. Helps paginate results when used in combination with the `limit` param. **limit** `Int` Maximum number of `apps` outputs to fetch in a single query. The default query fetches 10 records, which is the maximum for a single request. ## Schema Fields available to the [AI Apps](/schema/apps) query ## Usage Example ```graphql theme={null} query GetAIAppsOutputs($appId: String, $transcriptId: String, $skip: Float, $limit: Float) { apps(app_id: $appId, transcript_id: $transcriptId, skip: $skip, limit: $limit) { outputs { transcript_id user_id app_id created_at title prompt response } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query GetAIAppsOutputs($transcriptId: String) { apps(transcript_id: $transcriptId) { outputs { transcript_id user_id app_id created_at title prompt response } } }", "variables": { "transcriptId": "your_transcript_id" } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: 'query GetAIAppsOutputs($transcriptId: String) { apps(transcript_id: $transcriptId) { outputs { transcript_id user_id app_id created_at title prompt response } } }', variables: { transcriptId: 'your_transcript_id' } }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "query GetAIAppsOutputs($transcriptId: String) { apps(transcript_id: $transcriptId) { outputs { transcript_id user_id app_id created_at title prompt response } } }", "variables": {"transcriptId": "transcript_id"}}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodyHandlers; public class ApiRequest { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); String json = "{\"query\":\"query GetAIAppsOutputs($transcriptId: String) { apps(transcript_id: $transcriptId) { outputs { transcript_id user_id app_id created_at title prompt response } } } \", \"variables\":{\"transcriptId\":\"transcript_id\"}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "apps": [ { "transcript_id": "transcript-id", "user_id": "user-id", "app_id": "app-id", "title": "Weekly sync" } ] } } ``` ## Audit Trail A successful call records an [`APP_OUTPUTS_VIEWED`](/graphql-api/query/audit-events) audit event for the meeting with the app ID and returned output count in metadata. ## Additional Resources > [card] [Transcript](/graphql-api/query/transcript) > > Querying transcript details > [card] [Transcripts](/graphql-api/query/transcripts) > > Querying list of transcripts # AskFred Thread Source: https://docs.fireflies.ai/graphql-api/query/askfred-thread Get a specific AskFred conversation thread with all its messages ## Overview The `askfred_thread` query retrieves a specific AskFred conversation thread by its ID, including the complete message history. This query provides full details about a thread including all questions asked, answers received, and suggested follow-up queries. ## Arguments **id** `String` *required* The unique identifier of the AskFred thread to retrieve ## Schema Fields available to the [AskFredThread](/schema/askfred-thread) query: * `id`: Unique identifier for the thread * `title`: Thread title * `transcript_id`: Associated transcript/meeting ID (if applicable) * `user_id`: ID of the user who created the thread * `created_at`: Timestamp when the thread was created * `messages`: Array of [AskFredMessage](/schema/askfred-message) objects containing: * `id`: Message identifier * `thread_id`: Parent thread ID * `query`: The question asked * `answer`: The AI-generated response * `suggested_queries`: Array of suggested follow-up questions * `status`: Message processing status (processing, completed, failed) * `created_at`: When the message was created * `updated_at`: When the message was last updated ## Usage Example ```graphql theme={null} query GetAskFredThread($threadId: String!) { askfred_thread(id: $threadId) { id title transcript_id user_id created_at messages { id thread_id query answer suggested_queries status created_at updated_at } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "query GetThread($id: String!) { askfred_thread(id: $id) { id title transcript_id messages { query answer suggested_queries status } } }", "variables": { "id": "thread_abc123" } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const threadId = 'thread_abc123'; const data = { query: ` query GetAskFredThread($id: String!) { askfred_thread(id: $id) { id title transcript_id user_id created_at messages { id query answer suggested_queries status created_at } } } `, variables: { id: threadId } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.error(e); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } thread_id = 'thread_abc123' query = ''' query GetAskFredThread($id: String!) { askfred_thread(id: $id) { id title transcript_id user_id created_at messages { id query answer suggested_queries status created_at } } } ''' variables = { 'id': thread_id } data = { 'query': query, 'variables': variables } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()) else: print(response.text) ``` ```json Response theme={null} { "data": { "askfred_thread": { "id": "thread_abc123", "title": "What were the action items from the Q4 planning meeting?", "transcript_id": "transcript_xyz789", "user_id": "user_123", "created_at": "2024-03-15T10:30:00Z", "messages": [ { "id": "msg_001", "query": "What were the action items from the Q4 planning meeting?", "answer": "Based on the Q4 planning meeting, here are the key action items:\n\n1. **Product Development** - Sarah to finalize the feature roadmap by March 20th\n2. **Marketing Campaign** - John to prepare Q4 marketing strategy presentation by March 25th\n3. **Budget Review** - Finance team to provide updated budget allocations by March 18th\n4. **Customer Success** - Emma to compile customer feedback report by end of week", "suggested_queries": [ "Who is responsible for the product roadmap?", "What is the timeline for the marketing strategy?", "What were the budget concerns discussed?" ], "status": "completed", "created_at": "2024-03-15T10:30:00Z" }, { "id": "msg_002", "query": "What were the budget concerns discussed?", "answer": "The main budget concerns discussed in the meeting were:\n\n1. **Resource Allocation** - Need to balance investment between product development and marketing\n2. **Headcount** - Discussion about hiring 3 new engineers vs 2 engineers and 1 marketing specialist\n3. **Tool Costs** - Review of current software subscriptions to identify cost-saving opportunities\n4. **Travel Budget** - Proposed 20% reduction in Q4 travel budget due to increased virtual meeting effectiveness", "suggested_queries": [ "What was the final decision on headcount?", "Which software subscriptions were identified for review?", "How much is the current travel budget?" ], "status": "completed", "created_at": "2024-03-15T10:32:00Z" } ] } } } ``` ## Audit Trail A successful call records an [`ASKFRED_THREAD_VIEWED`](/graphql-api/query/audit-events) audit event for the thread with the message count in metadata. ## Related > [card] [List All Threads](/graphql-api/query/askfred-threads) > > Get a summary of all your threads > [card] [Continue Thread](/graphql-api/mutation/continue-askfred-thread) > > Add a follow-up question to this thread # AskFred Threads Source: https://docs.fireflies.ai/graphql-api/query/askfred-threads Get a summary of all AskFred conversation threads for the current user ## Overview The `askfred_threads` query retrieves a summary of all AskFred conversation threads belonging to the authenticated user. This query provides a lightweight overview of threads without including the full message history, making it ideal for listing and browsing conversations. ## Arguments **transcript\_id** `String` Filter threads to only those associated with a specific transcript ID ## Schema Fields available to the [AskFredThreadSummary](/schema/askfred-thread-summary) query: * `id`: Unique identifier for the thread * `title`: Thread title (typically derived from the first question) * `transcript_id`: Associated transcript/meeting ID (if applicable) * `user_id`: ID of the user who created the thread * `created_at`: Timestamp when the thread was created ## Usage Example ```graphql theme={null} query GetAskFredThreads { askfred_threads { id title transcript_id user_id created_at } } ``` ### With Filter ```graphql theme={null} query GetFilteredThreads($transcriptId: String) { askfred_threads(transcript_id: $transcriptId) { id title transcript_id user_id created_at } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "query { askfred_threads { id title transcript_id user_id created_at } }" }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: ` query GetAskFredThreads { askfred_threads { id title transcript_id user_id created_at } } ` }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.error(e); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } query = ''' query GetAskFredThreads { askfred_threads { id title transcript_id user_id created_at } } ''' data = { 'query': query } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()) else: print(response.text) ``` ```json Response theme={null} { "data": { "askfred_threads": [ { "id": "thread_abc123", "title": "What were the action items from the Q4 planning meeting?", "transcript_id": "transcript_xyz789", "user_id": "user_123", "created_at": "2024-03-15T10:30:00Z" }, { "id": "thread_def456", "title": "Summary of customer feedback discussions", "transcript_id": null, "user_id": "user_123", "created_at": "2024-03-14T14:20:00Z" } ] } } ``` ## Audit Trail A successful call records an [`ASKFRED_THREADS_LISTED`](/graphql-api/query/audit-events) audit event with the optional meeting ID and number of returned threads in metadata. ## Related > [card] [Get Thread Details](/graphql-api/query/askfred-thread) > > Retrieve complete thread with message history > [card] [Create Thread](/graphql-api/mutation/create-askfred-thread) > > Start a new AskFred conversation # Audit Events (Beta) Source: https://docs.fireflies.ai/graphql-api/query/audit-events Query OCSF-compliant audit events for your team — meetings, teammates, and settings changes ## Overview The `auditEvents` query retrieves audit events for your team. Events follow the [OCSF v1.5.0](https://schema.ocsf.io/) standard and cover meeting operations, team operations, user settings changes, and authentication (login/logout) events. > [!NOTE] > > This query requires an **Enterprise** plan and the requesting user must be a **team admin**. See [pricing](https://fireflies.ai/pricing) for more details. ## Supported Events | Action | Category | Description | | - | - | - | | `MEETING_DELETED` | Meeting Operations | A meeting was deleted | | `MEETING_PRIVACY_UPDATED` | Meeting Operations | Meeting privacy setting was changed | | `MEETING_VIEWED` | Meeting Operations | A meeting summary was viewed | | `MEETING_SHARED` | Meeting Operations | A meeting was shared with someone | | `MEETING_ACCESS_REVOKED` | Meeting Operations | A user's access to a shared meeting was revoked | | `MEETING_DOWNLOADED` | Meeting Operations | A meeting transcript or recording was downloaded | | `MEETING_TITLE_UPDATED` | Meeting Operations | A meeting's title was changed | | `MEETING_MOVED_TO_CHANNEL` | Meeting Operations | One or more meetings were moved to a channel | | `SOUNDBITE_CREATED` | Meeting Operations | A soundbite was created from a meeting | | `ASKFRED_THREAD_CREATED` | Meeting Operations | An AskFred thread was created | | `ASKFRED_THREAD_CONTINUED` | Meeting Operations | An AskFred thread was continued | | `ASKFRED_THREAD_DELETED` | Meeting Operations | An AskFred thread was deleted | | `ASKFRED_THREADS_LISTED` | Meeting Operations | AskFred threads were listed | | `ASKFRED_THREAD_VIEWED` | Meeting Operations | An AskFred thread was viewed | | `MEETING_STATE_UPDATED` | Meeting Operations | Meeting recording state was changed | | `LIVE_ACTION_ITEM_CREATED` | Meeting Operations | A live action item was created | | `LIVE_ACTION_ITEMS_VIEWED` | Meeting Operations | Live action items were viewed | | `LIVE_SOUNDBITE_CREATED` | Meeting Operations | A live soundbite was created | | `MEETING_UPLOAD_CREATED` | Meeting Operations | An upload URL was created for a new meeting recording | | `MEETING_UPLOAD_CONFIRMED` | Meeting Operations | A meeting recording upload was confirmed and sent for processing | | `LIVE_MEETING_BOT_REQUESTED` | Meeting Operations | A bot was requested to join a live meeting | | `MEETING_AUDIO_UPLOADED` | Meeting Operations | Audio was uploaded for transcription | | `RULE_EXECUTIONS_VIEWED` | Team Operations | Rule executions were viewed | | `APP_OUTPUTS_VIEWED` | Meeting Operations | App outputs were viewed | | `TEAMMATE_ADDED` | Team Operations | A teammate was added to the team | | `TEAMMATE_REMOVED` | Team Operations | A teammate was removed from the team | | `USER_ROLE_CHANGED` | User Operations | A teammate's role was changed | | `USERS_LISTED` | User Operations | Users on a team were listed | | `USER_VIEWED` | User Operations | A user profile was viewed | | `USER_GROUPS_LISTED` | Team Operations | User groups were listed | | `USER_GROUP_MEMBER_ADDED` | Team Operations | A teammate was added to a user group | | `USER_GROUP_MEMBER_REMOVED` | Team Operations | A teammate was removed from a user group | | `SETTINGS_UPDATED` | User Operations | Team settings were updated | | `LOGIN` | Authentication | A user logged in | | `LOGOUT` | Authentication | A user logged out | ## Arguments **limit** `Int` (default: 20) Maximum number of events to return. Must be between 1 and 50. **cursor** `String` Pagination cursor for fetching the next page of results. Use the `next_cursor` value from a previous response. **filters** `AuditEventFiltersInput` *required* Filters for the query. The `category` field is required. **Filter properties** **category** `AuditEventCategory` *required* Event category (required): `MEETING_OPERATIONS`, `TEAM_OPERATIONS`, `USER_OPERATIONS`, or `AUTHENTICATION`. **action** `AuditEventAction` Filter by a specific action (e.g., `MEETING_DELETED`, `TEAMMATE_ADDED`). **date\_from** `String` Filter events from this date (ISO 8601 format). **date\_to** `String` Filter events up to this date (ISO 8601 format). **actor\_user\_id** `String` Filter by the user ID of the user who performed the action. **actor\_email** `String` Filter by the email of the user who performed the action. Resolved to a user ID server-side. Takes precedence over `actor_user_id` if both are provided. ## Response Fields **events** `[AuditEvent]` List of audit events matching the query. **Event properties** **id** `String` Unique identifier for the event. **time** `String` When the event occurred (ISO 8601 format). **category** `AuditEventCategory` Event category: `MEETING_OPERATIONS`, `TEAM_OPERATIONS`, `USER_OPERATIONS`, or `AUTHENTICATION`. **action** `AuditEventAction` The specific action that occurred (e.g., `MEETING_DELETED`). **severity** `String` Event severity level: `informational`, `low`, `medium`, `high`, `critical`, `fatal`. **status** `String` Event outcome: `success` or `failure`. **message** `String` Human-readable description of the event. **class\_uid** `Int` OCSF class UID for compliance mapping. **activity\_id** `Int` OCSF activity ID for compliance mapping. **type\_uid** `Int` OCSF type UID (`class_uid * 100 + activity_id`). **actor** `AuditEventActor` The user who performed the action. **Actor properties** **user\_id** `String` User ID of the actor. **email** `String` Email address of the actor. **full\_name** `String` Full name of the actor. **ip\_address** `String` IP address from which the action was performed. **resource** `AuditEventResource` The resource that was affected. **Resource properties** **type** `String` Resource type: `meeting`, `team`, `user`, or `askfred_thread`. **id** `String` Resource identifier (meeting ID, team ID, user ID, or AskFred thread ID). **metadata** `String` Additional context as a JSON string of key-value pairs, or `null` when the action carries none. Which keys appear depends on the action. Events written by the Public API and MCP use: | Action | Keys | | - | - | | `MEETING_DELETED` | `deleteMode` | | `MEETING_PRIVACY_UPDATED` | `privacy` | | `MEETING_SHARED` | `inviteeCount` | | `MEETING_MOVED_TO_CHANNEL` | `channelId`, `meetingCount` | | `SOUNDBITE_CREATED` | `biteId` | | `ASKFRED_THREAD_CREATED` | `meetingId`, `messageId` | | `ASKFRED_THREAD_CONTINUED` | `meetingId`, `messageId` | | `ASKFRED_THREADS_LISTED` | `meetingId`, `threadCount` | | `ASKFRED_THREAD_VIEWED` | `messageCount` | | `MEETING_STATE_UPDATED` | `recordingAction` | | `LIVE_ACTION_ITEMS_VIEWED` | `itemCount` | | `MEETING_UPLOAD_CREATED` | `contentType`, `fileSize` | | `LIVE_MEETING_BOT_REQUESTED` | `duration` | | `MEETING_AUDIO_UPLOADED` | `clientReferenceId` | | `RULE_EXECUTIONS_VIEWED` | `meetingId`, `meetingCount` | | `APP_OUTPUTS_VIEWED` | `appId`, `outputCount` | | `USER_ROLE_CHANGED` | `role` | | `USERS_LISTED` | `userCount` | | `USER_GROUPS_LISTED` | `groupCount`, `level` | | `USER_GROUP_MEMBER_ADDED` | `groupId` | | `USER_GROUP_MEMBER_REMOVED` | `groupId` | Moving several meetings at once records one event per meeting, each carrying the same `meetingCount` — the size of the batch the action moved, not a per-event count. Group such events by `time` and `actor` to reconstruct a single bulk operation. On `MEETING_DELETED`, `deleteMode` is `deleted` when the meeting was deleted for everyone, or `removed` when a co-owner only removed it from their own account and the other owners keep it. `source` identifies where the action came from: `api` (Public API), `mcp` (MCP server), `web` (Fireflies web app), or `fireflies_support` (action taken by Fireflies support). It is omitted when the surface can't be identified. Actions recorded by other Fireflies services may carry their own keys. Treat the object as open: new keys can be added for an action without notice, so read the keys you need rather than assuming an exact shape. `token_type` records how the actor authenticated: `api_key` (personal API key), `oauth` (an authorized OAuth/MCP client), or `service` (a Fireflies service acting on the user's behalf). When it is `api_key`, `api_key_id` carries the identifier of the key that performed the action (never the key value), so admins can attribute activity to a specific key and correlate it with key creation/reset events. Both are omitted when the surface can't be identified. **has\_more** `Boolean` Indicates if there are more results available. **next\_cursor** `String` Cursor to use for fetching the next page of results. ## Usage Example ```graphql theme={null} query AuditEvents($limit: Int, $filters: AuditEventFiltersInput!) { auditEvents(limit: $limit, filters: $filters) { events { id time category action severity status message actor { user_id email full_name ip_address } resource { type id } metadata } has_more next_cursor } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query { auditEvents(limit: 10, filters: { category: MEETING_OPERATIONS }) { events { id time action actor { user_id } resource { type id } } has_more next_cursor } }" }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key', }; const data = { query: `query AuditEvents($limit: Int, $filters: AuditEventFiltersInput) { auditEvents(limit: $limit, filters: $filters) { events { id time category action message actor { user_id email } resource { type id } } has_more next_cursor } }`, variables: { limit: 10, filters: { category: 'MEETING_OPERATIONS' }, }, }; axios .post(url, data, { headers: headers }) .then((response) => { console.log(response.data); }) .catch((error) => { console.error(error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } query = ''' query AuditEvents($limit: Int, $filters: AuditEventFiltersInput) { auditEvents(limit: $limit, filters: $filters) { events { id time category action message actor { user_id email } resource { type id } } has_more next_cursor } } ''' data = { 'query': query, 'variables': { 'limit': 10, 'filters': { 'category': 'MEETING_OPERATIONS' } } } response = requests.post(url, headers=headers, json=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class ApiRequest { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); String json = "{\"query\":\"query { auditEvents(limit: 10, filters: { category: MEETING_OPERATIONS }) { events { id time action actor { user_id } resource { type id } } has_more next_cursor } }\"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "auditEvents": { "events": [ { "id": "682e3a1b-f4c2-4d9a-b1e7-8c5d3f2a1b0c", "time": "2026-04-25T10:30:00.000Z", "category": "MEETING_OPERATIONS", "action": "MEETING_SHARED", "severity": "informational", "status": "success", "message": "share_meeting by alice@example.com", "actor": { "user_id": "user_abc123", "email": "alice@example.com", "full_name": "Alice Johnson", "ip_address": "192.168.1.1" }, "resource": { "type": "meeting", "id": "01K8DV541XM97WMGRCX66TPSWG" }, "metadata": "{\"shareType\":\"email\",\"inviteeCount\":\"2\"}" }, { "id": "7a1c4d5e-2b3f-4a8c-9d0e-1f2a3b4c5d6e", "time": "2026-04-25T09:15:00.000Z", "category": "MEETING_OPERATIONS", "action": "MEETING_DELETED", "severity": "informational", "status": "success", "message": "delete_meeting by bob@example.com", "actor": { "user_id": "user_def456", "email": "bob@example.com", "full_name": "Bob Smith", "ip_address": null }, "resource": { "type": "meeting", "id": "01L2XY789ABC" }, "metadata": null } ], "has_more": true, "next_cursor": "eyJpZCI6IjdhMWM0ZDVlIn0=" } } } ``` ## Pagination Use cursor-based pagination to fetch additional results: ```graphql theme={null} query { auditEvents(limit: 20, cursor: "eyJpZCI6IjdhMWM0ZDVlIn0=", filters: { category: MEETING_OPERATIONS }) { events { id time action } has_more next_cursor } } ``` ## OCSF Compliance All events conform to the [OCSF v1.5.0](https://schema.ocsf.io/) standard. The `class_uid`, `activity_id`, and `type_uid` fields map directly to OCSF event classification, enabling integration with SIEM tools and compliance pipelines. | Action | OCSF Class | class\_uid | activity\_id | | - | - | - | - | | `MEETING_DELETED` | API Activity | 6003 | 4 | | `MEETING_PRIVACY_UPDATED` | Entity Management | 3004 | 3 | | `MEETING_VIEWED` | Web Resource Activity | 6001 | 2 | | `MEETING_SHARED` | User Access Management | 3005 | 1 | | `MEETING_DOWNLOADED` | Web Resource Activity | 6001 | 7 | | `TEAMMATE_ADDED` | User Access Management | 3005 | 1 | | `TEAMMATE_REMOVED` | User Access Management | 3005 | 2 | | `SETTINGS_UPDATED` | Entity Management | 3004 | 3 | | `LOGIN` | Authentication | 3002 | 1 | | `LOGOUT` | Authentication | 3002 | 2 | ## Error Codes List of possible error codes that may be returned by the `auditEvents` query. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] paid\_required (enterprise) > > You need to be on an Enterprise plan to query audit events. > [accordion] require\_elevated\_privilege > > You need to be a team admin to query audit events. > [accordion] service\_unavailable > > The audit service is temporarily unavailable. Please try again later. ## Additional Resources > [card] [Transcripts](/graphql-api/query/transcripts) > > Querying list of transcripts > [card] [Rule Executions](/graphql-api/query/rule-executions-by-meeting) > > Querying automation rule executions # Bite Source: https://docs.fireflies.ai/graphql-api/query/bite Querying bite details ## Overview The bite query is designed to fetch details associated with a specific bite ID. ## Arguments **id** `ID` *required* Unique identifier of the bite ## Schema Fields available to the [Bite](/schema/bite) query ## Usage Example ```graphql theme={null} query Bite($biteId: ID!) { bite(id: $biteId) { transcript_id name id thumbnail preview status summary user_id start_time end_time summary_status media_type created_at created_from { description duration id name type } captions { end_time index speaker_id speaker_name start_time text } sources { src type } privacies user { first_name last_name picture name id } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query Bite($biteId: ID!) { bite(id: $biteId) { user_id name status summary } }", "variables": { "biteId": "your_bite_id" } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: 'query Bite($biteId: ID!) { bite(id: $biteId) { user_id name status summary } }', variables: { biteId: 'your_bite_id' } }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error('Error:', error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "query Bite($biteId: ID!) { bite(id: $biteId) { user_id name status summary } }", "variables": {"biteId": "your_bite_id"}}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"query Bite($biteId: ID!) { bite(id: $biteId) { user_id name status summary } }\", \"variables\": {\"biteId\": \"your_bite_id\"}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "bite": { "user_id": "user-id", "id": "bite-id", } } } ``` ## Additional Resources > [card] [Bites](/graphql-api/query/bites) > > Querying list of bites > [card] [Create Bite](/graphql-api/mutation/create-bite) > > Use the API to create a bite # Bites Source: https://docs.fireflies.ai/graphql-api/query/bites Querying list of bites ## Overview The bites query is designed to fetch a list of bites against input arguments. ## Arguments **mine** `Boolean` *required* The `mine` parameter, when set to true, fetches results specific to the owner of the API key **transcript\_id** `ID` You can use `transcript_id` to query all bites against a specific transcript. **my\_team** `Boolean` The `my_team` parameter, when set to true, fetches results for the owner of the API key **limit** `Int` Maximum number of bites to fetch in a single query. Maximum of 50 **skip** `Int` Number of records to skip over. Helps paginate results when used in combination with the `limit` param. ## Schema Fields available to the [Bites](/schema/bite) query ## Usage Example ```graphql theme={null} query Bites($mine: Boolean) { bites(mine: $mine) { transcript_id name id thumbnail preview status summary user_id start_time end_time summary_status media_type created_at created_from { description duration id name type } captions { end_time index speaker_id speaker_name start_time text } sources { src type } privacies user { first_name last_name picture name id } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query Bites($mine: Boolean) { bites(mine: $mine) { user_id name end_time } }", "variables": { "mine": true } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: 'query Bites($mine: Boolean) { bites(mine: $mine) { user_id name end_time } }', variables: { mine: true } }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error('Error:', error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "query Bites($mine: Boolean) { bites(mine: $mine) { user_id name end_time } }", "variables": {"mine": true }}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"query Bites($mine: Boolean) { bites(mine: $mine) { user_id name end_time } }\", \"variables\": {\"mine\": true}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "bites": [ { "user_id": "user-id", "id": "bite-id", }, { "user_id": "user-id", "id": "bite-id-2", } ] } } ``` ## Error Codes List of possible error codes that may be returned by the `bites` query. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] args\_required > > You must provide at least one of the following arguments: `mine`, `transcript_id`, `my_team` to the bites query ## Additional Resources > [card] [Bite](/graphql-api/query/bite) > > Querying bite details > [card] [Create Bite](/graphql-api/mutation/create-bite) > > Use the API to create a bite # Channel Source: https://docs.fireflies.ai/graphql-api/query/channel Querying channel details ## Overview The channel query is designed to fetch details of a specific channel by its ID. The user must have access to the channel (either it's a public channel in their team, or they are a member of the private channel). ## Arguments **id** `ID!` *required* The unique identifier of the channel to fetch. ## Schema Fields available to the [Channel](/schema/channel) query ## Usage Example ```graphql theme={null} query Channel($channelId: ID!) { channel(id: $channelId) { id title is_private created_by created_at updated_at members { user_id email name } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query Channel($channelId: ID!) { channel(id: $channelId) { id title is_private members { user_id email } } }", "variables": { "channelId": "your_channel_id" } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: 'query Channel($channelId: ID!) { channel(id: $channelId) { id title is_private members { user_id email } } }', variables: { channelId: 'your_channel_id' } }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "query Channel($channelId: ID!) { channel(id: $channelId) { id title is_private members { user_id email } } }", "variables": {"channelId": "your_channel_id"}}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"query Channel($channelId: ID!) { channel(id: $channelId) { id title is_private members { user_id email } } }\", \"variables\": {\"channelId\": \"your_channel_id\"}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "channel": { "id": "channel-id-1", "title": "Engineering", "is_private": false, "members": [ { "user_id": "user-id-1", "email": "john@example.com", "name": "John Doe" }, { "user_id": "user-id-2", "email": "jane@example.com", "name": "Jane Smith" } ] } } } ``` ## Error Codes List of possible error codes that may be returned by the `channel` query. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found (Channel) > > The channel ID you are trying to query does not exist or you do not have access to it. ## Additional Resources > [card] [Channels](/graphql-api/query/channels) > > Query list of channels > [card] [Channel Schema](/schema/channel) > > Schema for Channel # Channels Source: https://docs.fireflies.ai/graphql-api/query/channels Querying list of channels ## Overview The channels query is designed to fetch a list of channels accessible to the authenticated user. This includes public channels in the user's team and private channels where the user is a member. ## Arguments This query does not require any arguments. ## Schema Fields available to the [Channel](/schema/channel) query ## Usage Example ```graphql theme={null} query Channels { channels { id title is_private created_by created_at updated_at members { user_id email name } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query Channels { channels { id title is_private members { user_id email } } }" }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: 'query Channels { channels { id title is_private members { user_id email } } }' }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "query Channels { channels { id title is_private members { user_id email } } }"}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodyHandlers; public class ApiRequest { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); String json = "{\"query\":\"query Channels { channels { id title is_private members { user_id email } } }\"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "channels": [ { "id": "channel-id-1", "title": "Engineering", "is_private": false, "members": [ { "user_id": "user-id-1", "email": "john@example.com", "name": "John Doe" }, { "user_id": "user-id-2", "email": "jane@example.com", "name": "Jane Smith" } ] }, { "id": "channel-id-2", "title": "Private Project", "is_private": true, "members": [ { "user_id": "user-id-1", "email": "john@example.com", "name": "John Doe" } ] } ] } } ``` ## Additional Resources > [card] [Channel](/graphql-api/query/channel) > > Query a single channel by ID > [card] [Channel Schema](/schema/channel) > > Schema for Channel # Contacts Source: https://docs.fireflies.ai/graphql-api/query/contacts Querying list of contacts ## Overview The contacts query is designed to fetch a list of all contacts associated with the authenticated user. Contacts are people who have participated in meetings with the user, and include information such as email, name, profile picture, and the date of their last meeting together. ## Schema Fields available to the [Contact](/schema/contact) query ## Usage Example ```graphql theme={null} query Contacts { contacts { email name picture last_meeting_date } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "{ contacts { email name picture last_meeting_date } }" }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: '{ contacts { email name picture last_meeting_date } }' }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error('Error:', error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "{ contacts { email name picture last_meeting_date } }"}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"{ contacts { email name picture last_meeting_date } }\"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "contacts": [ { "email": "john.doe@example.com", "name": "John Doe", "picture": "https://example.com/photo.jpg", "last_meeting_date": "2024-12-05" }, { "email": "jane.smith@example.com", "name": "Jane Smith", "picture": null, "last_meeting_date": "2024-11-28" } ] } } ``` ## Additional Resources > [card] [User](/graphql-api/query/user) > > Querying user details > [card] [Users](/graphql-api/query/users) > > Querying list of users # Live Action Items Source: https://docs.fireflies.ai/graphql-api/query/live_action_items Query live action items for a meeting ## Overview The `live_action_items` query allows you to fetch action items for a live meeting. This includes both action items automatically created by Fireflies during the meeting and action items created via the `createLiveActionItem` mutation. ## Arguments **meeting\_id** `ID!` *required* The ID of the meeting to fetch live action items for ## Response Returns an array of `LiveActionItem` objects with the following fields: **name** `String` Name of the person who the action item is associated with **action\_item** `String!` The action item text ## Usage Example To fetch live action items for a meeting: ```graphql theme={null} query LiveActionItems($meeting_id: ID!) { live_action_items(meeting_id: $meeting_id) { name action_item } } ``` ```bash curl theme={null} curl -X POST https://api.fireflies.ai/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "query LiveActionItems($meeting_id: ID!) { live_action_items(meeting_id: $meeting_id) { name action_item } }", "variables": { "meeting_id": "your_meeting_id" } }' ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: `query LiveActionItems($meeting_id: ID!) { live_action_items(meeting_id: $meeting_id) { name action_item } }`, variables: { meeting_id: 'your_meeting_id' } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = { 'query': ''' query LiveActionItems($meeting_id: ID!) { live_action_items(meeting_id: $meeting_id) { name action_item } } ''', 'variables': { 'meeting_id': 'your_meeting_id' } } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()['data']) else: print(response.text) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"query LiveActionItems($meeting_id: ID!) { live_action_items(meeting_id: $meeting_id) { name action_item } }\", \"variables\": {\"meeting_id\": \"your_meeting_id\"}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "live_action_items": [ { "name": "John Doe", "action_item": "Follow up with the client about the proposal" }, { "name": "Jane Smith", "action_item": "Arrange a follow-up meeting for next week" } ] } } ``` ## Error Codes List of possible error codes that may be returned by the `live_action_items` query. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found > > The meeting with the specified ID was not found or you do not have access to it. > [accordion] require\_elevated\_privilege > > You do not have permission to view action items for this meeting. Only the meeting organizer or team admin can view live action items. ## Audit Trail A successful call records a [`LIVE_ACTION_ITEMS_VIEWED`](/graphql-api/query/audit-events) audit event for the meeting with the returned item count in metadata. ## Additional Resources > [card] [Create Live Action Item](/graphql-api/mutation/create-live-action-item) > > Create action items during a live meeting > [card] [Update Meeting State](/graphql-api/mutation/update-meeting-state) > > Pause or resume recording for a live meeting # Rule Executions by Meeting Source: https://docs.fireflies.ai/graphql-api/query/rule-executions-by-meeting Query rule execution logs grouped by meeting for team automation workflows ## Overview The `rule_executions_by_meeting` query retrieves rule execution logs grouped by meeting. This allows you to see which automation rules were triggered for each meeting and what actions were taken. > [!NOTE] > > This query requires an **Enterprise** plan. See [pricing](https://fireflies.ai/pricing) for more > details. ## Arguments **limit** `Int` (default: 10) Maximum number of meeting groups to return. Must be between 1 and 50. **cursor** `String` Pagination cursor for fetching the next page of results. Use the `next_cursor` value from a previous response. **logs\_per\_meeting** `Int` (default: 5) Maximum number of execution logs to return per meeting. Must be between 1 and 20. **filters** `RuleExecutionFiltersInput` Optional filters to narrow down the results. **Filter properties** **rule\_id** `String` Filter by a specific rule ID. **meeting\_id** `String` Filter by a specific meeting ID. **date\_from** `String` Filter executions from this date (ISO 8601 format). **date\_to** `String` Filter executions up to this date (ISO 8601 format). **is\_test** `Boolean` Filter by test evaluations. When `true`, returns only test logs. When `false`, returns only production logs. When not provided, returns all logs. ## Response Fields **meetings** `[RuleExecutionMeetingGroup]` List of meeting groups with their rule executions. **Meeting group properties** **meeting\_id** `String` The unique identifier of the meeting. **meeting** `RuleExecutionMeeting` Meeting details including `id`, `title`, and `organizer_email`. **resource\_attributes** `RuleExecutionResourceAttributes` Additional meeting attributes like `host`, `attendees`, `user_group_ids`, and `host_user_group_ids`. **executions** `[RuleExecution]` List of rule executions for this meeting. **Execution properties** **extension\_id** `String` The rule ID that was executed. **extension\_title** `String` The name of the rule that was executed. **stopped\_at** `String` Timestamp when the rule execution completed (ISO 8601 format). **user\_name** `String` Name of the meeting organizer. **share** `RuleExecutionShare` Share action details with `group_ids`. **channel** `RuleExecutionChannel` Channel routing action details with `channel_id`. **meeting\_privacy** `RuleExecutionMeetingPrivacy` Privacy update action details with `privacy`. **has\_more** `Boolean` Indicates if there are more results available. **next\_cursor** `String` Cursor to use for fetching the next page of results. ## Usage Example ```graphql theme={null} query RuleExecutionsByMeeting($limit: Int, $filters: RuleExecutionFiltersInput) { rule_executions_by_meeting(limit: $limit, filters: $filters) { meetings { meeting_id meeting { id title organizer_email } executions { extension_id extension_title stopped_at user_name share { group_ids } channel { channel_id } meeting_privacy { privacy } } } has_more next_cursor } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query { rule_executions_by_meeting(limit: 5, filters: { is_test: false }) { meetings { meeting_id meeting { title } executions { extension_title stopped_at } } has_more next_cursor } }" }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key', }; const data = { query: `query RuleExecutionsByMeeting($limit: Int, $filters: RuleExecutionFiltersInput) { rule_executions_by_meeting(limit: $limit, filters: $filters) { meetings { meeting_id meeting { title } executions { extension_title stopped_at } } has_more next_cursor } }`, variables: { limit: 5, filters: { is_test: false }, }, }; axios .post(url, data, { headers: headers }) .then((response) => { console.log(response.data); }) .catch((error) => { console.error(error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } query = ''' query RuleExecutionsByMeeting($limit: Int, $filters: RuleExecutionFiltersInput) { rule_executions_by_meeting(limit: $limit, filters: $filters) { meetings { meeting_id meeting { title } executions { extension_title stopped_at } } has_more next_cursor } } ''' data = { 'query': query, 'variables': { 'limit': 5, 'filters': { 'is_test': False } } } response = requests.post(url, headers=headers, json=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class ApiRequest { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); String json = "{\"query\":\"query { rule_executions_by_meeting(limit: 5, filters: { is_test: false }) { meetings { meeting_id meeting { title } executions { extension_title stopped_at } } has_more next_cursor } }\"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "rule_executions_by_meeting": { "meetings": [ { "meeting_id": "01K8DV541XM97WMGRCX66TPSWG", "meeting": { "title": "Weekly Team Sync" }, "executions": [ { "extension_title": "Auto-share with Sales Team", "stopped_at": "2024-01-15T14:30:00.000Z" }, { "extension_title": "Route to #meetings channel", "stopped_at": "2024-01-15T14:30:01.000Z" } ] } ], "has_more": true, "next_cursor": "1705329001000_01K8DV541XM97WMGRCX66TPSWG" } } } ``` ## Pagination Use cursor-based pagination to fetch additional results: ```graphql theme={null} query { rule_executions_by_meeting(limit: 10, cursor: "1705329001000_01K8DV541XM97WMGRCX66TPSWG") { meetings { meeting_id } has_more next_cursor } } ``` ## Error Codes List of possible error codes that may be returned by the `rule_executions_by_meeting` query. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] paid\_required (enterprise) > > You need to be on an Enterprise plan to query rule execution logs. > [accordion] service\_unavailable > > The rules service is temporarily unavailable. Please try again later. ## Audit Trail A successful call records a [`RULE_EXECUTIONS_VIEWED`](/graphql-api/query/audit-events) audit event for the team with the optional meeting ID and returned meeting count in metadata. ## Additional Resources > [card] [Transcripts](/graphql-api/query/transcripts) > > Querying list of transcripts > [card] [Analytics](/graphql-api/query/analytics) > > Querying meeting analytics # Transcript Source: https://docs.fireflies.ai/graphql-api/query/transcript Querying transcript details ## Overview The transcript query is designed to fetch details associated with a specific transcript ID. ## Arguments **id** `String` *required* ## Schema Fields available to the [Transcript](/schema/transcript) query ## Usage Example ```graphql theme={null} query Transcript($transcriptId: String!) { transcript(id: $transcriptId) { id dateString privacy analytics { sentiments { negative_pct neutral_pct positive_pct } categories { questions date_times metrics tasks } speakers { speaker_id name duration word_count longest_monologue monologues_count filler_words questions duration_pct words_per_minute } } speakers { id name } sentences { index speaker_name speaker_id text raw_text start_time end_time ai_filters { task pricing metric question date_and_time text_cleanup sentiment } } title host_email organizer_email calendar_id user { user_id email name num_transcripts recent_meeting minutes_consumed is_admin integrations } fireflies_users participants date transcript_url audio_url video_url duration meeting_attendees { displayName email phoneNumber name location } meeting_attendance { name join_time leave_time } summary { keywords action_items outline shorthand_bullet overview bullet_gist gist short_summary short_overview meeting_type topics_discussed transcript_chapters } cal_id calendar_type meeting_info { fred_joined silent_meeting summary_status } apps_preview { outputs { transcript_id user_id app_id created_at title prompt response } } meeting_link is_live channels { id } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query Transcript($transcriptId: String!) { transcript(id: $transcriptId) { title id } }", "variables": { "transcriptId": "your_transcript_id" } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: 'query Transcript($transcriptId: String!) { transcript(id: $transcriptId) { title id } }', variables: { transcriptId: 'your_transcript_id' } }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error('Error:', error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "query Transcript($transcriptId: String!) { transcript(id: $transcriptId) { title id } }", "variables": {"transcriptId": "your_transcript_id"}}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"query Transcript($transcriptId: String!) { transcript(id: $transcriptId) { title id } }\", \"variables\": {\"transcriptId\": \"your_transcript_id\"}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "transcript": { "title": "Weekly sync", "id": "transcript-id", } } } ``` ## Error Codes List of possible error codes that may be returned by the `transcript` query. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found (transcript) > > The transcript ID you are trying to query does not exist or you do not have access to it. ## Additional Resources > [card] [Transcripts](/graphql-api/query/transcripts) > > Querying list of transcripts > [card] [Update Meeting Title](/graphql-api/mutation/update-meeting-title) > > Use the API to update meeting titles # Transcripts Source: https://docs.fireflies.ai/graphql-api/query/transcripts Querying list of transcripts ## Overview The transcripts query is designed to fetch a list of transcripts against input arguments. ## Arguments **title** `String` **This field is deprecated. Please use `keyword` instead.** Title of the transcript This argument is mutually exclusive with `keyword` field The maximum allowable length for this field is `256` characters. **keyword** `String` Allows searching for keywords in meeting title and/or words spoken during the meeting This argument is mutually exclusive with `title` field The maximum allowable length for this field is `255` characters. **scope** `String` Specify the scope for keyword search. If scope is provided, `keyword` becomes a required field Defaults to `title` if no value is provided The available options for this field are: * `title`: Search within the title. * `sentences`: Search within the [sentences](/schema/sentence). * `all`: Search within title and sentences. **fromDate** `DateTime` Return all transcripts created after `fromDate`. The `fromDate` parameter accepts a date-time string in the ISO 8601 format, specifically in the form `YYYY-MM-DDTHH:mm.sssZ`. For example, a valid timestamp would be `2024-07-08T22:13:46.660Z`. **toDate** `DateTime` Return all transcripts created before `toDate`. The `toDate` parameter accepts a date-time string in the ISO 8601 format, specifically in the form `YYYY-MM-DDTHH:mm.sssZ`. For example, a valid timestamp would be `2024-07-08T22:13:46.660Z`. **date** `Float` ** This field is deprecated. Please use `fromDate` and `toDate` instead.** Return all transcripts created within the date specified. Query input value must be in milliseconds. For example, you can use the JavaScript `new Date().getTime()` to get the datetime in milliseconds which should look like this `1621292557453`. The timezone for this field is UTC +00:00 For more details regarding time since [EPOCH](https://currentmillis.com/) **limit** `Int` Number of transcripts to return. Maxiumum 50 in one query **skip** `Int` Number of transcripts to skip. **host\_email** `String` Filter all meetings accordingly to meetings that have this email as the host. **organizer\_email** `String` **This field is deprecated. Please use `organizers` instead.** Filter meetings that have this email as the organizer. **participant\_email** `String` **This field is deprecated. Please use `participants` instead.** Filter meetings that contain this email as an attendee. **user\_id** `String` [User id](/schema/user). Filter all meetings that have this user ID as the organizer or participant. **mine** `Boolean` Filter all meetings that have the API key owner as the organizer. **organizers** `[String]` Filter meetings that have any of these emails as organizers. Accepts an array of email addresses. Cannot be combined with the deprecated `organizer_email` or `participant_email` fields. Each email must be valid and 256 characters or fewer. **participants** `[String]` Filter meetings that contain any of these emails as attendees. Accepts an array of email addresses. Cannot be combined with the deprecated `organizer_email` or `participant_email` fields. Each email must be valid and 256 characters or fewer. **channel\_id** `String` Filter meetings that belong to a specific channel. Accepts a single channel ID. The channel ID must be a valid string and 256 characters or fewer. ## Schema Fields available to the [Transcript](/schema/transcript) query ## Usage Example ```graphql theme={null} query Transcripts( $title: String $date: Float $limit: Int $skip: Int $hostEmail: String $participantEmail: String $organizers: [String!] $participants: [String!] $userId: String $channelId: String ) { transcripts( title: $title date: $date limit: $limit skip: $skip host_email: $hostEmail participant_email: $participantEmail organizers: $organizers participants: $participants user_id: $userId channel_id: $channelId ) { id analytics { sentiments { negative_pct neutral_pct positive_pct } categories { questions date_times metrics tasks } speakers { speaker_id name duration word_count longest_monologue monologues_count filler_words questions duration_pct words_per_minute } } sentences { index speaker_name speaker_id text raw_text start_time end_time ai_filters { task pricing metric question date_and_time text_cleanup sentiment } } title speakers { id name } host_email organizer_email meeting_info { fred_joined silent_meeting summary_status } calendar_id user { user_id email name num_transcripts recent_meeting minutes_consumed is_admin integrations } fireflies_users participants date transcript_url audio_url video_url duration meeting_attendees { displayName email phoneNumber name location } meeting_attendance { name join_time leave_time } summary { keywords action_items outline shorthand_bullet overview bullet_gist gist short_summary short_overview meeting_type topics_discussed transcript_chapters } cal_id calendar_type apps_preview { outputs { transcript_id user_id app_id created_at title prompt response } } meeting_link is_live channels { id } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query Transcripts($userId: String) { transcripts(user_id: $userId) { title id } }" }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: 'query Transcripts($userId: String) { transcripts(user_id: $userId) { title id } }', variables: { userId: 'your_user_id' } }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "query Transcripts($userId: String) { transcripts(user_id: $userId) { title id } }", "variables": {"userId": "user_id"}}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodyHandlers; public class ApiRequest { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); String json = "{\"query\":\"query Transcripts { transcripts { title id } } \"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "transcripts": [ { "title": "Weekly sync", "id": "transcript-id", }, { "title": "ClientMeeting.mp3", "id": "transcript-id-2", } ] } } ``` ## Error Codes List of possible error codes that may be returned by the `transcripts` query. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found (user) > > The user ID you are trying to query does not exist or you do not have access to it. ## Additional Resources > [card] [Transcript](/graphql-api/query/transcript) > > Querying transcript details > [card] [Upload Audio](/graphql-api/mutation/upload-audio) > > Use the API to upload audio to Fireflies.ai # User Source: https://docs.fireflies.ai/graphql-api/query/user Querying user details ## Overview The user query is designed to fetch details associated with a specific user id. ## Arguments **id** `String` > [!NOTE] > > `id` is an optional argument. Not passing an ID to this query will return user details for the > owner of the API key ## Schema Fields available to the [User](/schema/user) query ## Usage Example ```graphql theme={null} query User($userId: String!) { user(id: $userId) { user_id recent_transcript recent_meeting num_transcripts name minutes_consumed is_admin integrations email user_groups { id name handle members { user_id first_name last_name email } } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "query User($userId: String!) { user(id: $userId) { name integrations } }", "variables": { "userId": "your_user_id" } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: 'query User($userId: String!) { user(id: $userId) { name integrations } }', variables: { userId: 'your_user_id' } }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error('Error:', error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "query User($userId: String!) { user(id: $userId) { name integrations } }", "variables": {"userId": "your_user_id"}}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"query User($userId: String!) { user(id: $userId) { name integrations } }\", \"variables\": {\"userId\": \"your_user_id\"}}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "user": { "name": "Justin Fly", "integrations": ["string"], } } } ``` ## Error Codes List of possible error codes that may be returned by the `user` query. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] object\_not\_found (user) > > The user ID you are trying to query does not exist. > [accordion] not\_in\_team > > The user ID you are trying to query is not in your team. ## Audit Trail Successful `user` queries emit `USER_VIEWED` for the requested user, or the authenticated user when no ID is supplied. ## Additional Resources > [card] [Users](/graphql-api/query/users) > > Querying list of users > [card] [UserGroups](/graphql-api/query/user-groups) > > Querying user groups # UserGroups Source: https://docs.fireflies.ai/graphql-api/query/user-groups Querying user groups ## Overview The user\_groups query is designed to fetch a list of all user groups within the team. This query allows you to retrieve information about user groups including their members. ## Arguments **mine** `Boolean` `mine` is an optional boolean argument. If set to `true`, returns only user groups that the current user belongs to. If not provided or set to `false`, returns all user groups in the team. ## Schema Fields available to the [UserGroup](/schema/user-groups) query ## Usage Example ```graphql theme={null} query UserGroups($mine: Boolean) { user_groups(mine: $mine) { id name handle members { user_id first_name last_name email } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "{ user_groups { name handle members { first_name last_name email } } }" }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: '{ user_groups { name handle members { first_name last_name email } } }' }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error('Error:', error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "{ user_groups { name handle members { first_name last_name email } } }"}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"{ user_groups { name handle members { first_name last_name email } } }\"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "user_groups": [ { "id": "group_123", "name": "Engineering Team", "handle": "engineering", "members": [ { "user_id": "user_456", "first_name": "John", "last_name": "Doe", "email": "john.doe@example.com" }, { "user_id": "user_789", "first_name": "Jane", "last_name": "Smith", "email": "jane.smith@example.com" } ] }, { "id": "group_124", "name": "Sales Team", "handle": "sales", "members": [ { "user_id": "user_101", "first_name": "Bob", "last_name": "Johnson", "email": "bob.johnson@example.com" } ] } ] } } ``` ## Error Codes List of possible error codes that may be returned by the `user_groups` query. Full list of error codes can be found [here](/miscellaneous/error-codes). > [accordion] not\_authorized > > You do not have permission to access user groups for this team. ## Audit Trail Successful `user_groups` queries emit `USER_GROUPS_LISTED` with the returned group count (`groupCount`) and access level (`level`: `user` or `team`). ## Additional Resources > [card] [Users](/graphql-api/query/users) > > Querying list of users > [card] [User](/graphql-api/query/user) > > Querying user details # Users Source: https://docs.fireflies.ai/graphql-api/query/users Querying list of users ## Overview The users query is designed to fetch a list of all users within the team. You can also view this list on your dashboard at [app.fireflies.ai/team](http://app.fireflies.ai/team) ## Schema Fields available to the [User](/schema/user) query ## Usage Example ```graphql theme={null} query Users { users { user_id email name num_transcripts recent_meeting minutes_consumed is_admin integrations user_groups { id name handle members { user_id first_name last_name email } } } } ``` ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ --data '{ "query": "{ users { name integrations } }" }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const data = { query: '{ users { name integrations } }' }; axios .post(url, data, { headers: headers }) .then(response => { console.log(response.data); }) .catch(error => { console.error('Error:', error); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } data = '{"query": "{ users { name integrations } }"}' response = requests.post(url, headers=headers, data=data) print(response.json()) ``` ```java java theme={null} import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class ApiRequest { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); String jsonRequest = "{\"query\": \"{ users { name integrations } }\"}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(jsonRequest)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ```json Response theme={null} { "data": { "users": [ { "name": "Justin Fly", "integrations": [] }, { "name": "Peter Fire", "integrations": [] } ] } } ``` ## Audit Trail Successful `users` queries emit `USERS_LISTED` with the number of returned users (`userCount`). ## Additional Resources > [card] [User](/graphql-api/query/user) > > Querying user details > [card] [Set User Role](/graphql-api/mutation/set-user-role) > > Use the API to set user roles # Webhooks V1 (deprecated) Source: https://docs.fireflies.ai/graphql-api/webhooks Legacy webhook events for the Fireflies.ai API ## Overview Webhooks enable your application to set up event based notifications. This page documents the legacy (V1) webhook, configured from the dashboard Developer settings. > [!WARNING] > > Webhooks V1 is deprecated. The webhook field in **Settings → Developer settings** is now read-only: existing webhooks keep being delivered, but new webhooks must be created with [Webhooks V2](/graphql-api/webhooks-v2), which supports multiple events and granular event subscriptions. ## Events supported The webhooks support the following events: * Transcription complete: Triggers when a meeting has been processed and the transcript is ready for viewing > [!NOTE] > > Fireflies sends webhook notifications as POST requests to your specified endpoint. Each request > contains a JSON payload with information about the event that occurred. ## Saving a webhook A V1 webhook URL sends notifications for all subscribed events, and is only fired for meetings that you own. New V1 webhooks can no longer be saved. To create a webhook, use the [Webhooks V2 page](https://app.fireflies.ai/integrations/api/webhook) - see [Webhooks V2](/graphql-api/webhooks-v2). If you already have a V1 webhook, you can review it in **Settings → Developer settings → Webhook → View Configuration**, where you can also disable it before recreating it in V2. You may test an existing webhook using the upload audio API or by uploading through the dashboard at [app.fireflies.ai/upload](https://app.fireflies.ai/upload) ## Upload audio webhook You can also include a webhook URL as part of an upload audio request. This is different from the saved webhook as it will only send notifications for that singular audio upload request. ```bash curl theme={null} curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_api_key" \ -d '{ "query": "mutation($input: AudioUploadInput) { uploadAudio(input: $input) { success title message } }", "variables": { "input": { "url": "https://url_to_the_audio_file", "title": "title of the file", "webhook": "https://url_for_the_webhook" } } }' \ https://api.fireflies.ai/graphql ``` ```javascript javascript theme={null} const axios = require('axios'); const url = 'https://api.fireflies.ai/graphql'; const headers = { 'Content-Type': 'application/json', Authorization: 'Bearer your_api_key' }; const input = { url: 'https://url_to_the_audio_file', title: 'title of the file', webhook: 'https://url_for_the_webhook' }; const data = { query: ` mutation($input: AudioUploadInput) { uploadAudio(input: $input) { success title message } } `, variables: { input } }; axios .post(url, data, { headers: headers }) .then(result => { console.log(result.data); }) .catch(e => { console.log(JSON.stringify(e)); }); ``` ```python python theme={null} import requests url = 'https://api.fireflies.ai/graphql' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_api_key' } input_data = { "url": "https://url_for_audio_file", "title": "title of the file", "webhook": "https://url_for_the_webhook" } data = { 'query': ''' mutation($input: AudioUploadInput) { uploadAudio(input: $input) { success title message } } ''', 'variables': {'input': input_data} } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print(response.json()) else: print(response.text) ``` ```java java theme={null} import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; import java.net.http.HttpResponse.BodyHandlers; public class ApiRequest { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); String json = "{" + "\"query\":\"mutation($input: AudioUploadInput) { uploadAudio(input: $input) { success title message } }\"," + "\"variables\":{" + "\"input\": {" + "\"url\":\"https://url_for_audio_file.com\"," + "\"title\":\"title of the file\"," + "\"webhook\":\"https://url_for_the_webhook\"" + "}" + "}" + "}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.fireflies.ai/graphql")) .header("Content-Type", "application/json") .header("Authorization", "Bearer your_api_key") .POST(BodyPublishers.ofString(json)) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); } } ``` ## Webhook Authentication Webhook authentication ensures that incoming webhook requests are securely verified before processing. This allows consumers to trust that webhook events originate from a secure and verified source. ### How It Works Each webhook request sent from the server includes an `x-hub-signature` header containing a SHA-256 HMAC signature of the request payload. This signature is generated using a secret key known only to the server and your application. When the consumer receives a webhook, they can use the signature provided in the `x-hub-signature` header to verify that the request has not been tampered with. This is done by computing their own HMAC signature using the shared secret key and comparing it to the signature included in the header. ### Saving a secret The secret key of an existing V1 webhook can be viewed in **Settings → Developer Settings → Webhook → View Configuration**, but it can no longer be changed there. Set a **Signing Secret** on the [Webhooks V2 page](https://app.fireflies.ai/integrations/api/webhook) instead. Store the secret key securely, as it is used to authenticate incoming webhook requests. ### Verifying the Signature 1. **Receive the Webhook**: * Each request will include the payload and an `x-hub-signature` header 2. **Verify the Signature**: * Compute the HMAC SHA-256 signature using the payload and the shared secret key * Compare the computed signature to the `x-hub-signature` header value * If they match, the request is verified as authentic. If they do not match, treat the request with caution or reject it By verifying webhook signatures, consumers can ensure that webhook events received are secure and have not been altered during transmission ### See it in action To see webhook authentication in action, you can view an example at [Fireflies.ai Verifying Webhook Requests](https://replit.com/@firefliesai/Firefliesai-Verifying-webhook-requests#index.js). This example demonstrates how to receive a webhook, compute the HMAC SHA-256 signature, and verify it against the `x-hub-signature` header to ensure the request's authenticity. ## Webhook Schema **meetingId** `String` *required* Identifier for the meeting / transcript that the webhook has triggered for. MeetingId and TranscriptId are used interchangeably for the Fireflies.ai Platform. **eventType** `String` Name of the event type that has been fired against the webhook **clientReferenceId** `ID` Custom identifier set by the user during upload. You may use this to identify your uploads in your events. ## Example Payload ```json theme={null} { "meetingId": "ASxwZxCstx", "eventType": "Transcription completed", "clientReferenceId": "be582c46-4ac9-4565-9ba6-6ab4264496a8" } ``` ## FAQ > [accordion] Why am I not receiving webhook requests > > There may be multiple reasons why you are not receiving webhook requests. Please go through the following checklist: > > > > Team-wide webhooks are only supported for the Enterprise tier with the Super Admin role. This allows you to setup one webhook for all meetings owned by your team. Details [here](/fundamentals/super-admin). ## Additional Resources > [card] [Webhooks V2](/graphql-api/webhooks-v2) > > The current webhook system - events, retries and signatures > [card] [Super Admin](/fundamentals/super-admin) > > Fireflies Super Admin with advanced capabilities > [card] [Upload Audio](/graphql-api/mutation/upload-audio) > > Use the API to upload audio to Fireflies.ai # Webhooks V2 Source: https://docs.fireflies.ai/graphql-api/webhooks-v2 Configure event-driven webhooks with granular event subscriptions using Webhooks V2 ## Overview Webhooks V2 provides an improved webhook system with granular event subscriptions and enhanced security. You can subscribe to specific meeting lifecycle events and receive real-time notifications at your configured endpoint. > [!NOTE] > > Webhooks V2 replaces the legacy webhook system. [Webhooks V1](/graphql-api/webhooks) is deprecated and its Developer settings field is read-only, so all new webhooks - including [team-wide Super Admin webhooks](/fundamentals/super-admin) - are created here. ## Events Supported Webhooks V2 supports the following events: | Event Name | Description | | - | - | | `meeting.transcribed` | Triggers when a meeting has been transcribed and the transcript is ready | | `meeting.summarized` | Triggers when a meeting summary has been generated | | `meeting.bot_joined` | Triggers when the Fred bot joins a meeting | > [!NOTE] > > You can subscribe to one or more events per webhook. Only events you subscribe to will be delivered. The **Event Subscriptions** list on the setup page is the source of truth for which events are currently available. ## Setting Up Webhooks V2 **Step 1** Visit the [Webhooks V2 configuration page](https://app.fireflies.ai/integrations/api/webhook) **Step 2** Enter a valid HTTPS URL that accepts POST requests in the **Webhook URL** field **Step 3** Optionally, enter a **Signing Secret** for payload signature verification **Step 4** Under **Event Subscriptions**, select the events you want to subscribe to **Step 5** Optionally, turn on **Resend when a meeting's notes change** to receive `meeting.transcribed` and `meeting.summarized` again when a meeting's transcript or summary changes - see [Resends After a Meeting Changes](#resends-after-a-meeting-changes) **Step 6** Save your configuration **Step 7** Click **Send Test Event** to confirm your endpoint is reachable and validating payloads correctly > [!NOTE] > > Webhooks are delivered for meetings you own. If you are a Super Admin on an Enterprise team, events for all meetings owned by your team are also escalated to your webhook - see [Super Admin](/fundamentals/super-admin). ## Webhook Payload Each webhook notification is sent as a `POST` request with a JSON payload containing the following fields: **event** `String` *required* The event type that triggered the webhook (e.g., `meeting.transcribed`, `meeting.summarized`, `meeting.bot_joined`) **timestamp** `Number` *required* Unix timestamp in milliseconds of when this delivery was sent. Each retry carries a new value, so use `reprocessed_at` rather than `timestamp` to order changes to a meeting. **meeting\_id** `String` *required* Identifier for the meeting that the event relates to. This is the same as the transcript ID used throughout the Fireflies API. **client\_reference\_id** `String` Custom identifier set by you during upload. Use this to correlate webhook events with your uploads. **reprocessed\_at** `Number` Only present when the event is resent because the meeting's transcript or summary changed. Unix timestamp in milliseconds of that change. It stays the same across retries of the resend, and every later change to the meeting has a later value. Omitted on the first delivery of an event. ### Example Payloads **Meeting Transcribed** ```json theme={null} { "event": "meeting.transcribed", "timestamp": 1710876543210, "meeting_id": "ASxwZxCstx", "client_reference_id": "be582c46-4ac9-4565-9ba6-6ab4264496a8" } ``` **Meeting Summarized** ```json theme={null} { "event": "meeting.summarized", "timestamp": 1710876789456, "meeting_id": "ASxwZxCstx" } ``` **Meeting Bot Joined** ```json theme={null} { "event": "meeting.bot_joined", "timestamp": 1781258655914, "meeting_id": "01KTXMH9V8RPY1B4DTYKB27WYR" } ``` **Meeting Summarized (resend)** `reprocessed_at` is only sent on a resend, when the **Resend when a meeting's notes change** setting is on and an already-delivered meeting's summary changes. First deliveries never include it. See [Resends After a Meeting Changes](#resends-after-a-meeting-changes). ```json theme={null} { "event": "meeting.summarized", "timestamp": 1791465988113, "meeting_id": "01M48P0J698KJ3J0P0Q3686J31", "reprocessed_at": 1791465987256 } ``` ## Resends After a Meeting Changes By default, each event is sent once per meeting. A meeting's transcript or summary can change after it was delivered, for example when the meeting is reprocessed, its language is changed, its notes are regenerated or a refined summary is applied. To keep your copy up to date, turn on **Resend when a meeting's notes change** on the [Webhooks V2 setup page](https://app.fireflies.ai/integrations/api/webhook). With the setting on, Fireflies sends `meeting.transcribed` again when an already-delivered meeting gets a new transcript, and `meeting.summarized` again when it gets a new summary, for the events you subscribe to. Resends carry `reprocessed_at`; first deliveries do not. To handle resends: * Store the `reprocessed_at` of the last version you processed for each meeting and event * When a payload has a `reprocessed_at` newer than the stored value, fetch the meeting again and replace your copy * Ignore a payload whose `reprocessed_at` equals or is older than the stored value: it is a retry or an out-of-order delivery of a change you already have ## Webhook Authentication Webhooks V2 uses HMAC-SHA256 signatures to verify that webhook payloads originate from Fireflies and have not been tampered with in transit. ### How It Works Each webhook request includes an `X-Hub-Signature` header containing a SHA-256 HMAC signature of the request body. The signature is computed using the signing secret you configured during setup. The signature format is: ``` sha256= ``` ### Verifying the Signature **Step 1** Extract the `X-Hub-Signature` header from the incoming request **Step 2** Compute the HMAC-SHA256 digest of the raw request body using your signing secret **Step 3** Prefix the hex-encoded digest with `sha256=` **Step 4** Compare the computed signature with the header value using a timing-safe comparison ### Verification Examples ```javascript node.js theme={null} const crypto = require('crypto'); function verifyWebhookSignature(payload, signature, secret) { const expectedSignature = 'sha256=' + crypto.createHmac('sha256', secret).update(payload, 'utf8').digest('hex'); const sigBuffer = Buffer.from(signature); const expectedBuffer = Buffer.from(expectedSignature); if (sigBuffer.length !== expectedBuffer.length) { return false; } return crypto.timingSafeEqual(sigBuffer, expectedBuffer); } // Express.js example app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => { const signature = req.headers['x-hub-signature']; const payload = req.body.toString(); if (!verifyWebhookSignature(payload, signature, 'your_signing_secret')) { return res.status(401).send('Invalid signature'); } const event = JSON.parse(payload); console.log('Received event:', event.event, 'for meeting:', event.meeting_id); res.status(200).send('OK'); }); ``` ```python python theme={null} import hmac import hashlib from flask import Flask, request app = Flask(__name__) def verify_webhook_signature(payload, signature, secret): expected = 'sha256=' + hmac.new( secret.encode('utf-8'), payload, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature) @app.route('/webhook', methods=['POST']) def webhook(): signature = request.headers.get('X-Hub-Signature', '') payload = request.get_data() if not verify_webhook_signature(payload, signature, 'your_signing_secret'): return 'Invalid signature', 401 event = request.get_json() print(f"Received event: {event['event']} for meeting: {event['meeting_id']}") return 'OK', 200 ``` ```java java theme={null} import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.security.MessageDigest; public class WebhookVerifier { public static boolean verifySignature(String payload, String signature, String secret) throws Exception { Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256")); byte[] hash = mac.doFinal(payload.getBytes("UTF-8")); StringBuilder hex = new StringBuilder(); for (byte b : hash) { hex.append(String.format("%02x", b)); } String expected = "sha256=" + hex.toString(); return MessageDigest.isEqual( expected.getBytes("UTF-8"), signature.getBytes("UTF-8") ); } } ``` ## Request Headers Each webhook delivery includes the following headers: | Header | Description | | - | - | | `Content-Type` | `application/json` | | `User-Agent` | Identifies the Fireflies webhook sender, e.g. `Fireflies-Webhook/2.0` | | `X-Hub-Signature` | HMAC-SHA256 signature (only if a signing secret is configured) | ## Delivery Behavior * Webhooks are sent as `POST` requests to your configured URL. The URL must use HTTPS and resolve to a public host; redirects are not followed * Your endpoint must respond with a `2xx` status code within **30 seconds** of the request starting to be considered successful; the TCP connection itself must be established within 10 seconds * Failed deliveries are retried up to 5 times with a growing backoff - 30 seconds, 2 minutes, 10 minutes, 30 minutes and 2 hours - so a transient outage of up to \~3 hours is recovered automatically * Retries apply to transient failures: failures to connect (connect timeouts, DNS failures, refused or reset connections), unclassified network errors, `429` responses and `5xx` responses. Other `4xx` responses, TLS/certificate errors and invalid URLs are treated as permanent failures and are not retried * If the connection succeeds but your server does not respond within 30 seconds, the delivery is marked failed and **not** retried: your server most likely received the request, so a retry would duplicate it ## Migrating from Webhooks V1 If you are using the legacy webhooks system, here is a summary of the key differences: | Feature | Webhooks V1 | Webhooks V2 | | - | - | - | | Configuration | Developer Settings page (read-only, no new webhooks) | [Dedicated setup page](https://app.fireflies.ai/integrations/api/webhook) | | Events | Single event (`Transcription completed`) | Multiple events (`meeting.transcribed`, `meeting.summarized`, `meeting.bot_joined`) | | Event selection | All events | Granular event subscriptions | | Payload format | `meetingId`, `eventType` | `meeting_id`, `event`, `timestamp` | | Signature header | `X-Hub-Signature` | `X-Hub-Signature` | | Signature format | `sha256=` | `sha256=` | ### Migration Steps **Step 1** Go to the [Webhooks V2 setup page](https://app.fireflies.ai/integrations/api/webhook) **Step 2** Enter your existing webhook URL **Step 3** If you used a signing secret, enter it in the **Signing Secret** field **Step 4** Select the events you want to subscribe to (choose `meeting.transcribed` for equivalent V1 behavior) **Step 5** Save and update your webhook consumer to handle the new payload format and signature header ## FAQ > [accordion] What is the difference between meeting.transcribed and meeting.summarized? > > `meeting.transcribed` fires when the raw transcript is ready and available for viewing. `meeting.summarized` fires after the AI-generated summary (including action items, notes, and other insights) has been processed. > [accordion] What is meeting.bot\_joined used for? > > `meeting.bot_joined` fires when the Fred bot successfully joins a meeting. This is useful for triggering real-time workflows as soon as the bot is in the call. > [accordion] Will I receive the same event more than once for a meeting? > > Only if you turn on **Resend when a meeting's notes change**. Fireflies then sends `meeting.transcribed` and `meeting.summarized` again when a meeting's transcript or summary changes, with a `reprocessed_at` field. See [Resends After a Meeting Changes](#resends-after-a-meeting-changes). A failed delivery can also be retried; see [Delivery Behavior](#delivery-behavior). > [accordion] Can I subscribe to multiple events? > > Yes. You can select one or more events during setup. Only events you subscribe to will trigger webhook deliveries. > [accordion] Why am I not receiving webhook notifications? > >
    >
  • Webhooks are only fired for meetings you own (i.e., you are the `organizer_email`).
  • >
  • Ensure your endpoint accepts POST requests and responds with a 2xx status code within 30 seconds.
  • >
  • Verify that you have subscribed to the correct events.
  • >
  • If using signature verification, ensure your signing secret matches what is configured.
  • >
> > Team-wide webhooks are only supported for the Enterprise tier with the Super Admin role. This allows you to setup one webhook for all meetings owned by your team. Details [here](/fundamentals/super-admin). > [accordion] Do I need to migrate from Webhooks V1? > > Existing V1 webhooks continue to be delivered, but V1 is deprecated and new V1 webhooks can no longer be saved. Migrate when convenient to get granular event subscriptions and the current payload format. > [accordion] What about the webhook URL passed to uploadAudio? > > The optional `webhook` field on the [uploadAudio](/graphql-api/mutation/upload-audio) mutation still works and still delivers the legacy V1 payload shape (`meetingId`, `eventType`) for that single upload. It is independent of your saved V2 webhook. ## Additional Resources > [card] [Webhooks V1](/graphql-api/webhooks) > > Legacy webhook documentation > [card] [Upload Audio](/graphql-api/mutation/upload-audio) > > Use the API to upload audio to Fireflies.ai # Zapier Source: https://docs.fireflies.ai/integrations/zapier Set up webhooks with Zapier to automatically fetch transcripts ## Overview Connect Fireflies [webhooks](/graphql-api/webhooks-v2) to Zapier to automatically fetch transcripts when meetings are processed. This guide creates a two-step Zap: 1. **Trigger** — receive a webhook notification when a meeting is transcribed 2. **Action** — use the `meeting_id` from the webhook to fetch the transcript via the [GraphQL API](/graphql-api/query/transcript) ## Prerequisites * A Fireflies.ai account with [webhook access](/graphql-api/webhooks-v2) * A [Zapier](https://zapier.com) **paid plan** (Professional or above — Webhooks by Zapier is not available on the free tier) * Your Fireflies [API key](https://app.fireflies.ai/settings) ## Step 1: Create the Zapier webhook trigger **1. Create a new Zap** Log in to [Zapier](https://zapier.com) and click **Create**. **2. Select trigger** Search for **Webhooks by Zapier** → choose **Catch Hook**. **3. Skip Configure** Leave the **Pick off a Child Key** field blank and click **Continue**. **4. Copy the webhook URL** On the **Test** tab, copy the generated URL (e.g. `https://hooks.zapier.com/hooks/catch/123456/abcdef/`). You'll paste this into Fireflies next. ## Step 2: Add the webhook URL in Fireflies **1. Open the webhooks page** Go to the [webhooks configuration page](https://app.fireflies.ai/integrations/api/webhook). **2. Configure the webhook** Fill in: * **Webhook URL** — paste the Zapier URL from Step 1 * **Event Subscriptions** — select `meeting.transcribed` **3. Save** Save the configuration. > [!NOTE] > > If you are still on the deprecated [Webhooks V1](/graphql-api/webhooks) webhook saved in Developer settings, the payload uses `meetingId` and `eventType` instead of the fields shown below. ## Step 3: Test the connection **1. Listen for a test event** In Zapier, click **Test trigger**. Then click **Send Test Event** in Fireflies, or [upload a short audio file](https://app.fireflies.ai/upload) to generate a real webhook event. **2. Verify the payload** Zapier should receive a payload like: ```json theme={null} { "event": "meeting.transcribed", "timestamp": 1710876543210, "meeting_id": "ASxwZxCstx" } ``` The `meeting_id` is the transcript ID you'll use next. > [!NOTE] > > **Send Test Event** delivers a placeholder payload (`"event": "test"`, `"meeting_id": "test_00000000"`) - use it to confirm Zapier receives the request, and upload a file to see a real `meeting.transcribed` payload. ## Step 4: Fetch the transcript Add a second step to your Zap that calls the Fireflies GraphQL API with the `meeting_id`. **1. Add action** Click **+** → search **Webhooks by Zapier** → select **Custom Request**. **2. Configure the request** * **Method**: `POST` * **URL**: `https://api.fireflies.ai/graphql` * **Headers**: | Key | Value | | - | - | | Content-Type | application/json | | Authorization | Bearer YOUR\_API\_KEY | **3. Set the request body** In the **Data** field, enter: ```json theme={null} { "query": "query Transcript($transcriptId: String!) { transcript(id: $transcriptId) { id title date organizer_email participants transcript_url duration summary { overview action_items shorthand_bullet short_summary } sentences { speaker_name text start_time end_time } } }", "variables": { "transcriptId": "{{meeting_id}}" } } ``` > [!NOTE] > > Do **not** type `{{meeting_id}}` literally. Use Zapier's **Insert Data** picker to select **Meeting Id** from the trigger step — the field should show a data pill, not raw text. **4. Test** Click **Test step**. You should see the transcript data in the response. ## Step 5: Extend your Zap With transcript data flowing into Zapier, add more steps to automate your workflow: * **Slack** — post meeting summaries to a channel * **Google Sheets** — log meeting details in a spreadsheet * **Asana / Jira / Trello** — create tasks from action items * **Email** — send recaps to attendees * **Salesforce / HubSpot** — push notes to your CRM ## Customizing the query Modify the GraphQL query in Step 4 to fetch only the fields you need. See the [Transcript schema](/schema/transcript) for all available fields. Example with speaker analytics and AI filters: ```graphql theme={null} query Transcript($transcriptId: String!) { transcript(id: $transcriptId) { id title summary { overview action_items } analytics { speakers { name duration words_per_minute } } sentences { speaker_name text ai_filters { task question sentiment } } } } ``` ## Troubleshooting > [accordion] Zapier is not receiving events > > * Check the webhook URL is saved on the [webhooks page](https://app.fireflies.ai/integrations/api/webhook) > * Ensure `meeting.transcribed` is selected under **Event Subscriptions** > * The URL must start with `https://` > * Use **Send Test Event**, or upload a test file at [app.fireflies.ai/upload](https://app.fireflies.ai/upload) > [accordion] Transcript query returns null > > * Verify you're using the correct `meeting_id` from the webhook > * Check your API key hasn't expired > [accordion] Authorization error > > * Ensure the header is `Bearer YOUR_API_KEY` (with a space after `Bearer`) > * The API key must belong to the account that owns the webhook ## Resources > [card] [Webhooks V2](/graphql-api/webhooks-v2) > > Webhook events and authentication > [card] [Transcript query](/graphql-api/query/transcript) > > Full query reference > [card] [Transcript schema](/schema/transcript) > > All available fields # MCP Tools Source: https://docs.fireflies.ai/mcp-tools/overview Complete reference for all available tools in the Fireflies MCP Server ## Overview The Fireflies MCP (Model Context Protocol) Server provides tools for searching, retrieving, and managing meeting transcripts, summaries, soundbites, channels, and user data. Tools operate within your authenticated Fireflies account — some are read-only while others allow you to take actions like sharing meetings or creating soundbites. For setup and configuration instructions, see [MCP Server Configuration](/getting-started/mcp-configuration). ## Available Tools ### Meeting & Transcript Tools > [!NOTE] > > `fireflies_search` and `fireflies_fetch` are experimental tools that may not be available to all users. They are being progressively rolled out and may require feature flag enablement. **fireflies\_search** `Tool` **Description:** Advanced search for meeting transcripts using mini grammar syntax. *(Experimental)* **Parameters:** * `query` (string, required) - Search query with grammar syntax * `format` (string) - Response format: "toon" (default), "json", or "text" **Query Grammar:** * `keyword:"term"` - Search keywords * `scope:title|sentences|all` - Search scope * `from:YYYY-MM-DD` - Filter from date * `to:YYYY-MM-DD` - Filter to date * `limit:N` - Max results (50) * `skip:N` - Pagination offset * `organizers:email1,email2` - Filter by organizers * `participants:email1,email2` - Filter by participants * `mine:true|false` - User's meetings only * `channel:CHANNEL_ID` - Filter by channel/folder ID (find IDs with `fireflies_list_channels`) **Example:** ```json theme={null} { "query": "keyword:\"performance\" scope:sentences from:2024-12-01 limit:20" } ``` **fireflies\_get\_transcripts** `Tool` **Description:** Query multiple meetings with structured filters. Returns metadata and summaries. **Parameters:** * `keyword` (string) - Search term (max 255 chars) * `scope` (enum) - "title", "sentences", or "all" * `fromDate` (string) - ISO date (YYYY-MM-DD) * `toDate` (string) - ISO date (YYYY-MM-DD) * `limit` (number) - Max results (max 50) * `skip` (number) - Pagination offset * `organizers` (array) - Organizer emails * `participants` (array) - Participant emails * `mine` (boolean) - Only user's meetings * `channelId` (string) - Only meetings in this channel/folder (find IDs with `fireflies_list_channels`) * `format` (string) - "toon" (default), "json", or "text" **Example:** ```json theme={null} { "keyword": "product roadmap", "fromDate": "2024-12-01", "limit": 20 } ``` **Returns:** Meeting IDs, titles, dates, participants, summaries (excludes detailed transcript content). **fireflies\_get\_transcript** `Tool` **Description:** Fetch detailed transcript by ID with sentences, speakers, and timestamps. Excludes summary data. If the meeting is currently live (`is_live: true`), returns a point-in-time snapshot of the live transcript with sentences captured so far. **Parameters:** * `transcriptId` (string, required) - Meeting ID **Example:** ```json theme={null} { "transcriptId": "meeting-id-12345" } ``` **Returns:** Sentences with speaker attribution and metadata. Each sentence is prefixed with a `[start - end]` timestamp range (e.g. `[00:05 - 00:08] Speaker: text`, switching to `h:mm:ss` past an hour) so moments can be anchored back to the recording. **fireflies\_fetch** `Tool` **Description:** Retrieve complete meeting data including transcript, summary, and metadata. *(Experimental)* **Parameters:** * `id` (string, required) - Meeting ID **Example:** ```json theme={null} { "id": "meeting-id-12345" } ``` **Returns:** Complete meeting data with transcript content, summary, analytics, and metadata. **fireflies\_get\_summary** `Tool` **Description:** Fetch meeting summary by ID with action items, keywords, and overview. Excludes transcript content. **Parameters:** * `transcriptId` (string, required) - Meeting ID **Example:** ```json theme={null} { "transcriptId": "meeting-id-12345" } ``` **Returns:** Keywords, action items, overview, topics discussed, meeting type, and outline. **fireflies\_get\_active\_meetings** `Tool` **Description:** Retrieves a list of currently active (in-progress) meetings. Returns meeting details including ID, title, organizer, meeting link, start/end time, privacy, and state. Admins can query active meetings for any user; regular users can only query their own. **Parameters:** * `email` (string, optional) - Email address to filter active meetings by a specific user. Admins can query any team member; regular users can only use their own email or omit this field. * `states` (array, optional) - Array of meeting states to filter by. Possible values: `"active"` (currently in progress), `"paused"` (meeting has been paused). If omitted, returns meetings in both states. **Example:** ```json theme={null} { "email": "user@example.com", "states": ["active"] } ``` **Returns:** List of active meetings with ID, title, organizer, meeting link, start time, privacy, and state. **fireflies\_get\_analytics** `Tool` **Description:** Retrieves team and per-user meeting and conversation analytics. Returns meeting counts, durations, conversation metrics (filler words, questions, monologues, sentiment, talk-listen ratio, words per minute), and comparison data against previous periods. Team-level analytics require admin privileges. **Parameters:** * `startTime` (string, optional) - Start date/time filter in ISO 8601 format (e.g. `"2024-01-01T00:00:00.000Z"`). Limits analytics to meetings after this time. * `endTime` (string, optional) - End date/time filter in ISO 8601 format (e.g. `"2024-12-31T23:59:59.999Z"`). Limits analytics to meetings before this time. **Example:** ```json theme={null} { "startTime": "2024-01-01T00:00:00.000Z", "endTime": "2024-12-31T23:59:59.999Z" } ``` **Returns:** Team and per-user meeting counts, durations, and conversation metrics with period-over-period comparisons. ### Meeting Management Tools **fireflies\_share\_meeting** `Tool` **Description:** Shares a meeting transcript with specified email addresses. The authenticated user must be the owner of the meeting or a team admin. Up to 100 emails can be provided. Optionally set an expiry period for the shared access. **Parameters:** * `meetingId` (string, required) - The meeting ID / transcript ID to share * `emails` (array, required) - Array of email addresses to share the meeting with (max 100) * `expiryDays` (number, optional) - Expiry period in days for the shared access. Must be one of: `7`, `14`, `30` **Example:** ```json theme={null} { "meetingId": "meeting-id-12345", "emails": ["user1@example.com", "user2@example.com"], "expiryDays": 14 } ``` **Returns:** Confirmation of the sharing operation. **fireflies\_revoke\_meeting\_access** `Tool` **Description:** Revokes a previously shared meeting access for a specific email address. The authenticated user must be the owner of the meeting or a team admin. **Parameters:** * `meetingId` (string, required) - The meeting ID / transcript ID to revoke access from * `email` (string, required) - The email address to revoke access for **Example:** ```json theme={null} { "meetingId": "meeting-id-12345", "email": "user@example.com" } ``` **Returns:** Confirmation of the access revocation. **fireflies\_update\_meeting\_title** `Tool` **Description:** Updates the title of a meeting transcript. The authenticated user must be the owner of the meeting or a team admin. The title must be between 5 and 256 characters. **Parameters:** * `meetingId` (string, required) - The meeting ID / transcript ID to update * `title` (string, required) - The new title for the meeting (5-256 characters) **Example:** ```json theme={null} { "meetingId": "meeting-id-12345", "title": "Q1 Product Roadmap Review" } ``` **Returns:** Confirmation of the title update. **fireflies\_move\_meeting** `Tool` **Description:** Moves one or more meeting transcripts to a specified channel/folder. The authenticated user must be the owner of the meetings or a team admin. Up to 5 meeting IDs can be provided. **Parameters:** * `meetingIds` (array, required) - Array of meeting IDs / transcript IDs to move (max 5) * `channelId` (string, required) - The target channel/folder ID to move the meetings to **Example:** ```json theme={null} { "meetingIds": ["meeting-id-1", "meeting-id-2"], "channelId": "channel-id-12345" } ``` **Returns:** Confirmation of the move operation. ### Channel Tools **fireflies\_list\_channels** `Tool` **Description:** Lists all channels/folders available to the authenticated user. Returns channel details including ID, title, privacy setting, and members. **Parameters:** None **Example:** ```json theme={null} {} ``` **Returns:** List of channels with ID, title, privacy setting, and member details. **fireflies\_get\_channel** `Tool` **Description:** Retrieves details of a specific channel/folder by its ID. Returns channel title, privacy setting, and member list. **Parameters:** * `channelId` (string, required) - The ID of the channel to retrieve **Example:** ```json theme={null} { "channelId": "channel-id-12345" } ``` **Returns:** Channel title, privacy setting, and member list. ### Soundbite Tools **fireflies\_get\_soundbites** `Tool` **Description:** Fetches soundbites (short shareable audio/transcript clips from meetings). Can filter by transcript, ownership, or team. At least one of `mine`, `transcript_id`, or `my_team` must be provided. **Parameters:** * `transcript_id` (string, optional) - Transcript/meeting ID to get soundbites for a specific meeting * `mine` (boolean, optional) - Filter to only include soundbites owned by the authenticated user * `my_team` (boolean, optional) - Filter to include soundbites from the authenticated user's team * `limit` (number, optional) - Limit for the number of soundbites to return (max 50) * `skip` (number, optional) - Number of soundbites to skip for pagination * `format` (string) - "toon" (default), "json", or "text" **Example:** ```json theme={null} { "mine": true, "limit": 10 } ``` **Returns:** List of soundbites with IDs, names, start/end times, summaries, and associated meeting details. **fireflies\_create\_soundbite** `Tool` **Description:** Creates a soundbite (clip) from a meeting transcript. A soundbite is a short audio/video segment extracted from a meeting. The authenticated user must have write access to the meeting. **Parameters:** * `transcriptId` (string, required) - The transcript ID / meeting ID to create the soundbite from * `startTime` (number, required) - Start time of the soundbite in seconds (must be >= 0) * `endTime` (number, required) - End time of the soundbite in seconds (must be > 0 and > startTime) * `name` (string, optional) - Name/title for the soundbite (max 256 characters) * `mediaType` (string, optional) - Media type (e.g. "audio", "video") * `privacies` (array, optional) - Privacy settings. Values: `"public"`, `"team"`, `"participants"` * `summary` (string, optional) - Summary text for the soundbite (max 500 characters) **Example:** ```json theme={null} { "transcriptId": "meeting-id-12345", "startTime": 120, "endTime": 180, "name": "Key product decision" } ``` **Returns:** Created soundbite details including ID and share URL. ### File Upload Tools > [!NOTE] > > `fireflies_create_upload_url` and `fireflies_confirm_upload` require a paid plan and the `meetings.upload` scope, and are not listed when your organization has disabled file uploads. They upload a file the MCP client can read on your computer, so use them from a client that can run commands, such as Claude Code, Cursor, VS Code or Codex; the file content never passes through the MCP server. They are not listed in chat clients that cannot read your files: Claude's connector on claude.ai and in the Claude apps, and ChatGPT. **fireflies\_create\_upload\_url** `Tool` **Description:** Step 1 of uploading a local audio or video file for transcription. Creates an empty meeting and returns a pre-signed `upload_url` valid for 1 hour with the form fields it was signed with, plus a `curl` command for a POSIX shell (bash, zsh or Git Bash) that reads the file path from the shell variable `FILE`. In PowerShell or another shell, the agent sends the same form from the returned fields with any HTTP client. The tool always asks [createUploadUrl](/graphql-api/mutation/create-upload-url) for the size-limited form POST (`upload_method: POST`), never the `PUT` URL the mutation returns by default. **Parameters:** * `contentType` (enum, required) - MIME type of the file, e.g. `audio/mpeg`, `audio/x-m4a`, `audio/wav`, `video/mp4`, `video/quicktime`. See [supported content types](/graphql-api/mutation/create-upload-url#supported-content-types) * `fileSize` (integer, required) - Exact file size in bytes (audio up to 400 MB, video up to 2 GB) * `title` (string, optional) - Meeting title (max 256 characters) * `customLanguage` (string, optional) - Language code, e.g. `es` (max 5 characters) * `meetingDate` (string, optional) - When the recording took place, RFC 3339 (`YYYY-MM-DD` or `YYYY-MM-DDTHH:MM:SSZ`/`±HH:MM`); not in the future **Example:** ```json theme={null} { "contentType": "audio/mpeg", "fileSize": 19252182, "title": "Customer interview" } ``` **Returns:** `meeting_id`, `upload_url`, `expires_at`, and `upload` (`method: "POST"`, `fields`, the signed form fields as a name-to-value map, and a `curl` command that sends them; set `FILE` to the file's path, quoted for your shell, before running it). Upload the file with an HTTP multipart form `POST` to `upload_url`: every `fields` entry as a form field, unchanged, then the file last, as the field named `file`. Storage refuses a file over the size limit (400 MB for audio, 2 GB for video). Then call `fireflies_confirm_upload`. Each user can create at most 50 upload URLs per day (UTC). After that the tool answers with a rate-limit error and the time to retry. **fireflies\_confirm\_upload** `Tool` **Description:** Step 3 of the upload: verifies the file arrived in storage and starts transcription. Only the user who created the upload URL can confirm it. **Parameters:** * `meetingId` (string, required) - The `meeting_id` returned by `fireflies_create_upload_url` **Example:** ```json theme={null} { "meetingId": "meeting-id-12345" } ``` **Returns:** `success`, `meeting_id`, a status message and `url`, the link to the meeting in Fireflies, which opens right away. Transcription takes a few minutes; the transcript then appears at that link and through `fireflies_get_transcript`. Each upload is processed once: until the upload URL expires (1 hour after `fireflies_create_upload_url`), a second confirm for the same `meetingId` answers that it was already confirmed, with the meeting link. If a confirm fails saying processing may already have started, check that link before uploading the file again. ### Send-to Tools (Transcript Import) > [!NOTE] > > These tools require a paid plan and the `meetings.upload` scope. They are not listed for a free plan or when your organization has disabled file uploads. They make Fireflies a "Send to" destination: an assistant that holds a meeting transcript as text (for example Claude Meetings) copies it into a new Fireflies meeting. Only text is imported, with no audio, video or chat. It is a one-time copy and nothing syncs afterwards. **Transcript format** (one utterance per line, in order): `[HH:MM:SS] Speaker Name: what they said`. The time is elapsed from the start of the meeting and kept as written: `[00:10:00]` is ten minutes in. A time with two parts is minutes and seconds (`[10:03]` is 10 minutes 3 seconds in), so always include the hours. Clock times also work when they carry AM/PM (`[02:15:07 PM]`) or match the clock time of `startTime` as written, so give `startTime` in the meeting's local offset (`2026-11-05T09:30:00-08:00`, not the same instant as `17:30:00Z`). They are converted to elapsed time, including across midnight. A transcript may span at most **24 hours**; a longer one is refused when it is submitted. Generic labels such as `Speaker 2` or `Room` are kept as speaker names. A line without a leading time continues the previous speaker. Each call takes at most **50,000 characters**. A longer transcript goes in up to 40 numbered parts, each cut at a line break. Sending a part number again **replaces** that part, so a retry never duplicates text. **fireflies\_create\_meeting\_from\_transcript** `Tool` **Description:** Creates a new meeting from a text transcript and returns its link. **Parameters:** * `title` (string, required) - Meeting title (max 256 characters) * `startTime` (string, required) - ISO 8601 with the offset of the time zone the meeting took place in, e.g. `2026-11-05T09:30:00-08:00`; not in the future. A date without a time of day is refused. * `transcript` (string, required) - Part 1 of the transcript, in the format above * `complete` (boolean, required) - `true` if this is the whole transcript, `false` if more parts follow Each user can create at most 50 meetings this way per day (UTC). After that the tool answers with a rate-limit error and the time to retry. Parts and `complete: true` for a meeting already created are not counted. **Returns:** `meeting_id`, `url`, `status` (`receiving`, `submitting` or `submitted`), and the parts received so far. Once submitted, the url opens right away, and the transcript appears there within a few minutes. If the meeting was created but the transcript could not be submitted, the call still returns its `meeting_id`, with a message saying how to retry. **fireflies\_add\_transcript\_part** `Tool` **Description:** Adds or replaces a numbered part of the transcript. Set `complete: true` on the last part to build the transcript. After that, the meeting cannot change. **Parameters:** * `meetingId` (string, required) - From `fireflies_create_meeting_from_transcript` * `partNumber` (integer, required) - 2, 3, … in transcript order (max 40); part 1 is the text sent at creation * `text` (string, optional) - The part, in the format above. Omit it, with `complete: true`, to only submit the parts already sent. * `complete` (boolean, required) - `true` on the last part If `complete: true` answers `submitting` or a temporary error, send `complete: true` again in a couple of minutes. The transcript is resent only if Fireflies did not receive it. **fireflies\_get\_transcript\_parts** `Tool` **Description:** Shows what has landed: for each part, its character count, its number of non-empty lines, and its first and last line, plus the status. Use it after a failed call to decide which parts to send again. **Parameters:** * `meetingId` (string, required) ### User & Team Tools **fireflies\_get\_user** `Tool` **Description:** Fetch user account details. Returns authenticated user if no ID provided. **Parameters:** * `userId` (string, optional) - User ID (omit for current user) **Example:** ```json theme={null} { "userId": "user-id-12345" } ``` **Returns:** User ID, email, name, transcript count, recent meeting date, minutes consumed, admin status, and integrations. **fireflies\_get\_usergroups** `Tool` **Description:** Fetch user groups for the authenticated user or team. **Parameters:** * `mine` (boolean) - true for user's groups only, false (default) for all team groups **Example:** ```json theme={null} { "mine": false } ``` **Returns:** Group ID, name, handle, members with emails and roles. **fireflies\_get\_user\_contacts** `Tool` **Description:** Fetch contact list sorted by most recent meeting date. **Parameters:** * `format` (string) - "toon" (default), "json", or "text" **Example:** ```json theme={null} { "format": "json" } ``` **Returns:** Contact emails, names, profile pictures, and last meeting dates. ### Automation Tools **fireflies\_get\_rule\_executions** `Tool` **Description:** Retrieves rule execution logs grouped by meeting. Shows which automation rules were triggered on meetings, including the actions taken (sharing, moving to channels, changing privacy). Requires Enterprise tier access. Results are paginated. **Parameters:** * `ruleId` (string, optional) - Filter by a specific rule ID * `meetingId` (string, optional) - Filter by a specific meeting ID * `dateFrom` (string, optional) - Filter executions from this date (ISO 8601 format, e.g. `"2024-01-01T00:00:00Z"`) * `dateTo` (string, optional) - Filter executions up to this date (ISO 8601 format, e.g. `"2024-12-31T23:59:59Z"`) * `limit` (number, optional) - Maximum number of meeting groups to return (default: 10, max: 50) * `cursor` (string, optional) - Pagination cursor from a previous response to fetch the next page **Example:** ```json theme={null} { "dateFrom": "2024-01-01T00:00:00Z", "dateTo": "2024-12-31T23:59:59Z", "limit": 20 } ``` **Returns:** Rule execution logs grouped by meeting, including rule names, actions taken, and execution status. ## Tool Comparison Matrix | Tool | Content Type | Summary | Parameters | Best For | | - | - | - | - | - | | `fireflies_search` | Multiple meetings | Yes | Complex grammar | Advanced filtering with mini grammar | | `fireflies_get_transcripts` | Multiple meetings | Yes | Structured params | Structured queries with clear filters | | `fireflies_get_transcript` | Single meeting | No | Meeting ID only | Full conversation with timestamps | | `fireflies_fetch` | Single meeting | Yes | Meeting ID only | Complete meeting data in one call | | `fireflies_get_summary` | Single meeting | Yes | Meeting ID only | Quick insights and action items | | `fireflies_get_active_meetings` | Active meetings | No | Optional email/states | Monitoring live meetings | | `fireflies_get_analytics` | Team analytics | N/A | Optional date range | Meeting and conversation metrics | | `fireflies_share_meeting` | Single meeting | N/A | Meeting ID + emails | Sharing access with others | | `fireflies_revoke_meeting_access` | Single meeting | N/A | Meeting ID + email | Removing shared access | | `fireflies_update_meeting_title` | Single meeting | N/A | Meeting ID + title | Renaming meetings | | `fireflies_move_meeting` | Multiple meetings | N/A | Meeting IDs + channel | Organizing into channels | | `fireflies_list_channels` | Channel list | N/A | None | Viewing available channels | | `fireflies_get_channel` | Single channel | N/A | Channel ID | Channel details and members | | `fireflies_get_soundbites` | Soundbite list | N/A | Filter params | Browsing meeting clips | | `fireflies_create_soundbite` | Single soundbite | N/A | Transcript ID + times | Creating meeting clips | | `fireflies_create_upload_url` | Upload URL | N/A | Content type + file size | Uploading a local recording | | `fireflies_confirm_upload` | Single meeting | N/A | Meeting ID | Starting transcription of an uploaded file | | `fireflies_create_meeting_from_transcript` | New meeting | N/A | Title + start time + text | Importing a transcript from another app | | `fireflies_add_transcript_part` | Transcript part | N/A | Meeting ID + part number | Sending a long transcript in parts | | `fireflies_get_transcript_parts` | Import status | N/A | Meeting ID | Checking what landed after a failed call | | `fireflies_get_user` | User data | N/A | Optional user ID | Profile and account information | | `fireflies_get_usergroups` | Team data | N/A | Optional mine filter | Team structure and membership | | `fireflies_get_user_contacts` | Contact list | N/A | Optional format | Recent interaction history | | `fireflies_get_rule_executions` | Automation logs | N/A | Filter params | Viewing rule execution history | ## Response Formats Several tools support multiple response formats via the `format` parameter: * **toon** (default) - Token-efficient format optimized for AI model consumption * **json** - Standard JSON format for programmatic processing * **text** - Human-readable text format for display ## Common Workflows ### Search and Retrieve Pattern 1. Use `fireflies_search` or `fireflies_get_transcripts` to find relevant meetings 2. Extract meeting IDs from results 3. Use `fireflies_fetch` to get complete details, or: * Use `fireflies_get_transcript` for conversation only * Use `fireflies_get_summary` for insights only ### Team Analysis Pattern 1. Use `fireflies_get_usergroups` to get team structure 2. Extract member emails from target groups 3. Use `fireflies_get_transcripts` with `participants` filter 4. Optionally use `fireflies_get_user` for individual member details ### Contact-Based Search Pattern 1. Use `fireflies_get_user_contacts` to get contact list 2. Find target contact by name or email 3. Use `fireflies_get_transcripts` with contact email in `participants` 4. Retrieve detailed transcripts or summaries as needed ### Meeting Management Pattern 1. Use `fireflies_get_transcripts` to find meetings to organize 2. Use `fireflies_list_channels` to see available channels 3. Use `fireflies_move_meeting` to move meetings into channels 4. Use `fireflies_update_meeting_title` to rename meetings as needed ### Soundbite Workflow 1. Use `fireflies_get_transcript` to review a meeting's conversation 2. Identify key moments by timestamp 3. Use `fireflies_create_soundbite` to clip important segments 4. Use `fireflies_get_soundbites` to browse existing clips ### Meeting Sharing Pattern 1. Use `fireflies_get_transcripts` to find meetings to share 2. Use `fireflies_share_meeting` to share with external or internal users 3. Use `fireflies_revoke_meeting_access` to remove access when no longer needed ## Getting Started To use these tools: 1. **Configure MCP Server** - Add Fireflies MCP Server to your AI application * Remote server URL: `https://api.fireflies.ai/mcp` * Supports OAuth or API key authentication 2. **Authenticate** - Use OAuth flow or provide API key in configuration 3. **Invoke Tools** - Call tools using their standardized names with JSON parameters For detailed setup instructions, see [MCP Server Configuration](/getting-started/mcp-configuration). ## Additional Resources > [card] [MCP Configuration](/getting-started/mcp-configuration) > > Set up the Fireflies MCP Server in your AI application > [card] [GraphQL API](/graphql-api/query/transcripts) > > Direct GraphQL API access for custom integrations > [card] [Authorization](/fundamentals/authorization) > > Learn about API authentication and security > [card] [LLM Development](/getting-started/llm-development) > > Enhance AI coding experience with Fireflies data # Error codes Source: https://docs.fireflies.ai/miscellaneous/error-codes Error codes and their explanations ## Overview This page lists the error codes and their corresponding reasons for the Fireflies.ai API. You can refer to this page to understand the meaning and possible causes of different error codes that you may encounter while using the API. It provides a comprehensive reference for troubleshooting and resolving issues. Please visit [Errors](/fundamentals/errors) page for more details ## API Errors ### `invalid_arguments` Returned when invalid arguments are passed to a query or mutation ```json theme={null} { "errors": [ { ... other fields for error "message": "Invalid argument(s) were provided", "code": "invalid_arguments", "extensions": { "code": "invalid_arguments", "status": 400, "metadata": { "fields": [ { "name": "fromDate", "message": "fromDate must be a Date instance", "constraints": [ { "type": "isDate", "message": "fromDate must be a Date instance" } ] } ] } } } ] } ``` ### `object_not_found` Returned when the subject of your query or mutation is not found. For example, querying a non-existent userId would throw an `object_not_found` error of the type `User` ```json theme={null} { "errors": [ { ... other fields for error "message": "User not found", "code": "object_not_found", "extensions": { "code": "object_not_found", "status": 404, "metadata": { "objectType": "User" } } } ], } ``` ### `forbidden` Returned when you are not allowed to perform an action ```json theme={null} { "errors": [ { ... other fields for error "message": "You are not authorized to perform this action", "code": "forbidden", "extensions": { "code": "forbidden", "status": 403, } } ] } ``` ### `paid_required` Returned when you are required to be subscribed to a paid plan for the Fireflies.ai platform. The error will also mentioned the required `tier` for such actions. For example, making a request to `uploadAudio` as a free user will throw a `paid_required` error with tier `pro_or_higher`, which means that you need to be subscribed to a Pro or Higher plan to perform this action ```json theme={null} { "errors": [ { ... other fields for error "message": "You need to be subscribed to a paid plan to perform this action", "code": "paid_required", "extensions": { "code": "paid_required", "status": 403, "metadata": { "tier": "pro_or_higher" }, } } ] } ``` ### `not_in_team` Returned when you are attempting to query against a `userId` that is not a part of your team ```json theme={null} { "errors": [ { ... other fields for error "message": "You do not have permissions for this team", "code": "not_in_team", "extensions": { "code": "not_in_team", "status": 403, } } ] } ``` ### `require_elevated_privilege` Returned when you are attempting to perform admin actions as a non-admin user ```json theme={null} { "errors": [ { .. other fields for error "message": "You do not have permission to perform this action", "code": "require_elevated_privilege", "extensions": { "code": "require_elevated_privilege", "status": 403, } } ] } ``` ### `account_cancelled` Returned when your account has been cancelled due to non-payment or some other reason. Please contact support if you think this is a mistake ```json theme={null} { "errors": [ { ... other fields for error "message": "Your account is inactive. If this is not expected, please contact support", "code": "account_cancelled", "extensions": { "code": "account_cancelled", "status": 403, } } ] } ``` ### `args_required` Returned when your query or mutation is missing one or more required arguments. The property `extesions.metadata.fields` will provide the list of fields that have this constraints ```json theme={null} { "errors": [ { ... other fields for error "message": "You must provide one of the following: mine, transcript_id, my_team", "code": "args_required", "extensions": { "code": "args_required", "status": 400, "metadata": { "fields": [ "mine", "transcript_id", "my_team" ] }, } } ] } ``` ### `too_many_requests` Returned when you have been rate-limited due to making too many requests. The field `extensions.metadata.retryAfter` mentions the `retryAfter` time, and the HTTP response carries `Retry-After` (seconds) together with the `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` headers described in [Limits](/fundamentals/limits). ```json theme={null} { "errors": [ { ... other fields for error "message": "Too many requests. Please retry after 2:45:45 AM (UTC)", "code": "too_many_requests", "extensions": { "code": "too_many_requests", "status": 429, "metadata": { "retryAfter": 1720651545066 } } } ] } ``` ### `payload_too_small` Returned when the content size for `uploadAudio` mutation is too small. Upload files larger than `50kb` to avoid this error ```json theme={null} { "errors": [ { ... other fields for error "message": "Content size is too small. Please upload files larger than 50kb", "code": "payload_too_small", "extensions": { "code": "payload_too_small", "status": 400, } } ] } ``` ### `request_timeout` Returned when your request has taken too long to respond. ```json theme={null} { "errors": [ { ... other fields for error "message": "Request timed out. Please try again or contact support", "code": "request_timeout", "extensions": { "code": "request_timeout", "status": 408, } } ] } ``` ### `invalid_language_code` Returned when an invalid language code has been passed to a query or mutation ```json theme={null} { "errors": [ { ... other fields for error "message": "Language code is invalid or not supported. Please refer to API docs for supported languages", "code": "invalid_language_code", "extensions": { "code": "invalid_language_code", "status": 400, } } ] } ``` ### `admin_must_exist` Returned when you are attempting to call `setUserRole` for a single member team ```json theme={null} { "errors": [ { ... other fields for error "message": "You must have at least one admin your team", "code": "admin_must_exist", "extensions": { "code": "admin_must_exist", "status": 400, } } ] } ``` ### `unsupported_platform` Returned when an unsupported meeting platform URL is provided to the `addToLiveMeeting` mutation ```json theme={null} { "errors": [ { ... other fields for error "message": "The meeting platform is not supported. Please use a supported meeting platform URL.", "code": "unsupported_platform", "extensions": { "code": "unsupported_platform", "status": 400, } } ] } ``` ### `require_ai_credits` Returned when you have insufficient AI credits to perform AI-powered operations like AskFred queries. You may need to upgrade your plan or purchase additional credits. ```json theme={null} { "errors": [ { ... other fields for error "message": "You do not have sufficient AI credits to perform this action", "code": "require_ai_credits", "extensions": { "code": "require_ai_credits", "status": 402, "helpUrls": [ "https://app.fireflies.ai/upgrade" ] } } ] } ``` ### `feature_disabled` Returned when the feature you are trying to use has been turned off for your organization by an admin. For example, an admin can disable file uploads for transcription, which blocks the `uploadAudio`, `createUploadUrl` and `confirmUpload` mutations. Retrying will not help — contact your organization admin to re-enable the feature. ```json theme={null} { "errors": [ { ... other fields for error "message": "This feature has been disabled by your organization admin", "code": "feature_disabled", "extensions": { "code": "feature_disabled", "status": 403, "helpUrls": [ "https://docs.fireflies.ai/miscellaneous/error-codes#feature_disabled" ] } } ] } ``` ### `invariant_violation` Returned when an internal invariant is violated (unexpected internal state). This typically indicates a bug and is not actionable by clients. Please contact support if you receive this error. ```json theme={null} { "errors": [ { ... other fields for error "message": "Something unexpected happened. Please try again", "code": "invariant_violation", "extensions": { "code": "invariant_violation", "status": 500, } } ] } ``` # Language codes Source: https://docs.fireflies.ai/miscellaneous/language-codes Language code abbreviations for the Fireflies.ai API ## Overview This page lists the language codes supported by the Fireflies.ai API. You may use these codes with the `uploadAudio` or `addToLive` functionality to specify custom languages for your meetings. Each language entry includes the language name and its corresponding code, providing a quick and easy reference. ## References * [Add to Live](/graphql-api/mutation/add-to-live) * [Upload Audio](/graphql-api/mutation/upload-audio) ## Codes ```json theme={null} [ { "languageName": "Arabic", "languageCode": "ar" }, { "languageName": "Bulgarian", "languageCode": "bg" }, { "languageName": "Chinese", "languageCode": "zh" }, { "languageName": "Croatian", "languageCode": "hr" }, { "languageName": "Czech", "languageCode": "cs" }, { "languageName": "Danish", "languageCode": "da" }, { "languageName": "Dutch", "languageCode": "nl" }, { "languageName": "English", "languageCode": "en" }, { "languageName": "US English", "languageCode": "en-US" }, { "languageName": "Australia English", "languageCode": "en-AU" }, { "languageName": "UK English", "languageCode": "en-GB" }, { "languageName": "Finnish", "languageCode": "fi" }, { "languageName": "French", "languageCode": "fr" }, { "languageName": "German", "languageCode": "de" }, { "languageName": "Hebrew", "languageCode": "he" }, { "languageName": "Hindi", "languageCode": "hi" }, { "languageName": "Hungarian", "languageCode": "hu" }, { "languageName": "Indonesian", "languageCode": "id" }, { "languageName": "Italian", "languageCode": "it" }, { "languageName": "Japanese", "languageCode": "ja" }, { "languageName": "Korean", "languageCode": "ko" }, { "languageName": "Malay", "languageCode": "ms" }, { "languageName": "Malayalam", "languageCode": "ml" }, { "languageName": "Norwegian", "languageCode": "no" }, { "languageName": "Polish", "languageCode": "pl" }, { "languageName": "Portuguese", "languageCode": "pt" }, { "languageName": "Romanian", "languageCode": "ro" }, { "languageName": "Russian", "languageCode": "ru" }, { "languageName": "Slovak", "languageCode": "sk" }, { "languageName": "Spanish", "languageCode": "es" }, { "languageName": "Latin American Spanish", "languageCode": "es-419" }, { "languageName": "Swedish", "languageCode": "sv" }, { "languageName": "Tamil", "languageCode": "ta" }, { "languageName": "Thai", "languageCode": "th" }, { "languageName": "Filipino", "languageCode": "tl" }, { "languageName": "Turkish", "languageCode": "tr" }, { "languageName": "Ukrainian", "languageCode": "uk" }, { "languageName": "Vietnamese", "languageCode": "vi" } ] ``` # Event Schema Source: https://docs.fireflies.ai/realtime-api/event-schema Reference for all events emitted by the Fireflies.ai Realtime API # Event Reference This page documents the events you may receive from the Fireflies.ai Realtime API WebSocket. ## Event List | Event Name | Description | | - | - | | `auth.success` | Emitted when authentication succeeds. | | `auth.failed` | Emitted when authentication fails. The socket will disconnect after this event. | | `connection.established` | Emitted when the connection is successfully established. | | `connection.error` | Emitted when there is a connection or authorization error. | | `transcription.broadcast` | Emitted for every new transcription segment or update. | ## RealtimeTranscriptionEvent **transcript\_id** `String` The unique identifier for the transcript / meeting **chunk\_id** `String` The unique identifier for the transcription segment (chunk). You may use this field to deduplicate transcription events. If the transcription is being updated, it will contain the same chunk\_id as the previous event. A new transcription will have a different chunk\_id **text** `String` The transcribed text for this segment. **speaker\_name** `String` The name of the speaker for this segment. **start\_time** `Float` The start time (in seconds) **end\_time** `Float` The end time (in seconds) ## Example Payload ```json theme={null} { "transcript_id": "abc123", "chunk_id": "chunk_001", "text": "Hello world", "speaker_name": "Alice", "start_time": 0.0, "end_time": 1.25 } ``` ## Additional Resources > [card] [Getting Started](/realtime-api/getting-started) > > Getting started with Realtime API > [card] [Sentence](/schema/sentence) > > Schema for Sentence # Getting Started Source: https://docs.fireflies.ai/realtime-api/getting-started Learn how to connect to Fireflies.ai's Realtime API for live transcription ## Overview This guide shows you how to connect to the Fireflies.ai Realtime API and start receiving transcription events in real time. ## Endpoint ```text theme={null} wss://api.fireflies.ai ``` ## Requirements You'll need the following: * A valid API token * A `transcriptId` (or meeting ID) > [!TIP] > > Use the [Active Meetings](/graphql-api/query/active-meetings) query to discover meetings currently in progress and get their IDs for connecting to the Realtime API. ## Connecting via Socket.IO Use the Socket.IO client to connect and listen for events. ```ts theme={null} import { io } from 'socket.io-client'; const socket = io('wss://api.fireflies.ai', { path: '/ws/realtime', auth: { token: 'Bearer ', transcriptId: '' } }); socket.on('auth.success', data => { console.log('Authenticated:', data); }); socket.on('auth.failed', err => { console.error('Authentication failed:', err); }); socket.on('connection.error', err => { console.error('Connection error:', err); }); socket.on('connection.established', () => { console.log('Connection established'); }); socket.on('transcription.broadcast', event => { console.log('Transcript event:', event); }); ``` ## Auth Parameters | Field | Type | Description | | - | - | - | | `token` | string | Your API access token | | `transcriptId` | string | ID of the meeting or transcript | If authentication fails, the server emits an `auth.failed` event and disconnects the socket. See [Authorization](/fundamentals/authorization) ## Additional Resources > [card] [Overview](/realtime-api/overview) > > Overview of Realtime API > [card] [Active Meetings](/graphql-api/query/active-meetings) > > Query meetings currently in progress > [card] [Authorization](/fundamentals/authorization) > > Authenticating your requests with the Fireflies API # Overview Source: https://docs.fireflies.ai/realtime-api/overview Learn about Fireflies.ai's Realtime API for live transcription The Fireflies.ai Realtime API allows your application to receive **live transcription events** over WebSockets. This enables building interactive features such as live captioning, transcription overlays, and real-time analysis as users speak. > [!WARNING] > > The Realtime API is currently in **beta**. Features and endpoints may change. We welcome your feedback as we continue to improve this API. ## How It Works The Realtime API uses WebSocket connections to deliver transcription data as it's generated. ## Flow 1. **Authenticate**: Connect using a valid API token and transcript ID. 2. **Listen**: Once connected, you'll start receiving transcription events in real time. 3. **React**: Update your UI or process transcription events as they arrive. ## Features * **Low Latency**: Data is streamed as soon as it’s transcribed. * **Event-Based**: Receive structured events for easy handling. * **Token-Based Authentication**: Secure connections with scoped access. * **Incremental Transcription**: Receive transcript segments progressively. ## Additional Resources > [card] [Active Meetings](/graphql-api/query/active-meetings) > > Query meetings currently in progress > [card] [Event Schema](/realtime-api/event-schema) > > Schema for Realtime Events # ActiveMeeting Source: https://docs.fireflies.ai/schema/active-meeting Schema for ActiveMeeting **id** `String` Unique identifier for the active meeting **title** `String` Title of the active meeting **organizer\_email** `String` Email address of the meeting organizer **meeting\_link** `String` The URL link to join the meeting (e.g., Zoom, Google Meet, Microsoft Teams link) **start\_time** `String` ISO 8601 formatted timestamp indicating when the meeting started (e.g., `2024-01-15T10:00:00.000Z`) **end\_time** `String` ISO 8601 formatted timestamp indicating when the meeting is expected to end (e.g., `2024-01-15T11:00:00.000Z`) **privacy** `MeetingPrivacy` Privacy setting for the meeting. Possible values: * `link`: Anyone with the link can access * `owner`: Only the owner can access * `participants`: Only meeting participants can access * `teammatesandparticipants`: Team members and participants can access * `participatingteammates`: Only teammates who participated can access (beta, API/MCP only) * `teammates`: All team members can access **state** `MeetingState` Current state of the meeting. Possible values: * `active`: Meeting is currently in progress * `paused`: Meeting has been paused ## Additional Resources > [card] [Active Meetings Query](/graphql-api/query/active-meetings) > > Query active meetings in progress > [card] [Transcript Schema](/schema/transcript) > > Schema for completed meeting transcripts # AIFilter Source: https://docs.fireflies.ai/schema/aifilter Schema for AIFilter **task** `String` Description **pricing** `String` Description **metric** `String` Description **question** `String` Description **date\_and\_time** `String` Description **text\_cleanup** `String` Description **sentiment** `String` Description ## Additional Resources > [card] [Sentence](/schema/sentence) > > Schema for Sentence > [card] [Analytics](/schema/analytics) > > Schema for Analytics # Analytics Source: https://docs.fireflies.ai/schema/analytics Schema for Analytics **team** `TeamAnalytics` Analytics data for the team. See [TeamAnalytics](#teamanalytics) **users** `[UserAnalytics]` List of analytics data for individual users. See [UserAnalytics](#useranalytics) ## TeamAnalytics **conversation** `TeamConversationStats` Conversation statistics for the team. See [TeamConversationStats](#teamconversationstats) **meeting** `TeamMeetingStats` Meeting statistics for the team. See [TeamMeetingStats](#teammeetingstats) ## TeamMeetingStats **count** `Int` Total count of meetings **count\_diff\_pct** `Int` Percentage difference in meeting count compared to previous period **duration** `Float` Total duration of meetings in minutes **duration\_diff\_pct** `Int` Percentage difference in meeting duration compared to previous period **average\_count** `Int` Average number of meetings per user **average\_count\_diff\_pct** `Int` Percentage difference in average meeting count compared to previous period **average\_duration** `Int` Average duration of meetings in minutes **average\_duration\_diff\_pct** `Int` Percentage difference in average meeting duration compared to previous period ## UserMeetingStats **count** `Int` Total count of meetings for the user **count\_diff** `Int` Difference in meeting count compared to previous period **count\_diff\_compared\_to** `Int` Meeting count in the previous period **count\_diff\_pct** `Int` Percentage difference in meeting count compared to previous period **duration** `Float` Total duration of meetings in minutes for the user **duration\_diff** `Int` Difference in meeting duration compared to previous period **duration\_diff\_compared\_to** `Int` Meeting duration in the previous period **duration\_diff\_pct** `Int` Percentage difference in meeting duration compared to previous period ## TeamConversationStats **average\_filler\_words** `Int` Average number of filler words used per meeting **average\_filler\_words\_diff\_pct** `Int` Percentage difference in average filler words compared to previous period **average\_monologues\_count** `Int` Average number of monologues per meeting **average\_monologues\_count\_diff\_pct** `Int` Percentage difference in average monologues count compared to previous period **average\_questions** `Int` Average number of questions asked per meeting **average\_questions\_diff\_pct** `Int` Percentage difference in average questions compared to previous period **average\_sentiments** `Sentiments` Average sentiment analysis results for team meetings. See [Sentiments](/schema/sentiments) **average\_silence\_duration** `Float` Average duration of silence in minutes per meeting **average\_silence\_duration\_diff\_pct** `Int` Percentage difference in average silence duration compared to previous period **average\_talk\_listen\_ratio** `Float` Average ratio of talking to listening across all meetings **average\_words\_per\_minute** `Float` Average words spoken per minute across all meetings **longest\_monologue\_duration\_sec** `Int` Duration in seconds of the longest monologue **longest\_monologue\_duration\_diff\_pct** `Int` Percentage difference in longest monologue duration compared to previous period **total\_filler\_words** `Int` Total number of filler words used across all meetings **total\_filler\_words\_diff\_pct** `Int` Percentage difference in total filler words compared to previous period **total\_meeting\_notes\_count** `Int` Total count of meeting notes created **total\_meetings\_count** `Int` Total count of meetings **total\_monologues\_count** `Int` Total count of monologues across all meetings **total\_monologues\_diff\_pct** `Int` Percentage difference in total monologues compared to previous period **teammates\_count** `Int` Number of teammates included in the analytics **total\_questions** `Int` Total number of questions asked across all meetings **total\_questions\_diff\_pct** `Int` Percentage difference in total questions compared to previous period **total\_silence\_duration** `Float` Total duration of silence in minutes across all meetings **total\_silence\_duration\_diff\_pct** `Int` Percentage difference in total silence duration compared to previous period ## UserConversationStats **talk\_listen\_pct** `Float` Percentage of time spent talking vs listening **talk\_listen\_ratio** `Float` Ratio of talking to listening **total\_silence\_duration** `Float` Total duration of silence in minutes for the user **total\_silence\_duration\_compare\_to** `Float` Silence duration in the previous period **total\_silence\_pct** `Float` Percentage of meeting time spent in silence **total\_silence\_ratio** `Float` Ratio of silence to speaking time **total\_speak\_duration** `Float` Total duration of speaking time in minutes **total\_speak\_duration\_with\_user** `Float` Total duration of speaking time with specific user in minutes **total\_word\_count** `Int` Total count of words spoken **user\_filler\_words** `Int` Number of filler words used by the user **user\_filler\_words\_compare\_to** `Int` Filler words used in the previous period **user\_filler\_words\_diff\_pct** `Int` Percentage difference in filler words compared to previous period **user\_longest\_monologue\_sec** `Int` Duration in seconds of the user's longest monologue **user\_longest\_monologue\_compare\_to** `Int` Longest monologue duration in the previous period **user\_longest\_monologue\_diff\_pct** `Int` Percentage difference in longest monologue duration compared to previous period **user\_monologues\_count** `Int` Count of monologues by the user **user\_monologues\_count\_compare\_to** `Int` Monologues count in the previous period **user\_monologues\_count\_diff\_pct** `Int` Percentage difference in monologues count compared to previous period **user\_questions** `Int` Number of questions asked by the user **user\_questions\_compare\_to** `Int` Questions asked in the previous period **user\_questions\_diff\_pct** `Int` Percentage difference in questions asked compared to previous period **user\_speak\_duration** `Float` Duration of time the user spent speaking in minutes **user\_word\_count** `Int` Count of words spoken by the user **user\_words\_per\_minute** `Int` Words spoken per minute by the user **user\_words\_per\_minute\_compare\_to** `Int` Words per minute in the previous period **user\_words\_per\_minute\_diff\_pct** `Int` Percentage difference in words per minute compared to previous period ## UserAnalytics **user\_id** `String` Unique identifier for the user **user\_name** `String` Name of the user **user\_email** `String` Email address of the user **conversation** `UserConversationStats` Conversation statistics for the user. See [UserConversationStats](#userconversationstats) **meeting** `UserMeetingStats` Meeting statistics for the user. See [UserMeetingStats](#usermeetingstats) ## Additional Resources > [card] [Sentiments](/schema/sentiments) > > Schema for Sentiments > [card] [Meeting Analytics](/schema/meeting-analytics) > > Schema for Meeting Analytics # AppOutput Source: https://docs.fireflies.ai/schema/app-output Schema for AppOutput **transcript\_id** `String` The ID of the meeting transcript. **user\_id** `String` The ID of the user who owns the AI App **app\_id** `String` The ID of the AI App **created\_at** `Float` The timestamp in milliseconds from epoch when the output was generated **title** `String` The title of the AI App **prompt** `String` The prompt given to the AI App **response** `String` The response generated by the AI App ## Additional Resources > [card] [Apps](/schema/apps) > > Schema for Apps > [card] [Transcript](/schema/transcript) > > Schema for Transcript # AI Apps Source: https://docs.fireflies.ai/schema/apps Schema for Apps **outputs** `[AppOutput]` List of [AI App outputs](/schema/app-output) ## Additional Resources > [card] [App Output](/schema/app-output) > > Schema for App Output > [card] [Transcript](/schema/transcript) > > Schema for Transcript # AskFredMessage Source: https://docs.fireflies.ai/schema/askfred-message Schema definition for individual messages in AskFred conversation threads ## Overview The `AskFredMessage` type represents a single question-answer exchange within an AskFred conversation thread. Each message contains the user's query, the AI-generated response, and optional follow-up suggestions. ## Fields **id** `String!` *required* Unique identifier for the message **thread\_id** `String!` *required* ID of the parent thread this message belongs to **query** `String!` *required* The question or query submitted by the user **answer** `String!` *required* The AI-generated response to the query, formatted according to the specified format\_mode **suggested\_queries** `[String!]` Array of suggested follow-up questions based on the context of the conversation **status** `AskFredMessageStatus!` *required* Current status of the message processing. See [AskFredMessageStatus](#askfredmessagestatus) below. **created\_at** `String!` *required* ISO 8601 timestamp when the message was created **updated\_at** `String` ISO 8601 timestamp when the message was last updated ## AskFredMessageStatus An enum representing the processing status of a message: **processing** `enum value` The query is currently being processed **completed** `enum value` The query has been successfully processed and answered **failed** `enum value` The query processing failed ## Example ```json theme={null} { "id": "msg_001", "thread_id": "thread_abc123", "query": "What were the main action items from the meeting?", "answer": "Based on the meeting transcript, here are the main action items:\n\n1. **Marketing Team** - Prepare Q4 campaign strategy by March 25th\n2. **Product Team** - Finalize feature roadmap by March 20th\n3. **Engineering** - Complete API v2 architecture review by March 18th", "suggested_queries": [ "Who is responsible for the Q4 campaign strategy?", "What features are planned for the roadmap?", "What are the API v2 requirements?" ], "status": "completed", "created_at": "2024-03-15T10:30:00Z", "updated_at": "2024-03-15T10:30:15Z" } ``` ## Format Modes The `answer` field can be formatted in different ways based on the `format_mode` parameter used when creating or continuing a thread: ### Markdown Format Rich text with headers, lists, bold/italic text, and other markdown features for enhanced readability. ### Plaintext Format Concise text without any formatting, suitable for systems that don't support markdown. ## Related Types > [card] [AskFredThread](/schema/askfred-thread) > > Parent thread containing messages > [card] [AskFredResponse](/schema/askfred-response) > > Response wrapper for newly created messages # AskFredResponse Source: https://docs.fireflies.ai/schema/askfred-response Response wrapper for AskFred mutations ## Overview The `AskFredResponse` type is a wrapper object returned by AskFred mutations when creating or continuing conversation threads. It contains the newly generated message with the AI's response to your query. ## Fields **message** `AskFredMessage!` *required* The generated message containing the query, answer, and metadata. See [AskFredMessage](/schema/askfred-message) for detailed field descriptions. **cost** `Float` The number of AI credits charged for this query. ## Example ```json theme={null} { "message": { "id": "msg_001", "thread_id": "thread_abc123", "query": "What were the key decisions made in today's meeting?", "answer": "Based on today's meeting, here are the key decisions made:\n\n1. **Product Launch Date**: Confirmed for April 15th, 2024\n2. **Budget Allocation**: Approved $250K for Q2 marketing initiatives\n3. **Team Structure**: Decided to hire 3 additional engineers\n4. **Partnership Strategy**: Approved collaboration with TechCorp", "suggested_queries": [ "What are the specific marketing initiatives planned?", "What roles are we hiring for engineering?", "What are the terms of the TechCorp partnership?" ], "status": "completed", "created_at": "2024-03-15T14:30:00Z", "updated_at": "2024-03-15T14:30:05Z" }, "cost": 1 } ``` ## Related Types > [card] [AskFredMessage](/schema/askfred-message) > > Detailed message structure > [card] [AskFredThread](/schema/askfred-thread) > > Thread containing multiple messages # AskFredThread Source: https://docs.fireflies.ai/schema/askfred-thread Schema definition for AskFred conversation threads ## Overview The `AskFredThread` type represents a conversation thread in the AskFred system. Each thread contains a series of questions and answers about meeting transcripts, maintaining context throughout the conversation. ## Fields **id** `String!` *required* Unique identifier for the thread **title** `String!` *required* Title of the thread, typically derived from the first question asked **transcript\_id** `String` ID of the specific meeting/transcript this thread is associated with (if applicable) **user\_id** `String!` *required* ID of the user who created the thread **created\_at** `String!` *required* ISO 8601 timestamp when the thread was created **messages** `[AskFredMessage!]!` *required* Array of messages in the thread, containing questions and answers. See [AskFredMessage](/schema/askfred-message) for details. ## Example ```json theme={null} { "id": "thread_abc123", "title": "Q4 Planning Meeting Action Items", "transcript_id": "transcript_xyz789", "user_id": "user_123", "created_at": "2024-03-15T10:30:00Z", "messages": [ { "id": "msg_001", "thread_id": "thread_abc123", "query": "What were the action items from the Q4 planning meeting?", "answer": "Based on the Q4 planning meeting...", "suggested_queries": ["Who is responsible for...", "What is the timeline..."], "status": "completed", "created_at": "2024-03-15T10:30:00Z" } ] } ``` ## Related Types > [card] [AskFredMessage](/schema/askfred-message) > > Individual messages within a thread > [card] [AskFredThreadSummary](/schema/askfred-thread-summary) > > Lightweight thread summary for listings # AskFredThreadSummary Source: https://docs.fireflies.ai/schema/askfred-thread-summary Lightweight schema for AskFred thread listings ## Overview The `AskFredThreadSummary` type provides a lightweight representation of an AskFred conversation thread, ideal for displaying thread lists without the overhead of loading all messages. This type is returned when querying multiple threads. ## Fields **id** `String!` *required* Unique identifier for the thread **title** `String!` *required* Title of the thread, typically derived from the first question asked **transcript\_id** `String` ID of the specific meeting/transcript this thread is associated with (if applicable) **user\_id** `String!` *required* ID of the user who created the thread **created\_at** `String!` *required* ISO 8601 timestamp when the thread was created ## Example ```json theme={null} { "id": "thread_abc123", "title": "Q4 Planning Meeting Action Items", "transcript_id": "transcript_xyz789", "user_id": "user_123", "created_at": "2024-03-15T10:30:00Z" } ``` ## Example Query ```graphql theme={null} query GetThreadsSummary { askfred_threads { id title transcript_id created_at } } ``` ## Related Types > [card] [AskFredThread](/schema/askfred-thread) > > Full thread type with messages > [card] [AskFredMessage](/schema/askfred-message) > > Individual messages within threads # AudioUploadStatus Source: https://docs.fireflies.ai/schema/audio-upload-status Schema for AudioUploadStatus **success** `Boolean` Indicates whether the AudioUpload request was a success or not. **title** `String` Title of the uploaded file. **message** `String` Message from AudioUpload request. ## Additional Resources > [card] [Transcript](/schema/transcript) > > Schema for Transcript > [card] [Upload Audio](/graphql-api/mutation/upload-audio) > > Use the API to upload audio to Fireflies.ai # AuditEvent Source: https://docs.fireflies.ai/schema/audit-event Schema for AuditEvent - OCSF-compliant audit event for enterprise teams The `AuditEvent` type represents an audit log entry for actions performed within your team. Events conform to the OCSF v1.5.0 standard. ## Fields **id** `String!` *required* Unique identifier for the event. **time** `String!` *required* When the event occurred (ISO 8601 format). **category** `AuditEventCategory!` *required* High-level category: `MEETING_OPERATIONS`, `TEAM_OPERATIONS`, `USER_OPERATIONS`, or `AUTHENTICATION`. **action** `AuditEventAction!` *required* The specific action that occurred (e.g., `MEETING_DELETED`, `TEAMMATE_ADDED`). **severity** `String!` *required* Event severity: `informational`, `low`, `medium`, `high`, `critical`, `fatal`. **status** `String!` *required* Event outcome: `success` or `failure`. **message** `String` Human-readable event description. **class\_uid** `Int!` *required* OCSF class UID for compliance mapping. **activity\_id** `Int!` *required* OCSF activity ID for compliance mapping. **type\_uid** `Int!` *required* OCSF type UID, computed as `class_uid * 100 + activity_id`. **actor** `AuditEventActor` The user who performed the action. Contains `user_id`, and optionally `email`, `full_name` (when `include_pii` is true), and `ip_address`. **resource** `AuditEventResource` The affected resource with `type` (`meeting` or `team`) and `id`. **metadata** `String` Additional context as a JSON string of key-value pairs. ## Related Types * [AuditEventCategory](/schema/enum/audit-event-category) - Category enum * [AuditEventAction](/schema/enum/audit-event-action) - Action enum * [Audit Events Query](/graphql-api/query/audit-events) - Query documentation # Bite Source: https://docs.fireflies.ai/schema/bite Schema for Bite **id** `String` A unique identifier for the Bite **transcript\_id** `String` A unique identifier for the transcript the Bite is associated to **start\_time** `String` Start time for the Bite **end\_time** `String` End time for the Bite **name** `String` A string representing the title of the Bite **thumbnail** `String` URL of the Bite's thumbnail image **preview** `String` URL to a short preview video of the Bite **status** `String` Current processing status of the Bite. Acceptable values include 'pending', 'processing', 'ready', and 'error' **summary** `String` An AI-generated summary describing the content of the Bite **user\_id** `String` Identifier of the user who created the Bite **summary\_status** `String` Status of the AI summary generation process **media\_type** `String` Type of the Bite, either 'video' or 'audio' **privacies** `[BitePrivacy]` Array specifying the visibility of the Bite. Possible values are `public`, `team`, and `participants`. For example, `["team", "participants"]` indicates visibility to both team members and participants, while `["public"]` allows anyone to access the bite through its link **created\_at** `String` The date when this Bite was created **user** `BiteUser` Object representing the user who created the Bite, including relevant user details **properties** **name** `String` *required* Name associated with the User **id** `String` *required* ID of the User **first\_name** `String` First name of the User **last\_name** `String` Last name of the User **picture** `String` Picture associated with the User **sources** `[MediaSource]` Array of MediaSource objects for the Bite **properties** **src** `String` *required* Source of the media **type** `String` Type of the media **captions** `[BiteCaption]` Array of Object describing text captions associated with the Bite **properties** **index** `String` *required* Index **speaker\_id** `String` *required* SpeakerId associated with the caption object **text** `String` *required* Text associated with the caption **speaker\_name** `String` *required* Name of the speaker associated with this caption **start\_time** `String` *required* Start time for the caption **end\_time** `String` *required* End time for the caption **created\_from** `BiteOrigin` Object describing the origin of the Bite with the following properties **properties** **id** `String` *required* Unique identifier **name** `String` *required* Name of the origin source **type** `String` *required* Type of the original source, e.g., 'meeting' **duration** `String` Length of the original source in seconds ## Additional Resources > [card] [Transcript](/schema/transcript) > > Schema for Transcript > [card] [Create Bite](/graphql-api/mutation/create-bite) > > Use the API to create bites from your transcripts # Channel Source: https://docs.fireflies.ai/schema/channel Schema for Channel **id** `ID` Unique identifier of the Channel. **title** `String` Title of the Channel. **is\_private** `Boolean` Whether the channel is private. Private channels are only visible to their members. **created\_by** `String` Email of the user who created the channel. **created\_at** `String` Timestamp when the channel was created. **updated\_at** `String` Timestamp when the channel was last updated. **members** `[ChannelMember]` List of members of this channel. See [ChannelMember](/schema/channel-member) for available fields. ## Additional Resources > [card] [Channels Query](/graphql-api/query/channels) > > Query list of channels > [card] [Channel Query](/graphql-api/query/channel) > > Query a single channel by ID # ChannelMember Source: https://docs.fireflies.ai/schema/channel-member Schema for ChannelMember **user\_id** `String` Unique identifier for the channel member. **email** `String` Email address of the channel member. **name** `String` Display name of the channel member. ## Additional Resources > [card] [Channel](/schema/channel) > > Schema for Channel > [card] [Channels Query](/graphql-api/query/channels) > > Query list of channels # Contact Source: https://docs.fireflies.ai/schema/contact Schema for Contact **email** `String` Email address of the contact. **name** `String` Full name of the contact. **picture** `String` URL to the contact's profile picture. May be null if no picture is available. **last\_meeting\_date** `String` The date of the last meeting with this contact in ISO 8601 format (YYYY-MM-DD). May be null if no meeting date is available. ## Additional Resources > [card] [Contacts](/graphql-api/query/contacts) > > Query contacts using the API > [card] [Users](/graphql-api/query/users) > > Query users in your team # AuditEventAction Source: https://docs.fireflies.ai/schema/enum/audit-event-action Enum for AuditEventAction - specific audit event actions The `AuditEventAction` enum identifies the specific action that triggered an audit event. ## Values **MEETING\_DELETED** `Enum Value` A meeting was deleted. **MEETING\_PRIVACY\_UPDATED** `Enum Value` A meeting's privacy setting was changed. **MEETING\_VIEWED** `Enum Value` A meeting summary was viewed. **MEETING\_SHARED** `Enum Value` A meeting was shared with another user. **MEETING\_ACCESS\_REVOKED** `Enum Value` A user's access to a shared meeting was revoked. **MEETING\_DOWNLOADED** `Enum Value` A meeting transcript or recording was downloaded. **MEETING\_TITLE\_UPDATED** `Enum Value` A meeting's title was changed. **MEETING\_MOVED\_TO\_CHANNEL** `Enum Value` One or more meetings were moved to a channel. **SOUNDBITE\_CREATED** `Enum Value` A soundbite was created from a meeting. **ASKFRED\_THREAD\_CREATED** `Enum Value` An AskFred thread was created. **ASKFRED\_THREAD\_CONTINUED** `Enum Value` An AskFred thread was continued. **ASKFRED\_THREAD\_DELETED** `Enum Value` An AskFred thread was deleted. **ASKFRED\_THREADS\_LISTED** `Enum Value` AskFred threads were listed. **ASKFRED\_THREAD\_VIEWED** `Enum Value` An AskFred thread was viewed. **MEETING\_STATE\_UPDATED** `Enum Value` Meeting recording state was changed. **LIVE\_ACTION\_ITEM\_CREATED** `Enum Value` A live action item was created. **LIVE\_ACTION\_ITEMS\_VIEWED** `Enum Value` Live action items were viewed. **LIVE\_SOUNDBITE\_CREATED** `Enum Value` A live soundbite was created. **MEETING\_UPLOAD\_CREATED** `Enum Value` An upload URL was created for a new meeting recording. **MEETING\_UPLOAD\_CONFIRMED** `Enum Value` A meeting recording upload was confirmed and sent for processing. **LIVE\_MEETING\_BOT\_REQUESTED** `Enum Value` A bot was requested to join a live meeting. **MEETING\_AUDIO\_UPLOADED** `Enum Value` Audio was uploaded for transcription. **RULE\_EXECUTIONS\_VIEWED** `Enum Value` Rule executions were viewed. **APP\_OUTPUTS\_VIEWED** `Enum Value` App outputs were viewed. **TEAMMATE\_ADDED** `Enum Value` A user was added to the team. **TEAMMATE\_REMOVED** `Enum Value` A user was removed from the team. **USER\_ROLE\_CHANGED** `Enum Value` A user's role in the team was changed. **USERS\_LISTED** `Enum Value` Users on a team were listed. **USER\_VIEWED** `Enum Value` A user profile was viewed. **USER\_GROUPS\_LISTED** `Enum Value` User groups were listed. **USER\_GROUP\_MEMBER\_ADDED** `Enum Value` A teammate was added to a user group. **USER\_GROUP\_MEMBER\_REMOVED** `Enum Value` A teammate was removed from a user group. **SETTINGS\_UPDATED** `Enum Value` Team settings were updated. **LOGIN** `Enum Value` A user logged in. **LOGOUT** `Enum Value` A user logged out. ## Usage Use this enum to filter audit events by specific action: ```graphql theme={null} query { auditEvents(filters: { category: MEETING_OPERATIONS, action: MEETING_DELETED }) { events { time actor { user_id } resource { id } } has_more } } ``` ## Related Types * [AuditEvent](/schema/audit-event) - The audit event type * [AuditEventCategory](/schema/enum/audit-event-category) - Category enum * [Audit Events Query](/graphql-api/query/audit-events) - Query documentation # AuditEventCategory Source: https://docs.fireflies.ai/schema/enum/audit-event-category Enum for AuditEventCategory - categories of audit events The `AuditEventCategory` enum groups audit events into high-level categories. ## Values **MEETING\_OPERATIONS** `Enum Value` Events related to meetings: deleted, privacy updated, viewed, shared, downloaded. **TEAM\_OPERATIONS** `Enum Value` Events related to team membership: teammate added or removed. **USER\_OPERATIONS** `Enum Value` Events related to user or team settings changes. **AUTHENTICATION** `Enum Value` Events related to user authentication: login and logout. ## Usage Use this enum to filter audit events by category: ```graphql theme={null} query { auditEvents(filters: { category: MEETING_OPERATIONS }) { events { action time } has_more } } ``` ## Related Types * [AuditEvent](/schema/audit-event) - The audit event type * [AuditEventAction](/schema/enum/audit-event-action) - Specific action enum * [Audit Events Query](/graphql-api/query/audit-events) - Query documentation # DownloadAuthType Source: https://docs.fireflies.ai/schema/enum/download-auth-type Enum for DownloadAuthType - authentication methods for media downloads The `DownloadAuthType` enum specifies the authentication method to use when downloading media files during audio upload. ## Values **none** `Enum Value` No authentication required. The media file is publicly accessible. This is the default when `download_auth` is not provided. **bearer\_token** `Enum Value` Bearer token authentication. Requires the `bearer` field with a token. Fireflies will send `Authorization: Bearer ` when downloading the file. **basic\_auth** `Enum Value` HTTP Basic authentication. Requires the `basic` field with username and/or password. Fireflies will send `Authorization: Basic ` when downloading the file. ## Usage The `DownloadAuthType` enum is used in the [DownloadAuthInput](/schema/input/download-auth-input) type to specify which authentication method should be used: ```graphql theme={null} input DownloadAuthInput { type: DownloadAuthType! bearer: BearerTokenAuthInput basic: BasicAuthInput } ``` ## Examples ### No Authentication (Default) ```graphql theme={null} mutation { uploadAudio(input: { url: "https://public-storage.com/audio.mp3" title: "Public Recording" # download_auth omitted - defaults to 'none' }) { success message } } ``` Or explicitly: ```graphql theme={null} mutation { uploadAudio(input: { url: "https://public-storage.com/audio.mp3" title: "Public Recording" download_auth: { type: none } }) { success message } } ``` ### Bearer Token ```graphql theme={null} mutation { uploadAudio(input: { url: "https://protected-storage.com/audio.mp3" title: "Protected Recording" download_auth: { type: bearer_token bearer: { token: "your-token-here" } } }) { success message } } ``` ### Basic Authentication ```graphql theme={null} mutation { uploadAudio(input: { url: "https://private-server.com/audio.mp3" title: "Private Recording" download_auth: { type: basic_auth basic: { username: "user" password: "pass" } } }) { success message } } ``` ## Choosing the Right Authentication Method | Method | Use When | Example Use Cases | | - | - | - | | `none` | File is publicly accessible | Public S3 buckets, CDN-hosted files, public web servers | | `bearer_token` | File requires OAuth or API token | Private cloud storage, API-protected resources, JWT-authenticated endpoints | | `basic_auth` | File requires username/password | Web servers with `.htaccess`, internal file servers, legacy systems | ## Related Types * [DownloadAuthInput](/schema/input/download-auth-input) - Authentication configuration using this enum * [BearerTokenAuthInput](/schema/input/bearer-token-auth-input) - Bearer token configuration * [BasicAuthInput](/schema/input/basic-auth-input) - Basic auth configuration * [AudioUploadInput](/schema/input/audio-upload-input) - Parent input type # MeetingPrivacy Source: https://docs.fireflies.ai/schema/enum/meeting-privacy Enum for MeetingPrivacy - controls who can access a meeting The `MeetingPrivacy` enum specifies the privacy setting of a meeting, controlling who can access it. ## Values **link** `Enum Value` Anyone with the link can access the meeting. **owner** `Enum Value` Only the meeting owner can access the meeting. **participants** `Enum Value` Only meeting participants can access the meeting. **participatingteammates** `Enum Value` Only participants who are also teammates can access the meeting. > [!NOTE] > > `participatingteammates` is in **beta** and is currently available through the API and MCP only. It is not yet shown in the Fireflies dashboard. **teammatesandparticipants** `Enum Value` Teammates and participants can access the meeting. **teammates** `Enum Value` Only teammates can access the meeting. ## Usage Returned as the `privacy` field on the [Transcript](/schema/transcript) type, and set via the [updateMeetingPrivacy](/graphql-api/mutation/update-meeting-privacy) mutation. ```graphql theme={null} mutation UpdateMeetingPrivacy { updateMeetingPrivacy(input: { id: "your_transcript_id", privacy: teammates }) { privacy } } ``` ## Related Types * [Transcript](/schema/transcript) - Contains the `privacy` field * [Update Meeting Privacy](/graphql-api/mutation/update-meeting-privacy) - Mutation to change this setting * [UpdateMeetingPrivacyInput](/schema/input/update-meeting-privacy-input) - Input type using this enum # MeetingState Source: https://docs.fireflies.ai/schema/enum/meeting-state Enum for MeetingState - possible states for active meetings The `MeetingState` enum specifies the current state of an active meeting. ## Values **active** `Enum Value` The meeting is currently in progress with the Fireflies bot actively recording. **paused** `Enum Value` The meeting has been paused. The Fireflies bot is still in the meeting but recording is temporarily stopped. ## Usage The `MeetingState` enum is used in two contexts: 1. **As a filter** in the [GetActiveMeetingsInput](/schema/input/active-meetings-input) to filter meetings by state 2. **As a response field** in the [ActiveMeeting](/schema/active-meeting) type to indicate the current state ### Filtering by State ```graphql theme={null} query ActiveMeetings { active_meetings(input: { states: [active] }) { id title state } } ``` ### Getting All States (Default) When no `states` filter is provided, both `active` and `paused` meetings are returned: ```graphql theme={null} query ActiveMeetings { active_meetings { id title state } } ``` ## Related Types * [ActiveMeeting](/schema/active-meeting) - Schema containing the state field * [GetActiveMeetingsInput](/schema/input/active-meetings-input) - Input type using this enum for filtering * [Active Meetings Query](/graphql-api/query/active-meetings) - Query documentation # ShareMeetingType (Beta) Source: https://docs.fireflies.ai/schema/enum/share-meeting-type Enum for ShareMeetingType - controls how a meeting is shared The `ShareMeetingType` enum specifies how a meeting is shared by the [shareMeeting](/graphql-api/mutation/share-meeting) mutation. > [!NOTE] > > The `PASSWORD_LINK` share type is in **beta** and is being progressively rolled out. Contact support to have it enabled for your organization. ## Values **EMAIL** `Enum Value` Default. Shares the meeting directly with the given email addresses. Recipients access the meeting with their Fireflies account. **PASSWORD\_LINK** `Enum Value` Creates a password-protected link for the meeting. Anyone with the link and the password can view the meeting without a Fireflies account. Requires the `password` field. ## Usage Set as the `share_type` field on [ShareMeetingInput](/schema/input/share-meeting-input). ```graphql theme={null} mutation ShareMeeting { shareMeeting( input: { meeting_id: "your_meeting_id" emails: ["guest@example.com"] share_type: PASSWORD_LINK password: "a-strong-password" } ) { success share_slug } } ``` ## Related Types * [Share Meeting](/graphql-api/mutation/share-meeting) - Mutation using this enum * [ShareMeetingInput](/schema/input/share-meeting-input) - Input type using this enum # SummaryStatus Source: https://docs.fireflies.ai/schema/enum/summary-status Enum for SummaryStatus - status of AI summary generation The `SummaryStatus` enum indicates the state of AI summary generation for a meeting. ## Values **processing** `Enum Value` The summary is currently being generated. **processed** `Enum Value` Summary generation completed successfully. **failed** `Enum Value` Summary generation failed. **skipped** `Enum Value` Summary generation was skipped for this meeting. **default** `Enum Value` Default status — no summary has been generated yet. ## Usage Returned as the `summary_status` field on the [MeetingInfo](/schema/meeting-info) type, reachable via a [Transcript](/schema/transcript)'s `meeting_info`. ## Related Types * [MeetingInfo](/schema/meeting-info) - Contains the `summary_status` field * [Transcript](/schema/transcript) - Exposes `MeetingInfo` via its `meeting_info` field # GetActiveMeetingsInput Source: https://docs.fireflies.ai/schema/input/active-meetings-input Schema for GetActiveMeetingsInput **email** `String` Filter active meetings by a specific user's email address. **Permission requirements:** * **Regular users**: Can only query their own active meetings (must pass their own email or omit this field) * **Admins**: Can query active meetings for any user in their team If this field is omitted, the query returns active meetings for the authenticated user. The email must be valid and belong to a user in the same team as the requester. **states** `[MeetingState]` Filter active meetings by their state. Accepts an array of [MeetingState](/schema/enum/meeting-state) values. **Possible values:** * `active`: Meetings that are currently in progress * `paused`: Meetings that have been paused If this field is omitted, the query returns meetings in both `active` and `paused` states by default. # Attendee Source: https://docs.fireflies.ai/schema/input/attendee Schema for Attendee **displayName** `String` Display name of the attendee as it appears in meeting platforms like Google Chat, Zoom, etc. **email** `String` Email address of the attendee. Maximum length is 20 characters. **phoneNumber** `String` Phone number of the attendee. # AudioUploadInput Source: https://docs.fireflies.ai/schema/input/audio-upload-input Schema for AudioUploadInput **url** `String` *required* URL from which the audio file will be fetched. This should be a direct link to the audio resource. **title** `String` Title assigned to the uploaded file. If not provided, the file's original name will be used as its title. Maximum length is 256 characters. **attendees** `[Attendee]` Array of [Attendee](/schema/attendee) objects, as defined in the [Attendee](/schema/attendee) schema. Each element in this array represents an attendee. Max length of 100 attendees. **custom\_language** `String` Custom language code for the meeting **client\_reference\_id** `String` Custom identifier set by the user during upload. You may use this to identify your uploads in your events. Maximum length is 128 characters. **save\_video** `Boolean` Boolean value that specifies whether the content video needs to be saved. **download\_auth** `DownloadAuthInput` Authentication configuration for downloading the media file. Use this when your audio/video file requires authentication. Supports bearer token and basic authentication methods. If not provided, defaults to no authentication (publicly accessible URL). See [DownloadAuthInput](/schema/input/download-auth-input) for the complete schema definition. **meeting\_date** `String` Optional. The date and time the meeting actually took place, in ISO 8601 format (e.g. `2026-03-14T15:00:00Z`; offsets are normalized to UTC). Nonexistent calendar dates are rejected. Use this when importing historical recordings so the meeting is dated correctly instead of using the upload time. Must not be in the future. Defaults to the upload time when omitted. # BasicAuthInput Source: https://docs.fireflies.ai/schema/input/basic-auth-input Schema for BasicAuthInput - HTTP Basic authentication configuration The `BasicAuthInput` type configures HTTP Basic authentication for downloading media files. When provided, Fireflies will include an `Authorization: Basic ` header when downloading your media file. ## Fields **username** `String` The username for basic authentication. This field is optional - if not provided, only the password will be used. When provided, the value will be trimmed of leading/trailing whitespace. **password** `String` *required* The password for basic authentication. This field is required when using basic auth. The password must be a non-empty string and will be trimmed of leading/trailing whitespace. ## Usage HTTP Basic authentication is commonly used with: * Web servers with `.htaccess` protection * Internal company file servers * Legacy systems requiring username/password authentication * Simple authentication schemes for private media hosting ## Examples ### With Username and Password ```graphql theme={null} mutation { uploadAudio(input: { url: "https://files.company.com/recordings/meeting.mp3" title: "Sales Call" download_auth: { type: basic_auth basic: { username: "api-user" password: "secure-password-123" } } }) { success message } } ``` ### Password Only When the server only requires a password (username is optional): ```graphql theme={null} mutation { uploadAudio(input: { url: "https://protected.example.com/audio.mp3" title: "Meeting Recording" download_auth: { type: basic_auth basic: { password: "access-key-here" } } }) { success message } } ``` ## How It Works When you provide basic authentication credentials: 1. Fireflies combines the username and password as `username:password` 2. The combined string is base64-encoded 3. The encoded value is sent as `Authorization: Basic ` 4. The media file is downloaded using this authentication header For example, if you provide: * Username: `user` * Password: `pass` Fireflies will send: `Authorization: Basic dXNlcjpwYXNz` ## Security Considerations * **HTTPS Required**: The media URL must use HTTPS to ensure credentials are transmitted securely * **Credential Storage**: Credentials are used only for downloading the file and are not stored permanently * **Access Control**: Use credentials with minimal required permissions (read-only access to the specific file) * **Credential Rotation**: For production use, consider rotating credentials regularly ## Related Types * [DownloadAuthInput](/schema/input/download-auth-input) - Parent authentication configuration * [BearerTokenAuthInput](/schema/input/bearer-token-auth-input) - Alternative authentication method * [DownloadAuthType](/schema/enum/download-auth-type) - Authentication type enum # BearerTokenAuthInput Source: https://docs.fireflies.ai/schema/input/bearer-token-auth-input Schema for BearerTokenAuthInput - bearer token authentication configuration The `BearerTokenAuthInput` type configures bearer token authentication for downloading media files. When provided, Fireflies will include an `Authorization: Bearer ` header when downloading your media file. ## Fields **token** `String` *required* The bearer token to use for authentication. This token will be sent as `Authorization: Bearer ` when downloading the media file. The token must be a non-empty string and will be trimmed of leading/trailing whitespace. ## Usage Bearer token authentication is commonly used with: * Cloud storage services (AWS S3, Google Cloud Storage, Azure Blob Storage) * API-protected media servers * OAuth 2.0 protected resources * JWT-authenticated endpoints ## Example ```graphql theme={null} mutation { uploadAudio(input: { url: "https://storage.example.com/recordings/meeting.mp3" title: "Team Meeting" download_auth: { type: bearer_token bearer: { token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U" } } }) { success message } } ``` ## Security Considerations * **Token Expiry**: Ensure your bearer token has sufficient lifetime for Fireflies to download the file (typically a few minutes to hours) * **Token Scope**: Use tokens with minimal required permissions (read-only access to the specific file) * **Token Rotation**: For production use, consider using short-lived tokens and rotating them regularly * **HTTPS Only**: The media URL must use HTTPS to ensure the token is transmitted securely ## Related Types * [DownloadAuthInput](/schema/input/download-auth-input) - Parent authentication configuration * [BasicAuthInput](/schema/input/basic-auth-input) - Alternative authentication method * [DownloadAuthType](/schema/enum/download-auth-type) - Authentication type enum # CreateLiveActionItemInput Source: https://docs.fireflies.ai/schema/input/create-live-action-item-input Schema for CreateLiveActionItemInput **meeting\_id** `ID!` *required* The ID of the live meeting to create the action item for **prompt** `String!` *required* Natural language description of the action item to create. Fred will interpret this prompt and create the appropriate action item. Min / max of 5 / 255 characters. # CreateLiveSoundbiteInput Source: https://docs.fireflies.ai/schema/input/create-live-soundbite-input Schema for CreateLiveSoundbiteInput **meeting\_id** `ID!` *required* The ID of the live meeting to create the soundbite for **prompt** `String!` *required* Natural language description of the soundbite to create. Fred will interpret this prompt and create the appropriate soundbite. Min / max of 5 / 255 characters. # DownloadAuthInput Source: https://docs.fireflies.ai/schema/input/download-auth-input Schema for DownloadAuthInput - authentication configuration for media downloads The `DownloadAuthInput` type configures authentication for downloading media files during audio upload. This allows you to upload files that are hosted on private servers or require authentication. ## Fields **type** `DownloadAuthType` *required* The authentication method to use when downloading the media file. Must be one of: * `none` - No authentication (publicly accessible URL) * `bearer_token` - Bearer token authentication * `basic_auth` - HTTP Basic authentication See [DownloadAuthType](/schema/enum/download-auth-type) for details. **bearer** `BearerTokenAuthInput` Bearer token configuration. Required when `type` is `bearer_token`, must not be provided for other types. See [BearerTokenAuthInput](/schema/input/bearer-token-auth-input) for the complete schema definition. **basic** `BasicAuthInput` Basic authentication configuration. Required when `type` is `basic_auth`, must not be provided for other types. See [BasicAuthInput](/schema/input/basic-auth-input) for the complete schema definition. ## Validation Rules The `DownloadAuthInput` type enforces mutual exclusivity between authentication methods: * When `type` is `bearer_token`, only the `bearer` field should be provided * When `type` is `basic_auth`, only the `basic` field should be provided * When `type` is `none`, neither `bearer` nor `basic` should be provided Providing fields for multiple authentication types will result in a validation error. ## Examples ### Bearer Token Authentication ```graphql theme={null} { type: bearer_token bearer: { token: "your-bearer-token-here" } } ``` ### Basic Authentication ```graphql theme={null} { type: basic_auth basic: { username: "your-username" password: "your-password" } } ``` ### No Authentication (Default) When the media file is publicly accessible, you can either omit the `download_auth` field entirely or explicitly set it to `none`: ```graphql theme={null} { type: none } ``` ## Use Cases ### Private Cloud Storage Use bearer token authentication for files stored in private cloud storage with token-based access: ```graphql theme={null} mutation { uploadAudio(input: { url: "https://storage.example.com/recordings/meeting-123.mp3" title: "Team Standup" download_auth: { type: bearer_token bearer: { token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } } }) { success message } } ``` ### Protected Web Servers Use basic authentication for files hosted on web servers with HTTP Basic Auth: ```graphql theme={null} mutation { uploadAudio(input: { url: "https://recordings.company.com/meeting-123.mp3" title: "Client Call" download_auth: { type: basic_auth basic: { username: "api-user" password: "secure-password" } } }) { success message } } ``` ## Related Types * [BearerTokenAuthInput](/schema/input/bearer-token-auth-input) - Bearer token configuration * [BasicAuthInput](/schema/input/basic-auth-input) - Basic auth configuration * [DownloadAuthType](/schema/enum/download-auth-type) - Authentication type enum * [AudioUploadInput](/schema/input/audio-upload-input) - Parent input type # RevokeSharedMeetingAccessInput Source: https://docs.fireflies.ai/schema/input/revoke-shared-meeting-access-input Schema for RevokeSharedMeetingAccessInput **meeting\_id** `ID` *required* The unique identifier of the meeting / transcript. **email** `String` *required* The email address of the user whose shared access should be revoked. # Role Source: https://docs.fireflies.ai/schema/input/role Schema for Role **role** `enum` Valid types for role are `admin` and `user` # ShareMeetingInput Source: https://docs.fireflies.ai/schema/input/share-meeting-input Schema for ShareMeetingInput **meeting\_id** `ID` *required* The unique identifier of the meeting / transcript to share. **emails** `[String]` *required* An array of email addresses to share the meeting with. Maximum 50 emails per request. **expiry\_days** `Int` Number of days until the shared access expires. Must be one of: `7`, `14`, or `30`. If omitted, the share does not expire. **share\_type** `ShareMeetingType` (default: EMAIL) How the meeting is shared. `EMAIL` grants access to the given email addresses. `PASSWORD_LINK` creates a password-protected link that recipients can open without a Fireflies account. See [ShareMeetingType](/schema/enum/share-meeting-type). > [!NOTE] > > `PASSWORD_LINK` is in **beta** and is being progressively rolled out. Contact support to have it enabled for your organization. **password** `String` Password that protects the shared link. Required when `share_type` is `PASSWORD_LINK` and rejected for any other share type. Must be 8–128 characters and cannot contain line breaks. # UpdateMeetingChannelInput Source: https://docs.fireflies.ai/schema/input/update-meeting-channel-input Schema for UpdateMeetingChannelInput **transcript\_ids** `[String!]!` *required* Array of Transcript IDs to update. Must contain 1–5 items. **channel\_id** `ID!` *required* The target Channel ID. A meeting can only belong to one channel; this mutation sets the meeting's channel to the specified value. # UpdateMeetingPrivacyInput Source: https://docs.fireflies.ai/schema/input/update-meeting-privacy-input Schema for UpdateMeetingPrivacyInput **id** `String` *required* The unique identifier of the meeting / transcript. **privacy** `String` *required* The privacy level for the meeting. Must be one of the following values: * `link` - Anyone with the link can access the meeting * `owner` - Only the meeting owner can access * `participants` - Only meeting participants can access * `participatingteammates` - Only participants who are teammates can access (**beta**, API/MCP only — not yet available in the dashboard) * `teammatesandparticipants` - Both teammates and participants can access * `teammates` - Only teammates can access # UpdateMeetingStateInput Source: https://docs.fireflies.ai/schema/input/update-meeting-state-input Schema for UpdateMeetingStateInput **meeting\_id** `ID!` *required* The ID of the live meeting to update state for **action** `MeetingStateAction!` *required* The action to perform. Must be one of: `pause_recording` or `resume_recording` # UpdateMeetingTitleInput Source: https://docs.fireflies.ai/schema/input/update-meeting-title-input Schema for UpdateMeetingTitleInput **title** `String` *required* The new title to be assigned to the meeting / transcript. The title must be a string between 5 and 250 characters long and should not contain any special characters. Min / max of 5 / 256 characters. **id** `String` *required* The unique identifier of the meeting / transcript. # MeetingAnalytics Source: https://docs.fireflies.ai/schema/meeting-analytics Schema for MeetingAnalytics **sentiments** `Sentiments` Sentiment analysis of the meeting. See [Sentiments](/schema/sentiments) **categories** `AnalyticsCategories` Categorized analytics of the meeting content. See [AnalyticsCategories](#analyticscategories) **speakers** `[AnalyticsSpeaker]` Array of analytics data for each speaker in the meeting. See [AnalyticsSpeaker](#analyticsspeaker) ## AnalyticsCategories **questions** `Int` Number of questions asked during the meeting. **date\_times** `Int` Number of date and time references mentioned in the meeting. **metrics** `Int` Number of metrics or measurements discussed in the meeting. **tasks** `Int` Number of tasks or action items identified in the meeting. ## AnalyticsSpeaker **speaker\_id** `Int` Unique identifier for the speaker. **name** `String` Name of the speaker. **duration** `Float` Total speaking time of the speaker in seconds. **word\_count** `Int` Total number of words spoken by the speaker. **longest\_monologue** `Float` Duration of the speaker's longest continuous speech in seconds. **monologues\_count** `Int` Number of times the speaker spoke during the meeting. **filler\_words** `Int` Number of filler words (um, uh, like, etc.) used by the speaker. **questions** `Int` Number of questions asked by the speaker. **duration\_pct** `Float` Percentage of the total meeting time the speaker was talking. **words\_per\_minute** `Float` Average speaking rate of the speaker in words per minute. ## Additional Resources > [card] [Sentiments](/schema/sentiments) > > Schema for Sentiments > [card] [Speaker](/schema/speaker) > > Schema for Speaker # MeetingAttendance Source: https://docs.fireflies.ai/schema/meeting-attendance Schema for MeetingAttendance **name** `String` Name of the meeting participant as it appears in the meeting events. **join\_time** `String` ISO 8601 timestamp when the participant first joined the meeting. If the participant joined at meeting start (timestamp: 0), this will be the meeting's start time. **leave\_time** `String` ISO 8601 timestamp when the participant last left the meeting. This field is nullable if the participant never left or the leave event was not captured. ## Additional Resources > [card] [MeetingAttendeeModel](/schema/meeting-attendee) > > Schema for MeetingAttendeeModel > [card] [Transcript](/schema/transcript) > > Schema for Transcript # MeetingAttendeeModel Source: https://docs.fireflies.ai/schema/meeting-attendee Schema for MeetingAttendeeModel **displayName** `String` Display name of the meeting attendee. **email** `String` Email address of the meeting attendee. **phoneNumber** `String` Phone number of the meeting attendee. **name** `String` Full name of the meeting attendee. **location** `String` Deprecated field ## Additional Resources > [card] [MeetingAttendance](/schema/meeting-attendance) > > Schema for MeetingAttendance > [card] [Transcript](/schema/transcript) > > Schema for Transcript # MeetingInfo Source: https://docs.fireflies.ai/schema/meeting-info Schema for MeetingInfo **fred\_joined** `Boolean` Boolean value that returns `true` if the bot joined the call, `false` otherwise. **silent\_meeting** `Boolean` Boolean value that returns `true` if the meeting does not contain any spoken words. Otherwise false. **summary\_status** `SummaryStatus` String value representing the summary status. Possible values are `processing`, `processed`, `failed`, `skipped`. ## Additional Resources > [card] [Transcript](/schema/transcript) > > Schema for Transcript > [card] [Summary](/schema/summary) > > Schema for Summary # Sentence Source: https://docs.fireflies.ai/schema/sentence Schema for Sentence **index** `Int` Index **text** `String` Default transcription sentence or user edited transcription sentence. **raw\_text** `String` Transcribed sentence from meeting audio **start\_time** `String` Start time of Sentence **end\_time** `String` End time of Sentence **speaker\_id** `ID` Unique identifier for Speaker **speaker\_name** `String` Name of the speaker. **ai\_filters** `AIFilter` Sentiment analysis from meeting audio. Type of [AIFilter](/schema/aifilter) ## Additional Resources > [card] [AIFilter](/schema/aifilter) > > Schema for AIFilter > [card] [Speaker](/schema/speaker) > > Schema for Speaker # Sentiments Source: https://docs.fireflies.ai/schema/sentiments Schema for Sentiments **negative\_pct** `Float` Percentage of negative sentiment detected in the conversation. **neutral\_pct** `Float` Percentage of neutral sentiment detected in the conversation. **positive\_pct** `Float` Percentage of positive sentiment detected in the conversation. ## Additional Resources > [card] [Sentence](/schema/sentence) > > Schema for Sentence > [card] [Meeting Analytics](/schema/meeting-analytics) > > Schema for Meeting Analytics # SharedWith Source: https://docs.fireflies.ai/schema/shared-with Schema for SharedWith **email** `String` Email address of the shared user. **name** `String` Display name of the shared user. **photo\_url** `String` Profile photo URL of the shared user. **expires\_at** `String` ISO date string when the shared access expires. `null` if the share does not expire. # Speaker Source: https://docs.fireflies.ai/schema/speaker Schema for Speaker **id** `number` ID of the speaker identified within the transcript **name** `String` Name of the speaker identified within the transcript ## Additional Resources > [card] [Transcript](/schema/transcript) > > Schema for Transcript > [card] [Sentence](/schema/sentence) > > Schema for Sentence # Summary Source: https://docs.fireflies.ai/schema/summary AI generated summary of the meeting. > [!NOTE] > > Meeting AI summary prompts are defined by [AI apps](https://app.fireflies.ai/apps) and can be > customized to your needs. **action\_items** `String` A list of action items generated by the AI based on the meeting transcript **keywords** `String` A list of keywords generated by the AI based on the meeting transcript **outline** `String` An outline of the meeting with timestamps generated by the AI based on the meeting transcript **overview** `String` A summary of the meeting generated by the AI **shorthand\_bullet** `String` A list of shorthand bullets generated by the AI **notes** `String` Detailed meeting notes generated by the AI **gist** `String` A summary of the meeting in 1 sentence **bullet\_gist** `String` Summary of the meeting in a few bullet points with descriptive emojis **short\_summary** `String` Summary of the meeting in a single paragraph **short\_overview** `String` Brief overview of the meeting **meeting\_type** `String` Meeting classification **topics\_discussed** `[String]` List of topics discussed during the meeting. **transcript\_chapters** `[String]` Chapters of the short transcript. The short transcript is an LLM-condensed transcript that may be helpful for downstream applications **extended\_sections** `[SummarySection]` Optional sections of the summary included by customizing the summary from the dashboard ## Additional Resources > [card] [Summary Section](/schema/summary-section) > > Schema for Summary Section > [card] [Transcript](/schema/transcript) > > Schema for Transcript # SummarySection Source: https://docs.fireflies.ai/schema/summary-section Extended sections of the summary included by customizing the summary from the dashboard. **title** `String` Title of the section **content** `String` Response summary content of the section ## Additional Resources > [card] [Summary](/schema/summary) > > Schema for Summary > [card] [Transcript](/schema/transcript) > > Schema for Transcript # Transcript Source: https://docs.fireflies.ai/schema/transcript Schema for Transcript **id** `ID` Unique identifier of the Transcript. **title** `String` Title of the Transcript. **host\_email** `String` [DEPRECATED](/additional-info/deprecated) \\ Email address of the meeting host. **organizer\_email** `String` Email address of the meeting organizer. **user** `User` The [User](/schema/user) who Fred recorded the meeting on behalf of **speakers** `[Speaker]` The speakers array contains the id and name of the speaker as it appears within the transcript **transcript\_url** `String` The url to view the transcript in the dashboard **participants** `[String]` An array of email addresses of meeting participants guests, including participants that do not have Fireflies account. **meeting\_attendees** `[MeetingAttendeeModel]` List of [MeetingAttendeeModel](/schema/meeting-attendee) **meeting\_attendance** `[MeetingAttendance]` List of [MeetingAttendance](/schema/meeting-attendance) records showing when participants joined and left the meeting **fireflies\_users** `[String]` An array of email addresses of only Fireflies users participants that have fireflies account that participated in the meeting **workspace\_users** `[String]` An array of email addresses of Fireflies users who participated in the meeting and are also members of the requesting user's team/workspace. This is a subset of `fireflies_users` filtered to only include teammates. **duration** `Number` Duration of the audio in minutes **dateString** `DateTime` String representation of DateTime. Example: `2024-04-22T20:14:04.454Z` **date** `Float` Date the transcript was created represented in milliseconds from [EPOCH](https://en.wikipedia.org/wiki/Epoch_\(computing\)). The timezone for this field is UTC +00:00 **audio\_url** `String` Secure, newly generated hashed url that allows you download meeting audio. This url expires after every 24 hours. You'd have to make another request to generate a new audio\_url. You need to be subscribed to a pro or higher plan to query audio\_url. View plans [here](https://fireflies.ai/pricing) **video\_url** `String` Secure, newly generated hashed url that allows you download meeting video. This url expires after every 24 hours. You'd have to make another request to generate a new video\_url. You will need to enable `RECORD MEETING VIDEO` setting on your Fireflies [dashboard](https://app.fireflies.ai/settings) for this to work. You need to be subscribed to a Pro or higher plan to query video\_url. View plans [here](https://fireflies.ai/pricing) **sentences** `[Sentence]` An array of [Sentence](/schema/sentence)(s), containing transcript details like `raw_text`, `speaker_name`, etc. **calendar\_id** `String` Identifies the calendar event **series**. Every occurrence of a recurring event shares the same `calendar_id`. * **Google:** the event `iCalUID` without the `@google.com` suffix (`abc123@google.com` → `abc123`). Other suffixes (e.g. imported events) are kept as-is. * **Outlook:** the full event `iCalUId`. * Falls back to `cal_id` if no `iCalUID` was captured. **summary** `Summary` AI generated [Summary](/schema/summary) of the meeting. **meeting\_info** `MeetingInfo` [MeetingInfo](/schema/meeting-info) metadata fields. **cal\_id** `String` Identifies the specific calendar event **occurrence**. This is the calendar provider's event `id` (Google `@google.com` suffix removed). Recurring events are expanded into single occurrences, and the id does not change if an occurrence is moved to another time. | Google event | `cal_id` | `calendar_id` | | - | - | - | | Single event `abc123` | `abc123` | `abc123` | | Recurring occurrence, original start 2026-10-08 14:00 UTC | `abc123_20261008T140000Z` | `abc123` | | Recurring all-day occurrence | `abc123_20261008` | `abc123` | Google `recurringEventId` and `originalStartTime` are not exposed. **calendar\_type** `String` Calendar provider name: `google` or `outlook` **apps\_preview** `Apps` Preview of [Apps](/schema/apps) generated from the transcript. Max limit of 5 most recent AI App Outputs per meeting. Use the [Apps Query](/graphql-api/query/apps) to fetch the entire list of AI App Outputs **meeting\_link** `String` The web conferencing url of the meeting. This field is only populated if the meeting was hosted on a supported platform such as Google Meet, Zoom, etc. **analytics** `MeetingAnalytics` [MeetingAnalytics](/schema/meeting-analytics) contains analytics data about the meeting, including: * `sentiments`: Sentiment analysis showing percentages of positive, neutral, and negative sentiments * `categories`: Counts of different types of content (questions, date/times, metrics, tasks) * `speakers`: Detailed analytics for each speaker including duration, word count, filler words, etc. You need to be subscribed to a pro or higher plan to query meeting analytics. View plans [here](https://fireflies.ai/pricing) **channels** `[Channel]` An array of [Channel](/schema/channel) the meeting belongs to **privacy** `String` The privacy setting of the meeting, controlling who can access it. Possible values are `link` (anyone with the link), `owner` (meeting owner only), `participants` (meeting participants only), `participatingteammates` (only participants who are teammates — beta, API/MCP only), `teammatesandparticipants` (teammates and participants), and `teammates` (teammates only). Use the [updateMeetingPrivacy](/graphql-api/mutation/update-meeting-privacy) mutation to change this setting. **shared\_with** `[SharedWith]` An array of [SharedWith](/schema/shared-with) representing users the meeting has been shared with externally. Use the [shareMeeting](/graphql-api/mutation/share-meeting) mutation to share and [revokeSharedMeetingAccess](/graphql-api/mutation/revoke-shared-meeting-access) to revoke access. **is\_live** `Boolean` Indicates whether the meeting is currently live. Returns `true` when the meeting is in an `active` or `paused` state, and `false` otherwise. When `is_live` is `true`, the `sentences` field returns real-time captions from the ongoing meeting. When `false`, `sentences` returns the processed transcript data. ## Additional Resources > [card] [Summary](/schema/summary) > > Schema for Summary > [card] [Sentence](/schema/sentence) > > Schema for Sentence # User Source: https://docs.fireflies.ai/schema/user Schema for User **user\_id** `String` Unique identifier for the User. **user\_groups** `[UserGroup]` List of user groups the user belongs to. (See [UserGroups](/schema/user-groups)) **email** `String` Email address for the User. **name** `String` Full name of the User. **num\_transcripts** `Int` Total number of transcripts associated with the user. **recent\_transcript** `String` Most recent transcript generated by the user. **recent\_meeting** `String` Details about the user's most recent meeting. **minutes\_consumed** `Int` Total number of minutes consumed by the user in meetings. **is\_admin** `Boolean` Indicates whether the user has administrative privileges. True if the user is an admin, false otherwise. **integrations** `[String]` A list of integrations enabled for the user's account. **is\_calendar\_in\_sync** `Boolean` Indicates whether the user's calendar is currently synced. Returns true if the user has a valid OAuth connection (Google or Office) with non-expired tokens. ## Additional Resources > [card] [UserGroups](/schema/user-groups) > > Schema for UserGroups > [card] [Transcripts](/graphql-api/query/transcripts) > > Query transcripts using the API # UserGroupMember Source: https://docs.fireflies.ai/schema/user-group-member Schema for UserGroupMember **user\_id** `String` Unique identifier for the user group member. **first\_name** `String` First name of the user group member. **last\_name** `String` Last name of the user group member. **email** `String` Email address of the user group member. ## Additional Resources > [card] [UserGroups](/schema/user-groups) > > Schema for UserGroups > [card] [User](/schema/user) > > Schema for User # UserGroups Source: https://docs.fireflies.ai/schema/user-groups Schema for UserGroups **id** `String` Unique ID for the user group **name** `String` Name of the user group. **handle** `String` Unique identifier or handle for the user group. **members** `[UserGroupMember]` List of members in the user group. See [UserGroupMember](/schema/user-group-member) ## Additional Resources > [card] [User](/schema/user) > > Schema for User > [card] [UserGroupMember](/schema/user-group-member) > > Schema for UserGroupMember