Fathom Webhooks & Events
Prerequisites
- A verified callback endpoint, signature/authentication rule, idempotency store, redaction policy, and event owner.
Instructions
- Validate signatures before parsing payloads and acknowledge within the documented timeout.
- Deduplicate events using stable opaque IDs and record only necessary redacted metadata.
- Apply bounded retry/backoff for transient errors and quarantine malformed terminal failures.
Output
- A signed, idempotent webhook/event flow with redacted observability, recovery ownership, and a safe replay decision path.
Error Handling
| Condition | Safe response |
|---|---|
| Signature fails | Reject the event and investigate configuration without logging secrets/payload content. |
| Duplicate event arrives | Return idempotent success and avoid duplicate CRM/follow-up actions. |
| Processing fails permanently | Quarantine it with redacted metadata and fix the contract before replay. |
Examples
Test a development callback using a synthetic event, verify signature, deduplication, and a bounded failure path, then record only event ID/state/result. Do not persist transcript text, meeting content, contacts, or webhook secrets in the diagnostics.
Overview
Fathom webhooks send meeting data to your URL when recordings are ready. Webhooks can include summary, transcript, and action items. Configure in Settings or via API.
Webhook Setup
Via API
curl -X POST -H "X-Api-Key: ${FATHOM_API_KEY}" \
-H "Content-Type: application/json" \
https://api.fathom.ai/external/v1/webhooks \
-d '{
"url": "https://your-app.com/webhooks/fathom",
"include_summary": true,
"include_transcript": true,
"include_action_items": true,
"fire_on_own_meetings": true,
"fire_on_shared_meetings": false
}'
Via Settings
Navigate to Settings > Integrations > Webhooks > Create Webhook.
Webhook Payload
{
"type": "meeting_content_ready",
"recording_id": "rec-abc123",
"url": "https://fathom.video/call/abc123",
"share_url": "https://fathom.video/share/abc123",
"title": "Product Review Q1",
"summary": "Discussed roadmap priorities...",
"transcript": [...],
"action_items": [...]
}
Webhook Handler
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/webhooks/fathom", methods=["POST"])
def fathom_webhook():
event = request.json
if event.get("type") == "meeting_content_ready":
recording_id = event["recording_id"]
summary = event.get("summary", "")
actions = event.get("action_items", [])
# Process meeting data
print(f"Meeting ready: {event.get('title')} ({len(actions)} action items)")
return jsonify({"received": True}), 200
Testing Webhooks
# Test with webhook.site
curl -X POST https://webhook.site/your-uuid \
-H "Content-Type: application/json" \
-d '{"type": "meeting_content_ready", "recording_id": "test"}'
# Or use ngrok for local testing
ngrok http 5000
Resources
Next Steps
For performance optimization, see fathom-performance-tuning.