Semarize

Get Your Data

Fathom - How to Get Your Meeting Data

A practical guide to getting your meeting data out of Fathom - covering API access, transcript extraction, incremental polling, webhook-triggered flows, and how to route structured data into your downstream systems.

What you'll learn

  • What meeting data you can extract from Fathom - transcripts, summaries, action items, and participant info
  • How to access data via the Fathom API - authentication, endpoints, and pagination
  • Three extraction patterns: historical backfill, incremental polling, and webhook-triggered
  • How to connect Fathom data pipelines to Zapier, n8n, and Make
  • Advanced use cases - meeting intelligence, sales coaching, productivity tracking, and custom analytics

Data

What Data You Can Extract From Fathom

Fathom is an AI meeting assistant that records, transcribes, and summarizes your meetings. Every meeting produces a rich set of structured assets that can be extracted via API - the full transcript, AI-generated summaries, action items, participant details, and CRM associations.

Common fields teams care about

Full transcript text
AI-generated meeting summary
Action items with owners
Speaker labels and participant info
CRM contact matches
Meeting date, time, and duration
Meeting title and agenda
Recording ID and metadata
Participant email addresses
Associated CRM record data

API Access

How to Get Transcripts via the Fathom API

Fathom exposes meetings and transcripts through a REST API at developers.fathom.ai. The workflow is: authenticate with an API key, list meetings by date range, then fetch the transcript for each recording - or inline it directly with a query parameter.

1

Authenticate

Fathom uses API key authentication at the user level. Generate an API key from your Fathom account settings and pass it as a Bearer token in the Authorization header on every request.

Authorization: Bearer fathom_api_key_...
Content-Type: application/json
API keys are scoped to individual users. You'll only have access to meetings recorded by the authenticated user. Generate your key from Settings > API in your Fathom account.
2

List meetings by date range

Call the GET /meetings endpoint with date filter parameters to retrieve meetings within a time range. Results are paginated. Add ?include_transcript=true to inline transcripts directly in the response.

GET https://api.fathom.ai/meetings?from=2025-01-01T00:00:00Z&to=2025-02-01T00:00:00Z

# Or with inline transcripts:
GET https://api.fathom.ai/meetings?from=2025-01-01T00:00:00Z&to=2025-02-01T00:00:00Z&include_transcript=true

The response returns an array of meeting objects with recording IDs, participant info, summaries, action items, and CRM matches. Paginate through the results until all meetings are retrieved.

3

Fetch the transcript

For each recording, request the transcript via GET /recordings/{recording_id}/transcript. The response contains the full transcript text with speaker labels and timestamps.

GET https://api.fathom.ai/recordings/rec_abc123/transcript

The transcript includes speaker identification and timestamps. You can also retrieve the transcript inline when listing meetings by using the include_transcript=true parameter, which avoids a second API call per meeting.

4

Handle rate limits and transcript availability

Rate limits

Fathom enforces a rate limit of 60 calls/minute. For bulk operations, pace requests at approximately 1 per second. Implement exponential backoff when you receive rate limit responses, and use pagination to work through large datasets incrementally.

Transcript timing

Transcripts are not available the instant a meeting ends. Fathom processes recordings asynchronously - typical lag is a few minutes depending on meeting length. Use webhooks to be notified when processing completes, or build a short buffer into your polling schedule.

Patterns

Key Extraction Flows

There are three practical patterns for getting transcripts out of Fathom. The right choice depends on whether you're doing a one-off migration, running ongoing extraction, or need near real-time processing.

Backfill (Historical Export)

One-off migration of past meetings

1

Define your date range - typically 3-6 months of historical meetings, or all available data if migrating

2

Call GET /meetings with from and to date filters. Paginate through the full result set, collecting all meeting and recording IDs

3

For each recording ID, fetch the transcript via GET /recordings/{recording_id}/transcript. Pace requests to stay within the 60 calls/minute rate limit

4

Store each transcript with its meeting metadata (meeting ID, date, participants, summary, action items) in your data warehouse or object store

5

Once the backfill completes, run your analysis pipeline against the stored data in bulk

