<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[MinuteHaul Blog]]></title><description><![CDATA[MinuteHaul Blog]]></description><link>https://minutehaul.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 05 Nov 2026 17:39:50 GMT</lastBuildDate><atom:link href="https://minutehaul.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Downgrading Fireflies to Free: there's no button for it, and the download button goes away too]]></title><description><![CDATA[If you're trying to move a Fireflies account from Pro (or Business) down to Free, you'll notice the Downgrade option won't take you there. Here's how it…]]></description><link>https://minutehaul.hashnode.dev/downgrading-fireflies-to-free-there-s-no-button-for-it-and-the-download-button-goes-away-too</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/downgrading-fireflies-to-free-there-s-no-button-for-it-and-the-download-button-goes-away-too</guid><category><![CDATA[Productivity]]></category><category><![CDATA[AI]]></category><category><![CDATA[api]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Wed, 28 Oct 2026 11:16:30 GMT</pubDate><content:encoded><![CDATA[<p>If you're trying to move a Fireflies account from Pro (or Business) down to Free, you'll notice the Downgrade option won't take you there. Here's how it actually works, what you keep on Free, and what to grab before your paid cycle ends.</p>
<p><em>Disclosure: this post is from the team behind MinuteHaul, a paid exporter for tl;dv and Fireflies (Fireflies support is in beta). Drafted with AI assistance; Fireflies details come from its own help center and API docs (linked), last checked Oct 2026. Plans change, so double-check before relying on them.</em></p>
<h2>Free means cancelling</h2>
<p>Fireflies says the Downgrade option in Settings, Billing only steps Enterprise to Business or Business to Pro. To get to Free, you cancel the subscription (<a href="https://guide.fireflies.ai/articles/2097647089-how-to-downgrade-fireflies-subscription">Fireflies: how to downgrade</a>):</p>
<ol>
<li>Go to Settings, Account, Subscriptions and click Cancel next to your plan, then confirm the prompts.</li>
<li>Your paid plan keeps running until the end of the billing cycle, then the account is on Free (<a href="https://guide.fireflies.ai/articles/6637635140-how-to-cancel-fireflies-subscription">Fireflies: how to cancel</a>).</li>
<li>Only the billing admin can change the plan. If you just want fewer seats, Fireflies suggests removing teammates instead.</li>
</ol>
<h2>What changes on Free</h2>
<table>
<thead>
<tr>
<th></th>
<th>Pro and up</th>
<th>Free</th>
</tr>
</thead>
<tbody><tr>
<td>Existing meetings</td>
<td>In your notebook</td>
<td>Stay accessible within Free plan limits</td>
</tr>
<tr>
<td>Per-meeting download (transcript, summary, MP3/MP4)</td>
<td>Yes</td>
<td>No, needs Pro or higher</td>
</tr>
<tr>
<td>Account data export (one ZIP, by request)</td>
<td>Yes</td>
<td>Yes, 24 to 48 hours</td>
</tr>
<tr>
<td>API limits</td>
<td>Pro: 60/min, 5,000/day</td>
<td>30/min, 500/day</td>
</tr>
</tbody></table>
<p>Sources: <a href="https://guide.fireflies.ai/articles/3319752033-how-to-download-transcripts-summaries-and-meeting-recordings-from-fireflies">downloads</a>, <a href="https://guide.fireflies.ai/articles/8915664468-how-to-export-your-fireflies-account-data">account data export</a>, <a href="https://docs.fireflies.ai/fundamentals/limits">API limits</a>.</p>
<p>The short version: your meetings don't get deleted, but the easy way to get files out does.</p>
<h2>What to export before the cycle ends</h2>
<ul>
<li><strong>Transcripts in a format you'll actually use</strong> (Markdown, a CSV index) for search, Notion or an AI assistant. The API route is fastest while you still have paid limits.</li>
<li><strong>Recordings you'll rewatch.</strong> Download them per meeting while you're still on Pro, or request the account data export, which includes MP3 and MP4.</li>
</ul>
<p>Already on Free? The data export and the API still work, just slower.</p>
<h2>The one-ZIP option</h2>
<p>The <a href="https://minutehaul.haullabs.dev/app.html?source=fireflies&amp;utm_source=hashnode&amp;utm_campaign=fireflies-downgrade">MinuteHaul web exporter</a> uses Fireflies' official API from your browser with your own key, and works on the Free plan too. You get one ZIP with a speaker-labeled Markdown transcript per meeting plus an index.csv. It exports transcripts and metadata, not audio or video. Your 10 most recent meetings are free, then $19 one-time with a 14-day refund.</p>
<p>Full guide with FAQ: <a href="https://minutehaul.haullabs.dev/guides/fireflies-downgrade-to-free.html?utm_source=hashnode&amp;utm_campaign=fireflies-downgrade">Fireflies downgrade to Free: what you keep, what you lose</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Fireflies to CSV: one meeting is easy, all of them takes a workaround]]></title><description><![CDATA[If you want every Fireflies meeting in one spreadsheet (titles, dates, participants, and a pointer to each transcript), there's no "export all to CSV"…]]></description><link>https://minutehaul.hashnode.dev/fireflies-to-csv-one-meeting-is-easy-all-of-them-takes-a-workaround</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/fireflies-to-csv-one-meeting-is-easy-all-of-them-takes-a-workaround</guid><category><![CDATA[Productivity]]></category><category><![CDATA[api]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Wed, 28 Oct 2026 03:20:05 GMT</pubDate><content:encoded><![CDATA[<p>If you want every Fireflies meeting in one spreadsheet (titles, dates, participants, and a pointer to each transcript), there's no "export all to CSV" button. Here are the three ways that actually work, and what each one costs you in time.</p>
<p><em>Disclosure: this post is from the team behind MinuteHaul, a paid exporter for tl;dv and Fireflies (Fireflies support is in beta). Drafted with AI assistance; Fireflies details come from its own help center and API docs (linked), last checked Oct 2026. Plans change, so double-check before relying on them.</em></p>
<h2>What Fireflies gives you natively</h2>
<ol>
<li><strong>One transcript at a time as CSV.</strong> Open a meeting, click Download, choose Transcript, and pick CSV (PDF, DOCX, SRT, JSON and MD are also offered), with optional timestamps and speaker labels. Fireflies says downloads are on Pro plans and higher, and the button is disabled otherwise (<a href="https://guide.fireflies.ai/articles/3319752033-how-to-download-transcripts-summaries-and-meeting-recordings-from-fireflies">Fireflies help</a>).</li>
<li><strong>The whole-account data export.</strong> Free for all users on request. A ZIP link arrives within 24 to 48 hours and stays valid for 7 days. It holds audio, video if available, TXT transcripts and summaries, attendee info and JSON metadata, but no CSV (<a href="https://guide.fireflies.ai/articles/8915664468-how-to-export-your-fireflies-account-data">Fireflies help</a>).</li>
</ol>
<p>So for a spreadsheet of everything you'd either download hundreds of files one by one or parse the JSON yourself.</p>
<h2>Option: build it from the API</h2>
<p>The API works on every plan with your own key. Per Fireflies' <a href="https://docs.fireflies.ai/fundamentals/limits">limits page</a>, Free is capped at 30 requests per minute and 500 per day (your first 14 days as an API user run at Pro limits), Pro at 60 per minute and 5,000 per day. List transcripts, fetch each one, and write one row per meeting. Keep the full transcripts in separate files, since a whole call in one spreadsheet cell isn't useful.</p>
<h2>Option: an exporter</h2>
<p>The <a href="https://minutehaul.haullabs.dev/app.html?source=fireflies&amp;utm_source=hashnode&amp;utm_campaign=fireflies-csv">MinuteHaul web exporter</a> runs in your browser with your own Fireflies API key and builds one ZIP with:</p>
<ul>
<li>index.csv, one row per meeting: id, title, date, duration_sec, organizer, participants, file, status. Meetings without a transcript are listed as skipped, not dropped.</li>
<li>One speaker-labeled Markdown transcript per meeting, which the file column points to.</li>
<li>Optional all-transcripts.txt and all.jsonl (one line per spoken segment, if you want a row per line).</li>
</ul>
<p>It exports transcripts and metadata, not audio or video. Your 10 most recent meetings are free, then $19 one-time.</p>
<table>
<thead>
<tr>
<th>Method</th>
<th>All meetings at once</th>
<th>CSV</th>
<th>Wait</th>
</tr>
</thead>
<tbody><tr>
<td>Per-meeting download</td>
<td>No</td>
<td>Yes, one file each</td>
<td>Instant</td>
</tr>
<tr>
<td>Account data export</td>
<td>Yes</td>
<td>No (TXT + JSON)</td>
<td>24 to 48 h</td>
</tr>
<tr>
<td>API script</td>
<td>Yes</td>
<td>You write it</td>
<td>Your build time</td>
</tr>
<tr>
<td>MinuteHaul (beta)</td>
<td>Yes</td>
<td>index.csv</td>
<td>Minutes</td>
</tr>
</tbody></table>
<p>Full guide with FAQ: <a href="https://minutehaul.haullabs.dev/guides/fireflies-transcripts-to-csv.html?utm_source=hashnode&amp;utm_campaign=fireflies-csv">Export Fireflies transcripts to CSV</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Asking NotebookLM about all your tl;dv meetings: the source limits, and how to fit hundreds of calls in]]></title><description><![CDATA["What did customers say about pricing this quarter?" is a great question for an AI notebook, as long as it can see every meeting. Getting a tl;dv history…]]></description><link>https://minutehaul.hashnode.dev/asking-notebooklm-about-all-your-tl-dv-meetings-the-source-limits-and-how-to-fit-hundreds-of-calls-in</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/asking-notebooklm-about-all-your-tl-dv-meetings-the-source-limits-and-how-to-fit-hundreds-of-calls-in</guid><category><![CDATA[Productivity]]></category><category><![CDATA[AI]]></category><category><![CDATA[api]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Wed, 28 Oct 2026 01:19:55 GMT</pubDate><content:encoded><![CDATA[<p>"What did customers say about pricing this quarter?" is a great question for an AI notebook, as long as it can see every meeting. Getting a tl;dv history into NotebookLM is mostly a files problem: the per-notebook source cap is lower than most people's meeting count. Here's how to get around it.</p>
<p><em>Disclosure: this post is from the team behind MinuteHaul, a paid exporter for tl;dv and Fireflies. The steps work with any export method. Drafted with AI assistance; NotebookLM details come from Google's own help center (linked), last checked Oct 2026. Limits change, so double-check before relying on them.</em></p>
<h2>The limits that matter</h2>
<p>Google's help center now calls the product Gemini Notebook. Per its <a href="https://support.google.com/notebooklm/answer/16215270">sources article</a> and <a href="https://support.google.com/notebooklm/answer/16269187">FAQ</a>:</p>
<ol>
<li>Supported uploads include TXT, Markdown (MD), CSV, PDF and DOCX.</li>
<li>Each source can be up to 500,000 words or 200 MB.</li>
<li>A notebook holds 50 sources on the free plan; paid plans list 100, 300, 500 or 600.</li>
</ol>
<p>So 300 one-meeting files won't fit in a free notebook, but a handful of combined files will. As a rough estimate (ours, not Google's), conversation runs about 130 to 160 words per minute, so one 500,000-word source holds very roughly 50 or more hours of meetings.</p>
<h2>Step 1: get the transcripts out as text</h2>
<p>tl;dv's help center says it doesn't currently support bulk transcript downloads or exports. Your options are downloading meetings one at a time, scripting the tl;dv API, or using an exporter. API access needs the meeting organizer on tl;dv Pro, Business or Enterprise, per tl;dv's API docs.</p>
<h2>Step 2: combine into a few big files</h2>
<p>Merge the transcripts into text files that each stay under 500,000 words, with a clear header per meeting (title, date, participants) so the notebook can cite the right call. Keep a separate CSV index of meetings if you want date and participant lookups.</p>
<p>The <a href="https://minutehaul.haullabs.dev/app.html?source=tldv&amp;utm_source=hashnode&amp;utm_campaign=tldv-notebooklm">MinuteHaul web exporter</a> does steps 1 and 2 from your own API key: it writes an all-transcripts.txt split into parts of about 400,000 words, plus one Markdown file per meeting and an index.csv. Your 10 most recent meetings are free, then $19 one-time with a 14-day refund.</p>
<h2>Step 3: load them</h2>
<ol>
<li>Create a notebook.</li>
<li>Add each combined part as a source.</li>
<li>Optionally add index.csv as another source.</li>
</ol>
<table>
<thead>
<tr>
<th>Approach</th>
<th>Sources used</th>
<th>Fits a free notebook?</th>
</tr>
</thead>
<tbody><tr>
<td>One file per meeting</td>
<td>One per meeting</td>
<td>Only up to 50 meetings</td>
</tr>
<tr>
<td>Combined parts under 500k words</td>
<td>A few</td>
<td>Yes, for most histories</td>
</tr>
</tbody></table>
<p>Full guide with FAQ: <a href="https://minutehaul.haullabs.dev/guides/tldv-transcripts-to-notebooklm.html?utm_source=hashnode&amp;utm_campaign=tldv-notebooklm">Load tl;dv transcripts into NotebookLM</a>.</p>
]]></content:encoded></item><item><title><![CDATA[tl;dv to Notion: new meetings sync automatically, but here's how to get your old ones in too]]></title><description><![CDATA[tl;dv's Notion integration is handy for meetings going forward. The catch is your existing history: the workflows fire when a recording is ready, so…]]></description><link>https://minutehaul.hashnode.dev/tl-dv-to-notion-new-meetings-sync-automatically-but-here-s-how-to-get-your-old-ones-in-too</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/tl-dv-to-notion-new-meetings-sync-automatically-but-here-s-how-to-get-your-old-ones-in-too</guid><category><![CDATA[Productivity]]></category><category><![CDATA[notion]]></category><category><![CDATA[api]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Wed, 28 Oct 2026 00:19:25 GMT</pubDate><content:encoded><![CDATA[<p>tl;dv's Notion integration is handy for meetings going forward. The catch is your existing history: the workflows fire when a recording is ready, so nothing goes back and fills in the meetings you already have. Here's what each route covers and how to bring the backlog over.</p>
<p><em>Disclosure: this post is from the team behind MinuteHaul, a paid exporter for tl;dv and Fireflies. Options 1 and 2 don't need it. Drafted with AI assistance; tl;dv, Zapier and Notion details come from their own docs (linked), last checked Oct 17, 2026. Integrations change, so double-check before relying on it.</em></p>
<h2>Option 1: tl;dv's native Notion workflows (new meetings)</h2>
<p>tl;dv has a native Notion integration under Integrations, then Notion. Per <a href="https://intercom.help/tldv/en/articles/14292849-notion-native-integration">tl;dv's help article</a>, its workflows run "when a recording is ready" and can create a page, append to a page, or add a database item with the title, AI notes, transcript, participants, date, URL and duration.</p>
<p>Because the trigger is a new recording, it covers meetings from now on. The article describes no backfill of past meetings.</p>
<h2>Option 2: Zapier (also new meetings)</h2>
<p>Zapier lists tl;dv triggers such as "Transcript Added" and templates like "Create pages in Notion for new tl;dv transcripts" (<a href="https://zapier.com/apps/tldv/integrations">Zapier</a>). These also fire on new events, not on meetings that already exist.</p>
<h2>Option 3: your whole history, via a Notion ZIP import</h2>
<p>Notion can import a ZIP: type /zip on a page, or go to Settings, then Import, then "Convert Zip to pages". Markdown files become pages and CSV files become databases (<a href="https://www.notion.com/help/import-data-into-notion">Notion Help</a>). Notion notes that very high file counts (10,000+) may fail, so split big archives.</p>
<ol>
<li>Export your transcripts as Markdown files: one by one, through the tl;dv API, or with an exporter.</li>
<li>Put them in one folder and zip the folder itself, not loose files.</li>
<li>In Notion, use "Convert Zip to pages".</li>
<li>Optionally import a CSV index separately to get a searchable database of every meeting.</li>
</ol>
<p>tl;dv's help center says "Right now, we don't support bulk transcript downloads or exports", so step 1 is the hard part. If you don't want to script the API, the <a href="https://minutehaul.haullabs.dev/app.html?source=tldv&amp;utm_source=hashnode&amp;utm_campaign=tldv-notion">MinuteHaul web exporter</a> produces that ZIP from your own API key: one Markdown file per meeting (title, date, participants, tl;dv link, speaker-labeled transcript with timestamps), an index.csv, and an optional all-transcripts.txt for ChatGPT, Claude or NotebookLM. Your 10 most recent meetings are free, then $19 one-time with a 14-day refund. API access needs the meeting organizer on tl;dv Pro, Business or Enterprise, per tl;dv's API docs.</p>
<h2>Which one?</h2>
<table>
<thead>
<tr>
<th>Route</th>
<th>Covers</th>
<th>Cost</th>
</tr>
</thead>
<tbody><tr>
<td>tl;dv native Notion workflows</td>
<td>New meetings</td>
<td>Depends on your tl;dv plan</td>
</tr>
<tr>
<td>Zapier</td>
<td>New meetings</td>
<td>Zapier plan</td>
</tr>
<tr>
<td>Markdown ZIP + Notion import</td>
<td>Your whole history</td>
<td>Free if you script it; MinuteHaul 10 free, then $19 once</td>
</tr>
</tbody></table>
<p>The usual setup is both: turn on the native workflow for new meetings, and do a one-time ZIP import for the backlog.</p>
<p>Full guide with FAQ: <a href="https://minutehaul.haullabs.dev/guides/tldv-export-to-notion.html?utm_source=hashnode&amp;utm_campaign=tldv-notion">Export tl;dv transcripts to Notion</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Fireflies Free plan: why Download is greyed out, and 3 free ways to get your transcripts anyway]]></title><description><![CDATA[On Fireflies' Free plan the Download button on a meeting is disabled. Fireflies' own troubleshooting answer is "downloads require a Pro plan or higher"…]]></description><link>https://minutehaul.hashnode.dev/fireflies-free-plan-why-download-is-greyed-out-and-3-free-ways-to-get-your-transcripts-anyway</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/fireflies-free-plan-why-download-is-greyed-out-and-3-free-ways-to-get-your-transcripts-anyway</guid><category><![CDATA[Productivity]]></category><category><![CDATA[AI]]></category><category><![CDATA[api]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Tue, 27 Oct 2026 23:18:45 GMT</pubDate><content:encoded><![CDATA[<p>On Fireflies' Free plan the Download button on a meeting is disabled. Fireflies' own troubleshooting answer is "downloads require a Pro plan or higher". Your transcripts aren't locked in, though. Here are the routes that work without upgrading.</p>
<p><em>Disclosure: this post is from the team behind MinuteHaul, a paid exporter for Fireflies and tl;dv. Options 1 and 2 don't need it. Drafted with AI assistance; Fireflies details come from Fireflies' own help docs and API docs (linked), last checked Oct 18, 2026. Plans change, so double-check before relying on it.</em></p>
<h2>Why the button is greyed out</h2>
<p>Fireflies' download guide answers "Why is the Download button disabled?" with "Check your plan - downloads require a Pro plan or higher". On Pro and above, a single meeting downloads as PDF, DOCX, SRT, CSV, JSON or MD. Source: <a href="https://guide.fireflies.ai/articles/3319752033-how-to-download-transcripts-summaries-and-meeting-recordings-from-fireflies">How to download transcripts, summaries and recordings</a>.</p>
<h2>Option 1: the free account data export (everything, in 1 to 2 days)</h2>
<p>Fireflies says it supports full data exports for all users on request (<a href="https://guide.fireflies.ai/articles/8915664468-how-to-export-your-fireflies-account-data">Fireflies guide</a>):</p>
<ol>
<li>Fill in Fireflies' data request form.</li>
<li>Approve the confirmation email (from <a href="mailto:fred@fireflies.ai">fred@fireflies.ai</a>, subject "Action Required – Confirm Your Data Export Request").</li>
<li>Within 24 to 48 hours you get a link to a ZIP with every meeting: TXT transcripts with speakers, AI summaries, audio (MP3), video (MP4 if recorded), attendee details and JSON metadata. The link expires after 7 days.</li>
</ol>
<p>If you can wait a day or two, start here.</p>
<h2>Option 2: the Fireflies API (free, needs a script)</h2>
<p>Every plan gets API access. Free is limited to 30 requests a minute and 500 a day, and a Free user's first API request starts a 14-day trial at Pro limits (60 a minute, 5,000 a day) (<a href="https://docs.fireflies.ai/fundamentals/limits">Fireflies API limits</a>). The key is under Integrations, then Fireflies API. The transcripts query returns up to 50 meetings per call; page with skip (<a href="https://docs.fireflies.ai/graphql-api/query/transcripts">API docs</a>):</p>
<pre><code class="language-bash">curl -s https://api.fireflies.ai/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{"query":"{ transcripts(limit: 50, skip: 0) { id title date sentences { speaker_name text start_time } } }"}'
</code></pre>
<p>Then fetch each transcript and write it to files yourself.</p>
<h2>Option 3: no-code, files in minutes</h2>
<p>If you don't want to write the script, the <a href="https://minutehaul.haullabs.dev/app.html?source=fireflies&amp;utm_source=hashnode&amp;utm_campaign=fireflies-free-download">MinuteHaul web exporter</a> (Fireflies source in beta) uses the same API from your browser with your own key. You get one ZIP: a Markdown file per meeting with speakers and timestamps, an index.csv, and an all-transcripts.txt for ChatGPT, Claude or NotebookLM. It takes about one API request per meeting, so the Free plan's 500 a day covers roughly 490 meetings. Your 10 most recent meetings are free, then $19 one-time with a 14-day refund.</p>
<h2>Which one?</h2>
<table>
<thead>
<tr>
<th>Method</th>
<th>Cost</th>
<th>Speed</th>
<th>What you get</th>
</tr>
</thead>
<tbody><tr>
<td>Account data export</td>
<td>Free</td>
<td>24 to 48 hours</td>
<td>TXT transcripts and summaries, audio, video, JSON</td>
</tr>
<tr>
<td>API + your own script</td>
<td>Free</td>
<td>As fast as you code it</td>
<td>Whatever you write</td>
</tr>
<tr>
<td>MinuteHaul</td>
<td>10 free, then $19 once</td>
<td>Minutes</td>
<td>Markdown per meeting, CSV index, combined TXT</td>
</tr>
<tr>
<td>Upgrade to Pro</td>
<td>Fireflies' Pro price</td>
<td>One meeting at a time</td>
<td>PDF, DOCX, SRT, CSV, JSON or MD</td>
</tr>
</tbody></table>
<p>Full guide with FAQ: <a href="https://minutehaul.haullabs.dev/guides/download-fireflies-transcripts-free-plan.html?utm_source=hashnode&amp;utm_campaign=fireflies-free-download">Download Fireflies transcripts on the Free plan</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Fireflies to Notion: getting transcripts (and old meetings) in, including on the Free plan]]></title><description><![CDATA[Fireflies has a Notion integration, but one detail trips people up: Fireflies says saving meeting transcripts to Notion needs Pro or higher. Here's how the…]]></description><link>https://minutehaul.hashnode.dev/fireflies-to-notion-getting-transcripts-and-old-meetings-in-including-on-the-free-plan</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/fireflies-to-notion-getting-transcripts-and-old-meetings-in-including-on-the-free-plan</guid><category><![CDATA[Productivity]]></category><category><![CDATA[notion]]></category><category><![CDATA[api]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Tue, 27 Oct 2026 22:19:51 GMT</pubDate><content:encoded><![CDATA[<p>Fireflies has a Notion integration, but one detail trips people up: Fireflies says saving meeting transcripts to Notion needs Pro or higher. Here's how the integration works, how to push old meetings, and what to do if you're on Free.</p>
<p><em>Disclosure: this post is from the team behind MinuteHaul, a paid exporter for Fireflies and tl;dv. The integration route below doesn't need it. Drafted with AI assistance; Fireflies and Notion details come from their own help docs (linked), last checked Oct 18, 2026. Plans change, so double-check before relying on it.</em></p>
<h2>On Pro or higher: the built-in integration</h2>
<ol>
<li>In Fireflies, open Integrations, search for Notion and click Connect.</li>
<li>Sign in to Notion, review the permissions, and either let Fireflies create a database from its template or pick an existing page to hold meetings as sub-pages.</li>
<li>Back in Fireflies, select the page or database. For a database, Fireflies adds missing columns and doesn't overwrite existing ones.</li>
<li>Turn on Save meeting summaries and Save meeting transcripts.</li>
<li>Click Create a sample note to check the setup.</li>
</ol>
<p>Source: <a href="https://guide.fireflies.ai/articles/7891929161-how-to-integrate-fireflies-with-notion">How to integrate Fireflies with Notion</a>.</p>
<h2>Old meetings: Push past meetings</h2>
<p>New meetings sync once the integration is on. For older ones, open the Notion integration page, click Push past meetings, pick the last 7, 14, 30, 60 or 90 days or a custom range, choose which meetings, and push. You need at least one push configuration set up first (same Fireflies guide).</p>
<h2>On the Free plan: go through files</h2>
<p>Since transcripts to Notion need a paid plan, Free accounts can use files instead:</p>
<ol>
<li>Export each transcript as Markdown through the Fireflies API. Every plan has API access, and Free allows 30 requests a minute and 500 a day (<a href="https://docs.fireflies.ai/fundamentals/limits">Fireflies API limits</a>).</li>
<li>Zip the folder and use Notion's import, which accepts Markdown files and ZIP archives (<a href="https://www.notion.com/help/import-data-into-notion">Notion help</a>). Each file becomes one Notion page.</li>
</ol>
<p>You can script step 1 yourself, or use the <a href="https://minutehaul.haullabs.dev/app.html?source=fireflies&amp;utm_source=hashnode&amp;utm_campaign=fireflies-notion">MinuteHaul web exporter</a> (Fireflies source in beta). It runs in your browser with your own API key and builds one ZIP: a Markdown file per meeting, an index.csv and an all-transcripts.txt, ready for Notion's import. Your 10 most recent meetings are free, then $19 one-time with a 14-day refund.</p>
<p>More detail: <a href="https://minutehaul.haullabs.dev/guides/fireflies-to-notion.html?utm_source=hashnode&amp;utm_campaign=fireflies-notion">Fireflies to Notion guide</a>.</p>
<p><em>MinuteHaul is independent and not affiliated with Fireflies or Notion.</em></p>
]]></content:encoded></item><item><title><![CDATA[Cancel or delete Fireflies? What happens to your transcripts, and how to save them first]]></title><description><![CDATA[If you're leaving Fireflies, the button you click matters. Cancelling your subscription keeps your meetings. Deleting your account erases them for good…]]></description><link>https://minutehaul.hashnode.dev/cancel-or-delete-fireflies-what-happens-to-your-transcripts-and-how-to-save-them-first</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/cancel-or-delete-fireflies-what-happens-to-your-transcripts-and-how-to-save-them-first</guid><category><![CDATA[Productivity]]></category><category><![CDATA[AI]]></category><category><![CDATA[api]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Tue, 27 Oct 2026 21:25:18 GMT</pubDate><content:encoded><![CDATA[<p>If you're leaving Fireflies, the button you click matters. Cancelling your subscription keeps your meetings. Deleting your account erases them for good after 30 days. Here's the difference, and three ways to save everything before you go.</p>
<p><em>Disclosure: this post is from the team behind MinuteHaul, a paid exporter for Fireflies and tl;dv. Two of the three routes below don't need it. Drafted with AI assistance; every Fireflies detail comes from Fireflies' own help center and API docs (linked), last checked Oct 18, 2026. Plans change, so double-check before relying on it.</em></p>
<h2>Cancel vs delete</h2>
<table>
<thead>
<tr>
<th></th>
<th>Cancel subscription</th>
<th>Delete account</th>
</tr>
</thead>
<tbody><tr>
<td>When it takes effect</td>
<td>Paid features run to the end of the billing cycle, then the account switches to Free</td>
<td>Account is deactivated immediately</td>
</tr>
<tr>
<td>Your meetings and transcripts</td>
<td>Stay accessible within Free plan limits</td>
<td>Permanently deleted after a 30-day grace period</td>
</tr>
<tr>
<td>Can you undo it?</td>
<td>Resubscribe any time</td>
<td>Only by contacting support within the 30 days</td>
</tr>
</tbody></table>
<p>Sources: <a href="https://guide.fireflies.ai/articles/6637635140-how-to-cancel-fireflies-subscription">How to cancel your Fireflies subscription</a> and <a href="https://guide.fireflies.ai/articles/7418886518-how-to-delete-fireflies-account">How to delete your Fireflies account</a>.</p>
<p>If you only want to stop paying, cancel. If you want to delete, export first.</p>
<h2>Three ways to save everything</h2>
<p><strong>1. Fireflies' account data export (everything, 1 to 2 days).</strong> Fill in Fireflies' data request form and approve the confirmation email. Within 24 to 48 hours you get a link to a ZIP with transcripts (TXT, with speakers), AI summaries, audio, video where available, attendee details and JSON metadata. The link is valid for 7 days (<a href="https://guide.fireflies.ai/articles/8915664468-how-to-export-your-fireflies-account-data">Fireflies guide</a>). It's the only route that includes recordings, so request it before you delete.</p>
<p><strong>2. Download meetings one at a time (Pro or higher).</strong> Each meeting downloads as PDF, DOCX, SRT, CSV, JSON or MD on a paid plan (<a href="https://guide.fireflies.ai/articles/3319752033-how-to-download-transcripts-summaries-and-meeting-recordings-from-fireflies">Fireflies guide</a>). Fine for a handful, slow for hundreds.</p>
<p><strong>3. The API (minutes, works on Free).</strong> Every plan gets API access; Free allows 30 requests a minute and 500 a day (<a href="https://docs.fireflies.ai/fundamentals/limits">Fireflies API limits</a>). At one request per meeting, roughly 490 meetings fit in one UTC day on Free; split bigger accounts by date range. You can script it yourself, or use the <a href="https://minutehaul.haullabs.dev/app.html?source=fireflies&amp;utm_source=hashnode&amp;utm_campaign=fireflies-delete">MinuteHaul web exporter</a> (Fireflies source is in beta), which runs from your browser and builds one ZIP: a Markdown file per meeting, an index.csv and an all-transcripts.txt. It exports transcripts (plus overview, action items and keywords if you tick that box), not audio or video. Your 10 most recent meetings are free, then $19 one-time with a 14-day refund.</p>
<h2>Checklist before you click Delete</h2>
<ol>
<li>Request the Fireflies data export if you want recordings, and wait for the email.</li>
<li>Export transcripts as files so you have a searchable copy right away.</li>
<li>Compare the number of exported meetings with the count in Fireflies, and open a few files to check speakers and timestamps.</li>
<li>Store the archive somewhere you control (a drive, Notion or Obsidian).</li>
<li>Revoke your API key from anything that used it, then delete the account under Settings, Account, Delete my account (<a href="https://guide.fireflies.ai/articles/7418886518-how-to-delete-fireflies-account">Fireflies guide</a>).</li>
</ol>
<p>More detail: <a href="https://minutehaul.haullabs.dev/guides/delete-fireflies-account-keep-transcripts.html?utm_source=hashnode&amp;utm_campaign=fireflies-delete">Before you delete Fireflies: save every transcript</a>.</p>
<p><em>MinuteHaul is independent and not affiliated with Fireflies.</em></p>
]]></content:encoded></item><item><title><![CDATA[tl;dv Free deletes recordings in batches on the 1st (next: Nov 1). What to save, and how]]></title><description><![CDATA[If you're on tl;dv's Free plan, or about to downgrade to it, this is the one retention rule worth knowing before the next batch on November 1: Free-plan…]]></description><link>https://minutehaul.hashnode.dev/tl-dv-free-deletes-recordings-in-batches-on-the-1st-next-nov-1-what-to-save-and-how</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/tl-dv-free-deletes-recordings-in-batches-on-the-1st-next-nov-1-what-to-save-and-how</guid><category><![CDATA[Productivity]]></category><category><![CDATA[AI]]></category><category><![CDATA[api]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Tue, 27 Oct 2026 19:21:13 GMT</pubDate><content:encoded><![CDATA[<p>If you're on tl;dv's Free plan, or about to downgrade to it, this is the one retention rule worth knowing before the next batch on <strong>November 1</strong>: Free-plan recordings are kept for 3 months, then deleted in monthly batches on the 1st of each month, and you can only download them during the 4 weeks before deletion.</p>
<p><em>Disclosure: this post is from the team behind MinuteHaul, a paid exporter for tl;dv and Fireflies. The steps below work without it. Drafted with AI assistance; every plan detail comes from tl;dv's own help center (linked), checked Oct 27, 2026. Plans change, so double-check before relying on it.</em></p>
<h2>What tl;dv's help center says</h2>
<table>
<thead>
<tr>
<th></th>
<th>Pro / Business</th>
<th>Free</th>
</tr>
</thead>
<tbody><tr>
<td>Recording storage</td>
<td>Kept while you stay a customer</td>
<td>3 months, then scheduled for deletion; batches run on the 1st, email 4 weeks before (<a href="https://intercom.help/tldv/en/articles/8460967-how-long-do-you-keep-my-recordings">tl;dv</a>)</td>
</tr>
<tr>
<td>Downloading recordings</td>
<td>Yes, per meeting</td>
<td>Only in the 4-week window before deletion (<a href="https://intercom.help/tldv/en/articles/8460967-how-long-do-you-keep-my-recordings">tl;dv</a>)</td>
</tr>
<tr>
<td>API (the only bulk transcript route)</td>
<td>Yes</td>
<td>No: Pro or Business only, and it follows the meeting organizer's plan (<a href="https://intercom.help/tldv/en/articles/11583137-api">tl;dv</a>)</td>
</tr>
<tr>
<td>AI notes</td>
<td>Unlimited</td>
<td>Full notes on your first 10 meetings, then only the first 10 minutes of each (<a href="https://intercom.help/tldv/en/articles/8919450-what-are-the-limits-of-the-free-plan">tl;dv</a>)</td>
</tr>
</tbody></table>
<p>One gap worth knowing: tl;dv's help center doesn't spell out how recordings you made while on Pro are treated after a downgrade. Since deletion is announced only 4 weeks ahead and there's no download outside that window, the safe assumption is that everything falls under Free retention.</p>
<h2>If you're still on Pro or Business</h2>
<p>Export before the plan ends, because the API stops working on Free.</p>
<ol>
<li><strong>Transcripts, in bulk.</strong> The app has no bulk transcript download; the API is the bulk route. Get a key under Settings, Personal settings, API keys, then run our free single-file CLI (Node 18+, MIT):</li>
</ol>
<pre><code class="language-bash">curl -O https://minutehaul.haullabs.dev/cli/minutehaul.mjs
export TLDV_API_KEY=your_key
node minutehaul.mjs --out ./tldv-export --notes
</code></pre>
<p>You get one Markdown file per meeting, an <code>index.csv</code> and an <code>all-transcripts.txt</code>.</p>
<p><strong>2. Recordings you'll actually rewatch.</strong> Download them one at a time as MP4 from each meeting.</p>
<p><strong>3. Team meetings.</strong> API access follows the organizer's plan, so each paid organizer exports their own meetings before the team downgrades.</p>
<p>Then downgrade: Settings, Plan &amp; Billing, Manage subscription, then Cancel or pause plan on the Stripe page (<a href="https://intercom.help/tldv/en/articles/9093792-how-to-stop-tl-dv">tl;dv</a>).</p>
<h2>If you're already on Free and got the deletion email</h2>
<p>Download the affected recordings inside the 4-week window tl;dv opens before the deletion date. Outside that window, Free-plan recordings can't be downloaded, even by a Pro user.</p>
<h2>No-code option</h2>
<p>If you'd rather not run a script, the <a href="https://minutehaul.haullabs.dev/app.html?source=tldv&amp;utm_source=hashnode&amp;utm_campaign=nov1-tldv">MinuteHaul web exporter</a> uses tl;dv's official API from your browser and builds one ZIP (Markdown per meeting, index.csv, all-transcripts.txt). It needs Pro or Business API access too. Your 10 most recent meetings are free, then $19 one-time for everything, with a 14-day refund.</p>
<p>More detail: <a href="https://minutehaul.haullabs.dev/guides/tldv-downgrade-to-free.html?utm_source=hashnode&amp;utm_campaign=nov1-tldv">tl;dv downgrade to Free: what you keep and what gets deleted</a>.</p>
<p><em>MinuteHaul is independent and not affiliated with tl;dv.</em></p>
]]></content:encoded></item><item><title><![CDATA[Fireflies vs tl;dv: how to get ALL your transcripts out (side-by-side, Oct 2026)]]></title><description><![CDATA[If you're switching meeting recorders, or just want your whole call history as files you own, the two tools behave very differently. Fireflies has a free…]]></description><link>https://minutehaul.hashnode.dev/fireflies-vs-tl-dv-how-to-get-all-your-transcripts-out-side-by-side-oct-2026</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/fireflies-vs-tl-dv-how-to-get-all-your-transcripts-out-side-by-side-oct-2026</guid><category><![CDATA[Productivity]]></category><category><![CDATA[AI]]></category><category><![CDATA[api]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Tue, 27 Oct 2026 00:21:50 GMT</pubDate><content:encoded><![CDATA[<p>If you're switching meeting recorders, or just want your whole call history as files you own, the two tools behave very differently. Fireflies has a free "send me everything" export. tl;dv doesn't have a bulk download at all yet. Here's what each one lets you take out, side by side.</p>
<p><em>Disclosure: this post is from the team behind MinuteHaul, a paid exporter for tl;dv and Fireflies (not affiliated with either). Everything below works without our product. Drafted with AI assistance and checked against each vendor's own help center and API docs; plans and limits change, so double-check before you cancel anything.</em></p>
<h2>Side by side</h2>
<table>
<thead>
<tr>
<th></th>
<th>Fireflies</th>
<th>tl;dv</th>
</tr>
</thead>
<tbody><tr>
<td>Bulk "export everything"</td>
<td>Yes: free account data request, any plan, download link in 24-48h, valid 7 days</td>
<td>No. Help center: "Right now, we don't support bulk transcript downloads or exports" ("Allow downloading meetings in bulk" marked in progress on its feature board, checked Oct 16, 2026)</td>
</tr>
<tr>
<td>What the bulk ZIP holds</td>
<td>Audio (MP3), video (MP4 if available), transcripts as TXT with speakers, AI summaries as TXT, attendee details</td>
<td>n/a</td>
</tr>
<tr>
<td>One meeting at a time</td>
<td>Download icon: PDF, DOCX, SRT, CSV, JSON or MD; Fireflies' guide says Pro plan or higher</td>
<td>Copy from the transcript tab; downloading needs Pro or Enterprise for both the meeting owner and the downloader</td>
</tr>
<tr>
<td>API</td>
<td>GraphQL; <code>transcripts</code> returns max 50 per call, page with <code>skip</code>, filter with <code>fromDate</code>/<code>toDate</code></td>
<td>REST <code>v1alpha1</code> (labelled alpha); <code>x-api-key</code> header; Pro, Business, Enterprise; no API for meetings organized by Free users</td>
</tr>
<tr>
<td>API rate limits</td>
<td>Free 30/min and 500/day; Pro 60/min and 5,000/day; Business/Enterprise 60/min per paid seat, no daily cap</td>
<td>Back off when rate-limited; check tl;dv's API docs for current values</td>
</tr>
</tbody></table>
<h2>If you use Fireflies</h2>
<p>Can you wait a day or two? Use the free account data export first. It's the most complete thing you'll get (it includes audio and video). Use the API only if you need the files now, filtered by date, or in a different shape:</p>
<pre><code class="language-bash">curl -X POST https://api.fireflies.ai/graphql \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{"query":"{ transcripts(limit: 50, skip: 0) { id title date sentences { speaker_name text start_time } } }"}'
</code></pre>
<p>Increase <code>skip</code> by 50 until you get an empty list. Remember the export link expires after 7 days, so download it promptly.</p>
<h2>If you use tl;dv</h2>
<p>There's no bulk button, so it's copy-paste or the API:</p>
<pre><code>GET /v1alpha1/meetings                          -&gt; list meetings (paginated)
GET /v1alpha1/meetings/{meetingId}/transcript   -&gt; transcript per meeting
</code></pre>
<p>Page until no meetings come back, write each transcript to a file, and back off on rate limits. If you organize meetings on the Free plan, the API won't return them, so export what you need before you downgrade.</p>
<h2>The order that avoids losing anything</h2>
<ol>
<li>Export first, cancel second, so the plan (and its download or API access) doesn't end before the export does.</li>
<li>Check that the file count matches the meeting count in the app.</li>
<li>Keep one plain-text copy (TXT or Markdown). It opens anywhere and works in ChatGPT, Claude or NotebookLM.</li>
</ol>
<h2>If you don't want to write the loop</h2>
<p><a href="https://minutehaul.haullabs.dev/?utm_source=hashnode&amp;utm_campaign=ff-vs-tldv-export">MinuteHaul</a> runs the API loop in your browser for tl;dv (and Fireflies, in beta) and gives you one ZIP: a Markdown file per meeting plus an <code>index.csv</code>. It stores no meeting data. Your 10 most recent meetings are free; $19 one-time unlocks the rest.</p>
<p>Full guides with sources:</p>
<ul>
<li><a href="https://minutehaul.haullabs.dev/guides/fireflies-bulk-export-transcripts.html?utm_source=hashnode&amp;utm_campaign=ff-vs-tldv-export">How to bulk export Fireflies transcripts</a></li>
<li><a href="https://minutehaul.haullabs.dev/guides/bulk-export-tldv-transcripts.html?utm_source=hashnode&amp;utm_campaign=ff-vs-tldv-export">How to bulk export tl;dv transcripts</a></li>
<li><a href="https://minutehaul.haullabs.dev/guides/export-fireflies-before-cancel.html?utm_source=hashnode&amp;utm_campaign=ff-vs-tldv-export">Fireflies before-you-cancel checklist</a></li>
<li><a href="https://minutehaul.haullabs.dev/guides/export-tldv-before-cancel.html?utm_source=hashnode&amp;utm_campaign=ff-vs-tldv-export">tl;dv before-you-cancel checklist</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Ask ChatGPT, Claude or NotebookLM about your whole tl;dv meeting history (free export + merge scripts)]]></title><description><![CDATA[If you want to ask an AI about a whole year of tl;dv calls ("every pricing objection since January"), or you're leaving tl;dv and want that archive…]]></description><link>https://minutehaul.hashnode.dev/ask-chatgpt-claude-or-notebooklm-about-your-whole-tl-dv-meeting-history-free-export-merge-scripts</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/ask-chatgpt-claude-or-notebooklm-about-your-whole-tl-dv-meeting-history-free-export-merge-scripts</guid><category><![CDATA[Productivity]]></category><category><![CDATA[AI]]></category><category><![CDATA[Node.js]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Mon, 26 Oct 2026 20:23:28 GMT</pubDate><content:encoded><![CDATA[<p>If you want to ask an AI about a whole year of tl;dv calls ("every pricing objection since January"), or you're leaving tl;dv and want that archive somewhere useful, you need the transcripts as files and then merged into a few big ones, because ChatGPT Projects, Claude Projects and NotebookLM all cap how many files you can add. Here's a free two-step way to do it.</p>
<p><em>Disclosure: this post is from the team behind MinuteHaul, a paid no-code exporter for tl;dv and Fireflies. Both scripts below are free (MIT) and don't need our product. Drafted with AI assistance; limits taken from each vendor's help center (linked below); they change, so double-check.</em></p>
<h2>1. Export every tl;dv transcript as Markdown</h2>
<p>tl;dv has an official REST API. Its docs list API access on the Pro, Business and Enterprise plans, and it depends on the meeting organizer's plan. Get a key under <strong>Settings &gt; Personal settings &gt; API keys</strong>, then run our single-file CLI (Node 18+, zero dependencies):</p>
<pre><code class="language-bash">curl -O https://minutehaul.haullabs.dev/cli/minutehaul.mjs
export TLDV_API_KEY=your_key
node minutehaul.mjs --out ./tldv-export --notes
</code></pre>
<p>You get <code>tldv-export/transcripts/</code> with one <code>YYYY-MM-DD-title-id.md</code> file per meeting (speaker and timestamp per line, plus tl;dv's AI notes with <code>--notes</code>), an <code>index.csv</code>, and one unsplit <code>all-transcripts.txt</code>. My <a href="https://minutehaul.hashnode.dev/how-to-bulk-export-every-tl-dv-transcript-to-markdown-with-a-140-line-node-script">earlier post walks through how the script works</a>.</p>
<p>That single <code>all-transcripts.txt</code> is fine for a small archive, but a big one blows past the per-source limits below, so step 2 splits it.</p>
<h2>2. The limits you're working around</h2>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Size per file</th>
<th>How many files</th>
</tr>
</thead>
<tbody><tr>
<td>NotebookLM</td>
<td>500,000 words or 200 MB per source (<a href="https://support.google.com/notebooklm/answer/16215270">Google</a>)</td>
<td>50 sources on Free; paid plans allow more (<a href="https://support.google.com/notebooklm/answer/16269187">Google</a>)</td>
</tr>
<tr>
<td>ChatGPT Projects</td>
<td>up to 512 MB and 2M tokens per text file (<a href="https://help.openai.com/en/articles/8555545-uploading-files-and-audio-to-chatgpt">OpenAI</a>)</td>
<td>5 on Free, 25 on Go and Plus, 40 on higher plans (<a href="https://help.openai.com/en/articles/10169521">OpenAI</a>)</td>
</tr>
<tr>
<td>Claude Projects</td>
<td>30 MB per project file (<a href="https://support.claude.com/en/articles/8241126-upload-files-to-claude">Anthropic</a>)</td>
<td>no fixed count, but content must fit the context window; paid plans switch to retrieval as projects grow (<a href="https://support.claude.com/en/articles/11473015-retrieval-augmented-generation-rag-for-projects">Anthropic</a>)</td>
</tr>
</tbody></table>
<p>So the target is: a handful of files, each under 500,000 words. The script defaults to 400,000 words per part for headroom.</p>
<h2>3. The merge script</h2>
<p>Save as <code>merge-for-ai.mjs</code> (Node 18+, no dependencies):</p>
<pre><code class="language-js">// merge-for-ai.mjs: combine per-meeting Markdown files into a few large .txt files
// sized for NotebookLM (500,000 words per source), ChatGPT and Claude Projects.
// Usage: node merge-for-ai.mjs ./tldv-export/transcripts ./ai-ready [maxWords]
import { readdir, readFile, writeFile, mkdir } from "node:fs/promises";
import { join } from "node:path";

const IN = process.argv[2] || "./tldv-export/transcripts";
const OUT = process.argv[3] || "./ai-ready";
const MAX = Number(process.argv[4] || 400_000); // headroom under NotebookLM's 500k

const files = (await readdir(IN)).filter((f) =&gt; f.endsWith(".md")).sort(); // date-first names sort by date
await mkdir(OUT, { recursive: true });

let part = 1, words = 0, buf = [], total = 0;
const flush = async () =&gt; {
  if (!buf.length) return;
  await writeFile(join(OUT, `all-transcripts-part${part}.txt`), buf.join("\n\n=====\n\n"));
  console.log(`part${part}: ${buf.length} meetings, ${words} words`);
  part++; words = 0; buf = [];
};

for (const f of files) {
  const text = await readFile(join(IN, f), "utf8");
  const n = text.split(/\s+/).filter(Boolean).length;
  if (words + n &gt; MAX) await flush();
  buf.push(`SOURCE FILE: ${f}\n${text}`);
  words += n; total++;
}
await flush();
console.log(`Done: ${total} meetings in ${part - 1} file(s) in ${OUT}`);
</code></pre>
<p>Run it on your export folder:</p>
<pre><code class="language-bash">node merge-for-ai.mjs ./tldv-export/transcripts ./ai-ready
</code></pre>
<p>You get <code>all-transcripts-part1.txt</code>, <code>part2</code> and so on, in date order. Each meeting keeps its title, date and file name, so you can ask the AI to cite them.</p>
<h2>4. Load and ask</h2>
<ul>
<li><strong>NotebookLM:</strong> new notebook, add each part as a source.</li>
<li><strong>ChatGPT:</strong> create a Project and add the parts as project files.</li>
<li><strong>Claude:</strong> create a Project and upload the parts; if one is over 30 MB, rerun with a smaller word limit (third argument).</li>
</ul>
<p>Prompts that work well on a meeting archive:</p>
<ul>
<li>"List every pricing objection customers raised, with the meeting title and date for each."</li>
<li>"Which feature requests came up in more than one meeting? Rank them by how often."</li>
<li>"Summarize every meeting with [company] in date order and list open action items."</li>
</ul>
<p>Privacy note: transcripts contain other people's words and often personal data. Check your company's policy and the AI tool's data settings before uploading.</p>
<h2>Don't want to run code?</h2>
<p><a href="https://minutehaul.haullabs.dev/?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=tldv-ai-merge">MinuteHaul</a> does the export and the merge in your browser: one ZIP with a Markdown file per meeting, an <code>index.csv</code>, and <code>all-transcripts.txt</code> split at about 400,000 words. Your 10 most recent meetings are free and unlimited is $19 one-time. Tool-specific walkthroughs: <a href="https://minutehaul.haullabs.dev/guides/tldv-transcripts-to-chatgpt.html?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=tldv-ai-merge">tl;dv to ChatGPT</a>, <a href="https://minutehaul.haullabs.dev/guides/tldv-transcripts-to-claude.html?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=tldv-ai-merge">tl;dv to Claude</a> and <a href="https://minutehaul.haullabs.dev/guides/tldv-transcripts-to-notebooklm.html?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=tldv-ai-merge">tl;dv to NotebookLM</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Cancelling Otter.ai? Export your transcripts first (what each plan can export, plus a free merge script)]]></title><description><![CDATA[Disclosure: I'm on the team behind MinuteHaul, a paid exporter for Fireflies and tl;dv. MinuteHaul does not support Otter, so everything below uses Otter's…]]></description><link>https://minutehaul.hashnode.dev/cancelling-otter-ai-export-your-transcripts-first-what-each-plan-can-export-plus-a-free-merge-script</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/cancelling-otter-ai-export-your-transcripts-first-what-each-plan-can-export-plus-a-free-merge-script</guid><category><![CDATA[Productivity]]></category><category><![CDATA[AI]]></category><category><![CDATA[Node.js]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Mon, 26 Oct 2026 11:18:35 GMT</pubDate><content:encoded><![CDATA[<p><em>Disclosure: I'm on the team behind MinuteHaul, a paid exporter for Fireflies and tl;dv. MinuteHaul does <strong>not</strong> support Otter, so everything below uses Otter's own export tools. This post is AI-assisted; every Otter fact links to Otter's help center.</em></p>
<p>Cancelling Otter doesn't delete your conversations. It moves you to the free Basic plan, where only your <strong>25 most recent conversations</strong> stay accessible and older ones are archived (<a href="https://help.otter.ai/hc/en-us/articles/26011568967447">Otter help</a>). And bulk export is only available on the <strong>Business and Enterprise</strong> plans (<a href="https://help.otter.ai/hc/en-us/articles/13829342669079-Bulk-export-conversations-audio-or-Takeaways">Otter help</a>).</p>
<p>So the order matters: export first, cancel second.</p>
<h2>If you're on Business or Enterprise: bulk export now</h2>
<ol>
<li>Go to My Conversations (or the Channel, Direct Message or Folder that holds the transcripts).</li>
<li>Tick at least one conversation. The <strong>Select all</strong> checkbox only appears after that.</li>
<li><strong>Scroll down until every conversation has loaded.</strong> Otter says Select all only selects the conversations loaded on the current page. This is the step people miss.</li>
<li>Click Select all, then the Export icon, choose formats and settings, and click Export.</li>
<li>Otter emails you a link to a ZIP file.</li>
</ol>
<p>Two notes from Otter: bulk audio export isn't available in Channels or Direct Messages, and adblockers can break exports, so turn yours off if an export fails.</p>
<h2>On any plan: one conversation at a time</h2>
<p>Open the conversation, click the three dots, then <strong>Export</strong>. Formats are TXT, DOCX, PDF, SRT or Clipboard, but Basic users can export <strong>TXT only</strong>. Audio is a separate toggle and downloads as MP3 (<a href="https://help.otter.ai/hc/en-us/articles/360047733634-Export-conversations">Otter: Export conversations</a>). Outlines and Action Items can't be exported as files; copy them from the Summary.</p>
<h2>Already cancelled? Archived isn't gone</h2>
<p>Otter says archived conversations aren't automatically deleted, and you can export an archived conversation without unarchiving it or upgrading (<a href="https://help.otter.ai/hc/en-us/articles/26011568967447">Otter help</a>). Also: archiving follows the owner's plan, so people you shared conversations with lose access once those are archived.</p>
<h2>Free script: turn the export into AI-ready files</h2>
<p>Once you have a folder of TXT files, you probably want to ask questions across all of them in NotebookLM, ChatGPT or Claude. Uploading hundreds of small files is painful, so this Node script (Node 20+, no dependencies) merges them into a few big files, each under 400,000 words to stay below NotebookLM's 500,000-words-per-source limit.</p>
<pre><code class="language-js">// merge-otter-for-ai.mjs: combine the per-conversation TXT files from an Otter export
// into a few large .txt files you can upload to NotebookLM, ChatGPT or Claude.
// Usage: node merge-otter-for-ai.mjs ./otter-export ./ai-ready [maxWords]
import { readdir, readFile, writeFile, mkdir } from "node:fs/promises";
import { join } from "node:path";

const IN = process.argv[2] || "./otter-export";
const OUT = process.argv[3] || "./ai-ready";
const MAX = Number(process.argv[4] || 400_000); // headroom under NotebookLM's 500k words per source

const files = (await readdir(IN, { recursive: true }))
  .filter((f) =&gt; f.toLowerCase().endsWith(".txt"))
  .sort();
await mkdir(OUT, { recursive: true });

let part = 1, words = 0, buf = [], total = 0;
const flush = async () =&gt; {
  if (!buf.length) return;
  await writeFile(join(OUT, `otter-transcripts-part${part}.txt`), buf.join("\n\n=====\n\n"));
  console.log(`part${part}: ${buf.length} conversations, ${words} words`);
  part++; words = 0; buf = [];
};

for (const f of files) {
  const text = await readFile(join(IN, f), "utf8");
  const n = text.split(/\s+/).filter(Boolean).length;
  if (words + n &gt; MAX &amp;&amp; buf.length) await flush();
  buf.push(`CONVERSATION FILE: ${f}\n${text}`);
  words += n; total++;
}
await flush();
console.log(`Done: ${total} conversations in ${part - 1} file(s) in ${OUT}`);
</code></pre>
<p>Run it:</p>
<pre><code class="language-bash">unzip otter-export.zip -d otter-export
node merge-otter-for-ai.mjs ./otter-export ./ai-ready
</code></pre>
<p>Each conversation keeps a <code>CONVERSATION FILE:</code> header, so the AI can tell you which meeting an answer came from.</p>
<h2>Pre-cancel checklist</h2>
<ul>
<li>Check your plan. On Business or Enterprise, bulk export now.</li>
<li>Scroll My Conversations to the bottom before Select all.</li>
<li>Need DOCX, PDF or SRT? Export them while you're still paid; Basic is TXT only.</li>
<li>Want recordings? Turn on the Audio (MP3) toggle.</li>
<li>Check Channels and Direct Messages separately.</li>
<li>Disable your adblocker.</li>
<li>Spot-check old and new conversations in the ZIP before cancelling.</li>
<li>Copy any Summaries, Outlines and Action Items you need.</li>
</ul>
<p>The full version with FAQ is here: <a href="https://minutehaul.haullabs.dev/guides/export-otter-transcripts-before-cancel.html?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=otter-cancel">How to export your Otter.ai transcripts before you cancel</a>.</p>
<p>Moving from <strong>tl;dv or Fireflies</strong> instead? <a href="https://minutehaul.haullabs.dev/?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=otter-cancel">MinuteHaul</a> exports the whole archive in one go, free for your 10 most recent meetings. If you'd use a one-click Otter exporter, email <a href="mailto:bulktranscripts@mail.grokbot.com">bulktranscripts@mail.grokbot.com</a>; requests decide what we add next.</p>
]]></content:encoded></item><item><title><![CDATA[Turn your whole Fireflies history into an Obsidian vault (free Node script with frontmatter)]]></title><description><![CDATA[Disclosure: I'm on the team behind MinuteHaul, a paid one-click exporter for Fireflies and tl;dv. This post is AI-assisted and the script below is free to…]]></description><link>https://minutehaul.hashnode.dev/turn-your-whole-fireflies-history-into-an-obsidian-vault-free-node-script-with-frontmatter</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/turn-your-whole-fireflies-history-into-an-obsidian-vault-free-node-script-with-frontmatter</guid><category><![CDATA[Node.js]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[obsidian]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Mon, 26 Oct 2026 00:24:42 GMT</pubDate><content:encoded><![CDATA[<p><em>Disclosure: I'm on the team behind MinuteHaul, a paid one-click exporter for Fireflies and tl;dv. This post is AI-assisted and the script below is free to copy, no MinuteHaul needed.</em></p>
<p>Fireflies can download a single meeting as Markdown on Pro and higher plans, but there's no button for "all of them." If you keep notes in Obsidian, you probably want every meeting as its own note, with properties you can filter on: date, length, who was there, and a link back to Fireflies.</p>
<p>The Fireflies GraphQL API gives you all of that on every plan, including Free. Here's a script that writes one Obsidian note per meeting with YAML frontmatter.</p>
<h2>What you get</h2>
<p>Each meeting becomes a file like <code>2026-10-21 Weekly sync.md</code>:</p>
<pre><code class="language-markdown">---
title: "Weekly sync"
date: 2026-10-21
duration_min: 34
organizer: "you@company.com"
participants: ["you@company.com", "sam@company.com"]
source: "https://app.fireflies.ai/view/..."
tags: [meeting, fireflies]
---

# Weekly sync

**Sam** [00:00:04]: Okay, let's start with the launch...
</code></pre>
<p>Obsidian reads the frontmatter as note properties, so you can sort by date, search by participant, or build a Dataview table of every meeting with a given person.</p>
<h2>The script</h2>
<p>You need Node 18 or newer (for built-in <code>fetch</code>) and your API key from Fireflies, under Integrations, then Fireflies API.</p>
<pre><code class="language-js">// fireflies-to-obsidian.mjs: every Fireflies transcript as an Obsidian note with YAML frontmatter.
// Usage: FIREFLIES_API_KEY=xxx node fireflies-to-obsidian.mjs "/path/to/vault/Meetings"
import { mkdir, writeFile } from "node:fs/promises";
import { join } from "node:path";

const KEY = process.env.FIREFLIES_API_KEY;
const OUT = process.argv[2] || "./Meetings";
if (!KEY) { console.error("Set FIREFLIES_API_KEY"); process.exit(1); }
const sleep = (ms) =&gt; new Promise((r) =&gt; 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(2_100); // ~28/min: safe on the Free plan's 30/min
    return json.data;
  }
}

const LIST = `query($limit:Int,$skip:Int){transcripts(limit:$limit,skip:$skip){id title date duration organizer_email participants transcript_url}}`;
const ONE = `query($id:String!){transcript(id:$id){sentences{speaker_name text start_time}}}`;

const safe = (s) =&gt; (s || "Untitled").replace(/[\\/:*?"&lt;&gt;|#^[\]]/g, " ").replace(/\s+/g, " ").trim().slice(0, 80);
const q = (s) =&gt; JSON.stringify(String(s ?? ""));
const ts = (sec) =&gt; 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 people = (t.participants || []).filter(Boolean);
    const front = [
      "---",
      `title: ${q(t.title)}`,
      `date: ${day}`,
      `duration_min: ${Math.round(Number(t.duration) || 0)}`,
      `organizer: ${q(t.organizer_email)}`,
      `participants: [${people.map(q).join(", ")}]`,
      `source: ${q(t.transcript_url)}`,
      "tags: [meeting, fireflies]",
      "---",
    ].join("\n");
    const lines = (transcript?.sentences || []).map(
      (s) =&gt; `**${s.speaker_name || "Speaker"}** [${ts(s.start_time)}]: ${s.text}`
    );
    await writeFile(join(OUT, `${day} ${safe(t.title)}.md`), `${front}\n\n# ${t.title}\n\n${lines.join("\n\n")}\n`);
    console.log(`saved ${++saved}: ${t.title}`);
  }
  skip += 50;
}
console.log(`Done: ${saved} notes in ${OUT}`);
</code></pre>
<p>Run it with the output pointed straight into your vault:</p>
<pre><code class="language-bash">FIREFLIES_API_KEY=your_key node fireflies-to-obsidian.mjs "$HOME/Vault/Meetings"
</code></pre>
<h2>Things to know before you run it</h2>
<ul>
<li><strong>Rate limits.</strong> Fireflies documents 30 requests a minute and 500 a day on Free, and 60 a minute and 5,000 a day on Pro. The script spends about one request per meeting plus one per 50 listed, and pauses about 2 seconds between calls to stay under the Free per-minute cap. On Free, an archive bigger than about 490 meetings needs a second run the next day (the daily limit resets at midnight UTC), so add a skip for files that already exist if you're in that spot.</li>
<li><strong>Duration</strong> comes from the API in minutes, and the script rounds it.</li>
<li><strong>File names</strong> strip characters Obsidian or your OS won't accept, like <code>/ : # ^ [ ]</code>. Two meetings with the same title on the same day would overwrite each other; add <code>t.id</code> to the name if that happens to you.</li>
<li><strong>Summaries</strong> aren't included. Add <code>summary{overview action_items}</code> to the <code>ONE</code> query and write them under the title if you want them.</li>
</ul>
<h2>A Dataview query to try</h2>
<p>With the Dataview plugin installed, this lists every meeting with one person, newest first:</p>
<pre><code class="language-dataview">TABLE date, duration_min AS "min"
FROM "Meetings"
WHERE contains(participants, "sam@company.com")
SORT date DESC
</code></pre>
<h2>If you'd rather not run code</h2>
<p><a href="https://minutehaul.haullabs.dev/?utm_source=hashnode&amp;utm_campaign=ff-obsidian">MinuteHaul</a> does the same export from your browser: paste the API key, and it builds a ZIP with one Markdown file per meeting, an <code>index.csv</code>, and an all-in-one text file for AI tools. Your 10 most recent meetings are free; unlimited is $19 one-time. There's a longer walkthrough in our <a href="https://minutehaul.haullabs.dev/guides/fireflies-transcripts-to-markdown-obsidian.html?utm_source=hashnode&amp;utm_campaign=ff-obsidian">Fireflies to Markdown and Obsidian guide</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Ask ChatGPT, Claude or NotebookLM about your whole Fireflies meeting history (free 30-line merge script)]]></title><description><![CDATA[Uploading 300 single-meeting transcripts to an AI tool doesn't work: ChatGPT Projects, Claude Projects and NotebookLM all cap how many files you can add…]]></description><link>https://minutehaul.hashnode.dev/ask-chatgpt-claude-or-notebooklm-about-your-whole-fireflies-meeting-history-free-30-line-merge-script</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/ask-chatgpt-claude-or-notebooklm-about-your-whole-fireflies-meeting-history-free-30-line-merge-script</guid><category><![CDATA[Node.js]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Sun, 25 Oct 2026 23:21:57 GMT</pubDate><content:encoded><![CDATA[<p>Uploading 300 single-meeting transcripts to an AI tool doesn't work: ChatGPT Projects, Claude Projects and NotebookLM all cap how many files you can add. The fix is boring but effective: merge your meetings into a few big text files sized to each tool's limits. Here's a small Node script that does that, plus the limits that matter.</p>
<p><em>Disclosure: this post is from the team behind MinuteHaul, a paid no-code exporter for Fireflies and tl;dv. The script below is free and doesn't need our product. Drafted with AI assistance; limits taken from each vendor's help center (linked below); they change, so double-check.</em></p>
<h2>1. Get your transcripts as files first</h2>
<p>If you don't have them yet, my previous post has a <a href="https://minutehaul.hashnode.dev/how-to-bulk-export-every-fireflies-transcript-to-markdown-with-a-50-line-node-script">50-line script that exports every Fireflies transcript to Markdown</a> through the Fireflies API (which works on every plan, including Free, within <a href="https://docs.fireflies.ai/fundamentals/limits">Fireflies' rate limits</a>). It writes one <code>YYYY-MM-DD-title-id.md</code> file per meeting.</p>
<h2>2. The limits you're working around</h2>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Size per file</th>
<th>How many files</th>
</tr>
</thead>
<tbody><tr>
<td>NotebookLM</td>
<td>500,000 words or 200 MB per source (<a href="https://support.google.com/notebooklm/answer/16215270">Google</a>)</td>
<td>50 sources on Free; paid plans allow more (<a href="https://support.google.com/notebooklm/answer/16269187">Google</a>)</td>
</tr>
<tr>
<td>ChatGPT Projects</td>
<td>up to 512 MB and 2M tokens per text file (<a href="https://help.openai.com/en/articles/8555545-uploading-files-and-audio-to-chatgpt">OpenAI</a>)</td>
<td>5 on Free, 25 on Go and Plus, 40 on higher plans (<a href="https://help.openai.com/en/articles/10169521">OpenAI</a>)</td>
</tr>
<tr>
<td>Claude Projects</td>
<td>30 MB per project file (<a href="https://support.claude.com/en/articles/8241126-upload-files-to-claude">Anthropic</a>)</td>
<td>no fixed count, but content must fit the context window; paid plans switch to retrieval as projects grow (<a href="https://support.claude.com/en/articles/11473015-retrieval-augmented-generation-rag-for-projects">Anthropic</a>)</td>
</tr>
</tbody></table>
<p>So the target is: a handful of files, each under 500,000 words. The script defaults to 400,000 words per part for headroom.</p>
<h2>3. The merge script</h2>
<p>Save as <code>merge-for-ai.mjs</code> (Node 18+, no dependencies):</p>
<pre><code class="language-js">// merge-for-ai.mjs: combine per-meeting Markdown files into a few large .txt files
// sized for NotebookLM (500,000 words per source), ChatGPT and Claude Projects.
// Usage: node merge-for-ai.mjs ./fireflies-export ./ai-ready [maxWords]
import { readdir, readFile, writeFile, mkdir } from "node:fs/promises";
import { join } from "node:path";

