Fathom Rate Limits

SkillDev tools

'Handle Fathom API rate limits (60 requests/minute per user).

Use Fathom Rate Limits in Claude, ChatGPT or Ahel Desktop

Free. Sign in, add Fathom Rate Limits and connect your AI. About a minute.

Also: Claude Code · Cursor · Codex

Then ask your AI: use the Fathom Rate Limits skill

Details

Instructions available. Your AI can read the instructions. Execution depends on the setup they require.

Add Ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

Fathom Rate LimitsStart free

What this skill tells your AI

The instructions your AI receives, as published by jeremylongshore/tons-of-skills-marketplace in skills/.curated/fathom-rate-limits/SKILL.md and read by Ahel’s review.

Prerequisites

  • Current provider limits, aggregate baseline, stable request/event IDs, synthetic test data, and a capacity owner.

Instructions

  1. Bound concurrency and preserve idempotency for meeting, sync, and follow-up operations.
  2. Monitor throttling, queue age, errors, and duplicate-action risk using redacted aggregate metrics.
  3. Back off with jitter on transient limits and reduce load before replaying failed work.

Output

  • A rate-aware workflow with bounded retry, idempotency, redacted monitoring, and safe recovery ownership.

Examples

Increase synthetic development workload gradually below approved limits, record aggregate 429s/latency/completion, and apply backoff on throttling. Do not retry meeting/CRM follow-up actions without checking stable IDs, consent, and current state.

Overview

Fathom's API enforces a strict 60 requests-per-minute cap per user across all API keys. Since meeting transcripts and action items are often fetched in bulk after a day of calls, this limit becomes a real constraint for teams processing large meeting backlogs. Transcript endpoints are especially heavy because they return full conversation text, making pagination and careful throttling essential for any integration that syncs meeting intelligence into CRMs or project trackers.

Rate Limit Reference

EndpointLimitWindowScope
List meetings60 req1 minutePer user
Get transcript60 req1 minutePer user
Action items60 req1 minutePer user
Meeting summary60 req1 minutePer user
Webhook management10 req1 minutePer user

Rate Limiter Implementation

class FathomRateLimiter {
  private tokens: number = 60;
  private lastRefill: number = Date.now();
  private queue: Array<{ resolve: () => void }> = [];

  async acquire(): Promise<void> {
    this.refill();
    if (this.tokens >= 1) { this.tokens -= 1; return; }
    return new Promise(resolve => this.queue.push({ resolve }));
  }

  private refill() {
    const now = Date.now();
    const elapsed = now - this.lastRefill;
    this.tokens = Math.min(60, this.tokens + (elapsed / 60_000) * 60);
    this.lastRefill = now;
    while (this.tokens >= 1 && this.queue.length) {
      this.tokens -= 1;
      this.queue.shift()!.resolve();
    }
  }
}

const limiter = new FathomRateLimiter();

Retry Strategy

async function fathomRetry<T>(fn: () => Promise<Response>, maxRetries = 3): Promise<T> {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    await limiter.acquire();
    const res = await fn();
    if (res.ok) return res.json();
    if (res.status === 429) {
      const retryAfter = parseInt(res.headers.get("Retry-After") || "60", 10);
      const jitter = Math.random() * 3000;
      await new Promise(r => setTimeout(r, retryAfter * 1000 + jitter));
      continue;
    }
    if (res.status >= 500 && attempt < maxRetries) {
      await new Promise(r => setTimeout(r, Math.pow(2, attempt) * 2000));
      continue;
    }
    throw new Error(`Fathom API ${res.status}: ${await res.text()}`);
  }
  throw new Error("Max retries exceeded");
}

Batch Processing

async function syncAllTranscripts(meetingIds: string[], batchSize = 10) {
  const results: any[] = [];
  for (let i = 0; i < meetingIds.length; i += batchSize) {
    const batch = meetingIds.slice(i, i + batchSize);
    const batchResults = await Promise.all(
      batch.map(id => fathomRetry(() =>
        fetch(`${BASE}/api/v1/meetings/${id}/transcript`, { headers })
      ))
    );
    results.push(...batchResults);
    if (i + batchSize < meetingIds.length) await new Promise(r => setTimeout(r, 12_000));
  }
  return results;
}

Error Handling

IssueCauseFix
429 Too Many RequestsExceeded 60 req/min user capWait for Retry-After, then resume
Empty transcriptMeeting still processingPoll with 30s interval until ready
401 on refreshExpired OAuth tokenRotate token before batch starts
Timeout on long meetingsTranscript > 2 hours of audioRequest with Accept-Encoding: gzip
Missing action itemsAI extraction not yet completeRetry after 5-minute delay

Resources

  • Fathom API Documentation

Next Steps

See fathom-performance-tuning.

Signals

GitHub stars
3k
Forks
415
Last commit
Oct 2026
Advanced
Item type
skill
Key
fathom-rate-limits
Source
github.com/jeremylongshore/tons-of-skills-marketplace