PHPackages                             codepreneur/laravel-fathom - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. codepreneur/laravel-fathom

ActiveLibrary[API Development](/categories/api)

codepreneur/laravel-fathom
==========================

A Laravel SDK for the Fathom AI API.

v0.1.0(today)00MITPHPPHP ^8.2CI passing

Since Aug 14Pushed todayCompare

[ Source](https://github.com/kodpreneur-dooel/laravel-fathom)[ Packagist](https://packagist.org/packages/codepreneur/laravel-fathom)[ RSS](/packages/codepreneur-laravel-fathom/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (7)Versions (2)Used By (0)

Laravel Fathom
==============

[](#laravel-fathom)

A Laravel SDK for the [Fathom AI API](https://developers.fathom.ai/).

[![Tests](https://github.com/kodpreneur-dooel/laravel-fathom/actions/workflows/tests.yml/badge.svg)](https://github.com/kodpreneur-dooel/laravel-fathom/actions/workflows/tests.yml)[![License: MIT](https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667)](LICENSE)

Open-source Laravel SDK for the Fathom AI API — meetings, transcripts, summaries and webhooks.

Features
--------

[](#features)

- Laravel-native facade and service provider with auto-discovery
- Typed DTOs with forward-compatible `raw()` access
- Cursor pagination support
- Webhook signature verification and middleware
- Rate limit exception with header details
- Comprehensive offline test suite
- No database dependency — storage-agnostic SDK

Requirements
------------

[](#requirements)

- PHP 8.2+ (PHP 8.3+ required for Laravel 13)
- Laravel 11, 12, or 13

Installation
------------

[](#installation)

```
composer require codepreneur/laravel-fathom
```

Publish the configuration (optional):

```
php artisan vendor:publish --tag=fathom-config
```

Fathom API Key
--------------

[](#fathom-api-key)

Generate an API key in your [Fathom Settings → API Access](https://fathom.video/customize#api-access-header).

Configuration
-------------

[](#configuration)

Add to your `.env`:

```
FATHOM_API_KEY=your-api-key
FATHOM_WEBHOOK_SECRET=whsec_your-webhook-secret
```

Configuration options in `config/fathom.php`:

KeyDescriptionDefault`api_key`Your Fathom API key—`base_url`API base URL`https://api.fathom.ai/external/v1``timeout`HTTP timeout in seconds`30``webhook.secret`Webhook signing secret—`webhook.tolerance`Signature timestamp tolerance (seconds)`300`Basic Usage
-----------

[](#basic-usage)

```
use Codepreneur\Fathom\Facades\Fathom;

$meetings = Fathom::meetings()->list();
$transcript = Fathom::recordings()->transcript($recordingId);
$summary = Fathom::recordings()->summary($recordingId);
```

Meetings
--------

[](#meetings)

```
$page = Fathom::meetings()->list();

foreach ($page->items as $meeting) {
    echo $meeting->title;
    echo $meeting->recordingId;
    echo $meeting->recordedBy->email;
}
```

### Meeting Filtering

[](#meeting-filtering)

```
$page = Fathom::meetings()->list([
    'recorded_by' => ['ceo@acme.com'],
    'teams' => ['Sales', 'Engineering'],
    'created_after' => '2025-01-01T00:00:00Z',
    'created_before' => '2025-12-31T23:59:59Z',
    'meeting_type' => 'Quarterly Business Review',
    'calendar_invitees_domains_type' => 'one_or_more_external',
    'include_transcript' => true,
    'include_summary' => true,
    'include_action_items' => true,
    'include_highlights' => true,
    'include_crm_matches' => true,
]);
```

### Meeting Types

[](#meeting-types)

```
$types = Fathom::meetings()->types();
```

Pagination
----------

[](#pagination)

Fathom uses cursor-based pagination:

```
$page = Fathom::meetings()->list();

foreach ($page->items as $meeting) {
    // process meeting
}

if ($page->hasMore()) {
    $nextPage = Fathom::meetings()->next($page);
}
```

Transcripts
-----------

[](#transcripts)

```
$transcript = Fathom::recordings()->transcript($recordingId);

foreach ($transcript->entries as $entry) {
    echo $entry->speaker->displayName;
    echo $entry->speaker->matchedCalendarInviteeEmail;
    echo $entry->text;
    echo $entry->timestamp; // e.g. "00:05:32"
}
```

For async delivery, pass a `destination_url`:

```
$transcript = Fathom::recordings()->transcript($recordingId, [
    'destination_url' => 'https://example.com/callback',
]);
```

Summaries
---------

[](#summaries)

```
$summary = Fathom::recordings()->summary($recordingId);

echo $summary->templateName;
echo $summary->markdown;
```

Recording Downloads
-------------------

[](#recording-downloads)

```
$download = Fathom::recordings()->requestDownload($recordingId);

while ($download->isProcessing()) {
    sleep(2);
    $download = Fathom::recordings()->downloadStatus($recordingId, $download->downloadId);
}

if ($download->isCompleted()) {
    $url = $download->video?->url ?? $download->audio?->url;
}
```

Teams
-----

[](#teams)

```
$teams = Fathom::teams()->list();

foreach ($teams->items as $team) {
    echo $team->name;
}
```

Team Members
------------

[](#team-members)

```
$members = Fathom::teamMembers()->list(['team' => 'Sales']);

foreach ($members->items as $member) {
    echo $member->name;
    echo $member->email;
}
```

Users
-----

[](#users)

Admin-only endpoint for listing users and permissions:

```
$users = Fathom::users()->list();
```

Webhooks
--------

[](#webhooks)

### Create a Webhook

[](#create-a-webhook)

```
$webhook = Fathom::webhooks()->create([
    'destination_url' => 'https://example.com/webhooks/fathom',
    'triggered_for' => ['my_recordings'],
    'include_transcript' => true,
    'include_summary' => true,
    'include_action_items' => true,
]);

// Store the secret securely — it is only returned once
$webhook->id;
$webhook->secret;
```

Available `triggered_for` values:

- `my_recordings`
- `shared_external_recordings`
- `my_shared_with_team_recordings` (Team Plans)
- `shared_team_recordings` (Team Plans)

### Delete a Webhook

[](#delete-a-webhook)

```
Fathom::webhooks()->delete($webhookId);
```

Webhook Verification
--------------------

[](#webhook-verification)

Fathom signs webhooks using HMAC SHA-256. Verify incoming requests:

```
if (Fathom::webhooks()->verify($request)) {
    $meeting = Fathom::webhooks()->meeting($request);
}
```

Parse webhook payloads:

```
$payload = Fathom::webhooks()->payload($request);
$meeting = Fathom::webhooks()->meeting($request);
```

Middleware
----------

[](#middleware)

Register the middleware alias in your routes:

```
use App\Http\Controllers\FathomWebhookController;

Route::post('/webhooks/fathom', FathomWebhookController::class)
    ->middleware('fathom.webhook');
```

Events
------

[](#events)

Listen for webhook events:

```
use Codepreneur\Fathom\Events\FathomMeetingReceived;
use Codepreneur\Fathom\Events\FathomWebhookReceived;

Event::listen(FathomMeetingReceived::class, StoreMeeting::class);
Event::listen(FathomWebhookReceived::class, LogWebhook::class);
```

Dispatch events manually:

```
Fathom::webhooks()->dispatchEvents($request);
```

Exceptions
----------

[](#exceptions)

ExceptionHTTP Status`AuthenticationException`401, 403`NotFoundException`404`ValidationException`422`RateLimitException`429`FathomException`OtherHandle rate limits:

```
use Codepreneur\Fathom\Exceptions\RateLimitException;

try {
    Fathom::meetings()->list();
} catch (RateLimitException $e) {
    $e->limit();       // 60
    $e->remaining();   // 0
    $e->reset();       // seconds remaining in window
    $e->retryAfter();  // seconds to wait
    $e->resetAt();     // CarbonImmutable
}
```

Rate Limits
-----------

[](#rate-limits)

Fathom enforces the following limits:

TypeLimitGlobal60 requests / 60 secondsHeavy (transcript, summary, includes)30 requests / 60 secondsRecording downloads30 requests / 60 secondsThis package does not automatically retry rate-limited requests.

DTOs and Forward Compatibility
------------------------------

[](#dtos-and-forward-compatibility)

All responses are mapped to typed DTOs. Access unknown future API fields via `raw()`:

```
$meeting = Fathom::meetings()->list()->items[0];
$meeting->title;              // typed property
$meeting->raw()['new_field']; // forward-compatible access
```

Testing
-------

[](#testing)

The package includes a full offline test suite using `Http::fake()`:

```
composer test
composer analyse
composer lint
```

Contributing
------------

[](#contributing)

See [CONTRIBUTING.md](CONTRIBUTING.md).

Security
--------

[](#security)

See [SECURITY.md](SECURITY.md).

Changelog
---------

[](#changelog)

See [CHANGELOG.md](CHANGELOG.md).

License
-------

[](#license)

The MIT License (MIT). See [LICENSE](LICENSE) for details.

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance100

Actively maintained with recent releases

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity35

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

0d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/e0a86c135d6db93f47a4eef421bc638f33308761a872fc9f8bf789883ecd4441?d=identicon)[kodpreneur-dooel](/maintainers/kodpreneur-dooel)

---

Top Contributors

[![dimitrovleonardo](https://avatars.githubusercontent.com/u/98924048?v=4)](https://github.com/dimitrovleonardo "dimitrovleonardo (3 commits)")

---

Tags

apilaravelsdkaiwebhooksTranscriptionfathomMeetingsfathom-ai

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/codepreneur-laravel-fathom/health.svg)

```
[![Health](https://phpackages.com/badges/codepreneur-laravel-fathom/health.svg)](https://phpackages.com/packages/codepreneur-laravel-fathom)
```

###  Alternatives

[laravel/cashier

Laravel Cashier provides an expressive, fluent interface to Stripe's subscription billing services.

2.6k31.8M158](/packages/laravel-cashier)[psalm/plugin-laravel

Psalm plugin for Laravel

3345.4M354](/packages/psalm-plugin-laravel)[defstudio/telegraph

A laravel facade to interact with Telegram Bots

818355.4k3](/packages/defstudio-telegraph)[api-platform/laravel

API Platform support for Laravel

58190.1k21](/packages/api-platform-laravel)[simplestats-io/laravel-client

Server-side analytics for Laravel that follows the full funnel from visit to registration to payment, attributed to the channel that drove it. Revenue, MRR, churn and ad-spend profit (ROAS/CAC) per channel. GDPR compliant, ad-blocker proof.

5226.7k](/packages/simplestats-io-laravel-client)[forjedio/inertia-table

Backend-driven dynamic tables for Laravel + Inertia.js

272.0k](/packages/forjedio-inertia-table)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