Tip: Use ?include_transcript=true on the meetings list endpoint to avoid a separate transcript fetch per meeting. This reduces your total API calls significantly during backfills.

Incremental Polling

Ongoing extraction on a schedule

1

Set a cron job or scheduled trigger (hourly, daily, etc.) that runs your extraction script

2

On each run, call GET /meetings with the from parameter set to your last successful poll timestamp

3

Fetch transcripts for any new recording IDs returned. Use the meeting ID as a deduplication key to avoid reprocessing

4

Route each transcript and its metadata to your downstream pipeline - analysis tool, warehouse, or automation platform

5

Update your stored timestamp to the current run time for the next poll cycle

Tip: Account for transcript processing delay. A meeting that ended 5 minutes ago may not have a transcript yet. Polling with a 30-60 minute lag reduces empty fetches.

Webhook-Triggered

Near real-time on meeting completion

1

Register a webhook endpoint in your Fathom account settings. Fathom fires events when a meeting is processed and the transcript becomes available

2

When the webhook fires, parse the event payload to extract the recording ID and meeting metadata

3

Fetch the transcript via GET /recordings/{recording_id}/transcript using the recording ID from the event

4

Route the transcript and metadata downstream - to your analysis pipeline, CRM updater, or automation tool

Note: Fathom supports webhooks for meeting events, enabling near real-time processing. This is the most efficient pattern since you avoid both polling overhead and transcript availability timing issues.

Automation

Send Fathom Transcripts to Automation Tools

Once you can extract transcripts from Fathom, the next step is routing them through Semarize for structured analysis and into your downstream systems. Below are end-to-end example flows - each showing the full pipeline from Fathom trigger through Semarize evaluation to CRM, Slack, or database output.

ZapierNo-code automation

Fathom → Zapier → Semarize → CRM

Detect new Fathom meetings via webhook, fetch the transcript, send it to Semarize for structured analysis, then write the scored output - signals, flags, and evidence - directly to your CRM.

Example Zap
Trigger: Fathom Webhook
Fires when Fathom processes a new meeting
App: Webhooks by Zapier
Event: Catch Hook
Output: recording_id, meeting_title
Webhooks by Zapier
Fetch transcript from Fathom API
Method: GET
URL: https://api.fathom.ai/recordings/{{recording_id}}/transcript
Auth: Bearer fathom_api_key_...
Transcript returned
Webhooks by Zapier
POST /v1/runs (sync) to Semarize
Method: POST
URL: https://api.semarize.com/v1/runs
Auth: Bearer smz_live_...
Body: { kit_code, mode: "sync", input: { transcript } }
Structured output returned
Formatter by Zapier
Extract brick values from Semarize response
Extract: bricks.overall_score.value
Extract: bricks.risk_flag.value
Extract: bricks.action_items.value
Salesforce - Update Record
Write scored signals to Opportunity
Object: Opportunity
AI Score: {{overall_score}}
Risk Flag: {{risk_flag}}
Action Items: {{action_items}}

Setup steps

1

Create a new Zap. Choose "Webhooks by Zapier" as the trigger and select "Catch Hook". Copy the webhook URL and register it in your Fathom account settings to receive meeting completion events.

2

Add a "Webhooks by Zapier" Action (Custom Request) to fetch the transcript from Fathom. Set method to GET, URL to https://api.fathom.ai/recordings/{{recording_id}}/transcript, and add your Fathom API key as a Bearer token.

3

Add a second "Webhooks by Zapier" Action. Set method to POST, URL to https://api.semarize.com/v1/runs. Add your Semarize API key as a Bearer token. In the body, set kit_code to your Kit, mode to "sync", and map the transcript text into input.transcript.

4

Add a Formatter step to extract individual brick values from the Semarize JSON response - overall_score, risk_flag, action_items, etc.

5

Add a Salesforce (or HubSpot, Sheets, etc.) Action to write the extracted scores and signals to your CRM record.

6

Test each step end-to-end, then turn on the Zap.

