How to bulk-export every Fireflies transcript to Markdown with a 50-line Node script
Fireflies lets you download transcripts one meeting at a time, and on the Free plan downloads are locked. If you want your whole archive (before cancelling, switching tools, or feeding it to an LLM), the Fireflies GraphQL API is the way out. Here's a small script that pulls every transcript and saves each one as a Markdown file.
Disclosure: this post is from the team behind MinuteHaul, a paid no-code exporter for Fireflies and tl;dv. The script below is free to copy and doesn't need our product. Drafted with AI assistance and checked against the Fireflies API docs.
1. Get your API key
Log in at app.fireflies.ai, open Integrations, then Fireflies API, and copy the key (Fireflies docs). Treat it like a password.
2. Know the rate limits
Fireflies documents these API limits (docs):
- Free: 30 requests a minute, 500 a day (a Free user's first API request starts a 14-day trial at Pro limits)
- Pro: 60 a minute, 5,000 a day
- Business and Enterprise: 60 a minute per paid seat, pooled, no daily cap
The script uses one request per 50 meetings listed plus one per transcript, and waits about 1.1 seconds between calls, which stays under 60 a minute. On a 429 it waits a minute and retries. If you're on Free past the trial, raise the sleep to about 2.1 seconds.
3. The script
Save as fireflies-export.mjs (Node 18+, no dependencies):
// fireflies-export.mjs: save every Fireflies transcript as Markdown.
// Usage: FIREFLIES_API_KEY=xxx node fireflies-export.mjs ./out
import { mkdir, writeFile } from "node:fs/promises";
import { join } from "node:path";
const KEY = process.env.FIREFLIES_API_KEY;
const OUT = process.argv[2] || "./fireflies-export";
if (!KEY) { console.error("Set FIREFLIES_API_KEY"); process.exit(1); }
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
async function gql(query, variables) {
for (;;) {
const res = await fetch("https://api.fireflies.ai/graphql", {
method: "POST",
headers: { "Content-Type": "application/json", Authorization: `Bearer ${KEY}` },
body: JSON.stringify({ query, variables }),
});
if (res.status === 429) { console.log("429, waiting 60s"); await sleep(60_000); continue; }
const json = await res.json();
if (json.errors) throw new Error(JSON.stringify(json.errors));
await sleep(1_100); // ~55 requests/minute, under Pro's 60
return json.data;
}
}
const LIST = `query($limit:Int,$skip:Int){transcripts(limit:$limit,skip:$skip){id title date duration}}`;
const ONE = `query($id:String!){transcript(id:$id){sentences{speaker_name text start_time}}}`;
const slug = (s) => (s || "untitled").toLowerCase().replace(/[^a-z0-9]+/g, "-").slice(0, 60);
const ts = (sec) => new Date(sec * 1000).toISOString().slice(11, 19);
await mkdir(OUT, { recursive: true });
let skip = 0, saved = 0;
for (;;) {
const { transcripts } = await gql(LIST, { limit: 50, skip });
if (!transcripts?.length) break;
for (const t of transcripts) {
const { transcript } = await gql(ONE, { id: t.id });
const day = new Date(Number(t.date)).toISOString().slice(0, 10);
const lines = (transcript?.sentences || []).map(
(s) => `**${s.speaker_name || "Speaker"}** [${ts(s.start_time)}]: ${s.text}`
);
const md = `# ${t.title}\n\nDate: ${day}\n\n${lines.join("\n\n")}\n`;
await writeFile(join(OUT, `${day}-${slug(t.title)}-${t.id}.md`), md);
console.log(`saved ${++saved}: ${t.title}`);
}
skip += 50;
}
console.log(`Done: ${saved} transcripts in ${OUT}`);
Run it:
FIREFLIES_API_KEY=your_key node fireflies-export.mjs ./fireflies-export
You get one file per meeting, named YYYY-MM-DD-title-id.md, with speaker names and timestamps.
4. Ideas to extend it
- Add
summary{overview action_items keywords}to the transcript query to keep Fireflies' AI notes. - Track saved IDs in a JSON file so re-runs skip what you already have.
- Write CSV instead of Markdown if you're importing into a spreadsheet.
Don't want to run code?
MinuteHaul does the same thing in your browser (requests go straight from your browser to Fireflies), can include the AI summaries, and gives you one ZIP with a Markdown file per meeting and an index. You can try it free on 10 meetings; after that it's $19 one-time. Fireflies support is in beta. There's also a step-by-step Fireflies bulk export guide.
Comments
Join the discussionNo comments yet. Be the first to comment.