const IN = process.argv[2] || "./fireflies-export";
const OUT = process.argv[3] || "./ai-ready";
const MAX = Number(process.argv[4] || 400_000); // headroom under NotebookLM's 500k

const files = (await readdir(IN)).filter((f) =&gt; f.endsWith(".md")).sort(); // date-first names sort by date
await mkdir(OUT, { recursive: true });

let part = 1, words = 0, buf = [], total = 0;
const flush = async () =&gt; {
  if (!buf.length) return;
  await writeFile(join(OUT, `all-transcripts-part${part}.txt`), buf.join("\n\n=====\n\n"));
  console.log(`part${part}: ${buf.length} meetings, ${words} words`);
  part++; words = 0; buf = [];
};

for (const f of files) {
  const text = await readFile(join(IN, f), "utf8");
  const n = text.split(/\s+/).filter(Boolean).length;
  if (words + n &gt; MAX) await flush();
  buf.push(`SOURCE FILE: ${f}\n${text}`);
  words += n; total++;
}
await flush();
console.log(`Done: ${total} meetings in ${part - 1} file(s) in ${OUT}`);
</code></pre>
<p>Run it on your export folder:</p>
<pre><code class="language-bash">node merge-for-ai.mjs ./fireflies-export ./ai-ready
</code></pre>
<p>You get <code>all-transcripts-part1.txt</code>, <code>part2</code> and so on, in date order. Each meeting keeps its title, date and file name, so you can ask the AI to cite them.</p>
<h2>4. Load and ask</h2>
<ul>
<li><strong>NotebookLM:</strong> new notebook, add each part as a source.</li>
<li><strong>ChatGPT:</strong> create a Project and add the parts as project files.</li>
<li><strong>Claude:</strong> create a Project and upload the parts; if one is over 30 MB, rerun with a smaller word limit (third argument).</li>
</ul>
<p>Prompts that work well on a meeting archive:</p>
<ul>
<li>"List every pricing objection customers raised, with the meeting title and date for each."</li>
<li>"Which feature requests came up in more than one meeting? Rank them by how often."</li>
<li>"Summarize every meeting with [company] in date order and list open action items."</li>
</ul>
<p>Privacy note: transcripts contain other people's words and often personal data. Check your company's policy and the AI tool's data settings before uploading.</p>
<h2>Don't want to run code?</h2>
<p><a href="https://minutehaul.haullabs.dev/?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ff-ai-merge">MinuteHaul</a> does the export and the merge in your browser: one ZIP with a Markdown file per meeting, an <code>index.csv</code>, and <code>all-transcripts.txt</code> split at about 400,000 words. Your 10 most recent meetings are free, unlimited is $19 one-time, and Fireflies support is in beta. The full walkthrough is in the <a href="https://minutehaul.haullabs.dev/guides/fireflies-transcripts-to-chatgpt-claude-notebooklm.html?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ff-ai-merge">Fireflies to ChatGPT, Claude and NotebookLM guide</a>.</p>
]]></content:encoded></item><item><title><![CDATA[How to bulk-export every Fireflies transcript to Markdown with a 50-line Node script]]></title><description><![CDATA[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…]]></description><link>https://minutehaul.hashnode.dev/how-to-bulk-export-every-fireflies-transcript-to-markdown-with-a-50-line-node-script</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/how-to-bulk-export-every-fireflies-transcript-to-markdown-with-a-50-line-node-script</guid><category><![CDATA[Node.js]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[api]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Sun, 25 Oct 2026 20:24:23 GMT</pubDate><content:encoded><![CDATA[<p>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.</p>
<p><em>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.</em></p>
<h2>1. Get your API key</h2>
<p>Log in at app.fireflies.ai, open <strong>Integrations</strong>, then <strong>Fireflies API</strong>, and copy the key (<a href="https://docs.fireflies.ai/">Fireflies docs</a>). Treat it like a password.</p>
<h2>2. Know the rate limits</h2>
<p>Fireflies documents these API limits (<a href="https://docs.fireflies.ai/fundamentals/limits">docs</a>):</p>
<ul>
<li>Free: 30 requests a minute, 500 a day (a Free user's first API request starts a 14-day trial at Pro limits)</li>
<li>Pro: 60 a minute, 5,000 a day</li>
<li>Business and Enterprise: 60 a minute per paid seat, pooled, no daily cap</li>
</ul>
<p>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.</p>
<h2>3. The script</h2>
<p>Save as <code>fireflies-export.mjs</code> (Node 18+, no dependencies):</p>
<pre><code class="language-js">// 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) =&gt; new Promise((r) =&gt; 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) =&gt; (s || "untitled").toLowerCase().replace(/[^a-z0-9]+/g, "-").slice(0, 60);
const ts = (sec) =&gt; 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) =&gt; `**${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}`);
</code></pre>
<p>Run it:</p>
<pre><code class="language-bash">FIREFLIES_API_KEY=your_key node fireflies-export.mjs ./fireflies-export
</code></pre>
<p>You get one file per meeting, named <code>YYYY-MM-DD-title-id.md</code>, with speaker names and timestamps.</p>
<h2>4. Ideas to extend it</h2>
<ul>
<li>Add <code>summary{overview action_items keywords}</code> to the transcript query to keep Fireflies' AI notes.</li>
<li>Track saved IDs in a JSON file so re-runs skip what you already have.</li>
<li>Write CSV instead of Markdown if you're importing into a spreadsheet.</li>
</ul>
<h2>Don't want to run code?</h2>
<p><a href="https://minutehaul.haullabs.dev/?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ff-script">MinuteHaul</a> 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 <a href="https://minutehaul.haullabs.dev/guides/fireflies-bulk-export-transcripts.html?utm_source=hashnode&amp;utm_medium=article&amp;utm_campaign=ff-script">Fireflies bulk export guide</a>.</p>
]]></content:encoded></item><item><title><![CDATA[How to bulk-export every tl;dv transcript to Markdown with a 140-line Node script]]></title><description><![CDATA[tl;dv lets you download one transcript at a time from the meeting page. If you have hundreds of meetings (or you're about to cancel or switch tools), that…]]></description><link>https://minutehaul.hashnode.dev/how-to-bulk-export-every-tl-dv-transcript-to-markdown-with-a-140-line-node-script</link><guid isPermaLink="true">https://minutehaul.hashnode.dev/how-to-bulk-export-every-tl-dv-transcript-to-markdown-with-a-140-line-node-script</guid><category><![CDATA[Node.js]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[api]]></category><dc:creator><![CDATA[MinuteHaul team]]></dc:creator><pubDate>Sun, 25 Oct 2026 19:29:46 GMT</pubDate><content:encoded><![CDATA[<p>tl;dv lets you download one transcript at a time from the meeting page. If you have hundreds of meetings (or you're about to cancel or switch tools), that gets old fast. The good news: tl;dv has an official REST API, and it's enough to pull your whole archive.</p>
<p>We wrote a small MIT-licensed script for this. It's a single file, has zero dependencies and needs Node 18+ (built-in <code>fetch</code>).</p>
<h2>What you need</h2>
<ul>
<li>Node.js 18 or newer</li>
<li>A tl;dv API key from <strong>Settings &gt; Personal settings &gt; API keys</strong> (<a href="https://tldv.io/app/settings/personal-settings/api-keys">https://tldv.io/app/settings/personal-settings/api-keys</a>). tl;dv's API docs list API access on the Pro, Business and Enterprise plans, and it depends on the meeting organizer's plan.</li>
</ul>
<h2>Run it</h2>
<pre><code class="language-bash">curl -O https://minutehaul.haullabs.dev/cli/minutehaul.mjs
export TLDV_API_KEY=your_key
node minutehaul.mjs --out ./tldv-export --notes
# optional date range and a JSONL dump:
node minutehaul.mjs --out ./tldv-export --from 2026-01-01 --to 2026-06-30 --jsonl
</code></pre>
<p>Use the env var rather than <code>--key</code> so the key doesn't land in your shell history.</p>
<h2>What you get</h2>
<pre><code>tldv-export/
  transcripts/*.md      one Markdown file per meeting, speaker + timestamp per line
  index.csv             meeting id, title, date, duration, organizer, participants, status
  all-transcripts.txt   everything in one file (handy for feeding an LLM or NotebookLM)
  all.jsonl             optional, raw records (--jsonl)
</code></pre>
<p><code>--notes</code> adds tl;dv's AI notes to each Markdown file. Meetings that don't have a finished transcript show up as "skipped" in <code>index.csv</code>, so you can see what's missing instead of silently losing it.</p>
<h2>How it works</h2>
<p>The script pages through the meetings list endpoint 100 at a time, then fetches each meeting's transcript and (optionally) notes. A few details that matter on a large archive:</p>
<ul>
<li><strong>Retries with backoff.</strong> On HTTP 429 or 5xx it honors <code>Retry-After</code> when present, otherwise backs off exponentially (up to 6 attempts).</li>
<li><strong>404 means "no transcript yet"</strong>, not a fatal error.</li>
<li><strong>Safe filenames.</strong> Titles are stripped to word characters and capped at 60 chars, so a meeting called <code>Q3 / pricing ???</code> doesn't break your filesystem.</li>
</ul>
<p>It only talks to tl;dv's API (<code>pasta.tldv.io</code>) and writes to your disk. Nothing is sent anywhere else. It's 143 lines, so read it before you run it: <a href="https://minutehaul.haullabs.dev/cli/minutehaul.mjs">https://minutehaul.haullabs.dev/cli/minutehaul.mjs</a></p>
<p>There's also beta support for Avoma (<code>--source avoma</code>, with <code>AVOMA_API_KEY=CLIENT_KEY:CLIENT_SECRET</code>), tested only against a mock of Avoma's published API so far.</p>
<h2>No terminal?</h2>
<p>Disclosure: the script comes from MinuteHaul, a small tool from our team that does the same export in the browser and hands you a ZIP. It's free for your 10 most recent meetings and $19 one-time for everything: <a href="https://minutehaul.haullabs.dev/?utm_source=devto&amp;utm_medium=article&amp;utm_campaign=cli">https://minutehaul.haullabs.dev/?utm_source=devto&amp;utm_medium=article&amp;utm_campaign=cli</a></p>
<p>The CLI itself is free with no meeting cap. If you hit an endpoint quirk, the field reference we keep is here: <a href="https://minutehaul.haullabs.dev/guides/tldv-api-field-reference.html">https://minutehaul.haullabs.dev/guides/tldv-api-field-reference.html</a></p>
<p><em>MinuteHaul is independent and not affiliated with tl;dv. This post was drafted with AI assistance and checked against the script's source.</em></p>
]]></content:encoded></item></channel></rss>