Watch out for: Zapier has step data size limits that can truncate very long transcripts. For meetings over 60 minutes, consider storing the transcript in cloud storage and passing a reference URL instead of inline text. Use mode: "sync" so Semarize returns results inline - Zapier doesn't natively support polling loops.
Learn more about Zapier automation
n8nSelf-hosted workflows

Fathom → n8n → Semarize → Database

Poll Fathom for new meetings on a schedule, fetch transcripts, send each one to Semarize for analysis, then write the structured scores and signals to your database. n8n's native loop support handles pagination and batch processing.

Example Workflow
Cron - Every Hour
Triggers the workflow on schedule
Mode: Every Hour
Timezone: UTC
HTTP Request - List Meetings
GET /meetings (Fathom)
Method: GET
URL: https://api.fathom.ai/meetings
Auth: Bearer fathom_api_key_...
Params: from={{$now.minus(1, 'hour')}}&include_transcript=true
For each meeting
Code - Extract Transcript
Parse transcript from meeting response
Extract: transcript text from meeting object
HTTP Request - Semarize
POST /v1/runs (sync)
URL: https://api.semarize.com/v1/runs
Auth: Bearer smz_live_...
Body: { kit_code, mode: "sync", input: { transcript } }
Scores & signals returned
Postgres - Insert Row
Write structured output to database
Table: meeting_evaluations
Columns: meeting_id, score, risk_flag, action_items

Setup steps

1

Add a Cron node as the workflow trigger. Set the interval to your desired polling frequency (hourly works well for most teams).

2

Add an HTTP Request node to list new meetings from Fathom. Set method to GET, URL to https://api.fathom.ai/meetings, configure Bearer auth with your API key, and add from parameter set to one interval ago. Include ?include_transcript=true to get transcripts inline.

3

Add a Split In Batches node to iterate over the returned meetings. Inside the loop, add a Code node to extract the transcript text from each meeting object.

4

Add another HTTP Request node to send the transcript to Semarize. Set method to POST, URL to https://api.semarize.com/v1/runs. Add your API key as a Bearer token. Set kit_code, mode to "sync", and map the transcript into input.transcript.

5

Add a Code node to extract the brick values from the Semarize response - overall_score, risk_flag, action_items, evidence, confidence.

6

Add a Postgres (or MySQL / HTTP Request) node to write the structured output. Use meeting_id as the primary key for upserts.

7

Activate the workflow. Monitor the first few runs to verify Semarize responses are arriving and writing correctly.

Watch out for: Use meeting IDs as deduplication keys to prevent reprocessing. Using include_transcript=true saves API calls but produces larger payloads. You can also use async mode with n8n's native loop - POST /v1/runs (default async), then poll GET /v1/runs/:runId with a Wait + IF loop until status is "succeeded".
Learn more about n8n automation
MakeVisual automation with branching

Fathom → Make → Semarize → CRM + Slack

Fetch new Fathom transcripts on a schedule, send each to Semarize for structured analysis, then use a Router to branch the scored output - alert on risk flags via Slack and write all signals to your CRM.

Example Scenario
Schedule - Every 30 min
Triggers the scenario on interval
Interval: 30 minutes
HTTP - List New Meetings
GET /meetings (Fathom)
Method: GET
Auth: Bearer fathom_api_key_...
Params: from={{formatDate(...)}}&include_transcript=true
HTTP - Semarize
POST /v1/runs (sync)
URL: https://api.semarize.com/v1/runs
Auth: Bearer smz_live_...
Body: { kit_code, mode: "sync", input: { transcript } }
Structured output
Router - Branch on Risk Flag
Route by Semarize output
Branch 1: IF risk_flag.value = true
Branch 2: ALL (fallthrough)
Branch 1 - Risk detected
Slack - Alert Channel
Notify team about flagged meeting
Channel: #meeting-alerts
Message: Risk on {{meeting_title}}, score: {{score}}
Branch 2 - All meetings
Salesforce - Update Record
Write all scored signals to Opportunity
AI Score: {{overall_score}}
Risk Flag: {{risk_flag}}
Action Items: {{action_items}}

Setup steps

1

Create a new Scenario. Add a Schedule module as the trigger, set to your desired interval (15-60 minutes is typical).

