# Fireflies Transcript

Fetch raw Fireflies.ai meeting transcripts.

- Repository: https://github.com/davidondrej/skills (4238 stars)
- Category: Engineering
- License: MIT
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add davidondrej/skills --skill fireflies-transcript -g -a claude-code -y`
Codex: `npx skills add davidondrej/skills --skill fireflies-transcript -g -a codex -y`
Cursor: `npx skills add davidondrej/skills --skill fireflies-transcript -g -a cursor -y`
Gemini CLI: `npx skills add davidondrej/skills --skill fireflies-transcript -g -a gemini-cli -y`

## Description

Fetch raw Fireflies.ai meeting transcripts. Use only when the user explicitly invokes /fireflies-transcript; for YouTube, use youtube-transcript.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# Fireflies Transcript

Fetch any meeting transcript from Fireflies.ai as raw text via GraphQL. Read-only.

## Auth (state-check first)

Load the API key from a local environment file (mode 600, never commit or print it):

```bash
source "$SERVICE_ENV_FILE"   # exports API_KEY
[ -n "$API_KEY" ] || echo "MISSING KEY - stop and tell the user"
```

Every call is a POST to `https://api.fireflies.ai/graphql` with
`Authorization: Bearer <API_KEY>` and a JSON body `{"query": "..."}`.

## Step 1 - find the meeting id

```bash
curl -sS -X POST https://api.fireflies.ai/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <API_KEY>" \
  -d '{"query":"{ transcripts(limit: 25) { id title date duration } }"}' \
  | jq -r '.data.transcripts[] | "\(.id) | \(.title) | \(.date)"'
```

- `date` is epoch **milliseconds**. Convert on macOS: `date -r $((1784127600000/1000))`.
- The `transcripts(title:)` filter is EXACT-match, it returns `[]` for partial names.
  List recent meetings and grep locally instead.
- Ad-hoc meetings have no proper title (e.g. `Untitled - Wed, 15 Jul 2026 17:00:55 CEST`).
  Identify those by date/time, then confirm via content or speakers, not the title.
- Paginate older meetings with `skip:` (e.g. `transcripts(limit: 50, skip: 25)`).

## Step 2 - pull the raw transcript

```bash
QUERY='{ transcript(id: "MEETING_ID") { title sentences { speaker_name text } } }'
curl -sS -X POST https://api.fireflies.ai/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <API_KEY>" \
  -d "$(jq -nc --arg query "$QUERY" '{query: $query}')" \
  > /tmp/ff.json

# speaker-labeled raw text (usual deliverable)
jq -r '.data.transcript.sentences[] | "\(.speaker_name): \(.text)"' /tmp/ff.json

# bare text only
jq -r '.data.transcript.sentences[].text' /tmp/ff.json
```

Transcripts run to hundreds of sentences, save to a file, never dump to stdout/chat.

The rest: https://github.com/davidondrej/skills/blob/HEAD/skills/research-and-web/fireflies-transcript/SKILL.md
