schema { query: Query mutation: Mutation } # Scalar types scalar DateTime scalar Float # Enums enum Role { admin user } enum BitePrivacy { public team participants } # Input types input AudioUploadInput { url: String! title: String! webhook: String custom_language: String save_video: Boolean attendees: [AttendeeInput] client_reference_id: String } input AttendeeInput { displayName: String email: String phoneNumber: String } input AddToLiveMeetingInput { meeting_link: String! title: String meeting_password: String duration: Int language: String attendees: [AttendeeInput!] } input GetActiveMeetingsInput { user_id: String } input UpdateMeetingTitleInput { id: String! title: String! } input UpdateMeetingPrivacyInput { id: String! privacy: String! } input UpdateMeetingChannelInput { id: String! channel_id: ID! } input ShareMeetingInput { meeting_id: String! emails: [String!]! expiry_days: Int } input RevokeSharedMeetingAccessInput { meeting_id: String! emails: [String!]! } input CreateAskFredThreadInput { query: String! transcript_id: String response_language: String format_mode: String filters: AskFredFiltersInput } input ContinueAskFredThreadInput { thread_id: String! query: String! } input AskFredFiltersInput { start_time: String end_time: String channel_ids: [String!] organizers: [String!] participants: [String!] transcript_ids: [String!] } # Object types type AIFilter { task: String pricing: String metric: String question: String date_and_time: String text_cleanup: String sentiment: String } type MeetingInfo { fred_joined: Boolean silent_meeting: Boolean summary_status: String } type Sentence { index: Int speaker_name: String speaker_id: String meeting_info: MeetingInfo text: String raw_text: String start_time: Float end_time: Float ai_filters: AIFilter } type Speaker { id: String name: String } type MeetingAttendee { displayName: String email: String phoneNumber: String name: String location: String } type MeetingAttendance { name: String join_time: String leave_time: String } type ExtendedSection { title: String content: String } type Summary { keywords: [String] action_items: [String] outline: [String] shorthand_bullet: String overview: String bullet_gist: String gist: String short_summary: String short_overview: String meeting_type: String topics_discussed: [String] transcript_chapters: [String] extended_sections: [ExtendedSection] } type SharedWith { email: String name: String photo_url: String expires_at: String } type Channel { id: ID title: String is_private: Boolean created_at: String updated_at: String created_by: String members: [ChannelMember] } type ChannelMember { user_id: String email: String name: String } type UserGroup { id: ID name: String handle: String members: [UserGroupMember] } type UserGroupMember { user_id: String first_name: String last_name: String email: String } type User { user_id: String email: String name: String is_admin: Boolean integrations: [String] user_groups: [UserGroup] num_transcripts: Int recent_transcript: String recent_meeting: String minutes_consumed: Float } type SentimentScores { negative_pct: Float neutral_pct: Float positive_pct: Float } type TranscriptAnalyticsCategories { questions: Int date_times: Int metrics: Int tasks: Int } type SpeakerAnalytics { speaker_id: String name: String duration: Float word_count: Int longest_monologue: Float monologues_count: Int filler_words: Int questions: Int duration_pct: Float words_per_minute: Float } type TranscriptAnalytics { sentiments: SentimentScores categories: TranscriptAnalyticsCategories speakers: [SpeakerAnalytics] } type Transcript { id: String title: String date: String dateString: String privacy: String duration: Float host_email: String organizer_email: String calendar_id: String cal_id: String calendar_type: String meeting_link: String transcript_url: String audio_url: String video_url: String is_live: Boolean fireflies_users: [String] participants: [String] workspace_users: [String] speakers: [Speaker] sentences: [Sentence] summary: Summary meeting_info: MeetingInfo meeting_attendees: [MeetingAttendee] meeting_attendance: [MeetingAttendance] user: User channels: [Channel] shared_with: [SharedWith] analytics: TranscriptAnalytics } type ActiveMeeting { id: String title: String organizer_email: String meeting_link: String start_time: String end_time: String privacy: String state: String } type BiteCreatedFrom { description: String duration: Float id: String name: String type: String } type BiteCaption { end_time: Float index: Int speaker_id: String speaker_name: String start_time: Float text: String } type BiteSource { src: String type: String } type BiteUser { first_name: String last_name: String picture: String name: String id: String } type Bite { id: ID transcript_id: String name: String user_id: String start_time: Float end_time: Float summary: String status: String media_type: String thumbnail: String preview: String summary_status: String created_at: String created_from: BiteCreatedFrom captions: [BiteCaption] sources: [BiteSource] privacies: [String] user: BiteUser } type AIAppOutput { transcript_id: String user_id: String app_id: String created_at: String title: String prompt: String response: String } type AIApps { outputs: [AIAppOutput] } type AskFredMessage { id: String thread_id: String query: String answer: String suggested_queries: [String] status: String created_at: String updated_at: String } type AskFredThread { id: String title: String transcript_id: String user_id: String created_at: String messages: [AskFredMessage] } type AskFredThreadResult { message: AskFredMessage cost: Float } type Contact { email: String name: String picture: String last_meeting_date: String } type TeamConversationAnalytics { average_filler_words: Float average_filler_words_diff_pct: Float average_monologues_count: Float average_monologues_count_diff_pct: Float average_questions: Float average_questions_diff_pct: Float average_sentiments: SentimentScores average_silence_duration: Float average_silence_duration_diff_pct: Float average_talk_listen_ratio: Float average_words_per_minute: Float longest_monologue_duration_sec: Float longest_monologue_duration_diff_pct: Float total_filler_words: Int total_filler_words_diff_pct: Float total_meeting_notes_count: Int total_meetings_count: Int total_monologues_count: Int total_monologues_diff_pct: Float teammates_count: Int total_questions: Int total_questions_diff_pct: Float total_silence_duration: Float total_silence_duration_diff_pct: Float } type TeamMeetingAnalytics { count: Int count_diff_pct: Float duration: Float duration_diff_pct: Float average_count: Float average_count_diff_pct: Float average_duration: Float average_duration_diff_pct: Float } type TeamAnalyticsSummary { conversation: TeamConversationAnalytics meeting: TeamMeetingAnalytics } type UserConversationAnalytics { talk_listen_pct: Float talk_listen_ratio: Float total_silence_duration: Float total_silence_duration_compare_to: Float total_silence_pct: Float total_silence_ratio: Float total_speak_duration: Float total_speak_duration_with_user: Float total_word_count: Int user_filler_words: Int user_filler_words_compare_to: Int user_filler_words_diff_pct: Float user_longest_monologue_sec: Float user_longest_monologue_compare_to: Float user_longest_monologue_diff_pct: Float user_monologues_count: Int user_monologues_count_compare_to: Int user_monologues_count_diff_pct: Float user_questions: Int user_questions_compare_to: Int user_questions_diff_pct: Float user_speak_duration: Float user_word_count: Int user_words_per_minute: Float user_words_per_minute_compare_to: Float user_words_per_minute_diff_pct: Float } type UserMeetingAnalytics { count: Int count_diff: Int count_diff_compared_to: Int count_diff_pct: Float duration: Float duration_diff: Float duration_diff_compared_to: Float duration_diff_pct: Float } type UserAnalytics { user_id: String user_name: String user_email: String conversation: UserConversationAnalytics meeting: UserMeetingAnalytics } type Analytics { team: TeamAnalyticsSummary users: [UserAnalytics] } type DeleteTranscriptResponse { id: String title: String } type AudioUploadResponse { success: Boolean title: String message: String } type AddToLiveMeetingResponse { message: String success: Boolean } type ShareMeetingResponse { success: Boolean message: String } type RevokeSharedMeetingAccessResponse { success: Boolean message: String } type CreateBiteResponse { id: ID transcript_id: String name: String start_time: Float end_time: Float summary: String status: String } # Query type type Query { # Get current authenticated user user(id: String): User # Get all users in the workspace users: [User] # Get user groups user_groups(mine: Boolean): [UserGroup] # Get a single transcript by ID transcript(id: String!): Transcript # Get a list of transcripts with optional filtering transcripts( title: String date: Float fromDate: DateTime toDate: DateTime limit: Int skip: Int host_email: String organizer_email: String participant_email: String user_id: String mine: Boolean keyword: String scope: String organizers: [String!] participants: [String!] channel_id: String ): [Transcript] # Get a single bite clip by ID bite(id: ID!): Bite # Get a list of bite clips bites( mine: Boolean transcript_id: ID my_team: Boolean limit: Int skip: Int ): [Bite] # Get AI app outputs apps( app_id: String transcript_id: String skip: Float limit: Float ): AIApps # Get AskFred threads optionally filtered by transcript askfred_threads(transcript_id: String): [AskFredThread] # Get a single AskFred thread by ID askfred_thread(id: String!): AskFredThread # Get currently active/live meetings active_meetings(input: GetActiveMeetingsInput): [ActiveMeeting] # Get workspace channels channels: [Channel] # Get a single channel by ID channel(id: ID!): Channel # Get contacts contacts: [Contact] # Get team and user analytics analytics(start_time: String, end_time: String): Analytics } # Mutation type type Mutation { # Upload an audio file for transcription uploadAudio(input: AudioUploadInput): AudioUploadResponse # Add Fireflies bot to a live meeting addToLiveMeeting( meeting_link: String! title: String meeting_password: String duration: Int language: String attendees: [AttendeeInput!] ): AddToLiveMeetingResponse # Delete a transcript deleteTranscript(id: String!): DeleteTranscriptResponse # Update the title of a meeting transcript updateMeetingTitle(input: UpdateMeetingTitleInput!): Transcript # Update the privacy setting of a meeting transcript updateMeetingPrivacy(input: UpdateMeetingPrivacyInput!): Transcript # Move a transcript to a channel updateMeetingChannel(input: UpdateMeetingChannelInput!): Transcript # Share a meeting with external users via email shareMeeting(input: ShareMeetingInput!): ShareMeetingResponse # Revoke shared access to a meeting revokeSharedMeetingAccess(input: RevokeSharedMeetingAccessInput!): RevokeSharedMeetingAccessResponse # Create a bite clip from a transcript createBite( transcript_Id: ID! name: String start_time: Float! end_time: Float! media_type: String privacies: [BitePrivacy!] summary: String ): CreateBiteResponse # Set a user's role in the workspace setUserRole(user_id: String!, role: Role!): User # Create a new AskFred AI thread createAskFredThread(input: CreateAskFredThreadInput!): AskFredThreadResult # Continue an existing AskFred AI thread continueAskFredThread(input: ContinueAskFredThreadInput!): AskFredThreadResult # Delete an AskFred AI thread deleteAskFredThread(id: String!): AskFredThread }