jeffersongoncalves / laravel-savvycal
A lightweight SavvyCal REST API client for Laravel.
Package info
github.com/jeffersongoncalves/laravel-savvycal
pkg:composer/jeffersongoncalves/laravel-savvycal
Requires
- php: ^8.2
- illuminate/support: ^11.0|^12.0|^13.0
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- larastan/larastan: ^3.0
- laravel/pint: ^1.21
- orchestra/testbench: ^9.0|^10.0|^11.0
- pestphp/pest: ^3.0|^4.0
- pestphp/pest-plugin-laravel: ^3.0|^4.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Laravel SavvyCal
A lightweight SavvyCal REST API client for Laravel. It wraps the api.savvycal.com v1 endpoints behind a small static client, threads your API key, and defensively returns null (rather than throwing) on network failures or non-2xx responses.
Features
- Users —
me()fetches the authenticated user - Scheduling links —
links(),link(),createLink(),updateLink(),deleteLink(),duplicateLink(),toggleLink(),linkSlots() - Events —
events(),event(),createEvent(),cancelEvent() - Webhooks —
webhooks(),createWebhook(),deleteWebhook()
Installation
composer require jeffersongoncalves/laravel-savvycal
Optionally publish the config file:
php artisan vendor:publish --tag="laravel-savvycal-config"
Configuration
Add to your .env:
SAVVYCAL_API_KEY=sk_live_...
Create an API key from your SavvyCal developer settings.
Config Options
// config/savvycal.php return [ 'token' => env('SAVVYCAL_API_KEY'), 'timeout' => (int) env('SAVVYCAL_TIMEOUT', 8), ];
When savvycal.token is null the client falls back to config('services.savvycal.token').
Usage
use JeffersonGoncalves\SavvyCal\SavvyCalClient; // Users $me = SavvyCalClient::me(); // Scheduling links $links = SavvyCalClient::links(['limit' => 50]); $link = SavvyCalClient::link('link_00000000'); $created = SavvyCalClient::createLink('Intro call', slug: 'intro', durationMinutes: 30); SavvyCalClient::updateLink('link_00000000', ['name' => 'Discovery call']); SavvyCalClient::duplicateLink('link_00000000'); SavvyCalClient::toggleLink('link_00000000'); SavvyCalClient::deleteLink('link_00000000'); // Availability $slots = SavvyCalClient::linkSlots( id: 'link_00000000', startTime: '2026-09-06T00:00:00Z', endTime: '2026-09-13T00:00:00Z', ); // Events $events = SavvyCalClient::events(['limit' => 20]); $event = SavvyCalClient::event('event_00000000'); SavvyCalClient::createEvent( schedulingLinkId: 'link_00000000', startAt: '2026-09-08T14:00:00Z', name: 'Jane Doe', email: 'jane@example.com', ); SavvyCalClient::cancelEvent('event_00000000'); // Webhooks $webhooks = SavvyCalClient::webhooks(); SavvyCalClient::createWebhook('https://example.com/webhooks/savvycal', ['event.created', 'event.canceled']); SavvyCalClient::deleteWebhook('hook_00000000');
All methods return array<string, mixed>|null (or bool for deleteLink() and deleteWebhook()), returning null/false on any network failure or non-2xx response instead of throwing. Null arguments are stripped from the payload before it is sent, so optional fields are simply omitted.
Testing
composer test
Static Analysis
composer analyse
Code Formatting
composer format
Changelog
Please see CHANGELOG for more information on what has changed recently.
License
The MIT License (MIT). Please see License File for more information.