2

Add an HTTP module to list new meetings from Fathom. Set method to GET, URL to https://api.fathom.ai/meetings, configure Bearer auth with your API key, and filter by from date since the last run. Add include_transcript=true to get transcripts inline.

3

Add an Iterator module to loop through each meeting. For each, the transcript is already available in the response since we used include_transcript=true.

4

Add another HTTP module to send the transcript to Semarize. Set URL to https://api.semarize.com/v1/runs, add your Bearer token, and set kit_code, mode to "sync", and input.transcript from the previous step. Parse the response as JSON.

5

Add a Router module. Define Branch 1 with a filter: bricks.risk_flag.value equals true. Leave Branch 2 as a fallthrough (no filter).

6

On Branch 1, add a Slack module to alert your team when risk is detected. Map the score, risk flag, and meeting title into the message.

7

On Branch 2, add a Salesforce module to write all brick values (score, risk_flag, action_items) to the Opportunity record.

8

Set the scenario schedule and activate. Monitor the first few runs in Make's execution log.

Watch out for: Each API call counts as an operation. Using include_transcript=true reduces operations by combining the meeting list and transcript fetch into one call. A scenario processing 20 meetings uses ~40 operations (list + Semarize per meeting). Use mode: "sync" to avoid needing a polling loop for each run.
Learn more about Make automation

What you can build

What You Can Do With Fathom Data in Semarize

Custom scoring frameworks, cross-meeting intelligence, behavioral coaching analytics, and building your own tools on structured meeting signals.

Structured Interview Bias & Consistency Audit

Interview Quality Assurance

What Semarize generates

question_consistency = 0.52bias_indicators = 4competency_coverage = 3/6interview_guide_adherence = 0.61

Your HR team records every interview. Are interviewers asking consistent, unbiased questions that follow the structured interview guide? Run every interview transcript through an interview calibration kit grounded against your structured interview document. Semarize scores each for question_consistency (did the interviewer follow the guide?), bias_indicator_count (leading questions, assumptions, gendered language patterns), competency_coverage (were all required competencies assessed?), and interview_guide_adherence. A monthly calibration report shows that Hiring Manager A only covers 3 of 6 competencies and asks 2.5x more leading questions than the team average. Targeted interviewer training improves consistency - and reduces time-to-hire by 18%.

Learn more about QA & Compliance
Interview Calibration ReportBenchmark: Team Average
Hiring Mgr A
4 bias52% consistent
Competency coverage
3/6 competencies
Hiring Mgr B
1 bias81% consistent
Competency coverage
5/6 competencies
Hiring Mgr C
93% consistent
Competency coverage
6/6 competencies
3 managers assessed · Mgr A flagged for targeted training · 2.5x above avg leading questions

Knowledge-Grounded Account Intelligence

Roadmap & Pricing Verification

What Semarize generates

roadmap_alignment = 0.72pricing_reference_correct = falseupsell_precision = 0.85pain_to_capability_match = "strong"

Your CS and sales teams reference product roadmap items and pricing on every customer call. Are those references accurate? Run every customer call through a knowledge-grounded kit against your product roadmap document and current pricing sheet. Semarize scores roadmap_alignment (did the rep reference features actually on the roadmap?), pricing_reference_correct (was the quoted price current?), upsell_precision (did they recommend the right tier for the customer’s usage?), and pain_to_capability_match. After scoring 200 calls, the data shows reps consistently reference a feature that was deprioritised two quarters ago. Product marketing updates the internal talking points within days — not after the next quarterly enablement session.

Learn more about Customer Success
Expansion Signal Dashboard$340k pipeline
Acme CorpNot in CRM
Intentuser_limitsBudget
92
readiness
TechFlow IncNot in CRM
Intentapi_rate_limits
78
readiness
DataScale
user_limitsBudget
65
readiness
CloudFirst
Intent
54
readiness
15 accounts hit user limits last quarter · 2 flagged for proactive outreach

Cross-Meeting Decision Continuity Scoring

Follow-Through Analysis

What Semarize generates

