fireflies-security-basics
Security guidelines for Fireflies.ai integrations, covering API key storage and HMAC webhook verification.
Install
mkdir -p .claude/skills/fireflies-security-basics && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/6885" && unzip -o skill.zip -d .claude/skills/fireflies-security-basics && rm skill.zipInstalls to .claude/skills/fireflies-security-basics
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.
Apply Fireflies.ai security best practices for API keys and webhookKey capabilities
- →Secure API key storage using environment variables
- →Implement HMAC-SHA256 webhook signature verification
- →Configure transcript privacy levels via GraphQL mutations
- →Rotate API keys using the Fireflies dashboard
- →Prevent credential leakage with pre-commit hooks
How it works
The skill uses HMAC-SHA256 to verify webhook integrity by comparing the signature header against a locally stored secret. It also provides patterns for securing API keys in environment variables and managing transcript access via GraphQL.
Inputs & outputs
When to use fireflies-security-basics
- →Securing Fireflies API keys in environment variables
- →Implementing webhook signature verification
- →Creating pre-commit hooks to prevent credential leakage
- →Auditing Fireflies integration security
About this skill
Fireflies.ai Security Basics
Overview
Security essentials for Fireflies.ai: API key management, webhook HMAC-SHA256 signature verification, transcript access controls, and audit practices.
Prerequisites
- Fireflies.ai API key
- Understanding of environment variables
- HTTPS endpoint for webhooks (required by Fireflies)
Instructions
Step 1: Secure API Key Storage
# .env (NEVER commit)
FIREFLIES_API_KEY=your-api-key
FIREFLIES_WEBHOOK_SECRET=your-16-to-32-char-secret
# .gitignore
.env
.env.local
.env.*.local
Pre-commit hook to catch leaked keys:
#!/bin/bash
# .git/hooks/pre-commit
if git diff --cached --name-only | xargs grep -l 'FIREFLIES_API_KEY\s*=' 2>/dev/null; then
echo "ERROR: Potential API key in commit. Remove before committing."
exit 1
fi
Step 2: Webhook Signature Verification (HMAC-SHA256)
Fireflies signs webhook payloads with HMAC-SHA256. The signature arrives in the x-hub-signature header.
import crypto from "crypto";
function verifyFirefliesWebhook(
payload: string,
signature: string,
secret: string
): boolean {
const expected = crypto
.createHmac("sha256", secret)
.update(payload)
.digest("hex");
// Timing-safe comparison prevents timing attacks
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// Express middleware
import express from "express";
const app = express();
app.post("/webhooks/fireflies",
express.raw({ type: "application/json" }),
(req, res) => {
const signature = req.headers["x-hub-signature"] as string;
const payload = req.body.toString();
if (!signature || !verifyFirefliesWebhook(payload, signature, process.env.FIREFLIES_WEBHOOK_SECRET!)) {
console.warn("Invalid webhook signature rejected");
return res.status(401).json({ error: "Invalid signature" });
}
const event = JSON.parse(payload);
console.log(`Verified webhook: ${event.eventType} for ${event.meetingId}`);
res.status(200).json({ received: true });
}
);
Step 3: Configure Webhook Secret
- Go to app.fireflies.ai/settings
- Select Developer settings tab
- Enter a 16-32 character secret or click Generate
- Store the secret in your environment as
FIREFLIES_WEBHOOK_SECRET
Step 4: Python Webhook Verification
import hmac, hashlib, json
from flask import Flask, request, jsonify
app = Flask(__name__)
def verify_signature(payload: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode(), payload, hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
@app.post("/webhooks/fireflies")
def handle_webhook():
signature = request.headers.get("x-hub-signature", "")
if not verify_signature(request.data, signature, os.environ["FIREFLIES_WEBHOOK_SECRET"]):
return jsonify({"error": "Invalid signature"}), 401
event = request.json
print(f"Verified: {event['eventType']} for {event['meetingId']}")
return jsonify({"received": True})
Step 5: Transcript Privacy Levels
Fireflies supports these privacy levels via updateMeetingPrivacy:
| Level | Access |
|---|---|
owner | Only meeting organizer |
participants | Only meeting participants |
teammatesandparticipants | Workspace members + participants |
teammates | All workspace members |
link | Anyone with the link |
// Lock a transcript to participants only
await firefliesQuery(`
mutation($id: String!, $privacy: String!) {
updateMeetingPrivacy(transcript_id: $id, privacy_level: $privacy)
}
`, { id: "transcript-id", privacy: "participants" });
Step 6: API Key Rotation
set -euo pipefail
# 1. Generate new key in Fireflies dashboard (Integrations > Fireflies API)
# 2. Test new key
curl -s -X POST https://api.fireflies.ai/graphql \
-H "Authorization: Bearer $NEW_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "{ user { email } }"}' | jq '.data.user.email'
# 3. Update environment/secret store
# 4. Verify production
# 5. Old key is automatically invalidated when new one is generated
Security Checklist
- API key in environment variables, not code
-
.envfiles in.gitignore - Webhook signatures verified with HMAC-SHA256
- Webhook secret is 16-32 characters
- Transcript privacy set to
participantsor stricter - Pre-commit hook catches key leaks
- Separate API keys for dev/staging/prod
- HTTPS required for all webhook endpoints
Error Handling
| Issue | Detection | Fix |
|---|---|---|
| Leaked API key | Git scanning, CI alerts | Regenerate immediately in dashboard |
| Invalid webhook signature | 401 from your endpoint | Verify secret matches dashboard |
| Overly permissive privacy | Audit transcript visibility | Set to participants default |
| Key rotation gap | Auth failures after rotation | Deploy new key before revoking old |
Output
- Secure API key storage with leak prevention
- HMAC-SHA256 webhook signature verification
- Privacy-controlled transcript access
- Key rotation procedure
Resources
Next Steps
For production deployment, see fireflies-prod-checklist.
When not to use it
- →Storing API keys directly in source code
- →Using insecure HTTP endpoints for webhooks
Prerequisites
Limitations
- →Webhook secret must be 16-32 characters
- →HTTPS is required for all webhook endpoints
How it compares
Unlike manual security implementations, this provides specific pre-commit hook patterns and verified HMAC-SHA256 code snippets for Fireflies.ai.
Compared to similar skills
fireflies-security-basics side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| fireflies-security-basics (this skill) | 1 | 27d | Caution | Intermediate |
| file-uploads | 4 | 6mo | No flags | Advanced |
| graphql | 6 | 6mo | No flags | Advanced |
| vercel-webhooks-events | 3 | 27d | Caution | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
file-uploads
davila7
Expert at handling file uploads and cloud storage. Covers S3, Cloudflare R2, presigned URLs, multipart uploads, and image optimization. Knows how to handle large files without blocking. Use when: file upload, S3, R2, presigned URL, multipart.
graphql
davila7
GraphQL gives clients exactly the data they need - no more, no less. One endpoint, typed schema, introspection. But the flexibility that makes it powerful also makes it dangerous. Without proper controls, clients can craft queries that bring down your server. This skill covers schema design, resolvers, DataLoader for N+1 prevention, federation for microservices, and client integration with Apollo/urql. Key insight: GraphQL is a contract. The schema is the API documentation. Design it carefully.
vercel-webhooks-events
jeremylongshore
Implement Vercel webhook signature validation and event handling. Use when setting up webhook endpoints, implementing signature verification, or handling Vercel event notifications securely. Trigger with phrases like "vercel webhook", "vercel events", "vercel webhook signature", "handle vercel events", "vercel notifications".
identify-vault-protocol
tradingstrategy-ai
Identify an unknown vault protocol based on its smart contract address
exa-policy-guardrails
jeremylongshore
Implement Exa lint rules, policy enforcement, and automated guardrails. Use when setting up code quality rules for Exa integrations, implementing pre-commit hooks, or configuring CI policy checks for Exa best practices. Trigger with phrases like "exa policy", "exa lint", "exa guardrails", "exa best practices check", "exa eslint".
openevidence-multi-env-setup
jeremylongshore
Configure OpenEvidence across development, staging, and production environments. Use when setting up multiple environments, managing environment-specific configurations, or implementing environment promotion strategies for clinical AI applications. Trigger with phrases like "openevidence environments", "openevidence staging", "openevidence dev setup", "multi-environment openevidence".