fireflies-webhooks-events
Securely process Fireflies.ai transcript webhooks with HMAC-SHA256 signature verification.
Install
mkdir -p .claude/skills/fireflies-webhooks-events && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8766" && unzip -o skill.zip -d .claude/skills/fireflies-webhooks-events && rm skill.zipInstalls to .claude/skills/fireflies-webhooks-events
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Implement Fireflies.ai webhook receiver with HMAC signature verificationKey capabilities
- →Handle Fireflies.ai webhook events for real-time transcript notifications
- →Verify HMAC-SHA256 signature of incoming webhooks
- →Process transcription completed events
- →Fetch and process the full transcript after notification
- →Extract action items and route them to downstream systems
- →Support per-upload webhooks for specific audio files
How it works
This skill sets up an HTTPS endpoint to receive Fireflies.ai webhook events, verifies the HMAC-SHA256 signature, and then processes the event payload to fetch and analyze the meeting transcript.
Inputs & outputs
When to use fireflies-webhooks-events
- →Setting up Fireflies webhook endpoints
- →Implementing HMAC signature verification
- →Building meeting transcript data pipelines
- →Handling transcription-ready notifications
About this skill
Fireflies.ai Webhooks & Events
Overview
Handle Fireflies.ai webhook events for real-time transcript notifications. Fireflies fires a webhook when a transcript finishes processing. The payload is signed with HMAC-SHA256 for verification.
Prerequisites
- Fireflies.ai Business or Enterprise plan
FIREFLIES_API_KEYandFIREFLIES_WEBHOOK_SECRETin environment- HTTPS endpoint accessible from the internet
Webhook Event Reference
Fireflies currently fires one event type:
| Event | eventType Value | Trigger |
|---|---|---|
| Transcription completed | "Transcription completed" | Transcript is fully processed and ready |
Payload Format
{
"meetingId": "ASxwZxCstx",
"eventType": "Transcription completed",
"clientReferenceId": "be582c46-4ac9-4565-9ba6-6ab4264496a8"
}
| Field | Type | Description |
|---|---|---|
meetingId | String | Transcript ID -- use in transcript(id:) query |
eventType | String | Always "Transcription completed" currently |
clientReferenceId | ID | Your custom ID from uploadAudio (null if bot-recorded) |
Important Constraints
- Webhooks fire only for meetings you own (organizer_email matches your account)
- Super Admin webhooks (Enterprise only) fire for all team-owned meetings
Instructions
Step 1: Register Webhook in Dashboard
- Go to app.fireflies.ai/settings
- Select Developer settings tab
- Enter your HTTPS webhook URL
- Enter or generate a 16-32 character secret
- Save
Step 2: Build Webhook Receiver with Signature Verification
import express from "express";
import crypto from "crypto";
const app = express();
// IMPORTANT: Use raw body for HMAC verification
app.post("/webhooks/fireflies",
express.raw({ type: "application/json" }),
async (req, res) => {
const signature = req.headers["x-hub-signature"] as string;
const rawBody = req.body.toString();
// Verify HMAC-SHA256 signature
if (!signature || !verifySignature(rawBody, signature)) {
console.warn("Rejected webhook: invalid signature");
return res.status(401).json({ error: "Invalid signature" });
}
// Acknowledge immediately -- process async
res.status(200).json({ received: true });
const event = JSON.parse(rawBody);
console.log(`Webhook: ${event.eventType} for meeting ${event.meetingId}`);
// Process in background
processTranscriptReady(event.meetingId, event.clientReferenceId)
.catch(err => console.error("Webhook processing failed:", err));
}
);
function verifySignature(payload: string, signature: string): boolean {
const secret = process.env.FIREFLIES_WEBHOOK_SECRET!;
const expected = crypto
.createHmac("sha256", secret)
.update(payload)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
Step 3: Fetch and Process the Transcript
const FIREFLIES_API = "https://api.fireflies.ai/graphql";
async function processTranscriptReady(meetingId: string, clientRefId?: string) {
const res = await fetch(FIREFLIES_API, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.FIREFLIES_API_KEY}`,
},
body: JSON.stringify({
query: `
query GetTranscript($id: String!) {
transcript(id: $id) {
id title date duration
organizer_email
speakers { name }
sentences { speaker_name text start_time end_time }
summary {
overview
action_items
keywords
short_summary
}
meeting_attendees { displayName email }
}
}
`,
variables: { id: meetingId },
}),
});
const json = await res.json();
if (json.errors) throw new Error(json.errors[0].message);
const transcript = json.data.transcript;
console.log(`Processing: "${transcript.title}" (${transcript.duration}min)`);
console.log(`Speakers: ${transcript.speakers.map((s: any) => s.name).join(", ")}`);
console.log(`Action items: ${transcript.summary?.action_items?.length || 0}`);
// Route to downstream systems
await Promise.all([
storeTranscript(transcript),
createTasksFromActionItems(transcript),
notifyTeam(transcript),
]);
}
async function storeTranscript(transcript: any) {
// Store in your database
console.log(`Stored transcript: ${transcript.id}`);
}
async function createTasksFromActionItems(transcript: any) {
const items = transcript.summary?.action_items || [];
for (const item of items) {
console.log(`Task created: ${item}`);
// await taskManager.create({ title: item, source: transcript.title });
}
}
async function notifyTeam(transcript: any) {
// Send Slack/email notification
const summary = transcript.summary?.short_summary || transcript.summary?.overview;
console.log(`Notification: "${transcript.title}" -- ${summary}`);
}
Step 4: Per-Upload Webhook (Alternative)
Instead of dashboard-level webhook, include a webhook URL in uploadAudio:
await fetch(FIREFLIES_API, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.FIREFLIES_API_KEY}`,
},
body: JSON.stringify({
query: `
mutation($input: AudioUploadInput) {
uploadAudio(input: $input) { success title message }
}
`,
variables: {
input: {
url: "https://storage.example.com/recording.mp3",
title: "Client Call 2026-03-22",
webhook: "https://api.yourapp.com/webhooks/fireflies",
client_reference_id: "order-12345",
},
},
}),
});
Step 5: Test Webhook
set -euo pipefail
# Test by uploading a short audio file
curl -s -X POST https://api.fireflies.ai/graphql \
-H "Authorization: Bearer $FIREFLIES_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "mutation($input: AudioUploadInput) { uploadAudio(input: $input) { success message } }",
"variables": { "input": { "url": "https://example.com/test-audio.mp3", "title": "Webhook Test" } }
}' | jq .
# The webhook will fire when transcription completes (usually 2-5 minutes)
Error Handling
| Issue | Cause | Solution |
|---|---|---|
| Webhook not firing | URL not saved in dashboard | Re-register at app.fireflies.ai/settings |
| Invalid signature | Secret mismatch | Verify secret matches dashboard value |
Missing meetingId | Malformed payload | Log raw body, check Fireflies status |
| Webhook only fires for some meetings | Owner-only constraint | Webhooks fire only for your meetings |
clientReferenceId is null | Bot-recorded meeting | Only set on uploadAudio calls |
Output
- HTTPS webhook endpoint with HMAC-SHA256 signature verification
- Automatic transcript fetch on completion events
- Action item extraction and downstream routing
- Per-upload webhook support for custom tracking
Resources
- Fireflies Webhooks
- Webhook Verification Example
Next Steps
For deployment setup, see fireflies-deploy-integration.
When not to use it
- →When webhooks are not for meetings you own
- →When `clientReferenceId` is needed for bot-recorded meetings
Prerequisites
Limitations
- →Webhooks fire only for meetings the user owns
- →Super Admin webhooks (Enterprise only) fire for all team-owned meetings
- →clientReferenceId is null if the meeting was bot-recorded
How it compares
This skill automates the secure reception and processing of Fireflies.ai transcript notifications, unlike manually checking for transcript availability or processing unverified data.
Compared to similar skills
fireflies-webhooks-events side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| fireflies-webhooks-events (this skill) | 0 | 27d | Caution | Intermediate |
| apify-ultimate-scraper | 0 | 3mo | Review | Intermediate |
| telegram-bot-builder | 106 | 6mo | Review | Intermediate |
| chrome-devtools | 41 | 7mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
apify-ultimate-scraper
Anhvu1107
ALWAYS use this when the request matches Apify Ultimate Scraper: AI-driven data extraction from 55+ Actors across all major platforms.
telegram-bot-builder
davila7
Expert in building Telegram bots that solve real problems - from simple automation to complex AI-powered bots. Covers bot architecture, the Telegram Bot API, user experience, monetization strategies, and scaling bots to thousands of users. Use when: telegram bot, bot api, telegram automation, chat bot telegram, tg bot.
chrome-devtools
mrgoonie
Browser automation, debugging, and performance analysis using Puppeteer CLI scripts. Use for automating browsers, taking screenshots, analyzing performance, monitoring network traffic, web scraping, form automation, and JavaScript debugging.
playwright-browser-automation
lackeyjb
Complete browser automation with Playwright. Auto-detects dev servers, writes clean test scripts to /tmp. Test pages, fill forms, take screenshots, check responsive design, validate UX, test login flows, check links, automate any browser task. Use when user wants to test websites, automate browser interactions, validate web functionality, or perform any browser-based testing.
workflow-orchestration-patterns
wshobson
Design durable workflows with Temporal for distributed systems. Covers workflow vs activity separation, saga patterns, state management, and determinism constraints. Use when building long-running processes, distributed transactions, or microservice orchestration.
codex-skill
feiskyer
Use when user asks to leverage codex, gpt-5, or gpt-5.1 to implement something (usually implement a plan or feature designed by Claude). Provides non-interactive automation mode for hands-off task execution without approval prompts.