follow_through_rate = 59%dropped_commitments = 3decision_referenced = falseclose_rate_correlation = 2.8x

Action items get captured after every meeting — but do those commitments actually carry through to the next call? Run pairs of consecutive meeting transcripts through a commitment tracking kit. Semarize compares commitments_made in meeting N with commitments_referenced in meeting N+1, scoring follow_through_rate, dropped_commitments, and new_blockers_introduced. Across your sales team, the data shows a 41% commitment drop-off between discovery and demo calls. Deals where commitments carry through close at 2.8x the rate. Pipeline reviews now include commitment continuity as a deal health metric.

Learn more about RevOps
Commitment Flow: Discovery → Demo40% follow-through
Meeting 1
Discovery Call
Meeting 2
Demo Call
Send pricing proposal
Share technical docs
Introduce to engineering lead
Schedule stakeholder review
Confirm budget approval timeline
41% avg drop-off across teamCarry-through deals close 2.8x

Knowledge-Grounded Methodology Scoring

Your Framework, Evidence-Backed

Vibe-coded

What Semarize generates

methodology_adherence = 78evidence_spans = 12framework_version = "v3.2"coaching_priority = "solution_mapping"

A VP of Sales vibe-codes a Next.js leaderboard app that scores every call against YOUR methodology document - not a vendor's template. Each rep's calls get run through a knowledge-grounded methodology kit that checks against the actual playbook PDF. Semarize scores methodology_adherence with evidence_spans linking each score to the specific transcript moment. When your methodology changes (new objection handling framework, updated discovery questions), you update the kit the same week. The leaderboard updates with rankings, trend arrows, and coaching priorities per rep - each backed by evidence from the transcript. The team's average methodology score improves 22% in one quarter because coaching is specific, evidence-backed, and always current.

Learn more about Sales Coaching
Methodology LeaderboardVibe-coded with Next.js
#1
Sarah K.
Pain: 91Sol: 82Stake: 88
87
#2
Mike L.Most Improved
Pain: 78Sol: 65Stake: 82
75
#3
Amy R.
Pain: 72Sol: 71Stake: 69
71
#4
James T.
Pain: 65Sol: 58Stake: 74
66
#5
Priya N.
Pain: 60Sol: 55Stake: 62
59
Team avg methodology score up 22% this quarter - coaching is specific, measurable, consistent

Watch out for

Common Challenges & Gotchas

These are the issues that come up most often when teams start extracting transcripts from Fathom at scale.

Rate limit ceiling at 60 calls/minute

Fathom's API enforces a 60 calls/minute rate limit. For bulk backfills with hundreds of meetings, you need to pace requests carefully. Implement request queuing with delays to avoid hitting the ceiling, especially when fetching individual transcripts.

Transcript processing delay

Transcripts are not available the instant a meeting ends. Fathom processes recordings asynchronously. Attempting to fetch a transcript too soon after a meeting will return incomplete or unavailable data. Use webhooks or a retry mechanism with a short delay.

API key scope is user-level

Fathom API keys are scoped to individual users, not organizations. This means you only have access to meetings recorded by the authenticated user. If you need organization-wide data, you may need to coordinate API keys across multiple users or use a shared recording account.

Pagination handling for large meeting histories

The GET /meetings endpoint returns paginated results. For teams with extensive meeting histories, you need to handle pagination correctly - tracking your position and resuming from where you left off if a batch is interrupted.

Inline transcript payloads can be large

Using ?include_transcript=true on the meetings list endpoint returns transcript data inline, which can produce very large response payloads for long meetings. Consider fetching transcripts separately for meetings over 60 minutes to avoid payload size issues in automation tools.

CRM match accuracy varies

Fathom attempts to match meeting participants to CRM contacts, but the accuracy depends on email matching and CRM data quality. Validate CRM associations before using them as keys for downstream enrichment or routing.

Duplicate processing protection

Without idempotency checks, re-running an extraction flow can process the same meeting twice. Use meeting IDs or recording IDs as deduplication keys to ensure each transcript is handled exactly once in your pipeline.

FAQ

Frequently Asked Questions

Explore

Explore Semarize