luma-sdk maintained by laravel-gtm
Luma SDK
Laravel-ready PHP SDK for the Luma REST API, built with Saloon.
Requirements
- PHP
^8.4 - Laravel
^11.0 || ^12.0 || ^13.0
Installation
composer require laravel-gtm/luma-sdk
The package supports Laravel auto-discovery — no manual provider registration needed.
Configuration
Publish the config file:
php artisan vendor:publish --tag=luma-config
Set your environment variables:
LUMA_BASE_URL=https://public-api.luma.com
LUMA_API_TOKEN=your-token
Usage
Via the Service Container (recommended)
use LaravelGtm\LumaSdk\LumaSdk;
$sdk = app(LumaSdk::class);
Standalone
use LaravelGtm\LumaSdk\LumaSdk;
$sdk = LumaSdk::make(
baseUrl: 'https://public-api.luma.com',
token: 'your-token',
);
Core Methods
$user = $sdk->getSelf(); // Get authenticated user
$entity = $sdk->lookupEntity($slug); // Look up entity by slug
Resources
The SDK organizes endpoints into resource classes accessed via the main LumaSdk instance.
Events
$events = $sdk->events();
// Read
$event = $events->get($eventId);
$guests = $events->listGuests($request);
$coupons = $events->listCoupons($request);
$ticketTypes = $events->listTicketTypes($eventId);
$ticketType = $events->getTicketType($id);
$guest = $events->getGuest(eventId: $eventId, id: $guestId);
// Create & Update
$events->create($request);
$events->update($request);
// Guests
$events->addGuests($request);
$events->updateGuestStatus($request);
$events->sendInvites($request);
// Hosts
$events->createHost($request);
$events->updateHost($request);
$events->removeHost($eventId, $email);
// Coupons
$events->createCoupon($request);
$events->updateCoupon($request);
// Ticket Types
$events->createTicketType($request);
$events->updateTicketType($request);
$events->deleteTicketType($ticketTypeId);
// Cancellation
$token = $events->requestCancellation($eventId);
$events->cancel($eventId, $token->cancellationToken);
Calendars
$calendars = $sdk->calendars();
// Read
$calendar = $calendars->get();
$events = $calendars->listEvents();
$people = $calendars->listPeople();
$coupons = $calendars->listCoupons();
$admins = $calendars->listAdmins();
$event = $calendars->lookupEvent($request);
// Events
$calendars->addEvent($request);
// Coupons
$calendars->createCoupon($request);
$calendars->updateCoupon($request);
// People
$calendars->importPeople($request);
// Person Tags
$calendars->listPersonTags();
$calendars->createPersonTag('VIP', '#ff0000');
$calendars->updatePersonTag($tagId, name: 'Speaker');
$calendars->deletePersonTag($tagId);
$calendars->applyPersonTag($request);
$calendars->unapplyPersonTag($request);
// Event Tags
$calendars->listEventTags();
$calendars->createEventTag('Workshop');
$calendars->updateEventTag($tagId, name: 'Keynote');
$calendars->deleteEventTag($tagId);
$calendars->applyEventTag($tag, $eventApiIds);
$calendars->unapplyEventTag($tag, $eventApiIds);
Memberships
$memberships = $sdk->memberships();
$tiers = $memberships->listTiers();
$memberships->addMember($request);
$memberships->updateMemberStatus($userId, 'active');
Webhooks
$webhooks = $sdk->webhooks();
$list = $webhooks->list();
$webhook = $webhooks->get($id);
$webhook = $webhooks->create('https://example.com/hook', ['event.created']);
$webhook = $webhooks->update($request);
$webhooks->delete($id);
Organizations
$org = $sdk->organizations();
$calendars = $org->listCalendars();
Images
$images = $sdk->images();
$upload = $images->createUploadUrl('event-cover');
Value Objects
The SDK provides type-safe value objects for Luma-specific formats:
LumaDate
use LaravelGtm\LumaSdk\ValueObjects\LumaDate;
$date = LumaDate::fromString('2026-10-04T05:20:00.000Z');
$date->toString(); // ISO 8601 UTC string
$date->toTimezone('America/New_York'); // Display conversion
LumaDuration
use LaravelGtm\LumaSdk\ValueObjects\LumaDuration;
$duration = LumaDuration::fromString('P1DT12H30M');
$duration->toString(); // ISO 8601 duration string
$duration->toSeconds(); // Numeric representation
GooglePlaceId
use LaravelGtm\LumaSdk\ValueObjects\GooglePlaceId;
$place = GooglePlaceId::fromArray(['place_id' => 'ChIJN1t_tDeuEmsRUsoyG83frY4']);
$place->toArray(); // ['place_id' => '...']
Pagination
Paginated endpoints return a PaginatedResponse with cursor-based pagination:
$page = $sdk->events()->listGuests($request);
$page->entries; // array of response DTOs
$page->hasMore; // bool
$page->nextCursor; // string|null
Rate Limiting
The SDK includes built-in rate limiting via Saloon's rate-limit plugin:
- GET requests: 500 per 5 minutes
- POST requests: 100 per 5 minutes
Rate limits are handled automatically — requests will wait when limits are reached.
Testing
composer test # Run test suite
composer lint # Check code style
composer analyse # Static analysis (PHPStan)
composer format # Fix code style
Changelog
See CHANGELOG.md for recent changes.
License
The MIT License (MIT). See LICENSE for details.