# Using Homebrew (macOS)
brew install ngrok
# Or download from https://ngrok.com/download- Go to
/settings/api-keysin your app - Click "Create API Key"
- Name it "Fireflies Webhook"
- Copy the 32-character API key (e.g.,
a1b2c3d4e5f6789012345678901234567890abcd) - This key will be used as your Fireflies webhook secret
npm run devYour app should be running on http://localhost:3000
In a new terminal:
ngrok http 3000You'll see output like:
Session Status online
Account your-email@example.com
Version 3.x.x
Region United States (us)
Latency -
Web Interface http://127.0.0.1:4040
Forwarding https://abc123.ngrok-free.app -> http://localhost:3000
Your webhook URL will be:
https://abc123.ngrok-free.app/api/webhooks/fireflies
- Go to Fireflies Dashboard Settings
- Navigate to "Developer Settings" tab
- Enter your ngrok URL:
https://abc123.ngrok-free.app/api/webhooks/fireflies - Enter your 32-character API key (from step 1) as the webhook secret
- Save the settings
- Go to app.fireflies.ai/upload
- Upload an audio file
- Check your terminal logs for webhook events
curl -X POST http://localhost:3000/api/webhooks/fireflies \
-H "Content-Type: application/json" \
-H "x-hub-signature: sha256=test-signature" \
-d '{
"meetingId": "test-meeting-123",
"eventType": "Transcription completed",
"clientReferenceId": "test-client-ref-456"
}'# Replace YOUR_API_KEY_HERE with your actual 32-character API key
API_KEY="a1b2c3d4e5f6789012345678901234567890abcd"
# Generate proper signature for testing
echo -n '{"meetingId":"test-meeting-123","eventType":"Transcription completed"}' | \
openssl dgst -sha256 -hmac "$API_KEY" | \
awk '{print "sha256="$2}'
# Then use the output in your curl request
curl -X POST http://localhost:3000/api/webhooks/fireflies \
-H "Content-Type: application/json" \
-H "x-hub-signature: sha256=GENERATED_SIGNATURE_HERE" \
-d '{"meetingId":"test-meeting-123","eventType":"Transcription completed"}'Look for messages like:
🔥 Fireflies webhook received: { signature: ..., body: ... }
✅ Webhook signature verified
📝 Processing Fireflies webhook: { meetingId: ..., eventType: ... }
✅ Transcription completion handled successfully
Visit http://127.0.0.1:4040 to see all requests to your local server
Use Prisma Studio to verify data was created:
npx prisma studioWhen ready for production:
- Deploy your app to Vercel/Railway/etc.
- Create an API key in your production app at
/settings/api-keys - Update the webhook URL in Fireflies to your production domain:
https://your-app.vercel.app/api/webhooks/fireflies - Update the webhook secret in Fireflies to use your production API key
- ngrok URL changes: Free ngrok URLs change each restart. Upgrade to ngrok Pro for static URLs
- Signature verification fails: Make sure your API key matches exactly in both your app and Fireflies
- API key expired: Check that your API key hasn't expired in
/settings/api-keys - CORS issues: The webhook endpoint handles POST requests, browsers might show CORS warnings for GET requests (this is normal)
- Webhook not firing: Ensure the URL is accessible and returns 200 status codes
# Test if your webhook endpoint is accessible
curl https://your-ngrok-url.ngrok-free.app/api/webhooks/fireflies
# Should return: {"message":"Fireflies webhook endpoint is active","timestamp":"..."}