curl --request GET \
--url https://api.fathom.ai/external/v1/meetings \
--header 'X-Api-Key: <api-key>'import requests
url = "https://api.fathom.ai/external/v1/meetings"
headers = {"X-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Api-Key': '<api-key>'}};
fetch('https://api.fathom.ai/external/v1/meetings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fathom.ai/external/v1/meetings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fathom.ai/external/v1/meetings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fathom.ai/external/v1/meetings")
.header("X-Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fathom.ai/external/v1/meetings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"limit": 1,
"next_cursor": "eyJwYWdlX251bSI6Mn0=",
"items": [
{
"title": "Quarterly Business Review",
"meeting_title": "QBR 2025 Q1",
"meeting_type": "Quarterly Business Review",
"recording_id": 123456789,
"url": "https://fathom.video/xyz123",
"share_url": "https://fathom.video/share/xyz123",
"created_at": "2025-03-01T17:01:30Z",
"scheduled_start_time": "2025-03-01T16:00:00Z",
"scheduled_end_time": "2025-03-01T17:00:00Z",
"recording_start_time": "2025-03-01T16:01:12Z",
"recording_end_time": "2025-03-01T17:00:55Z",
"calendar_invitees_domains_type": "one_or_more_external",
"shared_with": "single_team",
"transcript_language": "en",
"calendar_invitees": [
{
"name": "Alice Johnson",
"email": "alice.johnson@acme.com",
"email_domain": "acme.com",
"is_external": false,
"matched_speaker_display_name": "Alice Johnson"
}
],
"recorded_by": {
"name": "Alice Johnson",
"email": "alice.johnson@acme.com",
"email_domain": "acme.com",
"team": "Marketing"
},
"meeting_url": "https://us02web.zoom.us/j/123456789",
"transcript": [
{
"speaker": {
"display_name": "Alice Johnson",
"matched_calendar_invitee_email": "alice.johnson@acme.com"
},
"text": "Let's revisit the budget allocations.",
"timestamp": "00:05:32"
}
],
"default_summary": {
"template_name": "general",
"markdown_formatted": "## Summary\nWe reviewed Q1 OKRs, identified budget risks, and agreed to revisit projections next month.\n"
},
"action_items": [
{
"description": "Email revised proposal to client",
"user_generated": false,
"completed": false,
"recording_timestamp": "00:10:45",
"recording_playback_url": "https://fathom.video/calls/xyz123?timestamp=645",
"assignee": {
"name": "Alice Johnson",
"email": "alice.johnson@acme.com",
"team": "Marketing"
}
}
],
"highlights": [
{
"type": "Objection",
"summary": "Pushed back on price",
"start_time": 16,
"end_time": 27.5,
"text": "They pushed back hard on the price"
}
],
"crm_matches": {
"contacts": [
{
"name": "Jane Smith",
"email": "jane.smith@client.com",
"record_url": "https://app.hubspot.com/contacts/123"
}
],
"companies": [
{
"name": "Acme Corp",
"record_url": "https://app.hubspot.com/companies/456"
}
],
"deals": [
{
"name": "Q1 Renewal",
"amount": 50000,
"record_url": "https://app.hubspot.com/deals/789"
}
],
"error": "no CRM connected"
}
}
]
}List meetings
curl --request GET \
--url https://api.fathom.ai/external/v1/meetings \
--header 'X-Api-Key: <api-key>'import requests
url = "https://api.fathom.ai/external/v1/meetings"
headers = {"X-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Api-Key': '<api-key>'}};
fetch('https://api.fathom.ai/external/v1/meetings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fathom.ai/external/v1/meetings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fathom.ai/external/v1/meetings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fathom.ai/external/v1/meetings")
.header("X-Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fathom.ai/external/v1/meetings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"limit": 1,
"next_cursor": "eyJwYWdlX251bSI6Mn0=",
"items": [
{
"title": "Quarterly Business Review",
"meeting_title": "QBR 2025 Q1",
"meeting_type": "Quarterly Business Review",
"recording_id": 123456789,
"url": "https://fathom.video/xyz123",
"share_url": "https://fathom.video/share/xyz123",
"created_at": "2025-03-01T17:01:30Z",
"scheduled_start_time": "2025-03-01T16:00:00Z",
"scheduled_end_time": "2025-03-01T17:00:00Z",
"recording_start_time": "2025-03-01T16:01:12Z",
"recording_end_time": "2025-03-01T17:00:55Z",
"calendar_invitees_domains_type": "one_or_more_external",
"shared_with": "single_team",
"transcript_language": "en",
"calendar_invitees": [
{
"name": "Alice Johnson",
"email": "alice.johnson@acme.com",
"email_domain": "acme.com",
"is_external": false,
"matched_speaker_display_name": "Alice Johnson"
}
],
"recorded_by": {
"name": "Alice Johnson",
"email": "alice.johnson@acme.com",
"email_domain": "acme.com",
"team": "Marketing"
},
"meeting_url": "https://us02web.zoom.us/j/123456789",
"transcript": [
{
"speaker": {
"display_name": "Alice Johnson",
"matched_calendar_invitee_email": "alice.johnson@acme.com"
},
"text": "Let's revisit the budget allocations.",
"timestamp": "00:05:32"
}
],
"default_summary": {
"template_name": "general",
"markdown_formatted": "## Summary\nWe reviewed Q1 OKRs, identified budget risks, and agreed to revisit projections next month.\n"
},
"action_items": [
{
"description": "Email revised proposal to client",
"user_generated": false,
"completed": false,
"recording_timestamp": "00:10:45",
"recording_playback_url": "https://fathom.video/calls/xyz123?timestamp=645",
"assignee": {
"name": "Alice Johnson",
"email": "alice.johnson@acme.com",
"team": "Marketing"
}
}
],
"highlights": [
{
"type": "Objection",
"summary": "Pushed back on price",
"start_time": 16,
"end_time": 27.5,
"text": "They pushed back hard on the price"
}
],
"crm_matches": {
"contacts": [
{
"name": "Jane Smith",
"email": "jane.smith@client.com",
"record_url": "https://app.hubspot.com/contacts/123"
}
],
"companies": [
{
"name": "Acme Corp",
"record_url": "https://app.hubspot.com/companies/456"
}
],
"deals": [
{
"name": "Q1 Renewal",
"amount": 50000,
"record_url": "https://app.hubspot.com/deals/789"
}
],
"error": "no CRM connected"
}
}
]
}Authorizations
Include your API key in the X-Api-Key header of every request.
Query Parameters
Domains of the companies to filter by. Exact match.
Pass the parameter once per value, e.g.
calendar_invitees_domains[]=acme.com&calendar_invitees_domains[]=client.com.
Returns meetings whose associated company matches one of the specified domains. (Note that meetings are only associated with one company.)
["acme.com", "client.com"]
Filter by whether calendar invitee list includes external email domains.
all, only_internal, one_or_more_external Filter to meetings with created_at after this timestamp, e.g. created_after=2025-01-01T00:00:00Z.
Filter to meetings with created_at before this timestamp, e.g. created_before=2025-01-01T00:00:00Z.
Cursor for pagination.
Include the action items for each meeting.
Include CRM matches for each meeting. Only returns data from your or your team's linked CRM.
Include the highlights for each meeting.
Include the summary for each meeting. Unavailable for OAuth connected apps (use /recordings instead).
Include the transcript for each meeting. Unavailable for OAuth connected apps (use /recordings instead).
Filter by meeting type name.
Returns only meetings assigned the meeting type with this name. Use /meeting_types to discover valid values. An unknown or non-matching name returns an empty list.
"Quarterly Business Review"
Email addresses of users who recorded meetings.
Pass the parameter once per value, e.g.
recorded_by[]=ceo@acme.com&recorded_by[]=pm@acme.com.
Returns meetings recorded by any of the specified users.
If no value is passed (or with teams[]), calls from users external to your Org will not be returned.
["ceo@acme.com", "pm@acme.com"]
Team names to filter by.
Pass the parameter once per value, e.g.
teams[]=Sales&teams[]=Engineering.
Returns meetings that belong to any of the specified teams.
If no value is passed (or with recorded_by[]), calls from users external to your Org will not be returned.
["Sales", "Engineering"]

